Merge trunk HEAD (r46369)
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 24 Mar 2010 00:03:54 +0000 (00:03 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 24 Mar 2010 00:03:54 +0000 (00:03 +0000)
(part 6/6)

svn path=/branches/ros-amd64-bringup/; revision=46380

1597 files changed:
reactos/Makefile
reactos/ReactOS-generic.rbuild
reactos/ReactOS-i386.rbuild
reactos/base/applications/applications.rbuild
reactos/base/applications/cacls/resource.h
reactos/base/applications/calc/calc.h
reactos/base/applications/calc/lang/de-DE.rc
reactos/base/applications/cmdutils/doskey/doskey.rc
reactos/base/applications/cmdutils/doskey/lang/de-DE.rc [new file with mode: 0644]
reactos/base/applications/cmdutils/doskey/lang/en-US.rc
reactos/base/applications/cmdutils/hostname/hostname.rbuild
reactos/base/applications/cmdutils/more/resource.h
reactos/base/applications/cmdutils/reg/It.rc [new file with mode: 0644]
reactos/base/applications/cmdutils/reg/Uk.rc [new file with mode: 0644]
reactos/base/applications/cmdutils/reg/reg.c
reactos/base/applications/cmdutils/reg/rsrc.rc
reactos/base/applications/cmdutils/xcopy/De.rc
reactos/base/applications/cmdutils/xcopy/Fr.rc
reactos/base/applications/cmdutils/xcopy/It.rc [new file with mode: 0644]
reactos/base/applications/cmdutils/xcopy/Ja.rc
reactos/base/applications/cmdutils/xcopy/Lt.rc
reactos/base/applications/cmdutils/xcopy/Nl.rc
reactos/base/applications/cmdutils/xcopy/Ru.rc
reactos/base/applications/cmdutils/xcopy/Si.rc
reactos/base/applications/cmdutils/xcopy/Uk.rc [new file with mode: 0644]
reactos/base/applications/cmdutils/xcopy/rsrc.rc
reactos/base/applications/cmdutils/xcopy/xcopy.rbuild
reactos/base/applications/downloader/lang/de-DE.rc
reactos/base/applications/dxdiag/dxdiag.c
reactos/base/applications/dxdiag/lang/de-DE.rc
reactos/base/applications/dxdiag/resource.h
reactos/base/applications/dxdiag/system.c
reactos/base/applications/extrac32/extrac32.c [new file with mode: 0644]
reactos/base/applications/extrac32/extrac32.rbuild [new file with mode: 0644]
reactos/base/applications/fontview/display.h
reactos/base/applications/fontview/lang/de-DE.rc
reactos/base/applications/games/solitaire/lang/de-DE.rc
reactos/base/applications/games/solitaire/solitaire.h
reactos/base/applications/games/spider/lang/de-DE.rc
reactos/base/applications/games/spider/spider.h
reactos/base/applications/games/winemine/lang/de-DE.rc
reactos/base/applications/magnify/magnify.rbuild
reactos/base/applications/mmc/precomp.h
reactos/base/applications/mmc/resource.h
reactos/base/applications/mplay32/lang/de-DE.rc
reactos/base/applications/mplay32/resource.h
reactos/base/applications/msconfig/lang/de-DE.rc
reactos/base/applications/mscutils/devmgmt/lang/de-DE.rc
reactos/base/applications/mscutils/servman/lang/de-DE.rc
reactos/base/applications/mstsc/bsops.h
reactos/base/applications/mstsc/lang/de-DE.rc
reactos/base/applications/mstsc/mstsc.rbuild
reactos/base/applications/mstsc/orders.h
reactos/base/applications/mstsc/proto.h
reactos/base/applications/mstsc/rdesktop.h
reactos/base/applications/mstsc/uimain.h
reactos/base/applications/network/finger/err.h
reactos/base/applications/network/finger/various.h
reactos/base/applications/network/ipconfig/ipconfig.c
reactos/base/applications/network/ipconfig/lang/de-DE.rc
reactos/base/applications/network/telnet/src/ansiprsr.h
reactos/base/applications/network/telnet/src/keytrans.h
reactos/base/applications/network/telnet/src/stl_bids.h
reactos/base/applications/network/telnet/src/tcharmap.h
reactos/base/applications/network/telnet/src/tconsole.h
reactos/base/applications/network/telnet/src/telnet.h
reactos/base/applications/network/telnet/src/tkeydef.h
reactos/base/applications/network/telnet/src/tkeymap.h
reactos/base/applications/network/telnet/src/tmapldr.h
reactos/base/applications/network/telnet/src/tmouse.h
reactos/base/applications/network/telnet/src/tnclass.h
reactos/base/applications/network/telnet/src/tnclip.h
reactos/base/applications/network/telnet/src/tncon.h
reactos/base/applications/network/telnet/src/tnconfig.h
reactos/base/applications/network/telnet/src/tnerror.h
reactos/base/applications/network/telnet/src/tnetwork.h
reactos/base/applications/network/telnet/src/tnmain.h
reactos/base/applications/network/telnet/src/tnmisc.h
reactos/base/applications/network/telnet/src/tparams.h
reactos/base/applications/network/telnet/src/tparser.h
reactos/base/applications/network/telnet/src/tscript.h
reactos/base/applications/network/telnet/src/tscroll.h
reactos/base/applications/network/telnet/src/ttelhndl.h
reactos/base/applications/notepad/lang/de-DE.rc
reactos/base/applications/paint/lang/de-DE.rc
reactos/base/applications/paint/lang/pl-PL.rc
reactos/base/applications/paint/mouse.c
reactos/base/applications/rapps/CreateCabFile.bat
reactos/base/applications/rapps/lang/de-DE.rc
reactos/base/applications/rapps/lang/pl-PL.rc
reactos/base/applications/rapps/rapps.h
reactos/base/applications/rapps/rapps/firefox3.txt
reactos/base/applications/rapps/rapps/mirandaim.txt
reactos/base/applications/rapps/rapps/openoffice2.4.txt
reactos/base/applications/rapps/rapps/openoffice3.0.txt
reactos/base/applications/rapps/rapps/openttd.txt
reactos/base/applications/rapps/rapps/opera.txt
reactos/base/applications/rapps/rapps/rosbe.txt
reactos/base/applications/rapps/rapps/rosbeamd64.txt [new file with mode: 0644]
reactos/base/applications/rapps/rapps/rosbearm.txt [new file with mode: 0644]
reactos/base/applications/rapps/rapps/sambatng.txt
reactos/base/applications/rapps/rapps/scite.txt
reactos/base/applications/rapps/rapps/seamonkey.txt
reactos/base/applications/rapps/rapps/smplayer.txt
reactos/base/applications/rapps/rapps/thunderbird.txt
reactos/base/applications/rapps/rapps/utorrent.txt
reactos/base/applications/rapps/rapps/vlc.txt
reactos/base/applications/rapps/resource.h
reactos/base/applications/regedit/clb/clbdll.h
reactos/base/applications/regedit/clb/resource.h
reactos/base/applications/regedit/hexedit.h
reactos/base/applications/regedit/lang/de-DE.rc
reactos/base/applications/regedit/main.h
reactos/base/applications/regedit/security.h
reactos/base/applications/screensavers/3dtext/lang/de-DE.rc
reactos/base/applications/screensavers/logon/lang/de-DE.rc
reactos/base/applications/sndvol32/lang/de-DE.rc
reactos/base/applications/sndvol32/resources.h
reactos/base/applications/taskmgr/about.h
reactos/base/applications/taskmgr/affinity.h
reactos/base/applications/taskmgr/applpage.h
reactos/base/applications/taskmgr/column.h
reactos/base/applications/taskmgr/debug.h
reactos/base/applications/taskmgr/endproc.h
reactos/base/applications/taskmgr/graph.h
reactos/base/applications/taskmgr/graphctl.h
reactos/base/applications/taskmgr/lang/de-DE.rc
reactos/base/applications/taskmgr/optnmenu.h
reactos/base/applications/taskmgr/perfdata.h
reactos/base/applications/taskmgr/perfpage.h
reactos/base/applications/taskmgr/priority.h
reactos/base/applications/taskmgr/proclist.h
reactos/base/applications/taskmgr/procpage.h
reactos/base/applications/taskmgr/run.h
reactos/base/applications/taskmgr/taskmgr.h
reactos/base/applications/taskmgr/trayicon.h
reactos/base/applications/winhlp32/De.rc
reactos/base/applications/winhlp32/Fr.rc
reactos/base/applications/winhlp32/It.rc
reactos/base/applications/winhlp32/Ja.rc
reactos/base/applications/winhlp32/Lt.rc
reactos/base/applications/winhlp32/Nl.rc
reactos/base/applications/winhlp32/Pt.rc
reactos/base/applications/winhlp32/Rm.rc
reactos/base/applications/winhlp32/Ro.rc
reactos/base/applications/winhlp32/Ru.rc
reactos/base/applications/winhlp32/Si.rc
reactos/base/applications/winhlp32/Zh.rc
reactos/base/applications/winhlp32/rsrc.rc
reactos/base/applications/wordpad/Da.rc
reactos/base/applications/wordpad/De.rc
reactos/base/applications/wordpad/En.rc
reactos/base/applications/wordpad/Fr.rc
reactos/base/applications/wordpad/Hu.rc
reactos/base/applications/wordpad/It.rc [new file with mode: 0644]
reactos/base/applications/wordpad/Ja.rc
reactos/base/applications/wordpad/Ko.rc
reactos/base/applications/wordpad/Lt.rc
reactos/base/applications/wordpad/Nl.rc
reactos/base/applications/wordpad/No.rc
reactos/base/applications/wordpad/Pl.rc
reactos/base/applications/wordpad/Pt.rc
reactos/base/applications/wordpad/Ru.rc
reactos/base/applications/wordpad/Si.rc
reactos/base/applications/wordpad/Sv.rc
reactos/base/applications/wordpad/Tr.rc
reactos/base/applications/wordpad/Uk.rc [new file with mode: 0644]
reactos/base/applications/wordpad/Zh.rc
reactos/base/applications/wordpad/formatbar.bmp
reactos/base/applications/wordpad/print.c
reactos/base/applications/wordpad/registry.c
reactos/base/applications/wordpad/rsrc.rc
reactos/base/applications/wordpad/wordpad.c
reactos/base/applications/wordpad/wordpad.h
reactos/base/applications/wordpad/zoom.cur [new file with mode: 0644]
reactos/base/applications/write/De.rc
reactos/base/applications/write/Fr.rc
reactos/base/applications/write/It.rc [moved from reactos/base/system/msiexec/version.rc with 64% similarity]
reactos/base/applications/write/Ja.rc
reactos/base/applications/write/Lt.rc
reactos/base/applications/write/Ro.rc
reactos/base/applications/write/Ru.rc
reactos/base/applications/write/Si.rc
reactos/base/applications/write/Uk.rc [new file with mode: 0644]
reactos/base/applications/write/rsrc.rc
reactos/base/services/dhcp/dhclient.c
reactos/base/services/dhcp/include/debug.h
reactos/base/services/dhcp/include/dhcpd.h
reactos/base/services/dhcp/include/predec.h
reactos/base/services/dhcp/include/stdint.h
reactos/base/services/eventlog/eventlog.c
reactos/base/services/eventlog/eventlog.h
reactos/base/services/eventlog/rpc.c
reactos/base/services/rpcss/rpcss.rbuild
reactos/base/services/rpcss/rpcss_main.c
reactos/base/services/rpcss/rpcss_ros.diff
reactos/base/services/rpcss/service_main.c
reactos/base/services/spoolsv/spoolsv.c
reactos/base/services/svchost/svchost.h
reactos/base/services/telnetd/syslog.h
reactos/base/services/telnetd/telnetd.h
reactos/base/services/umpnpmgr/umpnpmgr.c
reactos/base/services/wlansvc/rpcserver.c
reactos/base/services/wlansvc/wlansvc.c
reactos/base/services/wlansvc/wlansvc.rbuild
reactos/base/setup/reactos/lang/de-DE.rc
reactos/base/setup/reactos/lang/pl-PL.rc
reactos/base/setup/reactos/resource.h
reactos/base/setup/usetup/bootsup.h
reactos/base/setup/usetup/cabinet.c
reactos/base/setup/usetup/cabinet.h
reactos/base/setup/usetup/chkdsk.h
reactos/base/setup/usetup/drivesup.h
reactos/base/setup/usetup/errorcode.h
reactos/base/setup/usetup/filequeue.h
reactos/base/setup/usetup/filesup.h
reactos/base/setup/usetup/format.h
reactos/base/setup/usetup/fslist.h
reactos/base/setup/usetup/genlist.h
reactos/base/setup/usetup/inffile.h
reactos/base/setup/usetup/inicache.h
reactos/base/setup/usetup/interface/consup.h
reactos/base/setup/usetup/interface/usetup.c
reactos/base/setup/usetup/lang/af-ZA.h
reactos/base/setup/usetup/lang/ar-AE.h
reactos/base/setup/usetup/lang/ar-BH.h
reactos/base/setup/usetup/lang/ar-DZ.h
reactos/base/setup/usetup/lang/ar-EG.h
reactos/base/setup/usetup/lang/ar-IQ.h
reactos/base/setup/usetup/lang/ar-JO.h
reactos/base/setup/usetup/lang/ar-KW.h
reactos/base/setup/usetup/lang/ar-LB.h
reactos/base/setup/usetup/lang/ar-LY.h
reactos/base/setup/usetup/lang/ar-MA.h
reactos/base/setup/usetup/lang/ar-OM.h
reactos/base/setup/usetup/lang/ar-QA.h
reactos/base/setup/usetup/lang/ar-SA.h
reactos/base/setup/usetup/lang/ar-SY.h
reactos/base/setup/usetup/lang/ar-TN.h
reactos/base/setup/usetup/lang/ar-YE.h
reactos/base/setup/usetup/lang/az-AZ.h
reactos/base/setup/usetup/lang/be-BY.h
reactos/base/setup/usetup/lang/bg-BG.h
reactos/base/setup/usetup/lang/ca-ES.h
reactos/base/setup/usetup/lang/cs-CZ.h
reactos/base/setup/usetup/lang/da-DK.h
reactos/base/setup/usetup/lang/de-AT.h
reactos/base/setup/usetup/lang/de-CH.h
reactos/base/setup/usetup/lang/de-DE.h
reactos/base/setup/usetup/lang/de-LI.h
reactos/base/setup/usetup/lang/de-LU.h
reactos/base/setup/usetup/lang/dv-MV.h
reactos/base/setup/usetup/lang/el-GR.h
reactos/base/setup/usetup/lang/en-AU.h
reactos/base/setup/usetup/lang/en-BZ.h
reactos/base/setup/usetup/lang/en-CA.h
reactos/base/setup/usetup/lang/en-CB.h
reactos/base/setup/usetup/lang/en-GB.h
reactos/base/setup/usetup/lang/en-IE.h
reactos/base/setup/usetup/lang/en-JM.h
reactos/base/setup/usetup/lang/en-NZ.h
reactos/base/setup/usetup/lang/en-PH.h
reactos/base/setup/usetup/lang/en-TT.h
reactos/base/setup/usetup/lang/en-US.h
reactos/base/setup/usetup/lang/en-ZA.h
reactos/base/setup/usetup/lang/en-ZW.h
reactos/base/setup/usetup/lang/eo-AA.h
reactos/base/setup/usetup/lang/es-AR.h
reactos/base/setup/usetup/lang/es-BO.h
reactos/base/setup/usetup/lang/es-CL.h
reactos/base/setup/usetup/lang/es-CO.h
reactos/base/setup/usetup/lang/es-CR.h
reactos/base/setup/usetup/lang/es-DO.h
reactos/base/setup/usetup/lang/es-EC.h
reactos/base/setup/usetup/lang/es-ES.h
reactos/base/setup/usetup/lang/es-GT.h
reactos/base/setup/usetup/lang/es-HN.h
reactos/base/setup/usetup/lang/es-MX.h
reactos/base/setup/usetup/lang/es-NI.h
reactos/base/setup/usetup/lang/es-PA.h
reactos/base/setup/usetup/lang/es-PE.h
reactos/base/setup/usetup/lang/es-PR.h
reactos/base/setup/usetup/lang/es-PY.h
reactos/base/setup/usetup/lang/es-SV.h
reactos/base/setup/usetup/lang/es-UY.h
reactos/base/setup/usetup/lang/es-VE.h
reactos/base/setup/usetup/lang/et-EE.h
reactos/base/setup/usetup/lang/eu-ES.h
reactos/base/setup/usetup/lang/fa-IR.h
reactos/base/setup/usetup/lang/fi-FI.h
reactos/base/setup/usetup/lang/fo-FO.h
reactos/base/setup/usetup/lang/fr-BE.h
reactos/base/setup/usetup/lang/fr-CA.h
reactos/base/setup/usetup/lang/fr-CH.h
reactos/base/setup/usetup/lang/fr-FR.h
reactos/base/setup/usetup/lang/fr-LU.h
reactos/base/setup/usetup/lang/fr-MC.h
reactos/base/setup/usetup/lang/gl-ES.h
reactos/base/setup/usetup/lang/gu-IN.h
reactos/base/setup/usetup/lang/he-IL.h
reactos/base/setup/usetup/lang/hi-IN.h
reactos/base/setup/usetup/lang/hr-HR.h
reactos/base/setup/usetup/lang/hu-HU.h
reactos/base/setup/usetup/lang/hy-AM.h
reactos/base/setup/usetup/lang/id-ID.h
reactos/base/setup/usetup/lang/is-IS.h
reactos/base/setup/usetup/lang/it-CH.h
reactos/base/setup/usetup/lang/it-IT.h
reactos/base/setup/usetup/lang/ja-JP.h
reactos/base/setup/usetup/lang/ka-GE.h
reactos/base/setup/usetup/lang/kk-KZ.h
reactos/base/setup/usetup/lang/kn-IN.h
reactos/base/setup/usetup/lang/ko-KR.h
reactos/base/setup/usetup/lang/kok-IN.h
reactos/base/setup/usetup/lang/ky-KG.h
reactos/base/setup/usetup/lang/lt-LT.h
reactos/base/setup/usetup/lang/lv-LV.h
reactos/base/setup/usetup/lang/mk-MK.h
reactos/base/setup/usetup/lang/mn-MN.h
reactos/base/setup/usetup/lang/mr-IN.h
reactos/base/setup/usetup/lang/ms-BN.h
reactos/base/setup/usetup/lang/ms-MY.h
reactos/base/setup/usetup/lang/my-MM.h
reactos/base/setup/usetup/lang/nl-BE.h
reactos/base/setup/usetup/lang/nl-NL.h
reactos/base/setup/usetup/lang/nn-NO.h
reactos/base/setup/usetup/lang/pa-IN.h
reactos/base/setup/usetup/lang/pl-PL.h
reactos/base/setup/usetup/lang/pt-BR.h
reactos/base/setup/usetup/lang/pt-PT.h
reactos/base/setup/usetup/lang/rm-CH.h
reactos/base/setup/usetup/lang/ro-RO.h
reactos/base/setup/usetup/lang/ru-RU.h
reactos/base/setup/usetup/lang/sa-IN.h
reactos/base/setup/usetup/lang/sk-SK.h
reactos/base/setup/usetup/lang/sl-SI.h
reactos/base/setup/usetup/lang/sq-AL.h
reactos/base/setup/usetup/lang/sr-SP.h
reactos/base/setup/usetup/lang/sv-FI.h
reactos/base/setup/usetup/lang/sv-SE.h
reactos/base/setup/usetup/lang/sw-KE.h
reactos/base/setup/usetup/lang/syr-SY.h
reactos/base/setup/usetup/lang/ta-IN.h
reactos/base/setup/usetup/lang/te-IN.h
reactos/base/setup/usetup/lang/th-TH.h
reactos/base/setup/usetup/lang/tr-TR.h
reactos/base/setup/usetup/lang/tt-TA.h
reactos/base/setup/usetup/lang/uk-UA.h
reactos/base/setup/usetup/lang/ur-PK.h
reactos/base/setup/usetup/lang/uz-UZ.h
reactos/base/setup/usetup/lang/vi-VN.h
reactos/base/setup/usetup/lang/wa-BE.h
reactos/base/setup/usetup/lang/zh-CN.h
reactos/base/setup/usetup/lang/zh-HK.h
reactos/base/setup/usetup/lang/zh-MO.h
reactos/base/setup/usetup/lang/zh-SG.h
reactos/base/setup/usetup/lang/zh-TW.h
reactos/base/setup/usetup/mui.h
reactos/base/setup/usetup/muifonts.h
reactos/base/setup/usetup/muilanguages.h
reactos/base/setup/usetup/native/host_native.h
reactos/base/setup/usetup/native/utils/console.h
reactos/base/setup/usetup/native/utils/keytrans.h
reactos/base/setup/usetup/partlist.c
reactos/base/setup/usetup/partlist.h
reactos/base/setup/usetup/progress.h
reactos/base/setup/usetup/registry.h
reactos/base/setup/usetup/settings.h
reactos/base/setup/usetup/usetup.h
reactos/base/setup/vmwinst/lang/de-DE.rc
reactos/base/setup/vmwinst/vmwinst.h
reactos/base/setup/welcome/lang/de-DE.rc
reactos/base/shell/cmd/batch.h
reactos/base/shell/cmd/cmd.h
reactos/base/shell/cmd/config.h
reactos/base/shell/cmd/lang/de-DE.rc
reactos/base/shell/cmd/lang/pl-PL.rc
reactos/base/shell/explorer-new/comcsup.h
reactos/base/shell/explorer-new/lang/de-DE.rc
reactos/base/shell/explorer-new/resource.h
reactos/base/shell/explorer-new/todo.h
reactos/base/shell/explorer-new/undoc.h
reactos/base/shell/explorer/explorer-de.rc
reactos/base/system/format/lang/de-DE.rc
reactos/base/system/msiexec/msiexec.c
reactos/base/system/msiexec/msiexec.rbuild
reactos/base/system/msiexec/rsrc.rc
reactos/base/system/regsvr32/lang/de-DE.rc
reactos/base/system/runonce/lang/de-DE.rc [new file with mode: 0644]
reactos/base/system/runonce/resource.h
reactos/base/system/runonce/rsrc.rc
reactos/base/system/runonce/runonce.h
reactos/base/system/services/database.c
reactos/base/system/services/rpcserver.c
reactos/base/system/services/services.c
reactos/base/system/services/services.h
reactos/base/system/winlogon/lang/de-DE.rc
reactos/base/system/winlogon/setup.h
reactos/baseaddress.rbuild
reactos/boot/armllb/armllb.rbuild
reactos/boot/armllb/fw.c
reactos/boot/armllb/hw/versatile/hwclcd.c
reactos/boot/armllb/hw/versatile/hwinfo.c
reactos/boot/armllb/hw/video.c
reactos/boot/armllb/inc/video.h
reactos/boot/armllb/os/loader.c
reactos/boot/freeldr/fdebug/rs232.h
reactos/boot/freeldr/freeldr.rbuild
reactos/boot/freeldr/freeldr/arch/arm/boot.s
reactos/boot/freeldr/freeldr/arch/arm/loader.c [deleted file]
reactos/boot/freeldr/freeldr/arch/arm/macharm.c
reactos/boot/freeldr/freeldr/arch/i386/halstub.c [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/i386/hardware.c
reactos/boot/freeldr/freeldr/arch/i386/loader.c
reactos/boot/freeldr/freeldr/arch/i386/ntoskrnl.c [new file with mode: 0644]
reactos/boot/freeldr/freeldr/arch/powerpc/compat.h
reactos/boot/freeldr/freeldr/arch/powerpc/prep.h
reactos/boot/freeldr/freeldr/bootmgr.c
reactos/boot/freeldr/freeldr/comm/rs232.c
reactos/boot/freeldr/freeldr/debug.c
reactos/boot/freeldr/freeldr/disk/disk.c
reactos/boot/freeldr/freeldr/disk/partition.c
reactos/boot/freeldr/freeldr/disk/scsiport.c [new file with mode: 0644]
reactos/boot/freeldr/freeldr/freeldr.c
reactos/boot/freeldr/freeldr/freeldr.rbuild
reactos/boot/freeldr/freeldr/freeldr_arch.rbuild
reactos/boot/freeldr/freeldr/freeldr_base.rbuild
reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild
reactos/boot/freeldr/freeldr/freeldr_main.rbuild
reactos/boot/freeldr/freeldr/freeldr_startup.rbuild
reactos/boot/freeldr/freeldr/fs/ext2.c
reactos/boot/freeldr/freeldr/fs/fs.c
reactos/boot/freeldr/freeldr/fs/iso.c
reactos/boot/freeldr/freeldr/fs/ntfs.c
reactos/boot/freeldr/freeldr/include/arch.h
reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h
reactos/boot/freeldr/freeldr/include/arch/amd64/hardware.h
reactos/boot/freeldr/freeldr/include/arch/amd64/machpc.h
reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h
reactos/boot/freeldr/freeldr/include/arch/i386/custom.h
reactos/boot/freeldr/freeldr/include/arch/i386/drivemap.h
reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h
reactos/boot/freeldr/freeldr/include/arch/i386/i386.h
reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h
reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h
reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h
reactos/boot/freeldr/freeldr/include/arch/powerpc/hardware.h
reactos/boot/freeldr/freeldr/include/bytesex.h
reactos/boot/freeldr/freeldr/include/cache.h
reactos/boot/freeldr/freeldr/include/cmdline.h
reactos/boot/freeldr/freeldr/include/comm.h
reactos/boot/freeldr/freeldr/include/debug.h
reactos/boot/freeldr/freeldr/include/disk.h
reactos/boot/freeldr/freeldr/include/freeldr.h
reactos/boot/freeldr/freeldr/include/fs.h
reactos/boot/freeldr/freeldr/include/fs/ext2.h
reactos/boot/freeldr/freeldr/include/fs/fat.h
reactos/boot/freeldr/freeldr/include/fs/iso.h
reactos/boot/freeldr/freeldr/include/fs/ntfs.h
reactos/boot/freeldr/freeldr/include/inffile.h
reactos/boot/freeldr/freeldr/include/inifile.h
reactos/boot/freeldr/freeldr/include/keycodes.h
reactos/boot/freeldr/freeldr/include/machine.h
reactos/boot/freeldr/freeldr/include/mm.h
reactos/boot/freeldr/freeldr/include/multiboot.h
reactos/boot/freeldr/freeldr/include/ntoskrnl.h [new file with mode: 0644]
reactos/boot/freeldr/freeldr/include/of.h
reactos/boot/freeldr/freeldr/include/options.h
reactos/boot/freeldr/freeldr/include/oslist.h
reactos/boot/freeldr/freeldr/include/ramdisk.h
reactos/boot/freeldr/freeldr/include/reactos.h
reactos/boot/freeldr/freeldr/include/rtl.h
reactos/boot/freeldr/freeldr/include/ui.h
reactos/boot/freeldr/freeldr/include/ui/gui.h
reactos/boot/freeldr/freeldr/include/ui/minitui.h
reactos/boot/freeldr/freeldr/include/ui/noui.h
reactos/boot/freeldr/freeldr/include/ui/tui.h
reactos/boot/freeldr/freeldr/include/ver.h
reactos/boot/freeldr/freeldr/include/video.h
reactos/boot/freeldr/freeldr/include/winldr.h
reactos/boot/freeldr/freeldr/linuxboot.c
reactos/boot/freeldr/freeldr/mm/meminit.c
reactos/boot/freeldr/freeldr/mm/mm.c
reactos/boot/freeldr/freeldr/reactos/arcname.c
reactos/boot/freeldr/freeldr/reactos/imageldr.c
reactos/boot/freeldr/freeldr/reactos/reactos.c
reactos/boot/freeldr/freeldr/setupldr.rbuild
reactos/boot/freeldr/freeldr/ui/directui.c [new file with mode: 0644]
reactos/boot/freeldr/freeldr/ui/gui.c
reactos/boot/freeldr/freeldr/ui/minitui.c
reactos/boot/freeldr/freeldr/ui/noui.c
reactos/boot/freeldr/freeldr/ui/tui.c
reactos/boot/freeldr/freeldr/ui/tuimenu.c
reactos/boot/freeldr/freeldr/ui/ui.c
reactos/boot/freeldr/freeldr/video/fade.c
reactos/boot/freeldr/freeldr/video/palette.c
reactos/boot/freeldr/freeldr/video/video.c
reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c [new file with mode: 0644]
reactos/boot/freeldr/freeldr/windows/peloader.c
reactos/boot/freeldr/freeldr/windows/winldr.c
reactos/boot/freeldr/freeldr/windows/wlmemory.c
reactos/boot/freeldr/install/install.h
reactos/boot/freeldr/install/linux/finstext2.h
reactos/boot/freeldr/install/volume.h
reactos/dll/cpl/access/access.h
reactos/dll/cpl/access/lang/de-DE.rc
reactos/dll/cpl/access/resource.h
reactos/dll/cpl/appwiz/appwiz.h
reactos/dll/cpl/appwiz/lang/de-DE.rc
reactos/dll/cpl/appwiz/resource.h
reactos/dll/cpl/console/lang/de-DE.rc
reactos/dll/cpl/console/resource.h
reactos/dll/cpl/desk/desk.h
reactos/dll/cpl/desk/lang/de-DE.rc
reactos/dll/cpl/desk/lang/pl-PL.rc
reactos/dll/cpl/desk/monslctl.h
reactos/dll/cpl/desk/resource.h
reactos/dll/cpl/hdwwiz/hdwwiz.h
reactos/dll/cpl/hdwwiz/lang/de-DE.rc
reactos/dll/cpl/hdwwiz/resource.h
reactos/dll/cpl/input/input.h
reactos/dll/cpl/input/lang/de-DE.rc
reactos/dll/cpl/input/resource.h
reactos/dll/cpl/intl/intl.h
reactos/dll/cpl/intl/lang/de-DE.rc
reactos/dll/cpl/intl/resource.h
reactos/dll/cpl/joy/joy.h
reactos/dll/cpl/joy/lang/de-DE.rc
reactos/dll/cpl/joy/resource.h
reactos/dll/cpl/liccpa/lang/de-DE.rc
reactos/dll/cpl/liccpa/liccpa.h
reactos/dll/cpl/liccpa/resource.h
reactos/dll/cpl/main/lang/de-DE.rc
reactos/dll/cpl/main/main.h
reactos/dll/cpl/main/resource.h
reactos/dll/cpl/mmsys/lang/de-DE.rc
reactos/dll/cpl/mmsys/mmsys.h
reactos/dll/cpl/mmsys/resource.h
reactos/dll/cpl/odbccp32/odbccp32.h
reactos/dll/cpl/powercfg/lang/de-DE.rc
reactos/dll/cpl/powercfg/powercfg.h
reactos/dll/cpl/powercfg/resource.h
reactos/dll/cpl/sysdm/lang/de-DE.rc
reactos/dll/cpl/sysdm/resource.h
reactos/dll/cpl/telephon/resource.h
reactos/dll/cpl/timedate/lang/de-DE.rc
reactos/dll/cpl/timedate/resource.h
reactos/dll/cpl/timedate/timedate.h
reactos/dll/cpl/usrmgr/lang/de-DE.rc [new file with mode: 0644]
reactos/dll/cpl/usrmgr/resource.h
reactos/dll/cpl/usrmgr/rsrc.rc
reactos/dll/cpl/usrmgr/usrmgr.h
reactos/dll/directx/amstream/amstream.c
reactos/dll/directx/amstream/mediastream.c
reactos/dll/directx/amstream/mediastreamfilter.c
reactos/dll/directx/amstream/regsvr.c
reactos/dll/directx/bdaplgin/bdaplgin.cpp [new file with mode: 0644]
reactos/dll/directx/bdaplgin/bdaplgin.rbuild [new file with mode: 0644]
reactos/dll/directx/bdaplgin/bdaplgin.rc [new file with mode: 0644]
reactos/dll/directx/bdaplgin/bdaplgin.spec [new file with mode: 0644]
reactos/dll/directx/bdaplgin/classfactory.cpp [new file with mode: 0644]
reactos/dll/directx/bdaplgin/controlnode.cpp [new file with mode: 0644]
reactos/dll/directx/bdaplgin/devicecontrol.cpp [new file with mode: 0644]
reactos/dll/directx/bdaplgin/digitaldemo.cpp [new file with mode: 0644]
reactos/dll/directx/bdaplgin/frequencyfilter.cpp [new file with mode: 0644]
reactos/dll/directx/bdaplgin/lnbinfo.cpp [new file with mode: 0644]
reactos/dll/directx/bdaplgin/pincontrol.cpp [new file with mode: 0644]
reactos/dll/directx/bdaplgin/precomp.h [new file with mode: 0644]
reactos/dll/directx/bdaplgin/signalstatistics.cpp [new file with mode: 0644]
reactos/dll/directx/ddraw/rosdraw.h
reactos/dll/directx/directx.rbuild
reactos/dll/directx/dsound_new/directsound.c
reactos/dll/directx/dsound_new/dsound_convert.c [new file with mode: 0644]
reactos/dll/directx/dsound_new/precomp.h
reactos/dll/directx/dsound_new/primary.c
reactos/dll/directx/dsound_new/resource.h
reactos/dll/directx/dsound_new/secondary.c
reactos/dll/directx/ksproxy/allocator.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/basicaudio.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/classfactory.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/clockforward.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/cvpconfig.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/cvpvbiconfig.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/datatype.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/enum_mediatypes.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/enumpins.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/input_pin.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/interface.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/ksproxy.c [deleted file]
reactos/dll/directx/ksproxy/ksproxy.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/ksproxy.rbuild
reactos/dll/directx/ksproxy/ksproxy.rc
reactos/dll/directx/ksproxy/mediasample.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/node.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/output_pin.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/precomp.h [new file with mode: 0644]
reactos/dll/directx/ksproxy/proxy.cpp [new file with mode: 0644]
reactos/dll/directx/ksproxy/qualityforward.cpp [new file with mode: 0644]
reactos/dll/directx/ksuser/ksuser.c
reactos/dll/directx/ksuser/ksuser.h
reactos/dll/directx/msdmo/dmoreg.c
reactos/dll/directx/msdvbnp/classfactory.cpp [new file with mode: 0644]
reactos/dll/directx/msdvbnp/enum_mediatypes.cpp [new file with mode: 0644]
reactos/dll/directx/msdvbnp/enumpins.cpp [new file with mode: 0644]
reactos/dll/directx/msdvbnp/msdvbnp.cpp [new file with mode: 0644]
reactos/dll/directx/msdvbnp/msdvbnp.rbuild [new file with mode: 0644]
reactos/dll/directx/msdvbnp/msdvbnp.rc [new file with mode: 0644]
reactos/dll/directx/msdvbnp/msdvbnp.spec [new file with mode: 0644]
reactos/dll/directx/msdvbnp/networkprovider.cpp [new file with mode: 0644]
reactos/dll/directx/msdvbnp/pin.cpp [new file with mode: 0644]
reactos/dll/directx/msdvbnp/precomp.h [new file with mode: 0644]
reactos/dll/directx/msdvbnp/scanningtuner.cpp [new file with mode: 0644]
reactos/dll/directx/msvidctl/classfactory.cpp [new file with mode: 0644]
reactos/dll/directx/msvidctl/enumtuningspaces.cpp [new file with mode: 0644]
reactos/dll/directx/msvidctl/msvidctl.cpp [new file with mode: 0644]
reactos/dll/directx/msvidctl/msvidctl.rbuild [new file with mode: 0644]
reactos/dll/directx/msvidctl/msvidctl.rc [new file with mode: 0644]
reactos/dll/directx/msvidctl/msvidctl.spec [new file with mode: 0644]
reactos/dll/directx/msvidctl/precomp.h [new file with mode: 0644]
reactos/dll/directx/msvidctl/tunerequest.cpp [new file with mode: 0644]
reactos/dll/directx/msvidctl/tuningspace.cpp [new file with mode: 0644]
reactos/dll/directx/msvidctl/tuningspace_container.cpp [new file with mode: 0644]
reactos/dll/directx/qedit/main.c
reactos/dll/directx/qedit/mediadet.c
reactos/dll/directx/qedit/qedit.rbuild
reactos/dll/directx/qedit/qedit_private.h
reactos/dll/directx/qedit/regsvr.c
reactos/dll/directx/qedit/samplegrabber.c [new file with mode: 0644]
reactos/dll/directx/quartz/dsoundrender.c
reactos/dll/directx/quartz/filesource.c
reactos/dll/directx/quartz/filtermapper.c
reactos/dll/directx/quartz/pin.c
reactos/dll/directx/quartz/quartz.rbuild
reactos/dll/directx/wine/d3d8/d3d8_main.c
reactos/dll/directx/wine/d3d8/d3d8_private.h
reactos/dll/directx/wine/d3d8/device.c
reactos/dll/directx/wine/d3d9/d3d9_main.c
reactos/dll/directx/wine/d3d9/d3d9_private.h
reactos/dll/directx/wine/d3d9/device.c
reactos/dll/directx/wine/d3d9/directx.c
reactos/dll/directx/wine/d3d9/query.c
reactos/dll/directx/wine/d3d9/stateblock.c
reactos/dll/directx/wine/d3d9/swapchain.c
reactos/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild
reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec
reactos/dll/directx/wine/d3dx9_36/shader.c
reactos/dll/directx/wine/d3dx9_36/surface.c
reactos/dll/directx/wine/d3dx9_36/texture.c [new file with mode: 0644]
reactos/dll/directx/wine/ddraw/device.c
reactos/dll/directx/wine/ddraw/main.c
reactos/dll/directx/wine/ddraw/vertexbuffer.c
reactos/dll/directx/wine/ddraw/viewport.c
reactos/dll/directx/wine/wined3d/arb_program_shader.c
reactos/dll/directx/wine/wined3d/ati_fragment_shader.c
reactos/dll/directx/wine/wined3d/baseshader.c [deleted file]
reactos/dll/directx/wine/wined3d/buffer.c
reactos/dll/directx/wine/wined3d/context.c
reactos/dll/directx/wine/wined3d/device.c
reactos/dll/directx/wine/wined3d/directx.c
reactos/dll/directx/wine/wined3d/drawprim.c
reactos/dll/directx/wine/wined3d/glsl_shader.c
reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c
reactos/dll/directx/wine/wined3d/query.c
reactos/dll/directx/wine/wined3d/shader.c
reactos/dll/directx/wine/wined3d/shader_sm1.c
reactos/dll/directx/wine/wined3d/shader_sm4.c
reactos/dll/directx/wine/wined3d/state.c
reactos/dll/directx/wine/wined3d/surface.c
reactos/dll/directx/wine/wined3d/swapchain.c
reactos/dll/directx/wine/wined3d/utils.c
reactos/dll/directx/wine/wined3d/wined3d.rbuild
reactos/dll/directx/wine/wined3d/wined3d_gl.h
reactos/dll/directx/wine/wined3d/wined3d_private.h
reactos/dll/nls/normaliz_redist/normaliz_redist.rbuild
reactos/dll/ntdll/ldr/utils.c
reactos/dll/shellext/deskadp/deskadp.h
reactos/dll/shellext/deskadp/lang/de-DE.rc
reactos/dll/shellext/deskadp/resource.h
reactos/dll/shellext/deskmon/deskmon.h
reactos/dll/shellext/deskmon/lang/de-DE.rc
reactos/dll/shellext/deskmon/resource.h
reactos/dll/shellext/fontext/fontext.h
reactos/dll/shellext/fontext/resource.h
reactos/dll/shellext/shellext.rbuild
reactos/dll/shellext/slayer/resource.h
reactos/dll/shellext/slayer/slayer.h
reactos/drivers/base/beep/beep.c
reactos/drivers/base/bootvid/i386/bootvid.c
reactos/drivers/base/bootvid/precomp.h
reactos/drivers/base/kdcom/i386/kdbg.c
reactos/drivers/base/kddll/kdcom.h
reactos/drivers/base/kddll/kddll.h
reactos/drivers/base/kddll/kddll.rbuild
reactos/drivers/battery/battc/battc.c [new file with mode: 0644]
reactos/drivers/battery/battc/battc.h [new file with mode: 0644]
reactos/drivers/battery/battc/battc.rbuild [new file with mode: 0644]
reactos/drivers/battery/battc/battc.rc [new file with mode: 0644]
reactos/drivers/battery/battc/battc.spec [new file with mode: 0644]
reactos/drivers/battery/cmbatt/cmbatt.c [new file with mode: 0644]
reactos/drivers/battery/cmbatt/cmbatt.h [new file with mode: 0644]
reactos/drivers/battery/cmbatt/cmbatt.rbuild [new file with mode: 0644]
reactos/drivers/battery/cmbatt/cmbatt.rc [new file with mode: 0644]
reactos/drivers/battery/cmbatt/miniclass.c [new file with mode: 0644]
reactos/drivers/battery/directory.rbuild [new file with mode: 0644]
reactos/drivers/bus/acpi/acpi.rbuild [deleted file]
reactos/drivers/bus/acpi/acpi.rc [deleted file]
reactos/drivers/bus/acpi/changed.txt [deleted file]
reactos/drivers/bus/acpi/dispatcher/dsfield.c [deleted file]
reactos/drivers/bus/acpi/dispatcher/dsmethod.c [deleted file]
reactos/drivers/bus/acpi/dispatcher/dsmthdat.c [deleted file]
reactos/drivers/bus/acpi/dispatcher/dsobject.c [deleted file]
reactos/drivers/bus/acpi/dispatcher/dsopcode.c [deleted file]
reactos/drivers/bus/acpi/dispatcher/dsutils.c [deleted file]
reactos/drivers/bus/acpi/dispatcher/dswexec.c [deleted file]
reactos/drivers/bus/acpi/dispatcher/dswload.c [deleted file]
reactos/drivers/bus/acpi/dispatcher/dswscope.c [deleted file]
reactos/drivers/bus/acpi/dispatcher/dswstate.c [deleted file]
reactos/drivers/bus/acpi/events/evevent.c [deleted file]
reactos/drivers/bus/acpi/events/evmisc.c [deleted file]
reactos/drivers/bus/acpi/events/evregion.c [deleted file]
reactos/drivers/bus/acpi/events/evrgnini.c [deleted file]
reactos/drivers/bus/acpi/events/evsci.c [deleted file]
reactos/drivers/bus/acpi/events/evxface.c [deleted file]
reactos/drivers/bus/acpi/events/evxfevnt.c [deleted file]
reactos/drivers/bus/acpi/events/evxfregn.c [deleted file]
reactos/drivers/bus/acpi/executer/amconfig.c [deleted file]
reactos/drivers/bus/acpi/executer/amconvrt.c [deleted file]
reactos/drivers/bus/acpi/executer/amcreate.c [deleted file]
reactos/drivers/bus/acpi/executer/amdump.c [deleted file]
reactos/drivers/bus/acpi/executer/amdyadic.c [deleted file]
reactos/drivers/bus/acpi/executer/amfield.c [deleted file]
reactos/drivers/bus/acpi/executer/amfldio.c [deleted file]
reactos/drivers/bus/acpi/executer/ammisc.c [deleted file]
reactos/drivers/bus/acpi/executer/ammonad.c [deleted file]
reactos/drivers/bus/acpi/executer/ammutex.c [deleted file]
reactos/drivers/bus/acpi/executer/amnames.c [deleted file]
reactos/drivers/bus/acpi/executer/amprep.c [deleted file]
reactos/drivers/bus/acpi/executer/amregion.c [deleted file]
reactos/drivers/bus/acpi/executer/amresnte.c [deleted file]
reactos/drivers/bus/acpi/executer/amresolv.c [deleted file]
reactos/drivers/bus/acpi/executer/amresop.c [deleted file]
reactos/drivers/bus/acpi/executer/amstore.c [deleted file]
reactos/drivers/bus/acpi/executer/amstoren.c [deleted file]
reactos/drivers/bus/acpi/executer/amstorob.c [deleted file]
reactos/drivers/bus/acpi/executer/amsystem.c [deleted file]
reactos/drivers/bus/acpi/executer/amutils.c [deleted file]
reactos/drivers/bus/acpi/executer/amxface.c [deleted file]
reactos/drivers/bus/acpi/hardware/hwacpi.c [deleted file]
reactos/drivers/bus/acpi/hardware/hwgpe.c [deleted file]
reactos/drivers/bus/acpi/hardware/hwregs.c [deleted file]
reactos/drivers/bus/acpi/hardware/hwsleep.c [deleted file]
reactos/drivers/bus/acpi/hardware/hwtimer.c [deleted file]
reactos/drivers/bus/acpi/include/accommon.h [deleted file]
reactos/drivers/bus/acpi/include/acconfig.h [deleted file]
reactos/drivers/bus/acpi/include/acdebug.h [deleted file]
reactos/drivers/bus/acpi/include/acdispat.h [deleted file]
reactos/drivers/bus/acpi/include/acevents.h [deleted file]
reactos/drivers/bus/acpi/include/acexcep.h [deleted file]
reactos/drivers/bus/acpi/include/acglobal.h [deleted file]
reactos/drivers/bus/acpi/include/achware.h [deleted file]
reactos/drivers/bus/acpi/include/acinterp.h [deleted file]
reactos/drivers/bus/acpi/include/aclocal.h [deleted file]
reactos/drivers/bus/acpi/include/acmacros.h [deleted file]
reactos/drivers/bus/acpi/include/acnamesp.h [deleted file]
reactos/drivers/bus/acpi/include/acobject.h [deleted file]
reactos/drivers/bus/acpi/include/acoutput.h [deleted file]
reactos/drivers/bus/acpi/include/acparser.h [deleted file]
reactos/drivers/bus/acpi/include/acpi.h [deleted file]
reactos/drivers/bus/acpi/include/acpiosxf.h [deleted file]
reactos/drivers/bus/acpi/include/acpixf.h [deleted file]
reactos/drivers/bus/acpi/include/acresrc.h [deleted file]
reactos/drivers/bus/acpi/include/acstruct.h [deleted file]
reactos/drivers/bus/acpi/include/actables.h [deleted file]
reactos/drivers/bus/acpi/include/actbl.h [deleted file]
reactos/drivers/bus/acpi/include/actbl1.h [deleted file]
reactos/drivers/bus/acpi/include/actbl2.h [deleted file]
reactos/drivers/bus/acpi/include/actbl71.h [deleted file]
reactos/drivers/bus/acpi/include/actypes.h [deleted file]
reactos/drivers/bus/acpi/include/amlcode.h [deleted file]
reactos/drivers/bus/acpi/include/platform/acenv.h [deleted file]
reactos/drivers/bus/acpi/include/platform/acgcc.h [deleted file]
reactos/drivers/bus/acpi/include/platform/aclinux.h [deleted file]
reactos/drivers/bus/acpi/include/platform/acmsc.h [deleted file]
reactos/drivers/bus/acpi/include/platform/acwin.h [deleted file]
reactos/drivers/bus/acpi/include/platform/types.h [deleted file]
reactos/drivers/bus/acpi/namespace/nsaccess.c [deleted file]
reactos/drivers/bus/acpi/namespace/nsalloc.c [deleted file]
reactos/drivers/bus/acpi/namespace/nseval.c [deleted file]
reactos/drivers/bus/acpi/namespace/nsinit.c [deleted file]
reactos/drivers/bus/acpi/namespace/nsload.c [deleted file]
reactos/drivers/bus/acpi/namespace/nsnames.c [deleted file]
reactos/drivers/bus/acpi/namespace/nsobject.c [deleted file]
reactos/drivers/bus/acpi/namespace/nssearch.c [deleted file]
reactos/drivers/bus/acpi/namespace/nsutils.c [deleted file]
reactos/drivers/bus/acpi/namespace/nswalk.c [deleted file]
reactos/drivers/bus/acpi/namespace/nsxfname.c [deleted file]
reactos/drivers/bus/acpi/namespace/nsxfobj.c [deleted file]
reactos/drivers/bus/acpi/ospm/acpienum.c [deleted file]
reactos/drivers/bus/acpi/ospm/acpisys.c [deleted file]
reactos/drivers/bus/acpi/ospm/bn.c [deleted file]
reactos/drivers/bus/acpi/ospm/busmgr/bm.c [deleted file]
reactos/drivers/bus/acpi/ospm/busmgr/bmnotify.c [deleted file]
reactos/drivers/bus/acpi/ospm/busmgr/bmpm.c [deleted file]
reactos/drivers/bus/acpi/ospm/busmgr/bmpower.c [deleted file]
reactos/drivers/bus/acpi/ospm/busmgr/bmrequest.c [deleted file]
reactos/drivers/bus/acpi/ospm/busmgr/bmsearch.c [deleted file]
reactos/drivers/bus/acpi/ospm/busmgr/bmutils.c [deleted file]
reactos/drivers/bus/acpi/ospm/busmgr/bmxface.c [deleted file]
reactos/drivers/bus/acpi/ospm/fdo.c [deleted file]
reactos/drivers/bus/acpi/ospm/include/acpisys.h [deleted file]
reactos/drivers/bus/acpi/ospm/include/bm.h [deleted file]
reactos/drivers/bus/acpi/ospm/include/bmpower.h [deleted file]
reactos/drivers/bus/acpi/ospm/include/bn.h [deleted file]
reactos/drivers/bus/acpi/ospm/osl.c [deleted file]
reactos/drivers/bus/acpi/ospm/pdo.c [deleted file]
reactos/drivers/bus/acpi/parser/psargs.c [deleted file]
reactos/drivers/bus/acpi/parser/psopcode.c [deleted file]
reactos/drivers/bus/acpi/parser/psparse.c [deleted file]
reactos/drivers/bus/acpi/parser/psscope.c [deleted file]
reactos/drivers/bus/acpi/parser/pstree.c [deleted file]
reactos/drivers/bus/acpi/parser/psutils.c [deleted file]
reactos/drivers/bus/acpi/parser/pswalk.c [deleted file]
reactos/drivers/bus/acpi/parser/psxface.c [deleted file]
reactos/drivers/bus/acpi/resource/rsaddr.c [deleted file]
reactos/drivers/bus/acpi/resource/rscalc.c [deleted file]
reactos/drivers/bus/acpi/resource/rscreate.c [deleted file]
reactos/drivers/bus/acpi/resource/rsdump.c [deleted file]
reactos/drivers/bus/acpi/resource/rsio.c [deleted file]
reactos/drivers/bus/acpi/resource/rsirq.c [deleted file]
reactos/drivers/bus/acpi/resource/rslist.c [deleted file]
reactos/drivers/bus/acpi/resource/rsmemory.c [deleted file]
reactos/drivers/bus/acpi/resource/rsmisc.c [deleted file]
reactos/drivers/bus/acpi/resource/rsutils.c [deleted file]
reactos/drivers/bus/acpi/resource/rsxface.c [deleted file]
reactos/drivers/bus/acpi/tables/tbconvrt.c [deleted file]
reactos/drivers/bus/acpi/tables/tbget.c [deleted file]
reactos/drivers/bus/acpi/tables/tbinstal.c [deleted file]
reactos/drivers/bus/acpi/tables/tbutils.c [deleted file]
reactos/drivers/bus/acpi/tables/tbxface.c [deleted file]
reactos/drivers/bus/acpi/tables/tbxfroot.c [deleted file]
reactos/drivers/bus/acpi/utils/cmalloc.c [deleted file]
reactos/drivers/bus/acpi/utils/cmclib.c [deleted file]
reactos/drivers/bus/acpi/utils/cmcopy.c [deleted file]
reactos/drivers/bus/acpi/utils/cmdebug.c [deleted file]
reactos/drivers/bus/acpi/utils/cmdelete.c [deleted file]
reactos/drivers/bus/acpi/utils/cmeval.c [deleted file]
reactos/drivers/bus/acpi/utils/cmglobal.c [deleted file]
reactos/drivers/bus/acpi/utils/cminit.c [deleted file]
reactos/drivers/bus/acpi/utils/cmobject.c [deleted file]
reactos/drivers/bus/acpi/utils/cmutils.c [deleted file]
reactos/drivers/bus/acpi/utils/cmxface.c [deleted file]
reactos/drivers/bus/isapnp/isapnp.h
reactos/drivers/bus/pci/pci.h
reactos/drivers/bus/pci/pcidef.h
reactos/drivers/directx/directory.rbuild
reactos/drivers/directx/dxapi/dxapi.rbuild
reactos/drivers/directx/dxg/dxg.rbuild
reactos/drivers/directx/dxgthk/dxgthk.rbuild
reactos/drivers/drivers.rbuild
reactos/drivers/filesystems/fastfat/fsctl.c
reactos/drivers/filesystems/fastfat_new/fat.h
reactos/drivers/filesystems/fastfat_new/fatstruc.h
reactos/drivers/filesystems/mup/mup.h
reactos/drivers/input/i8042prt/i8042prt.h
reactos/drivers/ksfilter/ks/kcom.c
reactos/drivers/ksfilter/ks/ksfunc.h
reactos/drivers/ksfilter/ks/ksiface.h
reactos/drivers/ksfilter/ks/kstypes.h
reactos/drivers/ksfilter/ks/priv.h
reactos/drivers/ksfilter/swenum/precomp.h
reactos/drivers/multimedia/audio/mpu401_nt4/mpu401.h
reactos/drivers/multimedia/audio/sb16_nt4.old/sndblst.h
reactos/drivers/multimedia/audio/sndblst.old/sndblst.h
reactos/drivers/multimedia/bdasup/precomp.h
reactos/drivers/network/acd/include/acdapi.h
reactos/drivers/network/afd/include/debug.h
reactos/drivers/network/afd/include/tdi_proto.h
reactos/drivers/network/afd/include/tdiconn.h
reactos/drivers/network/dd/ne2000/include/8390.h
reactos/drivers/network/dd/ne2000/include/debug.h
reactos/drivers/network/dd/ne2000/include/ne2000.h
reactos/drivers/network/dd/pcnet/pci.h
reactos/drivers/network/dd/pcnet/pcnet.h
reactos/drivers/network/dd/pcnet/pcnethw.h
reactos/drivers/network/lan/include/debug.h
reactos/drivers/network/lan/include/lan.h
reactos/drivers/network/lan/include/memtrack.h
reactos/drivers/network/lan/include/net_lan.h
reactos/drivers/network/lan/include/net_wh.h
reactos/drivers/network/lan/include/precomp.h
reactos/drivers/network/ndis/include/buffer.h
reactos/drivers/network/ndis/include/debug.h
reactos/drivers/network/ndis/include/efilter.h
reactos/drivers/network/ndis/include/miniport.h
reactos/drivers/network/ndis/include/protocol.h
reactos/drivers/network/tcpip/include/address.h
reactos/drivers/network/tcpip/include/arp.h
reactos/drivers/network/tcpip/include/checksum.h
reactos/drivers/network/tcpip/include/datagram.h
reactos/drivers/network/tcpip/include/debug.h
reactos/drivers/network/tcpip/include/dispatch.h
reactos/drivers/network/tcpip/include/fileobjs.h
reactos/drivers/network/tcpip/include/icmp.h
reactos/drivers/network/tcpip/include/info.h
reactos/drivers/network/tcpip/include/interface.h
reactos/drivers/network/tcpip/include/ip.h
reactos/drivers/network/tcpip/include/lan.h
reactos/drivers/network/tcpip/include/linux.h
reactos/drivers/network/tcpip/include/lock.h
reactos/drivers/network/tcpip/include/loopback.h
reactos/drivers/network/tcpip/include/neighbor.h
reactos/drivers/network/tcpip/include/pool.h
reactos/drivers/network/tcpip/include/ports.h
reactos/drivers/network/tcpip/include/rawip.h
reactos/drivers/network/tcpip/include/receive.h
reactos/drivers/network/tcpip/include/route.h
reactos/drivers/network/tcpip/include/router.h
reactos/drivers/network/tcpip/include/routines.h
reactos/drivers/network/tcpip/include/tags.h
reactos/drivers/network/tcpip/include/tcp.h
reactos/drivers/network/tcpip/include/tcpcore.h
reactos/drivers/network/tcpip/include/tcpdef.h
reactos/drivers/network/tcpip/include/tcpip.h
reactos/drivers/network/tcpip/include/ticonsts.h
reactos/drivers/network/tcpip/include/tilists.h
reactos/drivers/network/tcpip/include/titypes.h
reactos/drivers/network/tcpip/include/transmit.h
reactos/drivers/network/tcpip/include/udp.h
reactos/drivers/network/tcpip/include/wait.h
reactos/drivers/parallel/parallel/parallel.h
reactos/drivers/storage/class/include/class2.h
reactos/drivers/storage/class/ramdisk/ramdisk.c
reactos/drivers/storage/floppy/floppy.c
reactos/drivers/storage/floppy/hardware.c
reactos/drivers/storage/ide/atapi/atapi.rbuild
reactos/drivers/storage/ide/uniata/id_ata.cpp
reactos/drivers/storage/ide/uniata/id_probe.cpp
reactos/drivers/storage/ide/uniata/ntddk_ex.h
reactos/drivers/storage/port/buslogic/BT958dt.h
reactos/drivers/storage/port/buslogic/BusLogic958.h
reactos/drivers/storage/port/buslogic/buslogic.rbuild
reactos/drivers/usb/usbehci/common.c
reactos/drivers/usb/usbehci/fdo.c
reactos/drivers/usb/usbehci/irp.c
reactos/drivers/usb/usbehci/pdo.c
reactos/drivers/usb/usbehci/urbreq.c
reactos/drivers/usb/usbehci/usbehci.c
reactos/drivers/usb/usbehci/usbehci.h
reactos/drivers/usb/usbehci/usbehci.rbuild
reactos/drivers/usb/usbehci/usbiffn.c [new file with mode: 0644]
reactos/drivers/usb/usbehci/usbiffn.h [new file with mode: 0644]
reactos/drivers/video/displays/directory.rbuild
reactos/drivers/video/displays/framebuf/framebuf.h
reactos/drivers/video/displays/framebuf_new/debug.c [new file with mode: 0755]
reactos/drivers/video/displays/framebuf_new/debug.h [new file with mode: 0755]
reactos/drivers/video/displays/framebuf_new/driver.h [new file with mode: 0755]
reactos/drivers/video/displays/framebuf_new/enable.c [new file with mode: 0644]
reactos/drivers/video/displays/framebuf_new/framebuf_new.rbuild [new file with mode: 0644]
reactos/drivers/video/displays/framebuf_new/framebuf_new.rc [new file with mode: 0644]
reactos/drivers/video/displays/framebuf_new/framebuf_new.spec [new file with mode: 0644]
reactos/drivers/video/displays/framebuf_new/palette.c [new file with mode: 0755]
reactos/drivers/video/displays/framebuf_new/pointer.c [new file with mode: 0755]
reactos/drivers/video/displays/framebuf_new/screen.c [new file with mode: 0755]
reactos/drivers/video/displays/framebufacc/framebufacc.h
reactos/drivers/video/displays/vga/vgaddi.h
reactos/drivers/video/font/bmfd/bmfd.rbuild
reactos/drivers/video/font/directory.rbuild
reactos/drivers/video/font/ftfd/freetype.def
reactos/drivers/video/font/ftfd/ftfd.rbuild
reactos/drivers/video/miniport/directory.rbuild
reactos/drivers/video/miniport/vbe/vbemp.c
reactos/drivers/video/miniport/vbe/vbemp.h
reactos/drivers/video/miniport/vga/vgamp.h
reactos/drivers/video/miniport/vga_new/cmdcnst.h [new file with mode: 0644]
reactos/drivers/video/miniport/vga_new/modeset.c [new file with mode: 0644]
reactos/drivers/video/miniport/vga_new/vbe.c [new file with mode: 0644]
reactos/drivers/video/miniport/vga_new/vbe.h [new file with mode: 0644]
reactos/drivers/video/miniport/vga_new/vbemodes.c [new file with mode: 0644]
reactos/drivers/video/miniport/vga_new/vga.c [new file with mode: 0644]
reactos/drivers/video/miniport/vga_new/vga.h [new file with mode: 0644]
reactos/drivers/video/miniport/vga_new/vga.rbuild [new file with mode: 0644]
reactos/drivers/video/miniport/vga_new/vga.rc [new file with mode: 0644]
reactos/drivers/video/miniport/vga_new/vgadata.c [new file with mode: 0644]
reactos/drivers/video/miniport/vmx_svga/precomp.h
reactos/drivers/video/miniport/vmx_svga/vmx_svga.c
reactos/drivers/video/miniport/xboxvmp/xboxvmp.h
reactos/drivers/video/videoprt/int10.c
reactos/drivers/video/videoprt/videoprt.c
reactos/drivers/video/videoprt/videoprt.h
reactos/drivers/video/videoprt/videoprt.spec
reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp
reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp
reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp
reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp
reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp
reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp
reactos/drivers/wdm/audio/drivers/CMIDriver/cmicontrol/main.h
reactos/drivers/wdm/audio/drivers/CMIDriver/installer/main.h
reactos/drivers/wdm/audio/drivers/CMIDriver/property.h
reactos/drivers/wdm/audio/filters/kmixer/kmixer.h
reactos/drivers/wdm/audio/filters/splitter/precomp.h
reactos/drivers/wdm/audio/filters/splitter/splitter.rbuild
reactos/drivers/wdm/audio/legacy/stream/stream.h
reactos/drivers/wdm/audio/legacy/wdmaud/control.c
reactos/drivers/wdm/audio/legacy/wdmaud/entry.c
reactos/drivers/wdm/audio/legacy/wdmaud/interface.h
reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c [deleted file]
reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c [new file with mode: 0644]
reactos/drivers/wdm/audio/legacy/wdmaud/sup.c
reactos/drivers/wdm/audio/legacy/wdmaud/wave.c [deleted file]
reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h
reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.rbuild
reactos/drivers/wdm/audio/sysaudio/sysaudio.h
reactos/drivers/wmi/wmilib.c
reactos/hal/hal.pspec
reactos/hal/hal.rbuild
reactos/hal/halarm/directory.rbuild
reactos/hal/halarm/generic/beep.c [new file with mode: 0644]
reactos/hal/halarm/generic/bus.c [new file with mode: 0644]
reactos/hal/halarm/generic/cache.S [new file with mode: 0644]
reactos/hal/halarm/generic/display.c [new file with mode: 0644]
reactos/hal/halarm/generic/dma.c [new file with mode: 0644]
reactos/hal/halarm/generic/drive.c [new file with mode: 0644]
reactos/hal/halarm/generic/fmutex.c [new file with mode: 0644]
reactos/hal/halarm/generic/generic.rbuild [deleted file]
reactos/hal/halarm/generic/hal.c [deleted file]
reactos/hal/halarm/generic/halinit.c [new file with mode: 0644]
reactos/hal/halarm/generic/misc.c [new file with mode: 0644]
reactos/hal/halarm/generic/pic.c [new file with mode: 0644]
reactos/hal/halarm/generic/portio.c [new file with mode: 0644]
reactos/hal/halarm/generic/processor.c [new file with mode: 0644]
reactos/hal/halarm/generic/profil.c [new file with mode: 0644]
reactos/hal/halarm/generic/reboot.c [new file with mode: 0644]
reactos/hal/halarm/generic/rtc.c [new file with mode: 0644]
reactos/hal/halarm/generic/spinlock.c [new file with mode: 0644]
reactos/hal/halarm/generic/sysinfo.c [new file with mode: 0644]
reactos/hal/halarm/generic/timer.c [new file with mode: 0644]
reactos/hal/halarm/generic/usage.c [new file with mode: 0644]
reactos/hal/halarm/hal.rbuild [new file with mode: 0644]
reactos/hal/halarm/hal_generic.rbuild [new file with mode: 0644]
reactos/hal/halarm/include/hal.h
reactos/hal/halarm/include/halp.h
reactos/hal/halarm/up/halinit_up.c [deleted file]
reactos/hal/halarm/versa/halinit_up.c [new file with mode: 0644]
reactos/hal/halarm/versa/halup.rbuild [moved from reactos/hal/halarm/up/halup.rbuild with 59% similarity]
reactos/hal/halarm/versa/halup.rc [moved from reactos/hal/halarm/up/halup.rc with 100% similarity]
reactos/hal/halppc/generic/fmutex.c
reactos/hal/halppc/include/apic.h
reactos/hal/halppc/include/bus.h
reactos/hal/halppc/include/haldma.h
reactos/hal/halppc/include/halirq.h
reactos/hal/halppc/include/halp.h
reactos/hal/halppc/include/ioapic.h
reactos/hal/halppc/include/mps.h
reactos/hal/halx86/directory.rbuild
reactos/hal/halx86/generic/bios.c
reactos/hal/halx86/generic/bus/halbus.c
reactos/hal/halx86/generic/bus/pcibus.c
reactos/hal/halx86/generic/bus/pcidata.c
reactos/hal/halx86/generic/display.c
reactos/hal/halx86/generic/dma.c
reactos/hal/halx86/generic/halinit.c
reactos/hal/halx86/generic/misc.c
reactos/hal/halx86/generic/pic.c
reactos/hal/halx86/generic/reboot.c
reactos/hal/halx86/generic/sysinfo.c
reactos/hal/halx86/generic/timer.c
reactos/hal/halx86/generic/trap.S [new file with mode: 0644]
reactos/hal/halx86/generic/usage.c
reactos/hal/halx86/hal.rbuild
reactos/hal/halx86/hal_generic.rbuild
reactos/hal/halx86/hal_generic_mp.rbuild
reactos/hal/halx86/hal_generic_up.rbuild
reactos/hal/halx86/halmps.rbuild
reactos/hal/halx86/halxbox.rbuild
reactos/hal/halx86/include/apic.h
reactos/hal/halx86/include/bus.h
reactos/hal/halx86/include/hal.h
reactos/hal/halx86/include/haldma.h
reactos/hal/halx86/include/halirq.h
reactos/hal/halx86/include/halp.h
reactos/hal/halx86/include/ioapic.h
reactos/hal/halx86/include/mps.h
reactos/hal/halx86/mp/apic.c
reactos/include/crt/_mingw.h
reactos/include/crt/crtdefs.h
reactos/include/crt/excpt.h
reactos/include/crt/fpieee.h
reactos/include/crt/io.h
reactos/include/crt/math.h
reactos/include/crt/rtcapi.h
reactos/include/crt/setjmp.h
reactos/include/crt/stddef.h
reactos/include/crt/stdint.h
reactos/include/crt/stdio.h
reactos/include/crt/stdlib.h
reactos/include/crt/tchar.h
reactos/include/crt/time.h
reactos/include/crt/vadefs.h
reactos/include/crt/wchar.h
reactos/include/crt/yvals.h
reactos/include/ddk/acpiioct.h [new file with mode: 0644]
reactos/include/ddk/bdasup.h
reactos/include/ddk/csq.h
reactos/include/ddk/d3dhal.h
reactos/include/ddk/d3dnthal.h
reactos/include/ddk/ddkmapi.h
reactos/include/ddk/ddrawi.h
reactos/include/ddk/ddrawint.h
reactos/include/ddk/dmemmgr.h
reactos/include/ddk/hubbusif.h [new file with mode: 0644]
reactos/include/ddk/ide.h
reactos/include/ddk/ioaccess.h
reactos/include/ddk/miniport.h
reactos/include/ddk/minitape.h
reactos/include/ddk/ndis.h
reactos/include/ddk/ntdddisk.h
reactos/include/ddk/ntddk.h
reactos/include/ddk/ntddvdeo.h
reactos/include/ddk/ntifs.h
reactos/include/ddk/ntpoapi.h
reactos/include/ddk/punknown.h
reactos/include/ddk/stdunk.h
reactos/include/ddk/strmini.h
reactos/include/ddk/tdikrnl.h
reactos/include/ddk/usb200.h [deleted file]
reactos/include/ddk/usbbusif.h [new file with mode: 0644]
reactos/include/ddk/usbcamdi.h [deleted file]
reactos/include/ddk/usbdi.h [deleted file]
reactos/include/ddk/usbdlib.h
reactos/include/ddk/usbdrivr.h [new file with mode: 0644]
reactos/include/ddk/usbioctl.h [deleted file]
reactos/include/ddk/usbkern.h
reactos/include/ddk/usbprint.h
reactos/include/ddk/usbprotocoldefs.h [new file with mode: 0644]
reactos/include/ddk/usbscan.h
reactos/include/ddk/usbstorioctl.h [new file with mode: 0644]
reactos/include/ddk/video.h
reactos/include/ddk/wdm.h
reactos/include/ddk/winddk.h [deleted file]
reactos/include/ddk/wmilib.h [new file with mode: 0644]
reactos/include/ddk/wmlib.h [new file with mode: 0644]
reactos/include/dxsdk/axcore.idl
reactos/include/dxsdk/axextend.idl
reactos/include/dxsdk/axextendenums.h [new file with mode: 0644]
reactos/include/dxsdk/bdamedia.h
reactos/include/dxsdk/bdatypes.h
reactos/include/dxsdk/d3dx9shader.h
reactos/include/dxsdk/dmo.h
reactos/include/dxsdk/dmoreg.h
reactos/include/dxsdk/dmort.h
reactos/include/dxsdk/qedit.idl
reactos/include/dxsdk/uuids.h
reactos/include/dxsdk/vmrender.idl
reactos/include/ndk/arm/ketypes.h
reactos/include/ndk/arm/mmtypes.h
reactos/include/ndk/cmtypes.h
reactos/include/ndk/exfuncs.h
reactos/include/ndk/i386/asm.h
reactos/include/ndk/i386/ketypes.h
reactos/include/ndk/ifssupp.h
reactos/include/ndk/iotypes.h
reactos/include/ndk/obfuncs.h
reactos/include/ndk/rtlfuncs.h
reactos/include/psdk/access.idl [new file with mode: 0644]
reactos/include/psdk/asynot.idl [new file with mode: 0644]
reactos/include/psdk/asysta.idl [new file with mode: 0644]
reactos/include/psdk/batclass.h
reactos/include/psdk/bdaiface.idl [new file with mode: 0644]
reactos/include/psdk/binres.idl [new file with mode: 0644]
reactos/include/psdk/bits.idl
reactos/include/psdk/cmdbas.idl [new file with mode: 0644]
reactos/include/psdk/cmdtxt.idl [new file with mode: 0644]
reactos/include/psdk/control.idl
reactos/include/psdk/crtrow.idl [new file with mode: 0644]
reactos/include/psdk/ctfutb.idl [new file with mode: 0644]
reactos/include/psdk/dbccmd.idl [new file with mode: 0644]
reactos/include/psdk/dbcses.idl [new file with mode: 0644]
reactos/include/psdk/dbdsad.idl [new file with mode: 0644]
reactos/include/psdk/dbprop.idl
reactos/include/psdk/dbs.idl
reactos/include/psdk/dimm.idl
reactos/include/psdk/dispex.idl
reactos/include/psdk/dpfilter.h [new file with mode: 0644]
reactos/include/psdk/gdipluscolormatrix.h
reactos/include/psdk/hlink.idl
reactos/include/psdk/iphlpapi.h
reactos/include/psdk/iprtrmib.h
reactos/include/psdk/ks.h
reactos/include/psdk/ksproxy.h [new file with mode: 0644]
reactos/include/psdk/ktmtypes.h [new file with mode: 0644]
reactos/include/psdk/mapi.h
reactos/include/psdk/mlang.idl
reactos/include/psdk/mscoree.idl
reactos/include/psdk/msctf.idl
reactos/include/psdk/mshtmdid.h
reactos/include/psdk/mshtml.idl
reactos/include/psdk/msi.h
reactos/include/psdk/msidefs.h
reactos/include/psdk/msxml2.idl
reactos/include/psdk/ntddkbd.h [moved from reactos/include/ddk/ntddkbd.h with 94% similarity]
reactos/include/psdk/ntdef.h [moved from reactos/include/ddk/ntdef.h with 93% similarity]
reactos/include/psdk/objidl.idl
reactos/include/psdk/oledb.idl
reactos/include/psdk/opnrst.idl [new file with mode: 0644]
reactos/include/psdk/pdh.h
reactos/include/psdk/propidl.idl
reactos/include/psdk/psdk.rbuild
reactos/include/psdk/pstore.idl
reactos/include/psdk/row.idl [new file with mode: 0644]
reactos/include/psdk/rowchg.idl [new file with mode: 0644]
reactos/include/psdk/rpcdce.h
reactos/include/psdk/rpcndr.h
reactos/include/psdk/rstbas.idl [new file with mode: 0644]
reactos/include/psdk/rstinf.idl [new file with mode: 0644]
reactos/include/psdk/rstloc.idl [new file with mode: 0644]
reactos/include/psdk/sdkddkver.h
reactos/include/psdk/sensevts.idl
reactos/include/psdk/sesprp.idl [new file with mode: 0644]
reactos/include/psdk/shlobj.h
reactos/include/psdk/shlwapi.h
reactos/include/psdk/shobjidl.idl
reactos/include/psdk/shtypes.idl
reactos/include/psdk/tom.idl
reactos/include/psdk/tuner.idl [new file with mode: 0644]
reactos/include/psdk/urlmon.idl
reactos/include/psdk/usb.h [moved from reactos/include/ddk/usb.h with 75% similarity]
reactos/include/psdk/usb100.h [moved from reactos/include/ddk/usb100.h with 71% similarity]
reactos/include/psdk/usb200.h [new file with mode: 0644]
reactos/include/psdk/usbcamdi.h [new file with mode: 0644]
reactos/include/psdk/usbdi.h [new file with mode: 0644]
reactos/include/psdk/usbioctl.h [new file with mode: 0644]
reactos/include/psdk/usbiodef.h [moved from reactos/include/ddk/usbiodef.h with 58% similarity]
reactos/include/psdk/usbrpmif.h [new file with mode: 0644]
reactos/include/psdk/usbuser.h [moved from reactos/include/ddk/usbuser.h with 54% similarity]
reactos/include/psdk/vfw.h
reactos/include/psdk/winbase.h
reactos/include/psdk/wincodec.idl
reactos/include/psdk/wincrypt.h
reactos/include/psdk/windef.h
reactos/include/psdk/wingdi.h
reactos/include/psdk/winnt.h
reactos/include/psdk/winternl.h
reactos/include/psdk/winuser.h
reactos/include/psdk/wtypes.idl
reactos/include/psdk/xmldom.idl
reactos/include/psdk/xmllite.idl [new file with mode: 0644]
reactos/include/reactos/arm/armddk.h
reactos/include/reactos/arm/peripherals/pl011.h
reactos/include/reactos/arm/peripherals/pl190.h
reactos/include/reactos/arm/peripherals/sp804.h
reactos/include/reactos/idl/lsa.idl
reactos/include/reactos/mc/mc.rbuild
reactos/include/reactos/services/services.h
reactos/include/reactos/subsys/csrss/csrss.h
reactos/include/reactos/win32k/ntuser.h
reactos/include/reactos/wine/config.h
reactos/include/reactos/wine/mscvpdb.h
reactos/include/reactos/wine/port.h
reactos/include/reactos/wine/rpcfc.h
reactos/include/reactos/wine/wined3d.idl
reactos/lib/3rdparty/freetype/src/base/ftbitmap.c
reactos/lib/3rdparty/icu4ros/icu4ros.rbuild
reactos/lib/3rdparty/libsamplerate/libsamplerate.rbuild
reactos/lib/atl/atl.rbuild
reactos/lib/atl/atlbase.h
reactos/lib/atl/atlcom.h
reactos/lib/atl/atlcore.h
reactos/lib/atl/atlwin.h
reactos/lib/atl/statreg.h
reactos/lib/cmlib/cmdata.h
reactos/lib/cmlib/cmlib.h
reactos/lib/cmlib/hivedata.h
reactos/lib/cmlib/hivewrt.c
reactos/lib/dnslib/dnslib.rbuild
reactos/lib/dnslib/inc/dnslib.h
reactos/lib/drivers/csq/csq.h [deleted file]
reactos/lib/drivers/ip/transport/tcp/event.c
reactos/lib/drivers/sound/mmixer/filter.c
reactos/lib/drivers/sound/mmixer/mmixer.h
reactos/lib/drivers/sound/mmixer/priv.h
reactos/lib/drivers/sound/mmixer/sup.c
reactos/lib/drivers/sound/mmixer/wave.c
reactos/lib/fslib/ext2lib/Bitmap.h
reactos/lib/fslib/ext2lib/Disk.h
reactos/lib/fslib/ext2lib/Mke2fs.h
reactos/lib/fslib/ext2lib/ext2_fs.h
reactos/lib/fslib/ext2lib/types.h
reactos/lib/inflib/infcommon.h
reactos/lib/inflib/infhost.h
reactos/lib/inflib/infpriv.h
reactos/lib/inflib/infros.h
reactos/lib/nls/scripts/scripts.h
reactos/lib/ppcmmu/mmuobject.h
reactos/lib/recyclebin/recyclebin.h
reactos/lib/rossym/rossympriv.h
reactos/lib/rtl/actctx.c
reactos/lib/rtl/austin/avl.h
reactos/lib/rtl/austin/udict.h
reactos/lib/rtl/nls.c
reactos/lib/sdk/crt/crt.rbuild
reactos/lib/sdk/crt/libcntpr.rbuild
reactos/lib/sdk/crt/locale/locale.c
reactos/lib/sdk/crt/math/i386/pow_asm.s
reactos/lib/sdk/crt/stdio/file.c
reactos/lib/sdk/uuid/uuid.c
reactos/lib/tdilib/tdilib.h
reactos/lib/tdilib/tdilib.rbuild
reactos/media/doc/README.WINE
reactos/media/inf/battery.inf [new file with mode: 0644]
reactos/media/inf/cpu.inf
reactos/media/inf/inf.rbuild
reactos/media/inf/keyboard.inf
reactos/media/inf/machine.inf
reactos/media/inf/msmouse.inf
reactos/media/inf/syssetup.inf.tpl
reactos/media/vgafonts/vgafonts.rbuild
reactos/ntoskrnl/config/cmdata.c
reactos/ntoskrnl/config/cmlazy.c
reactos/ntoskrnl/ex/i386/fastinterlck_asm.S
reactos/ntoskrnl/ex/i386/interlck_asm.S
reactos/ntoskrnl/ex/shutdown.c
reactos/ntoskrnl/ex/work.c
reactos/ntoskrnl/fstub/halstub.c
reactos/ntoskrnl/inbv/inbv.c
reactos/ntoskrnl/inbv/logo/1.bmp
reactos/ntoskrnl/inbv/logo/13.bmp [deleted file]
reactos/ntoskrnl/inbv/logo/14.bmp
reactos/ntoskrnl/inbv/logo/15.bmp
reactos/ntoskrnl/inbv/logo/16.bmp [deleted file]
reactos/ntoskrnl/inbv/logo/17.bmp [deleted file]
reactos/ntoskrnl/inbv/logo/2.bmp
reactos/ntoskrnl/inbv/logo/3.bmp
reactos/ntoskrnl/inbv/logo/4.bmp
reactos/ntoskrnl/inbv/logo/5.bmp
reactos/ntoskrnl/inbv/logo/6.bmp
reactos/ntoskrnl/inbv/logo/7.bmp
reactos/ntoskrnl/inbv/logo/8.bmp
reactos/ntoskrnl/include/config.h
reactos/ntoskrnl/include/internal/arch/intrin_i.h
reactos/ntoskrnl/include/internal/arch/ke.h
reactos/ntoskrnl/include/internal/arch/mm.h
reactos/ntoskrnl/include/internal/arm/intrin_i.h
reactos/ntoskrnl/include/internal/arm/ke.h
reactos/ntoskrnl/include/internal/arm/mm.h
reactos/ntoskrnl/include/internal/cc.h
reactos/ntoskrnl/include/internal/cm.h
reactos/ntoskrnl/include/internal/ex.h
reactos/ntoskrnl/include/internal/hal.h
reactos/ntoskrnl/include/internal/i386/asmmacro.S
reactos/ntoskrnl/include/internal/i386/intrin_i.h
reactos/ntoskrnl/include/internal/i386/ke.h
reactos/ntoskrnl/include/internal/i386/mm.h
reactos/ntoskrnl/include/internal/i386/v86m.h
reactos/ntoskrnl/include/internal/inbv.h
reactos/ntoskrnl/include/internal/io.h
reactos/ntoskrnl/include/internal/kd.h
reactos/ntoskrnl/include/internal/ke.h
reactos/ntoskrnl/include/internal/ldr.h
reactos/ntoskrnl/include/internal/mm.h
reactos/ntoskrnl/include/internal/ntoskrnl.h
reactos/ntoskrnl/include/internal/pci.h
reactos/ntoskrnl/include/internal/po.h
reactos/ntoskrnl/include/internal/powerpc/intrin_i.h
reactos/ntoskrnl/include/internal/powerpc/ke.h
reactos/ntoskrnl/include/internal/probe.h
reactos/ntoskrnl/include/internal/rtl.h
reactos/ntoskrnl/include/internal/se.h
reactos/ntoskrnl/include/internal/tag.h
reactos/ntoskrnl/include/internal/test.h
reactos/ntoskrnl/include/internal/trap_x.h
reactos/ntoskrnl/include/ntoskrnl.h
reactos/ntoskrnl/include/precomp.h [deleted file]
reactos/ntoskrnl/include/resource.h [new file with mode: 0644]
reactos/ntoskrnl/io/iomgr/device.c
reactos/ntoskrnl/io/iomgr/driver.c
reactos/ntoskrnl/io/iomgr/drvrlist.c
reactos/ntoskrnl/io/iomgr/irp.c
reactos/ntoskrnl/io/iomgr/volume.c
reactos/ntoskrnl/io/pnpmgr/pnpmgr.c
reactos/ntoskrnl/kdbg/i386/dis-asm.h
reactos/ntoskrnl/kdbg/kdb.h
reactos/ntoskrnl/ke/arm/boot.s
reactos/ntoskrnl/ke/arm/cpu.c
reactos/ntoskrnl/ke/arm/exp.c
reactos/ntoskrnl/ke/arm/kiinit.c
reactos/ntoskrnl/ke/arm/trapc.c
reactos/ntoskrnl/ke/arm/usercall.c
reactos/ntoskrnl/ke/eventobj.c
reactos/ntoskrnl/ke/except.c
reactos/ntoskrnl/ke/i386/cpu.c
reactos/ntoskrnl/ke/i386/irqobj.c
reactos/ntoskrnl/ke/i386/patpge.c
reactos/ntoskrnl/ke/i386/trap.s
reactos/ntoskrnl/ke/i386/traphdlr.c
reactos/ntoskrnl/ke/i386/usercall_asm.S
reactos/ntoskrnl/ke/i386/v86vdm.c
reactos/ntoskrnl/ke/wait.c
reactos/ntoskrnl/mm/ARM3/hypermap.c
reactos/ntoskrnl/mm/ARM3/i386/init.c
reactos/ntoskrnl/mm/ARM3/iosup.c
reactos/ntoskrnl/mm/ARM3/mdlsup.c
reactos/ntoskrnl/mm/ARM3/miarm.h
reactos/ntoskrnl/mm/ARM3/mminit.c [new file with mode: 0644]
reactos/ntoskrnl/mm/ARM3/mmsup.c
reactos/ntoskrnl/mm/ARM3/ncache.c
reactos/ntoskrnl/mm/ARM3/pagfault.c
reactos/ntoskrnl/mm/ARM3/pfnlist.c [new file with mode: 0644]
reactos/ntoskrnl/mm/ARM3/pool.c
reactos/ntoskrnl/mm/ARM3/procsup.c
reactos/ntoskrnl/mm/anonmem.c
reactos/ntoskrnl/mm/arm/page.c [new file with mode: 0644]
reactos/ntoskrnl/mm/balance.c
reactos/ntoskrnl/mm/freelist.c
reactos/ntoskrnl/mm/i386/page.c
reactos/ntoskrnl/mm/mmdbg.c
reactos/ntoskrnl/mm/mmfault.c
reactos/ntoskrnl/mm/mminit.c
reactos/ntoskrnl/mm/mpw.c
reactos/ntoskrnl/mm/rmap.c
reactos/ntoskrnl/mm/section.c
reactos/ntoskrnl/mm/sysldr.c
reactos/ntoskrnl/ntoskrnl-generic.rbuild
reactos/ntoskrnl/ntoskrnl.pspec
reactos/ntoskrnl/ntoskrnl.rc
reactos/ntoskrnl/po/poshtdwn.c [new file with mode: 0644]
reactos/ntoskrnl/po/povolume.c [new file with mode: 0644]
reactos/ntoskrnl/po/power.c
reactos/ntoskrnl/ps/security.c
reactos/ntoskrnl/se/semgr.c
reactos/ntoskrnl/se/token.c
reactos/subsystems/csr/csrsrv/process.c
reactos/subsystems/csr/csrsrv/srv.h
reactos/subsystems/csr/csrsrv/thread.c
reactos/subsystems/win/basesrv/basesrv.h
reactos/subsystems/win/winsrv/winsrv.h
reactos/subsystems/win32/csrss/csrsrv/api/handle.c [moved from reactos/subsystems/win32/csrss/api/handle.c with 99% similarity]
reactos/subsystems/win32/csrss/csrsrv/api/process.c [moved from reactos/subsystems/win32/csrss/api/process.c with 76% similarity]
reactos/subsystems/win32/csrss/csrsrv/api/user.c [moved from reactos/subsystems/win32/csrss/api/user.c with 98% similarity]
reactos/subsystems/win32/csrss/csrsrv/api/wapi.c [moved from reactos/subsystems/win32/csrss/api/wapi.c with 82% similarity]
reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild [new file with mode: 0644]
reactos/subsystems/win32/csrss/csrsrv/csrsrv.rc [new file with mode: 0644]
reactos/subsystems/win32/csrss/csrsrv/csrsrv.spec [new file with mode: 0644]
reactos/subsystems/win32/csrss/csrsrv/init.c [moved from reactos/subsystems/win32/csrss/init.c with 80% similarity]
reactos/subsystems/win32/csrss/csrsrv/procsup.c [new file with mode: 0644]
reactos/subsystems/win32/csrss/csrsrv/srv.h [moved from reactos/subsystems/win32/csrss/csrss.h with 71% similarity]
reactos/subsystems/win32/csrss/csrsrv/thredsup.c [new file with mode: 0644]
reactos/subsystems/win32/csrss/csrss.c
reactos/subsystems/win32/csrss/csrss.rbuild
reactos/subsystems/win32/csrss/include/api.h
reactos/subsystems/win32/csrss/include/conio.h
reactos/subsystems/win32/csrss/include/csrplugin.h
reactos/subsystems/win32/csrss/include/desktopbg.h
reactos/subsystems/win32/csrss/include/win32csr.h
reactos/subsystems/win32/csrss/print.c [deleted file]
reactos/subsystems/win32/csrss/video.c [deleted file]
reactos/subsystems/win32/csrss/win32csr/resource.h
reactos/subsystems/win32/win32k/dib/dib.h
reactos/subsystems/win32/win32k/eng/surface.c
reactos/subsystems/win32/win32k/include/accelerator.h
reactos/subsystems/win32/win32k/include/bitmaps.h
reactos/subsystems/win32/win32k/include/brush.h
reactos/subsystems/win32/win32k/include/callback.h
reactos/subsystems/win32/win32k/include/caret.h
reactos/subsystems/win32/win32k/include/class.h
reactos/subsystems/win32/win32k/include/cleanup.h
reactos/subsystems/win32/win32k/include/clipboard.h
reactos/subsystems/win32/win32k/include/cliprgn.h
reactos/subsystems/win32/win32k/include/color.h
reactos/subsystems/win32/win32k/include/coord.h
reactos/subsystems/win32/win32k/include/csr.h
reactos/subsystems/win32/win32k/include/cursoricon.h
reactos/subsystems/win32/win32k/include/dc.h
reactos/subsystems/win32/win32k/include/dce.h
reactos/subsystems/win32/win32k/include/desktop.h
reactos/subsystems/win32/win32k/include/dib.h
reactos/subsystems/win32/win32k/include/driver.h
reactos/subsystems/win32/win32k/include/driverobj.h
reactos/subsystems/win32/win32k/include/eng.h
reactos/subsystems/win32/win32k/include/engevent.h
reactos/subsystems/win32/win32k/include/engobjects.h
reactos/subsystems/win32/win32k/include/error.h
reactos/subsystems/win32/win32k/include/floatobj.h
reactos/subsystems/win32/win32k/include/focus.h
reactos/subsystems/win32/win32k/include/gdifloat.h
reactos/subsystems/win32/win32k/include/gdiobj.h
reactos/subsystems/win32/win32k/include/guicheck.h
reactos/subsystems/win32/win32k/include/hook.h
reactos/subsystems/win32/win32k/include/hotkey.h
reactos/subsystems/win32/win32k/include/input.h
reactos/subsystems/win32/win32k/include/intddraw.h
reactos/subsystems/win32/win32k/include/inteng.h
reactos/subsystems/win32/win32k/include/intgdi.h
reactos/subsystems/win32/win32k/include/menu.h
reactos/subsystems/win32/win32k/include/misc.h
reactos/subsystems/win32/win32k/include/mmcopy.h
reactos/subsystems/win32/win32k/include/monitor.h
reactos/subsystems/win32/win32k/include/mouse.h
reactos/subsystems/win32/win32k/include/msgqueue.h
reactos/subsystems/win32/win32k/include/ntuser.h
reactos/subsystems/win32/win32k/include/object.h
reactos/subsystems/win32/win32k/include/paint.h
reactos/subsystems/win32/win32k/include/painting.h
reactos/subsystems/win32/win32k/include/palette.h
reactos/subsystems/win32/win32k/include/path.h
reactos/subsystems/win32/win32k/include/pdevobj.h
reactos/subsystems/win32/win32k/include/pen.h
reactos/subsystems/win32/win32k/include/prop.h
reactos/subsystems/win32/win32k/include/rect.h
reactos/subsystems/win32/win32k/include/region.h
reactos/subsystems/win32/win32k/include/scroll.h
reactos/subsystems/win32/win32k/include/surface.h
reactos/subsystems/win32/win32k/include/sysparams.h
reactos/subsystems/win32/win32k/include/tags.h
reactos/subsystems/win32/win32k/include/text.h
reactos/subsystems/win32/win32k/include/timer.h
reactos/subsystems/win32/win32k/include/useratom.h
reactos/subsystems/win32/win32k/include/userfuncs.h
reactos/subsystems/win32/win32k/include/vis.h
reactos/subsystems/win32/win32k/include/win32.h
reactos/subsystems/win32/win32k/include/win32k.h
reactos/subsystems/win32/win32k/include/window.h
reactos/subsystems/win32/win32k/include/winpos.h
reactos/subsystems/win32/win32k/include/winsta.h
reactos/subsystems/win32/win32k/include/xformobj.h
reactos/subsystems/win32/win32k/ntuser/cursoricon.c
reactos/subsystems/win32/win32k/ntuser/menu.c
reactos/subsystems/win32/win32k/ntuser/message.c
reactos/subsystems/win32/win32k/ntuser/ntstubs.c
reactos/subsystems/win32/win32k/ntuser/painting.c
reactos/subsystems/win32/win32k/ntuser/simplecall.c
reactos/subsystems/win32/win32k/ntuser/vis.c
reactos/subsystems/win32/win32k/ntuser/windc.c
reactos/subsystems/win32/win32k/ntuser/window.c
reactos/subsystems/win32/win32k/objects/cliprgn.c
reactos/subsystems/win32/win32k/objects/device.c
reactos/subsystems/win32/win32k/objects/freetype.c
reactos/subsystems/win32/win32k/objects/gdibatch.c
reactos/subsystems/win32/win32k/objects/region.c
reactos/tools/buildno/pch.h
reactos/tools/cabman/cabinet.h
reactos/tools/cabman/cabman.h
reactos/tools/cabman/dfp.h
reactos/tools/cabman/mszip.h
reactos/tools/cabman/raw.h
reactos/tools/geninc/geninc.rbuild
reactos/tools/hpp/hpp.c
reactos/tools/log2lines/cache.c
reactos/tools/log2lines/cache.h
reactos/tools/log2lines/compat.h
reactos/tools/log2lines/config.h
reactos/tools/log2lines/help.c
reactos/tools/log2lines/help.h
reactos/tools/log2lines/image.c
reactos/tools/log2lines/image.h
reactos/tools/log2lines/list.c
reactos/tools/log2lines/list.h
reactos/tools/log2lines/log2lines.c
reactos/tools/log2lines/log2lines.h
reactos/tools/log2lines/log2lines.mak
reactos/tools/log2lines/options.c
reactos/tools/log2lines/options.h
reactos/tools/log2lines/revision.c
reactos/tools/log2lines/revision.h
reactos/tools/log2lines/stat.c
reactos/tools/log2lines/stat.h
reactos/tools/log2lines/util.c
reactos/tools/log2lines/util.h
reactos/tools/log2lines/version.h
reactos/tools/mkhive/binhive.h
reactos/tools/mkhive/mkhive.h
reactos/tools/mkhive/reginf.h
reactos/tools/mkhive/registry.h
reactos/tools/rsym/dwarf2.h
reactos/tools/rsym/rsym.h
reactos/tools/rsym/rsym64.h
reactos/tools/ssprintf.h
reactos/tools/tools.rbuild
reactos/tools/widl/client.c
reactos/tools/widl/expr.c
reactos/tools/widl/header.c
reactos/tools/widl/header.h
reactos/tools/widl/parser.h
reactos/tools/widl/parser.l
reactos/tools/widl/parser.tab.c
reactos/tools/widl/parser.tab.h
reactos/tools/widl/parser.y
reactos/tools/widl/parser.yy.c
reactos/tools/widl/proxy.c
reactos/tools/widl/typegen.c
reactos/tools/widl/typegen.h
reactos/tools/widl/widl.c
reactos/tools/widl/widltypes.h
reactos/tools/winebuild/ros_diff.patch
reactos/tools/winebuild/spec32.c
reactos/tools/xml.h

index 17f8a54..afe3fd4 100644 (file)
@@ -169,11 +169,7 @@ else
 endif
 
 ifeq ($(ROS_AUTOMAKE),)
-  ifeq ($(ARCH),i386)
-    ROS_AUTOMAKE=makefile.auto
-  else
-    ROS_AUTOMAKE=makefile-$(ARCH).auto
-  endif
+  ROS_AUTOMAKE=makefile-$(ARCH).auto
 endif
 
 all: $(ROS_AUTOMAKE)
index c26a318..9258f28 100644 (file)
@@ -88,6 +88,7 @@
 
        <group compilerset="gcc">
                <compilerflag>-Wall</compilerflag>
+               <compilerflag>-Wno-char-subscripts</compilerflag>
                <compilerflag compiler="cxx">-Wno-non-virtual-dtor</compilerflag>
        </group>
 
                </if>
 
                <compilerflag>-fno-strict-aliasing</compilerflag>
-               <compilerflag>-Wno-strict-aliasing</compilerflag>
                <compilerflag>-Wpointer-arith</compilerflag>
                <compilerflag>-Wno-multichar</compilerflag>
-
+               <compilerflag>-Wno-error=uninitialized</compilerflag>
                <!-- compilerflag>-H</compilerflag>    enable this for header traces -->
        </group>
 
index 59f4284..c2a720a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE project SYSTEM "tools/rbuild/project.dtd">
-<project name="ReactOS" makefile="makefile.auto" xmlns:xi="http://www.w3.org/2001/XInclude">
+<project name="ReactOS" makefile="makefile-i386.auto" xmlns:xi="http://www.w3.org/2001/XInclude">
        <xi:include href="config.rbuild">
                <xi:fallback>
                        <xi:include href="config.template.rbuild" />
@@ -24,6 +24,7 @@
                        <compilerflag>-ftracer</compilerflag>
                        <compilerflag>-momit-leaf-frame-pointer</compilerflag>
                </if>
+               <compilerflag>-fms-extensions</compilerflag>
                <compilerflag>-mpreferred-stack-boundary=2</compilerflag>
                <compilerflag compiler="midl">-m32 --win32</compilerflag>
                <compilerflag compiler="cc,cxx">-gstabs+</compilerflag>
index f4adbe4..d3c2020 100644 (file)
@@ -22,6 +22,9 @@
        <directory name="dxdiag">
                <xi:include href="dxdiag/dxdiag.rbuild" />
        </directory>
+       <directory name="extrac32">
+               <xi:include href="extrac32/extrac32.rbuild" />
+       </directory>
        <directory name="fontview">
                <xi:include href="fontview/fontview.rbuild" />
        </directory>
index 7177835..1f195b9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _CACLS_RESOURCE_H
-#define _CACLS_RESOURCE_H
+#pragma once
 
 #define IDS_HELP                        101
 #define IDS_ABBR_CI                     102
@@ -40,5 +39,3 @@
 #define IDS_READ_CONTROL                137
 #define IDS_DELETE                      138
 #define IDS_STANDARD_RIGHTS_ALL         139
-
-#endif /* _CACLS_RESOURCE_H */
index 72c8edf..1e645e7 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CALC_H__
-#define __CALC_H__
+#pragma once
 
 #include <windows.h>
 #include <tchar.h>
@@ -236,5 +235,3 @@ INT_PTR CALLBACK AboutDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
 void ConvExecute(HWND hWnd);
 void ConvAdjust(HWND hWnd, int n_cat);
 void ConvInit(HWND hWnd);
-
-#endif
index ba28b00..f6513aa 100644 (file)
@@ -324,7 +324,7 @@ END
 
 IDD_DIALOG_STAT DIALOGEX DISCARDABLE  0, 0, 163, 85
 STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Statistik Box"
+CAPTION "Statistikbox"
 FONT 8, "MS Shell Dlg"
 BEGIN
     LISTBOX         IDC_LIST_STAT,4,4,156,40,LBS_NOINTEGRALHEIGHT | 
@@ -465,11 +465,11 @@ END
 // FLÄCHENTYPEN
 STRINGTABLE DISCARDABLE
 BEGIN
-    IDS_AREA_ACRES                  "Acres"
-    IDS_AREA_ACRES_BRAZIL           "Acres (Brasilien)"
-    IDS_AREA_ACRES_FRANCE           "Acres (Frankreich)"
-    IDS_AREA_ACRES_SCOTS            "Acres (Schottland)"
-    IDS_AREA_ACRES_US               "Acres (USA)"
+    IDS_AREA_ACRES                  "Acre"
+    IDS_AREA_ACRES_BRAZIL           "Acre (Brasilien)"
+    IDS_AREA_ACRES_FRANCE           "Acre (Frankreich)"
+    IDS_AREA_ACRES_SCOTS            "Acre (Schottland)"
+    IDS_AREA_ACRES_US               "Acre (USA)"
     IDS_AREA_ARES                   "Ar"
     IDS_AREA_CHOU                   "Chou"
     IDS_AREA_DANBO                  "Danbo"
@@ -482,21 +482,21 @@ BEGIN
     IDS_AREA_PYEONGBANGJA           "Pyeongbangja"
     IDS_AREA_RAI                    "Rai"
     IDS_AREA_SE                     "Se"
-    IDS_AREA_SQUARE_CHR             "Qaudratchr"
-    IDS_AREA_SQUARE_FATHOMS         "Qaudratfathom"
-    IDS_AREA_SQUARE_FATHOMS_HUNGARY "Qaudratfathom (Ungarn)"
-    IDS_AREA_SQUARE_FEET            "Qaudratfuß"
-    IDS_AREA_SQUARE_KILOMETERS      "Qaudratkilometer"
-    IDS_AREA_SQUARE_LAR             "Qaudratlar"
-    IDS_AREA_SQUARE_METER           "Qaudratmeter"
-    IDS_AREA_SQUARE_MILES           "Qaudratmeilen"
-    IDS_AREA_SQUARE_MILLIMETERS     "Qaudratmillimeter"
-    IDS_AREA_SQUARE_SHAKU           "Qaudratshaku"
-    IDS_AREA_SQUARE_TSUEN           "Qaudrattsuen"
-    IDS_AREA_SQUARE_VA              "Qaudratva"
-    IDS_AREA_SQUARE_YARD            "Qaudratyard"
+    IDS_AREA_SQUARE_CHR             "Quadratchr"
+    IDS_AREA_SQUARE_FATHOMS         "Quadratfathom"
+    IDS_AREA_SQUARE_FATHOMS_HUNGARY "Quadratfathom (Ungarn)"
+    IDS_AREA_SQUARE_FEET            "Quadratfuß"
+    IDS_AREA_SQUARE_KILOMETERS      "Quadratkilometer"
+    IDS_AREA_SQUARE_LAR             "Quadratlar"
+    IDS_AREA_SQUARE_METER           "Quadratmeter"
+    IDS_AREA_SQUARE_MILES           "Quadratmeilen"
+    IDS_AREA_SQUARE_MILLIMETERS     "Quadratmillimeter"
+    IDS_AREA_SQUARE_SHAKU           "Quadratshaku"
+    IDS_AREA_SQUARE_TSUEN           "Quadrattsuen"
+    IDS_AREA_SQUARE_VA              "Quadratva"
+    IDS_AREA_SQUARE_YARD            "Quadratyard"
     IDS_AREA_SQUARE_CENTIMETERS     "Quadratzentimeter"
-    IDS_AREA_SQUARE_INCHES          "Qaudratzoll"
+    IDS_AREA_SQUARE_INCHES          "Quadratzoll"
     IDS_AREA_TAN                    "Tan"
     IDS_AREA_TSUBO                  "Tsubo"
 END
@@ -517,7 +517,7 @@ BEGIN
     IDS_CURRENCY_DEUTSCHE_MARK      "Deutsche Mark"
     IDS_CURRENCY_EURO               "Euro"
     IDS_CURRENCY_FINNISH_MARKKA     "Finnische Mark"
-    IDS_CURRENCY_FRENCH_FRANC       "Französchishe Franc"
+    IDS_CURRENCY_FRENCH_FRANC       "Französchische Franc"
     IDS_CURRENCY_GREEK_DRACHMA      "Griechische Drachme"
     IDS_CURRENCY_IRISH_POUND        "Irische Pfund"
     IDS_CURRENCY_ITALIAN_LIRA       "Italienische Lire"
index 780ea6e..5377210 100644 (file)
@@ -7,5 +7,6 @@
 #include "doskey.h"
 
 #include "lang/bg-BG.rc"
+#include "lang/de-DE.rc"
 #include "lang/en-US.rc"
 #include "lang/uk-UA.rc"
diff --git a/reactos/base/applications/cmdutils/doskey/lang/de-DE.rc b/reactos/base/applications/cmdutils/doskey/lang/de-DE.rc
new file mode 100644 (file)
index 0000000..fc73d5d
--- /dev/null
@@ -0,0 +1,28 @@
+LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+BEGIN
+
+IDS_HELP, "Verwaltet Einstellungen, Verlauf und Makros der Kommandozeile.\n\
+\n\
+DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\
+       [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\
+\n\
+  /INSERT             Aktiviert den Einfügemodus.\n\
+  /OVERSTRIKE         Deaktiviert den Einfügemodus.\n\
+  /EXENAME=exename    Legt den Namen der Anwendung, auf die die Einstel-\n\
+                      lungen angewendet werden sollen, fest. Der Standard-\n\
+                      wert ist cmd.exe.\n\
+  /HISTORY            Zeigt den Befehlsverlauf an.\n\
+  /LISTSIZE=size      Legt die Anzahl der Befehle per Verlaufspuffer fest.\n\
+  /REINSTALL          Leert den Befehlsverlauf.\n\
+  /MACROS             Zeigt Makrodefinitionen an.\n\
+  /MACROS:exename     Zeigt Makrodefinitionen für eine Anwendung an.\n\
+  /MACROS:ALL         Zeigt Makrodefinitionen für alle Anwendungen an.\n\
+  /MACROFILE=file     Lädt Makrodefinitionen aus einer Datei.\n\
+  macroname           Legt den Namen eines zu erstellenden Makros fest.\n\
+  text                Legt den ersetzenden Text des Makros fest.\n"
+
+IDS_INVALID_MACRO_DEF, "Ungültige Makrodefinition: %s\n"
+
+END
index 1b70286..7adc237 100644 (file)
@@ -18,7 +18,7 @@ DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\
   /MACROS             Displays macro definitions.\n\
   /MACROS:exename     Displays macro definitions for a specific program.\n\
   /MACROS:ALL         Displays macro definitions for all programs.\n\
-  /MACROFILE=filename Loads macro definitions from a file.\n\
+  /MACROFILE=file     Loads macro definitions from a file.\n\
   macroname           Specifies the name of a macro to create.\n\
   text                Specifies the replacement text for the macro.\n"
 
index ed747aa..76a3f40 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
 <module name="hostname" type="win32cui" installbase="system32" installname="hostname.exe">
        <file>hostname.c</file>
        <file>hostname.rc</file>
index eb430d8..08fc79b 100644 (file)
@@ -1,20 +1,5 @@
-#ifndef RESOURCE_H__ /* resource.h */
-#define RESOURCE_H__
+#pragma once
 
 #define IDS_USAGE           100
 #define IDS_CONTINUE        101
 #define IDS_FILE_ACCESS     102
-
-
-
-
-
-
-
-
-
-
-
-
-
-#endif /* EOF of resource.h */
diff --git a/reactos/base/applications/cmdutils/reg/It.rc b/reactos/base/applications/cmdutils/reg/It.rc
new file mode 100644 (file)
index 0000000..09d38fd
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * REG.EXE - Wine-compatible reg program.
+ * Italian language support
+ *
+ * Copyright 2010 Luca Bennati
+ *
+ * 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 "reg.h"
+
+/*UTF-8*/
+#pragma code_page(65001)
+
+LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+    STRING_USAGE, "La sintassi di questo comando è:\n\nREG [ ADD | DELETE | QUERY ]\nREG comando /?\n"
+    STRING_ADD_USAGE, "REG ADD nome_della_chiave [/v nome_del_valore | /ve] [/t tipo] [/s separatore] [/d dati] [/f]\n"
+    STRING_DELETE_USAGE, "REG DELETE nome_della_chiave [/v nome_del_valore | /ve | /va] [/f]\n"
+    STRING_QUERY_USAGE, "REG QUERY nome_della_chiave [/v nome_del_valore | /ve] [/s]\n"
+    STRING_SUCCESS, "Operazione completata con successo\n"
+    STRING_INVALID_KEY, "Errore: nome della chiave non valido\n"
+    STRING_INVALID_CMDLINE, "Errore: parametri della linea di comando non validi\n"
+    STRING_NO_REMOTE, "Errore: Impossibile aggiungere chiavi alla macchina remota\n"
+    STRING_CANNOT_FIND, "Errore: Il sistema non è riuscito a trovare la chiave di registro o il valore specificati\n"
+}
diff --git a/reactos/base/applications/cmdutils/reg/Uk.rc b/reactos/base/applications/cmdutils/reg/Uk.rc
new file mode 100644 (file)
index 0000000..70c86f7
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * REG.EXE - Wine-compatible reg program.
+ *
+ * Copyright 2008 Andrew Riedi
+ *
+ * Ukrainian language support
+ *
+ * Copyright 2010 Igor Paliychuk
+ *
+ * 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 "reg.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+    STRING_USAGE, "Синтаксис цієї команди наступний:\n\nREG [ ADD | DELETE | QUERY ]\nREG command /?\n"
+    STRING_ADD_USAGE, "REG ADD key_name [/v value_name | /ve] [/t type] [/s separator] [/d data] [/f]\n"
+    STRING_DELETE_USAGE, "REG DELETE key_name [/v value_name | /ve | /va] [/f]\n"
+    STRING_QUERY_USAGE, "REG QUERY key_name [/v value_name | /ve] [/s]\n"
+    STRING_SUCCESS, "Операція успішно завершена\n"
+    STRING_INVALID_KEY, "Помилка: неправильне ім'я ключа\n"
+    STRING_INVALID_CMDLINE, "Помилка: неправильні параметри командного рядка\n"
+    STRING_NO_REMOTE, "Помилка: неможливо додати ключі на віддаленій машині\n"
+    STRING_CANNOT_FIND, "Помилка: не вдалось знайти вказаний ключ реєстру чи значення\n"
+}
index 07dbdbf..f65a3c8 100644 (file)
@@ -124,6 +124,21 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
             lstrcpyW((LPWSTR)out_data,data);
             break;
         }
+        case REG_DWORD:
+        {
+            LPWSTR rest;
+            DWORD val;
+            val = strtolW(data, &rest, 0);
+            if (rest == data) {
+                static const WCHAR nonnumber[] = {'E','r','r','o','r',':',' ','/','d',' ','r','e','q','u','i','r','e','s',' ','n','u','m','b','e','r','.','\n',0};
+                reg_printfW(nonnumber);
+                break;
+            }
+            *reg_count = sizeof(DWORD);
+            out_data = HeapAlloc(GetProcessHeap(),0,*reg_count);
+            ((LPDWORD)out_data)[0] = val;
+            break;
+        }
         default:
         {
             static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0};
index 1ab7f7f..c145fe9 100644 (file)
@@ -1,13 +1,17 @@
 #include "Da.rc"
-#include "De.rc"
 #include "En.rc"
+#include "Ko.rc"
+#include "Nl.rc"
+#include "Pl.rc"
+
+/* UTF-8 */
+#include "De.rc"
 #include "Fr.rc"
+#include "It.rc"
 #include "Ja.rc"
-//#include "Ko.rc"
 #include "Lt.rc"
-#include "Nl.rc"
 #include "No.rc"
-//#include "Pl.rc"
 #include "Pt.rc"
 #include "Ru.rc"
 #include "Si.rc"
+#include "Uk.rc"
index 3d15e78..cd6e1b9 100644 (file)
@@ -80,4 +80,3 @@ Mit:\n\
 \t\tQuelldateien kopiert, die neuer sind als die Zieldatei\n\n"
 
 }
-#pragma code_page(default)
index b4e387e..047b4b3 100644 (file)
@@ -81,4 +81,3 @@ où :\n\
 \t\tque le fichier source\n\n"
 
 }
-#pragma code_page(default)
diff --git a/reactos/base/applications/cmdutils/xcopy/It.rc b/reactos/base/applications/cmdutils/xcopy/It.rc
new file mode 100644 (file)
index 0000000..258cb3f
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * XCOPY - Wine-compatible xcopy program
+ * Italian language support
+ *
+ * Copyright (C) 2010 Luca Bennati
+ *
+ * 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 "xcopy.h"
+
+/*UTF-8*/
+#pragma code_page(65001)
+
+LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+    STRING_INVPARMS, "Numero non valido di parametri - Digita xcopy /? per l'aiuto\n"
+    STRING_INVPARM,  "Parametro '%s' non valido -  Digita xcopy /? per l'aiuto\n"
+    STRING_PAUSE,    "Premi Invio per iniziare a copiare\n"
+    STRING_SIMCOPY,  "%d file(s) sarebbero copiati\n"
+    STRING_COPY,     "%d file(s) copiati\n"
+    STRING_QISDIR,   "'%s' è il nome di un file o una cartella\n" \
+                     "sull'obiettivo?\n" \
+                     "(F - File, C - Cartella)\n"
+    STRING_SRCPROMPT,"%s? (Sì|No)\n"
+    STRING_OVERWRITE,"Sovrascrivere %s? (Sì|No|Tutti)\n"
+    STRING_COPYFAIL, "La copia di '%s' in '%s' è fallita con r/c %d\n"
+    STRING_OPENFAIL, "Impossibile aprire '%s'\n"
+    STRING_READFAIL, "Errore durante la lettura di '%s'\n"
+    STRING_YES_CHAR, "S"
+    STRING_NO_CHAR,  "N"
+    STRING_ALL_CHAR, "T"
+    STRING_FILE_CHAR,"F"
+    STRING_DIR_CHAR, "C"
+
+    STRING_HELP,
+"XCOPY - Copia file(s) e alberi di cartelle sorgenti in una destinazione\n\
+\n\
+Sintassi:\n\
+XCOPY sorgente [destinazione] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
+\t     [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\
+\n\
+Dove:\n\
+\n\
+[/I]  Assumi una cartella se la destinazione non esiste e sono copiati 2 o\n\
+\tpiù files\n\
+[/S]  Copia le cartelle e le sottocartelle\n\
+[/E]  Copia le cartelle e le sottocartelle, includendo quelle vuote\n\
+[/Q]  Non mostrare i nomi durante la copia, modalità silenziosa.\n\
+[/F]  Mostra i nomi completi della sorgente e della destinazione durante la copia\n\
+[/L]  Simula l'operazione, mostrando i nome che sarebbero copiati\n\
+[/W]  Prompts before beginning the copy operation\n\
+[/T]  Crea la struttura di cartelle vuote ma non copia i files\n\
+[/Y]  Disabilita le conferme quando sono sovrascritti files\n\
+[/-Y] Abilita le conferme quando sono sovrascritti files\n\
+[/P]  Chiede conferma per ogni file sorgente prima di copiare\n\
+[/N]  Copia usando gli short names\n\
+[/U]  Copia solo files che sono già presenti nella destinazione\n\
+[/R]  Sovrascrivi ogni file che abbia l'attributo Sola Lettura\n\
+[/H]  Includi files nascosti e di sistema nella copia\n\
+[/C]  Continua anche se accade un errore durante la copia\n\
+[/A]  Copia solo files che abbiano l'attributo Archivio\n\
+[/M]  Copia solo files che abbiano l'attributo Archivio, rimuovendo\n\
+\tl'attributo\n\
+[/D | /D:m-g-a] Copia i nuovi files o quelli modificati dopo la data fornita.\n\
+\t\tSe nessuna data è stata fornita, copia solo se la destinazione è più vecchia\n\
+\t\tdella sorgente\n\n"
+
+}
index 1c4fe12..38487af 100644 (file)
@@ -81,4 +81,3 @@ XCOPY 送り元 [送り先] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
 \t\tコピー先がコピー元より古いファイルだけコピーします。\n\n"
 
 }
-#pragma code_page(default)
index f1254b6..9d431de 100644 (file)
@@ -81,4 +81,3 @@ Kur:\n\
 \t\tsenesnis už šaltinio failą\n\n"
 
 }
-#pragma code_page(default)
index 868475e..4f5dee5 100644 (file)
@@ -79,4 +79,3 @@ Parameters:\n\
 \t\tdatum. Als geen detum wordt gegeven, copiëer alleen als bron nieuwer is.\n\n"
 
 }
-#pragma code_page(default)
index 4339e80..154c999 100644 (file)
@@ -84,4 +84,3 @@ XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
                 после указанной даты. Если дата не указана, копирует только\n\
                 те файлы, которые новее в исходной папке.\n"
 }
-#pragma code_page(default)
diff --git a/reactos/base/applications/cmdutils/xcopy/Uk.rc b/reactos/base/applications/cmdutils/xcopy/Uk.rc
new file mode 100644 (file)
index 0000000..6d59e1b
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * XCOPY - Wine-compatible xcopy program
+ * Ukrainian language support
+ *
+ * Copyright (C) 2007 J. Edmeades
+ * Copyright (C) 2010 I. Paliychuk
+ *
+ * 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 "xcopy.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+    STRING_INVPARMS, "Невірна кількість параметрів - Введіть xcopy /? для довідки\n"
+    STRING_INVPARM,  "Невірний параметр '%s' -  Введіть xcopy /? для довідки\n"
+    STRING_PAUSE,    "Натисніть <enter> щоб почати копіювання\n"
+    STRING_SIMCOPY,  "%d файл(ів) буде скопійовано\n"
+    STRING_COPY,     "%d файл(ів) скопійовано\n"
+    STRING_QISDIR,   "'%s' є файлом чи директорією\n" \
+                     "on the target?\n" \
+                     "(F - Файл, D - Директорія)\n"
+    STRING_SRCPROMPT,"%s? (Yes|No)\n"
+    STRING_OVERWRITE,"Переписати %s? (Yes|No|All)\n"
+    STRING_COPYFAIL, "Під час копіювання '%s' в '%s' сталась помилка r/c %d\n"
+    STRING_OPENFAIL, "Не вдалось відкрити '%s'\n"
+    STRING_READFAIL, "Помилка читання '%s'\n"
+    STRING_YES_CHAR, "Y"
+    STRING_NO_CHAR,  "N"
+    STRING_ALL_CHAR, "A"
+    STRING_FILE_CHAR,"F"
+    STRING_DIR_CHAR, "D"
+
+    STRING_HELP,
+"XCOPY - Копіює файли та дерева директорій за призначенням\n\
+\n\
+Syntax:\n\
+XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
+\t     [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\
+\n\
+Where:\n\
+\n\
+[/I]  Assume directory if destination does not exist and copying 2 or\n\
+\tmore files\n\
+[/S]  Копіює директорії та піддиректорії\n\
+[/E]  Копіює директорії та піддиректорії, включно з порожніми\n\
+[/Q]  Do not list names during copy, ie quiet.\n\
+[/F]  Під час копіювання відображає повні імена початкових і кінцевих файлів\n\
+[/L]  Simulate operation, showing names which would be copied\n\
+[/W]  Питає підтвердження перед початком копіювання\n\
+[/T]  Створює структуру каталогів але не копіює файли\n\
+[/Y]  Suppress prompting when overwriting files\n\
+[/-Y] Питає підтвердження на перезапис файлів\n\
+[/P]  Prompts on each source file before copying\n\
+[/N]  Копіює, використовуючи короткі імена\n\
+[/U]  Copy only files which already exist in destination\n\
+[/R]  Перезаписує файли, доступні лише для читання\n\
+[/H]  Include hidden and system files in the copy\n\
+[/C]  Продовжує роботу, навіть якщо при копіюванні виникла помилка\n\
+[/A]  Копіює лише файли з властивістю АРХІВНИЙ\n\
+[/M]  Копіює лише файли з властивістю АРХІВНИЙ, видаляє\n\
+\властивість АРХІВНИЙ\n\
+[/D | /D:m-d-y] Копіює лише нові файли або ті, які були змінені після вказаної дати.\n\
+\t\tЯкщо дата не вказана, only copy if destination is older\n\
+\t\tthan source\n\n"
+
+}
index 13cd86f..b82341c 100644 (file)
@@ -27,15 +27,19 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 #include <reactos/version.rc>
 
 #include "Da.rc"
-#include "De.rc"
 #include "En.rc"
-#include "Fr.rc"
-#include "Ja.rc"
 #include "Ko.rc"
-#include "Lt.rc"
-#include "Nl.rc"
 #include "No.rc"
 #include "Pl.rc"
 #include "Pt.rc"
+
+/* UTF-8 */
+#include "De.rc"
+#include "Fr.rc"
+#include "It.rc"
+#include "Ja.rc"
+#include "Lt.rc"
+#include "Nl.rc"
 #include "Ru.rc"
 #include "Si.rc"
+#include "Uk.rc"
index 2e3e1a9..437fa46 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
 <module name="xcopy" type="win32cui" installbase="system32" installname="xcopy.exe" unicode="true">
        <include base="xcopy">.</include>
        <library>wine</library>
index 087a14c..0b29796 100644 (file)
@@ -15,11 +15,11 @@ STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU
 CAPTION "Einstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Download Ordner:", -1, 6, 10, 140, 8
+    LTEXT "Downloadordner:", -1, 6, 10, 140, 8
     EDITTEXT IDC_DOWNLOAD_FOLDER_EDIT, 6, 20, 205, 14, WS_VISIBLE | WS_TABSTOP
     PUSHBUTTON "W&ähle...", IDC_CHOOSE_BUTTON, 216, 20, 45, 14
     AUTOCHECKBOX "&Installationsdateien nach dem Setup löschen", IDC_DELINST_FILES_CHECKBOX, 8, 40, 210, 10, WS_GROUP
-    LTEXT "Update Server:", -1, 6, 55, 140, 8
+    LTEXT "Updateserver:", -1, 6, 55, 140, 8
     EDITTEXT IDC_UPDATE_SERVER_EDIT, 6, 65, 255, 14, WS_VISIBLE | WS_TABSTOP
     DEFPUSHBUTTON "&OK", IDOK, 147, 90, 54, 15
     PUSHBUTTON "&Abbrechen", IDCANCEL, 207, 90, 54, 15
@@ -31,7 +31,7 @@ BEGIN
     IDS_WELCOME_TITLE        "Willkommen im ReactOS Downloader"
     IDS_WELCOME              "Bitte wählen Sie links eine Kategorie. Dies ist Version 1.1."
     IDS_NO_APP_TITLE         "Keine Anwendung ausgewählt"
-    IDS_NO_APP               "Bitte wählen Sie eine Anwendung, bevor Sie die Download-Schaltfläche betätigen. Wenn Sie Hilfe benötigen, drücken Sie die Hilfe-Schaltfläche in der oberen rechten Ecke."
+    IDS_NO_APP               "Bitte wählen Sie eine Anwendung aus, bevor Sie die Download-Schaltfläche betätigen. Wenn Sie Hilfe benötigen, drücken Sie die Hilfe-Schaltfläche in der oberen rechten Ecke."
     IDS_UPDATE_TITLE         "Update"
     IDS_UPDATE               "Diese Funktion wurde noch nicht implementiert."
     IDS_HELP_TITLE           "Hilfe"
@@ -41,20 +41,20 @@ BEGIN
     IDS_CHOOSE_SUB           "Bitte wählen Sie eine Unterkategorie."
     IDS_CHOOSE_CATEGORY      "Bitte wählen Sie eine Kategorie."
     IDS_CHOOSE_BOTH          "Bitte wählen Sie eine Unterkategorie oder eine Anwendung."
-    IDS_XMLERROR_1           "XML Datei nicht gefunden!"
-    IDS_XMLERROR_2           "XML Datei kann nicht verarbeitet werden!"
+    IDS_XMLERROR_1           "XML-Datei nicht gefunden!"
+    IDS_XMLERROR_2           "XML-Datei kann nicht verarbeitet werden!"
     IDS_DOWNLOAD_ERROR       "Die Datei konnte nicht heruntergeladen werden.\nBitte prüfen sie, ob eine Verbindung zum Internet besteht."
     IDS_VERSION              "Version: "
     IDS_LICENCE              "Lizenz: "
     IDS_MAINTAINER           "Maintainer: "
     IDS_APPS_TITLE           "Anwendungen"
     IDS_CATS_TITLE           "Kategorien"
-    IDS_CHOOSE_FOLDER        "Bitte wählen Sie den Ordner..."
+    IDS_CHOOSE_FOLDER        "Bitte wählen Sie den Ordner aus..."
     IDS_NOTCREATE_REGKEY     "Registryschlüssel könnte nicht erstellt werden."
     IDS_DOWNLOAD_FOLDER      "Downloader"
     IDS_UNABLECREATE_FOLDER  "Es konnte kein Ordner mit diesem Namen erstellt werden!"
     IDS_UPDATE_URL           "http://svn.reactos.org"
-    IDS_INSTALL_DEP          "%s wird benötigt um %s ausführen zu können. Soll %s jetzt installiert werden?"
+    IDS_INSTALL_DEP          "%s wird benötigt, um %s ausführen zu können. Soll %s jetzt installiert werden?"
     TTT_HELPBUTTON           "Hilfe über den Downloader"
     TTT_UPDATEBUTTON         "Noch nicht vorhanden"
     TTT_PROFBUTTON           "Konfiguriert den Downloader"
index 3985fae..2c9bc70 100644 (file)
@@ -126,7 +126,6 @@ InitializeTabCtrl(HWND hwndDlg, PDXDIAG_CONTEXT pContext)
     pContext->hDialogs[4] = CreateDialogParamW(hInst, MAKEINTRESOURCEW(IDD_HELP_DIALOG), hTabCtrlWnd, HelpPageWndProc, (LPARAM)pContext);
 
     /* insert tab ctrl items */
-
     InsertTabCtrlItem(hTabCtrlWnd, 0, MAKEINTRESOURCEW(IDS_SYSTEM_DIALOG));
     InitializeDisplayAdapters(pContext);
     InitializeDirectSoundPage(pContext);
@@ -188,8 +187,19 @@ DxDiagWndProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
 
             if (LOWORD(wParam) == IDC_BUTTON_NEXT)
             {
-               //TODO
-               /* handle next button */
+               INT CurSel;
+
+               /* retrieve current page */
+               CurSel = TabCtrl_GetCurSel(hTabCtrlWnd);
+               CurSel++;
+
+               /* enable/disable next button */
+               EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_NEXT), 
+                            (CurSel != TabCtrl_GetItemCount(hTabCtrlWnd) - 1));
+               
+               /* switch to next page */
+               SendMessageW(hTabCtrlWnd, TCM_SETCURSEL, CurSel, 0L);
+                
                return TRUE;
             }
 
@@ -210,6 +220,12 @@ DxDiagWndProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
             pnmh = (LPNMHDR)lParam;
             if ((pnmh->hwndFrom == hTabCtrlWnd) && (pnmh->idFrom == IDC_TAB_CONTROL) && (pnmh->code == TCN_SELCHANGE))
             {
+               INT CurSel = TabCtrl_GetCurSel(hTabCtrlWnd);
+
+               /* enable/disable next button */
+               EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_NEXT), 
+                            (CurSel != TabCtrl_GetItemCount(hTabCtrlWnd) - 1));
+
                 TabCtrl_OnSelChange(pContext);
             }
             break;
index 8a572b6..e79530d 100644 (file)
@@ -148,9 +148,9 @@ IDD_INPUT_DIALOG DIALOGEX DISCARDABLE  0, 0, 462, 220
 STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
 FONT 8, "MS Shell Dlg"
 BEGIN
-    GROUPBOX "DirectInput Geräte", -1, 10, 10, 452, 80
+    GROUPBOX "DirectInput-Geräte", -1, 10, 10, 452, 80
     CONTROL "", IDC_LIST_DEVICE, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 22, 432, 60
-    GROUPBOX "Eingabebezogene Geräte", -1, 10, 100, 452, 60
+    GROUPBOX "Eingabegeräte", -1, 10, 100, 452, 60
     CONTROL "", IDC_TREE_PORT, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 112, 432, 40, 0x00000200
     GROUPBOX "Hinweis", -1, 10, 170, 452, 50
     EDITTEXT  IDC_RICH_INFO, 20, 182, 432, 30, WS_DISABLED | WS_TABSTOP
@@ -172,7 +172,7 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-       IDS_MAIN_DIALOG "ReactX Diagnoseprogramm"
+       IDS_MAIN_DIALOG "ReactX-Diagnoseprogramm"
        IDS_SYSTEM_DIALOG "System"
        IDS_DISPLAY_DIALOG "Anzeige"
        IDS_SOUND_DIALOG "Sound"
@@ -193,7 +193,7 @@ BEGIN
        IDS_DEVICE_CONTROLLER "Controllererkennung"
        IDS_DEVICE_MANUFACTURER "Herstellererkennung"
        IDS_DEVICE_PRODUCT "Produkterkennung"
-       IDS_DEVICE_FORCEFEEDBACK "Force Feedback-Treiber"
+       IDS_DEVICE_FORCEFEEDBACK "Force-Feedback-Treiber"
        IDS_NOT_APPLICABLE "Nicht zutreffend"
        IDS_OPTION_YES "Ja"
        IDS_DIRECTPLAY_COL_NAME1 "Name"
@@ -204,20 +204,20 @@ BEGIN
        IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 serieller Dienstanbieter"
        IDS_DIRECTPLAY8_IPXSP "DirectPlay8-IPX-Dienstanbieter"
        IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP-Dienstanbieter"
-       IDS_DIRECTPLAY_TCPCONN "TCP/IP Verbindung für DirectPlay"
-       IDS_DIRECTPLAY_IPXCONN "IPX Verbindung für DirectPlay"
+       IDS_DIRECTPLAY_TCPCONN "TCP/IP-Verbindung für DirectPlay"
+       IDS_DIRECTPLAY_IPXCONN "IPX-Verbindung für DirectPlay"
        IDS_DIRECTPLAY_MODEMCONN "Modemverbindung für DirectPlay"
        IDS_DIRECTPLAY_SERIALCONN "Serielle Verbindung für DirectPlay"
        IDS_REG_SUCCESS "OK"
        IDS_REG_FAIL "Fehler"
-       IDS_DDTEST_ERROR "Test failed!"
-       IDS_DDTEST_DESCRIPTION "This will start DirecDraw interface test. Continue?"
-       IDS_DDPRIMARY_DESCRIPTION "This test will use DirectDraw to draw on primary surface. Black and white rectangles should be drawn. Continue?"
-       IDS_DDPRIMARY_RESULT "Did you see black and white rectangles?"
-       IDS_DDOFFSCREEN_DESCRIPTION "This test will use DirectDraw to draw in an offscreen buffer. Moving white rectangle should be drawn. Continue?"
-       IDS_DDOFFSCREEN_RESULT "Did you see white moving reactangle?"
-       IDS_DDFULLSCREEN_DESCRIPTION "This test will use DirectDraw to draw in a fullscreen mode. Moving white rectangle should be drawn. Continue?"
-       IDS_DDFULLSCREEN_RESULT "Did you see white moving reactangle in a fullscreen mode?"
+       IDS_DDTEST_ERROR "Test fehlgeschlagen!"
+       IDS_DDTEST_DESCRIPTION "Dies wird den DirectDraw-Interfacetest starten. Fortfahren?"
+       IDS_DDPRIMARY_DESCRIPTION "Dieser Test wird DirectDraw benutzen, um auf Ihrem primären Bildschirm etwas darzustellen. Schwarze und weiße Rechtecke sollten zu sehen sein. Fortfahren?"
+       IDS_DDPRIMARY_RESULT "Haben Sie schwarze und weiße Rechtecke gesehen?"
+       IDS_DDOFFSCREEN_DESCRIPTION "Dieser Test wird DirectDraw benutzen, um im Offscreen-Buffer zu zeichnen. Ein bewegtes weißes Rechteck sollte zu sehen sein. Fortfahren?"
+       IDS_DDOFFSCREEN_RESULT "Haben Sie das bewegte weiße Rechteck gesehen?"
+       IDS_DDFULLSCREEN_DESCRIPTION "Dieser Test wird DirectDraw benutzen, um im Vollbildmodus zu zeichnen. Ein bewegtes weißes Rechteck sollte zu sehen sein. Fortfahren?"
+       IDS_DDFULLSCREEN_RESULT "Haben Sie das bewegte weiße Rechteck im Vollbildmodus gesehen?"
        IDS_FORMAT_ADAPTER_MEM "%u MB"
        IDS_FORMAT_ADAPTER_MODE "%04u x %04u (%u bit)(%uHz)"
        IDS_OPTION_NO "Nein"
index 03917db..e9118d1 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef RESOURCE_H__
-#define RESOURCE_H__
+#pragma once
 
 /* dialog constants */
 #define IDD_MAIN_DIALOG          100
 
 /* icon resource constants */
 #define IDI_APPICON        20000
-
-
-#endif
index 33c1f9d..311fc03 100644 (file)
@@ -17,7 +17,6 @@ GetRegValue(HKEY hBaseKey, LPWSTR SubKey, LPWSTR ValueName, DWORD Type, LPWSTR R
     DWORD dwType;
     DWORD dwSize;
 
-
     if (RegOpenKeyExW(hBaseKey, SubKey, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
         return FALSE;
 
@@ -25,10 +24,10 @@ GetRegValue(HKEY hBaseKey, LPWSTR SubKey, LPWSTR ValueName, DWORD Type, LPWSTR R
     res = RegQueryValueExW(hKey, ValueName, NULL, &dwType, (LPBYTE)Result, &dwSize);
     RegCloseKey(hKey);
 
-    if (dwType != Type)
+    if (res != ERROR_SUCCESS)
         return FALSE;
 
-    if (res != ERROR_SUCCESS)
+       if (dwType != Type)
         return FALSE;
 
     if (Size == sizeof(DWORD))
diff --git a/reactos/base/applications/extrac32/extrac32.c b/reactos/base/applications/extrac32/extrac32.c
new file mode 100644 (file)
index 0000000..fc1ae1c
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Extract - Wine-compatible program for extract *.cab files.
+ *
+ * Copyright 2007 Etersoft (Lyutin Anatoly)
+ * Copyright 2009 Ilya Shpigor
+ *
+ * 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 <windows.h>
+#include <shellapi.h>
+#include <setupapi.h>
+#include <shlwapi.h>
+
+#include "wine/unicode.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(extrac32);
+
+static BOOL force_mode;
+
+static UINT WINAPI ExtCabCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2)
+{
+    FILE_IN_CABINET_INFO_W *pInfo;
+    FILEPATHS_W *pFilePaths;
+
+    switch(Notification)
+    {
+        case SPFILENOTIFY_FILEINCABINET:
+            pInfo = (FILE_IN_CABINET_INFO_W*)Param1;
+            lstrcpyW(pInfo->FullTargetName, (LPCWSTR)Context);
+            lstrcatW(pInfo->FullTargetName, pInfo->NameInCabinet);
+            return FILEOP_DOIT;
+        case SPFILENOTIFY_FILEEXTRACTED:
+            pFilePaths = (FILEPATHS_W*)Param1;
+            WINE_TRACE("Extracted %s\n", wine_dbgstr_w(pFilePaths->Target));
+            return NO_ERROR;
+    }
+    return NO_ERROR;
+}
+
+static void extract(LPCWSTR cabfile, LPWSTR destdir)
+{
+    if (!SetupIterateCabinetW(cabfile, 0, ExtCabCallback, destdir))
+        WINE_ERR("Could not extract cab file %s\n", wine_dbgstr_w(cabfile));
+}
+
+static void copy_file(LPCWSTR source, LPCWSTR destination)
+{
+    WCHAR destfile[MAX_PATH];
+
+    /* append source filename if destination is a directory */
+    if (PathIsDirectoryW(destination))
+    {
+        PathCombineW(destfile, destination, PathFindFileNameW(source));
+        destination = destfile;
+    }
+
+    if (PathFileExistsW(destination) && !force_mode)
+    {
+        static const WCHAR overwriteMsg[] = {'O','v','e','r','w','r','i','t','e',' ','"','%','s','"','?',0};
+        static const WCHAR titleMsg[] = {'E','x','t','r','a','c','t',0};
+        WCHAR msg[MAX_PATH+100];
+        snprintfW(msg, sizeof(msg)/sizeof(msg[0]), overwriteMsg, destination);
+        if (MessageBoxW(NULL, msg, titleMsg, MB_YESNO | MB_ICONWARNING) != IDYES)
+            return;
+    }
+
+    WINE_TRACE("copying %s to %s\n", wine_dbgstr_w(source), wine_dbgstr_w(destination));
+    CopyFileW(source, destination, FALSE);
+}
+
+int PASCAL wWinMain(HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int show)
+{
+    LPWSTR *argv;
+    int argc;
+    int i;
+    WCHAR check, cmd = 0;
+    WCHAR path[MAX_PATH];
+    WCHAR backslash[] = {'\\',0};
+    LPCWSTR cabfile = NULL;
+
+    path[0] = 0;
+    argv = CommandLineToArgvW(cmdline, &argc);
+
+    if(!argv)
+    {
+        WINE_ERR("Bad command line arguments\n");
+        return 0;
+    }
+
+    /* Parse arguments */
+    for(i = 0; i < argc; i++)
+    {
+        /* Get cabfile */
+        if (argv[i][0] != '/')
+        {
+            if (!cabfile)
+            {
+                cabfile = argv[i];
+                continue;
+            } else
+                break;
+        }
+        /* Get parameters for commands */
+        check = toupperW( argv[i][1] );
+        switch(check)
+        {
+            case 'A':
+                WINE_FIXME("/A not implemented\n");
+                break;
+            case 'Y':
+                force_mode = TRUE;
+                break;
+            case 'L':
+                if ((i + 1) >= argc) return 0;
+                if (!GetFullPathNameW(argv[++i], MAX_PATH, path, NULL))
+                    return 0;
+                break;
+            case 'C':
+                if (cmd) return 0;
+                cmd = check;
+                break;
+            case 'E':
+            case 'D':
+                if (cmd) return 0;
+                cmd = check;
+                break;
+            default:
+                return 0;
+        }
+    }
+
+    if (!cabfile)
+        return 0;
+
+    if (cmd == 'C')
+    {
+        if ((i + 1) != argc) return 0;
+        if (!GetFullPathNameW(argv[i], MAX_PATH, path, NULL))
+            return 0;
+    }
+
+    if (!path[0])
+        GetCurrentDirectoryW(MAX_PATH, path);
+
+    lstrcatW(path, backslash);
+
+    /* Execute the specified command */
+    switch(cmd)
+    {
+        case 'C':
+            /* Copy file */
+            copy_file(cabfile, path);
+            break;
+        case 'E':
+            /* Extract CAB archive */
+            extract(cabfile, path);
+            break;
+        case 0:
+        case 'D':
+            /* Display CAB archive */
+            WINE_FIXME("/D not implemented\n");
+            break;
+    }
+    return 0;
+}
diff --git a/reactos/base/applications/extrac32/extrac32.rbuild b/reactos/base/applications/extrac32/extrac32.rbuild
new file mode 100644 (file)
index 0000000..24532dd
--- /dev/null
@@ -0,0 +1,9 @@
+<module name="extrac32" type="win32gui" installbase="system32" installname="extrac32.exe" unicode="yes">
+       <include base="extrac32">.</include>
+       <library>wine</library>
+       <library>shell32</library>
+       <library>setupapi</library>
+       <library>shlwapi</library>
+       <library>user32</library>
+       <file>extrac32.c</file>
+</module>
index aafdea8..9d36e6c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _DISPLAY_H
-#define _DISPLAY_H
+#pragma once
 
 /* Messages for the display class */
 #define FVM_SETTYPEFACE WM_USER
@@ -14,5 +13,3 @@ extern const WCHAR g_szFontDisplayClassName[];
 
 /* Public function */
 BOOL Display_InitClass(HINSTANCE hInstance);
-
-#endif // _DISPLAY_H
index 2197a7f..28cc675 100644 (file)
@@ -8,7 +8,7 @@ BEGIN
        IDS_ERROR, "Fehler"
        IDS_ERROR_NOMEM, "Es steht nicht genügend Speicher zur Verfügung."
        IDS_ERROR_NOFONT, "Die angegebene Datei %1 ist keine gültige Schriftartendatei."
-       IDS_ERROR_NOCLASS, "Fehler beim initialisieren der Fensterklasse."
+       IDS_ERROR_NOCLASS, "Fehler beim Initialisieren der Fensterklasse."
        IDS_ERROR_BADCMD, "Keine Schriftartendatei angegeben.\nSyntax:\n  fontview.exe <Schriftdatei>"
 END
 
index 5e8f444..9ecc79e 100644 (file)
@@ -57,7 +57,7 @@ BEGIN
     IDS_SOL_NAME    "Solitär"
     IDS_SOL_ABOUT   "Solitär von J Brown\n\nCardLib version 1.0."
     IDS_SOL_QUIT    "Laufendes Spiel beenden?"
-    IDS_SOL_WIN     "Glückwunsch, Sie haben Gewonnen!"
+    IDS_SOL_WIN     "Glückwunsch, Sie haben gewonnen!"
     IDS_SOL_DEAL    "Neu geben?"
 END
 
index 14eaebc..3b1e1bb 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef SOLITAIRE_INCLUDED
-#define SOLITAIRE_INCLUDED
+#pragma once
 
 extern CardWindow SolWnd;
 extern TCHAR szAppName[];
@@ -54,5 +53,3 @@ void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int iNumClicked);
 void CARDLIBPROC PileDblClickProc(CardRegion &stackobj, int iNumClicked);
 
 void CARDLIBPROC PileRemoveProc(CardRegion &stackobj, int iRemoved);
-
-#endif
index b2bc790..5b353b1 100644 (file)
@@ -54,7 +54,7 @@ BEGIN
     IDS_SPI_NAME    "Spider"
     IDS_SPI_ABOUT   "Spider Solitaire von Gregor Schneider\n\nCardLib Version 1.0"
     IDS_SPI_QUIT    "Laufendes Spiel beenden?"
-    IDS_SPI_WIN     "Gratulation, Sie haben gewonnen!"
+    IDS_SPI_WIN     "Glückwunsch, Sie haben gewonnen!"
     IDS_SPI_DEAL    "Neu geben?"
 END
 
index 89b64ae..caff04a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef SOLITAIRE_INCLUDED
-#define SOLITAIRE_INCLUDED
+#pragma once
 
 #define DIFFICULTY_ONE_COLOR     1
 #define DIFFICULTY_TWO_COLORS    2
@@ -38,5 +37,3 @@ void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int iNumClicked);
 void CARDLIBPROC PileDblClickProc(CardRegion &stackobj, int iNumClicked);
 
 void CARDLIBPROC PileRemoveProc(CardRegion &stackobj, int iRemoved);
-
-#endif
index 4c4e59d..69676c4 100644 (file)
@@ -56,7 +56,7 @@ STYLE  DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHEL
 CAPTION "Glückwunsch!"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT           "Bitte geben Sie ihren Namen ein", IDIGNORE,      25,  10, 150,  10
+       LTEXT           "Bitte geben Sie Ihren Namen ein", IDIGNORE,      25,  10, 150,  10
        EDITTEXT                                           IDC_EDITNAME,  25,  20, 110,  12
        DEFPUSHBUTTON   "OK",                              IDOK,          60,  40,  40,  15
 END
index c891a1e..995437d 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE project SYSTEM "tools/rbuild/project.dtd">
+<!DOCTYPE project SYSTEM "../../../tools/rbuild/project.dtd">
 <module name="magnify" type="win32gui" installbase="system32" installname="magnify.exe">
        <include base="magnify">.</include>
        <library>user32</library>
index 460b8ae..ad39a6f 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __PRECOMP_H
-#define __PRECOMP_H
+#pragma once
 
 #include <windows.h>
 #include <commctrl.h>
@@ -34,5 +33,3 @@ LoadAndFormatString(IN HINSTANCE hInstance,
 
 extern HINSTANCE hAppInstance;
 extern HANDLE hAppHeap;
-
-#endif /* __PRECOMP_H */
index 37f42f5..65fbe6e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __RESOURCE_H
-#define __RESOURCE_H
+#pragma once
 
 #define IDS_APPTITLE    101
 #define IDS_CONSOLETITLE    102
@@ -10,5 +9,3 @@
 
 #define ID_FILE_EXIT    1001
 #define ID_HELP_ABOUT   9001
-
-#endif /* __RESOURCE_H */
index 622fdf6..470413c 100644 (file)
@@ -17,8 +17,8 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-       IDS_ALL_TYPES_FILTER "Alle Unterstützten (*.wav, *.cda, *.midi, *.mid, *.avi)\0*.wav;*.cda;*.midi;*.mid;*.avi\0"
-       IDS_TOOLTIP_PLAY "wiedergabe"
+       IDS_ALL_TYPES_FILTER "Alle unterstützten (*.wav, *.cda, *.midi, *.mid, *.avi)\0*.wav;*.cda;*.midi;*.mid;*.avi\0"
+       IDS_TOOLTIP_PLAY "Wiedergabe"
        IDS_TOOLTIP_STOP "Stopp"
        IDS_TOOLTIP_EJECT "Auswerfen"
        IDS_TOOLTIP_BACKWARD "Zurück"
index f4dfddf..7710033 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __RESOURCE_H_
-#define __RESOURCE_H_
+#pragma once
 
 /* Icons */
 #define IDI_MAIN    10
@@ -51,5 +50,3 @@
 #define IDC_SEEKBACK     1504
 #define IDC_SEEKFORW     1505
 #define IDC_FORWARD      1506
-
-#endif /* __RESOURCE_H_ */
index b7dd1ed..96cb09f 100644 (file)
@@ -83,7 +83,7 @@ BEGIN
    PUSHBUTTON    "A&ls Standard", IDC_BTN_SET_DEFAULT_BOOT, 120, 65, 63, 12
    PUSHBUTTON    "Nach &oben", IDC_BTN_MOVE_UP_BOOT_OPTION, 203, 65, 63, 12
    PUSHBUTTON    "Nach &unten", IDC_BTN_MOVE_DOWN_BOOT_OPTION, 286, 65, 63, 12
-   GROUPBOX "Boot Optionen", -1, 10, 80, 250, 90,0,WS_EX_TRANSPARENT
+   GROUPBOX "Bootoptionen", -1, 10, 80, 250, 90,0,WS_EX_TRANSPARENT
    CHECKBOX "/SA&FEBOOT", IDC_CBX_SAFE_BOOT, 15, 90, 55, 10
    CHECKBOX "/&NOGUIBOOT", IDC_CBX_NO_GUI_BOOT, 15, 105, 60, 10
    CHECKBOX "/&BOOTLOG", IDC_CBX_BOOT_LOG, 15, 120, 50, 10
@@ -149,7 +149,7 @@ BEGIN
     IDS_TOOLS_CMD_CMD        "cmd.exe"
 
     IDS_TOOLS_INFO_NAME      "Version"
-    IDS_TOOLS_INFO_DESCR     "Zeigt die installierte ReactOS Version an."
+    IDS_TOOLS_INFO_DESCR     "Zeigt die installierte ReactOS-Version an."
     IDS_TOOLS_INFO_CMD       "winver.exe"
 
     IDS_TOOLS_REGEDIT_NAME   "Registrierungs-Editor"
index a370660..6e5f6fb 100644 (file)
@@ -51,7 +51,7 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-  IDS_LICENSE "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis 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.\r\n\r\nYou 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."
+  IDS_LICENSE "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License, wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis 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.\r\n\r\nYou 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."
 END
 
 STRINGTABLE DISCARDABLE
index 7a978d1..d291a48 100644 (file)
@@ -193,7 +193,7 @@ BEGIN
   IDS_NUM_SERVICES "Anzahl der Dienste: %d"
   IDS_STOP_DEPENDS "When %s stops, these other services will also stop"
   IDS_NO_DEPENDS "<No Dependencies>"
-  IDS_LICENSE "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis 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.\r\n\r\nYou 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."
+  IDS_LICENSE "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License, wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis 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.\r\n\r\nYou 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."
 END
 
 STRINGTABLE DISCARDABLE
index 6785c46..6b596f6 100644 (file)
@@ -18,8 +18,7 @@
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef __BSOPS_MSTSC_H
-#define __BSOPS_MSTSC_H
+#pragma once
 
 int bs_get_pixel(int x, int y);
 void bs_set_pixel(int x, int y, int pixel, int rop, int use_clip);
@@ -50,5 +49,3 @@ void bs_patblt(int opcode, int x, int y, int cx, int cy,
                int brush_style, char * brush_pattern,
                int brush_x_org, int brush_y_org,
                int bgcolour, int fgcolour);
-
-#endif /* __BSOPS_MSTSC_H */
index 1550877..ebfae96 100644 (file)
@@ -15,18 +15,18 @@ BEGIN
     PUSHBUTTON      "Speichern unter",IDC_SAVEAS,120,139,55,14
     PUSHBUTTON      "Öffnen...",IDC_OPEN,177,139,50,14
     ICON            "", IDC_CONNICON, 16,114,20,20
-    LTEXT           "Die derzeitigen Verbindungseinstellungen speichern oder vohandene Einstellungen laden.",IDC_STATIC,50,115,172,20
+    LTEXT           "Die derzeitigen Verbindungseinstellungen speichern oder vorhandene Einstellungen laden.",IDC_STATIC,50,115,172,20
 END
 
 IDD_DISPLAY DIALOGEX 0, 0, 242, 175
 STYLE DS_SHELLFONT | WS_CHILD
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
-    GROUPBOX        "Remotedesktop Größe",IDC_STATIC,7,7,228,68
+    GROUPBOX        "Remotedesktop-Größe",IDC_STATIC,7,7,228,68
     GROUPBOX        "Farben",IDC_STATIC,7,83,228,85
     ICON            "", IDC_REMICON, 15,19,20,20
     ICON            "", IDC_COLORSICON, 15,98,20,20
-    LTEXT           "Wählen Sie die Bildschirmgröße von Ihrem Remote- desktop. Stellen Sie den Regler für Vollbild nach rechts",IDC_STATIC,53,22,175,21
+    LTEXT           "Wählen Sie die Bildschirmgröße Ihres Remotedesktops. Stellen Sie den Regler für Vollbild nach rechts",IDC_STATIC,53,22,175,21
     CONTROL         "", IDC_GEOSLIDER, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 56, 42, 124, 17
     COMBOBOX        IDC_BPPCOMBO,56,102,128,80, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
     CONTROL         "",IDC_COLORIMAGE,"Static",SS_OWNERDRAW | SS_SUNKEN, 56,121,127,10
@@ -38,7 +38,7 @@ END
 
 IDD_CONNECTDIALOG DIALOGEX 0, 0, 260, 262
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Remotedesktop Verbindung"
+CAPTION "Remotedesktop-Verbindung"
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
     DEFPUSHBUTTON   "Verbinden",IDOK,147,245,50,14
@@ -58,6 +58,6 @@ BEGIN
     IDS_PIXEL               "%lux%lu Pixel"
     IDS_FULLSCREEN          "Vollbild"
     IDS_BROWSESERVER        "<Nach mehr suchen...>"
-    IDS_HEADERTEXT1         "Remote Desktop"
+    IDS_HEADERTEXT1         "Remotedesktop"
     IDS_HEADERTEXT2         "Verbindung"
 END
index e2000ef..c8ed8e3 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <module name="mstsc" type="win32gui" installbase="system32" installname="mstsc.exe" unicode="yes">
        <include base="mstsc">.</include>
        <library>user32</library>
index 70a3871..2c8f919 100644 (file)
@@ -18,8 +18,7 @@
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef __ORDERS_MSTSC_H
-#define __ORDERS_MSTSC_H
+#pragma once
 
 #define RDP_ORDER_STANDARD   0x01
 #define RDP_ORDER_SECONDARY  0x02
@@ -369,5 +368,3 @@ typedef struct _RDP_COLCACHE_ORDER
 
 }
 RDP_COLCACHE_ORDER;
-
-#endif /* __ORDERS_MSTSC_H */
index e75e588..57f6a9e 100644 (file)
@@ -17,8 +17,7 @@
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef RDESKTOP_PROTO_H
-#define RDESKTOP_PROTO_H
+#pragma once
 
 /* *INDENT-OFF* */
 #ifdef __cplusplus
@@ -306,5 +305,3 @@ unsigned int seamless_send_focus(unsigned long id, unsigned long flags);
 }
 #endif
 /* *INDENT-ON* */
-
-#endif
index c9f97b3..f61a94b 100644 (file)
@@ -18,8 +18,7 @@
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef __RDESKTOP_MSTSC_H
-#define __RDESKTOP_MSTSC_H
+#pragma once
 
 #include <stdlib.h>
 #include <stdio.h>
 #ifndef MAKE_PROTO
 #include "proto.h"
 #endif
-
-#endif /* __RDESKTOP_MSTSC_H */
index c03a079..b9972ef 100644 (file)
@@ -18,8 +18,7 @@
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef __UIMAIN_MSTSC_H
-#define __UIMAIN_MSTSC_H
+#pragma once
 
 /* in uimain.c */
 int
@@ -77,5 +76,3 @@ ui_set_modifier_state(int code);
 #define UI_MAX(a, b)  (((a) > (b)) ? (a) : (b))
 #undef UI_MIN
 #define UI_MIN(a, b)  (((a) < (b)) ? (a) : (b))
-
-#endif /* __UIMAIN_MSTSC_H */
index bbc7397..bab0285 100644 (file)
@@ -33,8 +33,7 @@
  *     @(#)err.h       8.1 (Berkeley) 6/2/93
  */
 
-#ifndef _ERR_H_
-#define        _ERR_H_
+#pragma once
 
 /*
  * Don't use va_list in the err/warn prototypes.   Va_list is typedef'd in two
@@ -56,5 +55,3 @@ void          warn __P((const char *, ...));
 void           vwarn __P((const char *, va_list));
 void           warnx __P((const char *, ...));
 void           vwarnx __P((const char *, va_list));
-
-#endif /* !_ERR_H_ */
index cb7572e..03c277b 100644 (file)
@@ -1,9 +1,7 @@
 // Various things you need when porting BSD and GNU utilities to
 // Win32.
 
-#ifndef VARIOUS_H
-#define VARIOUS_H
-
+#pragma once
 
 typedef float f4byte_t;
 typedef double f8byte_t;
@@ -32,5 +30,3 @@ typedef long uid_t;  // SunOS 5.5
 #define rindex(s, c)  strrchr(s, c)
 
 void netfinger(char *);
-
-#endif
index 8f6ca9a..5bb2d95 100644 (file)
@@ -183,17 +183,21 @@ LPTSTR GetConnectionType(LPTSTR lpClass)
             ConType = (LPTSTR)HeapAlloc(ProcessHeap,
                                         0,
                                         dwDataSize);
-            if (ConType == NULL)
-                return NULL;
-
-            if(RegQueryValueEx(hKey,
-                               _T("Name"),
-                               NULL,
-                               &dwType,
-                               (PBYTE)ConType,
-                               &dwDataSize) != ERROR_SUCCESS)
+            if (ConType)
             {
-                ConType = NULL;
+                if(RegQueryValueEx(hKey,
+                                   _T("Name"),
+                                   NULL,
+                                   &dwType,
+                                   (PBYTE)ConType,
+                                   &dwDataSize) != ERROR_SUCCESS)
+                {
+                    HeapFree(ProcessHeap,
+                             0,
+                             ConType);
+
+                    ConType = NULL;
+                }
             }
         }
     }
@@ -456,7 +460,9 @@ VOID ShowInfo(BOOL bAll)
 
         if (bAll)
         {
-            _tprintf(_T("\tDescription . . . . . . . . . . . : %s\n"), GetConnectionDescription(pAdapter->AdapterName));
+            LPTSTR lpDesc = GetConnectionDescription(pAdapter->AdapterName);
+            _tprintf(_T("\tDescription . . . . . . . . . . . : %s\n"), lpDesc);
+            HeapFree(ProcessHeap, 0, lpDesc);
             _tprintf(_T("\tPhysical Address. . . . . . . . . : %s\n"), PrintMacAddr(pAdapter->Address));
             if (pAdapter->DhcpEnabled)
                 _tprintf(_T("\tDHCP Enabled. . . . . . . . . . . : Yes\n"));
index e6d934d..89c23c1 100644 (file)
@@ -12,12 +12,12 @@ END
 STRINGTABLE DISCARDABLE
 BEGIN
   IDS_OTHER   "Anderer Adapter"
-  IDS_ETH     "Ethernet Adapter"
-  IDS_TOKEN   "Token Ring Adapter"
-  IDS_FDDI    "FDDI Adapter"
-  IDS_PPP     "PPP Adapter"
-  IDS_LOOP    "Loopback Adapter"
-  IDS_SLIP    "SLIP Adapter"
+  IDS_ETH     "Ethernet-Adapter"
+  IDS_TOKEN   "Token-Ring-Adapter"
+  IDS_FDDI    "FDDI-Adapter"
+  IDS_PPP     "PPP-Adapter"
+  IDS_LOOP    "Loopback-Adapter"
+  IDS_SLIP    "SLIP-Adapter"
 END
 
 STRINGTABLE DISCARDABLE
@@ -31,7 +31,7 @@ BEGIN
     \n \
     wobei\n \
         Adapter         Verbindungsname\n \
-                       (wildcards * und ? sind möglich, siehe Beispiele)\n \
+                       (Wildcards * und ? sind möglich, siehe Beispiele)\n \
     \n \
         Optionen:\n \
            /?           Zeigt die Hilfe an.\n \
@@ -61,6 +61,6 @@ BEGIN
         > ipconfig /renew EL*        ... Erneuert alle Verbindungen, deren Name\n \
                                          mit EL beginnt.\n \
         > ipconfig /release *Ver*    ... Gibt alle passenden Verbindungen frei,\n \
-                                         z.B. ""Lokale Vebindung 1"" oder\n \
-                                              ""Lokale Vebindung 2""\n"
+                                         z.B. ""Lokale Verbindung 1"" oder\n \
+                                              ""Lokale Verbindung 2""\n"
 END
index a8396d2..bd2ccc4 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __ANSIPRSR_H
-#define __ANSIPRSR_H
+#pragma once
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -81,5 +80,3 @@ public:
        char* ParseBuffer(char* pszBuffer, char* pszBufferEnd);
        static int StripBuffer(char* pszBuffer, char* pszBufferEnd, int width);
 };
-
-#endif
index 21bb85a..c4a49c1 100644 (file)
@@ -18,8 +18,7 @@
 //  DeleteKeyDef  : Deletes a key def from the list              //
 ///////////////////////////////////////////////////////////////////
 
-#ifndef __KEYTRANS_H
-#define __KEYTRANS_H
+#pragma once
 
 #include "tkeydef.h"
 #include "tkeymap.h"
@@ -93,5 +92,3 @@ private:
        int currentKeyMap, mainKeyMap;                          // AVS
 
 };
-
-#endif // __KEYTRANS_H
index 5d70f7f..59470ed 100644 (file)
@@ -1,8 +1,7 @@
 // This is the STL wrapper for classlib/arrays.h from Borland's web site
 // It has been modified to be compatible with vc++ (Paul Branann 5/7/98)
 
-#ifndef STL_ARRAY_AS_VECTOR
-#define STL_ARRAY_AS_VECTOR
+#pragma once
 
 #ifdef _MSC_VER
 #pragma warning(disable: 4786)
@@ -156,5 +155,3 @@ public:
        }
 
 };
-
-#endif
index cbc97e3..caf6dee 100644 (file)
@@ -1,8 +1,7 @@
 // This is a simple class to handle character maps
 // (Paul Brannan 6/25/98)
 
-#ifndef __TCHARMAP_H
-#define __TCHARMAP_H
+#pragma once
 
 class TCharmap {
 private:
@@ -37,5 +36,3 @@ public:
 
        int enabled;
 };
-
-#endif
index 81e5989..b90cb30 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TNPARSER_H
-#define __TNPARSER_H
+#pragma once
 
 #include "tnconfig.h"
 
@@ -168,5 +167,3 @@ void saveScreen(CHAR_INFO* chiBuffer);
 void restoreScreen(CHAR_INFO* chiBuffer);
 CHAR_INFO* newBuffer();
 void deleteBuffer(CHAR_INFO* chiBuffer);
-
-#endif
index dbb2cde..3fd11f2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef ___TELNET_H
-#define ___TELNET_H
+#pragma once
 
 /*
 * Copyright (c) 1983 Regents of the University of California.
@@ -298,8 +297,3 @@ extern char *enctype_names[];
 #define        ENCTYPE_NAME(x)         enctype_names[x]
 //////////////////////////////////////////////////////
 //////////////////////////////////////////////////////
-
-
-
-#endif
-
index c44a5bc..49f7648 100644 (file)
@@ -3,8 +3,7 @@
 //                   - keeped in an array container    //
 /////////////////////////////////////////////////////////
 
-#ifndef __TKEYDEF_H
-#define __TKEYDEF_H
+#pragma once
 
 #include <windows.h>
 
@@ -67,5 +66,3 @@ public:
        DWORD GetCodeKey() { return vk_code; }
 
 };
-
-#endif
index 0501c20..82b70c9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TKEYMAP_H
-#define __TKEYMAP_H
+#pragma once
 
 #include "tkeydef.h"
 
@@ -35,5 +34,3 @@ struct KeyMap {
 
        ~KeyMap();
 };
-
-#endif
index 4a80966..03b650d 100644 (file)
@@ -68,8 +68,7 @@
 //                                                               //
 ///////////////////////////////////////////////////////////////////
 
-#ifndef __TLOADMAP_H
-#define __TLOADMAP_H
+#pragma once
 
 #include "keytrans.h"
 #include "tcharmap.h"
@@ -101,5 +100,3 @@ private:
        int LoadCharMap(string buf);
 
 };
-
-#endif
index fde6ec7..3bb9d1f 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TMOUSE_H
-#define __TMOUSE_H
+#pragma once
 
 #include "tnclip.h"
 #include <windows.h>
@@ -25,5 +24,3 @@ public:
        TMouse(Tnclip &RefClipboard);
        ~TMouse();
 };
-
-#endif
index f29dfa3..da204ac 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TNCLASS_H_
-#define __TNCLASS_H_
+#pragma once
 
 #include <windows.h>
 #include "tnconfig.h"
@@ -69,6 +68,3 @@ private:
        void NewProcess();                                      // Paul Brannan 9/13/98
        void SetLocalAddress(SOCKET s);
 };
-
-#endif
-
index cd20c30..bca147f 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TNCLIP_H
-#define __TNCLIP_H
+#pragma once
 
 #include <windows.h>
 #include "tnetwork.h"
@@ -16,5 +15,3 @@ public:
        void Copy(HGLOBAL clipboard_data);
        void Paste();
 };
-
-#endif
index d8b9414..42d75db 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TNCON_H
-#define __TNCON_H
+#pragma once
 
 #include "tparams.h"
 #include "tnclip.h"
@@ -30,5 +29,3 @@ BOOL WINAPI ControlEventHandler(DWORD);
 
 // Bryan Montgomery 10/14/98
 void setTNetwork(TNetwork);
-
-#endif
index c0d41ee..8a55627 100644 (file)
@@ -6,8 +6,7 @@
 // It does not store any information about the current settings, only default
 // or recommended settings.
 
-#ifndef __TNCONFIG_H
-#define __TNCONFIG_H
+#pragma once
 
 // Ioannou 2 June 98:  Borland needs them - quick hack
 #ifdef __BORLANDC__
@@ -207,5 +206,3 @@ private:
 };
 
 extern TConfig ini;
-
-#endif
index a7ada28..1432df5 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TNERROR_H
-#define __TNERROR_H
+#pragma once
 
 #ifndef __WINDOWS_H
 #include <windows.h>
@@ -12,5 +11,3 @@ extern int Telnet_Redir;
 int printm(LPTSTR szModule, BOOL fSystem, DWORD dwMessageId, ...);
 void LogErrorConsole(LPTSTR szError);
 int printit(const char * it);
-
-#endif
index bcc78c7..317ec2d 100644 (file)
@@ -1,8 +1,7 @@
 // This is a simple class to handle socket connections
 // (Paul Brannan 6/15/98)
 
-#ifndef __TNETWORK_H
-#define __TNETWORK_H
+#pragma once
 
 #include <windows.h>
 
@@ -46,5 +45,3 @@ public:
 
        void do_naws(int width, int height);
 };
-
-#endif
index 526742c..930b9b1 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TNMAIN_H
-#define __TNMAIN_H
+#pragma once
 
 #include <stdlib.h>
 #include <process.h>
@@ -15,5 +14,3 @@ struct cmdHistory {
        struct cmdHistory *next;
        struct cmdHistory *prev;
 };
-
-#endif
index 8216a86..22bd2cd 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TNMISC_H
-#define __TNMISC_H
+#pragma once
 
 // Process-related functions
 BOOL CreateHiddenConsoleProcess(LPCTSTR szChildName, PROCESS_INFORMATION* ppi,
@@ -14,5 +13,3 @@ HWND TelnetGetConsoleWindow(void);
 bool SetIcon(HWND hConsoleWindow, HANDLE hIcon, LPARAM *pOldBIcon, LPARAM *pOldSIcon,
                         const char *icondir);
 void ResetIcon(HWND hConsoleWindow, LPARAM oldBIcon, LPARAM oldSIcon);
-
-#endif
index ffd4f8c..efa0885 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __THREADPARAMS
-#define __THREADPARAMS
+#pragma once
 
 #include "ttelhndl.h"
 
@@ -20,5 +19,3 @@ public:
        NetParams p;
        TTelnetHandler &TelHandler;
 };
-
-#endif
index 143649f..7356d4b 100644 (file)
@@ -10,8 +10,7 @@
 //   - An Init() function, which will re-initialize the parser when
 //     necessary.
 
-#ifndef __TPARSER_H
-#define __TPARSER_H
+#pragma once
 
 #include "tconsole.h"
 #include "keytrans.h"
@@ -45,5 +44,3 @@ protected:
        TNetwork &Network;
        TCharmap &Charmap;
 };
-
-#endif
index f9626bf..1015b1f 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TSCRIPT_H
-#define __TSCRIPT_H
+#pragma once
 
 #include <windows.h>
 #include <stdio.h>
@@ -16,5 +15,3 @@ private:
        char *script;
        TNetwork &Network;
 };
-
-#endif
index 4261ca0..8a982b2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TSCROLL_H
-#define __TSCROLL_H
+#pragma once
 
 #include "tconsole.h"
 #include "tmouse.h"
@@ -22,5 +21,3 @@ public:
        TScroller(TMouse &M, int size=20000);
        ~TScroller();
 };
-
-#endif
index ad4ec62..9879435 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TTELHNDL_H
-#define __TTELHNDL_H
+#pragma once
 
 #include "tparser.h"
 #include "tnetwork.h"
@@ -47,5 +46,3 @@ public:
 
        int get_term() {return iTermSet;}
 };
-
-#endif
index 2844639..eeb8905 100644 (file)
@@ -127,7 +127,7 @@ FONT 8, "MS Shell Dlg"
 CAPTION "Enkodierung"
 BEGIN
 COMBOBOX        ID_ENCODING,54,0,156,80,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
-LTEXT           "Enkodierung:",0x155,5,2,41,12
+LTEXT           "Kodierung:",0x155,5,2,41,12
 COMBOBOX        ID_EOLN,54,18,156,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
 LTEXT           "Zeilenenden:",0x156,5,20,41,12
 END
@@ -161,7 +161,7 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-  STRING_LICENSE, "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis 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.\r\n\r\nYou 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."
+  STRING_LICENSE, "Dieses Programm ist kostenlos; Sie können es frei verteilen mit od. ohne Änderungen unter der GNU Lesser General Public License, wie es von der Free Software Foundation veröffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine spätere Version (ihrer Wahl).\r\n\r\nThis 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.\r\n\r\nYou 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."
 END
 
 STRINGTABLE DISCARDABLE
@@ -183,7 +183,7 @@ STRING_UNTITLED,                                "(unbenannt)"
 STRING_ALL_FILES,                               "Alle Dateien (*.*)"
 STRING_TEXT_FILES_TXT,                  "Textdateien (*.txt)"
 
-STRING_TOOLARGE,                                "Die Datei '%s' ist zu groß für den Editor\n \
+STRING_TOOLARGE,                                "Die Datei '%s' ist zu groß für den Editor.\n \
 Benutzen Sie bitte einen anderen Editor, um diese Datei zu bearbeiten."
 STRING_NOTEXT,                                  "Sie haben keinen Text eingegeben, der \
 gespeichert\n werden könnte. Geben Sie Text ein, und versuchen Sie es \
index d4a31e4..7c56d03 100644 (file)
@@ -193,7 +193,7 @@ BEGIN
     IDS_TOOLTIP9, "Sprühdose"
     IDS_TOOLTIP10, "Text"
     IDS_TOOLTIP11, "Linie"
-    IDS_TOOLTIP12, "Bezier-Kurve"
+    IDS_TOOLTIP12, "Bézier-Kurve"
     IDS_TOOLTIP13, "Rechteck"
     IDS_TOOLTIP14, "Polygon"
     IDS_TOOLTIP15, "Ellipse"
index 3449a3a..b37039a 100644 (file)
@@ -49,7 +49,7 @@ BEGIN
         MENUITEM SEPARATOR
         POPUP "Powiêkszenie"
         BEGIN
-            POPUP "User defined"
+            POPUP "Zdefiniowane przez u¿ytkownika"
             BEGIN
                 MENUITEM "12,5%", IDM_VIEWZOOM125
                 MENUITEM "25%", IDM_VIEWZOOM25
@@ -60,8 +60,8 @@ BEGIN
                 MENUITEM "800%", IDM_VIEWZOOM800
             END
             MENUITEM SEPARATOR
-            MENUITEM "Show grid", IDM_VIEWSHOWGRID
-            MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
+            MENUITEM "Poka¿ siatkê", IDM_VIEWSHOWGRID
+            MENUITEM "Poka¿ miniaturê", IDM_VIEWSHOWMINIATURE
         END
         MENUITEM "Pe³ny ekran\tCtrl+F", IDM_VIEWFULLSCREEN
     END
@@ -181,7 +181,7 @@ BEGIN
     IDS_INFOTEXT, "Paint dla ReactOS jest dostêpny na licencji GNU Lesser General Public License (LGPL) wersja 3 (www.gnu.org)"
     IDS_SAVEPROMPTTEXT, "Czy chcesz zapisaæ zmiany do %s?"
     IDS_DEFAULTFILENAME, "Nienazwany.bmp"
-    IDS_MINIATURETITLE, "Miniature"
+    IDS_MINIATURETITLE, "Miniatura"
     IDS_TOOLTIP1, "Zaznaczenie dowolne"
     IDS_TOOLTIP2, "Zaznaczenie"
     IDS_TOOLTIP3, "Gumka"
@@ -190,16 +190,16 @@ BEGIN
     IDS_TOOLTIP6, "Przybli¿enie"
     IDS_TOOLTIP7, "O³ówek"
     IDS_TOOLTIP8, "Pêdzel"
-    IDS_TOOLTIP9, "Spray"
+    IDS_TOOLTIP9, "Aerograf"
     IDS_TOOLTIP10, "Tekst"
     IDS_TOOLTIP11, "Linia"
     IDS_TOOLTIP12, "Krzywa Beziera"
     IDS_TOOLTIP13, "Prostok¹t"
-    IDS_TOOLTIP14, "Polygon"
+    IDS_TOOLTIP14, "Wielok¹t"
     IDS_TOOLTIP15, "Elipsa"
     IDS_TOOLTIP16, "Zaokr¹glony Prostok¹t"
     IDS_OPENFILTER, "Pliki Bitmapy (*.bmp;*.dib)\1*.bmp;*.dib\1Wszystkie pliki (*.*)\1*.*\1"
     IDS_SAVEFILTER, "Bitmapa 24 bit (*.bmp;*.dib)\1*.bmp;*.dib\1"
-    IDS_FILESIZE, "%d bytes"
-    IDS_PRINTRES, "%d x %d pixels per meter"
+    IDS_FILESIZE, "%d bajtów"
+    IDS_PRINTRES, "%d x %d pikseli na metr"
 END
index 383d5d9..4f5c130 100644 (file)
@@ -251,15 +251,18 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
             resetToU1();
             if ((rectSel_src[2] != 0) && (rectSel_src[3] != 0))
             {
-                DeleteObject(SelectObject
-                             (hSelDC, hSelBm =
-                              (HBITMAP) CreateDIBWithProperties(rectSel_src[2], rectSel_src[3])));
                 DeleteObject(hSelMask);
+                hSelMask = CreateBitmap(rectSel_src[2], rectSel_src[3], 1, 1, NULL);
+                DeleteObject(SelectObject(hSelDC, hSelMask));
+                Rect(hSelDC, 0, 0, rectSel_src[2], rectSel_src[3], 0x00ffffff, 0x00ffffff, 1, 2);
+                SelectObject(hSelDC, hSelBm = CreateDIBWithProperties(rectSel_src[2], rectSel_src[3]));
+                resetToU1();
                 BitBlt(hSelDC, 0, 0, rectSel_src[2], rectSel_src[3], hDrawingDC, rectSel_src[0],
                        rectSel_src[1], SRCCOPY);
                 Rect(hdc, rectSel_src[0], rectSel_src[1], rectSel_src[0] + rectSel_src[2],
                      rectSel_src[1] + rectSel_src[3], bgColor, bgColor, 0, TRUE);
                 newReversible();
+
                 placeSelWin();
                 ShowWindow(hSelection, SW_SHOW);
             }
index b53f1c0..f7cf48e 100644 (file)
@@ -1 +1 @@
-c:\cabman.exe -M raw -S rappmgr.cab \rapps\*.txt
+..\..\..\output-i386\tools\cabman\cabman.exe -M raw -S rappmgr.cab rapps\*.txt
index 1ead4ab..b48f0ea 100644 (file)
@@ -42,7 +42,7 @@ BEGIN
                MENUITEM "&Deinstallieren", ID_UNINSTALL
                MENUITEM "&Ändern",    ID_MODIFY
                MENUITEM SEPARATOR
-               MENUITEM "&Remove from Registry", ID_REGREMOVE
+               MENUITEM "Aus &Registry entfernen", ID_REGREMOVE
                MENUITEM SEPARATOR
                MENUITEM "&Aktualisieren",   ID_REFRESH
        END
@@ -71,16 +71,16 @@ END
 
 IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE  0, 0, 216, 97
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Program installation"
+CAPTION "Programminstallation"
 FONT 8, "MS Shell Dlg"
 BEGIN
        LTEXT "...", IDC_INSTALL_TEXT, 4, 5, 209, 35
 
-       AUTORADIOBUTTON "&Install from a disk (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP
-       AUTORADIOBUTTON "&Download and install", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP
+       AUTORADIOBUTTON "&Installation von einem Datenträger (CD oder DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP
+       AUTORADIOBUTTON "Herunterla&den und installieren", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP
 
        PUSHBUTTON "OK", IDOK, 86, 78, 60, 14
-       PUSHBUTTON "Cancel", IDCANCEL, 150, 78, 60, 14
+       PUSHBUTTON "Abbrechen", IDCANCEL, 150, 78, 60, 14
 END
 
 IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE  0, 0, 220, 76
@@ -98,7 +98,7 @@ STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME
 CAPTION "Über"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT "ReactOS Anwendungsmanager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
+       LTEXT "ReactOS-Anwendungsmanager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
        PUSHBUTTON "Schließen", IDOK, 133, 46, 50, 14
        ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
 END
@@ -124,14 +124,14 @@ STRINGTABLE DISCARDABLE
 BEGIN
        IDS_INFO_VERSION "\nVersion: "
        IDS_INFO_DESCRIPTION "\nBeschreibung: "
-       IDS_INFO_PUBLISHER "\nPublisher: "
+       IDS_INFO_PUBLISHER "\nVertrieb: "
        IDS_INFO_HELPLINK "\nHilfe-Link: "
        IDS_INFO_HELPPHONE "\nHilfe-Telefonnr.: "
        IDS_INFO_README "\nReadme: "
        IDS_INFO_REGOWNER "\nregistrierter Eigentümer: "
        IDS_INFO_PRODUCTID "\nProdukt-ID: "
-       IDS_INFO_CONTACT "\nKontaktt: "
-       IDS_INFO_UPDATEINFO "\nUpdate Information: "
+       IDS_INFO_CONTACT "\nKontakt: "
+       IDS_INFO_UPDATEINFO "\nUpdate-Informationen: "
        IDS_INFO_INFOABOUT "\nInformation über: "
        IDS_INFO_COMMENTS "\nKommentare: "
        IDS_INFO_INSTLOCATION "\nInstallationsort: "
@@ -171,23 +171,23 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-       IDS_APPTITLE "ReactOS Anwendungsmanager"
+       IDS_APPTITLE "ReactOS-Anwendungsmanager"
        IDS_SEARCH_TEXT "Suche..."
        IDS_INSTALL "Installieren"
        IDS_UNINSTALL "Deinstallieren"
        IDS_MODIFY "Ändern"
        IDS_APPS_COUNT "Anzahl der Anwendungen: %d"
-       IDS_WELCOME_TITLE "Willkommen im ReactOS Anwendungsmanager!\n\n"
-       IDS_WELCOME_TEXT "Wählen Sie links eine Kategorie und dann eine Anwendung um sie zu installieren oder zu deinstallieren.\nReactOS Webseite: "
+       IDS_WELCOME_TITLE "Willkommen im ReactOS-Anwendungsmanager!\n\n"
+       IDS_WELCOME_TEXT "Wählen Sie links eine Kategorie und dann eine Anwendung um sie zu installieren oder zu deinstallieren.\nReactOS-Webseite: "
        IDS_WELCOME_URL "http://www.reactos.org"
        IDS_INSTALLED "Installiert"
        IDS_AVAILABLEFORINST "Zur Installation verfügbar"
-       IDS_UPDATES "Updates"
+       IDS_UPDATES "Aktualisierungen"
        IDS_APPLICATIONS "Anwendungen"
-       IDS_CHOOSE_FOLDER_TEXT "Choose a folder which will be used for downloading of programs:"
-       IDS_CHOOSE_FOLDER_ERROR "You have specified a nonexistent folder!"
-       IDS_USER_NOT_ADMIN "You should be administrator for start ""ReactOS Applications Manager""!"
-       IDS_APP_REG_REMOVE "Are you sure you want to delete the data on the installed program from the registry?"
-       IDS_INFORMATION "Information"
-       IDS_UNABLE_TO_REMOVE "Unable to remove data on the program from the registry!"
+       IDS_CHOOSE_FOLDER_TEXT "Wählen Sie ein Verzeichnis aus, das zum Herunterladen verwendet werden soll:"
+       IDS_CHOOSE_FOLDER_ERROR "Sie haben ein nicht existentes Verzeichnis angegeben!"
+       IDS_USER_NOT_ADMIN "Sie müssen als Administrator angemeldet sein, um den Anwendungsmanager zu starten!"
+       IDS_APP_REG_REMOVE "Sind Sie sich sicher, dass Sie die Daten dieses Programms aus der Registry entfernen möchten?"
+       IDS_INFORMATION "Informationen"
+       IDS_UNABLE_TO_REMOVE "Konnte die Daten nicht aus der Registry löschen!"
 END
index fc79e8a..60fd20b 100644 (file)
@@ -16,7 +16,7 @@ BEGIN
                MENUITEM "&Odinstaluj",ID_UNINSTALL
                MENUITEM "&Modyfikuj",   ID_MODIFY
                MENUITEM SEPARATOR
-               MENUITEM "&Remove from Registry", ID_REGREMOVE
+               MENUITEM "&Usuñ z rejestru", ID_REGREMOVE
                MENUITEM SEPARATOR
                MENUITEM "O&d\9cwie¿",  ID_REFRESH
        END
@@ -44,7 +44,7 @@ BEGIN
                MENUITEM "&odinstaluj", ID_UNINSTALL
                MENUITEM "&Modyfikuj",    ID_MODIFY
                MENUITEM SEPARATOR
-               MENUITEM "&Remove from Registry", ID_REGREMOVE
+               MENUITEM "&Usuñ z rejestru", ID_REGREMOVE
                MENUITEM SEPARATOR
                MENUITEM "&Od\9cwie¿",   ID_REFRESH
        END
@@ -52,37 +52,37 @@ END
 
 IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE  0, 0, 250, 144
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Settings"
+CAPTION "Ustawienia"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       GROUPBOX "General", -1, 4, 2, 240, 61
-       AUTOCHECKBOX "&Save window position", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12
-       AUTOCHECKBOX "&Update the list of accessible programs at start", IDC_UPDATE_AVLIST, 15, 29, 219, 12
-       AUTOCHECKBOX "&Log of installation and removal of programs", IDC_LOG_ENABLED, 15, 46, 219, 12
+       GROUPBOX "Ogólne", -1, 4, 2, 240, 61
+       AUTOCHECKBOX "&Zapisz pozycjê okna", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12
+       AUTOCHECKBOX "&Aktualizuj listê dostêpnych programów przy ka¿dym uruchomieniu", IDC_UPDATE_AVLIST, 15, 29, 219, 12
+       AUTOCHECKBOX "Zap&isuj dziennik instalacji i usuwania programów", IDC_LOG_ENABLED, 15, 46, 219, 12
 
-       GROUPBOX "Downloading", -1, 4, 65, 240, 51
-       LTEXT "Folder for downloadings:", -1, 16, 75, 100, 9
+       GROUPBOX "Pobieranie", -1, 4, 65, 240, 51
+       LTEXT "Katalog dla pobranych plików:", -1, 16, 75, 100, 9
        EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP
-       PUSHBUTTON "&Choose", IDC_CHOOSE, 187, 85, 50, 14
-       AUTOCHECKBOX "&Delete installers of programs after installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12
+       PUSHBUTTON "&Wybierz", IDC_CHOOSE, 187, 85, 50, 14
+       AUTOCHECKBOX "&Usuñ instalatory programów po ich zainstalowaniu", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12
 
-       PUSHBUTTON "Default", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14
+       PUSHBUTTON "Domy\9clne", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14
        PUSHBUTTON "OK", IDOK, 116, 124, 60, 14
-       PUSHBUTTON "Cancel", IDCANCEL, 181, 124, 60, 14
+       PUSHBUTTON "Anuluj", IDCANCEL, 181, 124, 60, 14
 END
 
 IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE  0, 0, 216, 97
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Program installation"
+CAPTION "Instalacja programu"
 FONT 8, "MS Shell Dlg"
 BEGIN
        LTEXT "...", IDC_INSTALL_TEXT, 4, 5, 209, 35
 
-       AUTORADIOBUTTON "&Install from a disk (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP
-       AUTORADIOBUTTON "&Download and install", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP
+       AUTORADIOBUTTON "&Zainstaluj z dysku (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP
+       AUTORADIOBUTTON "&Pobierz i zainstaluj", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP
 
        PUSHBUTTON "OK", IDOK, 86, 78, 60, 14
-       PUSHBUTTON "Cancel", IDCANCEL, 150, 78, 60, 14
+       PUSHBUTTON "Anuluj", IDCANCEL, 150, 78, 60, 14
 END
 
 IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE  0, 0, 220, 76
@@ -101,7 +101,7 @@ CAPTION "O programie"
 FONT 8, "MS Shell Dlg"
 BEGIN
        LTEXT "ReactOS Applications Manager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39
-       PUSHBUTTON "Close", IDOK, 133, 46, 50, 14
+       PUSHBUTTON "Zamknij", IDOK, 133, 46, 50, 14
        ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30
 END
 
@@ -139,7 +139,7 @@ BEGIN
        IDS_INFO_INSTLOCATION "\nScie¿ka instalacji: "
        IDS_INFO_INSTALLSRC "\n\8fród³o instalacji: "
        IDS_INFO_UNINSTALLSTR "\nKomenda deinstalacji: "
-       IDS_INFO_MODIFYPATH "\nModify Path: "
+       IDS_INFO_MODIFYPATH "\nModyfikacja \9ccie¿ki instalacji: "
        IDS_INFO_INSTALLDATE "\nData instalacji: "
 END
 
@@ -186,10 +186,10 @@ BEGIN
        IDS_AVAILABLEFORINST "Dostêpne"
        IDS_UPDATES "Uaktualnienia"
        IDS_APPLICATIONS "Aplikacje"
-       IDS_CHOOSE_FOLDER_TEXT "Choose a folder which will be used for downloading of programs:"
-       IDS_CHOOSE_FOLDER_ERROR "You have specified a nonexistent folder!"
-       IDS_USER_NOT_ADMIN "You should be administrator for start ""ReactOS Applications Manager""!"
-       IDS_APP_REG_REMOVE "Are you sure you want to delete the data on the installed program from the registry?"
-       IDS_INFORMATION "Information"
-       IDS_UNABLE_TO_REMOVE "Unable to remove data on the program from the registry!"
+       IDS_CHOOSE_FOLDER_TEXT "Wybierz katalog w którym bêda zapisywane pobrane programy:"
+       IDS_CHOOSE_FOLDER_ERROR "Wybra³e\9c nieistniej¹cy katalog!"
+       IDS_USER_NOT_ADMIN "Musisz mieæ uprawnienia administratora aby uruchomiæ ""ReactOS Applications Manager""!"
+       IDS_APP_REG_REMOVE "Czy na pewno chcesz usun¹æ wpis tego programu z rejestru?"
+       IDS_INFORMATION "Informacja"
+       IDS_UNABLE_TO_REMOVE "Nie mo¿na by³o usun¹æ wpisu z rejestru!"
 END
index 09a64c2..cba76db 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _RAPPS_H__
-#define _RAPPS_H__
+#pragma once
 
 #include <windows.h>
 #include <commctrl.h>
@@ -12,7 +11,7 @@
 
 #include "resource.h"
 
-#define APPLICATION_DATEBASE_URL L"http://opendn.org/rappmgr.cab"
+#define APPLICATION_DATEBASE_URL L"http://svn.reactos.org/packages/rappmgr.cab"
 
 #define SPLIT_WIDTH 4
 #define MAX_STR_LEN 256
@@ -185,5 +184,3 @@ VOID ToolBarOnGetDispInfo(LPTOOLTIPTEXT lpttt);
 extern HWND hTreeView;
 BOOL CreateTreeView(HWND hwnd);
 HTREEITEM TreeViewAddItem(HTREEITEM hParent, LPWSTR lpText, INT Image, INT SelectedImage, LPARAM lParam);
-
-#endif /* _RAPPS_H__ */
index d4d2272..e605180 100644 (file)
@@ -2,41 +2,41 @@
 
 [Section]
 Name = Mozilla Firefox 3.0
-Version = 3.0.17
+Version = 3.0.18
 Licence = MPL/GPL/LGPL
 Description = The most popular and one of the best free Web Browsers out there.
-Size = 7.1M
+Size = 7.2M
 Category = 5
 URLSite = http://www.mozilla.com/en-US/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/en-US/Firefox%20Setup%203.0.17.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 = 6.9M
+Size = 7.0M
 URLSite = http://www.mozilla-europe.org/de/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/de/Firefox%20Setup%203.0.17.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/latest-3.0/win32/es-ES/Firefox%20Setup%203.0.17.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 = 6.9M
 URLSite = http://www.mozilla-europe.org/no/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/nb-NO/Firefox%20Setup%203.0.17.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/latest-3.0/win32/pl/Firefox%20Setup%203.0.17.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/latest-3.0/win32/ru/Firefox%20Setup%203.0.17.exe
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/ru/Firefox%20Setup%203.0.18.exe
index a447fce..0fff6a4 100644 (file)
@@ -2,13 +2,13 @@
 
 [Section]
 Name = Miranda IM
-Version = 0.8.12
+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.12-unicode.exe
+URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.18-unicode.exe
 CDPath = none
 
 [Section.0407]
index 81cae28..d68f92e 100644 (file)
@@ -8,23 +8,23 @@ Description = THE Open Source Office Suite.
 Size = 127MB
 Category = 6
 URLSite = http://www.openoffice.org/
-URLDownload = http://ftp.plusline.de/OpenOffice/stable/2.4.3/OOo_2.4.3_Win32Intel_install_en-US.exe
+URLDownload = ftp://archive.services.openoffice.org/pub/openoffice-archive/stable/2.4.3/OOo_2.4.3_Win32Intel_install_en-US.exe
 CDPath = none
 
 [Section.0407]
 Description = DIE Open Source Office Suite.
 URLSite = http://de.openoffice.org/
 Size = 114.2MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/2.4.3/OOo_2.4.3_Win32Intel_install_de.exe
+URLDownload = ftp://archive.services.openoffice.org/pub/openoffice-archive/localized/de/2.4.3/OOo_2.4.3_Win32Intel_install_de.exe
 
 [Section.040a]
 Description = La suite de ofimática de código abierto.
 URLSite = http://es.openoffice.org/
 Size = 113.9MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/es/2.4.3/OOo_2.4.3_Win32Intel_install_es.exe
+URLDownload = ftp://archive.services.openoffice.org/pub/openoffice-archive/localized/es/2.4.3/OOo_2.4.3_Win32Intel_install_es.exe
 
 [Section.0415]
 URLSite = http://pl.openoffice.org/
 Description = Otwarty pakiet biurowy.
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/pl/2.4.2/OOo_2.4.2_Win32Intel_install_pl.exe
+URLDownload = ftp://archive.services.openoffice.org/pub/openoffice-archive/localized/pl/2.4.2/OOo_2.4.2_Win32Intel_install_pl.exe
 Size = 113.9M
index ebfc63e..b9ee71b 100644 (file)
@@ -2,30 +2,30 @@
 
 [Section]
 Name = OpenOffice 3.0
-Version = 3.1.1
+Version = 3.2.0
 Licence = LGPL
 Description = THE Open Source Office Suite.
-Size = 134.3MB
+Size = 135.4MB
 Category = 6
 URLSite = http://www.openoffice.org/
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/stable/3.1.1/OOo_3.1.1_Win32Intel_install_en-US.exe
+URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/stable/3.2.0/OOo_3.2.0_Win32Intel_install_en-US.exe
 CDPath = none
 
 [Section.0407]
 Description = DIE Open Source Office Suite.
 URLSite = http://de.openoffice.org/
-Size = 142.9MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/3.1.1/OOo_3.1.1_Win32Intel_install_de.exe
+Size = 145.8MB
+URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/3.2.0/OOo_3.2.0_Win32Intel_install_de.exe
 
 [Section.040a]
 Description = La suite de ofimática de código abierto.
 URLSite = http://es.openoffice.org/
 Version = 3.1.0
-Size = 130.0MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/es/3.1.0/OOo_3.1.0_Win32Intel_install_es.exe
+Size = 119.4MB
+URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/es/3.2.0/OOo_3.2.0_Win32Intel_install_es.exe
 
 [Section.0415]
 Description = Otwarty pakiet biurowy.
 URLSite = http://pl.openoffice.org/
-Size = 147.1MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/pl/3.1.1/OOo_3.1.1_Win32Intel_install_pl.exe
+Size = 133.2MB
+URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/pl/3.2.0/OOo_3.2.0_Win32Intel_install_pl.exe
index 6220e8a..dfc94a9 100644 (file)
@@ -2,13 +2,13 @@
 
 [Section]
 Name = OpenTTD
-Version = 0.7.3
+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 = 2.9MB
 Category = 4
 URLSite = http://www.openttd.org/
-URLDownload = http://ovh.dl.sourceforge.net/sourceforge/openttd/openttd-0.7.3-windows-win32.exe
+URLDownload = http://binaries.openttd.org/releases/0.7.5/openttd-0.7.5-windows-win32.exe
 CDPath = none
 
 [Section.0407]
index 148e79b..44e49cc 100644 (file)
@@ -2,13 +2,13 @@
 
 [Section]
 Name = Opera
-Version = 10.10
+Version = 10.51
 Licence = Freeware
 Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client.
 Size = 11.0M
 Category = 5
 URLSite = http://www.opera.com/
-URLDownload = http://ftp.opera.com/pub/opera/win/1010/int/Opera_1010_in_Setup.exe
+URLDownload = http://get4.opera.com/pub/opera/win/1051/int/Opera_1051_int_Setup.exe
 CDPath = none
 
 [Section.0407]
index 843f75d..7d7918b 100644 (file)
@@ -2,17 +2,17 @@
 
 [Section]
 Name = ReactOS Build Environment
-Version = 1.4.5
+Version = 1.5
 Licence = GPL
 Description = Allows you to build the ReactOS Source. For more instructions see ReactOS wiki.
-Size = 14.9MB
+Size = 13.5MB
 Category = 7
 URLSite = http://reactos.org/wiki/Build_Environment/
-URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.4.5.exe
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.5.exe
 CDPath = none
 
 [Section.0407]
-Description = Erlaubt es Ihnen ReactOS aus den Quellen zu bauen. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen.
+Description = Erlaubt es Ihnen den ReactOS Source Code zu kompilieren. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen.
 
 [Section.040a]
 Description = Te permite compilar el código de ReactOS. Para más instrucciones consulta la wiki de ReactOS.
diff --git a/reactos/base/applications/rapps/rapps/rosbeamd64.txt b/reactos/base/applications/rapps/rapps/rosbeamd64.txt
new file mode 100644 (file)
index 0000000..c68b47a
--- /dev/null
@@ -0,0 +1,21 @@
+; UTF-8
+
+[Section]
+Name = ReactOS Build Environment AMD64 Addon
+Version = 1.3
+Licence = GPL
+Description = Allows you to build the ReactOS AMD64 Source. For more instructions see ReactOS wiki.
+Size = 15.8MB
+Category = 7
+URLSite = http://reactos.org/wiki/Build_Environment/
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE64-1.3.exe
+CDPath = none
+
+[Section.0407]
+Description = Erlaubt es Ihnen den ReactOS AMD64 Source Code zu kompilieren. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen.
+
+[Section.040a]
+Description = Te permite compilar el código de ReactOS AMD64. Para más instrucciones consulta la wiki de ReactOS.
+
+[Section.0415]
+Description = Pozwala zbudować obraz płyty ReactOS AMD64 ze źródeł. Więcej informacji na Wiki ReactOS.
diff --git a/reactos/base/applications/rapps/rapps/rosbearm.txt b/reactos/base/applications/rapps/rapps/rosbearm.txt
new file mode 100644 (file)
index 0000000..61596d7
--- /dev/null
@@ -0,0 +1,21 @@
+; UTF-8
+
+[Section]
+Name = ReactOS Build Environment ARM Addon
+Version = 1.0
+Licence = GPL
+Description = Allows you to build the ReactOS ARM Source. For more instructions see ReactOS wiki.
+Size = 11.1MB
+Category = 7
+URLSite = http://reactos.org/wiki/Build_Environment/
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-ARM-1.0.exe
+CDPath = none
+
+[Section.0407]
+Description = Erlaubt es Ihnen den ReactOS ARM Source Code zu kompilieren. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen.
+
+[Section.040a]
+Description = Te permite compilar el código de ReactOS ARM. Para más instrucciones consulta la wiki de ReactOS.
+
+[Section.0415]
+Description = Pozwala zbudować obraz płyty ReactOS ARM ze źródeł. Więcej informacji na Wiki ReactOS.
index 4377863..6cf579a 100644 (file)
@@ -2,10 +2,10 @@
 
 [Section]
 Name = Samba TNG
-Version = 0.4.99cvs
+Version = 0.5-RC1
 Licence = GPL
 Description = This tool allows you to access your Windows shared folders/printers with ReactOS.
-Size = 1MB
+Size = 2.1MB
 Category = 5
 URLSite = http://samba-tng.org/
 URLDownload = http://svn.reactos.org/packages/samba-tng.exe
index 0ec430f..fc3d9d5 100644 (file)
@@ -2,13 +2,13 @@
 
 [Section]
 Name = SciTE
-Version = 2.01
+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://fastbull.dl.sourceforge.net/sourceforge/scintilla/Sc201.exe
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc203.exe
 CDPath = none
 
 [Section.0407]
index 69a43d5..9c980d3 100644 (file)
@@ -2,31 +2,31 @@
 
 [Section]
 Name = Mozilla SeaMonkey
-Version = 2.0.2
+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.2/win32/en-US/SeaMonkey%20Setup%202.0.2.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.2/win32/de/SeaMonkey%20Setup%202.0.2.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.2/win32/es-ES/SeaMonkey%20Setup%202.0.2.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.2/win32/pl/SeaMonkey%20Setup%202.0.2.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.2/win32/ru/SeaMonkey%20Setup%202.0.2.exe
+URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/ru/SeaMonkey%20Setup%202.0.3.exe
index b307170..a2e47d3 100644 (file)
@@ -2,13 +2,13 @@
 
 [Section]
 Name = SMPlayer
-Version = 0.6.8
+Version = 0.6.9
 Licence = GPL
 Description = SMPlayer.
-Size = 13.38MB
+Size = 14.2MB
 Category = 1
 URLSite = http://smplayer.sourceforge.net/
-URLDownload = http://downloads.sourceforge.net/project/smplayer/SMPlayer/0.6.8/smplayer-0.6.8-win32.exe
+URLDownload = http://downloads.sourceforge.net/project/smplayer/SMPlayer/0.6.9/smplayer-0.6.9-win32.exe
 CDPath = none
 
 [Section.0407]
index fa47d4b..9f0cd32 100644 (file)
@@ -2,35 +2,35 @@
 
 [Section]
 Name = Mozilla Thunderbird
-Version = 3.0
+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/latest-3.0/win32/en-US/Thunderbird%20Setup%203.0.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.4M
 URLSite = http://www.mozilla-europe.org/de/products/thunderbird/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/de/Thunderbird%20Setup%203.0.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/latest-3.0/win32/es-ES/Thunderbird%20Setup%203.0.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.2M
+Size = 9.3M
 URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/
-URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/pl/Thunderbird%20Setup%203.0.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/latest-3.0/win32/ru/Thunderbird%20Setup%203.0.exe
+URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/ru/Thunderbird%20Setup%203.0.3.exe
index 41a5f00..9882637 100644 (file)
@@ -2,13 +2,13 @@
 
 [Section]
 Name = µTorrent
-Version = 1.8.5
+Version = 2.0
 Licence = Freeware for non-commercial uses
 Description = Small and fast BitTorrent Client.
-Size = 282K
+Size = 312K
 Category = 5
 URLSite = http://www.utorrent.com/
-URLDownload = http://download.utorrent.com/1.8.5/utorrent.exe
+URLDownload = http://download.utorrent.com/2.0/utorrent.exe
 CDPath = none
 
 
index 3a0d4e6..d3d11d2 100644 (file)
@@ -2,13 +2,13 @@
 
 [Section]
 Name = VLC media player
-Version = 1.0.3
+Version = 1.0.5
 Licence = GPL
 Description = A media player.
 Size = 17.2MB
 Category = 1
 URLSite = http://www.videolan.org/vlc/
-URLDownload = http://mirror.services.wisc.edu/mirrors/videolan/vlc/1.0.3/win32/vlc-1.0.3-win32.exe
+URLDownload = http://mirror.services.wisc.edu/mirrors/videolan/vlc/1.0.5/win32/vlc-1.0.5-win32.exe
 CDPath = none
 
 [Section.0407]
index a4faeae..a3b9075 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _RESOURCE_H__
-#define _RESOURCE_H__
+#pragma once
 
 /* Icons */
 #define IDI_MAIN                 10
 #ifndef IDC_STATIC
 #define IDC_STATIC               -1
 #endif
-
-#endif /* _RESOURCE_H__ */
index bc148d1..2680976 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CLBDLL_H
-#define __CLBDLL_H
+#pragma once
 
 #define CLBS_NOTIFY 0x1
 #define CLBS_SORT   0x2
@@ -39,5 +38,3 @@ typedef struct _CUSTOM_CONTROL_INFO
 LRESULT CALLBACK ClbWndProc(HWND,UINT,WPARAM,LPARAM);
 INT_PTR WINAPI ClbStyleW(HWND,LPARAM);
 BOOL WINAPI CustomControlInfoW(LPCUSTOM_CONTROL_INFO);
-
-#endif /* __CLBDLL_H */
index f0d51c7..8cfc463 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef __CLB_RESOURCE_H
-#define __CLB_RESOURCE_H
+#pragma once
 
 #define IDD_COLUMNLISTBOXSTYLES 1700
-
-#endif /* __CLB_RESOURCE_H */
index d692d38..5ee5e22 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __HEXEDIT_H
-#define __HEXEDIT_H
+#pragma once
 
 #define HEX_EDIT_CLASS_NAME _T("HexEdit32")
 
@@ -36,5 +35,3 @@ UnregisterHexEditorClass(HINSTANCE hInstance);
 
 #define HexEdit_SetMaxBufferSize(hWnd, Size) \
   SendMessage((hWnd), HEM_SETMAXBUFFERSIZE, 0, (LPARAM)(Size))
-
-#endif /* __HEXEDIT_H */
index 6e456a5..2b0a22c 100644 (file)
@@ -54,8 +54,8 @@ BEGIN
         MENUITEM "&Exportieren...",    ID_REGISTRY_EXPORTREGISTRYFILE
 
         MENUITEM SEPARATOR
-               MENUITEM "Hive laden...",                               ID_REGISTRY_LOADHIVE, GRAYED
-               MENUITEM "Hive entladen...",                            ID_REGISTRY_UNLOADHIVE, GRAYED
+               MENUITEM "Zweig laden...",                              ID_REGISTRY_LOADHIVE, GRAYED
+               MENUITEM "Zweig entladen...",                           ID_REGISTRY_UNLOADHIVE, GRAYED
                MENUITEM SEPARATOR
         MENUITEM "&Mit Netzwerkregistrierung verbinden...",
                                                 ID_REGISTRY_CONNECTNETWORKREGISTRY
@@ -78,7 +78,7 @@ BEGIN
             MENUITEM SEPARATOR
             MENUITEM "&Zeichenkette",               ID_EDIT_NEW_STRINGVALUE
             MENUITEM "&Binärwert",               ID_EDIT_NEW_BINARYVALUE
-            MENUITEM "&DWORD Wert",                ID_EDIT_NEW_DWORDVALUE
+            MENUITEM "&DWORD-Wert",                ID_EDIT_NEW_DWORDVALUE
             MENUITEM "&Mehrteilige Zeichenkette",      ID_EDIT_NEW_MULTISTRINGVALUE
             MENUITEM "&Erweiterbare Zeichenkette",     ID_EDIT_NEW_EXPANDABLESTRINGVALUE
         END
@@ -134,14 +134,14 @@ BEGIN
             MENUITEM SEPARATOR
             MENUITEM "&Zeichenkette",               ID_EDIT_NEW_STRINGVALUE
             MENUITEM "&Binärwert",                  ID_EDIT_NEW_BINARYVALUE
-            MENUITEM "&DWORD Wert",                 ID_EDIT_NEW_DWORDVALUE
+            MENUITEM "&DWORD-Wert",                 ID_EDIT_NEW_DWORDVALUE
             MENUITEM "&Mehrteilige Zeichenkette",      ID_EDIT_NEW_MULTISTRINGVALUE
             MENUITEM "&Erweiterbare Zeichenkette",     ID_EDIT_NEW_EXPANDABLESTRINGVALUE
         END
   END
   POPUP ""
   BEGIN
-        MENUITEM "Expandieren/Schliessen",                 ID_TREE_EXPANDBRANCH
+        MENUITEM "Erweitern/Schließen",                 ID_TREE_EXPANDBRANCH
         POPUP "&Neu"
         BEGIN
             MENUITEM "&Schlüssel",                        ID_EDIT_NEW_KEY
@@ -160,7 +160,7 @@ BEGIN
         MENUITEM "&Exportieren",                         ID_TREE_EXPORT
         MENUITEM "&Berechtigungen...",                 ID_TREE_PERMISSIONS, GRAYED
         MENUITEM SEPARATOR
-        MENUITEM "S&chlüsselname kopieren",                  ID_EDIT_COPYKEYNAME
+        MENUITEM "S&chlüsselnamen kopieren",                  ID_EDIT_COPYKEYNAME
   END
 END
 
@@ -215,7 +215,7 @@ END
 IDD_EDIT_DWORD DIALOGEX  32, 24, 252, 104
 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP |
     WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "DWORD Wert editieren"
+CAPTION "DWORD-Wert editieren"
 FONT 8, "MS Shell Dlg"
 BEGIN
     LTEXT           "&Name:",IDC_STATIC,6,6,134,8
@@ -242,7 +242,7 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-    IDS_APP_TITLE           "Registry Editor"
+    IDS_APP_TITLE           "Registry-Editor"
     IDC_REGEDIT             "REGEDIT"
     IDC_REGEDIT_FRAME       "REGEDIT_FRAME"
 END
@@ -253,7 +253,7 @@ BEGIN
     ID_EDIT_MENU            "Enthält Befehle für das Ändern von Schlüsseln oder Werten"
     ID_VIEW_MENU            "Enthält Befehle für das Anpassen des Registry Editor Fensters"
     ID_FAVOURITES_MENU      "Enthält Befehle um auf oft genutzte Schlüssel zuzugreifen"
-    ID_HELP_MENU            "Enthält Befehle um Hilfe und Informationen über den Registry Editor anzuzeigen"
+    ID_HELP_MENU            "Enthält Befehle um Hilfe und Informationen über den Registry-Editor anzuzeigen"
     ID_EDIT_NEW_MENU        "Enthält Befehle für das Erstellen von neuen Schlüsseln oder Werten"
 END
 
@@ -263,7 +263,7 @@ BEGIN
     ID_EDIT_NEW_KEY   "Fügt einen neuen Schlüssel hinzu"
     ID_EDIT_NEW_STRINGVALUE "Fügt eine neue Zeichenkette hinzu "
     ID_EDIT_NEW_BINARYVALUE "Fügt einen neuen Binärwärt hinzu"
-    ID_EDIT_NEW_DWORDVALUE  "Fügt einen neuen DWORD Wert hinzu"
+    ID_EDIT_NEW_DWORDVALUE  "Fügt einen neuen DWORD-Wert hinzu"
     ID_REGISTRY_IMPORTREGISTRYFILE "Importiert eine Textddatei in die Registry"
     ID_REGISTRY_EXPORTREGISTRYFILE
                             "Exportiert Teile oder die ganze Registry in eine Textdatei"
@@ -278,7 +278,7 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-    ID_REGISTRY_EXIT        "Beendet den Registry Editor"
+    ID_REGISTRY_EXIT        "Beendet den Registry-Editor"
     ID_FAVOURITES_ADDTOFAVOURITES "Fügt Schlüssel zu den Favoriten hinzu"
     ID_FAVOURITES_REMOVEFAVOURITE "Löscht Schlüssel aus den Favoriten"
     ID_VIEW_STATUSBAR       "Zeigt oder versteckt die Statusleiste"
@@ -297,7 +297,7 @@ BEGIN
     IDS_WARNING                    "Warnung"
     IDS_BAD_KEY             "Kann den Schlüssel '%s' nicht lesen"
     IDS_BAD_VALUE           "Kann den Wert '%s' nicht lesen"
-    IDS_UNSUPPORTED_TYPE    "Kann den Schlüssel des Typen (%ld) nicht ändern"
+    IDS_UNSUPPORTED_TYPE    "Kann den Schlüssel des Typs (%ld) nicht ändern"
     IDS_TOO_BIG_VALUE       "Der Wert (%ld) ist zu groß"
     IDS_MULTI_SZ_EMPTY_STRING "Daten vom Typ REG_MULTI_SZ können keine leere Zeichenkette enthalten.\nDie leere Zeichenkette wurde aus der Liste gelöscht."
     IDS_QUERY_DELETE_KEY_ONE    "Diesen Schlüssel wirklich löschen?"
@@ -323,7 +323,7 @@ BEGIN
     IDS_MY_COMPUTER         "Arbeitsplatz"
     IDS_IMPORT_REG_FILE     "Registry importieren"
     IDS_EXPORT_REG_FILE     "Registry exportieren"
-    IDS_INVALID_DWORD       "(ungültiger DWORD Wert)"
+    IDS_INVALID_DWORD       "(ungültiger DWORD-Wert)"
 END
 
 STRINGTABLE DISCARDABLE
@@ -331,7 +331,7 @@ BEGIN
     IDS_FLT_REGFILE         "Registrierungsdatei"
     IDS_FLT_REGFILES        "Registrierungsdateien"
     IDS_FLT_REGFILES_FLT    "*.reg"
-    IDS_FLT_REGEDIT4        "Win9x/NT4 Registrierungsdateien (REGEDIT4)"
+    IDS_FLT_REGEDIT4        "Win9x/NT4-Registrierungsdateien (REGEDIT4)"
     IDS_FLT_REGEDIT4_FLT    "*.reg"
     IDS_FLT_ALLFILES        "Alle Dateien (*.*)"
     IDS_FLT_ALLFILES_FLT    "*.*"
index 6e22e3e..ea16cee 100644 (file)
@@ -18,8 +18,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __MAIN_H__
-#define __MAIN_H__
+#pragma once
 
 #include "resource.h"
 
@@ -124,5 +123,3 @@ extern void DestroyMainMenu( void );
 /* edit.c */
 extern BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin);
 extern BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath);
-
-#endif /* __MAIN_H__ */
index 743cca5..4f6d70d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _REGEXP_SECURITY_H
-#define _REGEXP_SECURITY_H
+#pragma once
 
 BOOL
 InitializeAclUiDll(VOID);
@@ -154,6 +153,4 @@ typedef struct _CRegKeySecurity
     TCHAR szRegKey[1];
 } CRegKeySecurity, *PCRegKeySecurity;
 
-#endif /* _REGEXP_SECURITY_H */
-
 /* EOF */
index d6df75d..0fb89e8 100644 (file)
@@ -2,7 +2,7 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
 
 DLG_SCRNSAVECONFIGURE DIALOGEX 0, 0, 273, 178
 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "3D-Text Bildschirmschoner-Einstellungen"
+CAPTION "3D-Text-Bildschirmschoner-Einstellungen"
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
     DEFPUSHBUTTON   "OK",IDOK,216,7,50,14
@@ -13,5 +13,5 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-    IDS_DESCRIPTION "3D Text Bildschirmschoner"
+    IDS_DESCRIPTION "3D-Text-Bildschirmschoner"
 END
index 10fc848..b740bed 100644 (file)
@@ -2,6 +2,6 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
 
 STRINGTABLE DISCARDABLE
 BEGIN
-    IDS_DESCRIPTION "Logon Bildschirmschoner"
+    IDS_DESCRIPTION "Logon-Bildschirmschoner"
     IDS_TEXT        "Keinerlei Einstellungen notwendig."
 END
index abcab15..6ea135d 100644 (file)
@@ -19,7 +19,7 @@ END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-    IDS_SNDVOL32       "Lautstärke Einstellungen"
+    IDS_SNDVOL32       "Lautstärke-Einstellungen"
     IDS_NOMIXERDEVICES "Es sind keine aktiven Mixer vorhanden! Die Anwendung wird jetzt beendet."
 END
 
index 35d5253..0272ffe 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __SNDVOL_RESOURCES_H
-#define __SNDVOL_RESOURCES_H
+#pragma once
 
 #define IDM_MAINMENU 101
 
@@ -22,5 +21,3 @@
 
 #define IDS_SNDVOL32 100
 #define IDS_NOMIXERDEVICES 101
-
-#endif /* __SNDVOL_RESOURCES_H */
index 4c62a2f..07269a8 100644 (file)
@@ -20,9 +20,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __ABOUT_H
-#define __ABOUT_H
+#pragma once
 
 void   OnAbout(void);
-
-#endif /* __ABOUT_H */
index db0b152..7c93801 100644 (file)
@@ -20,9 +20,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __AFFINITY_H
-#define __AFFINITY_H
+#pragma once
 
 void ProcessPage_OnSetAffinity(void);
-
-#endif /* __AFFINITY_H */
index 82bb4cf..f75a76a 100644 (file)
@@ -20,8 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __APPLICATIONPAGE_H
-#define __APPLICATIONPAGE_H
+#pragma once
 
 extern    HWND        hApplicationPage;                /* Application List Property Page */
 
@@ -43,5 +42,3 @@ void                ApplicationPage_OnWindowsBringToFront(void);
 void                ApplicationPage_OnSwitchTo(void);
 void                ApplicationPage_OnEndTask(void);
 void                ApplicationPage_OnGotoProcess(void);
-
-#endif /* __APPLICATIONPAGE_H */
index 90dc6c4..9aeb3ec 100644 (file)
@@ -20,8 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __COLUMN_H
-#define __COLUMN_H
+#pragma once
 
 #define COLUMN_IMAGENAME            0
 #define COLUMN_PID                  1
@@ -110,5 +109,3 @@ void ProcessPage_OnViewSelectColumns(void);
 void AddColumns(void);
 void SaveColumnSettings(void);
 void UpdateColumnDataHints(void);
-
-#endif /* __COLUMN_H */
index d4ee7ad..8504134 100644 (file)
@@ -20,9 +20,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __DEBUG_H
-#define __DEBUG_H
+#pragma once
 
 void ProcessPage_OnDebug(void);
-
-#endif /* __DEBUG_H */
index 1238177..934a4c1 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __ENDPROC_H
-#define __ENDPROC_H
+#pragma once
 
 void ProcessPage_OnEndProcess(void);
 void ProcessPage_OnEndProcessTree(void);
-
-#endif /* __ENDPROC_H */
index 3dd1ea5..d990f51 100644 (file)
@@ -20,8 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __GRAPH_H
-#define __GRAPH_H
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
@@ -41,5 +40,3 @@ INT_PTR CALLBACK      Graph_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP
 #ifdef __cplusplus
 };
 #endif
-
-#endif /* __GRAPH_H */
index 2d315a3..e924716 100644 (file)
@@ -20,8 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __GRAPH_CTRL_H__
-#define __GRAPH_CTRL_H__
+#pragma once
 
 #define MAX_PLOTS 4
 #define MAX_CTRLS 4
@@ -110,5 +109,3 @@ INT_PTR CALLBACK GraphCtrl_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* __GRAPH_CTRL_H__ */
index 97a3f79..53b9309 100644 (file)
@@ -573,7 +573,7 @@ BEGIN
     ID_FILE_NEW             "Führt ein neues Programm aus."
     ID_OPTIONS_ALWAYSONTOP  "Task-Manager bleibt im Vordergrund, wenn nicht minimiert."
     ID_OPTIONS_MINIMIZEONUSE
-                            "Task-Manager wird minimiert wenn ein SwitchTo-Vorgang durchgeführt wird."
+                            "Task-Manager wird minimiert, wenn ein SwitchTo-Vorgang durchgeführt wird."
     ID_OPTIONS_HIDEWHENMINIMIZED "Blendet den Task-Manager aus, wenn er minimiert ist."
     ID_VIEW_REFRESH         "Veranlasst den Task-Manager zur sofortigen Aktualisierung, unabhängig von der Geschwindigkeitseinstellung."
     ID_VIEW_LARGE           "Zeigt Tasks als große Symbole an."
@@ -596,9 +596,9 @@ BEGIN
     ID_WINDOWS_BRINGTOFRONT "Zeigt das Fenster im Vordergrund an, aber wechselt nicht zu diesem."
     ID_HELP_TOPICS          "Zeigt die Hilfethemen des Taskmanagers an."
     ID_HELP_ABOUT           "Zeigt Programminformationen, Versionsnummer und Copyright an."
-    ID_FILE_EXIT            "Beendet den Task-Manager."
+    ID_FILE_EXIT            "Beendet den Taskmanager."
     ID_OPTIONS_SHOW16BITTASKS
-                            "Zeigt die 16-Bit Tasks unter der zugehörigen ntvdm.exe an."
+                            "Zeigt die 16-Bit-Tasks unter der zugehörigen ntvdm.exe an."
     ID_VIEW_SELECTCOLUMNS   "Legt fest welche Spalten auf der Registerkarte Prozesse angezeigt werden."
     ID_VIEW_SHOWKERNELTIMES "Zeigt die Kernel-Zeiten in den Systemmonitordiagrammen an."
     ID_VIEW_CPUHISTORY_ONEGRAPHALL
@@ -675,7 +675,7 @@ BEGIN
     IDS_MENU_SHOWKERNELTIMES      "&Kernel-Zeiten anzeigen"
     IDS_CREATENEWTASK             "Neuen Task erstellen"
     IDS_CREATENEWTASK_DESC        "Geben Sie Programme, Ordner, Dokumente oder Internetressourcen an, die geöffnet werden sollen."
-    IDS_MSG_ACCESSPROCESSAFF      "Zugriff auf die / Änderung der Prozess Affinität nicht möglich"
+    IDS_MSG_ACCESSPROCESSAFF      "Zugriff auf die / Änderung der Prozessaffinität nicht möglich"
     IDS_MSG_PROCESSONEPRO         "Der Prozess muss eine Zugehörigkeit zu mindestens einem Prozessor aufweisen."
     IDS_MSG_INVALIDOPTION         "Ungültige Auswahl"
     IDS_MSG_UNABLEDEBUGPROCESS    "Kann Prozess nicht debuggen"
index 9312d38..50a8251 100644 (file)
@@ -24,8 +24,7 @@
  * Menu item handlers for the options menu.
  */
 
-#ifndef __OPTNMENU_H
-#define __OPTNMENU_H
+#pragma once
 
 #define OPTIONS_MENU_INDEX    1
 
@@ -33,5 +32,3 @@ void TaskManager_OnOptionsAlwaysOnTop(void);
 void TaskManager_OnOptionsMinimizeOnUse(void);
 void TaskManager_OnOptionsHideWhenMinimized(void);
 void TaskManager_OnOptionsShow16BitTasks(void);
-
-#endif /* __OPTNMENU_H */
index 68661f5..00c2d6d 100644 (file)
@@ -20,8 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __PERFDATA_H
-#define __PERFDATA_H
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
@@ -106,5 +105,3 @@ ULONG       PerfDataGetTotalThreadCount(void);
 #ifdef __cplusplus
 };
 #endif
-
-#endif /* __PERFDATA_H */
index e6ce095..f1e4403 100644 (file)
@@ -20,8 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __PERFORMANCEPAGE_H
-#define __PERFORMANCEPAGE_H
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
@@ -37,5 +36,3 @@ void  PerformancePage_OnViewCPUHistoryOneGraphPerCPU(void);
 #ifdef __cplusplus
 };
 #endif
-
-#endif /* __PERFORMANCEPAGE_H */
index 04bf2b6..5d8f18c 100644 (file)
@@ -20,9 +20,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __PRIORITY_H
-#define __PRIORITY_H
+#pragma once
 
 void DoSetPriority(DWORD priority);
-
-#endif /* __PRIORITY_H */
index 1099f1b..1df2753 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __PROCLIST_H
-#define __PROCLIST_H
+#pragma once
 
 INT_PTR CALLBACK       ProcessListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
 extern WNDPROC         OldProcessListWndProc;
-
-#endif /* __PROCLIST_H */
index ac9a57a..ff244a9 100644 (file)
@@ -20,8 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __PROCESSPAGE_H
-#define __PROCESSPAGE_H
+#pragma once
 
 extern HWND            hProcessPage;                           /* Process List Property Page */
 extern HWND            hProcessPageListCtrl;                   /* Process ListCtrl Window */
@@ -32,5 +31,3 @@ extern        HWND            hProcessPageShowAllProcessesButton;     /* Process Show All Processes c
 INT_PTR CALLBACK       ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
 void                           RefreshProcessPage(void);
 DWORD               GetSelectedProcessId(void);
-
-#endif /* __PROCESSPAGE_H */
index b710364..ef972ff 100644 (file)
@@ -28,8 +28,7 @@
  * jholderness@geocities.com
  */
 
-#ifndef __RUN_H
-#define __RUN_H
+#pragma once
 
 void TaskManager_OnFileNew(void);
 
@@ -50,5 +49,3 @@ UINT    uFlags);
 #define        RFF_CALCDIRECTORY       0x04    /* Calculates the working directory from the file name. */
 #define        RFF_NOLABEL                     0x08    /* Removes the edit box label. */
 #define        RFF_NOSEPARATEMEM       0x20    /* Removes the Separate Memory Space check box (Windows NT only). */
-
-#endif /* __RUN_H */
index 22c0b89..16eaad8 100644 (file)
@@ -20,8 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __TASKMGR_H__
-#define __TASKMGR_H__
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
@@ -124,5 +123,3 @@ LPTSTR GetLastErrorText( LPTSTR lpszBuf, DWORD dwSize );
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* __TASKMGR_H__ */
index f9d4bc5..1b51c55 100644 (file)
@@ -20,8 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __TRAYICON_H
-#define __TRAYICON_H
+#pragma once
 
 #define WM_ONTRAYICON   WM_USER + 5
 
@@ -29,5 +28,3 @@ HICON TrayIcon_GetProcessorUsageIcon(void);
 BOOL   TrayIcon_ShellAddTrayIcon(void);
 BOOL   TrayIcon_ShellRemoveTrayIcon(void);
 BOOL   TrayIcon_ShellUpdateTrayIcon(void);
-
-#endif /* __TRAYICON_H */
index 0ec40ad..2e14f70 100644 (file)
@@ -128,4 +128,3 @@ END
 MENUITEM "Systemfarben verwenden",   MNID_CTXT_SYSTEM_COLORS
 END
 END
-#pragma code_page(default)
index 2199e37..cedb0f6 100644 (file)
@@ -131,4 +131,3 @@ BEGIN
                MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS
        END
 END
-#pragma code_page(default)
index cd16e40..b5c5392 100644 (file)
@@ -89,4 +89,3 @@ STID_FILE_NOT_FOUND_s "Non è stato possibile trovare '%s'. Vuoi cercare questo
 STID_NO_RICHEDIT       "Non è stato possibile trovare un'implementazione richedit... Annullando"
 STID_PSH_INDEX,                "Argomenti di aiuto: "
 }
-#pragma code_page(default)
index a06b5f1..b73d18d 100644 (file)
@@ -128,4 +128,3 @@ BEGIN
                MENUITEM "システム カラーを使う",   MNID_CTXT_SYSTEM_COLORS
        END
 END
-#pragma code_page(default)
index 5ee53f8..f8e7868 100644 (file)
@@ -129,4 +129,3 @@ BEGIN
     MENUITEM "Naudoti sistemos spalvas", MNID_CTXT_SYSTEM_COLORS
   END
 END
-#pragma code_page(default)
index a793840..029d582 100644 (file)
@@ -127,4 +127,3 @@ BEGIN
                MENUITEM "Gebruik systeem kleuren",   MNID_CTXT_SYSTEM_COLORS
        END
 END
-#pragma code_page(default)
index 5598bd7..28933a2 100644 (file)
@@ -204,4 +204,3 @@ BEGIN
                MENUITEM "Usar cores do sistema",   MNID_CTXT_SYSTEM_COLORS
        END
 END
-#pragma code_page(default)
index 1729387..3b2a1fa 100644 (file)
@@ -92,4 +92,3 @@ STID_FILE_NOT_FOUND_s   "Cannot find '%s'. Do you want to find this file yoursel
 STID_NO_RICHEDIT       "Cannot find a richedit implementation... Aborting"
 STID_PSH_INDEX,                "Help topics: "
 }
-#pragma code_page(default)
index eaa530b..1f916ac 100644 (file)
@@ -130,4 +130,3 @@ BEGIN
     MENUITEM "Utilizează culorile sistemului", MNID_CTXT_SYSTEM_COLORS
   END
 END
-#pragma code_page(default)
index a476b34..165094f 100644 (file)
@@ -121,4 +121,3 @@ BEGIN
                MENUITEM "Использовать системные цвета",   MNID_CTXT_SYSTEM_COLORS
        END
 END
-#pragma code_page(default)
index 310ef45..527b454 100644 (file)
@@ -126,4 +126,3 @@ BEGIN
                MENUITEM "Uporabi sistemske barve",   MNID_CTXT_SYSTEM_COLORS
        END
 END
-#pragma code_page(default)
index a68b699..ed20356 100644 (file)
@@ -160,4 +160,3 @@ STID_FILE_NOT_FOUND_s       "不能開啟檔案 '%s'. 你想要自己找這個檔案
 STID_NO_RICHEDIT       "找不到 richedit... 終止"
 STID_PSH_INDEX,                "幫助內容: "
 }
-#pragma code_page(default)
index e45fc8a..28d8de3 100644 (file)
@@ -27,25 +27,27 @@ IDI_WINHELP ICON DISCARDABLE winhelp.ico
 #include "Bg.rc"
 #include "Cs.rc"
 #include "Da.rc"
-#include "De.rc"
 #include "En.rc"
 #include "Es.rc"
 #include "Fi.rc"
-#include "Fr.rc"
 #include "Hu.rc"
+#include "Ko.rc"
+#include "No.rc"
+#include "Pl.rc"
+#include "Sk.rc"
+#include "Sv.rc"
+#include "Tr.rc"
+
+/* UTF-8 */
+#include "De.rc"
+#include "Fr.rc"
 #include "It.rc"
 #include "Ja.rc"
-#include "Ko.rc"
 #include "Lt.rc"
 #include "Nl.rc"
-#include "No.rc"
-#include "Pl.rc"
 #include "Pt.rc"
 #include "Rm.rc"
 #include "Ro.rc"
 #include "Ru.rc"
 #include "Si.rc"
-#include "Sk.rc"
-#include "Sv.rc"
-#include "Tr.rc"
 #include "Zh.rc"
index 3478946..882cca7 100644 (file)
@@ -46,7 +46,7 @@ BEGIN
         MENUITEM "&Fjern\tDEL",               ID_EDIT_CLEAR
         MENUITEM "&Marker alt\tCtrl+A",       ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "&Søg efter...\tCrtl+F",     ID_FIND
+        MENUITEM "&Søg efter...\tCtrl+F",     ID_FIND
         MENUITEM "Søg efter &næste\tF3",      ID_FIND_NEXT
         MENUITEM "E&rstat...\tCtrl+H",        ID_REPLACE
         MENUITEM SEPARATOR
@@ -106,6 +106,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Sort",      ID_COLOR_BLACK
+        MENUITEM "Mørkerød",  ID_COLOR_MAROON
+        MENUITEM "Grøn",      ID_COLOR_GREEN
+        MENUITEM "Oliven"     ID_COLOR_OLIVE
+        MENUITEM "Navy"       ID_COLOR_NAVY
+        MENUITEM "Lilla"      ID_COLOR_PURPLE
+        MENUITEM "Teal"       ID_COLOR_TEAL
+        MENUITEM "Grå"        ID_COLOR_GRAY
+        MENUITEM "Sølv"       ID_COLOR_SILVER
+        MENUITEM "Rød"        ID_COLOR_RED
+        MENUITEM "Lime"       ID_COLOR_LIME
+        MENUITEM "Gul"        ID_COLOR_YELLOW
+        MENUITEM "Blå"        ID_COLOR_BLUE
+        MENUITEM "Violet"     ID_COLOR_FUCHSIA
+        MENUITEM "Cyan"       ID_COLOR_AQUA
+        MENUITEM "Hvid"       ID_COLOR_WHITE
+        MENUITEM "Automatic"  ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Dato og tid"
@@ -218,7 +242,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Forrige side"
     STRING_PREVIEW_TWOPAGES,         "To sider"
     STRING_PREVIEW_ONEPAGE,          "Én side"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "Luk"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
index d552d9c..ca11edd 100644 (file)
@@ -108,6 +108,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Schwarz"        ID_COLOR_BLACK
+        MENUITEM "Kastanienbraun" ID_COLOR_MAROON
+        MENUITEM "Grün"           ID_COLOR_GREEN
+        MENUITEM "Olivgrün"       ID_COLOR_OLIVE
+        MENUITEM "Dunkelblau"     ID_COLOR_NAVY
+        MENUITEM "Lila"           ID_COLOR_PURPLE
+        MENUITEM "Blaugrün"       ID_COLOR_TEAL
+        MENUITEM "Grau"           ID_COLOR_GRAY
+        MENUITEM "Silber"         ID_COLOR_SILVER
+        MENUITEM "Rot"            ID_COLOR_RED
+        MENUITEM "Hellgrün"       ID_COLOR_LIME
+        MENUITEM "Gelb"           ID_COLOR_YELLOW
+        MENUITEM "Blau"           ID_COLOR_BLUE
+        MENUITEM "Pink"           ID_COLOR_FUCHSIA
+        MENUITEM "Aquamarin"      ID_COLOR_AQUA
+        MENUITEM "Weiß"           ID_COLOR_WHITE
+        MENUITEM "Automatic"      ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Datum und Uhrzeit"
@@ -218,9 +242,13 @@ BEGIN
     STRING_PREVIEW_PRINT,            "&Drucken"
     STRING_PREVIEW_NEXTPAGE,         "&Nächste"
     STRING_PREVIEW_PREVPAGE,         "&Vorherige"
-    STRING_PREVIEW_TWOPAGES,         "Zwei Seiten"
-    STRING_PREVIEW_ONEPAGE,          "Eine Seite"
+    STRING_PREVIEW_TWOPAGES,         "&Zwei Seiten"
+    STRING_PREVIEW_ONEPAGE,          "&Eine Seite"
+    STRING_PREVIEW_ZOOMIN,           "Ver&größern"
+    STRING_PREVIEW_ZOOMOUT,          "Ver&kleinern"
     STRING_PREVIEW_CLOSE,            "&Schließen"
+    STRING_PREVIEW_PAGE,             "Seite"
+    STRING_PREVIEW_PAGES,            "Seiten"
 END
 
 STRINGTABLE DISCARDABLE
@@ -246,4 +274,3 @@ BEGIN
     STRING_PRINTING_NOT_IMPLEMENTED, "Drucken ist nicht implementiert"
     STRING_MAX_TAB_STOPS,            "Es können nur maximal 32 Tabstopps definiert werden."
 END
-#pragma code_page(default)
index b6ade3a..0dec19b 100644 (file)
@@ -46,7 +46,7 @@ BEGIN
         MENUITEM "&Clear\tDEL",                 ID_EDIT_CLEAR
         MENUITEM "&Select all\tCtrl+A",         ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "&Find...\tCrtl+F",            ID_FIND
+        MENUITEM "&Find...\tCtrl+F",            ID_FIND
         MENUITEM "Find &next\tF3",              ID_FIND_NEXT
         MENUITEM "&Replace...\tCtrl+H",         ID_REPLACE
         MENUITEM SEPARATOR
@@ -106,6 +106,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Black",      ID_COLOR_BLACK
+        MENUITEM "Maroon",     ID_COLOR_MAROON
+        MENUITEM "Green",      ID_COLOR_GREEN
+        MENUITEM "Olive"       ID_COLOR_OLIVE
+        MENUITEM "Navy"        ID_COLOR_NAVY
+        MENUITEM "Purple"      ID_COLOR_PURPLE
+        MENUITEM "Teal"        ID_COLOR_TEAL
+        MENUITEM "Gray"        ID_COLOR_GRAY
+        MENUITEM "Silver"      ID_COLOR_SILVER
+        MENUITEM "Red"         ID_COLOR_RED
+        MENUITEM "Lime"        ID_COLOR_LIME
+        MENUITEM "Yellow"      ID_COLOR_YELLOW
+        MENUITEM "Blue"        ID_COLOR_BLUE
+        MENUITEM "Fuchsia"     ID_COLOR_FUCHSIA
+        MENUITEM "Aqua"        ID_COLOR_AQUA
+        MENUITEM "White"       ID_COLOR_WHITE
+        MENUITEM "Automatic"   ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Date and time"
@@ -210,7 +234,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Previous page"
     STRING_PREVIEW_TWOPAGES,         "Two pages"
     STRING_PREVIEW_ONEPAGE,          "One page"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "Close"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
     STRING_UNITS_CM,                 "cm"
 END
 
index 3b51828..54ae0b9 100644 (file)
@@ -49,7 +49,7 @@ BEGIN
         MENUITEM "&Effacer\tDel",                   ID_EDIT_CLEAR
         MENUITEM "&Sélectionner tout\tCtrl+A",      ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "&Rechercher...\tCrtl+F",             ID_FIND
+        MENUITEM "&Rechercher...\tCtrl+F",             ID_FIND
         MENUITEM "Rechercher le &suivant\tF3",                  ID_FIND_NEXT
         MENUITEM "&Remplacer...\tCtrl+H",          ID_REPLACE
         MENUITEM SEPARATOR
@@ -109,6 +109,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Noir"        ID_COLOR_BLACK
+        MENUITEM "Marron"      ID_COLOR_MAROON
+        MENUITEM "Vert"        ID_COLOR_GREEN
+        MENUITEM "Olive"       ID_COLOR_OLIVE
+        MENUITEM "Bleu marine" ID_COLOR_NAVY
+        MENUITEM "Pourpre"     ID_COLOR_PURPLE
+        MENUITEM "Sarcelle"    ID_COLOR_TEAL
+        MENUITEM "Gris"        ID_COLOR_GRAY
+        MENUITEM "Argent"      ID_COLOR_SILVER
+        MENUITEM "Rouge"       ID_COLOR_RED
+        MENUITEM "Citron vert" ID_COLOR_LIME
+        MENUITEM "Jaune"       ID_COLOR_YELLOW
+        MENUITEM "Bleu"        ID_COLOR_BLUE
+        MENUITEM "Fuchsia"     ID_COLOR_FUCHSIA
+        MENUITEM "Eau"         ID_COLOR_AQUA
+        MENUITEM "Blanc"       ID_COLOR_WHITE
+        MENUITEM "Automatic"   ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Date et heure"
@@ -221,7 +245,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Page précédente"
     STRING_PREVIEW_TWOPAGES,         "Deux pages"
     STRING_PREVIEW_ONEPAGE,          "Une page"
+    STRING_PREVIEW_ZOOMIN,           "Zoom avant"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom arrière"
     STRING_PREVIEW_CLOSE,            "Fermer"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
@@ -247,4 +275,3 @@ BEGIN
     STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implémentée"
     STRING_MAX_TAB_STOPS,             "Impossible d'ajouter plus de 32 taquets de tabulation."
 END
-#pragma code_page(default)
index 74926e1..3694062 100644 (file)
@@ -46,7 +46,7 @@ BEGIN
         MENUITEM "Tör&lés\tDel",                ID_EDIT_CLEAR
         MENUITEM "M&indet kijelöli\tCtrl+A",    ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "&Find...\tCrtl+F",         ID_FIND
+        MENUITEM "&Find...\tCtrl+F",         ID_FIND
         MENUITEM "Find &next\tF3",              ID_FIND_NEXT
         MENUITEM "&Replace...\tCtrl+H",      ID_REPLACE
         MENUITEM SEPARATOR
@@ -106,6 +106,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Black",      ID_COLOR_BLACK
+        MENUITEM "Maroon",     ID_COLOR_MAROON
+        MENUITEM "Green",      ID_COLOR_GREEN
+        MENUITEM "Olive"       ID_COLOR_OLIVE
+        MENUITEM "Navy"        ID_COLOR_NAVY
+        MENUITEM "Purple"      ID_COLOR_PURPLE
+        MENUITEM "Teal"        ID_COLOR_TEAL
+        MENUITEM "Gray"        ID_COLOR_GRAY
+        MENUITEM "Silver"      ID_COLOR_SILVER
+        MENUITEM "Red"         ID_COLOR_RED
+        MENUITEM "Lime"        ID_COLOR_LIME
+        MENUITEM "Yellow"      ID_COLOR_YELLOW
+        MENUITEM "Blue"        ID_COLOR_BLUE
+        MENUITEM "Fuchsia"     ID_COLOR_FUCHSIA
+        MENUITEM "Aqua"        ID_COLOR_AQUA
+        MENUITEM "White"       ID_COLOR_WHITE
+        MENUITEM "Automatic"   ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Date and time"
@@ -218,7 +242,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Previous page"
     STRING_PREVIEW_TWOPAGES,         "Two pages"
     STRING_PREVIEW_ONEPAGE,          "One page"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "Close"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
diff --git a/reactos/base/applications/wordpad/It.rc b/reactos/base/applications/wordpad/It.rc
new file mode 100644 (file)
index 0000000..9996841
--- /dev/null
@@ -0,0 +1,266 @@
+/* Italian resource for Wine WordPad
+ *
+ * Copyright 2010 by Luca Bennati
+ *
+ * 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 "wordpad.h"
+
+/*UTF-8*/
+#pragma code_page(65001)
+
+LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
+
+IDM_MAINMENU MENU DISCARDABLE
+BEGIN
+    POPUP "&File"
+    BEGIN
+        MENUITEM "&Nuovo...\tCtrl+N",       ID_FILE_NEW
+        MENUITEM "&Apri...\tCtrl+O",      ID_FILE_OPEN
+        MENUITEM "&Salva\tCtrl+S",         ID_FILE_SAVE
+        MENUITEM "Salva &come...",           ID_FILE_SAVEAS
+        MENUITEM SEPARATOR
+        MENUITEM "&Stampa...\tCtrl+P",     ID_PRINT
+        MENUITEM "An&teprima di stampa...",     ID_PREVIEW
+        MENUITEM "&Impostazioni di stampa...",        ID_PRINTSETUP
+        MENUITEM SEPARATOR
+        MENUITEM "E&sci",                 ID_FILE_EXIT
+    END
+    POPUP "&Modifica"
+    BEGIN
+        MENUITEM "&Annulla\tCtrl+Z",               ID_EDIT_UNDO
+        MENUITEM "&Rifai\tCtrl+Y",               ID_EDIT_REDO
+        MENUITEM SEPARATOR
+        MENUITEM "&Taglia\tCtrl+X",                ID_EDIT_CUT
+        MENUITEM "&Copia\tCtrl+C",               ID_EDIT_COPY
+        MENUITEM "&Incolla\tCtrl+V",              ID_EDIT_PASTE
+        MENUITEM "Ca&ncella\tDEL",                 ID_EDIT_CLEAR
+        MENUITEM "&Seleziona tutto\tCtrl+A",         ID_EDIT_SELECTALL
+        MENUITEM SEPARATOR
+        MENUITEM "T&rova...\tCtrl+F",            ID_FIND
+        MENUITEM "Trova s&uccessivo\tF3",              ID_FIND_NEXT
+        MENUITEM "S&ostituisci...\tCtrl+H",         ID_REPLACE
+        MENUITEM SEPARATOR
+        MENUITEM "Sola &Lettura",                  ID_EDIT_READONLY
+        MENUITEM "&Modificato",                   ID_EDIT_MODIFIED
+        MENUITEM SEPARATOR
+        POPUP "E&xtra"
+        BEGIN
+            MENUITEM "&Informazioni sulla selezione",             ID_EDIT_SELECTIONINFO
+            MENUITEM "&Formato del carattere",           ID_EDIT_CHARFORMAT
+            MENUITEM "Formato del &def. char",           ID_EDIT_DEFCHARFORMAT
+            MENUITEM "Formato del &paragrafo",           ID_EDIT_PARAFORMAT
+            MENUITEM "&Ricava il testo",                   ID_EDIT_GETTEXT
+        END
+    END
+    POPUP "&Visualizza"
+    BEGIN
+        MENUITEM "Barra degli &strumenti",        ID_TOGGLE_TOOLBAR
+        MENUITEM "Barra del &formato",      ID_TOGGLE_FORMATBAR
+        MENUITEM "&Righello",          ID_TOGGLE_RULER
+        MENUITEM "Barra dello s&tato",      ID_TOGGLE_STATUSBAR
+        MENUITEM SEPARATOR
+        MENUITEM "&Opzioni...",     ID_VIEWPROPERTIES
+    END
+    POPUP "&Inserisci"
+    BEGIN
+        MENUITEM "&Data e ora...",  ID_DATETIME
+    END
+    POPUP "F&ormato"
+    BEGIN
+        MENUITEM "&Font...",                     ID_FONTSETTINGS
+        MENUITEM "&Elenco"                ID_BULLET
+        MENUITEM "&Paragrafo..."                 ID_PARAFORMAT
+        MENUITEM "&Tabulazioni..."                      ID_TABSTOPS
+        POPUP "Sfon&do"
+        BEGIN
+            MENUITEM "Di &sistema\tCtrl+1",         ID_BACK_1
+            MENUITEM "&Giallo di PostThat\tCtrl+2",           ID_BACK_2
+        END
+    END
+    POPUP "&Aiuto"
+    BEGIN
+        MENUITEM "&Su Wine Wordpad"       ID_ABOUT
+    END
+END
+
+IDM_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "&Taglia",                ID_EDIT_CUT
+        MENUITEM "&Copia",               ID_EDIT_COPY
+        MENUITEM "&Incolla",              ID_EDIT_PASTE
+        MENUITEM SEPARATOR
+        MENUITEM "&Elenco"       ID_BULLET
+        MENUITEM "&Paragrafo..."        ID_PARAFORMAT
+    END
+END
+
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Nero"              ID_COLOR_BLACK
+        MENUITEM "Marrone rossiccio" ID_COLOR_MAROON
+        MENUITEM "Verde"             ID_COLOR_GREEN
+        MENUITEM "Verde oliva"       ID_COLOR_OLIVE
+        MENUITEM "Blu oltremare"     ID_COLOR_NAVY
+        MENUITEM "Propora"           ID_COLOR_PURPLE
+        MENUITEM "Teal"              ID_COLOR_TEAL
+        MENUITEM "Grigio"            ID_COLOR_GRAY
+        MENUITEM "Argento"           ID_COLOR_SILVER
+        MENUITEM "Rosso"             ID_COLOR_RED
+        MENUITEM "Verde cedro"       ID_COLOR_LIME
+        MENUITEM "Giallo"            ID_COLOR_YELLOW
+        MENUITEM "Blu"               ID_COLOR_BLUE
+        MENUITEM "Fucsia"            ID_COLOR_FUCHSIA
+        MENUITEM "Aqua"              ID_COLOR_AQUA
+        MENUITEM "Bianco"            ID_COLOR_WHITE
+        MENUITEM "Automatic"         ID_COLOR_AUTOMATIC
+    END
+END
+
+IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "Data e ora"
+FONT 10, "MS Sans Serif"
+BEGIN
+    LTEXT        "Formati disponibili",-1,3,2,100,15
+    LISTBOX      IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY
+    PUSHBUTTON   "&OK",IDOK,87,12,40,12
+    PUSHBUTTON   "&Annulla",IDCANCEL,87,26,40,12
+END
+
+IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "Nuovo"
+FONT 10, "MS Sans Serif"
+BEGIN
+    LTEXT        "Nuovo tipo di documento",-1,3,2,100,15
+    LISTBOX      IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT
+    PUSHBUTTON   "&OK",IDOK,97,12,40,12
+    PUSHBUTTON   "&Annulla",IDCANCEL,97,26,40,12
+END
+
+IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+Caption "Formato del paragrafo"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Indentazione", -1, 10, 10, 120, 68
+    LTEXT "Sinistra", -1, 15, 22, 40, 13
+    EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13
+    LTEXT "Destra", -1, 15, 40, 40, 13
+    EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13
+    LTEXT "Prima riga", -1, 15, 58, 40, 13
+    EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13
+    LTEXT "Allineamento", -1, 15, 87, 45, 13
+    COMBOBOX IDC_PARA_ALIGN, 60, 85, 60, 60, CBS_DROPDOWNLIST
+    PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15
+    PUSHBUTTON "&Annulla", IDCANCEL, 137, 33, 50, 15
+END
+
+IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+Caption "Tabulazioni"
+FONT 8, "MS SHell DLg"
+BEGIN
+    GROUPBOX "Punti di fermata delle tabulazioni", -1, 10, 10, 120, 90
+    COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE
+    DEFPUSHBUTTON "&Aggiungi", ID_TAB_ADD, 20, 80, 45, 15
+    PUSHBUTTON "&Rimuovi", ID_TAB_DEL, 72, 80, 45, 15
+    PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15
+    PUSHBUTTON "&Annulla", IDCANCEL, 137, 33, 50, 15
+    PUSHBUTTON "Rimuovi &tutti", ID_TAB_EMPTY, 137, 51, 50, 15
+END
+
+IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 310, 110
+STYLE DS_SYSMODAL
+Caption ""
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Linea di margine", -1, 10, 10, 150, 85
+    RADIOBUTTON "&Nessuna linea di margine", IDC_PAGEFMT_WN, 18, 25, 140, 15
+    RADIOBUTTON "Confina il testo nel &bordo della finestra", IDC_PAGEFMT_WW, 18, 45, 140, 15
+    RADIOBUTTON "Confina il testo nel &margine", IDC_PAGEFMT_WM, 18, 65, 140, 15
+    GROUPBOX "Barre", -1, 170, 10, 120, 85
+    CHECKBOX "Barra degli &strumenti", IDC_PAGEFMT_TB, 180, 20, 80, 15
+    CHECKBOX "Barra del &formato", IDC_PAGEFMT_FB, 180, 38, 80, 15
+    CHECKBOX "&Righello", IDC_PAGEFMT_RU, 180, 56, 80, 15
+    CHECKBOX "Barra dello s&tato", IDC_PAGEFMT_SB, 180, 74, 80, 15
+    LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_ALL_FILES,              "Tutti i files (*.*)"
+    STRING_TEXT_FILES_TXT,         "Files di testo (*.txt)"
+    STRING_TEXT_FILES_UNICODE_TXT, "Files di testo Unicode (*.txt)"
+    STRING_RICHTEXT_FILES_RTF,     "Rich text format (*.rtf)"
+    STRING_NEWFILE_RICHTEXT,       "Documento Rich text"
+    STRING_NEWFILE_TXT,            "Documento di testo"
+    STRING_NEWFILE_TXT_UNICODE,    "Documento di testo Unicode"
+    STRING_PRINTER_FILES_PRN,      "File di stampa (*.PRN)"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_ALIGN_LEFT,            "Sinistra"
+    STRING_ALIGN_RIGHT,           "Destra"
+    STRING_ALIGN_CENTER,          "Centro"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_VIEWPROPS_TITLE,          "Opzioni"
+    STRING_VIEWPROPS_TEXT,           "Testo"
+    STRING_VIEWPROPS_RICHTEXT,       "Rich text"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_PREVIEW_PRINT,            "Stampa"
+    STRING_PREVIEW_NEXTPAGE,         "Prossima pagina"
+    STRING_PREVIEW_PREVPAGE,         "Pagina precedente"
+    STRING_PREVIEW_TWOPAGES,         "Due pagine"
+    STRING_PREVIEW_ONEPAGE,          "Una pagina"
+    STRING_PREVIEW_ZOOMIN,           "Ingrandisci"
+    STRING_PREVIEW_ZOOMOUT,          "Rimpicciolisci"
+    STRING_PREVIEW_CLOSE,            "Chiudi"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
+    STRING_UNITS_CM,                 "cm"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_DEFAULT_FILENAME,     "Documento"
+    STRING_PROMPT_SAVE_CHANGES,  "Salva i cambiamenti su '%s'?"
+    STRING_SEARCH_FINISHED,      "Finita la ricerca sul documento."
+    STRING_LOAD_RICHED_FAILED,   "Impossibile caricare la libreria RichEdit."
+    STRING_SAVE_LOSEFORMATTING,  "Hai scelto di salvare nel formato Testo semplice, " \
+                                 "che causerà la perdita di tutta la formattazione. " \
+                                 "Sei sicuro?"
+    STRING_INVALID_NUMBER,       "Numero di formato non valido"
+    STRING_OLE_STORAGE_NOT_SUPPORTED, "I documenti di storage OLE non sono supportati"
+    STRING_WRITE_FAILED,              "Impossibile salvare il file."
+    STRING_WRITE_ACCESS_DENIED,       "Non hai i diritti di accesso per salvare il file."
+    STRING_OPEN_FAILED,               "Impossibile aprire il file."
+    STRING_OPEN_ACCESS_DENIED,        "Non hai i diritti di accesso per aprire il file."
+    STRING_PRINTING_NOT_IMPLEMENTED,  "Stampa non  implementata"
+    STRING_MAX_TAB_STOPS,             "Non si possono aggiungere più di 32 punti di fermata delle tabulazioni."
+END
index 6e08b56..bd5e4c9 100644 (file)
@@ -49,7 +49,7 @@ BEGIN
         MENUITEM "クリア(&C)\tDEL",             ID_EDIT_CLEAR
         MENUITEM "すべて選択(&S)\tCtrl+A",      ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "検索(&F)...\tCrtl+F",         ID_FIND
+        MENUITEM "検索(&F)...\tCtrl+F",         ID_FIND
         MENUITEM "次を検索(&N)\tF3",            ID_FIND_NEXT
         MENUITEM "置換(&R)...\tCtrl+H",         ID_REPLACE
         MENUITEM SEPARATOR
@@ -109,6 +109,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "黒"       ID_COLOR_BLACK
+        MENUITEM "茶色"     ID_COLOR_MAROON
+        MENUITEM "緑"       ID_COLOR_GREEN
+        MENUITEM "オリーブ" ID_COLOR_OLIVE
+        MENUITEM "紺"       ID_COLOR_NAVY
+        MENUITEM "紫"       ID_COLOR_PURPLE
+        MENUITEM "青緑"     ID_COLOR_TEAL
+        MENUITEM "灰色"     ID_COLOR_GRAY
+        MENUITEM "銀色"     ID_COLOR_SILVER
+        MENUITEM "赤"       ID_COLOR_RED
+        MENUITEM "黄緑"     ID_COLOR_LIME
+        MENUITEM "黄"       ID_COLOR_YELLOW
+        MENUITEM "青"       ID_COLOR_BLUE
+        MENUITEM "赤紫"     ID_COLOR_FUCHSIA
+        MENUITEM "水色"     ID_COLOR_AQUA
+        MENUITEM "白"       ID_COLOR_WHITE
+        MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "日付と時刻"
@@ -221,7 +245,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "前のページ"
     STRING_PREVIEW_TWOPAGES,         "2ページ"
     STRING_PREVIEW_ONEPAGE,          "1ページ"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "閉じる"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
@@ -247,4 +275,3 @@ BEGIN
     STRING_PRINTING_NOT_IMPLEMENTED,  "プリントが実装されていません。"
     STRING_MAX_TAB_STOPS,             "32以上なタブを追加できません。"
 END
-#pragma code_page(default)
index 2e460af..8111083 100644 (file)
@@ -47,7 +47,7 @@ BEGIN
         MENUITEM "Áö¿ì±â(&C)\tDEL",                 ID_EDIT_CLEAR
         MENUITEM "¸ðµÎ ¼±ÅÃ(&S)\tCtrl+A",         ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "ã±â(&F)...\tCrtl+F",         ID_FIND
+        MENUITEM "ã±â(&F)...\tCtrl+F",         ID_FIND
         MENUITEM "´ÙÀ½ Ã£±â(&N)\tF3",              ID_FIND_NEXT
        MENUITEM " ¹Ù²Ù±â(&R)...\tCtrl+H",      ID_REPLACE
         MENUITEM SEPARATOR
@@ -107,6 +107,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "°ËÁ¤"          ID_COLOR_BLACK
+        MENUITEM "¹ã»ö"          ID_COLOR_MAROON
+        MENUITEM "³ì»ö"          ID_COLOR_GREEN
+        MENUITEM "¿Ã¸®ºê»ö"      ID_COLOR_OLIVE
+        MENUITEM "£Àº ³²»ö"     ID_COLOR_NAVY
+        MENUITEM "½ÉÈ«»ö"        ID_COLOR_PURPLE
+        MENUITEM "°ËÀº ¹°¿À¸®»ö" ID_COLOR_TEAL
+        MENUITEM "ȸ»ö"          ID_COLOR_GRAY
+        MENUITEM "Àº»ö"          ID_COLOR_SILVER
+        MENUITEM "»¡°­"          ID_COLOR_RED
+        MENUITEM "¶óÀÓ»ö"        ID_COLOR_LIME
+        MENUITEM "³ë¶û"          ID_COLOR_YELLOW
+        MENUITEM "ÆĶû"          ID_COLOR_BLUE
+        MENUITEM "ÀÚÈ«»ö"        ID_COLOR_FUCHSIA
+        MENUITEM "¹°»ö"          ID_COLOR_AQUA
+        MENUITEM "ÇϾç"          ID_COLOR_WHITE
+        MENUITEM "ÀÚµ¿"     ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "³¯Â¥¿Í ½Ã°£"
@@ -212,8 +236,12 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "ÀÌÀü ÆäÀÌÁö"
     STRING_PREVIEW_TWOPAGES,         "µÎ ÆäÀÌÁö"
     STRING_PREVIEW_ONEPAGE,          "ÇÑ ÆäÀÌÁö"
+    STRING_PREVIEW_ZOOMIN,           "È®´ë"
+    STRING_PREVIEW_ZOOMOUT,          "Ãà¼Ò"
     STRING_PREVIEW_CLOSE,            "´Ý±â"
-    STRING_UNITS_CM,             "cm"
+    STRING_PREVIEW_PAGE,             "ÆäÀÌÁö"
+    STRING_PREVIEW_PAGES,            "ÆäÀÌÁöµé"
+    STRING_UNITS_CM,                 "cm"
 END
 
 STRINGTABLE DISCARDABLE
index e1781eb..c9f2571 100644 (file)
@@ -49,7 +49,7 @@ BEGIN
         MENUITEM "&Šalinti\tDEL",                   ID_EDIT_CLEAR
         MENUITEM "&Pažymėti viską\tCtrl+A",         ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "I&eškoti...\tCrtl+F",             ID_FIND
+        MENUITEM "I&eškoti...\tCtrl+F",             ID_FIND
         MENUITEM "Iešk&oti kito\tF3",               ID_FIND_NEXT
         MENUITEM "Pa&keisti...\tCtrl+H",            ID_REPLACE
         MENUITEM SEPARATOR
@@ -109,6 +109,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Juoda"          ID_COLOR_BLACK
+        MENUITEM "Kaštoninė"      ID_COLOR_MAROON
+        MENUITEM "Žalia"          ID_COLOR_GREEN
+        MENUITEM "Alyvinė"        ID_COLOR_OLIVE
+        MENUITEM "Ultramarinas"   ID_COLOR_NAVY
+        MENUITEM "Purpurinė"      ID_COLOR_PURPLE
+        MENUITEM "Neutrali ciano" ID_COLOR_TEAL
+        MENUITEM "Pilka"          ID_COLOR_GRAY
+        MENUITEM "Sidabrinė"      ID_COLOR_SILVER
+        MENUITEM "Raudona"        ID_COLOR_RED
+        MENUITEM "Gelsvai žalsva" ID_COLOR_LIME
+        MENUITEM "Geltona"        ID_COLOR_YELLOW
+        MENUITEM "Mėlyna"         ID_COLOR_BLUE
+        MENUITEM "Fuksija"        ID_COLOR_FUCHSIA
+        MENUITEM "Žydra"          ID_COLOR_AQUA
+        MENUITEM "Balta"          ID_COLOR_WHITE
+        MENUITEM "Automatic"      ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Data ir laikas"
@@ -221,7 +245,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Ankstesnis puslapis"
     STRING_PREVIEW_TWOPAGES,         "Du puslapiai"
     STRING_PREVIEW_ONEPAGE,          "Vienas puslapis"
+    STRING_PREVIEW_ZOOMIN,           "Didinti"
+    STRING_PREVIEW_ZOOMOUT,          "Mažinti"
     STRING_PREVIEW_CLOSE,            "Užverti"
+    STRING_PREVIEW_PAGE,             "Puslapis"
+    STRING_PREVIEW_PAGES,            "Puslapiai"
 END
 
 STRINGTABLE DISCARDABLE
@@ -247,4 +275,3 @@ BEGIN
     STRING_PRINTING_NOT_IMPLEMENTED,  "Spausdinimas nerealizuotas"
     STRING_MAX_TAB_STOPS,             "Negalima pridėti daugiau negu 32-jų tabuliavimo pozicijų."
 END
-#pragma code_page(default)
index 10729e4..5741dbe 100644 (file)
@@ -47,7 +47,7 @@ BEGIN
         MENUITEM "&Verwijderen\tDel",           ID_EDIT_CLEAR
         MENUITEM "&Alles selecteren\tCtrl+A",   ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "&Zoeken...\tCrtl+F",            ID_FIND
+        MENUITEM "&Zoeken...\tCtrl+F",            ID_FIND
         MENUITEM "Zoek vo&lgende\tF3",              ID_FIND_NEXT
         MENUITEM "Ve&rvang...\tCtrl+H",         ID_REPLACE
         MENUITEM SEPARATOR
@@ -107,6 +107,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Zwart"         ID_COLOR_BLACK
+        MENUITEM "Kastanjebruin" ID_COLOR_MAROON
+        MENUITEM "Groen"         ID_COLOR_GREEN
+        MENUITEM "Olijfgroen"    ID_COLOR_OLIVE
+        MENUITEM "Marineblauw"   ID_COLOR_NAVY
+        MENUITEM "Paars"         ID_COLOR_PURPLE
+        MENUITEM "Groenblauw"    ID_COLOR_TEAL
+        MENUITEM "Grijs"         ID_COLOR_GRAY
+        MENUITEM "Zilver"        ID_COLOR_SILVER
+        MENUITEM "Rood"          ID_COLOR_RED
+        MENUITEM "Lichtgroen"    ID_COLOR_LIME
+        MENUITEM "Geel"          ID_COLOR_YELLOW
+        MENUITEM "Blauw"         ID_COLOR_BLUE
+        MENUITEM "Fuchsiapaars"  ID_COLOR_FUCHSIA
+        MENUITEM "Zeeblauw"      ID_COLOR_AQUA
+        MENUITEM "Wit"           ID_COLOR_WHITE
+        MENUITEM "Automatic"     ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Datum en tijd"
@@ -211,7 +235,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Vorige pagina"
     STRING_PREVIEW_TWOPAGES,         "Twee pagina's"
     STRING_PREVIEW_ONEPAGE,          "Een pagina"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "Sluiten"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
index 4409c30..fbca2a0 100644 (file)
@@ -48,7 +48,7 @@ BEGIN
         MENUITEM "&Fjern\tDEL",               ID_EDIT_CLEAR
         MENUITEM "&Merk alt\tCtrl+A",         ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "&Søk etter...\tCrtl+F",  ID_FIND
+        MENUITEM "&Søk etter...\tCtrl+F",  ID_FIND
         MENUITEM "Søk etter &neste\tF3",      ID_FIND_NEXT
         MENUITEM "E&rstatt...\tCtrl+H",    ID_REPLACE
         MENUITEM SEPARATOR
@@ -108,6 +108,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Svart"      ID_COLOR_BLACK
+        MENUITEM "Rødbrun"    ID_COLOR_MAROON
+        MENUITEM "Grønn"      ID_COLOR_GREEN
+        MENUITEM "Oliven"     ID_COLOR_OLIVE
+        MENUITEM "Marineblå"  ID_COLOR_NAVY
+        MENUITEM "Purpur"     ID_COLOR_PURPLE
+        MENUITEM "Teal"       ID_COLOR_TEAL
+        MENUITEM "Grå"        ID_COLOR_GRAY
+        MENUITEM "Sølv"       ID_COLOR_SILVER
+        MENUITEM "Rød"        ID_COLOR_RED
+        MENUITEM "Lime-grønn" ID_COLOR_LIME
+        MENUITEM "Gul"        ID_COLOR_YELLOW
+        MENUITEM "Blå"        ID_COLOR_BLUE
+        MENUITEM "Fuchsia"    ID_COLOR_FUCHSIA
+        MENUITEM "Aqua"       ID_COLOR_AQUA
+        MENUITEM "Hvit"       ID_COLOR_WHITE
+        MENUITEM "Automatic"  ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Dato og klokkeslett"
@@ -220,7 +244,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Forrige side"
     STRING_PREVIEW_TWOPAGES,         "To sider"
     STRING_PREVIEW_ONEPAGE,          "Én side"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "Lukk"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
@@ -246,4 +274,3 @@ BEGIN
     STRING_PRINTING_NOT_IMPLEMENTED,  "Utskriftfunksjonen er ikke laget ennå."
     STRING_MAX_TAB_STOPS,             "Kan ikke legge til mer enn 32 tabulatorstopp."
 END
-#pragma code_page(default)
index ab72104..4d40304 100644 (file)
@@ -47,7 +47,7 @@ BEGIN
         MENUITEM "&Usuñ\tDel",                    ID_EDIT_CLEAR
         MENUITEM "&Zaznacz wszystko\tCtrl+A",         ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "Znaj&d\9f...\tCrtl+F",           ID_FIND
+        MENUITEM "Znaj&d\9f...\tCtrl+F",           ID_FIND
         MENUITEM "Z&najd\9f nastêpny\tF3",                ID_FIND_NEXT
         MENUITEM "Za&mieñ...\tCtrl+H",        ID_REPLACE
         MENUITEM SEPARATOR
@@ -107,6 +107,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Czarny"       ID_COLOR_BLACK
+        MENUITEM "Kasztanowy"   ID_COLOR_MAROON
+        MENUITEM "Zielony"      ID_COLOR_GREEN
+        MENUITEM "Oliwkowy"     ID_COLOR_OLIVE
+        MENUITEM "Granatowy"    ID_COLOR_NAVY
+        MENUITEM "Purpurowy"    ID_COLOR_PURPLE
+        MENUITEM "Zielonomodry" ID_COLOR_TEAL
+        MENUITEM "Szary"        ID_COLOR_GRAY
+        MENUITEM "Srebrny"      ID_COLOR_SILVER
+        MENUITEM "Czerwony"     ID_COLOR_RED
+        MENUITEM "Limonowy"     ID_COLOR_LIME
+        MENUITEM "¯ó³ty"        ID_COLOR_YELLOW
+        MENUITEM "Niebieski"    ID_COLOR_BLUE
+        MENUITEM "Fuksja"       ID_COLOR_FUCHSIA
+        MENUITEM "Akwamaryna"   ID_COLOR_AQUA
+        MENUITEM "Bia³y"        ID_COLOR_WHITE
+        MENUITEM "Automatic"    ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Data i godzina"
@@ -219,7 +243,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Poprz. strona"
     STRING_PREVIEW_TWOPAGES,         "Two pages"
     STRING_PREVIEW_ONEPAGE,          "One page"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "Zamknij"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
index b932372..2a2ae4b 100644 (file)
@@ -50,7 +50,7 @@ BEGIN
         MENUITEM "&Limpar\tDEL",                 ID_EDIT_CLEAR
         MENUITEM "&Seleccionar tudo\tCtrl+A",         ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "Local&izar...\tCrtl+F",            ID_FIND
+        MENUITEM "Local&izar...\tCtrl+F",            ID_FIND
         MENUITEM "&Encontrar Seguinte\tF3",              ID_FIND_NEXT
         MENUITEM "&Substituir...\tCtrl+H",         ID_REPLACE
         MENUITEM SEPARATOR
@@ -110,6 +110,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Preto"         ID_COLOR_BLACK
+        MENUITEM "Castanho"      ID_COLOR_MAROON
+        MENUITEM "Verde"         ID_COLOR_GREEN
+        MENUITEM "Verde-oliva"   ID_COLOR_OLIVE
+        MENUITEM "Azul-marinho"  ID_COLOR_NAVY
+        MENUITEM "Roxo"          ID_COLOR_PURPLE
+        MENUITEM "Azul-petróleo" ID_COLOR_TEAL
+        MENUITEM "Cinza"         ID_COLOR_GRAY
+        MENUITEM "Prateado"      ID_COLOR_SILVER
+        MENUITEM "Vermelho"      ID_COLOR_RED
+        MENUITEM "Verde-limão"   ID_COLOR_LIME
+        MENUITEM "Amarelo"       ID_COLOR_YELLOW
+        MENUITEM "Azul"          ID_COLOR_BLUE
+        MENUITEM "Fúcsia"        ID_COLOR_FUCHSIA
+        MENUITEM "Azul-piscina"  ID_COLOR_AQUA
+        MENUITEM "Branco"        ID_COLOR_WHITE
+        MENUITEM "Automatic"     ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Data e hora"
@@ -222,7 +246,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Página anterior"
     STRING_PREVIEW_TWOPAGES,         "Duas páginas"
     STRING_PREVIEW_ONEPAGE,          "Uma página"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "Fechar"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
@@ -248,4 +276,3 @@ BEGIN
     STRING_PRINTING_NOT_IMPLEMENTED, "Impressão não implementada"
     STRING_MAX_TAB_STOPS,             "Não pode adicionar mais de 32 tabs."
 END
-#pragma code_page(default)
index 3aeaf66..230003b 100644 (file)
@@ -49,7 +49,7 @@ BEGIN
         MENUITEM "&Удалить\tDEL",               ID_EDIT_CLEAR
         MENUITEM "Выделить в&се\tCtrl+A",       ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "&Найти...\tCrtl+F",           ID_FIND
+        MENUITEM "&Найти...\tCtrl+F",           ID_FIND
         MENUITEM "На&йти далее\tF3",            ID_FIND_NEXT
         MENUITEM "&Заменить...\tCtrl+H",        ID_REPLACE
         MENUITEM SEPARATOR
@@ -109,6 +109,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Чёрный"         ID_COLOR_BLACK
+        MENUITEM "Тёмно-бордовый" ID_COLOR_MAROON
+        MENUITEM "Зелёный"        ID_COLOR_GREEN
+        MENUITEM "Оливковый"      ID_COLOR_OLIVE
+        MENUITEM "Тёмно-синий"    ID_COLOR_NAVY
+        MENUITEM "Пурпурный"      ID_COLOR_PURPLE
+        MENUITEM "Морской волны"  ID_COLOR_TEAL
+        MENUITEM "Серый"          ID_COLOR_GRAY
+        MENUITEM "Серебряный"     ID_COLOR_SILVER
+        MENUITEM "Красный"        ID_COLOR_RED
+        MENUITEM "Лимонный"       ID_COLOR_LIME
+        MENUITEM "Жёлтый"         ID_COLOR_YELLOW
+        MENUITEM "Синий"          ID_COLOR_BLUE
+        MENUITEM "Ярко-розовый"   ID_COLOR_FUCHSIA
+        MENUITEM "Голубой"        ID_COLOR_AQUA
+        MENUITEM "Белый"          ID_COLOR_WHITE
+        MENUITEM "Automatic"      ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Дата и время"
@@ -221,7 +245,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Предыдущая страница"
     STRING_PREVIEW_TWOPAGES,         "Две страницы"
     STRING_PREVIEW_ONEPAGE,          "Одна страница"
+    STRING_PREVIEW_ZOOMIN,           "Приблизить"
+    STRING_PREVIEW_ZOOMOUT,          "Отдалить"
     STRING_PREVIEW_CLOSE,            "Закрыть"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
@@ -247,4 +275,3 @@ BEGIN
     STRING_PRINTING_NOT_IMPLEMENTED, "Печать не поддерживается"
     STRING_MAX_TAB_STOPS,             "Нельзя добавить более 32 позиций табуляции."
 END
-#pragma code_page(default)
index 4fa9cfe..f7e0c72 100644 (file)
@@ -48,7 +48,7 @@ BEGIN
         MENUITEM "Po&briši\tDEL",                 ID_EDIT_CLEAR
         MENUITEM "Izberi &vse\tCtrl+A",         ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "Na&jdi ...\tCrtl+F",         ID_FIND
+        MENUITEM "Na&jdi ...\tCtrl+F",         ID_FIND
         MENUITEM "Najdi n&aslednje\tF3",              ID_FIND_NEXT
         MENUITEM "Za&menjaj ...\tCtrl+H",      ID_REPLACE
         MENUITEM SEPARATOR
@@ -108,6 +108,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Črna"        ID_COLOR_BLACK
+        MENUITEM "Kostanjeva"  ID_COLOR_MAROON
+        MENUITEM "Zelena"      ID_COLOR_GREEN
+        MENUITEM "Olivna"      ID_COLOR_OLIVE
+        MENUITEM "Mornariška"  ID_COLOR_NAVY
+        MENUITEM "Vijolična"   ID_COLOR_PURPLE
+        MENUITEM "Zelenomodra" ID_COLOR_TEAL
+        MENUITEM "Siva"        ID_COLOR_GRAY
+        MENUITEM "Srebrna"     ID_COLOR_SILVER
+        MENUITEM "Rdeča"       ID_COLOR_RED
+        MENUITEM "Citronska"   ID_COLOR_LIME
+        MENUITEM "Rumena"      ID_COLOR_YELLOW
+        MENUITEM "Modra"       ID_COLOR_BLUE
+        MENUITEM "Roza"        ID_COLOR_FUCHSIA
+        MENUITEM "Akvamarin"   ID_COLOR_AQUA
+        MENUITEM "Bela"        ID_COLOR_WHITE
+        MENUITEM "Automatic"   ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Datum in čas"
@@ -220,7 +244,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Prejšnja"
     STRING_PREVIEW_TWOPAGES,         "Dve strani"
     STRING_PREVIEW_ONEPAGE,          "Ena stran"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "Zapri"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
@@ -247,4 +275,3 @@ BEGIN
     STRING_PRINTING_NOT_IMPLEMENTED,  "Tiskanje (še) ni na voljo"
     STRING_MAX_TAB_STOPS,             "Ne morem vstaviti več kot 32 položajev tabulatorja."
 END
-#pragma code_page(default)
index f8ac17f..edc35a9 100644 (file)
@@ -48,7 +48,7 @@ BEGIN
         MENUITEM "Ta &bort\tDEL",               ID_EDIT_CLEAR
         MENUITEM "&Markera allt\tCtrl+A",       ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "&Sök...\tCrtl+F",             ID_FIND
+        MENUITEM "&Sök...\tCtrl+F",             ID_FIND
         MENUITEM "Sök &nästa\tF3",              ID_FIND_NEXT
         MENUITEM "&Ersätt...\tCtrl+H",          ID_REPLACE
         MENUITEM SEPARATOR
@@ -108,6 +108,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Svart"     ID_COLOR_BLACK
+        MENUITEM "Rödbrun"   ID_COLOR_MAROON
+        MENUITEM "Grön"      ID_COLOR_GREEN
+        MENUITEM "Oliv"      ID_COLOR_OLIVE
+        MENUITEM "Navy"      ID_COLOR_NAVY
+        MENUITEM "Lila"      ID_COLOR_PURPLE
+        MENUITEM "Teal"      ID_COLOR_TEAL
+        MENUITEM "Grå"       ID_COLOR_GRAY
+        MENUITEM "Silver"    ID_COLOR_SILVER
+        MENUITEM "Röd"       ID_COLOR_RED
+        MENUITEM "Lime"      ID_COLOR_LIME
+        MENUITEM "Gul"       ID_COLOR_YELLOW
+        MENUITEM "Blå"       ID_COLOR_BLUE
+        MENUITEM "Fuchsia"   ID_COLOR_FUCHSIA
+        MENUITEM "Aqua"      ID_COLOR_AQUA
+        MENUITEM "Vit"       ID_COLOR_WHITE
+        MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Datum och tid"
@@ -220,7 +244,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Föregående sida"
     STRING_PREVIEW_TWOPAGES,         "Två sidor"
     STRING_PREVIEW_ONEPAGE,          "En sida"
+    STRING_PREVIEW_ZOOMIN,           "Zooma in"
+    STRING_PREVIEW_ZOOMOUT,          "Zooma ut"
     STRING_PREVIEW_CLOSE,            "Stäng"
+    STRING_PREVIEW_PAGE,             "Sida"
+    STRING_PREVIEW_PAGES,            "Sidor"
 END
 
 STRINGTABLE DISCARDABLE
@@ -246,4 +274,3 @@ BEGIN
     STRING_PRINTING_NOT_IMPLEMENTED, "Utskrift ej implementerat."
     STRING_MAX_TAB_STOPS,            "Kan ej lägga till mer än 32 tabbstopp."
 END
-#pragma code_page(default)
index 9229037..ef66aa4 100644 (file)
@@ -48,7 +48,7 @@ BEGIN
         MENUITEM "&Sil\tDel",                   ID_EDIT_CLEAR
         MENUITEM "&Tümünü seç\tCtrl+A",         ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "&Find...\tCrtl+F",            ID_FIND
+        MENUITEM "&Find...\tCtrl+F",            ID_FIND
         MENUITEM "Find &next\tF3",              ID_FIND_NEXT
         MENUITEM "&Replace...\tCtrl+H",         ID_REPLACE
         MENUITEM SEPARATOR
@@ -108,6 +108,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Siyah"        ID_COLOR_BLACK
+        MENUITEM "Koyu Kýrmýzý" ID_COLOR_MAROON
+        MENUITEM "Yeþil"        ID_COLOR_GREEN
+        MENUITEM "Koyu Sarý"    ID_COLOR_OLIVE
+        MENUITEM "Koyu Mavi"    ID_COLOR_NAVY
+        MENUITEM "Mor"          ID_COLOR_PURPLE
+        MENUITEM "Deniz Mavisi" ID_COLOR_TEAL
+        MENUITEM "Gri"          ID_COLOR_GRAY
+        MENUITEM "Gümüþ"        ID_COLOR_SILVER
+        MENUITEM "Kýrmýzý"      ID_COLOR_RED
+        MENUITEM "Parlak Yeþil" ID_COLOR_LIME
+        MENUITEM "Sarý"         ID_COLOR_YELLOW
+        MENUITEM "Mavi"         ID_COLOR_BLUE
+        MENUITEM "Pembe"        ID_COLOR_FUCHSIA
+        MENUITEM "Turkuaz"      ID_COLOR_AQUA
+        MENUITEM "Beyaz"        ID_COLOR_WHITE
+        MENUITEM "Automatic"    ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "Date and time"
@@ -220,7 +244,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "Previous page"
     STRING_PREVIEW_TWOPAGES,         "Two pages"
     STRING_PREVIEW_ONEPAGE,          "One page"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "Close"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
diff --git a/reactos/base/applications/wordpad/Uk.rc b/reactos/base/applications/wordpad/Uk.rc
new file mode 100644 (file)
index 0000000..35e3597
--- /dev/null
@@ -0,0 +1,278 @@
+/*
+ * Copyright 2004 by Krzysztof Foltman
+ *
+ * Ukrainian language support
+ *
+ * Copyright (C) 2010 Igor Paliychuk
+ *
+ * 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 "wordpad.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+IDM_MAINMENU MENU DISCARDABLE
+BEGIN
+    POPUP "&File"
+    BEGIN
+        MENUITEM "&Новий...\tCtrl+N",       ID_FILE_NEW
+        MENUITEM "&Відкрити...\tCtrl+O",      ID_FILE_OPEN
+        MENUITEM "&Зберегти\tCtrl+S",         ID_FILE_SAVE
+        MENUITEM "Зберегти &як...",           ID_FILE_SAVEAS
+        MENUITEM SEPARATOR
+        MENUITEM "&Друк...\tCtrl+P",     ID_PRINT
+        MENUITEM "Попередній перег&ляд...",     ID_PREVIEW
+        MENUITEM "Налаштування &сторінки...",        ID_PRINTSETUP
+        MENUITEM SEPARATOR
+        MENUITEM "В&ихід",                 ID_FILE_EXIT
+    END
+    POPUP "&Правка"
+    BEGIN
+        MENUITEM "&Відмінити\tCtrl+Z",               ID_EDIT_UNDO
+        MENUITEM "Повт&орити\tCtrl+Y",               ID_EDIT_REDO
+        MENUITEM SEPARATOR
+        MENUITEM "Виріза&ти\tCtrl+X",                ID_EDIT_CUT
+        MENUITEM "&Копіювати\tCtrl+C",               ID_EDIT_COPY
+        MENUITEM "В&ставити\tCtrl+V",              ID_EDIT_PASTE
+        MENUITEM "О&чистити\tDEL",                 ID_EDIT_CLEAR
+        MENUITEM "Виб&рати все\tCtrl+A",         ID_EDIT_SELECTALL
+        MENUITEM SEPARATOR
+        MENUITEM "&Знайти...\tCtrl+F",            ID_FIND
+        MENUITEM "Знайти д&алі\tF3",              ID_FIND_NEXT
+        MENUITEM "За&мінтити...\tCtrl+H",         ID_REPLACE
+        MENUITEM SEPARATOR
+        MENUITEM "Лише д&ля читання",                  ID_EDIT_READONLY
+        MENUITEM "Зм&інений",                   ID_EDIT_MODIFIED
+        MENUITEM SEPARATOR
+        POPUP "Д&одатково"
+        BEGIN
+            MENUITEM "&Інформація про виділення",             ID_EDIT_SELECTIONINFO
+            MENUITEM "&Формат символів",           ID_EDIT_CHARFORMAT
+            MENUITEM "Формат символів &по замовчуванні",           ID_EDIT_DEFCHARFORMAT
+            MENUITEM "Paragrap&h format",           ID_EDIT_PARAFORMAT
+            MENUITEM "&Взяти текст",                   ID_EDIT_GETTEXT
+        END
+    END
+    POPUP "&Вигляд"
+    BEGIN
+        MENUITEM "Панель інс&трументів",        ID_TOGGLE_TOOLBAR
+        MENUITEM "Панель &форматування",      ID_TOGGLE_FORMATBAR
+        MENUITEM "&Лінійка",          ID_TOGGLE_RULER
+        MENUITEM "&Рядок стану",      ID_TOGGLE_STATUSBAR
+        MENUITEM SEPARATOR
+        MENUITEM "&Параметри...",     ID_VIEWPROPERTIES
+    END
+    POPUP "&Вставка"
+    BEGIN
+        MENUITEM "&Дата та час...",  ID_DATETIME
+    END
+    POPUP "Ф&ормат"
+    BEGIN
+        MENUITEM "&Шрифт...",                     ID_FONTSETTINGS
+        MENUITEM "&Bullet points"                ID_BULLET
+        MENUITEM "&Абзац..."                 ID_PARAFORMAT
+        MENUITEM "&Табуляція..."                      ID_TABSTOPS
+        POPUP "&Фон"
+        BEGIN
+            MENUITEM "&Ситсемний\tCtrl+1",         ID_BACK_1
+            MENUITEM "&Жовтуватий PostThat\tCtrl+2",           ID_BACK_2
+        END
+    END
+    POPUP "&Довідка"
+    BEGIN
+        MENUITEM "&Про Wine Wordpad"       ID_ABOUT
+    END
+END
+
+IDM_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Вир&ізати",                ID_EDIT_CUT
+        MENUITEM "&Копіювати",               ID_EDIT_COPY
+        MENUITEM "&Вставити",              ID_EDIT_PASTE
+        MENUITEM SEPARATOR
+        MENUITEM "&Bullet points"       ID_BULLET
+        MENUITEM "&Абзац..."        ID_PARAFORMAT
+    END
+END
+
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "×îðíèé"       ID_COLOR_BLACK
+        MENUITEM "Áðóíàòíèé"    ID_COLOR_MAROON
+        MENUITEM "Çåëåíèé"      ID_COLOR_GREEN
+        MENUITEM "Îëèâêîâèé"    ID_COLOR_OLIVE
+        MENUITEM "Ñèí³é"        ID_COLOR_NAVY
+        MENUITEM "Ïóðïóðíèé"    ID_COLOR_PURPLE
+        MENUITEM "Çåëåíî-ñèí³é" ID_COLOR_TEAL
+        MENUITEM "ѳðèé"        ID_COLOR_GRAY
+        MENUITEM "Ñð³áíèé"      ID_COLOR_SILVER
+        MENUITEM "×åðâîíèé"     ID_COLOR_RED
+        MENUITEM "Ñàëàòîâèé"    ID_COLOR_LIME
+        MENUITEM "Æîâòèé"       ID_COLOR_YELLOW
+        MENUITEM "Ãîëóáèé"      ID_COLOR_BLUE
+        MENUITEM "Ô³îëåòîâèé"   ID_COLOR_FUCHSIA
+        MENUITEM "Àêâàìàðèí"    ID_COLOR_AQUA
+        MENUITEM "Á³ëèé"        ID_COLOR_WHITE
+        MENUITEM "Automatic"    ID_COLOR_AUTOMATIC
+    END
+END
+
+IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "Дата та час"
+FONT 10, "MS Sans Serif"
+BEGIN
+    LTEXT        "Доступні формати",-1,3,2,100,15
+    LISTBOX      IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY
+    PUSHBUTTON   "&OK",IDOK,87,12,40,12
+    PUSHBUTTON   "&Скасувати",IDCANCEL,87,26,40,12
+END
+
+IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "Новий"
+FONT 10, "MS Sans Serif"
+BEGIN
+    LTEXT        "Тип нового документу",-1,3,2,100,15
+    LISTBOX      IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT
+    PUSHBUTTON   "&OK",IDOK,97,12,40,12
+    PUSHBUTTON   "&Скасувати",IDCANCEL,97,26,40,12
+END
+
+IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+Caption "Абзац"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Відступ", -1, 10, 10, 120, 68
+    LTEXT "Зліва", -1, 15, 22, 40, 13
+    EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13
+    LTEXT "Справа", -1, 15, 40, 40, 13
+    EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13
+    LTEXT "Перший рядок", -1, 15, 58, 40, 13
+    EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13
+    LTEXT "Вирівнювання", -1, 15, 87, 40, 13
+    COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST
+    PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15
+    PUSHBUTTON "&Скасувати", IDCANCEL, 137, 33, 50, 15
+END
+
+IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+Caption "Табуляція"
+FONT 8, "MS SHell DLg"
+BEGIN
+    GROUPBOX "Tab stops", -1, 10, 10, 120, 90
+    COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE
+    DEFPUSHBUTTON "&Додати", ID_TAB_ADD, 20, 80, 45, 15
+    PUSHBUTTON "&Видалити", ID_TAB_DEL, 72, 80, 45, 15
+    PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15
+    PUSHBUTTON "&Скасувати", IDCANCEL, 137, 33, 50, 15
+    PUSHBUTTON "Видалити в&се", ID_TAB_EMPTY, 137, 51, 50, 15
+END
+
+IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110
+STYLE DS_SYSMODAL
+Caption ""
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Line wrapping", -1, 10, 10, 130, 85
+    RADIOBUTTON "&No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15
+    RADIOBUTTON "Wrap text by the &window border", IDC_PAGEFMT_WW, 18, 45, 117, 15
+    RADIOBUTTON "Wrap text by the &margin", IDC_PAGEFMT_WM, 18, 65, 117, 15
+    GROUPBOX "Toolbars", -1, 150, 10, 120, 85
+    CHECKBOX "&Toolbar", IDC_PAGEFMT_TB, 160, 20, 80, 15
+    CHECKBOX "&Formatbar", IDC_PAGEFMT_FB, 160, 38, 80, 15
+    CHECKBOX "&Лінійка", IDC_PAGEFMT_RU, 160, 56, 80, 15
+    CHECKBOX "&Рядоу стану", IDC_PAGEFMT_SB, 160, 74, 80, 15
+    LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_ALL_FILES,              "Всі документи (*.*)"
+    STRING_TEXT_FILES_TXT,         "Текстові документи (*.txt)"
+    STRING_TEXT_FILES_UNICODE_TXT, "Текстовий документ Unicode (*.txt)"
+    STRING_RICHTEXT_FILES_RTF,     "Rich text format (*.rtf)"
+    STRING_NEWFILE_RICHTEXT,       "Rich text документ"
+    STRING_NEWFILE_TXT,            "Текстовий документ"
+    STRING_NEWFILE_TXT_UNICODE,    "Текстовий документ Unicode"
+    STRING_PRINTER_FILES_PRN,      "Printer files (*.PRN)"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_ALIGN_LEFT,            "По Лівому Краю"
+    STRING_ALIGN_RIGHT,           "По Правому Краю"
+    STRING_ALIGN_CENTER,          "По Центру"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_VIEWPROPS_TITLE,          "Налаштування"
+    STRING_VIEWPROPS_TEXT,           "Текст"
+    STRING_VIEWPROPS_RICHTEXT,       "Rich text"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_PREVIEW_PRINT,            "Друк"
+    STRING_PREVIEW_NEXTPAGE,         "Наступна сторінка"
+    STRING_PREVIEW_PREVPAGE,         "Попередня сторінка"
+    STRING_PREVIEW_TWOPAGES,         "Дві сторінки"
+    STRING_PREVIEW_ONEPAGE,          "Одна сторінка"
+    STRING_PREVIEW_ZOOMIN,           "Збільшити"
+    STRING_PREVIEW_ZOOMOUT,          "Зменшити"
+    STRING_PREVIEW_CLOSE,            "Закрити"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
+    STRING_UNITS_CM,                 "cm"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_DEFAULT_FILENAME,     "Документ"
+    STRING_PROMPT_SAVE_CHANGES,  "Зберегти зміни в '%s'?"
+    STRING_SEARCH_FINISHED,      "Покуш документу завершено."
+    STRING_LOAD_RICHED_FAILED,   "Не вдалось завантажити бібліотеку RichEdit."
+    STRING_SAVE_LOSEFORMATTING,  "Ви вибрали збереження в форматі простого тексту, " \
+                                 "що призведе до втрати форматування. " \
+                                 "Ви справді цього хочете?"
+    STRING_INVALID_NUMBER,       "Невірний числовий формат"
+    STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage документи не підтримуються"
+    STRING_WRITE_FAILED,              "Неможливо зберегти файл."
+    STRING_WRITE_ACCESS_DENIED,       "Недостатньо прав для збереження файлу."
+    STRING_OPEN_FAILED,               "Не вдалось відкрити файл."
+    STRING_OPEN_ACCESS_DENIED,        "Недостатньо прав для відкриття файлу."
+    STRING_PRINTING_NOT_IMPLEMENTED,  "Друк не впроваджено"
+    STRING_MAX_TAB_STOPS,             "Неможливо додати більше 32 позицій табуляції."
+END
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    STRING_ALIGN_LEFT,            "По Лівому Краю"
+    STRING_ALIGN_RIGHT,           "По правому Краю"
+    STRING_ALIGN_CENTER,          "По Центру"
+END
index 6953105..6adb30a 100644 (file)
@@ -51,7 +51,7 @@ BEGIN
         MENUITEM "删除(&D)\tDEL", ID_EDIT_CLEAR
         MENUITEM "全选(&S)\tCtrl+A", ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "查找(&F)...\tCrtl+F", ID_FIND
+        MENUITEM "查找(&F)...\tCtrl+F", ID_FIND
         MENUITEM "找下一个(&N)\tF3", ID_FIND_NEXT
         MENUITEM "替换(&R)...\tCtrl+H", ID_REPLACE
         MENUITEM SEPARATOR
@@ -111,6 +111,30 @@ BEGIN
     END
 END
 
+IDM_COLOR_POPUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Black",      ID_COLOR_BLACK
+        MENUITEM "Maroon",     ID_COLOR_MAROON
+        MENUITEM "Green",      ID_COLOR_GREEN
+        MENUITEM "Olive"       ID_COLOR_OLIVE
+        MENUITEM "Navy"        ID_COLOR_NAVY
+        MENUITEM "Purple"      ID_COLOR_PURPLE
+        MENUITEM "Teal"        ID_COLOR_TEAL
+        MENUITEM "Gray"        ID_COLOR_GRAY
+        MENUITEM "Silver"      ID_COLOR_SILVER
+        MENUITEM "Red"         ID_COLOR_RED
+        MENUITEM "Lime"        ID_COLOR_LIME
+        MENUITEM "Yellow"      ID_COLOR_YELLOW
+        MENUITEM "Blue"        ID_COLOR_BLUE
+        MENUITEM "Fuchsia"     ID_COLOR_FUCHSIA
+        MENUITEM "Aqua"        ID_COLOR_AQUA
+        MENUITEM "White"       ID_COLOR_WHITE
+        MENUITEM "Automatic"   ID_COLOR_AUTOMATIC
+    END
+END
+
 IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 CAPTION "日期和时间"
@@ -223,7 +247,11 @@ BEGIN
     STRING_PREVIEW_PREVPAGE,         "上一页"
     STRING_PREVIEW_TWOPAGES,         "双页"
     STRING_PREVIEW_ONEPAGE,          "单页"
+    STRING_PREVIEW_ZOOMIN,           "Zoom in"
+    STRING_PREVIEW_ZOOMOUT,          "Zoom out"
     STRING_PREVIEW_CLOSE,            "关闭"
+    STRING_PREVIEW_PAGE,             "Page"
+    STRING_PREVIEW_PAGES,            "Pages"
 END
 
 STRINGTABLE DISCARDABLE
@@ -276,7 +304,7 @@ BEGIN
         MENUITEM "刪除(&D)\tDEL", ID_EDIT_CLEAR
         MENUITEM "全選(&S)\tCtrl+A", ID_EDIT_SELECTALL
         MENUITEM SEPARATOR
-        MENUITEM "查找(&F)...\tCrtl+F", ID_FIND
+        MENUITEM "查找(&F)...\tCtrl+F", ID_FIND
         MENUITEM "找下一個(&N)\tF3", ID_FIND_NEXT
         MENUITEM "替換(&R)...\tCtrl+H", ID_REPLACE
         MENUITEM SEPARATOR
@@ -471,4 +499,3 @@ BEGIN
     STRING_OPEN_FAILED,               "不能開啟檔案."
     STRING_OPEN_ACCESS_DENIED,        "你沒有開啟檔案的權力."
 END
-#pragma code_page(default)
index 9c643b1..310b596 100644 (file)
Binary files a/reactos/base/applications/wordpad/formatbar.bmp and b/reactos/base/applications/wordpad/formatbar.bmp differ
index 0a1343f..71c0627 100644 (file)
 typedef struct _previewinfo
 {
     int page;
-    int pages;
+    int pages_shown;
+    int saved_pages_shown;
+    int *pageEnds, pageCapacity;
+    int textlength;
     HDC hdc;
     HDC hdc2;
     HDC hdcSized;
     HDC hdcSized2;
     RECT window;
+    RECT rcPage;
+    SIZE bmSize;
+    SIZE bmScaledSize;
+    SIZE spacing;
+    float zoomratio;
+    int zoomlevel;
     LPWSTR wszFileName;
 } previewinfo, *ppreviewinfo;
 
@@ -42,7 +51,10 @@ static HGLOBAL devNames;
 static RECT margins;
 static previewinfo preview;
 
+extern const WCHAR wszPreviewWndClass[];
+
 static const WCHAR var_pagemargin[] = {'P','a','g','e','M','a','r','g','i','n',0};
+static const WCHAR var_previewpages[] = {'P','r','e','v','i','e','w','P','a','g','e','s',0};
 
 static LPWSTR get_print_file_filter(HWND hMainWnd)
 {
@@ -50,7 +62,7 @@ static LPWSTR get_print_file_filter(HWND hMainWnd)
     const WCHAR files_prn[] = {'*','.','P','R','N',0};
     const WCHAR files_all[] = {'*','.','*','\0'};
     LPWSTR p;
-    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE);
+    HINSTANCE hInstance = GetModuleHandleW(0);
 
     p = wszPrintFilter;
     LoadStringW(hInstance, STRING_PRINTER_FILES_PRN, p, MAX_STRING_LEN);
@@ -85,10 +97,32 @@ void registry_read_pagemargins(HKEY hKey)
     }
 }
 
+void registry_set_previewpages(HKEY hKey)
+{
+    RegSetValueExW(hKey, var_previewpages, 0, REG_DWORD,
+                   (LPBYTE)&preview.pages_shown, sizeof(DWORD));
+}
+
+void registry_read_previewpages(HKEY hKey)
+{
+    DWORD size = sizeof(DWORD);
+    if(!hKey ||
+       RegQueryValueExW(hKey, var_previewpages, 0, NULL,
+                        (LPBYTE)&preview.pages_shown, &size) != ERROR_SUCCESS ||
+       size != sizeof(DWORD))
+    {
+        preview.pages_shown = 1;
+    } else {
+        if (preview.pages_shown < 1) preview.pages_shown = 1;
+        else if (preview.pages_shown > 2) preview.pages_shown = 2;
+    }
+}
+
+
 static void AddTextButton(HWND hRebarWnd, UINT string, UINT command, UINT id)
 {
     REBARBANDINFOW rb;
-    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hRebarWnd, GWLP_HINSTANCE);
+    HINSTANCE hInstance = GetModuleHandleW(0);
     WCHAR text[MAX_STRING_LEN];
     HWND hButton;
 
@@ -236,22 +270,6 @@ static LPWSTR dialog_print_to_file(HWND hMainWnd)
         return FALSE;
 }
 
-static int get_num_pages(HWND hEditorWnd, FORMATRANGE fr)
-{
-    int page = 0;
-    fr.chrg.cpMin = 0;
-
-    do
-    {
-        page++;
-        fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE,
-                                     (LPARAM)&fr);
-    }
-    while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax);
-
-    return page;
-}
-
 static void char_from_pagenum(HWND hEditorWnd, FORMATRANGE *fr, int page)
 {
     int i;
@@ -260,7 +278,9 @@ static void char_from_pagenum(HWND hEditorWnd, FORMATRANGE *fr, int page)
 
     for(i = 1; i < page; i++)
     {
-        fr->chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)fr);
+        int bottom = fr->rc.bottom;
+        fr->chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, (LPARAM)fr);
+        fr->rc.bottom = bottom;
     }
 }
 
@@ -283,6 +303,145 @@ static void update_ruler(HWND hRulerWnd)
      redraw_ruler(hRulerWnd);
 }
 
+static void add_ruler_units(HDC hdcRuler, RECT* drawRect, BOOL NewMetrics, LONG EditLeftmost)
+{
+    static HDC hdc;
+
+    if(NewMetrics)
+    {
+        static HBITMAP hBitmap;
+        int i, x, y, RulerTextEnd;
+        int CmPixels;
+        int QuarterCmPixels;
+        HFONT hFont;
+        WCHAR FontName[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f',0};
+
+        if(hdc)
+        {
+            DeleteDC(hdc);
+            DeleteObject(hBitmap);
+        }
+
+        hdc = CreateCompatibleDC(0);
+
+        CmPixels = twips_to_pixels(centmm_to_twips(1000), GetDeviceCaps(hdc, LOGPIXELSX));
+        QuarterCmPixels = (int)((float)CmPixels / 4.0);
+
+        hBitmap = CreateCompatibleBitmap(hdc, drawRect->right, drawRect->bottom);
+        SelectObject(hdc, hBitmap);
+        FillRect(hdc, drawRect, GetStockObject(WHITE_BRUSH));
+
+        hFont = CreateFontW(10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FontName);
+
+        SelectObject(hdc, hFont);
+        SetBkMode(hdc, TRANSPARENT);
+        SetTextAlign(hdc, TA_CENTER);
+        y = (int)(((float)drawRect->bottom - (float)drawRect->top) / 2.0) + 1;
+        RulerTextEnd = drawRect->right - EditLeftmost + 1;
+        for(i = 1, x = EditLeftmost; x < (drawRect->right - EditLeftmost + 1); i ++)
+        {
+            WCHAR str[3];
+            WCHAR format[] = {'%','d',0};
+            int x2 = x;
+
+            x2 += QuarterCmPixels;
+            if(x2 > RulerTextEnd)
+                break;
+
+            MoveToEx(hdc, x2, y, NULL);
+            LineTo(hdc, x2, y+2);
+
+            x2 += QuarterCmPixels;
+            if(x2 > RulerTextEnd)
+                break;
+
+            MoveToEx(hdc, x2, y - 3, NULL);
+            LineTo(hdc, x2, y + 3);
+
+            x2 += QuarterCmPixels;
+            if(x2 > RulerTextEnd)
+                break;
+
+            MoveToEx(hdc, x2, y, NULL);
+            LineTo(hdc, x2, y+2);
+
+            x += CmPixels;
+            if(x > RulerTextEnd)
+                break;
+
+            wsprintfW(str, format, i);
+            TextOutW(hdc, x, 5, str, lstrlenW(str));
+        }
+        DeleteObject(hFont);
+    }
+
+    BitBlt(hdcRuler, 0, 0, drawRect->right, drawRect->bottom, hdc, 0, 0, SRCAND);
+}
+
+static void paint_ruler(HWND hWnd, LONG EditLeftmost, BOOL NewMetrics)
+{
+    PAINTSTRUCT ps;
+    HDC hdc = BeginPaint(hWnd, &ps);
+    HDC hdcPrint = make_dc();
+    RECT printRect = get_print_rect(hdcPrint);
+    RECT drawRect;
+    HBRUSH hBrush = CreateSolidBrush(GetSysColor(COLOR_MENU));
+
+    GetClientRect(hWnd, &drawRect);
+    FillRect(hdc, &drawRect, hBrush);
+
+    drawRect.top += 3;
+    drawRect.bottom -= 3;
+    drawRect.left = EditLeftmost;
+    drawRect.right = twips_to_pixels(printRect.right - margins.left, GetDeviceCaps(hdc, LOGPIXELSX));
+    FillRect(hdc, &drawRect, GetStockObject(WHITE_BRUSH));
+
+    drawRect.top--;
+    drawRect.bottom++;
+    DrawEdge(hdc, &drawRect, EDGE_SUNKEN, BF_RECT);
+
+    drawRect.left = drawRect.right - 1;
+    drawRect.right = twips_to_pixels(printRect.right + margins.right - margins.left, GetDeviceCaps(hdc, LOGPIXELSX));
+    DrawEdge(hdc, &drawRect, EDGE_ETCHED, BF_RECT);
+
+    drawRect.left = 0;
+    drawRect.top = 0;
+    add_ruler_units(hdc, &drawRect, NewMetrics, EditLeftmost);
+
+    SelectObject(hdc, GetStockObject(BLACK_BRUSH));
+    DeleteObject(hBrush);
+    DeleteDC(hdcPrint);
+    EndPaint(hWnd, &ps);
+}
+
+LRESULT CALLBACK ruler_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    static WNDPROC pPrevRulerProc;
+    static LONG EditLeftmost;
+    static BOOL NewMetrics;
+
+    switch(msg)
+    {
+        case WM_USER:
+            if(wParam)
+            {
+                EditLeftmost = ((POINTL*)wParam)->x;
+                pPrevRulerProc = (WNDPROC)lParam;
+            }
+            NewMetrics = TRUE;
+            break;
+
+        case WM_PAINT:
+            paint_ruler(hWnd, EditLeftmost, NewMetrics);
+            break;
+
+        default:
+            return CallWindowProcW(pPrevRulerProc, hWnd, msg, wParam, lParam);
+    }
+
+    return 0;
+}
+
 static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
 {
     FORMATRANGE fr;
@@ -328,6 +487,7 @@ static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
     StartDocW(fr.hdc, &di);
     do
     {
+        int bottom = fr.rc.bottom;
         if(StartPage(fr.hdc) <= 0)
             break;
 
@@ -335,6 +495,7 @@ static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
 
         if(EndPage(fr.hdc) <= 0)
             break;
+        bottom = fr.rc.bottom;
 
         printedPages++;
         if((pd->Flags & PD_PAGENUMS) && (printedPages > (pd->nToPage - pd->nFromPage)))
@@ -389,14 +550,16 @@ void get_default_printer_opts(void)
     devNames = pd.hDevNames;
 }
 
-void print_quick(LPWSTR wszFileName)
+void print_quick(HWND hMainWnd, LPWSTR wszFileName)
 {
     PRINTDLGW pd;
 
     ZeroMemory(&pd, sizeof(pd));
+    pd.hwndOwner = hMainWnd;
     pd.hDC = make_dc();
 
     print(&pd, wszFileName);
+    DeleteDC(pd.hDC);
 }
 
 void dialog_print(HWND hMainWnd, LPWSTR wszFileName)
@@ -437,12 +600,16 @@ static void preview_bar_show(HWND hMainWnd, BOOL show)
     {
         REBARBANDINFOW rb;
         HWND hStatic;
+        UINT num_pages_string = preview.pages_shown > 1 ? STRING_PREVIEW_ONEPAGE :
+                                                          STRING_PREVIEW_TWOPAGES;
 
         AddTextButton(hReBar, STRING_PREVIEW_PRINT, ID_PRINT, BANDID_PREVIEW_BTN1);
         AddTextButton(hReBar, STRING_PREVIEW_NEXTPAGE, ID_PREVIEW_NEXTPAGE, BANDID_PREVIEW_BTN2);
         AddTextButton(hReBar, STRING_PREVIEW_PREVPAGE, ID_PREVIEW_PREVPAGE, BANDID_PREVIEW_BTN3);
-        AddTextButton(hReBar, STRING_PREVIEW_TWOPAGES, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4);
-        AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN5);
+        AddTextButton(hReBar, num_pages_string, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4);
+        AddTextButton(hReBar, STRING_PREVIEW_ZOOMIN, ID_PREVIEW_ZOOMIN, BANDID_PREVIEW_BTN5);
+        AddTextButton(hReBar, STRING_PREVIEW_ZOOMOUT, ID_PREVIEW_ZOOMOUT, BANDID_PREVIEW_BTN6);
+        AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN7);
 
         hStatic = CreateWindowW(WC_STATICW, NULL,
                                 WS_VISIBLE | WS_CHILD, 0, 0, 0, 0,
@@ -465,188 +632,106 @@ static void preview_bar_show(HWND hMainWnd, BOOL show)
     }
 }
 
-void init_preview(HWND hMainWnd, LPWSTR wszFileName)
-{
-    preview.page = 1;
-    preview.hdc = 0;
-    preview.hdc2 = 0;
-    preview.wszFileName = wszFileName;
-    preview_bar_show(hMainWnd, TRUE);
-}
+static const int min_spacing = 10;
 
-void close_preview(HWND hMainWnd)
+static void update_preview_scrollbars(HWND hwndPreview, RECT *window)
 {
-    preview.window.right = 0;
-    preview.window.bottom = 0;
-    preview.page = 0;
-    preview.pages = 0;
-
-    preview_bar_show(hMainWnd, FALSE);
+    SCROLLINFO sbi;
+    sbi.cbSize = sizeof(sbi);
+    sbi.fMask = SIF_PAGE|SIF_RANGE;
+    sbi.nMin = 0;
+    if (preview.zoomlevel == 0)
+    {
+        /* Hide scrollbars when zoomed out. */
+        sbi.nMax = 0;
+        sbi.nPage = window->right;
+        SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE);
+        sbi.nPage = window->bottom;
+        SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE);
+    } else {
+        sbi.nMax = preview.bmScaledSize.cx * preview.pages_shown +
+                   min_spacing * (preview.pages_shown + 1);
+        sbi.nPage = window->right;
+        SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE);
+        /* Change in the horizontal scrollbar visibility affects the
+         * client rect, so update the client rect. */
+        GetClientRect(hwndPreview, window);
+        sbi.nMax = preview.bmScaledSize.cy + min_spacing * 2;
+        sbi.nPage = window->bottom;
+        SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE);
+    }
 }
 
-BOOL preview_isactive(void)
+static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated)
 {
-    return preview.page != 0;
-}
+    RECT window;
 
-static void add_ruler_units(HDC hdcRuler, RECT* drawRect, BOOL NewMetrics, LONG EditLeftmost)
-{
-    static HDC hdc;
+    GetClientRect(hwndPreview, &window);
 
-    if(NewMetrics)
+    /* The zoom ratio isn't updated for partial zoom because of resizing the window. */
+    if (zoomLevelUpdated || preview.zoomlevel != 1)
     {
-        static HBITMAP hBitmap;
-        int i, x, y, RulerTextEnd;
-        int CmPixels;
-        int QuarterCmPixels;
-        HFONT hFont;
-        WCHAR FontName[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f',0};
-
-        if(hdc)
-        {
-            DeleteDC(hdc);
-            DeleteObject(hBitmap);
-        }
-
-        hdc = CreateCompatibleDC(0);
-
-        CmPixels = twips_to_pixels(centmm_to_twips(1000), GetDeviceCaps(hdc, LOGPIXELSX));
-        QuarterCmPixels = (int)((float)CmPixels / 4.0);
-
-        hBitmap = CreateCompatibleBitmap(hdc, drawRect->right, drawRect->bottom);
-        SelectObject(hdc, hBitmap);
-        FillRect(hdc, drawRect, GetStockObject(WHITE_BRUSH));
-
-        hFont = CreateFontW(10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FontName);
-
-        SelectObject(hdc, hFont);
-        SetBkMode(hdc, TRANSPARENT);
-        SetTextAlign(hdc, TA_CENTER);
-        y = (int)(((float)drawRect->bottom - (float)drawRect->top) / 2.0) + 1;
-        RulerTextEnd = drawRect->right - EditLeftmost + 1;
-        for(i = 1, x = EditLeftmost; x < (drawRect->right - EditLeftmost + 1); i ++)
+        float ratio, ratioHeight, ratioWidth;
+        if (preview.zoomlevel == 2)
         {
-            WCHAR str[3];
-            WCHAR format[] = {'%','d',0};
-            int x2 = x;
-
-            x2 += QuarterCmPixels;
-            if(x2 > RulerTextEnd)
-                break;
-
-            MoveToEx(hdc, x2, y, NULL);
-            LineTo(hdc, x2, y+2);
-
-            x2 += QuarterCmPixels;
-            if(x2 > RulerTextEnd)
-                break;
-
-            MoveToEx(hdc, x2, y - 3, NULL);
-            LineTo(hdc, x2, y + 3);
-
-            x2 += QuarterCmPixels;
-            if(x2 > RulerTextEnd)
-                break;
+            ratio = 1.0;
+        } else {
+            ratioHeight = (window.bottom - min_spacing * 2) / (float)preview.bmSize.cy;
 
-            MoveToEx(hdc, x2, y, NULL);
-            LineTo(hdc, x2, y+2);
+            ratioWidth = (float)(window.right -
+                                 min_spacing * (preview.pages_shown + 1)) /
+                         (preview.pages_shown * preview.bmSize.cx);
 
-            x += CmPixels;
-            if(x > RulerTextEnd)
-                break;
+            if(ratioWidth > ratioHeight)
+                ratio = ratioHeight;
+            else
+                ratio = ratioWidth;
 
-            wsprintfW(str, format, i);
-            TextOutW(hdc, x, 5, str, lstrlenW(str));
+            if (preview.zoomlevel == 1)
+                ratio += (1.0 - ratio) / 2;
         }
-        DeleteObject(hFont);
+        preview.zoomratio = ratio;
     }
 
-    BitBlt(hdcRuler, 0, 0, drawRect->right, drawRect->bottom, hdc, 0, 0, SRCAND);
-}
-
-static void paint_ruler(HWND hWnd, LONG EditLeftmost, BOOL NewMetrics)
-{
-    PAINTSTRUCT ps;
-    HDC hdc = BeginPaint(hWnd, &ps);
-    HDC hdcPrint = make_dc();
-    RECT printRect = get_print_rect(hdcPrint);
-    RECT drawRect;
-    HBRUSH hBrush = CreateSolidBrush(GetSysColor(COLOR_MENU));
-
-    GetClientRect(hWnd, &drawRect);
-    FillRect(hdc, &drawRect, hBrush);
-
-    drawRect.top += 3;
-    drawRect.bottom -= 3;
-    drawRect.left = EditLeftmost;
-    drawRect.right = twips_to_pixels(printRect.right - margins.left, GetDeviceCaps(hdc, LOGPIXELSX));
-    FillRect(hdc, &drawRect, GetStockObject(WHITE_BRUSH));
-
-    drawRect.top--;
-    drawRect.bottom++;
-    DrawEdge(hdc, &drawRect, EDGE_SUNKEN, BF_RECT);
-
-    drawRect.left = drawRect.right - 1;
-    drawRect.right = twips_to_pixels(printRect.right + margins.right - margins.left, GetDeviceCaps(hdc, LOGPIXELSX));
-    DrawEdge(hdc, &drawRect, EDGE_ETCHED, BF_RECT);
-
-    drawRect.left = 0;
-    drawRect.top = 0;
-    add_ruler_units(hdc, &drawRect, NewMetrics, EditLeftmost);
-
-    SelectObject(hdc, GetStockObject(BLACK_BRUSH));
-    DeleteObject(hBrush);
-    DeleteDC(hdcPrint);
-    EndPaint(hWnd, &ps);
-}
-
-LRESULT CALLBACK ruler_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
-    static WNDPROC pPrevRulerProc;
-    static LONG EditLeftmost;
-    static BOOL NewMetrics;
-
-    switch(msg)
-    {
-        case WM_USER:
-            if(wParam)
-            {
-                EditLeftmost = ((POINTL*)wParam)->x;
-                pPrevRulerProc = (WNDPROC)lParam;
-            }
-            NewMetrics = TRUE;
-            break;
+    preview.bmScaledSize.cx = preview.bmSize.cx * preview.zoomratio;
+    preview.bmScaledSize.cy = preview.bmSize.cy * preview.zoomratio;
 
-        case WM_PAINT:
-            paint_ruler(hWnd, EditLeftmost, NewMetrics);
-            break;
+    preview.spacing.cy = max(min_spacing, (window.bottom - preview.bmScaledSize.cy) / 2);
 
-        default:
-            return CallWindowProcW(pPrevRulerProc, hWnd, msg, wParam, lParam);
-    }
+    preview.spacing.cx = (window.right -
+                          preview.bmScaledSize.cx * preview.pages_shown) /
+                         (preview.pages_shown + 1);
+    if (preview.spacing.cx < min_spacing)
+        preview.spacing.cx = min_spacing;
 
-    return 0;
+    update_preview_scrollbars(hwndPreview, &window);
 }
 
-static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight)
+static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight, BOOL draw_margins)
 {
     HBITMAP hBitmapScaled = CreateCompatibleBitmap(hdc, bmNewWidth, bmNewHeight);
-    HPEN hPen;
+    HBITMAP oldbm;
+    HPEN hPen, oldPen;
     int TopMargin = (int)((float)twips_to_pixels(lpFr->rc.top, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio);
     int BottomMargin = (int)((float)twips_to_pixels(lpFr->rc.bottom, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio);
     int LeftMargin = (int)((float)twips_to_pixels(lpFr->rc.left, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio);
     int RightMargin = (int)((float)twips_to_pixels(lpFr->rc.right, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio);
 
-    if(*hdcSized)
-        DeleteDC(*hdcSized);
-    *hdcSized = CreateCompatibleDC(hdc);
-    SelectObject(*hdcSized, hBitmapScaled);
+    if(*hdcSized) {
+        oldbm = SelectObject(*hdcSized, hBitmapScaled);
+        DeleteObject(oldbm);
+    } else {
+        *hdcSized = CreateCompatibleDC(hdc);
+        SelectObject(*hdcSized, hBitmapScaled);
+    }
 
     StretchBlt(*hdcSized, 0, 0, bmNewWidth, bmNewHeight, hdc, 0, 0, bmWidth, bmHeight, SRCCOPY);
 
+    if (!draw_margins) return;
+
     /* Draw margin lines */
     hPen = CreatePen(PS_DOT, 1, RGB(0,0,0));
-    SelectObject(*hdcSized, hPen);
+    oldPen = SelectObject(*hdcSized, hPen);
 
     MoveToEx(*hdcSized, 0, TopMargin, NULL);
     LineTo(*hdcSized, bmNewWidth, TopMargin);
@@ -658,168 +743,511 @@ static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float r
     MoveToEx(*hdcSized, RightMargin, 0, NULL);
     LineTo(*hdcSized, RightMargin, bmNewHeight);
 
+    SelectObject(*hdcSized, oldPen);
+    DeleteObject(hPen);
 }
 
-static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, int bmWidth, int bmHeight, RECT* paper, int page)
+static BOOL is_last_preview_page(int page)
 {
-    HBITMAP hBitmapCapture = CreateCompatibleBitmap(lpFr->hdc, bmWidth, bmHeight);
-
-    char_from_pagenum(hEditorWnd, lpFr, page);
-    SelectObject(lpFr->hdc, hBitmapCapture);
-    FillRect(lpFr->hdc, paper, GetStockObject(WHITE_BRUSH));
-    SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr);
-    /* EM_FORMATRANGE sets fr.rc to indicate the area printed in, but we want to
-       keep the original for drawing margins */
-    lpFr->rc = get_print_rect(lpFr->hdcTarget);
-    SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0);
+    return preview.pageEnds[page - 1] >= preview.textlength;
 }
 
-LRESULT print_preview(HWND hMainWnd)
+/* Update for zoom ratio changes with same page. */
+static void update_scaled_preview(HWND hMainWnd)
 {
     FORMATRANGE fr;
-    GETTEXTLENGTHEX gt;
-    HDC hdc;
-    RECT window, background;
-    int bmWidth, bmHeight, bmNewWidth, bmNewHeight;
-    float ratioWidth, ratioHeight, ratio;
-    int xOffset, yOffset;
-    int barheight;
-    float spacing = 20.0;
-    HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
-    PAINTSTRUCT ps;
+    HWND hwndPreview;
 
-    hdc = BeginPaint(hMainWnd, &ps);
-    GetClientRect(hMainWnd, &window);
+    /* This may occur on WM_CREATE before update_preview is called
+     * because a WM_SIZE message is generated from updating the
+     * scrollbars. */
+    if (!preview.hdc) return;
 
+    hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
     fr.hdcTarget = make_dc();
-    fr.rc = get_print_rect(fr.hdcTarget);
-    fr.rcPage.left = 0;
-    fr.rcPage.top = 0;
-    fr.rcPage.bottom = fr.rc.bottom + margins.bottom;
-    fr.rcPage.right = fr.rc.right + margins.right;
+    fr.rc = fr.rcPage = preview.rcPage;
+    fr.rc.left += margins.left;
+    fr.rc.top += margins.top;
+    fr.rc.bottom -= margins.bottom;
+    fr.rc.right -= margins.right;
 
-    bmWidth = twips_to_pixels(fr.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX));
-    bmHeight = twips_to_pixels(fr.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY));
+    draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio,
+                      preview.bmScaledSize.cx, preview.bmScaledSize.cy,
+                      preview.bmSize.cx, preview.bmSize.cy, TRUE);
 
-    if(!preview.hdc)
+    if(preview.pages_shown > 1)
     {
-        RECT paper;
-        HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
+        draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio,
+                          preview.bmScaledSize.cx, preview.bmScaledSize.cy,
+                          preview.bmSize.cx, preview.bmSize.cy,
+                          !is_last_preview_page(preview.page));
+    }
 
-        preview.hdc = CreateCompatibleDC(hdc);
+    InvalidateRect(hwndPreview, NULL, TRUE);
+    DeleteDC(fr.hdcTarget);
+}
 
-        if(preview.hdc2)
-        {
-            if(preview.hdc2 != (HDC)-1)
-                DeleteDC(preview.hdc2);
-            preview.hdc2 = CreateCompatibleDC(hdc);
-        }
+void init_preview(HWND hMainWnd, LPWSTR wszFileName)
+{
+    HWND hwndPreview;
+    HINSTANCE hInstance = GetModuleHandleW(0);
+    preview.page = 1;
+    preview.hdc = 0;
+    preview.hdc2 = 0;
+    preview.wszFileName = wszFileName;
+    preview.zoomratio = 0;
+    preview.zoomlevel = 0;
+    preview_bar_show(hMainWnd, TRUE);
 
-        fr.hdc = preview.hdc;
-        gt.flags = GTL_DEFAULT;
-        gt.codepage = 1200;
-        fr.chrg.cpMin = 0;
-        fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)&gt, 0);
+    hwndPreview = CreateWindowExW(0, wszPreviewWndClass, NULL,
+            WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL,
+            0, 0, 200, 10, hMainWnd, (HMENU)IDC_PREVIEW, hInstance, NULL);
+}
 
-        paper.left = 0;
-        paper.right = bmWidth;
-        paper.top = 0;
-        paper.bottom = bmHeight;
+void close_preview(HWND hMainWnd)
+{
+    HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
+    preview.window.right = 0;
+    preview.window.bottom = 0;
+    preview.page = 0;
+    HeapFree(GetProcessHeap(), 0, preview.pageEnds);
+    preview.pageEnds = NULL;
+    preview.pageCapacity = 0;
+    if (preview.zoomlevel > 0)
+        preview.pages_shown = preview.saved_pages_shown;
+    if(preview.hdc) {
+        HBITMAP oldbm = GetCurrentObject(preview.hdc, OBJ_BITMAP);
+        DeleteDC(preview.hdc);
+        DeleteObject(oldbm);
+        preview.hdc = NULL;
+    }
+    if(preview.hdc2) {
+        HBITMAP oldbm = GetCurrentObject(preview.hdc2, OBJ_BITMAP);
+        DeleteDC(preview.hdc2);
+        DeleteObject(oldbm);
+        preview.hdc2 = NULL;
+    }
+    if(preview.hdcSized) {
+        HBITMAP oldbm = GetCurrentObject(preview.hdcSized, OBJ_BITMAP);
+        DeleteDC(preview.hdcSized);
+        DeleteObject(oldbm);
+        preview.hdcSized = NULL;
+    }
+    if(preview.hdcSized2) {
+        HBITMAP oldbm = GetCurrentObject(preview.hdcSized2, OBJ_BITMAP);
+        DeleteDC(preview.hdcSized2);
+        DeleteObject(oldbm);
+        preview.hdcSized2 = NULL;
+    }
 
-        if(!preview.pages)
-            preview.pages = get_num_pages(hEditorWnd, fr);
+    preview_bar_show(hMainWnd, FALSE);
+    DestroyWindow(hwndPreview);
+}
 
-        fr.hdc = preview.hdc;
-        draw_preview(hEditorWnd, &fr, bmWidth, bmHeight, &paper, preview.page);
+BOOL preview_isactive(void)
+{
+    return preview.page != 0;
+}
 
-        if(preview.hdc2)
-        {
-            fr.hdc = preview.hdc2;
-            draw_preview(hEditorWnd, &fr, bmWidth, bmHeight, &paper, preview.page + 1);
-        }
+static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, RECT* paper, int page)
+{
+    int bottom;
 
-        EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1);
-        EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE), preview.hdc2 ?
-                                                              (preview.page + 1) < preview.pages :
-                                                              preview.page < preview.pages);
-        EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), preview.pages > 1);
+    if (!preview.pageEnds)
+    {
+        preview.pageCapacity = 32;
+        preview.pageEnds = HeapAlloc(GetProcessHeap(), 0,
+                                    sizeof(int) * preview.pageCapacity);
+        if (!preview.pageEnds) return;
+    } else if (page >= preview.pageCapacity) {
+        int *new_buffer;
+        new_buffer = HeapReAlloc(GetProcessHeap(), 0, preview.pageEnds,
+                                 sizeof(int) * preview.pageCapacity * 2);
+        if (!new_buffer) return;
+        preview.pageCapacity *= 2;
+        preview.pageEnds = new_buffer;
     }
 
-    barheight = SendMessageW(hReBar, RB_GETBARHEIGHT, 0, 0);
-    ratioHeight = ((float)window.bottom - spacing - (float)barheight) / (float)bmHeight;
-
-    if(preview.hdc2)
-        ratioWidth = ((float)window.right / 2.0 - spacing * 2.0) / (float)bmWidth;
-    else
-        ratioWidth = ((float)window.right - spacing * 3.0) / (float)bmWidth;
-
-    if(ratioWidth > ratioHeight)
-        ratio = ratioHeight;
-    else
-        ratio = ratioWidth;
+    FillRect(lpFr->hdc, paper, GetStockObject(WHITE_BRUSH));
+    if (page > 1 && is_last_preview_page(page - 1)) return;
+    lpFr->chrg.cpMin = page <= 1 ? 0 : preview.pageEnds[page-2];
+    bottom = lpFr->rc.bottom;
+    preview.pageEnds[page-1] = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr);
+
+    /* EM_FORMATRANGE sets fr.rc.bottom to indicate the area printed in,
+     * but we want to keep the original for drawing margins */
+    lpFr->rc.bottom = bottom;
+    SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0);
+}
 
-    bmNewWidth = (int)((float)bmWidth * ratio);
-    bmNewHeight = (int)((float)bmHeight * ratio);
+static void update_preview_buttons(HWND hMainWnd)
+{
+    HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
+    EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1);
+    EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE),
+                 !is_last_preview_page(preview.page) &&
+                 !is_last_preview_page(preview.page + preview.pages_shown - 1));
+    EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES),
+                 preview.pages_shown > 1 ||
+                 (!is_last_preview_page(1) && preview.zoomlevel == 0));
+    EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMIN), preview.zoomlevel < 2);
+    EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMOUT), preview.zoomlevel > 0);
+}
 
-    yOffset = ((window.bottom - bmNewHeight + barheight) / 2);
+LRESULT print_preview(HWND hwndPreview)
+{
+    HDC hdc;
+    RECT window, background;
+    PAINTSTRUCT ps;
+    POINT scrollpos;
 
-    if(!preview.hdc2)
-        xOffset = (window.right - bmNewWidth) / 2;
-    else
-        xOffset = (window.right - bmNewWidth * 2) / 2;
+    hdc = BeginPaint(hwndPreview, &ps);
+    GetClientRect(hwndPreview, &window);
 
-    window.top = barheight;
     FillRect(hdc, &window, GetStockObject(GRAY_BRUSH));
 
-    background.left = xOffset - 2;
-    background.right = xOffset + bmNewWidth + 2;
-    background.top = yOffset - 2;
-    background.bottom = yOffset + bmNewHeight + 2;
+    scrollpos.x = GetScrollPos(hwndPreview, SB_HORZ);
+    scrollpos.y = GetScrollPos(hwndPreview, SB_VERT);
+
+    background.left = preview.spacing.cx - 2 - scrollpos.x;
+    background.right = background.left + preview.bmScaledSize.cx + 4;
+    background.top = preview.spacing.cy - 2 - scrollpos.y;
+    background.bottom = background.top + preview.bmScaledSize.cy + 4;
 
     FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
 
-    if(window.right != preview.window.right || window.bottom != preview.window.bottom)
+    if(preview.pages_shown > 1)
     {
-        draw_preview_page(preview.hdc, &preview.hdcSized, &fr, ratio, bmNewWidth, bmNewHeight, bmWidth, bmHeight);
+        background.left += preview.bmScaledSize.cx + preview.spacing.cx;
+        background.right += preview.bmScaledSize.cx + preview.spacing.cx;
 
-        if(preview.hdc2)
-        {
-            background.left += bmNewWidth + spacing;
-            background.right += bmNewWidth + spacing;
+        FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
+    }
 
-            FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
+    BitBlt(hdc, preview.spacing.cx - scrollpos.x, preview.spacing.cy - scrollpos.y,
+           preview.bmScaledSize.cx, preview.bmScaledSize.cy,
+           preview.hdcSized, 0, 0, SRCCOPY);
 
-            draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, ratio, bmNewWidth, bmNewHeight, bmWidth, bmHeight);
-        }
+    if(preview.pages_shown > 1)
+    {
+        BitBlt(hdc, preview.spacing.cx * 2 + preview.bmScaledSize.cx - scrollpos.x,
+               preview.spacing.cy - scrollpos.y, preview.bmScaledSize.cx,
+               preview.bmScaledSize.cy, preview.hdcSized2, 0, 0, SRCCOPY);
     }
 
-    BitBlt(hdc, xOffset, yOffset, bmNewWidth, bmNewHeight, preview.hdcSized, 0, 0, SRCCOPY);
+    preview.window = window;
+
+    EndPaint(hwndPreview, &ps);
 
-    if(preview.hdc2)
+    return 0;
+}
+
+static void update_preview_statusbar(HWND hMainWnd)
+{
+    HWND hStatusbar = GetDlgItem(hMainWnd, IDC_STATUSBAR);
+    HINSTANCE hInst = GetModuleHandleW(0);
+    WCHAR *p;
+    WCHAR wstr[MAX_STRING_LEN];
+
+    p = wstr;
+    if (preview.pages_shown < 2 || is_last_preview_page(preview.page))
     {
-        BitBlt(hdc, xOffset + bmNewWidth + spacing, yOffset, bmNewWidth, bmNewHeight, preview.hdcSized2, 0, 0, SRCCOPY);
+        static const WCHAR fmt[] = {' ','%','d','\0'};
+        p += LoadStringW(hInst, STRING_PREVIEW_PAGE, wstr, MAX_STRING_LEN);
+        wsprintfW(p, fmt, preview.page);
+    } else {
+        static const WCHAR fmt[] = {' ','%','d','-','%','d','\0'};
+        p += LoadStringW(hInst, STRING_PREVIEW_PAGES, wstr, MAX_STRING_LEN);
+        wsprintfW(p, fmt, preview.page, preview.page + 1);
     }
+    SetWindowTextW(hStatusbar, wstr);
+}
+
+/* Update for page changes. */
+static void update_preview(HWND hMainWnd)
+{
+    RECT paper;
+    HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
+    HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
+    HBITMAP hBitmapCapture;
+    FORMATRANGE fr;
+    HDC hdc = GetDC(hwndPreview);
+
+    fr.hdcTarget = make_dc();
+    fr.rc = fr.rcPage = preview.rcPage;
+    fr.rc.left += margins.left;
+    fr.rc.top += margins.top;
+    fr.rc.bottom -= margins.bottom;
+    fr.rc.right -= margins.right;
+
+    fr.chrg.cpMin = 0;
+    fr.chrg.cpMax = preview.textlength;
+
+    paper.left = 0;
+    paper.right = preview.bmSize.cx;
+    paper.top = 0;
+    paper.bottom = preview.bmSize.cy;
 
+    if (!preview.hdc) {
+        preview.hdc = CreateCompatibleDC(hdc);
+        hBitmapCapture = CreateCompatibleBitmap(hdc, preview.bmSize.cx, preview.bmSize.cy);
+        SelectObject(preview.hdc, hBitmapCapture);
+    }
+
+    fr.hdc = preview.hdc;
+    draw_preview(hEditorWnd, &fr, &paper, preview.page);
+
+    if(preview.pages_shown > 1)
+    {
+        if (!preview.hdc2)
+        {
+            preview.hdc2 = CreateCompatibleDC(hdc);
+            hBitmapCapture = CreateCompatibleBitmap(hdc,
+                                                    preview.bmSize.cx,
+                                                    preview.bmSize.cy);
+            SelectObject(preview.hdc2, hBitmapCapture);
+        }
+
+        fr.hdc = preview.hdc2;
+        draw_preview(hEditorWnd, &fr, &fr.rcPage, preview.page + 1);
+    }
     DeleteDC(fr.hdcTarget);
-    preview.window = window;
+    ReleaseDC(hwndPreview, hdc);
 
-    EndPaint(hMainWnd, &ps);
+    update_scaled_preview(hMainWnd);
+    update_preview_buttons(hMainWnd);
+    update_preview_statusbar(hMainWnd);
+}
 
-    return 0;
+static void toggle_num_pages(HWND hMainWnd)
+{
+    HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
+    WCHAR name[MAX_STRING_LEN];
+    HINSTANCE hInst = GetModuleHandleW(0);
+    int nPreviewPages;
+
+    preview.pages_shown = preview.pages_shown > 1 ? 1 : 2;
+
+    nPreviewPages = preview.zoomlevel > 0 ? preview.saved_pages_shown :
+                                            preview.pages_shown;
+
+    LoadStringW(hInst, nPreviewPages > 1 ? STRING_PREVIEW_ONEPAGE :
+                                           STRING_PREVIEW_TWOPAGES,
+                name, MAX_STRING_LEN);
+
+    SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name);
+    update_preview_sizes(GetDlgItem(hMainWnd, IDC_PREVIEW), TRUE);
+    update_preview(hMainWnd);
 }
 
-static void update_preview(HWND hWnd)
+/* Returns the page shown that the point is in (1 or 2) or 0 if the point
+ * isn't inside either page */
+int preview_page_hittest(POINT pt)
 {
     RECT rc;
+    rc.left = preview.spacing.cx;
+    rc.right = rc.left + preview.bmScaledSize.cx;
+    rc.top = preview.spacing.cy;
+    rc.bottom = rc.top + preview.bmScaledSize.cy;
+    if (PtInRect(&rc, pt))
+        return 1;
+
+    if (preview.pages_shown <= 1)
+        return 0;
 
-    DeleteDC(preview.hdc);
-    preview.hdc = 0;
+    rc.left += preview.bmScaledSize.cx + preview.spacing.cx;
+    rc.right += preview.bmScaledSize.cx + preview.spacing.cx;
+    if (PtInRect(&rc, pt))
+        return is_last_preview_page(preview.page) ? 1 : 2;
 
-    preview.window.right = 0;
+    return 0;
+}
+
+LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    switch(msg)
+    {
+        case WM_CREATE:
+        {
+            HWND hMainWnd = GetParent(hWnd);
+            HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
+            FORMATRANGE fr;
+            GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200};
+            HDC hdc = GetDC(hWnd);
+            HDC hdcTarget = make_dc();
+
+            fr.rc = preview.rcPage = get_print_rect(hdcTarget);
+            preview.rcPage.bottom += margins.bottom;
+            preview.rcPage.right += margins.right;
+            preview.rcPage.top = preview.rcPage.left = 0;
+            fr.rcPage = preview.rcPage;
+
+            preview.bmSize.cx = twips_to_pixels(preview.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX));
+            preview.bmSize.cy = twips_to_pixels(preview.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY));
+
+            preview.textlength = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)&gt, 0);
+
+            fr.hdc = CreateCompatibleDC(hdc);
+            fr.hdcTarget = hdcTarget;
+            fr.chrg.cpMin = 0;
+            fr.chrg.cpMax = preview.textlength;
+            DeleteDC(fr.hdc);
+            DeleteDC(hdcTarget);
+            ReleaseDC(hWnd, hdc);
+
+            update_preview_sizes(hWnd, TRUE);
+            update_preview(hMainWnd);
+            break;
+        }
+
+        case WM_PAINT:
+            return print_preview(hWnd);
+
+        case WM_SIZE:
+        {
+            update_preview_sizes(hWnd, FALSE);
+            update_scaled_preview(hWnd);
+            break;
+        }
+
+        case WM_VSCROLL:
+        case WM_HSCROLL:
+        {
+            SCROLLINFO si;
+            RECT rc;
+            int nBar = (msg == WM_VSCROLL) ? SB_VERT : SB_HORZ;
+            int origPos;
+
+            GetClientRect(hWnd, &rc);
+            si.cbSize = sizeof(si);
+            si.fMask = SIF_ALL;
+            GetScrollInfo(hWnd, nBar, &si);
+            origPos = si.nPos;
+            switch(LOWORD(wParam))
+            {
+                case SB_TOP: /* == SB_LEFT */
+                    si.nPos = si.nMin;
+                    break;
+                case SB_BOTTOM: /* == SB_RIGHT */
+                    si.nPos = si.nMax;
+                    break;
+                case SB_LINEUP: /* == SB_LINELEFT */
+                    si.nPos -= si.nPage / 10;
+                    break;
+                case SB_LINEDOWN: /* == SB_LINERIGHT */
+                    si.nPos += si.nPage / 10;
+                    break;
+                case SB_PAGEUP: /* == SB_PAGELEFT */
+                    si.nPos -= si.nPage;
+                    break;
+                case SB_PAGEDOWN: /* SB_PAGERIGHT */
+                    si.nPos += si.nPage;
+                    break;
+                case SB_THUMBTRACK:
+                    si.nPos = si.nTrackPos;
+                    break;
+            }
+            si.fMask = SIF_POS;
+            SetScrollInfo(hWnd, nBar, &si, TRUE);
+            GetScrollInfo(hWnd, nBar, &si);
+            if (si.nPos != origPos)
+            {
+                int amount = origPos - si.nPos;
+                if (msg == WM_VSCROLL)
+                    ScrollWindow(hWnd, 0, amount, NULL, NULL);
+                else
+                    ScrollWindow(hWnd, amount, 0, NULL, NULL);
+            }
+            return 0;
+        }
+
+        case WM_SETCURSOR:
+        {
+            POINT pt;
+            RECT rc;
+            int bHittest = FALSE;
+            DWORD messagePos = GetMessagePos();
+            pt.x = (short)LOWORD(messagePos);
+            pt.y = (short)HIWORD(messagePos);
+            ScreenToClient(hWnd, &pt);
+
+            GetClientRect(hWnd, &rc);
+            if (PtInRect(&rc, pt))
+            {
+                pt.x += GetScrollPos(hWnd, SB_HORZ);
+                pt.y += GetScrollPos(hWnd, SB_VERT);
+                bHittest = preview_page_hittest(pt);
+            }
+
+            if (bHittest)
+                SetCursor(LoadCursorW(GetModuleHandleW(0),
+                                      MAKEINTRESOURCEW(IDC_ZOOM)));
+            else
+                SetCursor(LoadCursorW(NULL, (WCHAR*)IDC_ARROW));
 
-    GetClientRect(hWnd, &rc);
-    rc.top += SendMessageW(GetDlgItem(hWnd, IDC_REBAR), RB_GETBARHEIGHT, 0, 0);
-    InvalidateRect(hWnd, &rc, TRUE);
+            return TRUE;
+        }
+
+        case WM_LBUTTONDOWN:
+        {
+            int page;
+            POINT pt;
+            pt.x = (short)LOWORD(lParam) + GetScrollPos(hWnd, SB_HORZ);
+            pt.y = (short)HIWORD(lParam) + GetScrollPos(hWnd, SB_VERT);
+            if ((page = preview_page_hittest(pt)) > 0)
+            {
+                HWND hMainWnd = GetParent(hWnd);
+
+                /* Convert point from client coordinate to unzoomed page
+                 * coordinate. */
+                pt.x -= preview.spacing.cx;
+                if (page > 1)
+                    pt.x -= preview.bmScaledSize.cx + preview.spacing.cx;
+                pt.y -= preview.spacing.cy;
+                pt.x /= preview.zoomratio;
+                pt.y /= preview.zoomratio;
+
+                if (preview.zoomlevel == 0)
+                    preview.saved_pages_shown = preview.pages_shown;
+                preview.zoomlevel = (preview.zoomlevel + 1) % 3;
+                preview.zoomratio = 0;
+                if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1)
+                {
+                    toggle_num_pages(hMainWnd);
+                } else if (preview.pages_shown > 1) {
+                    if (page >= 2) preview.page++;
+                    toggle_num_pages(hMainWnd);
+                } else {
+                    update_preview_sizes(hWnd, TRUE);
+                    update_scaled_preview(hMainWnd);
+                    update_preview_buttons(hMainWnd);
+                }
+
+                if (preview.zoomlevel > 0) {
+                    SCROLLINFO si;
+                    /* Convert the coordinate back to client coordinate. */
+                    pt.x *= preview.zoomratio;
+                    pt.y *= preview.zoomratio;
+                    pt.x += preview.spacing.cx;
+                    pt.y += preview.spacing.cy;
+                    /* Scroll to center view at that point on the page */
+                    si.cbSize = sizeof(si);
+                    si.fMask = SIF_PAGE;
+                    GetScrollInfo(hWnd, SB_HORZ, &si);
+                    pt.x -= si.nPage / 2;
+                    SetScrollPos(hWnd, SB_HORZ, pt.x, TRUE);
+                    GetScrollInfo(hWnd, SB_VERT, &si);
+                    pt.y -= si.nPage / 2;
+                    SetScrollPos(hWnd, SB_VERT, pt.y, TRUE);
+                }
+            }
+        }
+
+        default:
+            return DefWindowProcW(hWnd, msg, wParam, lParam);
+    }
+
+    return 0;
 }
 
 LRESULT preview_command(HWND hWnd, WPARAM wParam)
@@ -843,29 +1271,44 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam)
         break;
 
         case ID_PREVIEW_NUMPAGES:
-        {
-            HWND hReBar = GetDlgItem(hWnd, IDC_REBAR);
-            WCHAR name[MAX_STRING_LEN];
-            HINSTANCE hInst = (HINSTANCE)GetWindowLongPtrW(hWnd, GWLP_HINSTANCE);
+            toggle_num_pages(hWnd);
+            break;
 
-            if(preview.hdc2)
-            {
-                DeleteDC(preview.hdc2);
-                preview.hdc2 = 0;
-            } else
+        case ID_PREVIEW_ZOOMIN:
+            if (preview.zoomlevel < 2)
             {
-                if(preview.page == preview.pages)
-                    preview.page--;
-                preview.hdc2 = (HDC)-1;
+                if (preview.zoomlevel == 0)
+                    preview.saved_pages_shown = preview.pages_shown;
+                preview.zoomlevel++;
+                preview.zoomratio = 0;
+                if (preview.pages_shown > 1)
+                {
+                    /* Forced switch to one page when zooming in. */
+                    toggle_num_pages(hWnd);
+                } else {
+                    HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW);
+                    update_preview_sizes(hwndPreview, TRUE);
+                    update_scaled_preview(hWnd);
+                    update_preview_buttons(hWnd);
+                }
             }
+            break;
 
-            LoadStringW(hInst, preview.hdc2 ? STRING_PREVIEW_ONEPAGE : STRING_PREVIEW_TWOPAGES,
-                        name, MAX_STRING_LEN);
-
-            SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name);
-            update_preview(hWnd);
-        }
-        break;
+        case ID_PREVIEW_ZOOMOUT:
+            if (preview.zoomlevel > 0)
+            {
+                HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW);
+                preview.zoomlevel--;
+                preview.zoomratio = 0;
+                if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1) {
+                    toggle_num_pages(hWnd);
+                } else {
+                    update_preview_sizes(hwndPreview, TRUE);
+                    update_scaled_preview(hWnd);
+                    update_preview_buttons(hWnd);
+                }
+            }
+            break;
 
         case ID_PRINT:
             dialog_print(hWnd, preview.wszFileName);
index c7edc5b..7311fb6 100644 (file)
@@ -27,6 +27,7 @@
 static const WCHAR key_recentfiles[] = {'R','e','c','e','n','t',' ','f','i','l','e',
                                         ' ','l','i','s','t',0};
 static const WCHAR key_options[] = {'O','p','t','i','o','n','s',0};
+static const WCHAR key_settings[] = {'S','e','t','t','i','n','g','s',0};
 static const WCHAR key_rtf[] = {'R','T','F',0};
 static const WCHAR key_text[] = {'T','e','x','t',0};
 
@@ -94,9 +95,14 @@ void registry_set_options(HWND hMainWnd)
         RegSetValueExW(hKey, var_maximized, 0, REG_DWORD, (LPBYTE)&isMaximized, sizeof(DWORD));
 
         registry_set_pagemargins(hKey);
+        RegCloseKey(hKey);
     }
 
-    RegCloseKey(hKey);
+    if(registry_get_handle(&hKey, &action, key_settings) == ERROR_SUCCESS)
+    {
+        registry_set_previewpages(hKey);
+        RegCloseKey(hKey);
+    }
 }
 
 void registry_read_winrect(RECT* rc)
@@ -339,6 +345,13 @@ void registry_read_options(void)
         registry_read_pagemargins(hKey);
         RegCloseKey(hKey);
     }
+
+    if(registry_get_handle(&hKey, 0, key_settings) != ERROR_SUCCESS) {
+        registry_read_previewpages(NULL);
+    } else {
+        registry_read_previewpages(hKey);
+        RegCloseKey(hKey);
+    }
 }
 
 static void registry_read_formatopts(int index, LPCWSTR key, DWORD barState[], DWORD wordWrap[])
index 4786e66..a3f66c5 100644 (file)
@@ -1,4 +1,4 @@
-/*
+/*
  * Copyright 2004 by Krzysztof Foltman
  * Copyright 2007 by Alexander N. Sørnes <alex@thehandofagony.com>
  *
@@ -61,20 +61,28 @@ IDI_WRI ICON "wri.ico"
 /* @makedep: txt.ico */
 IDI_TXT ICON "txt.ico"
 
+/* @makedep: zoom.cur */
+IDC_ZOOM CURSOR "zoom.cur"
+
+
 #include "Da.rc"
-#include "De.rc"
 #include "En.rc"
-#include "Fr.rc"
 #include "Hu.rc"
-#include "Ja.rc"
 #include "Ko.rc"
-#include "Lt.rc"
 #include "Nl.rc"
-#include "No.rc"
 #include "Pl.rc"
+#include "Tr.rc"
+
+/* UTF-8 */
+#include "De.rc"
+#include "Fr.rc"
+#include "It.rc"
+#include "Ja.rc"
+#include "Lt.rc"
+#include "No.rc"
 #include "Pt.rc"
 #include "Ru.rc"
 #include "Si.rc"
 #include "Sv.rc"
-#include "Tr.rc"
+#include "Uk.rc"
 #include "Zh.rc"
index e983c5d..b9e6f37 100644 (file)
@@ -56,10 +56,14 @@ static const WCHAR wszMainWndClass[] = {'W','O','R','D','P','A','D','T','O','P',
 
 static const WCHAR stringFormat[] = {'%','2','d','\0'};
 
+const WCHAR wszPreviewWndClass[] = {'P','r','t','P','r','e','v','i','e','w',0};
+LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
 static HWND hMainWnd;
 static HWND hEditorWnd;
 static HWND hFindWnd;
 static HMENU hPopupMenu;
+static HMENU hColorPopupMenu;
 
 static UINT ID_FINDMSGSTRING;
 
@@ -85,7 +89,7 @@ static void DoLoadStrings(void)
     static const WCHAR files_txt[] = {'*','.','t','x','t','\0'};
     static const WCHAR files_all[] = {'*','.','*','\0'};
 
-    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE);
+    HINSTANCE hInstance = GetModuleHandleW(0);
 
     LoadStringW(hInstance, STRING_RICHTEXT_FILES_RTF, p, MAX_STRING_LEN);
     p += lstrlenW(p) + 1;
@@ -683,8 +687,7 @@ static void set_bar_states(void)
 
 static void preview_exit(HWND hMainWnd)
 {
-    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE);
-    HMENU hMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_MAINMENU));
+    HMENU hMenu = LoadMenuW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDM_MAINMENU));
     HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
 
     set_bar_states();
@@ -701,7 +704,7 @@ static void preview_exit(HWND hMainWnd)
 static void set_fileformat(WPARAM format)
 {
     HICON hIcon;
-    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE);
+    HINSTANCE hInstance = GetModuleHandleW(0);
     fileFormat = format;
 
     if(format & SF_TEXT)
@@ -980,8 +983,7 @@ static void DialogOpenFile(void)
 
 static void dialog_about(void)
 {
-    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE);
-    HICON icon = LoadImageW(hInstance, MAKEINTRESOURCEW(IDI_WORDPAD), IMAGE_ICON, 48, 48, LR_SHARED);
+    HICON icon = LoadImageW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDI_WORDPAD), IMAGE_ICON, 48, 48, LR_SHARED);
     ShellAboutW(hMainWnd, wszAppTitle, 0, icon);
 }
 
@@ -1088,7 +1090,7 @@ static void dialog_viewproperties(void)
     PROPSHEETPAGEW psp[2];
     PROPSHEETHEADERW psh;
     size_t i;
-    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE);
+    HINSTANCE hInstance = GetModuleHandleW(0);
     LPCPROPSHEETPAGEW ppsp = (LPCPROPSHEETPAGEW)&psp;
 
     psp[0].dwSize = sizeof(PROPSHEETPAGEW);
@@ -1241,7 +1243,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr)
         if(pFr->Flags & FR_WHOLEWORD)
             flags |= FR_WHOLEWORD;
 
-        ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, (WPARAM)flags, (LPARAM)&ft);
+        ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, flags, (LPARAM)&ft);
 
         if(ret == -1)
         {
@@ -1250,7 +1252,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr)
                 ft.chrg.cpMin = cr.cpMin = 0;
                 ft.chrg.cpMax = cr.cpMax = startPos;
 
-                ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, (WPARAM)flags, (LPARAM)&ft);
+                ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, flags, (LPARAM)&ft);
             }
         }
 
@@ -1263,7 +1265,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr)
         {
             end = ret + lstrlenW(pFr->lpstrFindWhat);
             cr.cpMin = end;
-            SendMessageW(hEditorWnd, EM_SETSEL, (WPARAM)ret, (LPARAM)end);
+            SendMessageW(hEditorWnd, EM_SETSEL, ret, end);
             SendMessageW(hEditorWnd, EM_SCROLLCARET, 0, 0);
 
             if(pFr->Flags & FR_REPLACE || pFr->Flags & FR_REPLACEALL)
@@ -1414,7 +1416,7 @@ static INT_PTR CALLBACK newfile_proc(HWND hWnd, UINT message, WPARAM wParam, LPA
     {
         case WM_INITDIALOG:
             {
-                HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE);
+                HINSTANCE hInstance = GetModuleHandleW(0);
                 WCHAR buffer[MAX_STRING_LEN];
                 HWND hListWnd = GetDlgItem(hWnd, IDC_NEWFILE);
 
@@ -1459,8 +1461,7 @@ static INT_PTR CALLBACK paraformat_proc(HWND hWnd, UINT message, WPARAM wParam,
     {
         case WM_INITDIALOG:
             {
-                HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd,
-                                                                  GWLP_HINSTANCE);
+                HINSTANCE hInstance = GetModuleHandleW(0);
                 WCHAR buffer[MAX_STRING_LEN];
                 HWND hListWnd = GetDlgItem(hWnd, IDC_PARA_ALIGN);
                 HWND hLeftWnd = GetDlgItem(hWnd, IDC_PARA_LEFT);
@@ -1737,7 +1738,7 @@ static int context_menu(LPARAM lParam)
         int from = 0, to = 0;
         POINTL pt;
         SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&from, (LPARAM)&to);
-        SendMessageW(hEditorWnd, EM_POSFROMCHAR, (WPARAM)&pt, (LPARAM)to);
+        SendMessageW(hEditorWnd, EM_POSFROMCHAR, (WPARAM)&pt, to);
         ClientToScreen(hEditorWnd, (POINT*)&pt);
         x = pt.x;
         y = pt.y;
@@ -1752,7 +1753,7 @@ static int context_menu(LPARAM lParam)
 static LRESULT OnCreate( HWND hWnd )
 {
     HWND hToolBarWnd, hFormatBarWnd,  hReBarWnd, hFontListWnd, hSizeListWnd, hRulerWnd;
-    HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
+    HINSTANCE hInstance = GetModuleHandleW(0);
     HANDLE hDLL;
     TBADDBITMAP ab;
     int nStdBitmaps = 0;
@@ -1836,17 +1837,18 @@ static LRESULT OnCreate( HWND hWnd )
 
     hFormatBarWnd = CreateToolbarEx(hReBarWnd,
          CCS_NOPARENTALIGN | CCS_NOMOVEY | WS_VISIBLE | TBSTYLE_TOOLTIPS | TBSTYLE_BUTTON,
-         IDC_FORMATBAR, 7, hInstance, IDB_FORMATBAR, NULL, 0, 16, 16, 16, 16, sizeof(TBBUTTON));
+         IDC_FORMATBAR, 8, hInstance, IDB_FORMATBAR, NULL, 0, 16, 16, 16, 16, sizeof(TBBUTTON));
 
     AddButton(hFormatBarWnd, 0, ID_FORMAT_BOLD);
     AddButton(hFormatBarWnd, 1, ID_FORMAT_ITALIC);
     AddButton(hFormatBarWnd, 2, ID_FORMAT_UNDERLINE);
+    AddButton(hFormatBarWnd, 3, ID_FORMAT_COLOR);
     AddSeparator(hFormatBarWnd);
-    AddButton(hFormatBarWnd, 3, ID_ALIGN_LEFT);
-    AddButton(hFormatBarWnd, 4, ID_ALIGN_CENTER);
-    AddButton(hFormatBarWnd, 5, ID_ALIGN_RIGHT);
+    AddButton(hFormatBarWnd, 4, ID_ALIGN_LEFT);
+    AddButton(hFormatBarWnd, 5, ID_ALIGN_CENTER);
+    AddButton(hFormatBarWnd, 6, ID_ALIGN_RIGHT);
     AddSeparator(hFormatBarWnd);
-    AddButton(hFormatBarWnd, 6, ID_BULLET);
+    AddButton(hFormatBarWnd, 7, ID_BULLET);
 
     SendMessageW(hFormatBarWnd, TB_AUTOSIZE, 0, 0);
 
@@ -2001,6 +2003,15 @@ static LRESULT OnNotify( HWND hWnd, LPARAM lParam)
     return 0;
 }
 
+/* Copied from dlls/comdlg32/fontdlg.c */
+static const COLORREF textcolors[]=
+{
+    0x00000000L,0x00000080L,0x00008000L,0x00008080L,
+    0x00800000L,0x00800080L,0x00808000L,0x00808080L,
+    0x00c0c0c0L,0x000000ffL,0x0000ff00L,0x0000ffffL,
+    0x00ff0000L,0x00ff00ffL,0x00ffff00L,0x00FFFFFFL
+};
+
 static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
     HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR);
@@ -2018,7 +2029,7 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
 
     case ID_FILE_NEW:
         {
-            HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
+            HINSTANCE hInstance = GetModuleHandleW(0);
             int ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_NEWFILE), hWnd,
                                 newfile_proc);
 
@@ -2098,7 +2109,7 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
         break;
 
     case ID_PRINT_QUICK:
-        print_quick(wszFileName);
+        print_quick(hMainWnd, wszFileName);
         target_device(hMainWnd, wordWrap[reg_formatindex(fileFormat)]);
         break;
 
@@ -2106,7 +2117,7 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
         {
             int index = reg_formatindex(fileFormat);
             DWORD tmp = barState[index];
-            barState[index] = 0;
+            barState[index] = 1 << BANDID_STATUSBAR;
             set_bar_states();
             barState[index] = tmp;
             ShowWindow(hEditorWnd, FALSE);
@@ -2152,6 +2163,46 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
         break;
         }
 
+    case ID_FORMAT_COLOR:
+    {
+        HWND hReBarWnd = GetDlgItem(hWnd, IDC_REBAR);
+        HWND hFormatBarWnd = GetDlgItem(hReBarWnd, IDC_FORMATBAR);
+        HMENU hPop;
+        RECT itemrc;
+        POINT pt;
+        int mid;
+        int itemidx = SendMessage(hFormatBarWnd, TB_COMMANDTOINDEX, ID_FORMAT_COLOR, 0);
+
+        SendMessage(hFormatBarWnd, TB_GETITEMRECT, itemidx, (LPARAM)&itemrc);
+        pt.x = itemrc.left;
+        pt.y = itemrc.bottom;
+        ClientToScreen(hFormatBarWnd, &pt);
+        hPop = GetSubMenu(hColorPopupMenu, 0);
+        mid = TrackPopupMenu(hPop, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON |
+                                   TPM_RETURNCMD | TPM_NONOTIFY,
+                             pt.x, pt.y, 0, hWnd, 0);
+        if (mid >= ID_COLOR_FIRST && mid <= ID_COLOR_AUTOMATIC)
+        {
+            CHARFORMAT2W fmt;
+
+            ZeroMemory(&fmt, sizeof(fmt));
+            fmt.cbSize = sizeof(fmt);
+            SendMessageW(hwndEditor, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&fmt);
+
+            fmt.dwMask = CFM_COLOR;
+
+            if (mid < ID_COLOR_AUTOMATIC) {
+                fmt.crTextColor = textcolors[mid - ID_COLOR_FIRST];
+                fmt.dwEffects &= ~CFE_AUTOCOLOR;
+            } else {
+                fmt.dwEffects |= CFE_AUTOCOLOR;
+            }
+
+            SendMessageW(hwndEditor, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&fmt);
+        }
+        break;
+    }
+
     case ID_EDIT_CUT:
         PostMessageW(hwndEditor, WM_CUT, 0, 0);
         break;
@@ -2334,25 +2385,15 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
         break;
 
     case ID_DATETIME:
-        {
-        HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
-        DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_DATETIME), hWnd, datetime_proc);
+        DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_DATETIME), hWnd, datetime_proc);
         break;
-        }
 
     case ID_PARAFORMAT:
-        {
-            HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
-            DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_PARAFORMAT), hWnd,
-                       paraformat_proc);
-        }
+        DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_PARAFORMAT), hWnd, paraformat_proc);
         break;
 
     case ID_TABSTOPS:
-        {
-            HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
-            DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_TABSTOPS), hWnd, tabstops_proc);
-        }
+        DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_PARAFORMAT), hWnd, tabstops_proc);
         break;
 
     case ID_ABOUT:
@@ -2460,7 +2501,7 @@ static LRESULT OnSize( HWND hWnd, WPARAM wParam, LPARAM lParam )
 {
     int nStatusSize = 0;
     RECT rc;
-    HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR);
+    HWND hwndEditor = preview_isactive() ? GetDlgItem(hWnd, IDC_PREVIEW) : GetDlgItem(hWnd, IDC_EDITOR);
     HWND hwndStatusBar = GetDlgItem(hWnd, IDC_STATUSBAR);
     HWND hwndReBar = GetDlgItem(hWnd, IDC_REBAR);
     HWND hRulerWnd = GetDlgItem(hWnd, IDC_RULER);
@@ -2563,9 +2604,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPara
         }
         break;
     case WM_PAINT:
-        if(preview_isactive())
-            return print_preview(hWnd);
-        else
+        if(!preview_isactive())
             return DefWindowProcW(hWnd, msg, wParam, lParam);
 
     default:
@@ -2605,6 +2644,18 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar
     wc.lpszClassName = wszMainWndClass;
     RegisterClassW(&wc);
 
+    wc.style = CS_HREDRAW | CS_VREDRAW;
+    wc.lpfnWndProc = preview_proc;
+    wc.cbClsExtra = 0;
+    wc.cbWndExtra = 0;
+    wc.hInstance = hInstance;
+    wc.hIcon = NULL;
+    wc.hCursor = LoadCursor(NULL, IDC_IBEAM);
+    wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
+    wc.lpszMenuName = NULL;
+    wc.lpszClassName = wszPreviewWndClass;
+    RegisterClassW(&wc);
+
     registry_read_winrect(&rc);
     hMainWnd = CreateWindowExW(0, wszMainWndClass, wszAppTitle, WS_CLIPCHILDREN|WS_OVERLAPPEDWINDOW,
       rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, NULL, NULL, hInstance, NULL);
@@ -2618,6 +2669,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar
     set_bar_states();
     set_fileformat(SF_RTF);
     hPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_POPUP));
+    hColorPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_COLOR_POPUP));
     get_default_printer_opts();
     target_device(hMainWnd, wordWrap[reg_formatindex(fileFormat)]);
 
index b51bec8..2f774c3 100644 (file)
@@ -49,6 +49,8 @@
 #define ID_PREVIEW_NEXTPAGE 1017
 #define ID_PREVIEW_PREVPAGE 1018
 #define ID_PREVIEW_NUMPAGES 1019
+#define ID_PREVIEW_ZOOMIN 1020
+#define ID_PREVIEW_ZOOMOUT 1021
 
 #define ID_ALIGN_LEFT 1100
 #define ID_ALIGN_CENTER 1101
 #define ID_FORMAT_BOLD 1400
 #define ID_FORMAT_ITALIC 1401
 #define ID_FORMAT_UNDERLINE 1402
+#define ID_FORMAT_COLOR 1403
 
 #define ID_TOGGLE_TOOLBAR 1500
 #define ID_TOGGLE_FORMATBAR 1501
 #define ID_TOGGLE_STATUSBAR 1502
 #define ID_TOGGLE_RULER 1503
 
-#define PREVIEW_BUTTONS 5
+#define PREVIEW_BUTTONS 7
 
 #define FILELIST_ENTRIES 4
 #define FILELIST_ENTRY_LENGTH 33
 #define BANDID_PREVIEW_BTN3 8
 #define BANDID_PREVIEW_BTN4 9
 #define BANDID_PREVIEW_BTN5 10
-#define BANDID_PREVIEW_BUFFER 11
+#define BANDID_PREVIEW_BTN6 11
+#define BANDID_PREVIEW_BTN7 12
+#define BANDID_PREVIEW_BUFFER 13
 
 #define ID_WORDWRAP_NONE 0
 #define ID_WORDWRAP_WINDOW 1
 #define ID_ABOUT 1603
 #define ID_VIEWPROPERTIES 1604
 
+#define ID_COLOR_FIRST 1800
+#define ID_COLOR_BLACK 1800
+#define ID_COLOR_MAROON 1801
+#define ID_COLOR_GREEN 1802
+#define ID_COLOR_OLIVE 1803
+#define ID_COLOR_NAVY 1804
+#define ID_COLOR_PURPLE 1805
+#define ID_COLOR_TEAL 1806
+#define ID_COLOR_GRAY 1807
+#define ID_COLOR_SILVER 1808
+#define ID_COLOR_RED 1809
+#define ID_COLOR_LIME 1810
+#define ID_COLOR_YELLOW 1811
+#define ID_COLOR_BLUE 1812
+#define ID_COLOR_FUCHSIA 1813
+#define ID_COLOR_AQUA 1814
+#define ID_COLOR_WHITE 1815
+#define ID_COLOR_AUTOMATIC 1816
+
 #define IDC_STATUSBAR 2000
 #define IDC_EDITOR 2001
 #define IDC_TOOLBAR 2002
 #define IDC_FONTLIST 2013
 #define IDC_SIZELIST 2014
 #define IDC_RULER 2015
+#define IDC_PREVIEW 2016
 
 #define IDD_DATETIME 2100
 #define IDD_NEWFILE 2101
 
 #define IDM_MAINMENU 2200
 #define IDM_POPUP 2201
+#define IDM_COLOR_POPUP 2202
 
 #define IDB_TOOLBAR 100
 #define IDB_FORMATBAR 101
 #define IDI_WRI 104
 #define IDI_TXT 105
 
+#define IDC_ZOOM 106
+
 #define STRING_ALL_FILES 1400
 #define STRING_TEXT_FILES_TXT 1401
 #define STRING_TEXT_FILES_UNICODE_TXT 1402
 #define STRING_PREVIEW_PREVPAGE 1450
 #define STRING_PREVIEW_TWOPAGES 1451
 #define STRING_PREVIEW_ONEPAGE 1452
-#define STRING_PREVIEW_CLOSE 1453
+#define STRING_PREVIEW_ZOOMIN 1453
+#define STRING_PREVIEW_ZOOMOUT 1454
+#define STRING_PREVIEW_CLOSE 1455
+#define STRING_PREVIEW_PAGE 1456
+#define STRING_PREVIEW_PAGES 1457
 
-#define STRING_UNITS_CM 1454
+#define STRING_UNITS_CM 1458
 
 #define STRING_DEFAULT_FILENAME 1700
 #define STRING_PROMPT_SAVE_CHANGES 1701
@@ -210,7 +242,7 @@ LPWSTR file_basename(LPWSTR);
 void dialog_printsetup(HWND);
 void dialog_print(HWND, LPWSTR);
 void target_device(HWND, DWORD);
-void print_quick(LPWSTR);
+void print_quick(HWND, LPWSTR);
 LRESULT preview_command(HWND, WPARAM);
 void init_preview(HWND, LPWSTR);
 void close_preview(HWND);
@@ -219,6 +251,8 @@ LRESULT print_preview(HWND);
 void get_default_printer_opts(void);
 void registry_set_pagemargins(HKEY);
 void registry_read_pagemargins(HKEY);
+void registry_set_previewpages(HKEY hKey);
+void registry_read_previewpages(HKEY hKey);
 LRESULT CALLBACK ruler_proc(HWND, UINT, WPARAM, LPARAM);
 void redraw_ruler(HWND);
 
diff --git a/reactos/base/applications/wordpad/zoom.cur b/reactos/base/applications/wordpad/zoom.cur
new file mode 100644 (file)
index 0000000..26d1a8f
Binary files /dev/null and b/reactos/base/applications/wordpad/zoom.cur differ
index 83cb909..db175a0 100644 (file)
@@ -27,4 +27,3 @@ STRINGTABLE
 {
     IDS_FAILED, "Der Start von Wordpad ist fehlgeschlagen"
 }
-#pragma code_page(default)
index 69105d9..a81dffd 100644 (file)
@@ -28,4 +28,3 @@ STRINGTABLE
 {
     IDS_FAILED, "Wordpad n'a pas pu être démarré"
 }
-#pragma code_page(default)
similarity index 64%
rename from reactos/base/system/msiexec/version.rc
rename to reactos/base/applications/write/It.rc
index 0777594..b906a79 100644 (file)
@@ -1,5 +1,7 @@
 /*
- * Copyright (c) 2004 Mike McCormack
+ * Italian language support
+ *
+ * Copyright (C) 2010 by Luca Bennati
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#define WINE_FILEDESCRIPTION_STR "Wine Installer"
-#define WINE_FILENAME_STR "msiexec.exe"
-#define WINE_FILETYPE VFT_APP
-#define WINE_FILEVERSION 3,1,4000,1823
-#define WINE_FILEVERSION_STR "3.1.4000.1823"
-#define WINE_PRODUCTVERSION 3,1,4000,1823
-#define WINE_PRODUCTVERSION_STR "3.1.4000.1823"
-#define WINE_PRODUCTNAME_STR "Wine Installer"
+#include "resources.h"
+
+/*UTF-8*/
+#pragma code_page(65001)
+
+LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
 
-#include "wine/wine_common_ver.rc"
+STRINGTABLE
+{
+    IDS_FAILED, "Impossibile avviare WordPad"
+}
index 6b942ce..5c9a825 100644 (file)
@@ -29,4 +29,3 @@ STRINGTABLE
 {
     IDS_FAILED, "Wordpad の起動に失敗しました"
 }
-#pragma code_page(default)
index 8e3eae3..5cef934 100644 (file)
@@ -29,4 +29,3 @@ STRINGTABLE
 {
     IDS_FAILED, "Nepavyko paleisti Wordpad"
 }
-#pragma code_page(default)
index a871350..f6a7b65 100644 (file)
@@ -27,4 +27,3 @@ STRINGTABLE
 {
     IDS_FAILED, "Execuția Wordpad a eșuat"
 }
-#pragma code_page(default)
index e64003f..008011f 100644 (file)
@@ -29,4 +29,3 @@ STRINGTABLE
 {
     IDS_FAILED, "Не удалось запустить Wordpad"
 }
-#pragma code_page(default)
index 3eaae9e..9d3e5fe 100644 (file)
@@ -28,4 +28,3 @@ STRINGTABLE
 {
     IDS_FAILED, "Zagon programa Wordpad ni uspel"
 }
-#pragma code_page(default)
diff --git a/reactos/base/applications/write/Uk.rc b/reactos/base/applications/write/Uk.rc
new file mode 100644 (file)
index 0000000..f922210
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Ukrainian language support
+ *
+ * Copyright (C) 2007 Mikolaj Zalewski
+ *
+ * Copyright (C) 2010 Igor Paliychuk
+ *
+ * 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 "resources.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+    IDS_FAILED, "Не вдалось запустити Wordpad"
+}
index 7c55c30..45c5d30 100644 (file)
 
 LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 
-#include "De.rc"
 #include "En.rc"
-#include "Fr.rc"
-#include "Ja.rc"
 #include "Ko.rc"
-#include "Lt.rc"
 #include "Nl.rc"
+#include "No.rc"
+#include "Pl.rc"
 #include "Pt.rc"
+#include "Sv.rc"
+
+/* UTF-8 */
+#include "De.rc"
+#include "Fr.rc"
+#include "It.rc"
+#include "Ja.rc"
+#include "Lt.rc"
 #include "Ro.rc"
 #include "Ru.rc"
 #include "Si.rc"
-#include "Sv.rc"
+#include "Uk.rc"
index 8b18010..db263bc 100644 (file)
@@ -57,6 +57,7 @@
 #include <winsock2.h>
 #include "dhcpd.h"
 #include "privsep.h"
+#include "debug.h"
 
 #define        PERIOD 0x2e
 #define        hyphenchar(c) ((c) == 0x2d)
@@ -109,22 +110,106 @@ int              check_arp( struct interface_info *ip, struct client_lease *lp )
 
 time_t scripttime;
 
+
+static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv);
+static WCHAR ServiceName[] = L"DHCP";
+static SERVICE_TABLE_ENTRYW ServiceTable[] =
+{
+    {ServiceName, ServiceMain},
+    {NULL, NULL}
+};
+
+SERVICE_STATUS_HANDLE ServiceStatusHandle;
+SERVICE_STATUS ServiceStatus;
+
+
 /* XXX Implement me */
 int check_arp( struct interface_info *ip, struct client_lease *lp ) {
     return 1;
 }
 
-static VOID CALLBACK
-DispatchMain(DWORD argc, LPTSTR *argv)
+
+static VOID
+UpdateServiceStatus(DWORD dwState)
 {
-       dispatch();
+    ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+    ServiceStatus.dwCurrentState = dwState;
+
+    ServiceStatus.dwControlsAccepted = 0;
+
+    ServiceStatus.dwWin32ExitCode = 0;
+    ServiceStatus.dwServiceSpecificExitCode = 0;
+    ServiceStatus.dwCheckPoint = 0;
+
+    if (dwState == SERVICE_START_PENDING ||
+        dwState == SERVICE_STOP_PENDING ||
+        dwState == SERVICE_PAUSE_PENDING ||
+        dwState == SERVICE_CONTINUE_PENDING)
+        ServiceStatus.dwWaitHint = 10000;
+    else
+        ServiceStatus.dwWaitHint = 0;
+
+    SetServiceStatus(ServiceStatusHandle,
+                     &ServiceStatus);
 }
 
-static SERVICE_TABLE_ENTRY ServiceTable[2] =
+
+static DWORD WINAPI
+ServiceControlHandler(DWORD dwControl,
+                      DWORD dwEventType,
+                      LPVOID lpEventData,
+                      LPVOID lpContext)
 {
-    {TEXT("DHCP"), DispatchMain},
-    {NULL, NULL}
-};
+    switch (dwControl)
+    {
+        case SERVICE_CONTROL_STOP:
+            UpdateServiceStatus(SERVICE_STOP_PENDING);
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_PAUSE:
+            UpdateServiceStatus(SERVICE_PAUSED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_CONTINUE:
+            UpdateServiceStatus(SERVICE_START_PENDING);
+            UpdateServiceStatus(SERVICE_RUNNING);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_INTERROGATE:
+            SetServiceStatus(ServiceStatusHandle,
+                             &ServiceStatus);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_SHUTDOWN:
+            UpdateServiceStatus(SERVICE_STOP_PENDING);
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        default :
+            return ERROR_CALL_NOT_IMPLEMENTED;
+    }
+}
+
+
+static VOID CALLBACK
+ServiceMain(DWORD argc, LPWSTR *argv)
+{
+    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
+                                                        ServiceControlHandler,
+                                                        NULL);
+    if (!ServiceStatusHandle)
+    {
+        return;
+    }
+
+    UpdateServiceStatus(SERVICE_START_PENDING);
+
+    UpdateServiceStatus(SERVICE_RUNNING);
+
+    dispatch();
+}
+
 
 int
 main(int argc, char *argv[])
@@ -147,7 +232,7 @@ main(int argc, char *argv[])
 
         DH_DbgPrint(MID_TRACE,("Going into dispatch()\n"));
 
-       StartServiceCtrlDispatcher(ServiceTable);
+       StartServiceCtrlDispatcherW(ServiceTable);
 
        /* not reached */
        return (0);
index 369b8ee..de374aa 100644 (file)
@@ -6,8 +6,8 @@
  * DEFINES:     DBG     - Enable debug output
  *              NASSERT - Disable assertions
  */
-#ifndef __DEBUG_H
-#define __DEBUG_H
+
+#pragma once
 
 #define NORMAL_MASK    0x000000FF
 #define SPECIAL_MASK   0xFFFFFF00
@@ -48,6 +48,4 @@ extern unsigned long debug_trace_level;
 
 #endif /* DBG */
 
-#endif /* __DEBUG_H */
-
 /* EOF */
index 44bae6d..d6a2fa4 100644 (file)
@@ -39,8 +39,7 @@
  * Enterprises, see ``http://www.vix.com''.
  */
 
-#ifndef DHCPD_H
-#define DHCPD_H
+#pragma once
 
 #include <winsock2.h>
 #include <iphlpapi.h>
@@ -484,5 +483,3 @@ int          buf_add(struct buf *, void *, size_t);
 int             buf_close(int, struct buf *);
 ssize_t                 buf_read(int, void *, size_t);
 void            dispatch_imsg(int);
-
-#endif/*DHCPD_H*/
index 7f2515b..59fb94b 100644 (file)
@@ -1,7 +1,4 @@
-#ifndef REACTOS_PREDEC_H
-#define REACTOS_PREDEC_H
+#pragma once
 
 struct iaddr;
 struct interface_info;
-
-#endif
index 988c303..a45def0 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef REACTOS_STDINT_H
-#define REACTOS_STDINT_H
+#pragma once
 
 typedef signed char int8_t;
 typedef unsigned char u_int8_t;
@@ -9,5 +8,3 @@ typedef int int32_t;
 typedef unsigned int u_int32_t;
 
 typedef char *caddr_t;
-
-#endif
index 9a2ddab..7066335 100644 (file)
 
 /* GLOBALS ******************************************************************/
 
-VOID CALLBACK ServiceMain(DWORD argc, LPTSTR * argv);
-
-SERVICE_TABLE_ENTRY ServiceTable[2] =
+static VOID CALLBACK ServiceMain(DWORD, LPWSTR *);
+static WCHAR ServiceName[] = L"EventLog";
+static SERVICE_TABLE_ENTRYW ServiceTable[2] =
 {
-    { L"EventLog", (LPSERVICE_MAIN_FUNCTION) ServiceMain },
+    { ServiceName, ServiceMain },
     { NULL, NULL }
 };
 
+SERVICE_STATUS ServiceStatus;
+SERVICE_STATUS_HANDLE ServiceStatusHandle;
+
 BOOL onLiveCD = FALSE;  // On livecd events will go to debug output only
 HANDLE MyHeap = NULL;
 
 /* FUNCTIONS ****************************************************************/
 
-VOID CALLBACK ServiceMain(DWORD argc, LPTSTR * argv)
+static VOID
+UpdateServiceStatus(DWORD dwState)
+{
+    ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+    ServiceStatus.dwCurrentState = dwState;
+    ServiceStatus.dwControlsAccepted = 0;
+    ServiceStatus.dwWin32ExitCode = 0;
+    ServiceStatus.dwServiceSpecificExitCode = 0;
+    ServiceStatus.dwCheckPoint = 0;
+
+    if (dwState == SERVICE_START_PENDING ||
+        dwState == SERVICE_STOP_PENDING ||
+        dwState == SERVICE_PAUSE_PENDING ||
+        dwState == SERVICE_CONTINUE_PENDING)
+        ServiceStatus.dwWaitHint = 10000;
+    else
+        ServiceStatus.dwWaitHint = 0;
+
+    SetServiceStatus(ServiceStatusHandle,
+                     &ServiceStatus);
+}
+
+static DWORD WINAPI
+ServiceControlHandler(DWORD dwControl,
+                      DWORD dwEventType,
+                      LPVOID lpEventData,
+                      LPVOID lpContext)
+{
+    DPRINT("ServiceControlHandler() called\n");
+
+    switch (dwControl)
+    {
+        case SERVICE_CONTROL_STOP:
+            DPRINT("  SERVICE_CONTROL_STOP received\n");
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_PAUSE:
+            DPRINT("  SERVICE_CONTROL_PAUSE received\n");
+            UpdateServiceStatus(SERVICE_PAUSED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_CONTINUE:
+            DPRINT("  SERVICE_CONTROL_CONTINUE received\n");
+            UpdateServiceStatus(SERVICE_RUNNING);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_INTERROGATE:
+            DPRINT("  SERVICE_CONTROL_INTERROGATE received\n");
+            SetServiceStatus(ServiceStatusHandle,
+                             &ServiceStatus);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_SHUTDOWN:
+            DPRINT("  SERVICE_CONTROL_SHUTDOWN received\n");
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        default :
+            DPRINT1("  Control %lu received\n");
+            return ERROR_CALL_NOT_IMPLEMENTED;
+    }
+}
+
+
+static DWORD
+ServiceInit(VOID)
 {
     HANDLE hThread;
 
@@ -39,7 +108,10 @@ VOID CALLBACK ServiceMain(DWORD argc, LPTSTR * argv)
                            NULL);
 
     if (!hThread)
+    {
         DPRINT("Can't create PortThread\n");
+        return GetLastError();
+    }
     else
         CloseHandle(hThread);
 
@@ -52,11 +124,56 @@ VOID CALLBACK ServiceMain(DWORD argc, LPTSTR * argv)
                            NULL);
 
     if (!hThread)
+    {
         DPRINT("Can't create RpcThread\n");
+        return GetLastError();
+    }
     else
         CloseHandle(hThread);
+
+    return ERROR_SUCCESS;
 }
 
+
+static VOID CALLBACK
+ServiceMain(DWORD argc,
+            LPWSTR *argv)
+{
+    DWORD dwError;
+
+    UNREFERENCED_PARAMETER(argc);
+    UNREFERENCED_PARAMETER(argv);
+
+    DPRINT("ServiceMain() called\n");
+
+    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
+                                                        ServiceControlHandler,
+                                                        NULL);
+    if (!ServiceStatusHandle)
+    {
+        dwError = GetLastError();
+        DPRINT1("RegisterServiceCtrlHandlerW() failed! (Error %lu)\n", dwError);
+        return;
+    }
+
+    UpdateServiceStatus(SERVICE_START_PENDING);
+
+    dwError = ServiceInit();
+    if (dwError != ERROR_SUCCESS)
+    {
+        DPRINT("Service stopped (dwError: %lu\n", dwError);
+        UpdateServiceStatus(SERVICE_START_PENDING);
+    }
+    else
+    {
+        DPRINT("Service started\n");
+        UpdateServiceStatus(SERVICE_RUNNING);
+    }
+
+    DPRINT("ServiceMain() done\n");
+}
+
+
 BOOL LoadLogFile(HKEY hKey, WCHAR * LogName)
 {
     DWORD MaxValueLen, ValueLen, Type, ExpandedLen;
index 4b9c6a8..df0ab15 100644 (file)
@@ -44,7 +44,8 @@ typedef struct _IO_ERROR_LPC
 #define ELF_LOGFILE_ARCHIVE_SET 8
 
 /* FIXME: MSDN reads that the following two structs are in winnt.h. Are they? */
-typedef struct _EVENTLOGHEADER {
+typedef struct _EVENTLOGHEADER
+{
     ULONG HeaderSize;
     ULONG Signature;
     ULONG MajorVersion;
@@ -59,7 +60,8 @@ typedef struct _EVENTLOGHEADER {
     ULONG EndHeaderSize;
 } EVENTLOGHEADER, *PEVENTLOGHEADER;
 
-typedef struct _EVENTLOGEOF {
+typedef struct _EVENTLOGEOF
+{
     ULONG RecordSizeBeginning;
     ULONG Ones;
     ULONG Twos;
@@ -72,13 +74,13 @@ typedef struct _EVENTLOGEOF {
     ULONG RecordSizeEnd;
 } EVENTLOGEOF, *PEVENTLOGEOF;
 
-typedef struct
+typedef struct _EVENT_OFFSET_INFO
 {
     ULONG EventNumber;
     ULONG EventOffset;
 } EVENT_OFFSET_INFO, *PEVENT_OFFSET_INFO;
 
-typedef struct
+typedef struct _LOGFILE
 {
     HANDLE hFile;
     EVENTLOGHEADER Header;
index e3ef33d..d399d1e 100644 (file)
@@ -480,45 +480,29 @@ NTSTATUS ElfrOpenELA(
     DWORD MinorVersion,
     IELF_HANDLE *LogHandle)
 {
-    UNICODE_STRING UNCServerNameW = { 0, 0, NULL };
-    UNICODE_STRING ModuleNameW    = { 0, 0, NULL };
-    UNICODE_STRING RegModuleNameW = { 0, 0, NULL };
-    NTSTATUS Status;
+    UNICODE_STRING ModuleNameW;
 
-    if (UNCServerName &&
-        !RtlCreateUnicodeStringFromAsciiz(&UNCServerNameW, UNCServerName))
-    {
-        return STATUS_NO_MEMORY;
-    }
+    if ((MajorVersion != 1) || (MinorVersion != 1))
+        return STATUS_INVALID_PARAMETER;
 
-    if (ModuleName &&
-        !RtlAnsiStringToUnicodeString(&ModuleNameW, (PANSI_STRING)ModuleName, TRUE))
-    {
-        RtlFreeUnicodeString(&UNCServerNameW);
-        return STATUS_NO_MEMORY;
-    }
+    /* RegModuleName must be an empty string */
+    if (RegModuleName->Length > 0)
+        return STATUS_INVALID_PARAMETER;
 
-    if (RegModuleName &&
-        !RtlAnsiStringToUnicodeString(&RegModuleNameW, (PANSI_STRING)RegModuleName, TRUE))
-    {
-        RtlFreeUnicodeString(&UNCServerNameW);
-        RtlFreeUnicodeString(&ModuleNameW);
-        return STATUS_NO_MEMORY;
-    }
+    RtlAnsiStringToUnicodeString(&ModuleNameW, (PANSI_STRING)ModuleName, TRUE);
+
+    /* FIXME: Must verify that caller has read access */
 
-    Status = ElfrOpenELW(
-        UNCServerName ? UNCServerNameW.Buffer : NULL,
-        ModuleName ? (PRPC_UNICODE_STRING)&ModuleNameW : NULL,
-        RegModuleName ? (PRPC_UNICODE_STRING)&RegModuleNameW : NULL,
-        MajorVersion,
-        MinorVersion,
-        LogHandle);
+    *LogHandle = ElfCreateEventLogHandle(ModuleNameW.Buffer, FALSE);
 
-    RtlFreeUnicodeString(&UNCServerNameW);
     RtlFreeUnicodeString(&ModuleNameW);
-    RtlFreeUnicodeString(&RegModuleNameW);
 
-    return Status;
+    if (*LogHandle == NULL)
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    return STATUS_SUCCESS;
 }
 
 
@@ -531,45 +515,32 @@ NTSTATUS ElfrRegisterEventSourceA(
     DWORD MinorVersion,
     IELF_HANDLE *LogHandle)
 {
-    UNICODE_STRING UNCServerNameW = { 0, 0, NULL };
     UNICODE_STRING ModuleNameW    = { 0, 0, NULL };
 
-    if (UNCServerName &&
-        !RtlCreateUnicodeStringFromAsciiz(&UNCServerNameW, UNCServerName))
-    {
-        return STATUS_NO_MEMORY;
-    }
-
     if (ModuleName &&
         !RtlAnsiStringToUnicodeString(&ModuleNameW, (PANSI_STRING)ModuleName, TRUE))
     {
-        RtlFreeUnicodeString(&UNCServerNameW);
         return STATUS_NO_MEMORY;
     }
 
     /* RegModuleName must be an empty string */
     if (RegModuleName->Length > 0)
     {
-        RtlFreeUnicodeString(&UNCServerNameW);
         RtlFreeUnicodeString(&ModuleNameW);
         return STATUS_INVALID_PARAMETER;
     }
 
     if ((MajorVersion != 1) || (MinorVersion != 1))
     {
-        RtlFreeUnicodeString(&UNCServerNameW);
         RtlFreeUnicodeString(&ModuleNameW);
         return STATUS_INVALID_PARAMETER;
     }
 
-    /*FIXME: UNCServerName must specify the server or empty for local */
-
-    /*FIXME: Must verify that caller has write access */
+    /* FIXME: Must verify that caller has write access */
 
     *LogHandle = ElfCreateEventLogHandle(ModuleNameW.Buffer,
                                          TRUE);
 
-    RtlFreeUnicodeString(&UNCServerNameW);
     RtlFreeUnicodeString(&ModuleNameW);
 
     return STATUS_SUCCESS;
@@ -661,8 +632,32 @@ NTSTATUS ElfrGetLogInformation(
     DWORD cbBufSize,
     DWORD *pcbBytesNeeded)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    /* FIXME: check handle first */
+
+    switch (InfoLevel)
+    {
+        case EVENTLOG_FULL_INFO:
+            {
+                LPEVENTLOG_FULL_INFORMATION efi = (LPEVENTLOG_FULL_INFORMATION)Buffer;
+
+                *pcbBytesNeeded = sizeof(EVENTLOG_FULL_INFORMATION);
+                if (cbBufSize < sizeof(EVENTLOG_FULL_INFORMATION))
+                {
+                    return STATUS_BUFFER_TOO_SMALL;
+                }
+
+                efi->dwFull = 0; /* FIXME */
+            }
+            break;
+
+        default:
+            Status = STATUS_INVALID_LEVEL;
+            break;
+    }
+
+    return Status;
 }
 
 
index 5d89e48..04e42f8 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<group>
 <module name="rpcss" type="win32cui" installbase="system32" installname="rpcss.exe" unicode="yes">
        <include base="rpcss">.</include>
        <include base="rpcss" root="intermediate">.</include>
@@ -23,3 +24,4 @@
 <module name="rpcss_irot_server" type="rpcserver">
        <file>irot.idl</file>
 </module>
+</group>
index 2df13c7..8e6ec1f 100644 (file)
@@ -58,7 +58,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
 
-static HANDLE exit_event;
+HANDLE exit_event;
 
 //extern HANDLE __wine_make_process_system(void);
 
index 02d8226..f23583a 100644 (file)
@@ -1,8 +1,13 @@
 Index: rpcss_main.c
 ===================================================================
---- rpcss_main.c       (revision 37240)
-+++ rpcss_main.c       (working copy)
-@@ -62,7 +62,7 @@
+--- rpcss_main.c
++++ rpcss_main.c
+@@ -58,11 +58,11 @@
+ WINE_DEFAULT_DEBUG_CHANNEL(ole);
+-static HANDLE exit_event;
++HANDLE exit_event;
  
  //extern HANDLE __wine_make_process_system(void);
  
index 7fe84a5..501e2a4 100644 (file)
 
 #include "rpcss.h"
 
-BOOL RPCSS_Initialize(void);
-BOOL RPCSS_Shutdown(void);
+#define NDEBUG
+#include <debug.h>
 
-static WCHAR ServiceName[] = L"RpcSs";
+extern BOOL RPCSS_Initialize(void);
+extern BOOL RPCSS_Shutdown(void);
+extern HANDLE exit_event;
 
-typedef struct _ServiceInfo
+static VOID WINAPI ServiceMain(DWORD, LPWSTR *);
+static WCHAR ServiceName[] = L"RpcSs";
+SERVICE_TABLE_ENTRYW ServiceTable[] =
 {
-    SERVICE_STATUS servStatus;
-    SERVICE_STATUS_HANDLE hStatus;
-} SERVICEINFO, *PSERVICEINFO;
-
-
-static VOID
-UpdateStatus(PSERVICEINFO pServInfo,
-             DWORD NewStatus,
-             DWORD Check)
+    { ServiceName, ServiceMain },
+    { NULL,        NULL }
+};
+
+static SERVICE_STATUS ServiceStatus;
+static SERVICE_STATUS_HANDLE ServiceStatusHandle;
+
+DWORD WINAPI
+ServiceControlHandler(DWORD dwControl,
+                      DWORD dwEventType,
+                      LPVOID lpEventData,
+                      LPVOID lpContext)
 {
-    if (Check > 0)
-    {
-        pServInfo->servStatus.dwCheckPoint += Check;
-    }
-    else
-    {
-        pServInfo->servStatus.dwCheckPoint = Check;
-    }
-
-    if (NewStatus > 0)
-    {
-        pServInfo->servStatus.dwCurrentState = NewStatus;
-    }
-
-    SetServiceStatus(pServInfo->hStatus, &pServInfo->servStatus);
-}
-
-
-static BOOL
-RunService(PSERVICEINFO pServInfo)
-{
-    return RPCSS_Initialize();
-}
-
-VOID WINAPI
-ServerCtrlHandler(DWORD dwControl,
-                  DWORD dwEventType,
-                  LPVOID lpEventData,
-                  LPVOID lpContext)
-{
-    PSERVICEINFO pServInfo = (PSERVICEINFO)lpContext;
-
     switch (dwControl)
     {
         case SERVICE_CONTROL_SHUTDOWN:
         case SERVICE_CONTROL_STOP:
-            RPCSS_Shutdown();
-            pServInfo->servStatus.dwWin32ExitCode = 0;
-            pServInfo->servStatus.dwWaitHint = 0;
-            UpdateStatus(pServInfo, SERVICE_STOP_PENDING, 1);
-            break;
+            SetEvent(exit_event);
+            return NO_ERROR;
+
+        case SERVICE_CONTROL_INTERROGATE:
+            return NO_ERROR;
 
         default:
-            break;
+            return ERROR_CALL_NOT_IMPLEMENTED;
     }
 }
 
 VOID WINAPI
 ServiceMain(DWORD argc, LPWSTR argv[])
 {
-    SERVICEINFO servInfo;
-    HANDLE hThread;
-    DWORD dwThreadId;
-
-    servInfo.servStatus.dwServiceType      = SERVICE_WIN32_OWN_PROCESS;
-    servInfo.servStatus.dwCurrentState     = SERVICE_STOPPED;
-    servInfo.servStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN;
-    servInfo.servStatus.dwWin32ExitCode    = ERROR_SERVICE_SPECIFIC_ERROR;
-    servInfo.servStatus.dwServiceSpecificExitCode = 0;
-    servInfo.servStatus.dwCheckPoint       = 0;
-    servInfo.servStatus.dwWaitHint         = 1000;
-
-    servInfo.hStatus = RegisterServiceCtrlHandlerExW(ServiceName,
-                                                     (LPHANDLER_FUNCTION_EX)ServerCtrlHandler,
-                                                     &servInfo);
-    if (!servInfo.hStatus) return;
-
-    UpdateStatus(&servInfo, SERVICE_START_PENDING, 1);
-
-    /* Create worker thread */
-    hThread = CreateThread(NULL,
-                           0,
-                           (LPTHREAD_START_ROUTINE)RunService,
-                           &servInfo,
-                           0,
-                           &dwThreadId);
-    if (!hThread) return;
-
-    /* Set service status to running */
-    UpdateStatus(&servInfo, SERVICE_RUNNING, 0);
-
-    /* Wait until thread has terminated */
-    WaitForSingleObject(hThread, INFINITE);
-
-    CloseHandle(hThread);
-
-    UpdateStatus(&servInfo, SERVICE_STOPPED, 0);
-}
+    DWORD dwError;
+
+    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
+                                                        ServiceControlHandler,
+                                                        NULL);
+    if (!ServiceStatusHandle)
+    {
+        dwError = GetLastError();
+        DPRINT1("RegisterServiceCtrlHandlerW() failed! (Error %lu)\n", dwError);
+        return;
+    }
+
+    ServiceStatus.dwServiceType      = SERVICE_WIN32_OWN_PROCESS;
+    ServiceStatus.dwCurrentState     = SERVICE_START_PENDING;
+    ServiceStatus.dwControlsAccepted = 0;
+    ServiceStatus.dwWin32ExitCode    = NO_ERROR;
+    ServiceStatus.dwServiceSpecificExitCode = 0;
+    ServiceStatus.dwCheckPoint       = 0;
+    ServiceStatus.dwWaitHint         = 1000;
+    SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
+
+    if (RPCSS_Initialize())
+    {
+        ServiceStatus.dwCurrentState = SERVICE_RUNNING;
+        ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
+        SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
 
+        WaitForSingleObject(exit_event, INFINITE);
 
-int wmain(int argc, LPWSTR argv [])
+        ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+        SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
+        RPCSS_Shutdown();
+    }
+}
+
+int wmain(int argc, LPWSTR argv[])
 {
-    SERVICE_TABLE_ENTRYW ServiceTable[] =
+    if (!StartServiceCtrlDispatcherW(ServiceTable))
     {
-        {ServiceName, ServiceMain},
-        {NULL,        NULL }
-    };
+        DPRINT1("StartServiceCtrlDispatcherW() failed\n");
+        return 1;
+    }
 
-    return (int)(StartServiceCtrlDispatcherW(ServiceTable) != TRUE);
+    return 0;
 }
index 98b890d..398e565 100644 (file)
@@ -18,7 +18,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(spoolsv);
 
 /* GLOBALS ******************************************************************/
 
-#define SERVICE_NAME TEXT("Spooler")
+static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv);
+static WCHAR ServiceName[] = L"Spooler";
+static SERVICE_TABLE_ENTRYW ServiceTable[] =
+{
+    {ServiceName, ServiceMain},
+    {NULL, NULL}
+};
 
 SERVICE_STATUS_HANDLE ServiceStatusHandle;
 SERVICE_STATUS ServiceStatus;
@@ -100,14 +106,14 @@ ServiceControlHandler(DWORD dwControl,
 
 
 static VOID CALLBACK
-ServiceMain(DWORD argc, LPTSTR *argv)
+ServiceMain(DWORD argc, LPWSTR *argv)
 {
     UNREFERENCED_PARAMETER(argc);
     UNREFERENCED_PARAMETER(argv);
 
     TRACE("ServiceMain() called\n");
 
-    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(SERVICE_NAME,
+    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
                                                         ServiceControlHandler,
                                                         NULL);
 
@@ -123,12 +129,6 @@ ServiceMain(DWORD argc, LPTSTR *argv)
 int
 wmain(int argc, WCHAR *argv[])
 {
-    SERVICE_TABLE_ENTRY ServiceTable[2] =
-    {
-        {SERVICE_NAME, ServiceMain},
-        {NULL, NULL}
-    };
-
     UNREFERENCED_PARAMETER(argc);
     UNREFERENCED_PARAMETER(argv);
 
@@ -138,8 +138,6 @@ wmain(int argc, WCHAR *argv[])
 
     TRACE("Spoolsv: main() done\n");
 
-    ExitThread(0);
-
     return 0;
 }
 
index 390b4d0..539b577 100644 (file)
@@ -5,8 +5,8 @@
  * PURPOSE:                    Provide dll service loader
  * PROGRAMMERS:                Gregor Brunmar (gregor.brunmar@home.se)
  */
-#ifndef __SVCHOST_H__
-#define __SVCHOST_H__
+
+#pragma once
 
 /* INCLUDES ******************************************************************/
 
@@ -32,7 +32,4 @@ typedef struct _SERVICE {
 
 /* FUNCTIONS *****************************************************************/
 
-#endif /* __SVCHOST_H__ */
-
 /* EOF */
-
index 2dbf821..ca87a1c 100644 (file)
@@ -29,8 +29,7 @@
  *     @(#)syslog.h    8.1 (Berkeley) 6/2/93
  */
 
-#ifndef _SYS_SYSLOG_H
-#define _SYS_SYSLOG_H 1
+#pragma once
 
 #include <stdarg.h>
 
@@ -193,5 +192,3 @@ extern const char* set_syslog_conf_dir( const char* dir );
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* syslog.h */
index afb1199..fe5bd13 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TELNETD_H
-#define __TELNETD_H
+#pragma once
 
 #define _CRT_SECURE_NO_WARNINGS
 
@@ -82,6 +81,3 @@ static DWORD WINAPI ReadFromPipeThread(LPVOID);
 static void TerminateShell(client_t *client);
 static VOID ErrorExit(LPTSTR);
 int kickoff_telnetd(void);
-
-#endif /* __TELNETD_H */
-
index 8dc8a16..2352efe 100644 (file)
 
 /* GLOBALS ******************************************************************/
 
-static VOID CALLBACK
-ServiceMain(DWORD argc, LPTSTR *argv);
-
-static SERVICE_TABLE_ENTRY ServiceTable[2] =
+static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv);
+static WCHAR ServiceName[] = L"PlugPlay";
+static SERVICE_TABLE_ENTRYW ServiceTable[] =
 {
-    {TEXT("PlugPlay"), ServiceMain},
+    {ServiceName, ServiceMain},
     {NULL, NULL}
 };
 
+static SERVICE_STATUS_HANDLE ServiceStatusHandle;
+static SERVICE_STATUS ServiceStatus;
+
 static WCHAR szRootDeviceId[] = L"HTREE\\ROOT\\0";
 
 static HKEY hEnumKey = NULL;
@@ -2446,6 +2448,72 @@ PnpEventThread(LPVOID lpParameter)
 }
 
 
+static VOID
+UpdateServiceStatus(DWORD dwState)
+{
+    ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+    ServiceStatus.dwCurrentState = dwState;
+    ServiceStatus.dwControlsAccepted = 0;
+    ServiceStatus.dwWin32ExitCode = 0;
+    ServiceStatus.dwServiceSpecificExitCode = 0;
+    ServiceStatus.dwCheckPoint = 0;
+
+    if (dwState == SERVICE_START_PENDING ||
+        dwState == SERVICE_STOP_PENDING ||
+        dwState == SERVICE_PAUSE_PENDING ||
+        dwState == SERVICE_CONTINUE_PENDING)
+        ServiceStatus.dwWaitHint = 10000;
+    else
+        ServiceStatus.dwWaitHint = 0;
+
+    SetServiceStatus(ServiceStatusHandle,
+                     &ServiceStatus);
+}
+
+
+static DWORD WINAPI
+ServiceControlHandler(DWORD dwControl,
+                      DWORD dwEventType,
+                      LPVOID lpEventData,
+                      LPVOID lpContext)
+{
+    DPRINT1("ServiceControlHandler() called\n");
+
+    switch (dwControl)
+    {
+        case SERVICE_CONTROL_STOP:
+            DPRINT1("  SERVICE_CONTROL_STOP received\n");
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_PAUSE:
+            DPRINT1("  SERVICE_CONTROL_PAUSE received\n");
+            UpdateServiceStatus(SERVICE_PAUSED);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_CONTINUE:
+            DPRINT1("  SERVICE_CONTROL_CONTINUE received\n");
+            UpdateServiceStatus(SERVICE_RUNNING);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_INTERROGATE:
+            DPRINT1("  SERVICE_CONTROL_INTERROGATE received\n");
+            SetServiceStatus(ServiceStatusHandle,
+                             &ServiceStatus);
+            return ERROR_SUCCESS;
+
+        case SERVICE_CONTROL_SHUTDOWN:
+            DPRINT1("  SERVICE_CONTROL_SHUTDOWN received\n");
+            UpdateServiceStatus(SERVICE_STOPPED);
+            return ERROR_SUCCESS;
+
+        default :
+            DPRINT1("  Control %lu received\n");
+            return ERROR_CALL_NOT_IMPLEMENTED;
+    }
+}
+
+
 static VOID CALLBACK
 ServiceMain(DWORD argc, LPTSTR *argv)
 {
@@ -2457,6 +2525,17 @@ ServiceMain(DWORD argc, LPTSTR *argv)
 
     DPRINT("ServiceMain() called\n");
 
+    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
+                                                        ServiceControlHandler,
+                                                        NULL);
+    if (!ServiceStatusHandle)
+    {
+        DPRINT1("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError());
+        return;
+    }
+
+    UpdateServiceStatus(SERVICE_START_PENDING);
+
     hThread = CreateThread(NULL,
                            0,
                            PnpEventThread,
@@ -2484,6 +2563,8 @@ ServiceMain(DWORD argc, LPTSTR *argv)
     if (hThread != NULL)
         CloseHandle(hThread);
 
+    UpdateServiceStatus(SERVICE_RUNNING);
+
     DPRINT("ServiceMain() done\n");
 }
 
index b647525..bb01036 100644 (file)
@@ -14,7 +14,7 @@
 
 #define NDEBUG
 #include <debug.h>
-
+//#define GET_IF_ENTRY2_IMPLEMENTED 1
 
 DWORD _RpcOpenHandle(
     wchar_t *arg_1,
index 86302f6..5f0e1e6 100644 (file)
@@ -21,6 +21,7 @@
 
 SERVICE_STATUS_HANDLE ServiceStatusHandle;
 SERVICE_STATUS SvcStatus;
+static WCHAR ServiceName[] = L"WlanSvc";
 
 /* FUNCTIONS *****************************************************************/
 static DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter)
@@ -94,13 +95,14 @@ ServiceMain(DWORD argc, LPWSTR *argv)
     DPRINT("ServiceMain() called\n");
 
     SvcStatus.dwServiceType             = SERVICE_WIN32_OWN_PROCESS;
+    SvcStatus.dwCurrentState            = SERVICE_START_PENDING;
     SvcStatus.dwControlsAccepted        = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
     SvcStatus.dwCheckPoint              = 0;
-    SvcStatus.dwWin32ExitCode           = 0;
+    SvcStatus.dwWin32ExitCode           = NO_ERROR;
     SvcStatus.dwServiceSpecificExitCode = 0;
     SvcStatus.dwWaitHint                = 4000;
 
-    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(SERVICE_NAME,
+    ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
                                                         ServiceControlHandler,
                                                         NULL);
 
@@ -115,15 +117,15 @@ ServiceMain(DWORD argc, LPWSTR *argv)
                            NULL);
 
     if (!hThread)
+    {
         DPRINT("Can't create RpcThread\n");
+        UpdateServiceStatus(ServiceStatusHandle, SERVICE_STOPPED, 0);
+    }
     else
     {
-        WaitForSingleObject(hThread, INFINITE);
         CloseHandle(hThread);
     }
 
-    UpdateServiceStatus(ServiceStatusHandle, SERVICE_STOPPED, 0);
-
     DPRINT("ServiceMain() done\n");
 }
 
@@ -132,7 +134,7 @@ wmain(int argc, WCHAR *argv[])
 {
     SERVICE_TABLE_ENTRYW ServiceTable[2] =
     {
-        {SERVICE_NAME, ServiceMain},
+        {ServiceName, ServiceMain},
         {NULL, NULL}
     };
 
index da8bf82..4f65638 100644 (file)
@@ -8,6 +8,7 @@
        <library>advapi32</library>
        <library>rpcrt4</library>
        <library>pseh</library>
+       <library>iphlpapi</library>
        <file>wlansvc.c</file>
        <file>rpcserver.c</file>
 </module>
index c373992..4c44f64 100644 (file)
@@ -4,17 +4,17 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
 
 IDD_STARTPAGE DIALOGEX DISCARDABLE  0, 0, 317, 193
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "ReactOS Setup"
+CAPTION "ReactOS-Setup"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Willkommen beim ReactOS Setup Assistenten.", IDC_STARTTITLE, 115, 8, 195, 24
+    LTEXT "Willkommen beim ReactOS-Setup-Assistenten.", IDC_STARTTITLE, 115, 8, 195, 24
     LTEXT "ReactOS kann noch nicht direkt von dieser CD installiert werden! Bitte starten Sie Ihren Computer mit dieser CD um ReactOS zu installieren.", IDC_STATIC, 115, 40, 195, 100
     LTEXT "Klicken Sie auf Beenden um das Setup zu verlassen.", IDC_STATIC, 115, 169, 195, 17
 END
 
 IDD_LANGSELPAGE DIALOGEX DISCARDABLE  0, 0, 317, 193
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "ReactOS Setup"
+CAPTION "ReactOS-Setup"
 FONT 8, "MS Shell Dlg"
 BEGIN
     CONTROL "IDB_LOGO", IDB_ROSLOGO, "Static", WS_CHILD | WS_VISIBLE | SS_OWNERDRAW, 18, 0, 290, 99
@@ -27,7 +27,7 @@ END
 
 IDD_TYPEPAGE DIALOGEX DISCARDABLE  0, 0, 317, 193
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "ReactOS Setup"
+CAPTION "ReactOS-Setup"
 FONT 8, "MS Shell Dlg"
 BEGIN
     CONTROL "Setuptyp", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172
@@ -38,7 +38,7 @@ END
 
 IDD_DEVICEPAGE DIALOGEX DISCARDABLE  0, 0, 317, 193
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "ReactOS Setup"
+CAPTION "ReactOS-Setup"
 FONT 8, "MS Shell Dlg"
 BEGIN
     CONTROL "Geräteeinstellungen", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172
@@ -53,7 +53,7 @@ END
 
 IDD_DRIVEPAGE DIALOGEX DISCARDABLE  0, 0, 317, 193
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "ReactOS Setup"
+CAPTION "ReactOS-Setup"
 FONT 8, "MS Shell Dlg"
 BEGIN
     CONTROL "Partition für die ReactOS-Installation", IDC_STATIC, "Button", BS_GROUPBOX, 10,1,298,176
@@ -99,7 +99,7 @@ END
 
 IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "ReactOS Setup"
+CAPTION "ReactOS-Setup"
 FONT 8, "MS Shell Dlg"
 BEGIN
     CONTROL "Installationszusammenfassung", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172
@@ -108,7 +108,7 @@ END
 
 IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 193
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "ReactOS Setup"
+CAPTION "ReactOS-Setup"
 FONT 8, "MS Shell Dlg"
 BEGIN
     CONTROL "Installationsaktion", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172
@@ -121,13 +121,13 @@ END
 
 IDD_RESTARTPAGE DIALOGEX DISCARDABLE  0, 0, 317, 193
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Vervollständige ReactOS Setup"
+CAPTION "Vervollständige ReactOS-Setup"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    CONTROL "Abschließen der ersten Stufe des ReactOS Setup", IDC_FINISHTITLE, "Button", BS_GROUPBOX, 10,0,297,172
-    LTEXT "Sie haben die erste Stufe des ReactOS Setup erfolgreich abgeschlossen.", IDC_STATIC, 20, 50, 277, 10
+    CONTROL "Abschließen der ersten Stufe der ReactOS-Installation", IDC_FINISHTITLE, "Button", BS_GROUPBOX, 10,0,297,172
+    LTEXT "Sie haben die erste Stufe des ReactOS-Setup erfolgreich abgeschlossen.", IDC_STATIC, 20, 50, 277, 10
  
-    LTEXT "Wenn Sie auf Beenden klicken wird der Computer neugestartet.", IDC_STATIC, 20, 80, 277, 10
+    LTEXT "Wenn Sie auf Beenden klicken, wird der Computer neu gestartet.", IDC_STATIC, 20, 80, 277, 10
     CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 120, 277, 8
     LTEXT "Wenn eine CD im Laufwerk ist, entfernen Sie sie. Klicken Sie zum Neustart auf Beenden.", IDC_STATIC, 10, 180, 297, 20
 END
@@ -137,7 +137,7 @@ STRINGTABLE
 BEGIN
        IDS_LANGTITLE           "Sprachauswahl"
        IDS_LANGSUBTITLE        "Wählen Sie eine Sprache für das Setup und das Endsystem aus."
-       IDS_TYPETITLE           "Willkommen zum ReactOS Setup"
+       IDS_TYPETITLE           "Willkommen zum ReactOS-Setup"
        IDS_TYPESUBTITLE        "Wählen Sie einen Setuptyp."
        IDS_DEVICETITLE         "Einstellen der Basisgeräte"
        IDS_DEVICESUBTITLE      "Einstellungen der Anzeigegeräte und der Tastatur."
@@ -149,7 +149,7 @@ BEGIN
        IDS_RESTARTSUBTITLE     "Die erste Stufe des Setup wurde abgeschlossen, starten Sie den Rechner neu, um mit der zweiten Stufe fortzufahren."
        IDS_SUMMARYTITLE        "Installationszusammenfassung"
        IDS_SUMMARYSUBTITLE     "Liste alle Installationseinstellungen vor Anwendung auf die Geräte auf"
-       IDS_ABORTSETUP          "ReactOS ist nicht vollständig auf Ihrem Computer installiert. Wenn Sie das Setup verlassen, dann müssen Sie das Setup nochmal ausführen, um ReactOS zu installieren. Wirklich beenden?"
+       IDS_ABORTSETUP          "ReactOS ist nicht vollständig auf Ihrem Computer installiert. Wenn Sie das Setup verlassen, dann müssen Sie das Setup nochmals ausführen, um ReactOS zu installieren. Wirklich beenden?"
        IDS_ABORTSETUP2         "Installation abbrechen?"
 END
 /* EOF */
index 97cff87..31c9513 100644 (file)
@@ -66,25 +66,25 @@ BEGIN
     LISTBOX IDC_PARTITION, 20,12,278,142,LBS_HASSTRINGS | WS_VSCROLL
     PUSHBUTTON "&Stwórz", IDC_PARTCREATE, 20,155,50,15
     PUSHBUTTON "&Usuñ", IDC_PARTDELETE, 76,155,50,15
-    PUSHBUTTON "D&river", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED
+    PUSHBUTTON "s&terownik", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED
     PUSHBUTTON "&Opcje zaawansowane...", IDC_PARTMOREOPTS, 218,155,80,15
     LTEXT "Naci\9cnij Dalej aby rozpocz¹æ proces instalacji.", IDC_STATIC, 10, 180 ,277, 20
 END
 
 IDD_PARTITION DIALOGEX DISCARDABLE  0, 0, 145, 90
 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
-CAPTION "Create Partition"
+CAPTION "Stwórz partycjê"
 FONT 8, "MS Shell Dlg"
 BEGIN
     CONTROL "",IDC_UPDOWN1,"msctls_updown32", WS_VISIBLE,104,22,9,13
-    CONTROL "Create and format partition",IDC_STATIC,"Button",BS_GROUPBOX,7,5,129,57
-    LTEXT "Size:",IDC_STATIC, 13,24,27,9
+    CONTROL "Stwórz i sformatuj partycjê",IDC_STATIC,"Button",BS_GROUPBOX,7,5,129,57
+    LTEXT "Rozmiar:",IDC_STATIC, 13,24,27,9
     EDITTEXT IDC_PARTSIZE,52,23,53,13, WS_VISIBLE|WS_TABSTOP
     LTEXT "GB",IDC_UNIT, 117,24,14,9
-    LTEXT "Filesystem:",IDC_STATIC,13,46,35,9
+    LTEXT "System plików:",IDC_STATIC,13,46,35,9
     CONTROL "",IDC_FSTYPE,"ComboBox",WS_VISIBLE|WS_TABSTOP|CBS_DROPDOWNLIST,52,42,79,50
     PUSHBUTTON "&OK",IDOK,35,68,47,15, WS_VISIBLE|WS_TABSTOP
-    PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
+    PUSHBUTTON "&Anuluj",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
 END
 
 IDD_BOOTOPTIONS DIALOGEX DISCARDABLE  0, 0, 305, 105
@@ -105,11 +105,11 @@ END
 
 IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "ReactOS Setup"
+CAPTION "Instalator ReactOS"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    CONTROL "Installation summary", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172
-    LTEXT "Click Next to start the installation process.", IDC_STATIC, 10, 180 ,277, 20
+    CONTROL "Podsumowanie instalacji", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172
+    LTEXT "Kliknij Dalej aby rozpocz¹æ proces instalacji.", IDC_STATIC, 10, 180 ,277, 20
 END
 
 IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 193
@@ -151,8 +151,8 @@ BEGIN
     IDS_PROCESSSUBTITLE "Przygotuj i sformatuj partycjê, skopiuj pliki, skopiuj i zainstaluj bootloader"
     IDS_RESTARTTITLE    "Pierwszy etap instalacji zakoñczony sukcesem"
     IDS_RESTARTSUBTITLE "Pierwszy etap instalacji zosta³ zakoñczony, uruchom ponownie komputer aby przej\9cæ do drugiego etapu"
-    IDS_SUMMARYTITLE    "Installation Summary"
-    IDS_SUMMARYSUBTITLE "List installation properties to check before apply to the installation device"
+    IDS_SUMMARYTITLE    "Podsumowanie instalacji"
+    IDS_SUMMARYSUBTITLE "Sprawd\9f ustawienia instalacji przed dokonaniem zmian na dysku"
     IDS_ABORTSETUP      "Instalacja ReactOS nie zosta³a ukoñczona na tym komputerze. Je\9cli teraz zakoñczysz instalacjê, bêdziesz musia³ uruchomiæ Instalator ponownie, aby zainstalowaæ Reactos. Na pewno zakoñczyæ?"
     IDS_ABORTSETUP2     "Przerwaæ instalacjê?"
 END
index f8259b7..f4d6b22 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef RESOURCE_H
-#define RESOURCE_H
+#pragma once
 
 #define IDB_WATERMARK          100
 #define IDB_HEADER             101
@@ -61,5 +60,3 @@
 #define IDC_DEVICEDRIVER       2051
 
 #define IDI_MAIN               3000
-
-#endif
index 1303b5b..a0b012e 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __BOOTSUP_H__
-#define __BOOTSUP_H__
+#pragma once
 
 NTSTATUS
 CreateFreeLoaderIniForDos(PWCHAR IniPath,
@@ -83,6 +82,4 @@ NTSTATUS
 InstallFatBootcodeToFloppy(PUNICODE_STRING SourceRootPath,
                           PUNICODE_STRING DestinationArcPath);
 
-#endif /* __BOOTSUP_H__ */
-
 /* EOF */
index c44521a..0f7b0ef 100644 (file)
 #define SEEK_END      2
 #endif
 
-typedef struct __DOSTIME
+typedef struct _DOSTIME
 {
-  WORD Second:5;
-  WORD Minute:6;
-  WORD Hour:5;
+    WORD Second:5;
+    WORD Minute:6;
+    WORD Hour:5;
 } DOSTIME, *PDOSTIME;
 
 
-typedef struct __DOSDATE
+typedef struct _DOSDATE
 {
-  WORD Day:5;
-  WORD Month:4;
-  WORD Year:5;
+    WORD Day:5;
+    WORD Month:4;
+    WORD Year:5;
 } DOSDATE, *PDOSDATE;
 
 static WCHAR CabinetName[256];          // Filename of current cabinet
@@ -57,7 +57,7 @@ static ULONG DataReserved = 0;
 static ULONG CodecId;
 static PCABINET_CODEC_UNCOMPRESS CodecUncompress = NULL;
 static BOOL CodecSelected = FALSE;
-static ULONG LastFileOffset = 0;          // Uncompressed offset of last extracted file
+static ULONG LastFileOffset = 0;    // Uncompressed offset of last extracted file
 static PCABINET_OVERWRITE OverwriteHandler = NULL;
 static PCABINET_EXTRACT ExtractHandler = NULL;
 static PCABINET_DISK_CHANGE DiskChangeHandler = NULL;
@@ -66,38 +66,26 @@ static PVOID CabinetReservedArea = NULL;
 
 
 /* Needed by zlib, but we don't want the dependency on msvcrt.dll */
-
-/* round to 16 bytes + alloc at minimum 16 bytes */
-#define ROUND_SIZE(size) (max(16, ROUND_UP(size, 16)))
-
-void* __cdecl malloc(size_t _size)
+void *__cdecl
+malloc(size_t size)
 {
-   size_t nSize = ROUND_SIZE(_size);
-
-   if (nSize<_size)
-       return NULL;
-
-   return RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, nSize);
+    return RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, size);
 }
 
-
-void __cdecl free(void* _ptr)
+void __cdecl
+free(void *ptr)
 {
-  RtlFreeHeap(ProcessHeap, 0, _ptr);
+    RtlFreeHeap(ProcessHeap, 0, ptr);
 }
 
-void* __cdecl calloc(size_t _nmemb, size_t _size)
+void *__cdecl
+calloc(size_t nmemb, size_t size)
 {
-  return (void*)RtlAllocateHeap (ProcessHeap, HEAP_ZERO_MEMORY, _size);
+    return (void *)RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, nmemb * size);
 }
 
 /* RAW codec */
 
-ULONG
-RawCodecUncompress(PVOID OutputBuffer,
-                                  PVOID InputBuffer,
-                                  PLONG InputLength,
-                                  PLONG OutputLength)
 /*
  * FUNCTION: Uncompresses data in a buffer
  * ARGUMENTS:
@@ -108,21 +96,22 @@ RawCodecUncompress(PVOID OutputBuffer,
  *     OutputLength = Length of output buffer before, amount filled after
  *                    Negative to indicate that this is not the end of the block
  */
+ULONG
+RawCodecUncompress(PVOID OutputBuffer,
+                   PVOID InputBuffer,
+                   PLONG InputLength,
+                   PLONG OutputLength)
 {
-  LONG In = abs(*InputLength), Out = abs(*OutputLength);
-  memcpy(OutputBuffer, InputBuffer, In < Out ? In : Out);
-  *InputLength = *OutputLength = In < Out ? In : Out;
-  return CS_SUCCESS;
-}
+    LONG Len = min(abs(*InputLength), abs(*OutputLength));
 
+    memcpy(OutputBuffer, InputBuffer, Len);
+    *InputLength = *OutputLength = Len;
+
+    return CS_SUCCESS;
+}
 
 /* MSZIP codec */
 
-ULONG
-MSZipCodecUncompress(PVOID OutputBuffer,
-                                        PVOID InputBuffer,
-                                        PLONG InputLength,
-                                        PLONG OutputLength)
 /*
  * FUNCTION: Uncompresses data in a buffer
  * ARGUMENTS:
@@ -133,140 +122,146 @@ MSZipCodecUncompress(PVOID OutputBuffer,
  *     OutputLength = Length of output buffer before, amount filled after
  *                    Negative to indicate that this is not the end of the block
  */
+ULONG
+MSZipCodecUncompress(PVOID OutputBuffer,
+                     PVOID InputBuffer,
+                     PLONG InputLength,
+                     PLONG OutputLength)
 {
-  USHORT Magic;
-  INT Status;
-
-  DPRINT("MSZipCodecUncompress( OutputBuffer = %x, InputBuffer = %x, InputLength = %d, OutputLength = %d.\n", OutputBuffer, InputBuffer, *InputLength, *OutputLength);
-  if( *InputLength > 0 )
-       {
-         Magic = *((PUSHORT)InputBuffer);
-
-         if (Magic != MSZIP_MAGIC)
-               {
-                 DPRINT("Bad MSZIP block header magic (0x%X)\n", Magic);
-                 return CS_BADSTREAM;
-               }
-
-         ZStream.next_in   = ((PUCHAR)InputBuffer )+ 2;
-         ZStream.avail_in  = *InputLength - 2;
-         ZStream.next_out  = (PUCHAR)OutputBuffer;
-         ZStream.avail_out = abs(*OutputLength);
-
-         /* WindowBits is passed < 0 to tell that there is no zlib header.
-          * Note that in this case inflate *requires* an extra "dummy" byte
-          * after the compressed stream in order to complete decompression and
-          * return Z_STREAM_END.
-          */
-         Status = inflateInit2(&ZStream, -MAX_WBITS);
-         if (Status != Z_OK)
-               {
-                 DPRINT("inflateInit2() returned (%d).\n", Status);
-                 return CS_BADSTREAM;
-               }
-         ZStream.total_in = 2;
-       }
-  else {
-       ZStream.avail_in = -*InputLength;
-       ZStream.next_in = (PUCHAR)InputBuffer;
-       ZStream.next_out = (PUCHAR)OutputBuffer;
-       ZStream.avail_out = abs(*OutputLength);
-       ZStream.total_in = 0;
-  }
-  ZStream.total_out = 0;
-  Status = inflate(&ZStream, Z_SYNC_FLUSH );
-  if (Status != Z_OK && Status != Z_STREAM_END)
-       {
-         DPRINT("inflate() returned (%d) (%s).\n", Status, ZStream.msg);
-         if (Status == Z_MEM_ERROR)
-               return CS_NOMEMORY;
-         return CS_BADSTREAM;
-       }
-
-  if( *OutputLength > 0 )
-       {
-         Status = inflateEnd(&ZStream);
-         if (Status != Z_OK)
-               {
-                 DPRINT("inflateEnd() returned (%d).\n", Status);
-                 return CS_BADSTREAM;
-               }
-       }
-  *OutputLength = ZStream.total_out;
-  *InputLength = ZStream.total_in;
-  return CS_SUCCESS;
-}
+    USHORT Magic;
+    INT Status;
+
+    DPRINT("MSZipCodecUncompress(OutputBuffer = %x, InputBuffer = %x, "
+           "InputLength = %d, OutputLength = %d)\n", OutputBuffer,
+           InputBuffer, *InputLength, *OutputLength);
+    if (*InputLength > 0)
+    {
+        Magic = *(PUSHORT)InputBuffer;
+
+        if (Magic != MSZIP_MAGIC)
+        {
+            DPRINT("Bad MSZIP block header magic (0x%X)\n", Magic);
+            return CS_BADSTREAM;
+        }
+
+        ZStream.next_in = (PUCHAR)InputBuffer + 2;
+        ZStream.avail_in = *InputLength - 2;
+        ZStream.next_out = (PUCHAR)OutputBuffer;
+        ZStream.avail_out = abs(*OutputLength);
+
+        /* WindowBits is passed < 0 to tell that there is no zlib header.
+         * Note that in this case inflate *requires* an extra "dummy" byte
+         * after the compressed stream in order to complete decompression and
+         * return Z_STREAM_END.
+         */
+        Status = inflateInit2(&ZStream, -MAX_WBITS);
+        if (Status != Z_OK)
+        {
+            DPRINT("inflateInit2() returned (%d)\n", Status);
+            return CS_BADSTREAM;
+        }
+        ZStream.total_in = 2;
+    }
+    else
+    {
+        ZStream.avail_in = -*InputLength;
+        ZStream.next_in = (PUCHAR)InputBuffer;
+        ZStream.next_out = (PUCHAR)OutputBuffer;
+        ZStream.avail_out = abs(*OutputLength);
+        ZStream.total_in = 0;
+    }
 
+    ZStream.total_out = 0;
+    Status = inflate(&ZStream, Z_SYNC_FLUSH);
+    if (Status != Z_OK && Status != Z_STREAM_END)
+    {
+        DPRINT("inflate() returned (%d) (%s)\n", Status, ZStream.msg);
+        if (Status == Z_MEM_ERROR)
+            return CS_NOMEMORY;
+        return CS_BADSTREAM;
+    }
+
+    if (*OutputLength > 0)
+    {
+        Status = inflateEnd(&ZStream);
+        if (Status != Z_OK)
+        {
+            DPRINT("inflateEnd() returned (%d)\n", Status);
+            return CS_BADSTREAM;
+        }
+    }
 
+    *OutputLength = ZStream.total_out;
+    *InputLength = ZStream.total_in;
+
+    return CS_SUCCESS;
+}
 
 /* Memory functions */
 
-voidpf MSZipAlloc(voidpf opaque, uInt items, uInt size)
+voidpf
+MSZipAlloc(voidpf opaque, uInt items, uInt size)
 {
-  return (voidpf)RtlAllocateHeap (ProcessHeap, 0, items * size);
+    return (voidpf)RtlAllocateHeap(ProcessHeap, 0, items * size);
 }
 
-void MSZipFree (voidpf opaque, voidpf address)
+void
+MSZipFree(voidpf opaque, voidpf address)
 {
-  RtlFreeHeap(ProcessHeap, 0, address);
+    RtlFreeHeap(ProcessHeap, 0, address);
 }
 
 static BOOL
-ConvertSystemTimeToFileTime(
-  CONST SYSTEMTIME *  lpSystemTime,
-  LPFILETIME  lpFileTime)
+ConvertSystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime,
+                            LPFILETIME lpFileTime)
 {
-  TIME_FIELDS TimeFields;
-  LARGE_INTEGER liTime;
-
-  TimeFields.Year = lpSystemTime->wYear;
-  TimeFields.Month = lpSystemTime->wMonth;
-  TimeFields.Day = lpSystemTime->wDay;
-  TimeFields.Hour = lpSystemTime->wHour;
-  TimeFields.Minute = lpSystemTime->wMinute;
-  TimeFields.Second = lpSystemTime->wSecond;
-  TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
-
-  if (RtlTimeFieldsToTime(&TimeFields, &liTime))
+    TIME_FIELDS TimeFields;
+    LARGE_INTEGER liTime;
+
+    TimeFields.Year = lpSystemTime->wYear;
+    TimeFields.Month = lpSystemTime->wMonth;
+    TimeFields.Day = lpSystemTime->wDay;
+    TimeFields.Hour = lpSystemTime->wHour;
+    TimeFields.Minute = lpSystemTime->wMinute;
+    TimeFields.Second = lpSystemTime->wSecond;
+    TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
+
+    if (RtlTimeFieldsToTime(&TimeFields, &liTime))
     {
-      lpFileTime->dwLowDateTime = liTime.u.LowPart;
-      lpFileTime->dwHighDateTime = liTime.u.HighPart;
-      return TRUE;
+        lpFileTime->dwLowDateTime = liTime.u.LowPart;
+        lpFileTime->dwHighDateTime = liTime.u.HighPart;
+        return TRUE;
     }
-  return FALSE;
-}
 
+    return FALSE;
+}
 
 static BOOL
-ConvertDosDateTimeToFileTime(
-  WORD wFatDate,
-  WORD wFatTime,
-  LPFILETIME lpFileTime)
+ConvertDosDateTimeToFileTime(WORD wFatDate,
+                             WORD wFatTime,
+                             LPFILETIME lpFileTime)
 {
-  PDOSTIME  pdtime = (PDOSTIME) &wFatTime;
-  PDOSDATE  pddate = (PDOSDATE) &wFatDate;
-  SYSTEMTIME SystemTime;
+    PDOSTIME pdtime = (PDOSTIME)&wFatTime;
+    PDOSDATE pddate = (PDOSDATE)&wFatDate;
+    SYSTEMTIME SystemTime;
 
-  if (lpFileTime == NULL)
-    return FALSE;
+    if (lpFileTime == NULL)
+        return FALSE;
 
-  SystemTime.wMilliseconds = 0;
-  SystemTime.wSecond = pdtime->Second;
-  SystemTime.wMinute = pdtime->Minute;
-  SystemTime.wHour = pdtime->Hour;
+    SystemTime.wMilliseconds = 0;
+    SystemTime.wSecond = pdtime->Second;
+    SystemTime.wMinute = pdtime->Minute;
+    SystemTime.wHour = pdtime->Hour;
 
-  SystemTime.wDay = pddate->Day;
-  SystemTime.wMonth = pddate->Month;
-  SystemTime.wYear = 1980 + pddate->Year;
+    SystemTime.wDay = pddate->Day;
+    SystemTime.wMonth = pddate->Month;
+    SystemTime.wYear = 1980 + pddate->Year;
 
-  ConvertSystemTimeToFileTime(&SystemTime,lpFileTime);
+    ConvertSystemTimeToFileTime(&SystemTime, lpFileTime);
 
-  return TRUE;
+    return TRUE;
 }
 
-
-static PWCHAR
-GetFileName(PWCHAR Path)
 /*
  * FUNCTION: Returns a pointer to file name
  * ARGUMENTS:
@@ -274,43 +269,45 @@ GetFileName(PWCHAR Path)
  * RETURNS:
  *     Pointer to filename
  */
+static PWCHAR
+GetFileName(PWCHAR Path)
 {
-  ULONG i, j;
+    ULONG i, j;
 
-  j = i = 0;
+    j = i = 0;
 
-  while (Path [i++])
+    while (Path[i++])
     {
-      if (Path[i - 1] == L'\\') j = i;
+        if (Path[i - 1] == L'\\')
+            j = i;
     }
-  return Path + j;
-}
 
+    return Path + j;
+}
 
-static VOID
-RemoveFileName(PWCHAR Path)
 /*
  * FUNCTION: Removes a file name from a path
  * ARGUMENTS:
  *     Path = Pointer to string with path
  */
+static VOID
+RemoveFileName(PWCHAR Path)
 {
-  PWCHAR FileName;
-  DWORD i;
+    PWCHAR FileName;
+    DWORD i;
 
-  i = 0;
-  FileName = GetFileName(Path + i);
+    i = 0;
+    FileName = GetFileName(Path + i);
 
-  if ((FileName != (Path + i)) && (FileName [-1] == L'\\'))
-    FileName--;
-  if ((FileName == (Path + i)) && (FileName [0] == L'\\'))
-    FileName++;
-  FileName[0] = 0;
-}
+    if (FileName != Path + i && FileName[-1] == L'\\')
+        FileName--;
 
+    if (FileName == Path + i && FileName[0] == L'\\')
+        FileName++;
+
+    FileName[0] = 0;
+}
 
-static BOOL
-SetAttributesOnFile(PCFFILE File, HANDLE hFile)
 /*
  * FUNCTION: Sets attributes on a file
  * ARGUMENTS:
@@ -318,113 +315,110 @@ SetAttributesOnFile(PCFFILE File, HANDLE hFile)
  * RETURNS:
  *     Status of operation
  */
+static BOOL
+SetAttributesOnFile(PCFFILE File,
+                    HANDLE hFile)
 {
-  FILE_BASIC_INFORMATION FileBasic;
-  IO_STATUS_BLOCK IoStatusBlock;
-  NTSTATUS NtStatus;
-  ULONG Attributes = 0;
+    FILE_BASIC_INFORMATION FileBasic;
+    IO_STATUS_BLOCK IoStatusBlock;
+    NTSTATUS NtStatus;
+    ULONG Attributes = 0;
 
-  if (File->Attributes & CAB_ATTRIB_READONLY)
-    Attributes |= FILE_ATTRIBUTE_READONLY;
+    if (File->Attributes & CAB_ATTRIB_READONLY)
+        Attributes |= FILE_ATTRIBUTE_READONLY;
 
-  if (File->Attributes & CAB_ATTRIB_HIDDEN)
-    Attributes |= FILE_ATTRIBUTE_HIDDEN;
+    if (File->Attributes & CAB_ATTRIB_HIDDEN)
+        Attributes |= FILE_ATTRIBUTE_HIDDEN;
 
-  if (File->Attributes & CAB_ATTRIB_SYSTEM)
-    Attributes |= FILE_ATTRIBUTE_SYSTEM;
+    if (File->Attributes & CAB_ATTRIB_SYSTEM)
+        Attributes |= FILE_ATTRIBUTE_SYSTEM;
 
-  if (File->Attributes & CAB_ATTRIB_DIRECTORY)
-    Attributes |= FILE_ATTRIBUTE_DIRECTORY;
+    if (File->Attributes & CAB_ATTRIB_DIRECTORY)
+        Attributes |= FILE_ATTRIBUTE_DIRECTORY;
 
-  if (File->Attributes & CAB_ATTRIB_ARCHIVE)
-    Attributes |= FILE_ATTRIBUTE_ARCHIVE;
+    if (File->Attributes & CAB_ATTRIB_ARCHIVE)
+        Attributes |= FILE_ATTRIBUTE_ARCHIVE;
 
-  NtStatus = NtQueryInformationFile(hFile,
-    &IoStatusBlock,
-    &FileBasic,
-    sizeof(FILE_BASIC_INFORMATION),
-    FileBasicInformation);
-  if (!NT_SUCCESS(NtStatus))
+    NtStatus = NtQueryInformationFile(hFile,
+                                      &IoStatusBlock,
+                                      &FileBasic,
+                                      sizeof(FILE_BASIC_INFORMATION),
+                                      FileBasicInformation);
+    if (!NT_SUCCESS(NtStatus))
     {
-      DPRINT("NtQueryInformationFile() failed (%x).\n", NtStatus);
+        DPRINT("NtQueryInformationFile() failed (%x)\n", NtStatus);
     }
-  else
+    else
     {
-      FileBasic.FileAttributes = Attributes;
-
-      NtStatus = NtSetInformationFile(hFile,
-        &IoStatusBlock,
-        &FileBasic,
-        sizeof(FILE_BASIC_INFORMATION),
-        FileBasicInformation);
-      if (!NT_SUCCESS(NtStatus))
+        FileBasic.FileAttributes = Attributes;
+
+        NtStatus = NtSetInformationFile(hFile,
+                                        &IoStatusBlock,
+                                        &FileBasic,
+                                        sizeof(FILE_BASIC_INFORMATION),
+                                        FileBasicInformation);
+        if (!NT_SUCCESS(NtStatus))
         {
-          DPRINT("NtSetInformationFile() failed (%x).\n", NtStatus);
+            DPRINT("NtSetInformationFile() failed (%x)\n", NtStatus);
         }
     }
 
-  return NT_SUCCESS(NtStatus);
+    return NT_SUCCESS(NtStatus);
 }
 
-static ULONG
-CloseCabinet(VOID)
 /*
  * FUNCTION: Closes the current cabinet
  * RETURNS:
  *     Status of operation
  */
+static ULONG
+CloseCabinet(VOID)
 {
-  if (FileBuffer)
+    if (FileBuffer)
     {
-      NtUnmapViewOfSection( NtCurrentProcess(), FileBuffer );
-         NtClose( FileSectionHandle );
-         NtClose( FileHandle );
-      FileBuffer = NULL;
+        NtUnmapViewOfSection(NtCurrentProcess(), FileBuffer);
+        NtClose(FileSectionHandle);
+        NtClose(FileHandle);
+        FileBuffer = NULL;
     }
 
-  return 0;
+    return 0;
 }
 
-
-VOID
-CabinetInitialize(VOID)
 /*
  * FUNCTION: Initialize archiver
  */
+VOID
+CabinetInitialize(VOID)
 {
-  ZStream.zalloc = MSZipAlloc;
-  ZStream.zfree  = MSZipFree;
-  ZStream.opaque = (voidpf)0;
-
-  FileOpen = FALSE;
-  wcscpy(DestPath, L"");
-
-  CodecId       = CAB_CODEC_RAW;
-  CodecSelected = TRUE;
-
-  FolderUncompSize = 0;
-  BytesLeftInBlock = 0;
-  CabinetReserved = 0;
-  FolderReserved = 0;
-  DataReserved = 0;
-  CabinetReservedArea = NULL;
-  LastFileOffset = 0;
+    ZStream.zalloc = MSZipAlloc;
+    ZStream.zfree = MSZipFree;
+    ZStream.opaque = (voidpf)0;
+
+    FileOpen = FALSE;
+    wcscpy(DestPath, L"");
+
+    CodecId = CAB_CODEC_RAW;
+    CodecSelected = TRUE;
+
+    FolderUncompSize = 0;
+    BytesLeftInBlock = 0;
+    CabinetReserved = 0;
+    FolderReserved = 0;
+    DataReserved = 0;
+    CabinetReservedArea = NULL;
+    LastFileOffset = 0;
 }
 
-
-VOID
-CabinetCleanup(VOID)
 /*
  * FUNCTION: Cleanup archiver
  */
+VOID
+CabinetCleanup(VOID)
 {
-  CabinetClose();
+    CabinetClose();
 }
 
-
-BOOL
-CabinetNormalizePath(PWCHAR Path,
-  ULONG Length)
 /*
  * FUNCTION: Normalizes a path
  * ARGUMENTS:
@@ -433,254 +427,256 @@ CabinetNormalizePath(PWCHAR Path,
  * RETURNS:
  *     TRUE if there was enough room in Path, or FALSE
  */
+BOOL
+CabinetNormalizePath(PWCHAR Path,
+                     ULONG Length)
 {
-  ULONG n;
-  BOOL OK = TRUE;
+    ULONG n;
+    BOOL Ok;
+
+    n = wcslen(Path);
+    Ok = (n + 1) < Length;
 
-  if ((n = wcslen(Path)) &&
-    (Path[n - 1] != L'\\') &&
-    (OK = ((n + 1) < Length)))
+    if (n != 0 && Path[n - 1] != L'\\' && Ok)
     {
-      Path[n]     = L'\\';
-      Path[n + 1] = 0;
+        Path[n] = L'\\';
+        Path[n + 1] = 0;
     }
-  return OK;
-}
 
+    return Ok;
+}
 
-PWCHAR
-CabinetGetCabinetName()
 /*
  * FUNCTION: Returns pointer to cabinet file name
  * RETURNS:
  *     Pointer to string with name of cabinet
  */
+PWCHAR
+CabinetGetCabinetName(VOID)
 {
-  return CabinetName;
+    return CabinetName;
 }
 
-
-VOID
-CabinetSetCabinetName(PWCHAR FileName)
 /*
  * FUNCTION: Sets cabinet file name
  * ARGUMENTS:
  *     FileName = Pointer to string with name of cabinet
  */
+VOID
+CabinetSetCabinetName(PWCHAR FileName)
 {
-  wcscpy(CabinetName, FileName);
+    wcscpy(CabinetName, FileName);
 }
 
-
-VOID
-CabinetSetDestinationPath(PWCHAR DestinationPath)
 /*
  * FUNCTION: Sets destination path
  * ARGUMENTS:
  *    DestinationPath = Pointer to string with name of destination path
  */
+VOID
+CabinetSetDestinationPath(PWCHAR DestinationPath)
 {
-  wcscpy(DestPath, DestinationPath);
-  if (wcslen(DestPath) > 0)
-    CabinetNormalizePath(DestPath, MAX_PATH);
-}
+    wcscpy(DestPath, DestinationPath);
 
+    if (wcslen(DestPath) > 0)
+        CabinetNormalizePath(DestPath, MAX_PATH);
+}
 
-PWCHAR
-CabinetGetDestinationPath()
 /*
  * FUNCTION: Returns destination path
  * RETURNS:
  *    Pointer to string with name of destination path
  */
+PWCHAR
+CabinetGetDestinationPath(VOID)
 {
-  return DestPath;
+    return DestPath;
 }
 
-
-ULONG
-CabinetOpen(VOID)
 /*
  * FUNCTION: Opens a cabinet file
  * RETURNS:
  *     Status of operation
  */
+ULONG
+CabinetOpen(VOID)
 {
-  PUCHAR Buffer;
-  UNICODE_STRING ustring;
-  ANSI_STRING astring;
+    PUCHAR Buffer;
+    UNICODE_STRING ustring;
+    ANSI_STRING astring;
 
-  if (!FileOpen)
+    if (!FileOpen)
     {
-      OBJECT_ATTRIBUTES ObjectAttributes;
-      IO_STATUS_BLOCK IoStatusBlock;
-      UNICODE_STRING FileName;
-      NTSTATUS NtStatus;
-      ULONG Size;
-
-      RtlInitUnicodeString(&FileName,
-        CabinetName);
-
-      InitializeObjectAttributes(&ObjectAttributes,
-        &FileName,
-        OBJ_CASE_INSENSITIVE,
-        NULL,
-        NULL);
-
-      NtStatus = NtOpenFile(&FileHandle,
-                                                       GENERIC_READ | SYNCHRONIZE,
-                                                       &ObjectAttributes,
-                                                       &IoStatusBlock,
-                                                       FILE_SHARE_READ,
-                                                       FILE_SYNCHRONOUS_IO_NONALERT);
-      if (!NT_SUCCESS(NtStatus))
+        OBJECT_ATTRIBUTES ObjectAttributes;
+        IO_STATUS_BLOCK IoStatusBlock;
+        UNICODE_STRING FileName;
+        NTSTATUS NtStatus;
+        ULONG Size;
+
+        RtlInitUnicodeString(&FileName, CabinetName);
+
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &FileName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   NULL, NULL);
+
+        NtStatus = NtOpenFile(&FileHandle,
+                              GENERIC_READ | SYNCHRONIZE,
+                              &ObjectAttributes,
+                              &IoStatusBlock,
+                              FILE_SHARE_READ,
+                              FILE_SYNCHRONOUS_IO_NONALERT);
+
+        if (!NT_SUCCESS(NtStatus))
         {
-          DPRINT("Cannot open file (%S) (%x).\n", CabinetName, NtStatus);
-          return CAB_STATUS_CANNOT_OPEN;
+            DPRINT("Cannot open file (%S) (%x)\n", CabinetName, NtStatus);
+            return CAB_STATUS_CANNOT_OPEN;
         }
-      FileOpen = TRUE;
-
-         NtStatus = NtCreateSection(&FileSectionHandle,
-                                                                SECTION_ALL_ACCESS,
-                                                                0,
-                                                                0,
-                                                                PAGE_READONLY,
-                                                                SEC_COMMIT,
-                                                                FileHandle);
-      if(!NT_SUCCESS(NtStatus))
-               {
-                 DPRINT("NtCreateSection failed: %x\n", NtStatus);
-                 return CAB_STATUS_NOMEMORY;
-               }
-         FileBuffer = 0;
-         FileSize = 0;
-         NtStatus = NtMapViewOfSection(FileSectionHandle,
-                                                                       NtCurrentProcess(),
-                                                                       (PVOID *)&FileBuffer,
-                                                                       0,
-                                                                       0,
-                                                                       0,
-                                                                       &FileSize,
-                                                                       ViewUnmap,
-                                                                       0,
-                                                                       PAGE_READONLY);
-         if(!NT_SUCCESS(NtStatus))
-               {
-                 DPRINT("NtMapViewOfSection failed: %x\n", NtStatus);
-                 return CAB_STATUS_NOMEMORY;
-               }
-         DPRINT( "Cabinet file %S opened and mapped to %x\n", CabinetName, FileBuffer );
-         PCABHeader = (PCFHEADER)FileBuffer;
-
-      /* Check header */
-      if(FileSize <= sizeof(CFHEADER) ||
-                PCABHeader->Signature != CAB_SIGNATURE ||
-                PCABHeader->Version != CAB_VERSION ||
-                PCABHeader->FolderCount == 0 ||
-                PCABHeader->FileCount == 0 ||
-                PCABHeader->FileTableOffset < sizeof(CFHEADER))
-               {
-                 CloseCabinet();
-                 DPRINT("File has invalid header.\n");
-                 return CAB_STATUS_INVALID_CAB;
-               }
-
-      Size = 0;
-         Buffer = (PUCHAR)(PCABHeader+1);
-      /* Read/skip any reserved bytes */
-      if (PCABHeader->Flags & CAB_FLAG_RESERVE)
+
+        FileOpen = TRUE;
+
+        NtStatus = NtCreateSection(&FileSectionHandle,
+                                   SECTION_ALL_ACCESS,
+                                   0, 0,
+                                   PAGE_READONLY,
+                                   SEC_COMMIT,
+                                   FileHandle);
+
+        if (!NT_SUCCESS(NtStatus))
         {
-                 CabinetReserved = *(PUSHORT)Buffer;
-                 Buffer += 2;
-          FolderReserved = *Buffer;
-                 Buffer++;
-          DataReserved = *Buffer;
-                 Buffer++;
-          if (CabinetReserved > 0)
+            DPRINT("NtCreateSection failed: %x\n", NtStatus);
+            return CAB_STATUS_NOMEMORY;
+        }
+
+        FileBuffer = 0;
+        FileSize = 0;
+
+        NtStatus = NtMapViewOfSection(FileSectionHandle,
+                                      NtCurrentProcess(),
+                                      (PVOID *)&FileBuffer,
+                                      0, 0, 0,
+                                      &FileSize,
+                                      ViewUnmap,
+                                      0,
+                                      PAGE_READONLY);
+
+        if (!NT_SUCCESS(NtStatus))
+        {
+            DPRINT("NtMapViewOfSection failed: %x\n", NtStatus);
+            return CAB_STATUS_NOMEMORY;
+        }
+
+        DPRINT("Cabinet file %S opened and mapped to %x\n", CabinetName, FileBuffer);
+        PCABHeader = (PCFHEADER) FileBuffer;
+
+        /* Check header */
+        if (FileSize <= sizeof(CFHEADER) ||
+            PCABHeader->Signature != CAB_SIGNATURE ||
+            PCABHeader->Version != CAB_VERSION ||
+            PCABHeader->FolderCount == 0 ||
+            PCABHeader->FileCount == 0 ||
+            PCABHeader->FileTableOffset < sizeof(CFHEADER))
+        {
+            CloseCabinet();
+            DPRINT("File has invalid header\n");
+            return CAB_STATUS_INVALID_CAB;
+        }
+
+        Size = 0;
+        Buffer = (PUCHAR)(PCABHeader + 1);
+
+        /* Read/skip any reserved bytes */
+        if (PCABHeader->Flags & CAB_FLAG_RESERVE)
+        {
+            CabinetReserved = *(PUSHORT)Buffer;
+            Buffer += 2;
+            FolderReserved = *Buffer;
+            Buffer++;
+            DataReserved = *Buffer;
+            Buffer++;
+
+            if (CabinetReserved > 0)
             {
-                         CabinetReservedArea = Buffer;
-                         Buffer += CabinetReserved;
+                CabinetReservedArea = Buffer;
+                Buffer += CabinetReserved;
             }
         }
 
-      if (PCABHeader->Flags & CAB_FLAG_HASPREV)
+        if (PCABHeader->Flags & CAB_FLAG_HASPREV)
         {
-          /* The previous cabinet file is in the same directory as the current */
-          wcscpy(CabinetPrev, CabinetName);
-          RemoveFileName(CabinetPrev);
-          CabinetNormalizePath(CabinetPrev, 256);
-                 RtlInitAnsiString( &astring, (LPSTR)Buffer );
-                 ustring.Length = wcslen( CabinetPrev );
-                 ustring.Buffer = CabinetPrev + ustring.Length;
-                 ustring.MaximumLength = sizeof( CabinetPrev ) - ustring.Length;
-                 RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE );
-                 Buffer += astring.Length + 1;
-
-          /* Read label of prev disk */
-                 RtlInitAnsiString( &astring, (LPSTR)Buffer );
-                 ustring.Length = 0;
-                 ustring.Buffer = DiskPrev;
-                 ustring.MaximumLength = sizeof( DiskPrev );
-                 RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE );
-                 Buffer += astring.Length + 1;
+            /* The previous cabinet file is in
+               the same directory as the current */
+            wcscpy(CabinetPrev, CabinetName);
+            RemoveFileName(CabinetPrev);
+            CabinetNormalizePath(CabinetPrev, 256);
+            RtlInitAnsiString(&astring, (LPSTR)Buffer);
+            ustring.Length = wcslen(CabinetPrev);
+            ustring.Buffer = CabinetPrev + ustring.Length;
+            ustring.MaximumLength = sizeof(CabinetPrev) - ustring.Length;
+            RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE);
+            Buffer += astring.Length + 1;
+
+            /* Read label of prev disk */
+            RtlInitAnsiString(&astring, (LPSTR)Buffer);
+            ustring.Length = 0;
+            ustring.Buffer = DiskPrev;
+            ustring.MaximumLength = sizeof(DiskPrev);
+            RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE);
+            Buffer += astring.Length + 1;
         }
-      else
+        else
         {
-          wcscpy(CabinetPrev, L"");
-          wcscpy(DiskPrev, L"");
+            wcscpy(CabinetPrev, L"");
+            wcscpy(DiskPrev, L"");
         }
 
-      if (PCABHeader->Flags & CAB_FLAG_HASNEXT)
+        if (PCABHeader->Flags & CAB_FLAG_HASNEXT)
         {
-          /* The next cabinet file is in the same directory as the previous */
-          wcscpy(CabinetNext, CabinetName);
-          RemoveFileName(CabinetNext);
-          CabinetNormalizePath(CabinetNext, 256);
-                 RtlInitAnsiString( &astring, (LPSTR)Buffer );
-                 ustring.Length = wcslen( CabinetNext );
-                 ustring.Buffer = CabinetNext + ustring.Length;
-                 ustring.MaximumLength = sizeof( CabinetNext ) - ustring.Length;
-                 RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE );
-                 Buffer += astring.Length + 1;
-
-          /* Read label of next disk */
-                 RtlInitAnsiString( &astring, (LPSTR)Buffer );
-                 ustring.Length = 0;
-                 ustring.Buffer = DiskNext;
-                 ustring.MaximumLength = sizeof( DiskNext );
-                 RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE );
-                 Buffer += astring.Length + 1;
+            /* The next cabinet file is in
+               the same directory as the previous */
+            wcscpy(CabinetNext, CabinetName);
+            RemoveFileName(CabinetNext);
+            CabinetNormalizePath(CabinetNext, 256);
+            RtlInitAnsiString(&astring, (LPSTR)Buffer);
+            ustring.Length = wcslen(CabinetNext);
+            ustring.Buffer = CabinetNext + ustring.Length;
+            ustring.MaximumLength = sizeof(CabinetNext) - ustring.Length;
+            RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE);
+            Buffer += astring.Length + 1;
+
+            /* Read label of next disk */
+            RtlInitAnsiString(&astring, (LPSTR)Buffer);
+            ustring.Length = 0;
+            ustring.Buffer = DiskNext;
+            ustring.MaximumLength = sizeof(DiskNext);
+            RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE);
+            Buffer += astring.Length + 1;
         }
-      else
+        else
         {
-          wcscpy(CabinetNext, L"");
-          wcscpy(DiskNext,    L"");
+            wcscpy(CabinetNext, L"");
+            wcscpy(DiskNext, L"");
         }
-         CabinetFolders = (PCFFOLDER)Buffer;
+        CabinetFolders = (PCFFOLDER)Buffer;
     }
-  DPRINT( "CabinetOpen returning SUCCESS\n" );
-  return CAB_STATUS_SUCCESS;
-}
 
+    DPRINT("CabinetOpen returning SUCCESS\n");
+    return CAB_STATUS_SUCCESS;
+}
 
-VOID
-CabinetClose(VOID)
 /*
  * FUNCTION: Closes the cabinet file
  */
+VOID
+CabinetClose(VOID)
 {
-  if (FileOpen)
+    if (FileOpen)
     {
-      CloseCabinet();
-
-      FileOpen = FALSE;
+        CloseCabinet();
+        FileOpen = FALSE;
     }
 }
 
-
-ULONG
-CabinetFindFirst(PWCHAR FileName,
-                                PCAB_SEARCH Search)
 /*
  * FUNCTION: Finds the first file in the cabinet that matches a search criteria
  * ARGUMENTS:
@@ -689,17 +685,17 @@ CabinetFindFirst(PWCHAR FileName,
  * RETURNS:
  *     Status of operation
  */
+ULONG
+CabinetFindFirst(PWCHAR FileName,
+                 PCAB_SEARCH Search)
 {
-  DPRINT( "CabinetFindFirst( FileName = %S )\n", FileName );
-  wcsncpy(Search->Search, FileName, MAX_PATH);
-  wcsncpy(Search->Cabinet, CabinetName, MAX_PATH);
-  Search->File = 0;
-  return CabinetFindNext(Search);
+    DPRINT("CabinetFindFirst( FileName = %S )\n", FileName);
+    wcsncpy(Search->Search, FileName, MAX_PATH);
+    wcsncpy(Search->Cabinet, CabinetName, MAX_PATH);
+    Search->File = 0;
+    return CabinetFindNext(Search);
 }
 
-
-ULONG
-CabinetFindNext(PCAB_SEARCH Search)
 /*
  * FUNCTION: Finds next file in the cabinet that matches a search criteria
  * ARGUMENTS:
@@ -707,99 +703,116 @@ CabinetFindNext(PCAB_SEARCH Search)
  * RETURNS:
  *     Status of operation
  */
+ULONG
+CabinetFindNext(PCAB_SEARCH Search)
 {
-  ULONG Status;
-  PCFFILE Prev;
-  ANSI_STRING AnsiString;
-  UNICODE_STRING UnicodeString;
-  WCHAR FileName[MAX_PATH] = {L'\0'};
-
-  if( wcscmp( Search->Cabinet, CabinetName ) != 0 )
-       Search->File = 0;    // restart search of cabinet has changed since last find
-  if( !Search->File )
-       {
-         // starting new search or cabinet
-         Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset);
-         Search->Index = 0;
-         Prev = 0;
-       }
-  else Prev = Search->File;
-  while(1)
-       {
-         // look at each file in the archive and see if we found a match
-         if( Search->File->FolderIndex == 0xFFFD || Search->File->FolderIndex == 0xFFFF )
-               {
-                 // skip files continued from previous cab
-                 DPRINT("Skipping file (%s)  FileOffset (0x%X)  LastFileOffset (0x%X).\n",
-                                (char *)(Search->File + 1), Search->File->FileOffset, LastFileOffset);
-               }
-         else {
-               // FIXME: check for match against search criteria
-               if( Search->File != Prev )
-                 {
-                       // don't match the file we started with
-                       if( wcscmp( Search->Search, L"*" ) == 0 )
-                         {
-                               // take any file
-                               break;
-                         }
-                       else {
-                         // otherwise, try to match the exact file name
-                         RtlInitAnsiString( &AnsiString, Search->File->FileName );
-                         UnicodeString.Buffer = FileName;
-                         UnicodeString.Length = 0;
-                         UnicodeString.MaximumLength = sizeof( FileName );
-                         RtlAnsiStringToUnicodeString( &UnicodeString, &AnsiString, FALSE );
-                         if( wcscmp( Search->Search, UnicodeString.Buffer ) == 0 )
-                               break;
-                       }
-                 }
-         }
-         // if we make it here we found no match, so move to the next file
-         Search->Index++;
-         if( Search->Index >= PCABHeader->FileCount )
-               {
-                 // we have reached the end of this cabinet, try to open the next
-                 DPRINT( "End of cabinet reached\n" );
-                 if (wcslen(DiskNext) > 0)
-                       {
-                         CloseCabinet();
-
-                         CabinetSetCabinetName(CabinetNext);
-                         wcscpy( Search->Cabinet, CabinetName );
-
-                         if (DiskChangeHandler != NULL)
-                               {
-                                 DiskChangeHandler(CabinetNext, DiskNext);
-                               }
-
-                         Status = CabinetOpen();
-                         if (Status != CAB_STATUS_SUCCESS)
-                               return Status;
-
-                       }
-                 else
-                       {
-                         return CAB_STATUS_NOFILE;
-                       }
-                 // starting new search or cabinet
-                 Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset);
-                 Search->Index = 0;
-                 Prev = 0;
-               }
-         else Search->File = (PCFFILE)(strchr( (char *)(Search->File + 1), 0 ) + 1);
-       }
-  DPRINT( "Found file %s\n", Search->File->FileName );
-  return CAB_STATUS_SUCCESS;
-}
+    ULONG Status;
+    PCFFILE Prev;
+    ANSI_STRING AnsiString;
+    UNICODE_STRING UnicodeString;
+    WCHAR FileName[MAX_PATH];
 
+    if (wcscmp(Search->Cabinet, CabinetName) != 0)
+    {
+        /* restart search of cabinet has changed since last find */
+        Search->File = 0;
+    }
+
+    if (!Search->File)
+    {
+        /* starting new search or cabinet */
+        Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset);
+        Search->Index = 0;
+        Prev = 0;
+    }
+    else
+        Prev = Search->File;
 
-int Validate()
+    while (TRUE)
+    {
+        /* look at each file in the archive and see if we found a match */
+        if (Search->File->FolderIndex == 0xFFFD ||
+            Search->File->FolderIndex == 0xFFFF)
+        {
+            /* skip files continued from previous cab */
+            DPRINT("Skipping file (%s): FileOffset (0x%X), "
+                   "LastFileOffset (0x%X)\n", (char *)(Search->File + 1),
+                   Search->File->FileOffset, LastFileOffset);
+        }
+        else
+        {
+            // FIXME: check for match against search criteria
+            if (Search->File != Prev)
+            {
+                /* don't match the file we started with */
+                if (wcscmp(Search->Search, L"*") == 0)
+                {
+                    /* take any file */
+                    break;
+                }
+                else
+                {
+                    /* otherwise, try to match the exact file name */
+                    RtlInitAnsiString(&AnsiString, Search->File->FileName);
+                    UnicodeString.Buffer = FileName;
+                    UnicodeString.Buffer[0] = 0;
+                    UnicodeString.Length = 0;
+                    UnicodeString.MaximumLength = sizeof(FileName);
+                    RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, FALSE);
+                    if (wcscmp(Search->Search, UnicodeString.Buffer) == 0)
+                        break;
+                }
+            }
+        }
+
+        /* if we make it here we found no match, so move to the next file */
+        Search->Index++;
+        if (Search->Index >= PCABHeader->FileCount)
+        {
+            /* we have reached the end of this cabinet, try to open the next */
+            DPRINT("End of cabinet reached\n");
+            if (wcslen(DiskNext) > 0)
+            {
+                CloseCabinet();
+
+                CabinetSetCabinetName(CabinetNext);
+                wcscpy(Search->Cabinet, CabinetName);
+
+                if (DiskChangeHandler != NULL)
+                {
+                    DiskChangeHandler(CabinetNext, DiskNext);
+                }
+
+                Status = CabinetOpen();
+                if (Status != CAB_STATUS_SUCCESS)
+                    return Status;
+            }
+            else
+            {
+                return CAB_STATUS_NOFILE;
+            }
+
+            /* starting new search or cabinet */
+            Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset);
+            Search->Index = 0;
+            Prev = 0;
+        }
+        else
+            Search->File = (PCFFILE)(strchr((char *)(Search->File + 1), 0) + 1);
+    }
+
+    DPRINT("Found file %s\n", Search->File->FileName);
+    return CAB_STATUS_SUCCESS;
+}
+
+#if 0
+int
+Validate()
 {
-  return (int)RtlValidateHeap(ProcessHeap, 0, 0);
+    return (int)RtlValidateHeap(ProcessHeap, 0, 0);
 }
+#endif
 
-ULONG CabinetExtractFile( PCAB_SEARCH Search )
 /*
  * FUNCTION: Extracts a file from the cabinet
  * ARGUMENTS:
@@ -807,309 +820,339 @@ ULONG CabinetExtractFile( PCAB_SEARCH Search )
  * RETURNS
  *     Status of operation
  */
+ULONG
+CabinetExtractFile(PCAB_SEARCH Search)
 {
-  ULONG Size;                // remaining file bytes to decompress
-  ULONG CurrentOffset;       // current uncompressed offset within the folder
-  PUCHAR CurrentBuffer;      // current pointer to compressed data in the block
-  LONG RemainingBlock;       // remaining comp data in the block
-  HANDLE DestFile;
-  HANDLE DestFileSection;
-  PVOID DestFileBuffer;      // mapped view of dest file
-  PVOID CurrentDestBuffer;   // pointer to the current position in the dest view
-  PCFDATA CFData;            // current data block
-  ULONG Status;
-  FILETIME FileTime;
-  WCHAR DestName[MAX_PATH];
-  NTSTATUS NtStatus;
-  UNICODE_STRING UnicodeString;
-  ANSI_STRING AnsiString;
-  IO_STATUS_BLOCK IoStatusBlock;
-  OBJECT_ATTRIBUTES ObjectAttributes;
-  FILE_BASIC_INFORMATION FileBasic;
-  PCFFOLDER CurrentFolder;
-  LARGE_INTEGER MaxDestFileSize;
-  LONG InputLength, OutputLength;
-  char Junk[512];
-
-  if( wcscmp( Search->Cabinet, CabinetName ) != 0 )
-       {
-         // the file is not in the current cabinet
-         DPRINT( "File is not in this cabinet ( %S != %S )\n", Search->Cabinet, CabinetName );
-         return CAB_STATUS_NOFILE;
-       }
-  // look up the folder that the file specifies
-  if( Search->File->FolderIndex == 0xFFFD || Search->File->FolderIndex == 0xFFFF )
-       {
-         // folder is continued from previous cabinet, that shouldn't happen here
-         return CAB_STATUS_NOFILE;
-       }
-  else if( Search->File->FolderIndex == 0xFFFE )
-       {
-         // folder is the last in this cabinet and continues into next
-         CurrentFolder = &CabinetFolders[PCABHeader->FolderCount-1];
-       }
-  else {
-       // folder is completely contained within this cabinet
-       CurrentFolder = &CabinetFolders[Search->File->FolderIndex];
-  }
-  switch (CurrentFolder->CompressionType & CAB_COMP_MASK)
+    ULONG Size;                 // remaining file bytes to decompress
+    ULONG CurrentOffset;        // current uncompressed offset within the folder
+    PUCHAR CurrentBuffer;       // current pointer to compressed data in the block
+    LONG RemainingBlock;        // remaining comp data in the block
+    HANDLE DestFile;
+    HANDLE DestFileSection;
+    PVOID DestFileBuffer;       // mapped view of dest file
+    PVOID CurrentDestBuffer;    // pointer to the current position in the dest view
+    PCFDATA CFData;             // current data block
+    ULONG Status;
+    FILETIME FileTime;
+    WCHAR DestName[MAX_PATH];
+    NTSTATUS NtStatus;
+    UNICODE_STRING UnicodeString;
+    ANSI_STRING AnsiString;
+    IO_STATUS_BLOCK IoStatusBlock;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    FILE_BASIC_INFORMATION FileBasic;
+    PCFFOLDER CurrentFolder;
+    LARGE_INTEGER MaxDestFileSize;
+    LONG InputLength, OutputLength;
+    char Junk[512];
+
+    if (wcscmp(Search->Cabinet, CabinetName) != 0)
+    {
+        /* the file is not in the current cabinet */
+        DPRINT("File is not in this cabinet (%S != %S)\n",
+               Search->Cabinet, CabinetName);
+        return CAB_STATUS_NOFILE;
+    }
+
+    /* look up the folder that the file specifies */
+    if (Search->File->FolderIndex == 0xFFFD ||
+        Search->File->FolderIndex == 0xFFFF)
     {
-       case CAB_COMP_NONE:
-         CabinetSelectCodec(CAB_CODEC_RAW);
-         break;
-       case CAB_COMP_MSZIP:
-         CabinetSelectCodec(CAB_CODEC_MSZIP);
-         break;
-       default:
-         return CAB_STATUS_UNSUPPCOMP;
+        /* folder is continued from previous cabinet,
+           that shouldn't happen here */
+        return CAB_STATUS_NOFILE;
+    }
+    else if (Search->File->FolderIndex == 0xFFFE)
+    {
+        /* folder is the last in this cabinet and continues into next */
+        CurrentFolder = &CabinetFolders[PCABHeader->FolderCount - 1];
+    }
+    else
+    {
+        /* folder is completely contained within this cabinet */
+        CurrentFolder = &CabinetFolders[Search->File->FolderIndex];
+    }
+
+    switch (CurrentFolder->CompressionType & CAB_COMP_MASK)
+    {
+        case CAB_COMP_NONE:
+            CabinetSelectCodec(CAB_CODEC_RAW);
+            break;
+        case CAB_COMP_MSZIP:
+            CabinetSelectCodec(CAB_CODEC_MSZIP);
+            break;
+        default:
+            return CAB_STATUS_UNSUPPCOMP;
     }
 
-  DPRINT("Extracting file at uncompressed offset (0x%X)  Size (%d bytes)).\n",
-                (UINT)Search->File->FileOffset,
-                (UINT)Search->File->FileSize);
-  RtlInitAnsiString( &AnsiString, Search->File->FileName );
-  wcscpy( DestName, DestPath );
-  UnicodeString.MaximumLength = sizeof( DestName ) - wcslen( DestName );
-  UnicodeString.Buffer = DestName + wcslen( DestName );
-  UnicodeString.Length = 0;
-  RtlAnsiStringToUnicodeString( &UnicodeString, &AnsiString, FALSE );
-
-  /* Create destination file, fail if it already exists */
-  RtlInitUnicodeString(&UnicodeString,
-                                          DestName);
-
-
-  InitializeObjectAttributes(&ObjectAttributes,
-                                                        &UnicodeString,
-                                                        OBJ_CASE_INSENSITIVE,
-                                                        NULL,
-                                                        NULL);
-
-  NtStatus = NtCreateFile(&DestFile,
-                                                 GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
-                                                 &ObjectAttributes,
-                                                 &IoStatusBlock,
-                                                 NULL,
-                                                 FILE_ATTRIBUTE_NORMAL,
-                                                 0,
-                                                 FILE_CREATE,
-                                                 FILE_SYNCHRONOUS_IO_NONALERT,
-                                                 NULL,
-                                                 0);
-  if (!NT_SUCCESS(NtStatus))
+    DPRINT("Extracting file at uncompressed offset (0x%X) Size (%d bytes)\n",
+           (UINT)Search->File->FileOffset, (UINT)Search->File->FileSize);
+
+    RtlInitAnsiString(&AnsiString, Search->File->FileName);
+    wcscpy(DestName, DestPath);
+    UnicodeString.MaximumLength = sizeof(DestName) - wcslen(DestName);
+    UnicodeString.Buffer = DestName + wcslen(DestName);
+    UnicodeString.Length = 0;
+    RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, FALSE);
+
+    /* Create destination file, fail if it already exists */
+    RtlInitUnicodeString(&UnicodeString, DestName);
+
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &UnicodeString,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL, NULL);
+
+    NtStatus = NtCreateFile(&DestFile,
+                            GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
+                            &ObjectAttributes,
+                            &IoStatusBlock,
+                            NULL,
+                            FILE_ATTRIBUTE_NORMAL,
+                            0,
+                            FILE_CREATE,
+                            FILE_SYNCHRONOUS_IO_NONALERT,
+                            NULL, 0);
+
+    if (!NT_SUCCESS(NtStatus))
     {
-      DPRINT("NtCreateFile() failed (%S) (%x).\n", DestName, NtStatus);
+        DPRINT("NtCreateFile() failed (%S) (%x)\n", DestName, NtStatus);
 
-      /* If file exists, ask to overwrite file */
-      if (OverwriteHandler == NULL || OverwriteHandler(Search->File, DestName))
+        /* If file exists, ask to overwrite file */
+        if (OverwriteHandler == NULL || OverwriteHandler(Search->File, DestName))
         {
-          /* Create destination file, overwrite if it already exists */
-          NtStatus = NtCreateFile(&DestFile,
-                                                                 GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
-                                                                 &ObjectAttributes,
-                                                                 &IoStatusBlock,
-                                                                 NULL,
-                                                                 FILE_ATTRIBUTE_NORMAL,
-                                                                 0,
-                                                                 FILE_OVERWRITE,
-                                                                 FILE_SYNCHRONOUS_IO_ALERT,
-                                                                 NULL,
-                                                                 0);
-          if (!NT_SUCCESS(NtStatus))
+            /* Create destination file, overwrite if it already exists */
+            NtStatus = NtCreateFile(&DestFile,
+                                    GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
+                                    &ObjectAttributes,
+                                    &IoStatusBlock,
+                                    NULL,
+                                    FILE_ATTRIBUTE_NORMAL,
+                                    0,
+                                    FILE_OVERWRITE,
+                                    FILE_SYNCHRONOUS_IO_ALERT,
+                                    NULL, 0);
+
+            if (!NT_SUCCESS(NtStatus))
             {
-              DPRINT("NtCreateFile() failed 2 (%S) (%x).\n", DestName, NtStatus);
-              return CAB_STATUS_CANNOT_CREATE;
+                DPRINT("NtCreateFile() failed (%S) (%x)\n", DestName, NtStatus);
+                return CAB_STATUS_CANNOT_CREATE;
             }
         }
-      else
+        else
         {
-          DPRINT("File (%S) exists.\n", DestName);
-          return CAB_STATUS_FILE_EXISTS;
+            DPRINT("File (%S) exists\n", DestName);
+            return CAB_STATUS_FILE_EXISTS;
         }
     }
-  MaxDestFileSize.QuadPart = Search->File->FileSize;
-  NtStatus = NtCreateSection(&DestFileSection,
-                                                        SECTION_ALL_ACCESS,
-                                                        0,
-                                                        &MaxDestFileSize,
-                                                        PAGE_READWRITE,
-                                                        SEC_COMMIT,
-                                                        DestFile);
-  if(!NT_SUCCESS(NtStatus))
-       {
-         DPRINT("NtCreateSection failed: %x\n", NtStatus);
-         Status = CAB_STATUS_NOMEMORY;
-         goto CloseDestFile;
-       }
-  DestFileBuffer = 0;
-  DestFileSize = 0;
-  NtStatus = NtMapViewOfSection(DestFileSection,
-                                                               NtCurrentProcess(),
-                                                               &DestFileBuffer,
-                                                               0,
-                                                               0,
-                                                               0,
-                                                               &DestFileSize,
-                                                               ViewUnmap,
-                                                               0,
-                                                               PAGE_READWRITE);
-  if(!NT_SUCCESS(NtStatus))
-       {
-         DPRINT("NtMapViewOfSection failed: %x\n", NtStatus);
-         Status = CAB_STATUS_NOMEMORY;
-         goto CloseDestFileSection;
-       }
-  CurrentDestBuffer = DestFileBuffer;
-  if (!ConvertDosDateTimeToFileTime(Search->File->FileDate, Search->File->FileTime, &FileTime))
+
+    MaxDestFileSize.QuadPart = Search->File->FileSize;
+    NtStatus = NtCreateSection(&DestFileSection,
+                               SECTION_ALL_ACCESS,
+                               0,
+                               &MaxDestFileSize,
+                               PAGE_READWRITE,
+                               SEC_COMMIT,
+                               DestFile);
+
+    if (!NT_SUCCESS(NtStatus))
+    {
+        DPRINT("NtCreateSection failed: %x\n", NtStatus);
+        Status = CAB_STATUS_NOMEMORY;
+        goto CloseDestFile;
+    }
+
+    DestFileBuffer = 0;
+    DestFileSize = 0;
+    NtStatus = NtMapViewOfSection(DestFileSection,
+                                  NtCurrentProcess(),
+                                  &DestFileBuffer,
+                                  0, 0, 0,
+                                  &DestFileSize,
+                                  ViewUnmap,
+                                  0,
+                                  PAGE_READWRITE);
+
+    if (!NT_SUCCESS(NtStatus))
+    {
+        DPRINT("NtMapViewOfSection failed: %x\n", NtStatus);
+        Status = CAB_STATUS_NOMEMORY;
+        goto CloseDestFileSection;
+    }
+
+    CurrentDestBuffer = DestFileBuffer;
+    if (!ConvertDosDateTimeToFileTime(Search->File->FileDate,
+                                      Search->File->FileTime,
+                                      &FileTime))
     {
-      DPRINT("DosDateTimeToFileTime() failed.\n");
-      Status = CAB_STATUS_CANNOT_WRITE;
-         goto UnmapDestFile;
+        DPRINT("DosDateTimeToFileTime() failed\n");
+        Status = CAB_STATUS_CANNOT_WRITE;
+        goto UnmapDestFile;
     }
 
-  NtStatus = NtQueryInformationFile(DestFile,
-                                                                       &IoStatusBlock,
-                                                                       &FileBasic,
-                                                                       sizeof(FILE_BASIC_INFORMATION),
-                                                                       FileBasicInformation);
-  if (!NT_SUCCESS(NtStatus))
+    NtStatus = NtQueryInformationFile(DestFile,
+                                      &IoStatusBlock,
+                                      &FileBasic,
+                                      sizeof(FILE_BASIC_INFORMATION),
+                                      FileBasicInformation);
+    if (!NT_SUCCESS(NtStatus))
     {
-      DPRINT("NtQueryInformationFile() failed (%x).\n", NtStatus);
+        DPRINT("NtQueryInformationFile() failed (%x)\n", NtStatus);
     }
-  else
+    else
     {
-      memcpy(&FileBasic.LastAccessTime, &FileTime, sizeof(FILETIME));
-
-      NtStatus = NtSetInformationFile(DestFile,
-                                                                         &IoStatusBlock,
-                                                                         &FileBasic,
-                                                                         sizeof(FILE_BASIC_INFORMATION),
-                                                                         FileBasicInformation);
-      if (!NT_SUCCESS(NtStatus))
+        memcpy(&FileBasic.LastAccessTime, &FileTime, sizeof(FILETIME));
+
+        NtStatus = NtSetInformationFile(DestFile,
+                                        &IoStatusBlock,
+                                        &FileBasic,
+                                        sizeof(FILE_BASIC_INFORMATION),
+                                        FileBasicInformation);
+        if (!NT_SUCCESS(NtStatus))
         {
-          DPRINT("NtSetInformationFile() failed (%x).\n", NtStatus);
+            DPRINT("NtSetInformationFile() failed (%x)\n", NtStatus);
         }
     }
 
-  SetAttributesOnFile(Search->File, DestFile);
+    SetAttributesOnFile(Search->File, DestFile);
 
-  /* Call extract event handler */
-  if (ExtractHandler != NULL)
+    /* Call extract event handler */
+    if (ExtractHandler != NULL)
     {
-      ExtractHandler(Search->File, DestName);
+        ExtractHandler(Search->File, DestName);
     }
-  // find the starting block of the file
-  // start with the first data block of the folder
-  CFData = (PCFDATA)(CabinetFolders[Search->File->FolderIndex].DataOffset + FileBuffer);
-  CurrentOffset = 0;
-  while( CurrentOffset + CFData->UncompSize <= Search->File->FileOffset )
-       {
-         // walk the data blocks until we reach the one containing the start of the file
-         CurrentOffset += CFData->UncompSize;
-         CFData = (PCFDATA)((char *)(CFData+1) + DataReserved + CFData->CompSize);
-       }
-  // now decompress and discard any data in the block before the start of the file
-  CurrentBuffer = ((unsigned char *)(CFData+1)) + DataReserved; // start of comp data
-  RemainingBlock = CFData->CompSize;
-  InputLength = RemainingBlock;
-  while( CurrentOffset < Search->File->FileOffset )
-       {
-         // compute remaining uncomp bytes to start of file, bounded by sizeof junk
-         OutputLength = Search->File->FileOffset - CurrentOffset;
-         if( OutputLength > (LONG)sizeof( Junk ) )
-               OutputLength = sizeof( Junk );
-         OutputLength = -OutputLength;     // negate to signal NOT end of block
-         CodecUncompress( Junk,
-                                          CurrentBuffer,
-                                          &InputLength,
-                                          &OutputLength );
-         CurrentOffset += OutputLength;   // add the uncomp bytes extracted to current folder offset
-         CurrentBuffer += InputLength;    // add comp bytes consumed to CurrentBuffer
-         RemainingBlock -= InputLength;   // subtract bytes consumed from bytes remaining in block
-         InputLength = -RemainingBlock;   // neg for resume decompression of the same block
-       }
-  // now CurrentBuffer points to the first comp byte of the file, so we can begin decompressing
-
-  Size = Search->File->FileSize;   // Size = remaining uncomp bytes of the file to decompress
-  while(Size > 0)
+
+    /* find the starting block of the file
+       start with the first data block of the folder */
+    CFData = (PCFDATA)(CabinetFolders[Search->File->FolderIndex].DataOffset + FileBuffer);
+    CurrentOffset = 0;
+    while (CurrentOffset + CFData->UncompSize <= Search->File->FileOffset)
     {
-         OutputLength = Size;
-         DPRINT( "Decompressing block at %x with RemainingBlock = %d, Size = %d\n", CurrentBuffer, RemainingBlock, Size );
-         Status = CodecUncompress(CurrentDestBuffer,
-                                                          CurrentBuffer,
-                                                          &InputLength,
-                                                          &OutputLength);
-         if (Status != CS_SUCCESS)
-               {
-                 DPRINT("Cannot uncompress block.\n");
-                 if(Status == CS_NOMEMORY)
-                       Status = CAB_STATUS_NOMEMORY;
-                 Status = CAB_STATUS_INVALID_CAB;
-                 goto UnmapDestFile;
-               }
-         CurrentDestBuffer = (PVOID)((ULONG_PTR)CurrentDestBuffer + OutputLength);  // advance dest buffer by bytes produced
-         CurrentBuffer += InputLength;       // advance src buffer by bytes consumed
-         Size -= OutputLength;               // reduce remaining file bytes by bytes produced
-         RemainingBlock -= InputLength;      // reduce remaining block size by bytes consumed
-         if( RemainingBlock == 0 )
-               {
-                 // used up this block, move on to the next
-                 DPRINT( "Out of block data\n" );
-                 CFData = (PCFDATA)CurrentBuffer;
-                 RemainingBlock = CFData->CompSize;
-                 CurrentBuffer = ((unsigned char *)(CFData+1) + DataReserved);
-                 InputLength = RemainingBlock;
-               }
-       }
-  Status = CAB_STATUS_SUCCESS;
- UnmapDestFile:
-  NtUnmapViewOfSection(NtCurrentProcess(), DestFileBuffer);
- CloseDestFileSection:
-  NtClose(DestFileSection);
- CloseDestFile:
-  NtClose(DestFile);
-
-  return Status;
-}
+        /* walk the data blocks until we reach
+           the one containing the start of the file */
+        CurrentOffset += CFData->UncompSize;
+        CFData = (PCFDATA)((char *)(CFData + 1) + DataReserved + CFData->CompSize);
+    }
 
+    /* now decompress and discard any data in
+       the block before the start of the file */
+
+    /* start of comp data */
+    CurrentBuffer = ((unsigned char *)(CFData + 1)) + DataReserved;
+    RemainingBlock = CFData->CompSize;
+    InputLength = RemainingBlock;
+
+    while (CurrentOffset < Search->File->FileOffset)
+    {
+        /* compute remaining uncomp bytes to start
+           of file, bounded by sizeof junk */
+        OutputLength = Search->File->FileOffset - CurrentOffset;
+        if (OutputLength > (LONG)sizeof(Junk))
+            OutputLength = sizeof (Junk);
+
+        /* negate to signal NOT end of block */
+        OutputLength = -OutputLength;
+        CodecUncompress(Junk, CurrentBuffer, &InputLength, &OutputLength);
+        /* add the uncomp bytes extracted to current folder offset */
+        CurrentOffset += OutputLength;
+        /* add comp bytes consumed to CurrentBuffer */
+        CurrentBuffer += InputLength;
+        /* subtract bytes consumed from bytes remaining in block */
+        RemainingBlock -= InputLength;
+        /* neg for resume decompression of the same block */
+        InputLength = -RemainingBlock;
+    }
+
+    /* now CurrentBuffer points to the first comp byte
+       of the file, so we can begin decompressing */
+
+    /* Size = remaining uncomp bytes of the file to decompress */
+    Size = Search->File->FileSize;
+    while (Size > 0)
+    {
+        OutputLength = Size;
+        DPRINT("Decompressing block at %x with RemainingBlock = %d, Size = %d\n",
+               CurrentBuffer, RemainingBlock, Size);
+
+        Status = CodecUncompress(CurrentDestBuffer,
+                                 CurrentBuffer,
+                                 &InputLength,
+                                 &OutputLength);
+
+        if (Status != CS_SUCCESS)
+        {
+            DPRINT("Cannot uncompress block\n");
+            if (Status == CS_NOMEMORY)
+                Status = CAB_STATUS_NOMEMORY;
+            Status = CAB_STATUS_INVALID_CAB;
+            goto UnmapDestFile;
+        }
+
+        /* advance dest buffer by bytes produced */
+        CurrentDestBuffer = (PVOID)((ULONG_PTR)CurrentDestBuffer + OutputLength);
+        /* advance src buffer by bytes consumed */
+        CurrentBuffer += InputLength;
+        /* reduce remaining file bytes by bytes produced */
+        Size -= OutputLength;
+        /* reduce remaining block size by bytes consumed */
+        RemainingBlock -= InputLength;
+        if (RemainingBlock == 0)
+        {
+            /* used up this block, move on to the next */
+            DPRINT("Out of block data\n");
+            CFData = (PCFDATA)CurrentBuffer;
+            RemainingBlock = CFData->CompSize;
+            CurrentBuffer = (unsigned char *)(CFData + 1) + DataReserved;
+            InputLength = RemainingBlock;
+        }
+    }
+
+    Status = CAB_STATUS_SUCCESS;
+
+UnmapDestFile:
+    NtUnmapViewOfSection(NtCurrentProcess(), DestFileBuffer);
+
+CloseDestFileSection:
+    NtClose(DestFileSection);
+
+CloseDestFile:
+    NtClose(DestFile);
+
+    return Status;
+}
 
-VOID
-CabinetSelectCodec(ULONG Id)
 /*
  * FUNCTION: Selects codec engine to use
  * ARGUMENTS:
  *     Id = Codec identifier
  */
+VOID
+CabinetSelectCodec(ULONG Id)
 {
-  if (CodecSelected)
+    if (CodecSelected)
     {
-      if (Id == CodecId)
-        return;
+        if (Id == CodecId)
+            return;
 
-      CodecSelected = FALSE;
+        CodecSelected = FALSE;
     }
 
-  switch (Id)
+    switch (Id)
     {
-      case CAB_CODEC_RAW:
-        CodecUncompress = RawCodecUncompress;
-        break;
-      case CAB_CODEC_MSZIP:
-        CodecUncompress = MSZipCodecUncompress;
-        break;
-      default:
-        return;
+        case CAB_CODEC_RAW:
+            CodecUncompress = RawCodecUncompress;
+            break;
+        case CAB_CODEC_MSZIP:
+            CodecUncompress = MSZipCodecUncompress;
+            break;
+        default:
+            return;
     }
 
-  CodecId = Id;
-  CodecSelected = TRUE;
+    CodecId = Id;
+    CodecSelected = TRUE;
 }
 
-
-VOID
-CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite,
-  PCABINET_EXTRACT Extract,
-  PCABINET_DISK_CHANGE DiskChange)
 /*
  * FUNCTION: Set event handlers
  * ARGUMENTS:
@@ -1117,33 +1160,38 @@ CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite,
  *     Extract = Handler called when a file is to be extracted
  *     DiskChange = Handler called when changing the disk
  */
+VOID
+CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite,
+                        PCABINET_EXTRACT Extract,
+                        PCABINET_DISK_CHANGE DiskChange)
 {
-  OverwriteHandler = Overwrite;
-  ExtractHandler = Extract;
-  DiskChangeHandler = DiskChange;
+    OverwriteHandler = Overwrite;
+    ExtractHandler = Extract;
+    DiskChangeHandler = DiskChange;
 }
 
-
-PVOID
-CabinetGetCabinetReservedArea(PULONG Size)
 /*
  * FUNCTION: Get pointer to cabinet reserved area. NULL if none
  */
+PVOID
+CabinetGetCabinetReservedArea(PULONG Size)
 {
-  if (CabinetReservedArea != NULL)
+    if (CabinetReservedArea != NULL)
     {
-      if (Size != NULL)
+        if (Size != NULL)
         {
-          *Size = CabinetReserved;
+            *Size = CabinetReserved;
         }
-      return CabinetReservedArea;
+
+        return CabinetReservedArea;
     }
-  else
+    else
     {
-      if (Size != NULL)
+        if (Size != NULL)
         {
-          *Size = 0;
+            *Size = 0;
         }
-      return NULL;
+
+        return NULL;
     }
 }
index 1a7884f..711a07f 100644 (file)
@@ -4,8 +4,7 @@
  * FILE:        apps/cabman/cabinet.h
  * PURPOSE:     Cabinet definitions
  */
-#ifndef __CABINET_H
-#define __CABINET_H
+#pragma once
 
 #include <string.h>
 
@@ -204,5 +203,3 @@ VOID CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite,
   PCABINET_DISK_CHANGE DiskChange);
 /* Get pointer to cabinet reserved area. NULL if none */
 PVOID CabinetGetCabinetReservedArea(PULONG Size);
-
-#endif /* __CABINET_H */
index 79e21bd..e21196b 100644 (file)
  * PROGRAMMER:      Hervé Poussineau (hpoussin@reactos.org)
  */
 
-#ifndef __CHKDSK_H__
-#define __CHKDSK_H__
+#pragma once
 
 NTSTATUS
 ChkdskPartition(
     IN PUNICODE_STRING DriveRoot,
     IN PFILE_SYSTEM_ITEM FileSystem);
 
-#endif /* __CHKDSK_H__ */
-
 /* EOF */
index dd4b419..287b5a5 100644 (file)
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __DRIVESUP_H__
-#define __DRIVESUP_H__
+#pragma once
 
 NTSTATUS
 GetSourcePaths(PUNICODE_STRING SourcePath,
               PUNICODE_STRING SourceRootPath,
               PUNICODE_STRING SourceRootDir);
 
-#endif /* __DRIVESUP_H__ */
-
 /* EOF */
index 90ce8ed..4ecc11d 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      
  */
 
-#ifndef __ERROR_CODE_H__
-#define __ERROR_CODE_H__
+#pragma once
 
 typedef enum
 {
@@ -70,7 +69,4 @@ typedef enum
     ERROR_LAST_ERROR_CODE
 }ERROR_NUMBER;
 
-#endif /* __ERROR_CODE_H__ */
-
 /* EOF */
-
index 10eec8b..28829a4 100644 (file)
@@ -24,9 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __FILEQUEUE_H__
-#define __FILEQUEUE_H__
-
+#pragma once
 
 #define SPFILENOTIFY_STARTQUEUE       0x1
 #define SPFILENOTIFY_ENDQUEUE         0x2
@@ -104,6 +102,4 @@ SetupCommitFileQueueW(HWND Owner,
                     PSP_FILE_CALLBACK_W MsgHandler,
                     PVOID Context);
 
-#endif /* __FILEQUEUE_H__ */
-
 /* EOF */
index 3ede709..b7aecd8 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __FILESUP_H__
-#define __FILESUP_H__
+#pragma once
 
 NTSTATUS
 SetupCreateDirectory(PWCHAR DirectoryName);
@@ -43,7 +42,4 @@ BOOLEAN
 DoesFileExist(PWSTR PathName,
              PWSTR FileName);
 
-
-#endif /* __FILESUP_H__ */
-
 /* EOF */
index 4e58c97..d2784c1 100644 (file)
  * PROGRAMMER:      Casper S. Hornstrup (chorns@users.sourceforge.net)
  */
 
-#ifndef __FORMAT_H__
-#define __FORMAT_H__
+#pragma once
 
 NTSTATUS
 FormatPartition(
     IN PUNICODE_STRING DriveRoot,
     IN PFILE_SYSTEM_ITEM FileSystem);
 
-#endif /* __FILESUP_H__ */
-
 /* EOF */
index 5ae59cd..1c84024 100644 (file)
@@ -24,8 +24,7 @@
  *                  Casper S. Hornstrup (chorns@users.sourceforge.net)
  */
 
-#ifndef __FSLIST_H__
-#define __FSLIST_H__
+#pragma once
 
 #include <fmifs/fmifs.h>
 
@@ -76,6 +75,4 @@ VOID
 ScrollUpFileSystemList(
     IN PFILE_SYSTEM_LIST List);
 
-#endif /* __FSLIST_H__ */
-
 /* EOF */
index 5d30d75..fd5682c 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __GENLIST_H__
-#define __GENLIST_H__
+#pragma once
 
 struct _GENERIC_LIST_ENTRY;
 typedef struct _GENERIC_LIST_ENTRY *PGENERIC_LIST_ENTRY;
@@ -97,6 +96,4 @@ RestoreGenericListState(PGENERIC_LIST List);
 VOID
 GenericListKeyPress (PGENERIC_LIST List, CHAR AsciChar);
 
-#endif /* __GENLIST_H__ */
-
 /* EOF */
index be4aabe..36c3baf 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      Hervé Poussineau
  */
 
-#ifndef __INFFILE_H__
-#define __INFFILE_H__
+#pragma once
 
 #ifndef __REACTOS__
 
@@ -115,6 +114,4 @@ INF_OpenBufferedFileA(
 VOID INF_SetHeap(
        IN PVOID Heap);
 
-#endif /* __INFFILE_H__*/
-
 /* EOF */
index 2596324..bd7dd33 100644 (file)
@@ -25,9 +25,7 @@
  *                  Eric Kohl
  */
 
-#ifndef __INICACHE_H__
-#define __INICACHE_H__
-
+#pragma once
 
 typedef struct _INICACHEKEY
 {
@@ -126,7 +124,4 @@ PINICACHESECTION
 IniCacheAppendSection(PINICACHE Cache,
                      PWCHAR Name);
 
-
-#endif /* __INICACHE_H__ */
-
 /* EOF */
index 7dc7d77..98be6db 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __CONSUP_H__
-#define __CONSUP_H__
+#pragma once
 
 #define FOREGROUND_WHITE (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
 #define FOREGROUND_YELLOW (FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN)
@@ -187,6 +186,4 @@ CONSOLE_SetStyledText(
        IN INT Flags,
        IN LPCSTR Text);
 
-#endif /* __CONSOLE_H__*/
-
 /* EOF */
index 0e0d216..87df416 100644 (file)
@@ -1786,8 +1786,8 @@ CreatePartitionPage (PINPUT_RECORD Ir)
             else
             {
                 /* Round-up by cylinder size */
-                PartSize = ROUND_UP (PartSize * 1024 * 1024,
-                                     DiskEntry->CylinderSize);
+                PartSize = (PartSize * 1024 * 1024 + DiskEntry->CylinderSize - 1) /
+                           DiskEntry->CylinderSize * DiskEntry->CylinderSize;
 
                 /* But never get larger than the unpartitioned disk space */
                 if (PartSize > PartEntry->UnpartitionedLength)
index 7d706c9..53d9a03 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AF_ZA_H__
-#define LANG_AF_ZA_H__
+#pragma once
 
 MUI_LAYOUTS afZALayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS afZALayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 006db05..82de046 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_AE_H__
-#define LANG_AR_AE_H__
+#pragma once
 
 MUI_LAYOUTS arAELayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arAELayouts[] =
     { L"3801", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index 077483f..4672e1f 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_BH_H__
-#define LANG_AR_BH_H__
+#pragma once
 
 MUI_LAYOUTS arBHLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arBHLayouts[] =
     { L"3C01", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index 35b789a..b0e8ec9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_DZ_H__
-#define LANG_AR_DZ_H__
+#pragma once
 
 MUI_LAYOUTS arDZLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arDZLayouts[] =
     { L"1401", L"00020401" },
     { NULL, NULL }
 };
-
-#endif
index 00a0afb..23488ed 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_EG_H__
-#define LANG_AR_EG_H__
+#pragma once
 
 MUI_LAYOUTS arEGLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arEGLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 7640fe4..d0fb958 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_IQ_H__
-#define LANG_AR_IQ_H__
+#pragma once
 
 MUI_LAYOUTS arIQLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arIQLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 997f64d..cc5a4a1 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_JO_H__
-#define LANG_AR_JO_H__
+#pragma once
 
 MUI_LAYOUTS arJOLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arJOLayouts[] =
     { L"2C01", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index 58f1823..d61d382 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_KW_H__
-#define LANG_AR_KW_H__
+#pragma once
 
 MUI_LAYOUTS arKWLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arKWLayouts[] =
     { L"3401", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index c4ae895..f43c6a6 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_LB_H__
-#define LANG_AR_LB_H__
+#pragma once
 
 MUI_LAYOUTS arLBLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arLBLayouts[] =
     { L"3001", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index d06eebf..8fdc977 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_LY_H__
-#define LANG_AR_LY_H__
+#pragma once
 
 MUI_LAYOUTS arLYLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arLYLayouts[] =
     { L"1001", L"00020401" },
     { NULL, NULL }
 };
-
-#endif
index 47b8637..d6e056b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_MA_H__
-#define LANG_AR_MA_H__
+#pragma once
 
 MUI_LAYOUTS arMALayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arMALayouts[] =
     { L"1801", L"00020401" },
     { NULL, NULL }
 };
-
-#endif
index ff49fc2..183b32e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_OM_H__
-#define LANG_AR_OM_H__
+#pragma once
 
 MUI_LAYOUTS arOMLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arOMLayouts[] =
     { L"2001", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index c9e27ca..bf6cb20 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_QA_H__
-#define LANG_AR_QA_H__
+#pragma once
 
 MUI_LAYOUTS arQALayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arQALayouts[] =
     { L"4001", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index 541d9d7..403d2a0 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_SA_H__
-#define LANG_AR_SA_H__
+#pragma once
 
 MUI_LAYOUTS arSALayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arSALayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 93dbe9b..8f4b9bb 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_SY_H__
-#define LANG_AR_SY_H__
+#pragma once
 
 MUI_LAYOUTS arSYLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arSYLayouts[] =
     { L"2801", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index 2d70266..0511648 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_TN_H__
-#define LANG_AR_TN_H__
+#pragma once
 
 MUI_LAYOUTS arTNLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arTNLayouts[] =
     { L"1C01", L"00020401" },
     { NULL, NULL }
 };
-
-#endif
index eea30b1..19d029e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AR_YE_H__
-#define LANG_AR_YE_H__
+#pragma once
 
 MUI_LAYOUTS arYELayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS arYELayouts[] =
     { L"2401", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index 8bee21d..f2056ba 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_AZ_AZ_H__
-#define LANG_AZ_AZ_H__
+#pragma once
 
 MUI_LAYOUTS azAZLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS azAZLayouts[] =
     { L"0419", L"00000419" },
     { NULL, NULL }
 };
-
-#endif
index f422480..de08d3e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_BE_BY_H__
-#define LANG_BE_BY_H__
+#pragma once
 
 MUI_LAYOUTS beBYLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS beBYLayouts[] =
     { L"0419", L"00000419" },
     { NULL, NULL }
 };
-
-#endif
index 612ccd9..23bd1f4 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_BG_BG_H__
-#define LANG_BG_BG_H__
+#pragma once
 
 MUI_LAYOUTS bgBGLayouts[] =
 {
@@ -1706,5 +1705,3 @@ MUI_STRING bgBGStrings[] =
     "\84®¡ ¢ï­¥ ­  ª« ¢¨ âãà­¨ ¯®¤à¥¤¡¨"},
     {0, 0}
 };
-
-#endif
index f8c0068..f2f6234 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_CA_ES_H__
-#define LANG_CA_ES_H__
+#pragma once
 
 MUI_LAYOUTS caESLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS caESLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index d4521e2..b3397e1 100644 (file)
@@ -4,8 +4,7 @@
  * UPDATED:     2008-06-05
  */
 
-#ifndef LANG_CS_CZ_H__
-#define LANG_CS_CZ_H__
+#pragma once
 
 MUI_LAYOUTS csCZLayouts[] =
 {
@@ -1702,5 +1701,3 @@ MUI_STRING csCZStrings[] =
     "Pýid v m rozlo§en¡ kl ves"},
     {0, 0}
 };
-
-#endif
index a160ad7..627064a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_DA_DK_H__
-#define LANG_DA_DK_H__
+#pragma once
 
 MUI_LAYOUTS daDKLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS daDKLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 3c86dfc..289c208 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_DE_AT_H__
-#define LANG_DE_AT_H__
+#pragma once
 
 MUI_LAYOUTS deATLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS deATLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index a217cd8..de472e6 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_DE_CH_H__
-#define LANG_DE_CH_H__
+#pragma once
 
 MUI_LAYOUTS deCHLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS deCHLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 570f214..e21b2ff 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_DE_DE_H__
-#define LANG_DE_DE_H__
+#pragma once
 
 MUI_LAYOUTS deDELayouts[] =
 {
@@ -65,13 +64,13 @@ static MUI_ENTRY deDEWelcomePageEntries[] =
     {
         6,
         8,
-        "Willkommen zum ReactOS Setup",
+        "Willkommen zum ReactOS-Setup",
         TEXT_STYLE_HIGHLIGHT
     },
     {
         6,
         11,
-        "Dieser Teil des Setups kopiert das ReactOS Betriebssystem auf Ihren",
+        "Dieser Teil des Setups kopiert das ReactOS-Betriebssystem auf Ihren",
         TEXT_STYLE_NORMAL
     },
     {
@@ -107,7 +106,7 @@ static MUI_ENTRY deDEWelcomePageEntries[] =
     {
         6,
         23,
-        "F\81r weitere Informationen, besuchen Sie bitte:",
+        "F\81r weitere Informationen besuchen Sie bitte:",
         TEXT_STYLE_NORMAL
     },
     {
@@ -141,7 +140,7 @@ static MUI_ENTRY deDEIntroPageEntries[] =
     {
         6,
         8,
-        "Das ReactOS Setup ist noch in einer fr\81hen Entwicklungsphase. Es unter-",
+        "Das ReactOS-Setup ist noch in einer fr\81hen Entwicklungsphase. Es unter-",
         TEXT_STYLE_NORMAL
     },
     {
@@ -165,7 +164,7 @@ static MUI_ENTRY deDEIntroPageEntries[] =
     {
         8,
         14,
-        "- Setup kann keine prim\84re Partition von einer HDD l\94schen",
+        "- Setup kann keine prim\84re Partition von einer HDD l\94schen,",
         TEXT_STYLE_NORMAL
     },
     {
@@ -177,7 +176,7 @@ static MUI_ENTRY deDEIntroPageEntries[] =
     {
         8,
         16,
-        "- Setup kann die erste erweiterte Partition nicht von der HDD l\94schen",
+        "- Setup kann die erste erweiterte Partition nicht von der HDD l\94schen,",
         TEXT_STYLE_NORMAL
     },
     {
@@ -189,7 +188,7 @@ static MUI_ENTRY deDEIntroPageEntries[] =
     {
         8,
         18,
-        "- Setup unterst\81tzt nur FAT Dateisysteme.",
+        "- Setup unterst\81tzt nur FAT-Dateisysteme.",
         TEXT_STYLE_NORMAL
     },
     {
@@ -406,7 +405,7 @@ static MUI_ENTRY deDEDevicePageEntries[] =
     {
         6,
         20,
-        "Dann dr\81cken Sie die Eingabetaste, um eine Einstellung abzu\84ndern.",
+        "Dann dr\81cken Sie die Eingabetaste, um eine Einstellung zu \84ndern.",
         TEXT_STYLE_NORMAL
     },
     {
@@ -452,7 +451,7 @@ static MUI_ENTRY deDERepairPageEntries[] =
     {
         6,
         8,
-        "Das ReactOS Setup ist noch in einer fr\81hen Entwicklungsphase. Es unter-",
+        "Das ReactOS-Setup ist noch in einer fr\81hen Entwicklungsphase. Es unter-",
         TEXT_STYLE_NORMAL
     },
     {
@@ -488,7 +487,7 @@ static MUI_ENTRY deDERepairPageEntries[] =
     {
         8,
         21,
-        "\x07  Dr\81cken Sie ENTER, um den Computer neuzustarten.",
+        "\x07  Dr\81cken Sie ENTER, um den Computer neu zu starten.",
         TEXT_STYLE_NORMAL
     },
     {
@@ -579,7 +578,7 @@ static MUI_ENTRY deDEFlushPageEntries[] =
     {
         10,
         9,
-        "Der PC wird automatisch neustarten, wenn der Vorgang beendet ist.",
+        "Der PC wird automatisch neunstarten, wenn der Vorgang beendet ist.",
         TEXT_STYLE_NORMAL
     },
     {
@@ -895,7 +894,7 @@ static MUI_ENTRY deDEInstallDirectoryEntries[] =
     {
         6,
         8,
-        "Setup installiert die ReactOS Installationsdateien in die ausgew\84hlte",
+        "Setup installiert die ReactOS-Installationsdateien in die ausgew\84hlte",
         TEXT_STYLE_NORMAL
     },
     {
@@ -907,13 +906,13 @@ static MUI_ENTRY deDEInstallDirectoryEntries[] =
     {
         6,
         14,
-        "Um den Vorschlag zu \84ndern dr\81cken sie die 'Entf' Taste um",
+        "Um den Vorschlag zu \84ndern dr\81cken sie die 'Entf'-Taste, um",
         TEXT_STYLE_NORMAL
     },
     {
         6,
         15,
-        "Zeichen zu l\94schen und gegeben sie dann den Namen des Verzeichnis ein",
+        "Zeichen zu l\94schen, und geben sie dann den Namen des Verzeichnis ein",
         TEXT_STYLE_NORMAL
     },
     {
@@ -941,7 +940,7 @@ static MUI_ENTRY deDEFileCopyEntries[] =
     {
         0,
         12,
-        "Bitte warten Sie w\84hrend ReactOS Setup die ReactOS Dateien",
+        "Bitte warten Sie, w\84hrend das ReactOS-Setup die ReactOS-Dateien",
         TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER
     },
     {
@@ -987,7 +986,7 @@ static MUI_ENTRY deDEBootLoaderEntries[] =
     {
         8,
         12,
-        "Boot-Loader auf der Festplatte installieren (Boot-Sektor).",
+        "Boot-Loader auf der Festplatte installieren (Bootsektor).",
         TEXT_STYLE_NORMAL
     },
     {
@@ -1079,7 +1078,7 @@ static MUI_ENTRY deDELayoutSettingsEntries[] =
     {
         6,
         8,
-        "Bitte w\84hlen Sie ein zu installierendes Standard Layout.",
+        "Bitte w\84hlen Sie ein zu installierendes Standardlayout aus.",
         TEXT_STYLE_NORMAL
     },
     {
@@ -1161,7 +1160,7 @@ static MUI_ENTRY deDESelectFSEntries[] =
     {
         6,
         17,
-        "W\84hlen Sie ein Dateisystem von der folgenden Liste.",
+        "W\84hlen Sie ein Dateisystem aus der folgenden Liste aus.",
         0
     },
     {
@@ -1208,7 +1207,7 @@ static MUI_ENTRY deDEDeletePartitionEntries[] =
     {
         6,
         8,
-        "Sie haben sich entschieden diese Partition zu l\94schen",
+        "Sie haben sich entschieden, diese Partition zu l\94schen",
         TEXT_STYLE_NORMAL
     },
     {
@@ -1260,7 +1259,7 @@ static MUI_ENTRY deDERegistryEntries[] =
     {
         0,
         0,
-        "Registry Hives erstellen...",
+        "Registryzweige erstellen...",
         TEXT_TYPE_STATUS | TEXT_PADDING_BIG
     },
     {
@@ -1287,62 +1286,62 @@ MUI_ERROR deDEErrorEntries[] =
     {
         //ERROR_NO_HDD
         "Setup konnte keine Festplatte finden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_NO_SOURCE_DRIVE
         "Setup konnte das Quelllaufwerk nicht finden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_LOAD_TXTSETUPSIF
         "Setup konnte TXTSETUP.SIF nicht finden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_CORRUPT_TXTSETUPSIF
-        "Setup fand eine korrupte TXTSETUP.SIF.\n",
-        "ENTER = Computer neustarten"
+        "Setup fand eine defekte TXTSETUP.SIF.\n",
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_SIGNATURE_TXTSETUPSIF,
         "Setup fand eine ung\81ltige Signatur in TXTSETUP.SIF.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_DRIVE_INFORMATION
         "Setup konnte keine Laufwerksinformationen abfragen.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_WRITE_BOOT,
-        "Setup konnte den FAT Bootcode nicht auf der Partition installieren.",
-        "ENTER = Computer neustarten"
+        "Setup konnte den FAT-Bootcode nicht auf der Partition installieren.",
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_LOAD_COMPUTER,
         "Setup konnte die Computertypenliste nicht laden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_LOAD_DISPLAY,
         "Setup konnte die Displayeinstellungsliste nicht laden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_LOAD_KEYBOARD,
         "Setup konnte die Tastaturtypenliste nicht laden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_LOAD_KBLAYOUT,
         "Setup konnte die Tastaturlayoutliste nicht laden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_WARN_PARTITION,
         "Setup hat mindestens eine Festplatte mit einer inkompatiblen Partitionstabelle\n"
-        "welche nicht richtig verwendet werden k\94nnen!\n"
+        "gefunden, die nicht richtig verwendet werden kann!\n"
         "\n"
         "Partitionen zu erstellen/l\94schen kann die Partitionstabelle zerst\94ren.\n"
         "\n"
@@ -1367,8 +1366,8 @@ MUI_ERROR deDEErrorEntries[] =
     },
     {
         //ERROR_INSTALL_BOOTCODE,
-        "Setup konnte den FAT Bootcode nicht auf der Partition installieren.",
-        "ENTER = Computer neustarten"
+        "Setup konnte den FAT-Bootcode nicht auf der Partition installieren.",
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_NO_FLOPPY,
@@ -1378,105 +1377,105 @@ MUI_ERROR deDEErrorEntries[] =
     {
         //ERROR_UPDATE_KBSETTINGS,
         "Setup konnte das Tastaturlayout nicht aktualisieren.",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_UPDATE_DISPLAY_SETTINGS,
         "Setup konnte die Display-Registrywerte nicht aktualisieren.",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_IMPORT_HIVE,
-        "Setup konnte keine Hive Datei importieren.",
-        "ENTER = Computer neustarten"
+        "Setup konnte keine Hive-Datei importieren.",
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_FIND_REGISTRY
         "Setup konnte die Registrydateien nicht finden.",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_CREATE_HIVE,
-        "Setup konnte die Registry-Hives nicht erstellen.",
-        "ENTER = Computer neustarten"
+        "Setup konnte die Registryzweige nicht erstellen.",
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_INITIALIZE_REGISTRY,
         "Setup konnte die Registry nicht initialisieren.",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_INVALID_CABINET_INF,
-        "Cabinet hat keine g\81ltige .inf Datei.\n",
-        "ENTER = Computer neustarten"
+        "Cabinet hat keine g\81ltige .inf-Datei.\n",
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_CABINET_MISSING,
         "Cabinet nicht gefunden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_CABINET_SCRIPT,
-        "Cabinet enth\84lt kein Setup Skript.\n",
-        "ENTER = Computer neustarten"
+        "Cabinet enth\84lt kein Setup-Skript.\n",
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_COPY_QUEUE,
         "Setup konnte die Liste mit zu kopierenden Dateien nicht finden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_CREATE_DIR,
         "Setup konnte die Installationspfade nicht erstellen.",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_TXTSETUP_SECTION,
-        "Setup konnte die 'Ordner' Sektion in\n"
+        "Setup konnte die 'Ordner'-Sektion in\n"
         "TXTSETUP.SIF nicht finden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_CABINET_SECTION,
-        "Setup konnte die 'Ordner' Sektion im\n"
+        "Setup konnte die 'Ordner'-Sektion im\n"
         "Cabinet nicht finden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_CREATE_INSTALL_DIR
         "Setup konnte den Installationspfad nicht erstellen.",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_FIND_SETUPDATA,
-        "Setup konnte die 'SetupData' Sektion in\n"
+        "Setup konnte die 'SetupData'-Sektion in\n"
         "TXTSETUP.SIF nicht finden.\n",
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_WRITE_PTABLE,
         "Setup konnte die Partitionstabellen nicht schreiben.\n"
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_ADDING_CODEPAGE,
-        "Setup konnte den CodePage-Eintrag nicht hinzuf\81gen.\n"
-        "ENTER = Computer neustarten"
+        "Setup konnte den Codepage-Eintrag nicht hinzuf\81gen.\n"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_UPDATE_LOCALESETTINGS,
         "Setup konnte die Systemsprache nicht einstellen.\n"
-        "ENTER = Computer neustarten"
+        "ENTER = Computer neu starten"
     },
     {
         //ERROR_ADDING_KBLAYOUTS,
-        "Setup konnte die Tastaturlayouts nicht in Registry eintragen.\n"
-        "ENTER = Computer neustarten"
+        "Setup konnte die Tastaturlayouts nicht in der Registry eintragen.\n"
+        "ENTER = Computer neu starten"
     },
         {
         //ERROR_UPDATE_GEOID,
-        "Setup konnte den geographischen Standort nicht einstellen.\n"
-        "ENTER = Computer neustarten"
+        "Setup konnte den geografischen Standort nicht einstellen.\n"
+        "ENTER = Computer neu starten"
     },
 {
         NULL,
@@ -1596,7 +1595,7 @@ MUI_STRING deDEStrings[] =
     {STRING_PARTITIONSIZE,
      "Gr\94áe der neuen Partition:"},
     {STRING_CHOOSENEWPARTITION,
-     "Sie haben beschlossen eine neue Partition zu erstellen auf"},
+     "Sie haben beschlossen, eine neue Partition zu erstellen auf"},
     {STRING_HDDSIZE,
     "Bitte geben Sie die Gr\94áe der neuen Partition in Megabyte ein."},
     {STRING_CREATEPARTITION,
@@ -1606,21 +1605,21 @@ MUI_STRING deDEStrings[] =
     {STRING_NONFORMATTEDPART,
     "Sie wollen ReactOS auf einer neuen/unformatieren Partition installieren."},
     {STRING_INSTALLONPART,
-    "Setup installiert ReactOS auf diese Partition"},
+    "Setup installiert ReactOS auf dieser Partition"},
     {STRING_CHECKINGPART,
     "Setup \81berpr\81ft die ausgew\84hlte Partition."},
     {STRING_QUITCONTINUE,
     "F3 = Beenden  ENTER = Fortsetzen"},
     {STRING_REBOOTCOMPUTER,
-    "ENTER = Computer neustarten"},
+    "ENTER = Computer neu starten"},
     {STRING_TXTSETUPFAILED,
-    "Setup konnte die '%S' Sektion\nin TXTSETUP.SIF nicht finden.\n"},
+    "Setup konnte die '%S'-Sektion\nin TXTSETUP.SIF nicht finden.\n"},
     {STRING_COPYING,
      "\xB3 Kopiere Datei: %S"},
     {STRING_SETUPCOPYINGFILES,
      "Setup kopiert Dateien..."},
     {STRING_REGHIVEUPDATE,
-    "   Registry hives werden aktualisiert..."},
+    "   Registryzweige werden aktualisiert..."},
     {STRING_IMPORTFILE,
     "   Importiere %S..."},
     {STRING_DISPLAYETTINGSUPDATE,
@@ -1628,27 +1627,27 @@ MUI_STRING deDEStrings[] =
     {STRING_LOCALESETTINGSUPDATE,
     "   Lokalisierungseinstellungen werden aktualisiert..."},
     {STRING_KEYBOARDSETTINGSUPDATE,
-    "   Tastaturlayout Einstellungen werden aktualisiert..."},
+    "   Tastaturlayouteinstellungen werden aktualisiert..."},
     {STRING_CODEPAGEINFOUPDATE,
-    "   Codepage Informationen werden hinzugef\81gt..."},
+    "   Codepage-Informationen werden hinzugef\81gt..."},
     {STRING_DONE,
     "   Fertig..."},
     {STRING_REBOOTCOMPUTER2,
-    "   ENTER = Computer neustarten"},
+    "   ENTER = Computer neu starten"},
     {STRING_CONSOLEFAIL1,
     "Konsole konnte nicht ge\94ffnet werden\n\n"},
     {STRING_CONSOLEFAIL2,
-    "Der h\84ufigste Grund hierf\81r ist die Verwendung einer USB Tastautur\n"},
+    "Der h\84ufigste Grund hierf\81r ist die Verwendung einer USB-Tastatur\n"},
     {STRING_CONSOLEFAIL3,
-    "USB Tastaturen werden noch nicht vollst\84ndig unterst\81tzt\n"},
+    "USB-Tastaturen werden noch nicht vollst\84ndig unterst\81tzt\n"},
     {STRING_FORMATTINGDISK,
     "Setup formatiert Ihre Festplatte"},
     {STRING_CHECKINGDISK,
     "Setup überprüft Ihre Festplatte"},
     {STRING_FORMATDISK1,
-    " Formatiere Partition als %S Dateisystem (Schnell) "},
+    " Formatiere Partition als %S-Dateisystem (Schnell) "},
     {STRING_FORMATDISK2,
-    " Formatiere Partition als %S Dateisystem "},
+    " Formatiere Partition als %S-Dateisystem "},
     {STRING_KEEPFORMAT,
     " Dateisystem beibehalten (Keine Ver\84nderungen) "},
     {STRING_HDINFOPARTCREATE,
@@ -1695,5 +1694,3 @@ MUI_STRING deDEStrings[] =
     "Tastaturlayout hinzufügen"},
     {0, 0}
 };
-
-#endif
index b34c683..425688e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_DE_LI_H__
-#define LANG_DE_LI_H__
+#pragma once
 
 MUI_LAYOUTS deLILayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS deLILayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 2c7f683..21956e9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_DE_LU_H__
-#define LANG_DE_LU_H__
+#pragma once
 
 MUI_LAYOUTS deLULayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS deLULayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 90f33c4..b96b1e2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_DV_MV_H__
-#define LANG_DV_MV_H__
+#pragma once
 
 MUI_LAYOUTS dvMVLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS dvMVLayouts[] =
     { L"0465", L"00000465" },
     { NULL, NULL }
 };
-
-#endif
index 861bae5..e04f530 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_EL_GR_H__
-#define LANG_EL_GR_H__
+#pragma once
 
 MUI_LAYOUTS elGRLayouts[] =
 {
@@ -1724,5 +1723,3 @@ MUI_STRING elGRStrings[] =
     "\82å¤\9c«\98  §¨¦©\9fã¡\9e «à¤ \9b \98«á¥\9cठ§¢\9e¡«¨¦¢¦\9a妬"},
     {0, 0}
 };
-
-#endif
index 2e50aa9..ffa3b86 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_AU_H__
-#define LANG_EN_AU_H__
+#pragma once
 
 MUI_LAYOUTS enAULayouts[] =
 {
     { L"0C09", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 09c3d52..4c34df8 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_BZ_H__
-#define LANG_EN_BZ_H__
+#pragma once
 
 MUI_LAYOUTS enBZLayouts[] =
 {
     { L"2809", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 3c50f83..98000ae 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_EN_CA_H__
-#define LANG_EN_CA_H__
+#pragma once
 
 MUI_LAYOUTS enCALayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS enCALayouts[] =
     { L"1009", L"00001009" },
     { NULL, NULL }
 };
-
-#endif
index 6dd41f4..e014b33 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_CB_H__
-#define LANG_EN_CB_H__
+#pragma once
 
 MUI_LAYOUTS enCBLayouts[] =
 {
     { L"2409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index e147fb7..58fe503 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_GB_H__
-#define LANG_EN_GB_H__
+#pragma once
 
 MUI_LAYOUTS enGBLayouts[] =
 {
     { L"0809", L"00000809" },
     { NULL, NULL }
 };
-
-#endif
index db9ee24..e41db1e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_EN_IE_H__
-#define LANG_EN_IE_H__
+#pragma once
 
 MUI_LAYOUTS enIELayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS enIELayouts[] =
     { L"1809", L"00011809" },
     { NULL, NULL }
 };
-
-#endif
index a7122f4..0b95676 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_JM_H__
-#define LANG_EN_JM_H__
+#pragma once
 
 MUI_LAYOUTS enJMLayouts[] =
 {
     { L"2009", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 241d8ef..33eb865 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_NZ_H__
-#define LANG_EN_NZ_H__
+#pragma once
 
 MUI_LAYOUTS enNZLayouts[] =
 {
     { L"1409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index b525130..88273d2 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_PH_H__
-#define LANG_EN_PH_H__
+#pragma once
 
 MUI_LAYOUTS enPHLayouts[] =
 {
     { L"3409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index e686627..e167cfc 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_TT_H__
-#define LANG_EN_TT_H__
+#pragma once
 
 MUI_LAYOUTS enTTLayouts[] =
 {
     { L"2C09", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 34d9d89..ac694c9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_EN_US_H__
-#define LANG_EN_US_H__
+#pragma once
 
 MUI_LAYOUTS enUSLayouts[] =
 {
@@ -1693,5 +1692,3 @@ MUI_STRING enUSStrings[] =
     "Adding keyboard layouts"},
     {0, 0}
 };
-
-#endif
index cf5d1f3..59ceabf 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_ZA_H__
-#define LANG_EN_ZA_H__
+#pragma once
 
 MUI_LAYOUTS enZALayouts[] =
 {
     { L"1C09", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 23dabb7..917bd6c 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_EN_ZW_H__
-#define LANG_EN_ZW_H__
+#pragma once
 
 MUI_LAYOUTS enZWLayouts[] =
 {
     { L"3009", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 15c7c99..3b72dcf 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_EO_AA_H__
-#define LANG_EO_AA_H__
+#pragma once
 
 MUI_LAYOUTS eoAALayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS eoAALayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index c427b8d..4e36f4a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_AR_H__
-#define LANG_ES_AR_H__
+#pragma once
 
 MUI_LAYOUTS esARLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esARLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 69e4957..f7e210d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_BO_H__
-#define LANG_ES_BO_H__
+#pragma once
 
 MUI_LAYOUTS esBOLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esBOLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 1222675..8870443 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_CL_H__
-#define LANG_ES_CL_H__
+#pragma once
 
 MUI_LAYOUTS esCLLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esCLLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 9e6e569..3b36be4 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_CO_H__
-#define LANG_ES_CO_H__
+#pragma once
 
 MUI_LAYOUTS esCOLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esCOLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index d66e39f..eff1db0 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_CR_H__
-#define LANG_ES_CR_H__
+#pragma once
 
 MUI_LAYOUTS esCRLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esCRLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 5a474dc..3987c8c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_DO_H__
-#define LANG_ES_DO_H__
+#pragma once
 
 MUI_LAYOUTS esDOLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esDOLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 9627211..ea54ab7 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_EC_H__
-#define LANG_ES_EC_H__
+#pragma once
 
 MUI_LAYOUTS esECLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esECLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index ef51688..d951d6b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_ES_H__
-#define LANG_ES_ES_H__
+#pragma once
 
 MUI_LAYOUTS esESLayouts[] =
 {
@@ -1694,5 +1693,3 @@ MUI_STRING esESStrings[] =
     "Adding keyboard layouts"},
     {0, 0}
 };
-
-#endif
index 184f57a..5d99a5d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_GT_H__
-#define LANG_ES_GT_H__
+#pragma once
 
 MUI_LAYOUTS esGTLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esGTLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 7564bc6..14d5ab9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_HN_H__
-#define LANG_ES_HN_H__
+#pragma once
 
 MUI_LAYOUTS esHNLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esHNLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 0ebe7fc..da0bd62 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_MX_H__
-#define LANG_ES_MX_H__
+#pragma once
 
 MUI_LAYOUTS esMXLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esMXLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index cf9142a..c570367 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_NI_H__
-#define LANG_ES_NI_H__
+#pragma once
 
 MUI_LAYOUTS esNILayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esNILayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 38693e8..81bf70c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_PA_H__
-#define LANG_ES_PA_H__
+#pragma once
 
 MUI_LAYOUTS esPALayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esPALayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 97090ac..970402b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_PE_H__
-#define LANG_ES_PE_H__
+#pragma once
 
 MUI_LAYOUTS esPELayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esPELayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 02492dc..e9acb60 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_PR_H__
-#define LANG_ES_PR_H__
+#pragma once
 
 MUI_LAYOUTS esPRLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esPRLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index f5c476e..640d700 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_PY_H__
-#define LANG_ES_PY_H__
+#pragma once
 
 MUI_LAYOUTS esPYLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esPYLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index d2f96b7..18a8c9c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_SV_H__
-#define LANG_ES_SV_H__
+#pragma once
 
 MUI_LAYOUTS esSVLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esSVLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index b8ae8d1..a007b24 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_UY_H__
-#define LANG_ES_UY_H__
+#pragma once
 
 MUI_LAYOUTS esUYLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esUYLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 57cca1d..46baa1c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ES_VE_H__
-#define LANG_ES_VE_H__
+#pragma once
 
 MUI_LAYOUTS esVELayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS esVELayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 29bbd51..4a1f7bd 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ET_EE_H__
-#define LANG_ET_EE_H__
+#pragma once
 
 MUI_LAYOUTS etEELayouts[] =
 {
@@ -1691,5 +1690,3 @@ MUI_STRING etEEStrings[] =
     "Klaviatuuriasetuste lisamine"},
     {0, 0}
 };
-
-#endif
index ae9dd39..1bc40cf 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_EU_ES_H__
-#define LANG_EU_ES_H__
+#pragma once
 
 MUI_LAYOUTS euESLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS euESLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 219ae1c..626f2bf 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_FA_IR_H__
-#define LANG_FA_IR_H__
+#pragma once
 
 MUI_LAYOUTS faIRLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS faIRLayouts[] =
     { L"0429", L"00000401" },
     { NULL, NULL }
 };
-
-#endif
index db363d7..096db15 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_FI_FI_H__
-#define LANG_FI_FI_H__
+#pragma once
 
 MUI_LAYOUTS fiFILayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS fiFILayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index cede112..01b190b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_FO_FO_H__
-#define LANG_FO_FO_H__
+#pragma once
 
 MUI_LAYOUTS foFOLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS foFOLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index cee512f..994e4dd 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_FR_BE_H__
-#define LANG_FR_BE_H__
+#pragma once
 
 MUI_LAYOUTS frBELayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS frBELayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index e0ff26a..918a421 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_FR_CA_H__
-#define LANG_FR_CA_H__
+#pragma once
 
 MUI_LAYOUTS frCALayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS frCALayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index c6e2378..8b083c1 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_FR_CH_H__
-#define LANG_FR_CH_H__
+#pragma once
 
 MUI_LAYOUTS frCHLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS frCHLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 9bea823..ae037ab 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_FR_FR_H__
-#define LANG_FR_FR_H__
+#pragma once
 
 MUI_LAYOUTS frFRLayouts[] =
 {
@@ -1707,5 +1706,3 @@ MUI_STRING frFRStrings[] =
     "Adding keyboard layouts"},
     {0, 0}
 };
-
-#endif
index 0a50dbd..18fb3a7 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_FR_LU_H__
-#define LANG_FR_LU_H__
+#pragma once
 
 MUI_LAYOUTS frLULayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS frLULayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 6e564fe..1720d0a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_FR_MC_H__
-#define LANG_FR_MC_H__
+#pragma once
 
 MUI_LAYOUTS frMCLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS frMCLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 35dcf5e..31acfd3 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_GL_ES_H__
-#define LANG_GL_ES_H__
+#pragma once
 
 MUI_LAYOUTS glESLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS glESLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 5443e1d..c0cb2cb 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_GU_IN_H__
-#define LANG_GU_IN_H__
+#pragma once
 
 MUI_LAYOUTS guINLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS guINLayouts[] =
     { L"0439", L"00000439" },
     { NULL, NULL }
 };
-
-#endif
index c981fe7..9c18824 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_HE_IL_H__
-#define LANG_HE_IL_H__
+#pragma once
 
 MUI_LAYOUTS heILLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS heILLayouts[] =
     { L"040D", L"0000040D" },
     { NULL, NULL }
 };
-
-#endif
index b017317..caf0c3d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_HI_IN_H__
-#define LANG_HI_IN_H__
+#pragma once
 
 MUI_LAYOUTS hiINLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS hiINLayouts[] =
     { L"0439", L"00000439" },
     { NULL, NULL }
 };
-
-#endif
index 8622ea5..33a62e2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_HR_HR_H__
-#define LANG_HR_HR_H__
+#pragma once
 
 MUI_LAYOUTS hrHRLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS hrHRLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index fc57399..a59208b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_HU_HU_H__
-#define LANG_HU_HU_H__
+#pragma once
 
 MUI_LAYOUTS huHULayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS huHULayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 8499622..249c6d6 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_HY_AM_H__
-#define LANG_HY_AM_H__
+#pragma once
 
 MUI_LAYOUTS hyAMLayouts[] =
 {
@@ -9,5 +8,3 @@ MUI_LAYOUTS hyAMLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 2346f23..0cd4ceb 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ID_ID_H__
-#define LANG_ID_ID_H__
+#pragma once
 
 MUI_LAYOUTS idIDLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS idIDLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index e23d530..aad013e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_IS_IS_H__
-#define LANG_IS_IS_H__
+#pragma once
 
 MUI_LAYOUTS isISLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS isISLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index f0cbd7c..eb6748b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_IT_CH_H__
-#define LANG_IT_CH_H__
+#pragma once
 
 MUI_LAYOUTS itCHLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS itCHLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 56f73a7..21d3d89 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_IT_IT_H__
-#define LANG_IT_IT_H__
+#pragma once
 
 MUI_LAYOUTS itITLayouts[] =
 {
@@ -1695,5 +1694,3 @@ MUI_STRING itITStrings[] =
     "Aggiunta delle nazionalit\85 di tastiera"},
     {0, 0}
 };
-
-#endif
index c444450..af7ccdf 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_JA_JP_H__
-#define LANG_JA_JP_H__
+#pragma once
 
 MUI_LAYOUTS jaJPLayouts[] =
 {
@@ -1694,5 +1693,3 @@ MUI_STRING jaJPStrings[] =
     "·°ÎÞ°ÄÞ Ú²±³Äɠ²¶ Á­³"},
     {0, 0}
 };
-
-#endif
index 1c90f06..c103608 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_KA_GE_H__
-#define LANG_KA_GE_H__
+#pragma once
 
 MUI_LAYOUTS kaGELayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS kaGELayouts[] =
     { L"0419", L"00000419" },
     { NULL, NULL }
 };
-
-#endif
index 64d7e29..8672366 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_KK_KZ_H__
-#define LANG_KK_KZ_H__
+#pragma once
 
 MUI_LAYOUTS kkKZLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS kkKZLayouts[] =
     { L"0419", L"00000419" },
     { NULL, NULL }
 };
-
-#endif
index 241ff87..1441331 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_KN_IN_H__
-#define LANG_KN_IN_H__
+#pragma once
 
 MUI_LAYOUTS knINLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS knINLayouts[] =
     { L"0439", L"00010439" },
     { NULL, NULL }
 };
-
-#endif
index 4f805a8..799ae3a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_KO_KR_H__
-#define LANG_KO_KR_H__
+#pragma once
 
 MUI_LAYOUTS koKRLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS koKRLayouts[] =
     { L"0412", L"00000412" },
     { NULL, NULL }
 };
-
-#endif
index ea9b692..cbfcab3 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_KOK_IN_H__
-#define LANG_KOK_IN_H__
+#pragma once
 
 MUI_LAYOUTS kokINLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS kokINLayouts[] =
     { L"0457", L"00000439" },
     { NULL, NULL }
 };
-
-#endif
index b6571f6..e71b40c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_KY_KG_H__
-#define LANG_KY_KG_H__
+#pragma once
 
 MUI_LAYOUTS kyKGLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS kyKGLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 7d455c2..a0a9eb4 100644 (file)
@@ -7,8 +7,7 @@
  * DATE:        2008-01-06
  */
 
-#ifndef LANG_LT_LT_H__
-#define LANG_LT_LT_H__
+#pragma once
 
 MUI_LAYOUTS ltLTLayouts[] =
 {
@@ -1704,5 +1703,3 @@ MUI_STRING ltLTStrings[] =
     "Adding keyboard layouts"},
     {0, 0}
 };
-
-#endif
index 23ca79b..8371a23 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_LV_LV_H__
-#define LANG_LV_LV_H__
+#pragma once
 
 MUI_LAYOUTS lvLVLayouts[] =
 {
     { L"0426", L"00010426" },
     { NULL, NULL }
 };
-
-#endif
index 1405f64..4acab64 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_MK_MK_H__
-#define LANG_MK_MK_H__
+#pragma once
 
 MUI_LAYOUTS mkMKLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS mkMKLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index f503f99..6dec34d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_MN_MN_H__
-#define LANG_MN_MN_H__
+#pragma once
 
 MUI_LAYOUTS mnMNLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS mnMNLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 58840e9..ff2e09b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_MR_IN_H__
-#define LANG_MR_IN_H__
+#pragma once
 
 MUI_LAYOUTS mrINLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS mrINLayouts[] =
     { L"044E", L"00000439" },
     { NULL, NULL }
 };
-
-#endif
index 24ef23d..e0563c8 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_MS_BN_H__
-#define LANG_MS_BN_H__
+#pragma once
 
 MUI_LAYOUTS msBNLayouts[] =
 {
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 1abc1a3..646eb6a 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_MS_MY_H__
-#define LANG_MS_MY_H__
+#pragma once
 
 MUI_LAYOUTS msMYLayouts[] =
 {
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index f02d95e..9b732ad 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_MY_MM_H__
-#define LANG_MY_MM_H__
+#pragma once
 
 MUI_LAYOUTS myMMLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS myMMLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 233697b..ebf61e6 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_NL_BE_H__
-#define LANG_NL_BE_H__
+#pragma once
 
 MUI_LAYOUTS nlBELayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS nlBELayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 484b7ea..eba2d93 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_NL_NL_H__
-#define LANG_NL_NL_H__
+#pragma once
 
 MUI_LAYOUTS nlNLLayouts[] =
 {
@@ -1722,6 +1721,3 @@ MUI_STRING nlNLStrings[] =
     "Toevoegen toetsenbord indelingen"},
     {0, 0}
 };
-
-
-#endif
index 4032b67..8597b74 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_NN_NO_H__
-#define LANG_NN_NO_H__
+#pragma once
 
 MUI_LAYOUTS nnNOLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS nnNOLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 44be598..44cc3c3 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_PA_IN_H__
-#define LANG_PA_IN_H__
+#pragma once
 
 MUI_LAYOUTS paINLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS paINLayouts[] =
     { L"0439", L"00010439" },
     { NULL, NULL }
 };
-
-#endif
index dde0dbd..8d4262d 100644 (file)
@@ -5,8 +5,7 @@
  *      IRC: irc.freenode.net #reactos-pl;
  */
 
-#ifndef LANG_PL_PL_H__
-#define LANG_PL_PL_H__
+#pragma once
 
 MUI_LAYOUTS plPLLayouts[] =
 {
@@ -1703,5 +1702,3 @@ MUI_STRING plPLStrings[] =
     "Dodawanie uk\88ad¢w klawiatury"},
     {0, 0}
 };
-
-#endif
index f1623f9..6c545ad 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_PT_BR_H__
-#define LANG_PT_BR_H__
+#pragma once
 
 MUI_LAYOUTS ptBRLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS ptBRLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 6ca8d28..6faf386 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_PT_PT_H__
-#define LANG_PT_PT_H__
+#pragma once
 
 MUI_LAYOUTS ptPTLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS ptPTLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 62e9e75..d36a5e6 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_RM_CH_H__
-#define LANG_RM_CH_H__
+#pragma once
 
 MUI_LAYOUTS rmCHLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS rmCHLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 8ee875b..f8f1744 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_RO_RO_H__
-#define LANG_RO_RO_H__
+#pragma once
 
 MUI_LAYOUTS roROLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS roROLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index ea25d6c..7e55b97 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_RU_RU_H__
-#define LANG_RU_RU_H__
+#pragma once
 
 MUI_LAYOUTS ruRULayouts[] =
 {
@@ -1695,5 +1694,3 @@ MUI_STRING ruRUStrings[] =
     "Adding keyboard layouts"},
     {0, 0}
 };
-
-#endif
index b186ff4..8d8442d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_SA_IN_H__
-#define LANG_SA_IN_H__
+#pragma once
 
 MUI_LAYOUTS saINLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS saINLayouts[] =
     { L"044F", L"00000439" },
     { NULL, NULL }
 };
-
-#endif
index 7659645..5078f08 100644 (file)
@@ -4,8 +4,7 @@
  * LastChange:  01-11-2009
  */
 
-#ifndef LANG_SK_SK_H__
-#define LANG_SK_SK_H__
+#pragma once
 
 MUI_LAYOUTS skSKLayouts[] =
 {
@@ -1705,5 +1704,3 @@ MUI_STRING skSKStrings[] =
     "Prid vam rozlo§enia kl vesnice"},
     {0, 0}
 };
-
-#endif
index 9278ee7..29a0133 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_SL_SI_H__
-#define LANG_SL_SI_H__
+#pragma once
 
 MUI_LAYOUTS slSILayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS slSILayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 74afcc3..21027ea 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_SQ_AL_H__
-#define LANG_SQ_AL_H__
+#pragma once
 
 MUI_LAYOUTS sqALLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS sqALLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 0a2d81a..022248a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_SR_SP_H__
-#define LANG_SR_SP_H__
+#pragma once
 
 MUI_LAYOUTS srSPLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS srSPLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index b377d7f..c900855 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_SV_FI_H__
-#define LANG_SV_FI_H__
+#pragma once
 
 MUI_LAYOUTS svFILayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS svFILayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index df25e29..0dbffdc 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_SV_SE_H__
-#define LANG_SV_SE_H__
+#pragma once
 
 MUI_LAYOUTS svSELayouts[] =
 {
@@ -1694,5 +1693,3 @@ MUI_STRING svSEStrings[] =
     "Adding keyboard layouts"},
     {0, 0}
 };
-
-#endif
index c73f07d..3a58152 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef LANG_SW_KE_H__
-#define LANG_SW_KE_H__
+#pragma once
 
 MUI_LAYOUTS swKELayouts[] =
 {
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 02435a2..0a5f91c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_SYR_SY_H__
-#define LANG_SYR_SY_H__
+#pragma once
 
 MUI_LAYOUTS syrSYLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS syrSYLayouts[] =
     { L"045A", L"0000045A" },
     { NULL, NULL }
 };
-
-#endif
index a111ada..9322299 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_TA_IN_H__
-#define LANG_TA_IN_H__
+#pragma once
 
 MUI_LAYOUTS taINLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS taINLayouts[] =
     { L"0449", L"00000449" },
     { NULL, NULL }
 };
-
-#endif
index b9072ed..cd80fcc 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_TE_IN_H__
-#define LANG_TE_IN_H__
+#pragma once
 
 MUI_LAYOUTS teINLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS teINLayouts[] =
     { L"0439", L"00010439" },
     { NULL, NULL }
 };
-
-#endif
index a0f855f..6f50c42 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_TH_TH_H__
-#define LANG_TH_TH_H__
+#pragma once
 
 MUI_LAYOUTS thTHLayouts[] =
 {
@@ -10,5 +9,3 @@ MUI_LAYOUTS thTHLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 0920ad0..a3c2db5 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_TR_TR_H__
-#define LANG_TR_TR_H__
+#pragma once
 
 MUI_LAYOUTS trTRLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS trTRLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 93665c4..b54ebfd 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_TT_TA_H__
-#define LANG_TT_TA_H__
+#pragma once
 
 MUI_LAYOUTS ttTALayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS ttTALayouts[] =
     { L"0419", L"00000419" },
     { NULL, NULL }
 };
-
-#endif
index e331c0c..ba3fd00 100644 (file)
@@ -3,8 +3,7 @@
  *      http://www.reactos.org/uk/
  */ 
 
-#ifndef LANG_UK_UA_H__
-#define LANG_UK_UA_H__
+#pragma once
 
 MUI_LAYOUTS ukUALayouts[] =
 {
@@ -1700,5 +1699,3 @@ MUI_STRING ukUAStrings[] =
     "\84®¤ ¢ ­­ï à®§ª« ¤®ª ª« ¢i âãà¨"},
     {0, 0}
 };
-
-#endif 
index b1129de..73beeee 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_UR_PK_H__
-#define LANG_UR_PK_H__
+#pragma once
 
 MUI_LAYOUTS urPKLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS urPKLayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 963c761..af15bb9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_UZ_UZ_H__
-#define LANG_UZ_UZ_H__
+#pragma once
 
 MUI_LAYOUTS uzUZLayouts[] =
 {
@@ -8,5 +7,3 @@ MUI_LAYOUTS uzUZLayouts[] =
     { L"0419", L"00000419" },
     { NULL, NULL }
 };
-
-#endif
index 9fed103..dfd3986 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_VI_VN_H__
-#define LANG_VI_VN_H__
+#pragma once
 
 MUI_LAYOUTS viVNLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS viVNLayouts[] =
     { L"042A", L"0000042A" },
     { NULL, NULL }
 };
-
-#endif
index fbaafe4..7ec2c78 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_WA_BE_H__
-#define LANG_WA_BE_H__
+#pragma once
 
 MUI_LAYOUTS waBELayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS waBELayouts[] =
     { L"0409", L"00000409" },
     { NULL, NULL }
 };
-
-#endif
index 3a12714..d538e74 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ZH_CN_H__
-#define LANG_ZH_CN_H__
+#pragma once
 
 MUI_LAYOUTS zhCNLayouts[] =
 {
@@ -11,5 +10,3 @@ MUI_LAYOUTS zhCNLayouts[] =
     { L"0804", L"E0040804" },
     { NULL, NULL }
 };
-
-#endif
index 5f99a9d..82905a3 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ZH_HK_H__
-#define LANG_ZH_HK_H__
+#pragma once
 
 MUI_LAYOUTS zhHKLayouts[] =
 {
@@ -7,5 +6,3 @@ MUI_LAYOUTS zhHKLayouts[] =
     { L"0C04", L"E0080404" },
     { NULL, NULL }
 };
-
-#endif
index 6194ed3..b12866f 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ZH_MO_H__
-#define LANG_ZH_MO_H__
+#pragma once
 
 MUI_LAYOUTS zhMOLayouts[] =
 {
@@ -9,5 +8,3 @@ MUI_LAYOUTS zhMOLayouts[] =
     { L"0404", L"E0080404" },
     { NULL, NULL }
 };
-
-#endif
index 0387626..f59b1d9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ZH_SG_H__
-#define LANG_ZH_SG_H__
+#pragma once
 
 MUI_LAYOUTS zhSGLayouts[] =
 {
@@ -10,5 +9,3 @@ MUI_LAYOUTS zhSGLayouts[] =
     { L"0804", L"E0040804" },
     { NULL, NULL }
 };
-
-#endif
index 384a844..a1d3dad 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_ZH_TW_H__
-#define LANG_ZH_TW_H__
+#pragma once
 
 MUI_LAYOUTS zhTWLayouts[] =
 {
@@ -9,5 +8,3 @@ MUI_LAYOUTS zhTWLayouts[] =
     { L"0404", L"E0010404" },
     { NULL, NULL }
 };
-
-#endif
index 61722e6..cf0f718 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef MUI_H__
-#define MUI_H__
+#pragma once
 
 typedef struct
 {
@@ -137,4 +136,3 @@ MUIGetString(ULONG Number);
 #define STRING_MB                        54
 #define STRING_GB                        55
 #define STRING_ADDKBLAYOUTS              56
-#endif
index 399a7eb..18e707a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_MUI_FONTS_H__
-#define LANG_MUI_FONTS_H__
+#pragma once
 
 MUI_SUBFONT LatinFonts[] =
 {
@@ -88,5 +87,3 @@ MUI_SUBFONT UnicodeFonts[] =
     { L"Helv",            L"DejaVu Sans" },
     { NULL, NULL }
 };
-
-#endif
index 59b1159..ebf404a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef LANG_MUI_LANGUAGES_H__
-#define LANG_MUI_LANGUAGES_H__
+#pragma once
 
 #include "lang/af-ZA.h"
 #include "lang/ar-AE.h"
@@ -281,5 +280,3 @@ const MUI_LANGUAGE LanguageList[] =
   {L"00000435", L"1252", L"850", L"10000", L"Zulu",                         L"1",   enUSPages, enUSErrorEntries, enUSStrings, LatinFonts,    enUSLayouts },
   {NULL, NULL, NULL, NULL, NULL, NULL}
 };
-
-#endif
index 1ce410d..207927c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _HOST_NATIVE_H_
-#define _HOST_NATIVE_H_
+#pragma once
 
 #include "usetup.h"
 
@@ -12,5 +11,3 @@ typedef struct
 #define SetupInitDefaultQueueCallback(a) NULL
 #define SetupDefaultQueueCallbackW(a, b, c, d) TRUE
 #define SetupTermDefaultQueueCallback(a)
-
-#endif /* _HOST_NATIVE_H_ */
index e58d4f7..feb8982 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef _UTILS_CONSOLE_H_
-#define _UTILS_CONSOLE_H_
+#pragma once
 
 BOOL WINAPI
 AllocConsole(VOID);
@@ -113,6 +112,4 @@ SetConsoleOutputCP(
        IN UINT wCodePageID
 );
 
-#endif /* _UTILS_CONSOLE_H_ */
-
 /* EOF */
index 8a63a1e..cea1aef 100644 (file)
  * PROGRAMMER:      Tinus
  */
 
-#ifndef __KEYTRANS_H__
-#define __KEYTRANS_H__
+#pragma once
 
 #include <ntddkbd.h>
 
 NTSTATUS
 IntTranslateKey(PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event);
 
-#endif /* __KEYTRANS_H__ */
-
 /* EOF */
index ca0bdf7..5c553c2 100644 (file)
@@ -846,10 +846,10 @@ AddDiskToList (HANDLE FileHandle,
   DiskEntry->SectorsPerTrack = DiskGeometry.SectorsPerTrack;
   DiskEntry->BytesPerSector = DiskGeometry.BytesPerSector;
 
-  DPRINT ("Cylinders %d\n", DiskEntry->Cylinders);
-  DPRINT ("TracksPerCylinder %d\n", DiskEntry->TracksPerCylinder);
-  DPRINT ("SectorsPerTrack %d\n", DiskEntry->SectorsPerTrack);
-  DPRINT ("BytesPerSector %d\n", DiskEntry->BytesPerSector);
+  DPRINT ("Cylinders %I64u\n", DiskEntry->Cylinders);
+  DPRINT ("TracksPerCylinder %I64u\n", DiskEntry->TracksPerCylinder);
+  DPRINT ("SectorsPerTrack %I64u\n", DiskEntry->SectorsPerTrack);
+  DPRINT ("BytesPerSector %I64u\n", DiskEntry->BytesPerSector);
 
   DiskEntry->TrackSize =
     (ULONGLONG)DiskGeometry.SectorsPerTrack *
index 7d6f088..ef3f4d2 100644 (file)
@@ -23,8 +23,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __PARTLIST_H__
-#define __PARTLIST_H__
+#pragma once
 
 /* We have to define it there, because it is not in the MS DDK */
 #define PARTITION_EXT2 0x83
@@ -222,6 +221,4 @@ CheckForLinuxFdiskPartitions (PPARTLIST List);
 BOOLEAN
 WritePartitionsToDisk (PPARTLIST List);
 
-#endif /* __PARTLIST_H__ */
-
 /* EOF */
index eda1f1e..53af83d 100644 (file)
@@ -24,9 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __PROGRESS_H__
-#define __PROGRESS_H__
-
+#pragma once
 
 typedef struct _PROGRESS
 {
@@ -75,6 +73,4 @@ VOID
 ProgressSetStep (PPROGRESSBAR Bar,
                 ULONG Step);
 
-#endif /* __PROGRESS_H__ */
-
 /* EOF */
index 0b41cd3..d764704 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __REGISTRY_H__
-#define __REGISTRY_H__
+#pragma once
 
 BOOLEAN
 ImportRegistryFile(PWSTR Filename,
@@ -38,6 +37,4 @@ SetInstallPathValue(PUNICODE_STRING InstallPath);
 BOOLEAN
 SetMountedDeviceValue(CHAR Letter, ULONG Signature, LARGE_INTEGER StartingOffset);
 
-#endif /* __REGISTRY_H__ */
-
 /* EOF */
index 5c6918e..65b59ef 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __SETTINGS_H__
-#define __SETTINGS_H__
+#pragma once
 
 PGENERIC_LIST
 CreateComputerTypeList(HINF InfFile);
@@ -66,6 +65,4 @@ ProcessKeyboardLayoutFiles(PGENERIC_LIST List);
 BOOLEAN
 SetGeoID(PWCHAR Id);
 
-#endif /* __SETTINGS_H__ */
-
 /* EOF */
index 11c0819..ff7cf87 100644 (file)
@@ -24,8 +24,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __USETUP_H__
-#define __USETUP_H__
+#pragma once
 
 /* C Headers */
 #include <ctype.h>
@@ -123,12 +122,6 @@ typedef enum _PAGE_NUMBER
 #define POPUP_WAIT_ANY_KEY 1
 #define POPUP_WAIT_ENTER   2
 
-#define ROUND_DOWN(n, align) \
-    (((ULONG)n) & ~((align) - 1l))
-
-#define ROUND_UP(n, align) \
-    ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
-
 #define LIST_FOR_EACH(elem, list, type, field) \
     for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \
          &(elem)->field != (list) || (elem == NULL); \
@@ -152,6 +145,4 @@ typedef enum _PAGE_NUMBER
   InsertTailList(current, &((NewEntry)->ListEntryField));\
 }
 
-#endif /* __USETUP_H__*/
-
 /* EOF */
index 67a0320..b66c13f 100644 (file)
@@ -5,8 +5,8 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Grafiktreiberinstallation"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
-  LTEXT "Das ReactOS Setup hat festgestellt, dass Sie ReactOS in VMware(r) installieren.", -1, 117, 8, 140, 24
-  LTEXT "Wenn Sie den VMware(r) SVGA Treiber installieren möchten, klicken Sie auf 'Weiter', ansonsten auf 'Abbrechen'.", -1, 117, 140, 140, 24
+  LTEXT "Das ReactOS-Setup hat festgestellt, dass Sie ReactOS in VMware(r) installieren.", -1, 117, 8, 140, 24
+  LTEXT "Wenn Sie den VMware(r)-SVGA-Treiber installieren möchten, klicken Sie auf 'Weiter', ansonsten auf 'Abbrechen'.", -1, 117, 140, 140, 24
 END
 
 IDD_INSERT_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
@@ -14,7 +14,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Grafiktreiberinstallation"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
-  LTEXT "ReactOS wird nicht mit dem VMware(r) SVGA Treiber ausgeliefert.\n\nGehen Sie bitte auf 'VM' in der Menüleiste von VMware(r) Workstation und wählen Sie 'VMware Tools installieren...'\n\n\nKlicken Sie auf 'Weiter' um fortzufahren, ansonsten auf 'Abbrechen'",-1,25,25,225,85
+  LTEXT "ReactOS wird nicht mit dem VMware(r)-SVGA-Treiber ausgeliefert.\n\nGehen Sie bitte auf 'VM' in der Menüleiste von VMware(r) Workstation und wählen Sie 'VMware Tools installieren...'\n\n\nKlicken Sie auf 'Weiter', um fortzufahren, ansonsten auf 'Abbrechen'",-1,25,25,225,85
 END
 
 IDD_INSTALLING_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
@@ -31,7 +31,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Grafiktreiberinstallation"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
-  LTEXT "Der VMware(r) SVGA Treiber wurde erfolgreich installiert. Wählen Sie bitte Ihre Auflösung:",-1,25,5,225,20
+  LTEXT "Der VMware(r)-SVGA-Treiber wurde erfolgreich installiert. Wählen Sie bitte Ihre Auflösung:",-1,25,5,225,20
   PUSHBUTTON "640x480", 1120, 25, 30, 65, 15, BS_AUTORADIOBUTTON
   PUSHBUTTON "800x600", 1400, 25, 45, 65, 15, BS_AUTORADIOBUTTON
   PUSHBUTTON "1024x768", 1792, 25, 60, 65, 15, BS_AUTORADIOBUTTON
@@ -52,7 +52,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Grafiktreiberinstallation"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
-  LTEXT "Das ReactOS Setup konnte den VMware(r) SVGA Treiber nicht finden.\n\n\nKlicken Sie auf 'Fertigstellen' um mit der Installation fortzufahren",-1,25,25,225,85
+  LTEXT "Das ReactOS-Setup konnte den VMware(r)-SVGA-Treiber nicht finden.\n\n\nKlicken Sie auf 'Fertigstellen', um mit der Installation fortzufahren",-1,25,25,225,85
 END
 
 IDD_CHOOSEACTION DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
@@ -60,10 +60,10 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Grafiktreiberinstallation"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
-  LTEXT "Der VMware(r) SVGA Treiber wurde schon installiert.\n\nWählen Sie bitte eine der folgenden Optionen aus:",-1,25,5,225,30
+  LTEXT "Der VMware(r)-SVGA-Treiber wurde schon installiert.\n\nWählen Sie bitte eine der folgenden Optionen aus:",-1,25,5,225,30
   PUSHBUTTON "Die Bildeinstellungen ändern", IDC_CONFIGSETTINGS, 25, 40, 200, 15, BS_AUTORADIOBUTTON
   PUSHBUTTON "Einen anderen Grafiktreiber benutzen", IDC_USEOTHERDRIVER, 25, 55, 200, 15, BS_AUTORADIOBUTTON
-  PUSHBUTTON "Den VMware(r) SVGA Treiber entfernen", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON
+  PUSHBUTTON "Den VMware(r)-SVGA-Treiber entfernen", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON
   LTEXT "Klicken Sie auf 'Weiter' um fortzufahren oder 'Abbrechen' um den Asssistenten zu beenden.", -1, 25, 93, 225, 19
 END
 
@@ -73,9 +73,9 @@ CAPTION "Grafiktreiberinstallation"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
   LTEXT "Wählen Sie bitte den Grafiktreiber aus, den Sie verwenden möchten:",-1,25,25,225,15
-  PUSHBUTTON "ReactOS VGA Treiber", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON
-  PUSHBUTTON "ReactOS VBE Treiber (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON
-  LTEXT "Klicken Sie auf 'Fertigstellen' um die Installation fertigzustellen oder auf 'Abbrechen' um das Setup ohne Veränderungen zu beenden.", -1, 25, 93, 225, 20
+  PUSHBUTTON "ReactOS-VGA-Treiber", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON
+  PUSHBUTTON "ReactOS-VBE-Treiber (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON
+  LTEXT "Klicken Sie auf 'Fertigstellen', um die Installation fertigzustellen, oder auf 'Abbrechen', um das Setup ohne Veränderungen zu beenden.", -1, 25, 93, 225, 20
 END
 
 IDD_DOUNINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
@@ -83,48 +83,48 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Grafiktreiberinstallation"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
-  LTEXT "Das ReactOS Setup wird Ihren VMware(r) SVGA Treiber entfernen!!!\n\n\nKlicken Sie auf 'Fertigstellen' um den Treiber zu entfernen oder auf 'Abbrechen' um ihn weiterhin zu verwenden.",-1,25,25,225,85
+  LTEXT "Das ReactOS-Setup wird Ihren VMware(r)-SVGA-Treiber entfernen!!!\n\n\nKlicken Sie auf 'Fertigstellen', um den Treiber zu entfernen, oder auf 'Abbrechen', um ihn weiterhin zu verwenden.",-1,25,25,225,85
 END
 
 STRINGTABLE
 BEGIN
   IDS_WIZARD_NAME "VMware(r) gefunden"
-  IDS_FAILEDTOLOCATEDRIVERS "Das ReactOS Setup konnte die benötigten Dateien nicht finden.\nStellen Sie sicher, dass sich die VMware-Tools CD in dem Laufwerk befindet."
-  IDS_FAILEDTOCOPYFILES "Das ReactOS Setup konnte die benötigten Dateien nicht kopieren.\nStellen Sie sicher, dass sich die VMware-Tools CD in dem Laufwerk befindet.\n"
-  IDS_FAILEDTOACTIVATEDRIVER "Fehler beim Aktivieren des VMware(r) SVGA Treibers!"
-  IDS_FAILEDTOSELVGADRIVER "Fehler beim Aktivieren des ReactOS VGA Treibers!"
-  IDS_FAILEDTOSELVBEDRIVER "Fehler beim Aktivieren des ReactOS VBE Treibers!"
-  IDS_UNINSTNOTICE "Die VMware(r) SVGA Treiber Dateien wurden noch nicht gelöscht.\nLöschen Sie sie bitte nach dem Neustart manuell."
+  IDS_FAILEDTOLOCATEDRIVERS "Das ReactOS-Setup konnte die benötigten Dateien nicht finden.\nStellen Sie sicher, dass sich die VMware-Tools-CD in dem Laufwerk befindet."
+  IDS_FAILEDTOCOPYFILES "Das ReactOS-Setup konnte die benötigten Dateien nicht kopieren.\nStellen Sie sicher, dass sich die VMware-Tools-CD in dem Laufwerk befindet.\n"
+  IDS_FAILEDTOACTIVATEDRIVER "Fehler beim Aktivieren des VMware(r)-SVGA-Treibers!"
+  IDS_FAILEDTOSELVGADRIVER "Fehler beim Aktivieren des ReactOS-VGA-Treibers!"
+  IDS_FAILEDTOSELVBEDRIVER "Fehler beim Aktivieren des ReactOS-VBE-Treibers!"
+  IDS_UNINSTNOTICE "Die VMware(r)-SVGA-Treiberdateien wurden noch nicht gelöscht.\nLöschen Sie sie bitte nach dem Neustart manuell."
 END
 
 STRINGTABLE
 BEGIN
   10001 "Niedrigste (8BPP)"
-  10002 "Mittelere (16BPP)"
+  10002 "Mittlere (16BPP)"
   10003 "Höchste (32BPP)"
 END
 
 STRINGTABLE
 BEGIN
-  IDS_SEARCHINGFORCDROM "Suche die VMware(r) Tools CD-ROM..."
+  IDS_SEARCHINGFORCDROM "Suche die VMware(r)-Tools-CD-ROM..."
   IDS_COPYINGFILES      "Kopiere Dateien..."
-  IDS_ENABLINGDRIVER    "Aktiviere den VMware(r) SVGA Treiber..."
+  IDS_ENABLINGDRIVER    "Aktiviere den VMware(r)-SVGA-Treiber..."
 END
 
 STRINGTABLE
 BEGIN
-  IDD_INSERT_VMWARE_TOOLSTITLE         "VMware(r) SVGA Treiber Installationsassistent"
-  IDD_INSERT_VMWARE_TOOLSSUBTITLE       "Bitte legen Sie die VMware-Tool CD-ROM ein."
-  IDD_INSTALLING_VMWARE_TOOLSTITLE      "VMware(r) SVGA Treiber Installationsassistent"
-  IDD_INSTALLING_VMWARE_TOOLSSUBTITLE   "Suchen und kopieren des VMware(r) SVGA Treibers."
-  IDD_CONFIGTITLE                      "VMware(r) SVGA Treiber Installationsassistent"
+  IDD_INSERT_VMWARE_TOOLSTITLE         "VMware(r)-SVGA-Treiber-Installationsassistent"
+  IDD_INSERT_VMWARE_TOOLSSUBTITLE       "Bitte legen Sie die VMware-Tools-CD-ROM ein."
+  IDD_INSTALLING_VMWARE_TOOLSTITLE      "VMware(r)-SVGA-Treiber-Installationsassistent"
+  IDD_INSTALLING_VMWARE_TOOLSSUBTITLE   "Suchen und kopieren des VMware(r)-SVGA-Treibers."
+  IDD_CONFIGTITLE                      "VMware(r)-SVGA-Treiber-Installationsassistent"
   IDD_CONFIGSUBTITLE                   "Wählen Sie die Bildschirmauflösung aus."
-  IDD_INSTALLATION_FAILEDTITLE         "VMware(r) SVGA Treiber Installationsassistent"
-  IDD_INSTALLATION_FAILEDSUBTITLE       "Die VMware(r) SVGA Treiber installation ist fehlgeschlagen."
-  IDD_CHOOSEACTIONTITLE                "VMware(r) SVGA Treiber Installationsassistent"
+  IDD_INSTALLATION_FAILEDTITLE         "VMware(r)-SVGA-Treiber-Installationsassistent"
+  IDD_INSTALLATION_FAILEDSUBTITLE       "Die VMware(r)-SVGA-Treiberinstallation ist fehlgeschlagen."
+  IDD_CHOOSEACTIONTITLE                "VMware(r)-SVGA-Treiber-Installationsassistent"
   IDD_CHOOSEACTIONSUBTITLE              "Wählen Sie eine Option aus."
-  IDD_SELECTDRIVERTITLE                 "VMware(r) SVGA Treiber Installationsassistent"
+  IDD_SELECTDRIVERTITLE                 "VMware(r)-SVGA-Treiber-Installationsassistent"
   IDD_SELECTDRIVERSUBTITLE              "Wählen Sie einen Treiber aus."
-  IDD_DOUNINSTALLTITLE                  "VMware(r) SVGA Treiber Installationsassistent"
-  IDD_DOUNINSTALLSUBTITLE               "De-Installieren des Treibers."
+  IDD_DOUNINSTALLTITLE                  "VMware(r)-SVGA-Treiber-Installationsassistent"
+  IDD_DOUNINSTALLSUBTITLE               "Deinstallieren des Treibers."
 END
index f0e9344..4fdb101 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __VMWINST_H
-#define __VMWINST_H
+#pragma once
 
 #ifndef PSCB_BUTTONPRESSED
 #define PSCB_BUTTONPRESSED     (3)
@@ -67,5 +66,3 @@
 #define IDD_SELECTDRIVERSUBTITLE               352
 #define IDD_DOUNINSTALLTITLE                   361
 #define IDD_DOUNINSTALLSUBTITLE                        362
-
-#endif /* __VMWINST_H */
index 4e96578..63998b0 100644 (file)
@@ -53,7 +53,7 @@ STRINGTABLE DISCARDABLE
 BEGIN
     IDS_TOPICDESC0          "Installiert ReactOS auf ihrem Computer oder aktualisiert eine bestehende Installation."
     IDS_TOPICDESC1          "Die ReactOS-CD durchsuchen."
-    IDS_TOPICDESC2          "Klicken Sie um dieses Programm zu beenden."
+    IDS_TOPICDESC2          "Klicken Sie, um dieses Programm zu beenden."
 //    IDS_TOPICDESC3          "Topic description 3.\n\nDescribe topic 3 here."
 //    IDS_TOPICDESC4          "Topic description 4.\n\nDescribe topic 4 here."
 //    IDS_TOPICDESC5          "Topic description 5.\n\nDescribe topic 5 here."
index c3a8a0b..841b09b 100644 (file)
@@ -4,8 +4,7 @@
  *
  */
 
-#ifndef _BATCH_H_INCLUDED_
-#define _BATCH_H_INCLUDED_
+#pragma once
 
 typedef struct tagBATCHCONTEXT
 {
@@ -50,5 +49,3 @@ VOID   ExitBatch ();
 INT    Batch (LPTSTR, LPTSTR, LPTSTR, PARSED_COMMAND *);
 LPTSTR ReadBatchLine();
 VOID AddBatchRedirection(REDIRECTION **);
-
-#endif /* _BATCH_H_INCLUDED_ */
index 5900e40..c6605de 100644 (file)
@@ -21,8 +21,7 @@
  *        Thanks to Emanuele Aliberti!
  */
 
-#ifndef _CMD_H_INCLUDED_
-#define _CMD_H_INCLUDED_
+#pragma once
 
 #include "config.h"
 
@@ -492,5 +491,3 @@ INT CommandWindow (LPTSTR);
 int cmd_if(TCHAR *);
 int cmd_pause(TCHAR *);
 int cmd_shift(TCHAR *);
-
-#endif /* _CMD_H_INCLUDED_ */
index 18e3093..960f2ab 100644 (file)
@@ -9,8 +9,7 @@
  *
  */
 
-#ifndef _CONFIG_H_INCLUDED_
-#define _CONFIG_H_INCLUDED_
+#pragma once
 
 #define WIN32_LEAN_AND_MEAN
 
@@ -92,5 +91,3 @@
 #ifdef NT4_INTERNAL_COMMANDS
 #define INCLUDE_CMD_WINDOW
 #endif
-
-#endif /* _CONFIG_H_INCLUDED_ */
index de29914..a0aa97e 100644 (file)
@@ -29,7 +29,7 @@ ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] Dateiname ...\n\
   /D  Verarbeitet auch die Ordner.\n\n\
 ATTRIB ohne Parameter zeigt die derzeit gesetzten Attribute aller Dateien an."
 
-STRING_ALIAS_HELP,  "Setzt, löscht oder zeigt Alias.\n\n\
+STRING_ALIAS_HELP,  "Setzt, löscht oder zeigt ein Alias.\n\n\
 ALIAS [alias=[command]]\n\n\
   alias    Name des Alias.\n\
   command  Text welcher für den Alias zugeordnet wird.\n\n\
@@ -40,7 +40,7 @@ Setzt ein neues oder 
 Löscht ein Alias von der Alias-Liste:\n\
   ALIAS da="
 
-STRING_BEEP_HELP, "Gibt einen beep-Ton durch den PC-Speaker aus.\n\nBEEP"
+STRING_BEEP_HELP, "Gibt einen Piepton durch den PC-Lautsprecher aus.\n\nBEEP"
 
 STRING_CALL_HELP, "Ruft eine Batchdatei von einer anderen aus auf.\n\n\
 CALL [Laufwerk:][Pfad]Dateiname [Batch-Parameter]\n\n\
@@ -54,7 +54,7 @@ CD [Laufwerk:][Pfad]\n\
 CD[..|.]\n\n\
   ..   übergeordnetes Verzeichnis\n\
   .    vorhergehende Verzeichnis\n\n\
-Geben Sie CD Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\
+Geben Sie CD-Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\
 Laufwerk anzuzeigen.\n\
 Mit CD ohne Parameter wird das aktuelle Laufwerk und Verzeichnis angezeigt."
 
@@ -66,7 +66,7 @@ Der Befehl CHCP ohne Parameter zeigt die Nummer der aktuellen Codepage an."
 STRING_CHOICE_HELP, "Wartet auf den Benutzer, welcher aus einer Auswahl eine Option wählen muss.\n\n\
 CHOICE  [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\
   /C[:]choices  Die erlaubten Tasten festlegen. Standard-Tasten sind Y und N.\n\
-  /N            Zeigt choices und ? am ende des Promt-Strings NICHT an.\n\
+  /N            Zeigt choices und ? am ende des Prompt-Strings NICHT an.\n\
   /S            Groß- und Kleinschreibung wird beachtet.\n\
   /T[:]c,nn     Standard-Auswahl wird auf c gesetzt nach nn Sekunden.\n\
   text          Zeigt eine Beschreibung an.\n\n\
@@ -74,9 +74,9 @@ ERRORLEVEL wird auf den Offset der Taste welche der Benutzer gedr
 
 STRING_CLS_HELP, "Löscht den Bildschirminhalt.\n\nCLS"
 
-STRING_CMD_HELP1, "\nIntere Befehle verfügbar:\n"
+STRING_CMD_HELP1, "\nInterne Befehle verfügbar:\n"
 
-STRING_CMD_HELP2, "\nVerfügbare Features:"
+STRING_CMD_HELP2, "\nVerfügbare Funktionen:"
 
 STRING_CMD_HELP3,"  [aliases]"
 
@@ -96,11 +96,11 @@ CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\
               (kann nicht beendet werden).\n\
   /T:bf       Setzt die Hintergrund- und Vordergrund-Farbe (siehe COLOR Befehl)."
 
-STRING_COLOR_HELP1, "Legt die standard Hinter- und Vordergrundfarben für die Konsole fest.\n\n\
+STRING_COLOR_HELP1, "Legt die Standardhinter- und Vordergrundfarben für die Konsole fest.\n\n\
 COLOR [attr [/F]] \n\n\
   attr        Gibt die Farbattribute für die Konsolenausgabe an.\n\
-  /F          füllt die Konsolenausgabe mit dem Farbattribut\n\n\
-Es gibt 3 Möglichkeiten die Farbe festzulegen:\n\
+  /F          Füllt die Konsolenausgabe mit dem Farbattribut\n\n\
+Es gibt 3 Möglichkeiten, um die Farbe festzulegen:\n\
 1) [bright] name on [bright] name  (Nur die 4 ersten Buchstaben sind nötig)\n\
 2) decimal on decimal\n\
 3) two hex digits\n\n\
@@ -129,7 +129,7 @@ COPY [/V][/Y|/-Y][/A|/B] Quelle [/A|/B]\n\
                vorhandener Zieldateien.\n\
   /-Y          Fordert beim Überschreiben vorhandener Zieldateien zum\n\
                Bestätigen auf.\n\n\
-Die Option /Y ist möglicherweise in der Umgebungsvariablen COPYCMD.\n\
+Die Option /Y ist möglicherweise in der Umgebungsvariablen COPYCMD definiert.\n\
 ..."
 
 STRING_DATE_HELP1, "\nGeben Sie das neue Datum ein (mm%cdd%cyyyy): "
@@ -148,22 +148,22 @@ STRING_DEL_HELP1,  "L
 DEL [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\
 DELETE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\
 ERASE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\n\
-  file  Geben Sie die Dateinamen an welche Sie löschen möchten\n\n\
+  file  Geben Sie die Dateinamen an, welche Sie löschen möchten\n\n\
   /N    Nichts.\n\
   /P    Fordert Sie vor dem Löschen jeder Datei zur Bestätigung auf.\n\
   /T    Zeigt die Anzahl der gelöschten Dateien und deren vorherigen Speicherplatzbedarf an.\n\
   /Q    Beenden.\n\
-  /W    Sicheres Löschen. Dateien werden mit Zufallszahlen überschrieben bevor sie gelöscht werden.\n\
+  /W    Sicheres Löschen. Dateien werden mit Zufallszahlen überschrieben, bevor sie gelöscht werden.\n\
   /Y    Löscht alles (*.*) ohne Vorwarnung.\n\
-  /Z    Löscht versteckte, mit nur leserechten und Systemdateien.\n"
+  /Z    Löscht versteckte Dateien mit Nur-Leserechten und Systemdateien.\n"
 
-STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden gelöscht!\nSind Sie sicher (Y/N)?"
+STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden gelöscht!\nSind Sie sich sicher (Y/N)?"
 STRING_DEL_HELP3, "    %lu Datei(en) gelöscht\n"
 STRING_DEL_HELP4, "    %lu Datei(en) gelöscht\n"
 
 STRING_DELAY_HELP, "Pause für n Sekunden oder Millisekunden\n\
 DELAY [/m]n\n\n\
-  /m          Millisekunden ansonsten Sekunden\n"
+  /m          Millisekunden, ansonsten Sekunden\n"
 
 STRING_DIR_HELP1, "Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\n\
 DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
@@ -199,7 +199,7 @@ DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
               werden Leerzeichen angezeigt.\n\
   /4          Zeigt das Jahr vierstellig an.\n\n\
 Optionen können in der Umgebungsvariablen DIRCMD voreingestellt werden.\n\
-""-"" vor einer Option setzt die Voreinstellung ausser Kraft, z.B. DIR /-W."
+""-"" vor einer Option setzt die Voreinstellung außer Kraft, z.B. DIR /-W."
 
 STRING_DIR_HELP2, " Datenträger in Laufwerk %c ist %s\n"
 STRING_DIR_HELP3, " Datenträger in Laufwerk %c hat keine Bezeichnung\n"
@@ -209,25 +209,25 @@ STRING_DIR_HELP6, "%16i Verzeichnis(se), % 15s Bytes frei\n"
 STRING_DIR_HELP7, "\n Verzeichnis von %s\n\n"
 STRING_DIR_HELP8, "%16i Datei(en)% 14s Bytes\n"
 
-STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis für den POPD Befehl, und\n\
-wechselt dann zu den festgelegten Verzeichnis.\n\n\
+STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis für den POPD-Befehl und\n\
+wechselt dann in das festgelegte Verzeichnis.\n\n\
 PUSHD [path | ..]\n\n\
-  path        Legt das Verzeichnis fest zu welchem gewechselt werden soll"
+  path        Legt das Verzeichnis fest, in das gewechselt werden soll"
 
-STRING_DIRSTACK_HELP2, "Wechselt zu dem Verzeichnis welches vom PUSHD Befehl gespeichert wurde.\n\nPOPD"
+STRING_DIRSTACK_HELP2, "Wechselt in das Verzeichnis, das vom PUSHD-Befehl gespeichert wurde.\n\nPOPD"
 
 STRING_DIRSTACK_HELP3, "Druckt den Inhalt des Verzeichnis-Stacks.\n\nDIRS"
 
 STRING_DIRSTACK_HELP4, "Verzeichnis-Stack ist leer"
 
-STRING_ECHO_HELP1,  "Sendet eine Nachricht ohne den Zeilenvorschub und Wagenrücklauf zu betätigen.\n\n\
+STRING_ECHO_HELP1,  "Sendet eine Nachricht, ohne den Zeilenvorschub und Wagenrücklauf zu betätigen.\n\n\
   ECHOS message"
 
-STRING_ECHO_HELP2,  "Sendet eine Nachricht zur Standard Fehlerausgabe.\n\n\
+STRING_ECHO_HELP2,  "Sendet eine Nachricht zur Standard-Fehlerausgabe.\n\n\
   ECHOERR Nachricht\n\
   ECHOERR.           gibt eine Leerzeile aus"
 
-STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard Fehlerausgabe ohne den Zeilenvorschub und Wagenrücklauf zu betätigen.\n\n\
+STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard-Fehlerausgabe, ohne den Zeilenvorschub und Wagenrücklauf zu betätigen.\n\n\
   ECHOSERR Nachricht"
 
 STRING_ECHO_HELP4, "Zeigt Meldungen an oder schaltet die Befehlsanzeige ein ""ON"" oder aus ""OFF"".\n\n\
@@ -252,11 +252,11 @@ statt %Variable an."
 
 STRING_FREE_HELP1, "\nVolume in Laufwerk %s ist %-11s\n\
  Volume-Seriennummer: %s\n\
-  %16s bytes Speicherkapazität\n\
-  %16s bytes belegter Speicher\n\
-  %16s bytes freier Speicher\n"
+  %16s Byte Speicherkapazität\n\
+  %16s Byte belegter Speicher\n\
+  %16s Byte freier Speicher\n"
 
-STRING_FREE_HELP2, "Zeigt die Volumesinformationen an.\n\nFREE [Laufwerk: ...]"
+STRING_FREE_HELP2, "Zeigt die Volumeinformationen an.\n\nFREE [Laufwerk: ...]"
 
 STRING_IF_HELP1, "Verarbeitet Ausdrücke in einer Batchdatei abhängig von Bedingungen.\n\n\
   IF [NOT] ERRORLEVEL Nummer Befehl\n\
@@ -292,12 +292,12 @@ STRING_LOCALE_HELP1, "Aktuelle Zeit: "
 STRING_MKDIR_HELP,   "Erzeugt ein Verzeichnis.\n\n\
 MKDIR [Laufwerk:]Pfad\nMD [Laufwerk:]Pfad"
 
-STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
-MKLINK [/D | /H | /J] linkname target\n\n\
-  /D  Indicates that the symbolic link target is a directory.\n\
-  /H  Create a hard link.\n\
-  /J  Create a directory junction.\n\n\
-If neither /H or /J is specified, a symbolic link is created."
+STRING_MKLINK_HELP, "Erzeugt eine Dateisystemverknüpfung.\n\n\
+MKLINK [/D | /H | /J] Linkname Ziel\n\n\
+  /D  Gibt an, dass das Ziel der Verknüpfung ein Verzeichnis ist.\n\
+  /H  Erzeugt einen Hardlink.\n\
+  /J  Erzeugt einen Junction Point.\n\n\
+Wenn weder /H noch /J angegeben werden, wird eine symbolische Verknüpfung angelegt."
 
 STRING_MEMMORY_HELP1, "Zeigt die Größe des Systemspeicher an.\n\nMEMORY"
 
@@ -307,7 +307,7 @@ STRING_MEMMORY_HELP2, "\n  %12s%% Speicher geladen.\n\n\
   %13s bytes Auslagerungsdatei (insgesamt)\n\
   %13s bytes verfügbare Auslagerungsdatei\n\n\
   %13s bytes Virtueller Speicher (insgesamt)\n\
-  %13s bytes verfügbarer Virtueller Speicher\n"
+  %13s bytes verfügbarer virtueller Speicher\n"
 
 STRING_MISC_HELP1, "Drücken Sie eine beliebige Taste . . .\n"
 
@@ -320,9 +320,9 @@ Um ein Verzeichnis umzubenennen:\n\
 MOVE [/N][Laufwerk:][Pfad]Verzeichnis1 Verzeichnis2\n\n\
   [Laufwerk:][Pfad]Datei1  Bezeichnet den Pfad und den Namen der zu\n\
                            verschiebenden Datei(en).\n\
-  /N                 Nichts. Tut alles ausser Dateien/Verzeichnisse verschieben.\n\n\
+  /N                 Nichts. Tut alles außer Dateien/Verzeichnisse verschieben.\n\n\
 Derzeitige Einschränkung:\n\
-Es ist noch nicht möglich Objekte über die Laufwerksgrenzen hinaus zu verschieben.\n"
+Es ist noch nicht möglich, Objekte über die Laufwerksgrenzen hinaus zu verschieben.\n"
 
 STRING_MSGBOX_HELP, "Zeigt ein Fenster und wartet auf eine Eingabe vom Benutzer.\n\n\
 MSGBOX type ['title'] prompt\n\n\
@@ -331,7 +331,7 @@ type          Button anzeigen\n\
               YESNO, YESNOCANCEL\n\
 title         Titel des Fensters\n\
 prompt        Text der in dem Fenster angezeigt wird\n\n\n\
-ERRORLEVEL is set according the button pressed:\n\n\
+ERRORLEVEL wird je nach dem gedrückten Button gesetzt:\n\n\
 YES  :  10    |  NO      :  11\n\
 OK   :  10    |  CANCEL  :  12\n"
 
@@ -387,9 +387,9 @@ REN [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\n\
   /T    Zeigt die Anzahl der umbenannten Dateien an.\n\n\
 Nutzen Sie den 'move' Befehl falls Sie Objekte verschieben wollen.\n"
 
-STRING_REN_HELP2, "    %lu Datei umbennant\n"
+STRING_REN_HELP2, "    %lu Datei umbenannt\n"
 
-STRING_REN_HELP3, "    %lu Dateien umbennant\n"
+STRING_REN_HELP3, "    %lu Dateien umbenannt\n"
 
 STRING_REPLACE_HELP1, "Ersetzt Dateien.\n\n\
 REPLACE [Laufwerk1:][Pfad1]Dateiname [Laufwerk2:][Pfad2] [/A] [/P] [/R] [/W]\n\
@@ -405,7 +405,7 @@ REPLACE [Laufwerk1:][Pfad1]Dateiname [Laufwerk2:][Pfad2] [/P] [/R] [/S] [/W] [/U
   /S                           Ersetzt Dateien in allen Unterordnern des Ziel-\n\
                                pfades. Kann nicht mit Parameter /A genutzt\n\
                                werden.\n\
-  /W                           Wartet vor dem Start bis ein Datenträger\n\
+  /W                           Wartet vor dem Start, bis ein Datenträger\n\
                                eingelegt wurde.\n\
   /U                           Ersetzt (aktualisiert) nur Dateien, die älter\n\
                                sind als die Quelldaten. Kann nicht mit Paramater\n\
@@ -495,7 +495,7 @@ STRING_VERIFY_HELP2, "VERIFY ist %s.\n"
 
 STRING_VERIFY_HELP3, "VERIFY kann nur ON oder OFF sein"
 
-STRING_VERSION_HELP1, "Zeigt Shell Informationen an.\n\n\
+STRING_VERSION_HELP1, "Zeigt Shellinformationen an.\n\n\
 VER [/C][/R][/W]\n\n\
   /C  Zeigt die Credits an.\n\
   /R  Zeigt die Weitergabeinformationen an.\n\
@@ -521,9 +521,9 @@ STRING_VERSION_HELP5, "\nSenden Sie Bug-Reports an <ros-dev@reactos.org>.\n\
 Updates sind auf der offiziellen ReactOS-Webseite verfügbar:\n\
 http://www.reactos.org"
 
-STRING_VERSION_HELP6, "\nFreeDOS Version programmiert von:\n"
+STRING_VERSION_HELP6, "\nFreeDOS-Version programmiert von:\n"
 
-STRING_VERSION_HELP7, "\nReactOS Version programmiert von:\n"
+STRING_VERSION_HELP7, "\nReactOS-Version programmiert von:\n"
 
 STRING_VOL_HELP1, " Datenträger im Laufwerk %c ist %s\n"
 STRING_VOL_HELP2, " Datenträger im Laufwerk %c hat keine Bezeichnung.\n"
@@ -554,7 +554,7 @@ STRING_HELP1, "
 ?        Listet alle Befehle auf (ohne Erklärung).\n\
 ALIAS    Setzt, löscht oder zeigt den Alias.\n\
 ATTRIB   Zeigt Dateiattribute an bzw. ändert sie.\n\
-BEEP     Gibt einen piep-Ton durch den PC-Speaker aus.\n\
+BEEP     Gibt einen Piepton durch den PC-Speaker aus.\n\
 CALL     Ruft eine Batchdatei aus einer anderen Batchdatei heraus auf.\n\
 CD       Zeigt den Namen des aktuellen Verzeichnisses an bzw. ändert diesen.\n\
 CHCP     Zeigt die aktive Codepagenummer an bzw. legt diese fest.\n\
@@ -581,7 +581,7 @@ IF       Verarbeitet Ausdr
 LABEL    Erstellt, ändert oder löscht die Bezeichnung eines Volumes.\n\
 MD       Erstellt ein Verzeichnis.\n\
 MKDIR    Erstellt ein Verzeichnis.\n\
-MKLINK   Creates a filesystem link object.\n\
+MKLINK   Erzeugt eine Dateisystemverknüpfung.\n\
 MOVE     Verschiebt eine oder mehrere Dateien von einem Verzeichnis in\n\
          ein anderes.\n\
 PATH     Legt den Suchpfad für ausführbare Dateien fest oder zeigt diesen an.\n\
@@ -615,9 +615,9 @@ STRING_COPY_OPTION,           "JNA"
 
 STRING_ALIAS_ERROR,          "Die Befehlszeile ist zu lange nach der Alias-Erweiterung!\n"
 STRING_ASSOC_ERROR,          "Dateizuordnung für Erweiterung %s nicht gefunden\n"
-STRING_BATCH_ERROR,          "Es trat ein Fehler auf, während die Batch-Datei geöffnet wurde.\n"
-STRING_CHCP_ERROR1,          "Aktive Code-Page: %u\n"
-STRING_CHCP_ERROR4,          "Ungültige Code-Page\n"
+STRING_BATCH_ERROR,          "Es trat ein Fehler auf, während die Batchdatei geöffnet wurde.\n"
+STRING_CHCP_ERROR1,          "Aktive Codepage: %u\n"
+STRING_CHCP_ERROR4,          "Ungültige Codepage\n"
 STRING_CHOICE_ERROR,         "Ungültige Option. Erwartetes Format: /C[:]options"
 STRING_CHOICE_ERROR_TXT,     "Ungültige Option. Erwartetes Format: /T[:]c,nn"
 STRING_CHOICE_ERROR_OPTION,  "Ungültige Option: %s"
@@ -628,7 +628,7 @@ STRING_CMD_ERROR3,           "%s kann nicht in die Datei umgeleitet werden \n"
 STRING_CMD_ERROR4,           "Ausführend %s...\n"
 STRING_CMD_ERROR5,           "Ausführend cmdexit.bat...\n"
 STRING_COLOR_ERROR1,         "Fehler: Hinter- und Vordergrund können nicht die selben Farben haben!"
-STRING_COLOR_ERROR2,         "Fehler in der Farb-Angabe"
+STRING_COLOR_ERROR2,         "Fehler in der Farbangabe"
 STRING_COLOR_ERROR3,         "Farbe %x\n"
 STRING_COLOR_ERROR4,         "Fehler: Die selben Farben!"
 STRING_CONSOLE_ERROR,        "Unbekannter Fehler: %d\n"
@@ -679,19 +679,19 @@ STRING_REPLACE_ERROR5,             "Zugriff verweigert - %s\n"
 STRING_REPLACE_ERROR6,             "Keine Dateien gefunden - %s\n"
 STRING_REPLACE_ERROR7,             "Erweiterter Fehler 32\n"
 STRING_REACTOS_VERSION,            "ReactOS Operating System [Version %s-%s]\n"
-STRING_CMD_SHELLINFO,              "\nReactOS Befehlszeilen Interpreter\nVersion %s %s"
+STRING_CMD_SHELLINFO,              "\nReactOS-Befehlszeileninterpreter\nVersion %s %s"
 STRING_VERSION_RUNVER,             " läuft in %s"
 STRING_COPY_FILE ,                 "        %d Datei(en) kopiert\n"
-STRING_DELETE_WIPE,                "gewiped"
+STRING_DELETE_WIPE,                "sicher gelöscht"
 STRING_FOR_ERROR,                  "ungültige Variablenangabe."
 STRING_SCREEN_COL,                 "ungültige Spalten-Angabe"
 STRING_SCREEN_ROW,                 "ungültige Zeilen-Angabe"
 STRING_TIMER_TIME                  "Timer %d ist %s: "
-STRING_MKLINK_CREATED_SYMBOLIC,    "Symbolic link created for %s <<===>> %s\n"
-STRING_MKLINK_CREATED_HARD,        "Hard link created for %s <<===>> %s\n"
-STRING_MKLINK_CREATED_JUNCTION,    "Junction created for %s <<===>> %s\n"
-STRING_MORE,                       "More? "
-STRING_CANCEL_BATCH_FILE,          "\r\nCtrl-Break pressed.  Cancel batch file? (Ja/Nein/Alle) "
+STRING_MKLINK_CREATED_SYMBOLIC,    "Symbolische Verknüpfung erstellt für %s <<===>> %s\n"
+STRING_MKLINK_CREATED_HARD,        "Hardlink erstellt für %s <<===>> %s\n"
+STRING_MKLINK_CREATED_JUNCTION,    "Junction Point erstellt für %s <<===>> %s\n"
+STRING_MORE,                       "Mehr? "
+STRING_CANCEL_BATCH_FILE,          "\r\nStrg-Pause gedrückt. Batchvorgang abbrechen? (Ja/Nein/Alle) "
 STRING_INVALID_OPERAND,            "Ungültiger Operand."
 STRING_EXPECTED_CLOSE_PAREN,       "Erwartet ')'."
 STRING_EXPECTED_NUMBER_OR_VARIABLE,"Erwartet Nummer oder Variablennamen."
index 58bdadf..f8d2cb7 100644 (file)
@@ -8,13 +8,13 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
 STRINGTABLE DISCARDABLE
 BEGIN
 
-STRING_ASSOC_HELP,    "Modify file extension associations.\n\n\
-assoc [.ext[=[FileType]]]\n\
+STRING_ASSOC_HELP,    "Modyfikuje skojarzenia rozszerzeñ plików.\n\n\
+assoc [.ext[=[typPliku]]]\n\
 \n\
-assoc (print all associations)\n\
-assoc .ext (print specific association)\n\
-assoc .ext= (remove specific association)\n\
-assoc .ext=FileType (add new association)\n"
+assoc (wy\9cwietla wszystkie skojarzenia)\n\
+assoc .ext (wy\9cwietla okre\9clone skojarzenie)\n\
+assoc .ext= (usuwa okre\9clone skojarzenie)\n\
+assoc .ext=typPliku (dodaje nowe skojarzenie)\n"
 
 STRING_ATTRIB_HELP,    "Wy\9cwietla lub zmienia atrybuty plików.\n\n\
 ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] nazwa_pliku ...\n\
@@ -298,12 +298,12 @@ STRING_LOCALE_HELP1, "Czas bie
 STRING_MKDIR_HELP,   "Tworzy katalog.\n\n\
 MKDIR [napêd:]\9ccie¿ka\nMD [napêd:]\9ccie¿ka"
 
-STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\
-MKLINK [/D | /H | /J] linkname target\n\n\
-  /D  Indicates that the symbolic link target is a directory.\n\
-  /H  Create a hard link.\n\
-  /J  Create a directory junction.\n\n\
-If neither /H or /J is specified, a symbolic link is created."
+STRING_MKLINK_HELP, "Tworzy dowi¹zanie obiektu w systemie plików.\n\n\
+MKLINK [/D | /H | /J] nazwa_linku element_docelowy\n\n\
+  /D  Oznacza, ¿e dowi¹zanie symboliczne elementu docelowego jest katalogiem.\n\
+  /H  Tworzy dowi¹zanie twarde.\n\
+  /J  Tworzy punkt po³¹czenia katalogów.\n\n\
+Je\9cli nie zosta³y u¿yte zarówno /H jak i /J, zostanie utworzone dowi¹zanie symboliczne."
 
 STRING_MEMMORY_HELP1, "Wy\9cwietla ilo\9cæ pamiêci systemowej.\n\nMEMORY"
 
@@ -546,7 +546,7 @@ IF       Przetwarzanie warunkowe w programach wsadowych.\n\
 LABEL    Tworzy, zmienia lub kasuje etykietê woluminu w danym napêdzie.\n\
 MD       Tworzy katalog.\n\
 MKDIR    Tworzy katalog.\n\
-MKLINK   Creates a filesystem link object.\n\
+MKLINK   Tworzy dowi¹zanie obiektu w systemie plików.\n\
 MOVE     Przenosi jeden lub wiêcej plików z jednego katalogu do drugiego.\n\
 PATH     Wy\9cwietla lub ustawia \9ccie¿ki dostêpu dla programów.\n\
 PAUSE    Zawiesza przetwarzanie programu wsadowego i wy\9cwietla komunikat.\n\
@@ -656,11 +656,11 @@ STRING_FOR_ERROR,                  "z
 STRING_SCREEN_COL,                 "nieprawid³owy numer kolumny"
 STRING_SCREEN_ROW,                 "nieprawid³owy numer rzêdu"
 STRING_TIMER_TIME                  "Stoper %d czas - %s: "
-STRING_MKLINK_CREATED_SYMBOLIC,    "Symbolic link created for %s <<===>> %s\n"
-STRING_MKLINK_CREATED_HARD,        "Hard link created for %s <<===>> %s\n"
-STRING_MKLINK_CREATED_JUNCTION,    "Junction created for %s <<===>> %s\n"
-STRING_MORE,                       "More? "
-STRING_CANCEL_BATCH_FILE,          "\r\nCtrl-Break pressed.  Cancel batch file? (Tak/Nie/Zawsze) "
+STRING_MKLINK_CREATED_SYMBOLIC,    "Dowi¹zanie symboliczne utworzone dla %s <<===>> %s\n"
+STRING_MKLINK_CREATED_HARD,        "Dowi¹zanie twarde utworzone dla %s <<===>> %s\n"
+STRING_MKLINK_CREATED_JUNCTION,    "Punkt dowi¹zania katalogów utworzony dla %s <<===>> %s\n"
+STRING_MORE,                       "Wiêcej? "
+STRING_CANCEL_BATCH_FILE,          "\r\nWci\9cniêto Ctrl-Break.  Anulowaæ wykonanie pliku wsadowego? (Tak/Nie/Zawsze) "
 
 STRING_INVALID_OPERAND,            "Nieprawid³owy argument operatora."
 STRING_EXPECTED_CLOSE_PAREN,       "Oczekiwano ')'."
index 5513eca..d8a437b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __COMCSUP_H
-#define __COMCSUP_H
+#pragma once
 
 /*
  ******************************************************************************
@@ -49,5 +48,3 @@ static __inline impl##Impl * \
 impl##Impl_from_##iface (iface *ifc) { \
     return (impl##Impl *)((ULONG_PTR)ifc - FIELD_OFFSET(impl##Impl, vtbl)); \
 }
-
-#endif /* __COMCSUP_H */
index 2445bb2..80aefc0 100644 (file)
@@ -5,7 +5,7 @@ BEGIN
     POPUP ""
     BEGIN
         MENUITEM SEPARATOR
-        MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR
+        MENUITEM "Taskmanager", ID_SHELL_CMD_OPEN_TASKMGR
         MENUITEM SEPARATOR
         MENUITEM "Taskbar fi&xieren", ID_LOCKTASKBAR
         MENUITEM "E&igenschaften", ID_SHELL_CMD_PROPERTIES
@@ -56,60 +56,60 @@ END
 
 IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Taskbar"
+CAPTION "Taskleiste"
 FONT 8, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
-    GROUPBOX        "Taskbar appearance", IDC_STATIC, 6,6,240,121
+    GROUPBOX        "Taskleiste", IDC_STATIC, 6,6,240,121
     CONTROL         "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21
-    AUTOCHECKBOX    "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10
-    AUTOCHECKBOX    "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10
-    AUTOCHECKBOX    "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10
-    AUTOCHECKBOX    "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10
-    AUTOCHECKBOX    "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10
-    AUTOCHECKBOX    "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10
+    AUTOCHECKBOX    "Task&leiste fixieren", IDC_TASKBARPROP_LOCK, 13,45,200,10
+    AUTOCHECKBOX    "Taskleiste a&utom. verstecken", IDC_TASKBARPROP_HIDE, 13,58,200,10
+    AUTOCHECKBOX    "&Taskleiste immer im Vordergrund halten", IDC_TASKBARPROP_ONTOP, 13,71,200,10
+    AUTOCHECKBOX    "Ähnliche Buttons &gruppieren", IDC_TASKBARPROP_GROUP, 13,84,200,10
+    AUTOCHECKBOX    "Schnellstartleiste &anzeigen", IDC_TASKBARPROP_SHOWQL, 13,97,200,10
+    AUTOCHECKBOX    "Fenstervor&schau anzeigen", IDC_TASKBARPROP_WNDPREV, 13,110,200,10
 END
 
 IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Start Menu"
+CAPTION "Startmenü"
 FONT 8, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
-    AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
-    LTEXT           "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED
-    PUSHBUTTON      "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
-    AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
-    LTEXT           "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED
-    PUSHBUTTON      "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
-    GROUPBOX        "Privacy",IDC_STATIC, 7,100,238,42
-    AUTOCHECKBOX    "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
-    AUTOCHECKBOX    "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
+    AUTORADIOBUTTON "Modernes &Startmenü", IDC_TASKBARPROP_STARTMENU, 7,7,105,10
+    LTEXT           "Dieser Stil gewährt Ihnen einfachen Zugriff auf Ihre Verzeichnisse, bevorzugten Programme und die Suchfunktion.", IDC_STATIC, 20,17,150,24, WS_DISABLED
+    PUSHBUTTON      "An&passen...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED
+    AUTORADIOBUTTON "Klassisches Start&menü", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED
+    LTEXT           "Dieser Stil beinhaltet das klassische Aussehen mit gewohnter Funktionalität",-1,20,57,150,24, WS_DISABLED
+    PUSHBUTTON      "An&passen...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED
+    GROUPBOX        "Privatsphäre",IDC_STATIC, 7,100,238,42
+    AUTOCHECKBOX    "Eine Liste zuletzt geö&ffneter Dateien führen", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+    AUTOCHECKBOX    "Eine Liste zuletzt gestarteter &Programme führen",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
 END
 
 IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Notification Area"
+CAPTION "Benachrichtigungsfeld"
 FONT 8, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
     CONTROL         "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED
-    GROUPBOX        "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED
-    LTEXT           "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED
-    AUTOCHECKBOX    "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
-    PUSHBUTTON      "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
-    GROUPBOX        "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED
-    LTEXT           "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED
-    AUTOCHECKBOX    "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
-    AUTOCHECKBOX    "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
-    AUTOCHECKBOX    "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
-    AUTOCHECKBOX    "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
+    GROUPBOX        "Symbole", IDC_STATIC, 6,33,240,58, WS_DISABLED
+    LTEXT           "Das Benachrichtigungsfeld kann übersichtlich gestaltet werden, indem selten verwendete Symbole ausgeblendet werden.", IDC_STATIC, 13,48,223,16, WS_DISABLED
+    AUTOCHECKBOX    "&Inaktive Symbole ausblenden", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED
+    PUSHBUTTON      "An&passen...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED
+    GROUPBOX        "Systemsymbole", IDC_STATIC, 6,97,240,84, WS_DISABLED
+    LTEXT           "Wählen Sie die Systemsymbole aus, die immer angezeigt werden sollen.", IDC_STATIC, 13,112,223,16, WS_DISABLED
+    AUTOCHECKBOX    "&Uhr", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED
+    AUTOCHECKBOX    "Lautstär&ke", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED
+    AUTOCHECKBOX    "&Netzwerk", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED
+    AUTOCHECKBOX    "&Akku", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED
 
 END
 
 IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Toolbars"
+CAPTION "Symbolleisten"
 FONT 8, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
-    LTEXT           "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED
+    LTEXT           "Wählen Sie aus, welche Symbolleisten der Taskleiste hinzugefügt werden sollen.", IDC_STATIC, 7,7,223,12, WS_DISABLED
     CONTROL         "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE
 END
 
@@ -118,11 +118,11 @@ STRINGTABLE DISCARDABLE
 BEGIN
     IDS_START             "Start"
     IDS_PROPERTIES        "E&igenschaften"
-    IDS_OPEN_ALL_USERS    "Öffnen &Alle Benutzer"
-    IDS_EXPLORE_ALL_USERS "Explorer A&lle Benutzer"
+    IDS_OPEN_ALL_USERS    "Öffnen (&Alle Benutzer)"
+    IDS_EXPLORE_ALL_USERS "Explorer (A&lle Benutzer)"
 END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-    IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties"
+    IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskleisten- und Startmenüeinstellungen"
 END
index aeed806..0ab9222 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __RESOURCE_H
-#define __RESOURCE_H
+#pragma once
 
 #define IDC_STATIC -1
 
@@ -98,5 +97,3 @@
 #define IDC_TASKBARPROP_DESKBANDLIST 2301
 
 #define IDS_TASKBAR_STARTMENU_PROP_CAPTION 2200
-
-#endif /* __RESOURCE_H */
index f0597e6..8efcbe5 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __TODO_H
-#define __TODO_H
+#pragma once
 
 #ifdef INTERFACE
 #undef INTERFACE
@@ -40,5 +39,3 @@ static const GUID SID_HACK_SMenuPopup = {0xD1E7AFEB,0x6A2E,0x11D0,{0x8C,0x78,0x0
 #define IDeskBarClient_UIActivateDBC(T,a) (T)->lpVtbl->UIActivateDBC(T,a)
 #define IDeskBarClient_GetSize(T,a,b) (T)->lpVtbl->GetSize(T,a,b)
 #endif
-
-#endif /* __TODO_H */
index 46d829e..d2cf78d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _EXPLORER_UNDOC__H
-#define _EXPLORER_UNDOC__H
+#pragma once
 
 /*
  * Undocumented stuff
@@ -53,5 +52,3 @@ EXTERN_C const GUID CLSID_RebarBandSite;
 HRESULT WINAPI SHInvokeDefaultCommand(HWND,IShellFolder*,LPCITEMIDLIST);
 
 HRESULT WINAPI SHPropertyBag_ReadPOINTL(IPropertyBag*,LPCWSTR,POINTL*);
-
-#endif /* _EXPLORER_UNDOC__H */
index d706237..658b0dd 100644 (file)
@@ -64,7 +64,7 @@ BEGIN
     END
     POPUP "&Hilfe"
     BEGIN
-        MENUITEM "Explorer &FAQ...",            ID_EXPLORER_FAQ
+        MENUITEM "Explorer-&FAQ...",            ID_EXPLORER_FAQ
         MENUITEM "&Über ReactOS Explorer...",   ID_ABOUT_EXPLORER
         MENUITEM "Über React&OS...",            ID_ABOUT_WINDOWS
     END
@@ -76,7 +76,7 @@ BEGIN
     BEGIN
         MENUITEM "&Ausführen...",               ID_EXECUTE
         MENUITEM SEPARATOR
-        MENUITEM "&Schliessen",                 ID_FILE_EXIT
+        MENUITEM "&Schließen",                 ID_FILE_EXIT
     END
     POPUP "&Ansicht"
     BEGIN
@@ -94,9 +94,9 @@ BEGIN
     END
     POPUP "&Hilfe"
     BEGIN
-        MENUITEM "Explorer &FAQ...",            ID_EXPLORER_FAQ
+        MENUITEM "Explorer-&FAQ...",            ID_EXPLORER_FAQ
         MENUITEM "&Über Explorer...",          ID_ABOUT_EXPLORER
-        MENUITEM "Über &OS...",                ID_ABOUT_WINDOWS
+        MENUITEM "Über React&OS...",                ID_ABOUT_WINDOWS
     END
 END
 
@@ -105,7 +105,7 @@ BEGIN
     POPUP ""
     BEGIN
         MENUITEM "&Einstellungen...",           ID_DESKTOPBAR_SETTINGS
-        MENUITEM "&Task Manager...",            ID_TASKMGR
+        MENUITEM "&Taskmanager...",            ID_TASKMGR
         MENUITEM SEPARATOR
         MENUITEM "&Über Explorer...",           ID_ABOUT_EXPLORER
     END
@@ -129,7 +129,7 @@ BEGIN
     POPUP ""
     BEGIN
         MENUITEM "Öffne &Lautstärkeregler",     ID_TRAY_VOLUME
-        MENUITEM "Editieren der Audio-&Einstellungen", ID_VOLUME_PROPERTIES
+        MENUITEM "Ändern der Audio-&Einstellungen", ID_VOLUME_PROPERTIES
     END
 END
 
@@ -177,27 +177,27 @@ FONT 8, "MS Shell Dlg"
 BEGIN
     LTEXT           "Bitte wählen Sie den gewünschten Platzierungs-Algorithmus für die Desktop-Symbole aus:",
                     IDC_STATIC,7,7,197,23
-    CONTROL         "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
+    CONTROL         "li./ob. abw.",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,7,35,46,44
-    CONTROL         "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
+    CONTROL         "li./ob. re.",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,57,35,46,44
-    CONTROL         "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
+    CONTROL         "re./ob. li.",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,110,35,46,44
-    CONTROL         "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
+    CONTROL         "re./ob. abw.",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,159,35,46,44
-    CONTROL         "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
+    CONTROL         "li./unt. aufw.",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,7,83,46,44
-    CONTROL         "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
+    CONTROL         "li./unt. re.",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,57,83,46,44
-    CONTROL         "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
+    CONTROL         "re./unt. li.",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,110,83,46,44
-    CONTROL         "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+    CONTROL         "re./unt. aufw.",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,159,83,46,44
-    CONTROL         "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+    CONTROL         "Rahmen abw.",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,7,131,46,44
-    CONTROL         "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+    CONTROL         "Rahmen H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,57,131,46,44
-    CONTROL         "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+    CONTROL         "im Kreis",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
                     BS_BOTTOM | WS_TABSTOP,110,131,46,44
     CONTROL         "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
                     WS_TABSTOP,159,131,46,44
@@ -242,7 +242,7 @@ BEGIN
     CONTROL         "Öffne Unterverzeichnisses in &neuen Fenstern",
                     IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
                     WS_TABSTOP,7,90,157,10
-    LTEXT           "Diese Auswahl wird künftig für alle Explorer-Fenster verwendet werden.",
+    LTEXT           "Diese Auswahl wird künftig für alle Explorerfenster verwendet werden.",
                     IDC_STATIC,7,111,174,22
     DEFPUSHBUTTON   "&OK",IDOK,29,136,50,14,WS_GROUP
     PUSHBUTTON      "A&bbrechen",IDCANCEL,106,136,50,14
@@ -344,7 +344,7 @@ BEGIN
     IDS_FAVORITES           "Favoriten"
     IDS_PROGRAMS            "Programme"
     IDS_SETTINGS            "Einstellungen"
-    IDS_EXPLORE             "Explore"
+    IDS_EXPLORE             "Explorer"
     IDS_EMPTY               "(Leer)"
     IDS_RECENT              "Aktuelle Dokumente"
     IDS_ADMIN               "Verwaltung"
@@ -383,7 +383,7 @@ BEGIN
     IDS_SEARCH              "Suche"
     IDS_ABOUT_EXPLORER      "&Über Explorer..."
     IDS_LAUNCH_MANY_PROGRAMS
-                            "Sie haben mehrere Programme ausgewählt.\nSind Sie sicher, daß Sie diese alle starten wollen?"
+                            "Sie haben mehrere Programme ausgewählt.\nSind Sie sich sicher, dass Sie diese alle starten wollen?"
     IDS_DESKTOPBAR_SETTINGS "Desktop-Einstellungen"
     IDS_DESKTOP             "Desktop"
     IDS_TASKBAR             "Taskbar"
index c3c0848..9620be2 100644 (file)
@@ -28,9 +28,9 @@ STRING_HELP,  "Syntax: %s Datentr
 
 STRING_COMPLETE   "%lu Prozent komplett.\r"
 
-STRING_FORMAT_FAIL "FormatEx konnte Operation nicht erfolgreich beenden.\n\n"
+STRING_FORMAT_FAIL "FormatEx konnte Vorgang nicht erfolgreich beenden.\n\n"
 
-STRING_NO_SUPPORT  "Operation nicht unterstützt"
+STRING_NO_SUPPORT  "Vorgang nicht unterstützt"
 
 STRING_FMIFS_FAIL  "Kann FMIFS-Eingangspunkte nicht lokalisieren.\n\n"
 
@@ -40,11 +40,11 @@ STRING_DRIVE_PARM  "Ben
 
 STRING_ERROR_DRIVE_TYPE  "Konnte den Laufwerkstyp nicht erhalten"
 
-STRING_INSERT_DISK       "Legen Sie eine neue Diskette in Laufwerk %C: ein\nund drücken Sie Enter wenn das Laufwerk bereit ist"
+STRING_INSERT_DISK       "Legen Sie eine neue Diskette in Laufwerk %C: ein\nund betätigen Sie die Eingabetaste, wenn das Laufwerk\nbereit ist."
 
 STRING_NO_VOLUME         "Kann Medium nicht abfragen"
 
-STRING_NO_VOLUME_SIZE    "Kann Mediumsgröße nicht abfragen"
+STRING_NO_VOLUME_SIZE    "Kann Mediengröße nicht abfragen"
 
 STRING_FILESYSTEM        "Der Typ des Dateisystems ist %s.\n"
 
@@ -70,7 +70,7 @@ STRING_ENTER_LABEL     "Datentr
 
 STRING_NO_LABEL        "Konnte Datenträger nicht benennen"
 
-STRING_FREE_SPACE     "\n%I64d bytes Speicherkapazität.\n%I64d bytes freier Speicher.\n"
+STRING_FREE_SPACE     "\n%I64d Byte Speicherkapazität.\n%I64d bytes freier Speicher.\n"
 
-STRING_SERIAL_NUMBER   "\nDatenträger Seriennummer ist %04X-%04X\n"
+STRING_SERIAL_NUMBER   "\nDatenträger-Seriennummer ist %04X-%04X\n"
 END
index 9221fa2..fe19d98 100644 (file)
@@ -47,6 +47,7 @@ static const char UsageStr[] =
 "  Install a product:\n"
 "    msiexec {package|productcode} [property]\n"
 "    msiexec /i {package|productcode} [property]\n"
+"    msiexec /package {package|productcode} [property]\n"
 "    msiexec /a package [property]\n"
 "  Repair an installation:\n"
 "    msiexec /f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n"
@@ -562,12 +563,13 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
                {
                        FunctionUnregServer = TRUE;
                }
-               else if(msi_option_prefix(argvW[i], "i"))
+               else if(msi_option_prefix(argvW[i], "i") || msi_option_prefix(argvW[i], "package"))
                {
                        LPWSTR argvWi = argvW[i];
+                       int argLen = (msi_option_prefix(argvW[i], "i") ? 2 : 8);
                        FunctionInstall = TRUE;
-                       if(lstrlenW(argvWi) > 2)
-                               argvWi += 2;
+                       if(lstrlenW(argvW[i]) > argLen)
+                               argvWi += argLen;
                        else
                        {
                                i++;
index a3a2495..228875d 100644 (file)
@@ -12,7 +12,6 @@
        <library>ole32</library>
        <library>msi</library>
        <file>msiexec.c</file>
-       <file>rsrc.rc</file>
        <file>service.c</file>
-       <file>version.rc</file>
+       <file>rsrc.rc</file>
 </module>
index 01e43be..cfc8937 100644 (file)
 
 #include <windows.h>
 
-#include "version.rc"
+#define WINE_FILEDESCRIPTION_STR "Wine Installer"
+#define WINE_FILENAME_STR "msiexec.exe"
+#define WINE_FILETYPE VFT_APP
+#define WINE_FILEVERSION 3,1,4000,1823
+#define WINE_FILEVERSION_STR "3.1.4000.1823"
+#define WINE_PRODUCTVERSION 3,1,4000,1823
+#define WINE_PRODUCTVERSION_STR "3.1.4000.1823"
+#define WINE_PRODUCTNAME_STR "Wine Installer"
+
+#include "wine/wine_common_ver.rc"
 
 LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 
index c467baf..dd519a0 100644 (file)
@@ -12,7 +12,7 @@ IDS_UsageMessage, "%s\n\nSyntax: regsvr32 [/u] [/s] [/c] [/n] [/i[:cmdline]] dll
 /s -   Hintergrundmodus; Meldungen werden nicht angezeigt\n\
 /c -   Konsolenausgabe verwenden\n\
 /i -   Aufruf von DLLInstall, wobei optional eine [Befehlszeile] übergeben\n\
-       werden kann. Unter Verwendung von /u wird die DLL_Deinstallation\n\
+       werden kann. Unter Verwendung von /u wird die DLL-Deinstallation\n\
        aufgerufen.\n\
 /n -   Kein Aufruf von DLLRegisterServer. Diese Option muss mit /i verwendet werden."
 
@@ -20,12 +20,12 @@ IDS_NoDllSpecified,  "Es wurde kein DLL-Name angegeben."
 
 IDS_InvalidFlag,     "Ungültiger Parameter: %s"
 
-IDS_SwitchN_NoI,     "Ungültiger Parameter: /n muss zusammen mit dem /i Schalter verwendet werden."
+IDS_SwitchN_NoI,     "Ungültiger Parameter: /n muss zusammen mit dem /i-Schalter verwendet werden."
 
-IDS_DllNotLoaded,    "LoadLibrary('%s') ist fehlgeschlagen.\nGetLastError Rückgabewert 0x%08x."
+IDS_DllNotLoaded,    "LoadLibrary('%s') ist fehlgeschlagen.\nGetLastError-Rückgabewert 0x%08x."
 
 IDS_MissingEntry,    "%s wurde geladen, aber der %s Einstiegspunkt wurde nicht gefunden.\n\n\
-%s wurde möglicherweise nicht exportiert, oder eine fehlerhafte Version von %s befindet sich im Speicher. Erwägen Sie die Verwendung von PView um es festzustellen und zu löschen."
+%s wurde möglicherweise nicht exportiert, oder eine fehlerhafte Version von %s befindet sich im Speicher. Erwägen Sie die Verwendung von PView, um es festzustellen und zu löschen."
 
 IDS_FailureMessage,  "%s in %s ist fehlgeschlagen.\nRückgabewert: 0x%08x"
 
diff --git a/reactos/base/system/runonce/lang/de-DE.rc b/reactos/base/system/runonce/lang/de-DE.rc
new file mode 100644 (file)
index 0000000..44df265
--- /dev/null
@@ -0,0 +1,11 @@
+LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
+
+IDD_RUNONCE_DLG DIALOG DISCARDABLE 0, 0, 239, 170
+STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "ReactOS-Setup"
+FONT 8, "MS Shell Dlg"
+BEGIN
+       LTEXT "ReactOS nimmt nun die folgenden Einstellungen vor:", -1, 38, 8, 196, 18
+       LISTBOX IDC_COMP_LIST, 36, 32, 197, 131, LBS_OWNERDRAWVARIABLE | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+       ICON IDI_ICON, -1, 5, 6, 21, 20
+END
index 826805f..96817d4 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef _RESOURCE_H__
-#define _RESOURCE_H__
+#pragma once
 
 #define IDI_ICON 10
 
 #define IDD_RUNONCE_DLG 100
 
 #define IDC_COMP_LIST 1000
-
-#endif /* _RESOURCE_H__ */
index 540fe8a..cc21dae 100644 (file)
@@ -1,3 +1,4 @@
+#include "lang/de-DE.rc"
 #include "lang/en-US.rc"
 #include "lang/es-ES.rc"
 #include "lang/ja-JP.rc"
index 6fb2b59..9e9c584 100644 (file)
@@ -1,9 +1,6 @@
-#ifndef _RUNONCE_H__
-#define _RUNONCE_H__
+#pragma once
 
 #include <windows.h>
 #include <tchar.h>
 
 #include "resource.h"
-
-#endif /* _RUNONCE_H__ */
index d33b234..7a9819e 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
+/*
+ * Uncomment the line below to start services
+ *  using the SERVICE_START_PENDING state
+ */
+// #define USE_SERVICE_START_PENDING
 
 /* GLOBALS *******************************************************************/
 
@@ -116,37 +121,6 @@ ScmGetServiceEntryByResumeCount(DWORD dwResumeCount)
 }
 
 
-PSERVICE
-ScmGetServiceEntryByClientHandle(HANDLE Handle)
-{
-    PLIST_ENTRY ServiceEntry;
-    PSERVICE CurrentService;
-
-    DPRINT("ScmGetServiceEntryByClientHandle() called\n");
-    DPRINT("looking for %p\n", Handle);
-
-    ServiceEntry = ServiceListHead.Flink;
-    while (ServiceEntry != &ServiceListHead)
-    {
-        CurrentService = CONTAINING_RECORD(ServiceEntry,
-                                           SERVICE,
-                                           ServiceListEntry);
-
-        if (CurrentService->hClient == Handle)
-        {
-            DPRINT("Found service: '%S'\n", CurrentService->lpDisplayName);
-            return CurrentService;
-        }
-
-        ServiceEntry = ServiceEntry->Flink;
-    }
-
-    DPRINT("Couldn't find a matching service\n");
-
-    return NULL;
-}
-
-
 DWORD
 ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
                           PSERVICE *lpServiceRecord)
@@ -191,7 +165,7 @@ ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
 VOID
 ScmDeleteServiceRecord(PSERVICE lpService)
 {
-    DPRINT1("Deleting Service %S\n", lpService->lpServiceName);
+    DPRINT("Deleting Service %S\n", lpService->lpServiceName);
 
     /* Delete the display name */
     if (lpService->lpDisplayName != NULL &&
@@ -215,12 +189,12 @@ ScmDeleteServiceRecord(PSERVICE lpService)
     /* Remove the Service from the List */
     RemoveEntryList(&lpService->ServiceListEntry);
 
-    DPRINT1("Deleted Service %S\n", lpService->lpServiceName);
+    DPRINT("Deleted Service %S\n", lpService->lpServiceName);
 
     /* Delete the service record */
     HeapFree(GetProcessHeap(), 0, lpService);
 
-    DPRINT1("Done\n");
+    DPRINT("Done\n");
 }
 
 
@@ -705,12 +679,15 @@ ScmGetBootAndSystemDriverState(VOID)
 
 DWORD
 ScmControlService(PSERVICE Service,
-                  DWORD dwControl,
-                  LPSERVICE_STATUS lpServiceStatus)
+                  DWORD dwControl)
 {
     PSCM_CONTROL_PACKET ControlPacket;
-    DWORD Count;
+    SCM_REPLY_PACKET ReplyPacket;
+
+    DWORD dwWriteCount = 0;
+    DWORD dwReadCount = 0;
     DWORD TotalLength;
+    DWORD dwError = ERROR_SUCCESS;
 
     DPRINT("ScmControlService() called\n");
 
@@ -723,31 +700,37 @@ ScmControlService(PSERVICE Service,
         return ERROR_NOT_ENOUGH_MEMORY;
 
     ControlPacket->dwControl = dwControl;
-    ControlPacket->hClient = Service->hClient;
     ControlPacket->dwSize = TotalLength;
+    ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
     wcscpy(&ControlPacket->szArguments[0], Service->lpServiceName);
 
     /* Send the control packet */
     WriteFile(Service->ControlPipeHandle,
               ControlPacket,
               sizeof(SCM_CONTROL_PACKET) + (TotalLength * sizeof(WCHAR)),
-              &Count,
+              &dwWriteCount,
               NULL);
 
-    /* FIXME: Read the reply */
+    /* Read the reply */
+    ReadFile(Service->ControlPipeHandle,
+             &ReplyPacket,
+             sizeof(SCM_REPLY_PACKET),
+             &dwReadCount,
+             NULL);
 
     /* Release the contol packet */
     HeapFree(GetProcessHeap(),
              0,
              ControlPacket);
 
-    RtlCopyMemory(lpServiceStatus,
-                  &Service->Status,
-                  sizeof(SERVICE_STATUS));
+    if (dwReadCount == sizeof(SCM_REPLY_PACKET))
+    {
+        dwError = ReplyPacket.dwError;
+    }
 
-    DPRINT("ScmControlService) done\n");
+    DPRINT("ScmControlService() done\n");
 
-    return ERROR_SUCCESS;
+    return dwError;
 }
 
 
@@ -757,11 +740,15 @@ ScmSendStartCommand(PSERVICE Service,
                     LPWSTR *argv)
 {
     PSCM_CONTROL_PACKET ControlPacket;
+    SCM_REPLY_PACKET ReplyPacket;
     DWORD TotalLength;
     DWORD ArgsLength = 0;
     DWORD Length;
     PWSTR Ptr;
-    DWORD Count;
+    DWORD dwWriteCount = 0;
+    DWORD dwReadCount = 0;
+    DWORD dwError = ERROR_SUCCESS;
+    DWORD i;
 
     DPRINT("ScmSendStartCommand() called\n");
 
@@ -769,10 +756,10 @@ ScmSendStartCommand(PSERVICE Service,
     TotalLength = wcslen(Service->lpServiceName) + 1;
     if (argc > 0)
     {
-        for (Count = 0; Count < argc; Count++)
+        for (i = 0; i < argc; i++)
         {
-            DPRINT("Arg: %S\n", argv[Count]);
-            Length = wcslen(argv[Count]) + 1;
+            DPRINT("Arg: %S\n", argv[i]);
+            Length = wcslen(argv[i]) + 1;
             TotalLength += Length;
             ArgsLength += Length;
         }
@@ -788,7 +775,7 @@ ScmSendStartCommand(PSERVICE Service,
         return ERROR_NOT_ENOUGH_MEMORY;
 
     ControlPacket->dwControl = SERVICE_CONTROL_START;
-    ControlPacket->hClient = Service->hClient;
+    ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service;
     ControlPacket->dwSize = TotalLength;
     Ptr = &ControlPacket->szArguments[0];
     wcscpy(Ptr, Service->lpServiceName);
@@ -812,19 +799,29 @@ ScmSendStartCommand(PSERVICE Service,
     WriteFile(Service->ControlPipeHandle,
               ControlPacket,
               sizeof(SCM_CONTROL_PACKET) + (TotalLength - 1) * sizeof(WCHAR),
-              &Count,
+              &dwWriteCount,
               NULL);
 
-    /* FIXME: Read the reply */
+    /* Read the reply */
+    ReadFile(Service->ControlPipeHandle,
+             &ReplyPacket,
+             sizeof(SCM_REPLY_PACKET),
+             &dwReadCount,
+             NULL);
 
     /* Release the contol packet */
     HeapFree(GetProcessHeap(),
              0,
              ControlPacket);
 
+    if (dwReadCount == sizeof(SCM_REPLY_PACKET))
+    {
+        dwError = ReplyPacket.dwError;
+    }
+
     DPRINT("ScmSendStartCommand() done\n");
 
-    return ERROR_SUCCESS;
+    return dwError;
 }
 
 
@@ -845,6 +842,7 @@ ScmStartUserModeService(PSERVICE Service,
     WCHAR NtControlPipeName[MAX_PATH + 1];
     HKEY hServiceCurrentKey = INVALID_HANDLE_VALUE;
     DWORD KeyDisposition;
+    DWORD dwProcessId;
 
     RtlInitUnicodeString(&ImagePath, NULL);
 
@@ -986,7 +984,7 @@ ScmStartUserModeService(PSERVICE Service,
 
         /* Read SERVICE_STATUS_HANDLE from pipe */
         if (!ReadFile(Service->ControlPipeHandle,
-                      (LPVOID)&Service->hClient,
+                      (LPVOID)&dwProcessId,
                       sizeof(DWORD),
                       &dwRead,
                       NULL))
@@ -997,7 +995,7 @@ ScmStartUserModeService(PSERVICE Service,
         }
         else
         {
-            DPRINT("Received service status %lu\n", Service->hClient);
+            DPRINT("Received service process ID %lu\n", dwProcessId);
 
             /* Send start command */
             dwError = ScmSendStartCommand(Service, argc, argv);
@@ -1038,12 +1036,23 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv)
         /* Load driver */
         dwError = ScmLoadDriver(Service);
         if (dwError == ERROR_SUCCESS)
+        {
             Service->Status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+            Service->Status.dwCurrentState = SERVICE_RUNNING;
+        }
     }
     else
     {
         /* Start user-mode service */
         dwError = ScmStartUserModeService(Service, argc, argv);
+        if (dwError == ERROR_SUCCESS)
+        {
+#ifdef USE_SERVICE_START_PENDING
+            Service->Status.dwCurrentState = SERVICE_START_PENDING;
+#else
+            Service->Status.dwCurrentState = SERVICE_RUNNING;
+#endif
+        }
     }
 
     DPRINT("ScmStartService() done (Error %lu)\n", dwError);
@@ -1054,7 +1063,6 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv)
         {
             Group->ServicesRunning = TRUE;
         }
-        Service->Status.dwCurrentState = SERVICE_RUNNING;
     }
 #if 0
     else
@@ -1207,7 +1215,6 @@ ScmAutoShutdownServices(VOID)
 {
     PLIST_ENTRY ServiceEntry;
     PSERVICE CurrentService;
-    SERVICE_STATUS ServiceStatus;
 
     DPRINT("ScmAutoShutdownServices() called\n");
 
@@ -1220,7 +1227,7 @@ ScmAutoShutdownServices(VOID)
             CurrentService->Status.dwCurrentState == SERVICE_START_PENDING)
         {
             /* shutdown service */
-            ScmControlService(CurrentService, SERVICE_CONTROL_STOP, &ServiceStatus);
+            ScmControlService(CurrentService, SERVICE_CONTROL_STOP);
         }
 
         ServiceEntry = ServiceEntry->Flink;
@@ -1229,4 +1236,25 @@ ScmAutoShutdownServices(VOID)
     DPRINT("ScmGetBootAndSystemDriverState() done\n");
 }
 
+
+BOOL
+ScmLockDatabaseExclusive(VOID)
+{
+    return RtlAcquireResourceExclusive(&DatabaseLock, TRUE);
+}
+
+
+BOOL
+ScmLockDatabaseShared(VOID)
+{
+    return RtlAcquireResourceShared(&DatabaseLock, TRUE);
+}
+
+
+VOID
+ScmUnlockDatabase(VOID)
+{
+    RtlReleaseResource(&DatabaseLock);
+}
+
 /* EOF */
index 193cb9b..914e013 100644 (file)
@@ -153,12 +153,12 @@ ScmCreateManagerHandle(LPWSTR lpDatabaseName,
 
     if (_wcsicmp(lpDatabaseName,SERVICES_FAILED_DATABASEW)==0)
     {
-        DPRINT1("Database %S, does not exist\n",lpDatabaseName);
+        DPRINT("Database %S, does not exist\n",lpDatabaseName);
         return ERROR_DATABASE_DOES_NOT_EXIST;
     }
     else if (_wcsicmp(lpDatabaseName, SERVICES_ACTIVE_DATABASEW) != 0)
     {
-        DPRINT1("Invalid Database name %S.\n",lpDatabaseName);
+        DPRINT("Invalid Database name %S.\n",lpDatabaseName);
         return ERROR_INVALID_NAME;
     }
 
@@ -284,7 +284,7 @@ Int_EnumDependentServicesW(HKEY hServicesKey,
                                NULL);
     if (dwError != ERROR_SUCCESS)
     {
-        DPRINT1("ERROR! Unable to get number of services keys.\n");
+        DPRINT("ERROR! Unable to get number of services keys.\n");
         return dwError;
     }
 
@@ -341,7 +341,7 @@ Int_EnumDependentServicesW(HKEY hServicesKey,
                     if (!lpCurrentService)
                     {
                         /* This should never happen! */
-                        DPRINT1("This should not happen at this point, report to Developer\n");
+                        DPRINT("This should not happen at this point, report to Developer\n");
                         return ERROR_NOT_FOUND;
                     }
 
@@ -473,7 +473,7 @@ DWORD RCloseServiceHandle(
                                         &hServicesKey);
                 if (dwError != ERROR_SUCCESS)
                 {
-                    DPRINT1("Failed to open services key\n");
+                    DPRINT("Failed to open services key\n");
                     return dwError;
                 }
 
@@ -488,7 +488,7 @@ DWORD RCloseServiceHandle(
                 /* if pcbBytesNeeded returned a value then there are services running that are dependent on this service*/
                 if (pcbBytesNeeded)
                 {
-                    DPRINT1("Deletion failed due to running dependencies.\n");
+                    DPRINT("Deletion failed due to running dependencies.\n");
                     RegCloseKey(hServicesKey);
                     return ERROR_SUCCESS;
                 }
@@ -504,7 +504,7 @@ DWORD RCloseServiceHandle(
 
                 if (dwError != ERROR_SUCCESS)
                 {
-                    DPRINT1("Failed to Delete the Service Registry key\n");
+                    DPRINT("Failed to Delete the Service Registry key\n");
                     return dwError;
                 }
 
@@ -517,7 +517,7 @@ DWORD RCloseServiceHandle(
         return ERROR_SUCCESS;
     }
 
-    DPRINT1("Invalid handle tag (Tag %lx)\n", hManager->Handle.Tag);
+    DPRINT("Invalid handle tag (Tag %lx)\n", hManager->Handle.Tag);
 
     return ERROR_INVALID_HANDLE;
 }
@@ -546,7 +546,7 @@ DWORD RControlService(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -554,7 +554,7 @@ DWORD RControlService(
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n"); 
+        DPRINT("lpService == NULL!\n"); 
         return ERROR_INVALID_HANDLE;
     }
 
@@ -603,7 +603,7 @@ DWORD RControlService(
                                 &hServicesKey);
         if (dwError != ERROR_SUCCESS)
         {
-            DPRINT1("Failed to open services key\n");
+            DPRINT("Failed to open services key\n");
             return dwError;
         }
 
@@ -637,8 +637,12 @@ DWORD RControlService(
     {
         /* Send control code to the service */
         dwError = ScmControlService(lpService,
-                                    dwControl,
-                                    lpServiceStatus);
+                                    dwControl);
+
+        /* Return service status information */
+        RtlCopyMemory(lpServiceStatus,
+                      &lpService->Status,
+                      sizeof(SERVICE_STATUS));
     }
 
     if ((dwError == ERROR_SUCCESS) && (pcbBytesNeeded))
@@ -652,10 +656,6 @@ DWORD RControlService(
         lpService->ThreadId = 0;
     }
 
-    /* Return service status information */
-    RtlCopyMemory(lpServiceStatus,
-                  &lpService->Status,
-                  sizeof(SERVICE_STATUS));
 
     return dwError;
 }
@@ -685,7 +685,7 @@ DWORD RDeleteService(
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -693,7 +693,7 @@ DWORD RDeleteService(
 
     if (lpService->bDeleted)
     {
-        DPRINT1("The service has already been marked for delete!\n");
+        DPRINT("The service has already been marked for delete!\n");
         return ERROR_SERVICE_MARKED_FOR_DELETE;
     }
 
@@ -761,7 +761,7 @@ DWORD RQueryServiceObjectSecurity(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -776,14 +776,14 @@ DWORD RQueryServiceObjectSecurity(
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   DesiredAccess))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -838,12 +838,12 @@ DWORD RSetServiceObjectSecurity(
     /* NTSTATUS Status; */
     DWORD dwError;
 
-    DPRINT1("RSetServiceObjectSecurity() called\n");
+    DPRINT("RSetServiceObjectSecurity() called\n");
 
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -875,14 +875,14 @@ DWORD RSetServiceObjectSecurity(
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   DesiredAccess))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -960,29 +960,33 @@ DWORD RQueryServiceStatus(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_QUERY_STATUS))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
+    ScmLockDatabaseShared();
+
     /* Return service status information */
     RtlCopyMemory(lpServiceStatus,
                   &lpService->Status,
                   sizeof(SERVICE_STATUS));
 
+    ScmUnlockDatabase();
+
     return ERROR_SUCCESS;
 }
 
@@ -1026,21 +1030,21 @@ DWORD RSetServiceStatus(
 
     if (hServiceStatus == 0)
     {
-        DPRINT1("hServiceStatus == NULL!\n");
+        DPRINT("hServiceStatus == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
-    lpService = ScmGetServiceEntryByClientHandle((HANDLE)hServiceStatus);
+    lpService = (PSERVICE)hServiceStatus;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     /* Check current state */
     if (!ScmIsValidServiceState(lpServiceStatus->dwCurrentState))
     {
-        DPRINT1("Invalid service state!\n");
+        DPRINT("Invalid service state!\n");
         return ERROR_INVALID_DATA;
     }
 
@@ -1048,22 +1052,25 @@ DWORD RSetServiceStatus(
     if (!(lpServiceStatus->dwServiceType & SERVICE_WIN32) &&
          (lpServiceStatus->dwServiceType & SERVICE_DRIVER))
     {
-        DPRINT1("Invalid service type!\n");
+        DPRINT("Invalid service type!\n");
         return ERROR_INVALID_DATA;
     }
 
     /* Check accepted controls */
     if (lpServiceStatus->dwControlsAccepted & ~0xFF)
     {
-        DPRINT1("Invalid controls accepted!\n");
+        DPRINT("Invalid controls accepted!\n");
         return ERROR_INVALID_DATA;
     }
 
+    ScmLockDatabaseExclusive();
 
     RtlCopyMemory(&lpService->Status,
                   lpServiceStatus,
                   sizeof(SERVICE_STATUS));
 
+    ScmUnlockDatabase();
+
     DPRINT("Set %S to %lu\n", lpService->lpDisplayName, lpService->Status.dwCurrentState);
     DPRINT("RSetServiceStatus() done\n");
 
@@ -1139,21 +1146,21 @@ DWORD RChangeServiceConfigW(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_CHANGE_CONFIG))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -1162,7 +1169,7 @@ DWORD RChangeServiceConfigW(
     if (lpService->bDeleted)
     {
         /* FIXME: Unlock database */
-        DPRINT1("The service has already been marked for delete!\n");
+        DPRINT("The service has already been marked for delete!\n");
         return ERROR_SERVICE_MARKED_FOR_DELETE;
     }
 
@@ -1365,14 +1372,14 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
         *RelativeName = LocalAlloc(LMEM_ZEROINIT, ServiceNameLen * sizeof(WCHAR) + sizeof(WCHAR));
         if (*RelativeName == NULL)
         {
-            DPRINT1("Error allocating memory for boot driver name!\n");
+            DPRINT("Error allocating memory for boot driver name!\n");
             return ERROR_NOT_ENOUGH_MEMORY;
         }
 
         /* Copy it */
         wcscpy(*RelativeName, CanonName);
 
-        DPRINT1("Bootdriver name %S\n", *RelativeName);
+        DPRINT("Bootdriver name %S\n", *RelativeName);
         return ERROR_SUCCESS;
     }
 
@@ -1385,7 +1392,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
 
         if (*RelativeName == NULL)
         {
-            DPRINT1("Error allocating memory for boot driver name!\n");
+            DPRINT("Error allocating memory for boot driver name!\n");
             return ERROR_NOT_ENOUGH_MEMORY;
         }
 
@@ -1393,7 +1400,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
         wcscpy(*RelativeName, L"\\SystemRoot\\");
         wcscat(*RelativeName, CanonName + 13);
 
-        DPRINT1("Bootdriver name %S\n", *RelativeName);
+        DPRINT("Bootdriver name %S\n", *RelativeName);
         return ERROR_SUCCESS;
     }
 
@@ -1402,7 +1409,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
 
     if (BufferSize <= 1)
     {
-        DPRINT1("Error during a call to ExpandEnvironmentStringsW()\n");
+        DPRINT("Error during a call to ExpandEnvironmentStringsW()\n");
         return ERROR_INVALID_ENVIRONMENT;
     }
 
@@ -1410,7 +1417,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
     Expanded = LocalAlloc(LMEM_ZEROINIT, BufferSize * sizeof(WCHAR) + sizeof(WCHAR));
     if (!Expanded)
     {
-        DPRINT1("Error allocating memory for boot driver name!\n");
+        DPRINT("Error allocating memory for boot driver name!\n");
         return ERROR_NOT_ENOUGH_MEMORY;
     }
 
@@ -1418,7 +1425,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
     if (ExpandEnvironmentStringsW(L"%SystemRoot%\\", Expanded, BufferSize) >
         BufferSize)
     {
-        DPRINT1("Error during a call to ExpandEnvironmentStringsW()\n");
+        DPRINT("Error during a call to ExpandEnvironmentStringsW()\n");
         LocalFree(Expanded);
         return ERROR_NOT_ENOUGH_MEMORY;
     }
@@ -1426,7 +1433,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
     /* Convert to NY-style path */
     if (!RtlDosPathNameToNtPathName_U(Expanded, &NtPathName, NULL, NULL))
     {
-        DPRINT1("Error during a call to RtlDosPathNameToNtPathName_U()\n");
+        DPRINT("Error during a call to RtlDosPathNameToNtPathName_U()\n");
         return ERROR_INVALID_ENVIRONMENT;
     }
 
@@ -1439,7 +1446,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
     Expanded = LocalAlloc(LMEM_ZEROINIT, NtPathName.Length + sizeof(WCHAR));
     if (!Expanded)
     {
-            DPRINT1("Error allocating memory for boot driver name!\n");
+            DPRINT("Error allocating memory for boot driver name!\n");
             return ERROR_NOT_ENOUGH_MEMORY;
     }
 
@@ -1455,7 +1462,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
             (ServiceNameLen - ExpandedLen) * sizeof(WCHAR) + 13*sizeof(WCHAR));
         if (*RelativeName == NULL)
         {
-            DPRINT1("Error allocating memory for boot driver name!\n");
+            DPRINT("Error allocating memory for boot driver name!\n");
             LocalFree(Expanded);
             return ERROR_NOT_ENOUGH_MEMORY;
         }
@@ -1491,7 +1498,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
             /* Check if required buffer size is sane */
             if (BufferSize > 0xFFFD)
             {
-                DPRINT1("Too large buffer required\n");
+                DPRINT("Too large buffer required\n");
                 *RelativeName = 0;
 
                 if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle);
@@ -1503,7 +1510,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
             LinkTarget.Buffer = LocalAlloc(LMEM_ZEROINIT, BufferSize + sizeof(WCHAR));
             if (!LinkTarget.Buffer)
             {
-                DPRINT1("Unable to alloc buffer\n");
+                DPRINT("Unable to alloc buffer\n");
                 if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle);
                 LocalFree(Expanded);
                 return ERROR_NOT_ENOUGH_MEMORY;
@@ -1527,7 +1534,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
 
                     if (*RelativeName == NULL)
                     {
-                        DPRINT1("Unable to alloc buffer\n");
+                        DPRINT("Unable to alloc buffer\n");
                         if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle);
                         LocalFree(Expanded);
                         RtlFreeUnicodeString(&NtPathName);
@@ -1557,7 +1564,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
             }
             else
             {
-                DPRINT1("Error, Status = %08X\n", Status);
+                DPRINT("Error, Status = %08X\n", Status);
                 if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle);
                 LocalFree(Expanded);
                 RtlFreeUnicodeString(&NtPathName);
@@ -1566,7 +1573,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
         }
         else
         {
-            DPRINT1("Error, Status = %08X\n", Status);
+            DPRINT("Error, Status = %08X\n", Status);
             if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle);
             LocalFree(Expanded);
             RtlFreeUnicodeString(&NtPathName);
@@ -1575,7 +1582,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName)
     }
     else
     {
-        DPRINT1("Error, Status = %08X\n", Status);
+        DPRINT("Error, Status = %08X\n", Status);
         LocalFree(Expanded);
         return ERROR_INVALID_PARAMETER;
     }
@@ -1608,7 +1615,7 @@ ScmCanonDriverImagePath(DWORD dwStartType,
 
         if (*lpCanonName == NULL)
         {
-            DPRINT1("Error allocating memory for canonized service name!\n");
+            DPRINT("Error allocating memory for canonized service name!\n");
             return ERROR_NOT_ENOUGH_MEMORY;
         }
 
@@ -1632,7 +1639,7 @@ ScmCanonDriverImagePath(DWORD dwStartType,
 
         if (*lpCanonName == NULL)
         {
-            DPRINT1("Error allocating memory for canonized service name!\n");
+            DPRINT("Error allocating memory for canonized service name!\n");
             return ERROR_NOT_ENOUGH_MEMORY;
         }
 
@@ -1653,7 +1660,7 @@ ScmCanonDriverImagePath(DWORD dwStartType,
 
         if (*lpCanonName == NULL)
         {
-            DPRINT1("Error allocating memory for canonized service name!\n");
+            DPRINT("Error allocating memory for canonized service name!\n");
             return ERROR_NOT_ENOUGH_MEMORY;
         }
 
@@ -1666,7 +1673,7 @@ ScmCanonDriverImagePath(DWORD dwStartType,
     /* It seems to be a DOS path, convert it */
     if (!RtlDosPathNameToNtPathName_U(lpServiceName, &NtServiceName, NULL, NULL))
     {
-        DPRINT1("RtlDosPathNameToNtPathName_U() failed!\n");
+        DPRINT("RtlDosPathNameToNtPathName_U() failed!\n");
         return ERROR_INVALID_PARAMETER;
     }
 
@@ -1674,7 +1681,7 @@ ScmCanonDriverImagePath(DWORD dwStartType,
 
     if (*lpCanonName == NULL)
     {
-        DPRINT1("Error allocating memory for canonized service name!\n");
+        DPRINT("Error allocating memory for canonized service name!\n");
         RtlFreeUnicodeString(&NtServiceName);
         return ERROR_NOT_ENOUGH_MEMORY;
     }
@@ -1697,7 +1704,7 @@ ScmCanonDriverImagePath(DWORD dwStartType,
     {
         /* There is a problem, free name and return */
         LocalFree(*lpCanonName);
-        DPRINT1("Error converting named!\n");
+        DPRINT("Error converting named!\n");
         return Result;
     }
 
@@ -1759,7 +1766,7 @@ DWORD RCreateServiceW(
     hManager = (PMANAGER_HANDLE)hSCManager;
     if (!hManager || hManager->Handle.Tag != MANAGER_TAG)
     {
-        DPRINT1("Invalid manager handle!\n");
+        DPRINT("Invalid manager handle!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -1767,8 +1774,8 @@ DWORD RCreateServiceW(
     if (!RtlAreAllAccessesGranted(hManager->Handle.DesiredAccess,
                                   SC_MANAGER_CREATE_SERVICE))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n",
-                hManager->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n",
+               hManager->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
@@ -2086,8 +2093,8 @@ DWORD REnumDependentServicesW(
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SC_MANAGER_ENUMERATE_SERVICE))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n",
-                hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n",
+               hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
@@ -2123,7 +2130,7 @@ DWORD REnumDependentServicesW(
                                 (dwServicesReturned + 1) * sizeof(PSERVICE));
     if (!lpServicesArray)
     {
-        DPRINT1("Could not allocate a buffer!!\n");
+        DPRINT("Could not allocate a buffer!!\n");
         dwError = ERROR_NOT_ENOUGH_MEMORY;
         goto Done;
     }
@@ -2214,7 +2221,7 @@ DWORD REnumServicesStatusW(
     hManager = (PMANAGER_HANDLE)hSCManager;
     if (!hManager || hManager->Handle.Tag != MANAGER_TAG)
     {
-        DPRINT1("Invalid manager handle!\n");
+        DPRINT("Invalid manager handle!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -2237,7 +2244,7 @@ DWORD REnumServicesStatusW(
     if (!RtlAreAllAccessesGranted(hManager->Handle.DesiredAccess,
                                   SC_MANAGER_ENUMERATE_SERVICE))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n",
+        DPRINT("Insufficient access rights! 0x%lx\n",
                 hManager->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
@@ -2418,7 +2425,7 @@ DWORD ROpenSCManagerW(
                                      &hHandle);
     if (dwError != ERROR_SUCCESS)
     {
-        DPRINT1("ScmCreateManagerHandle() failed (Error %lu)\n", dwError);
+        DPRINT("ScmCreateManagerHandle() failed (Error %lu)\n", dwError);
         return dwError;
     }
 
@@ -2427,7 +2434,7 @@ DWORD ROpenSCManagerW(
                              dwDesiredAccess | SC_MANAGER_CONNECT);
     if (dwError != ERROR_SUCCESS)
     {
-        DPRINT1("ScmCheckAccess() failed (Error %lu)\n", dwError);
+        DPRINT("ScmCheckAccess() failed (Error %lu)\n", dwError);
         HeapFree(GetProcessHeap(), 0, hHandle);
         return dwError;
     }
@@ -2465,7 +2472,7 @@ DWORD ROpenServiceW(
     hManager = (PMANAGER_HANDLE)hSCManager;
     if (!hManager || hManager->Handle.Tag != MANAGER_TAG)
     {
-        DPRINT1("Invalid manager handle!\n");
+        DPRINT("Invalid manager handle!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -2490,7 +2497,7 @@ DWORD ROpenServiceW(
                                      &hHandle);
     if (dwError != ERROR_SUCCESS)
     {
-        DPRINT1("ScmCreateServiceHandle() failed (Error %lu)\n", dwError);
+        DPRINT("ScmCreateServiceHandle() failed (Error %lu)\n", dwError);
         return dwError;
     }
 
@@ -2499,7 +2506,7 @@ DWORD ROpenServiceW(
                              dwDesiredAccess);
     if (dwError != ERROR_SUCCESS)
     {
-        DPRINT1("ScmCheckAccess() failed (Error %lu)\n", dwError);
+        DPRINT("ScmCheckAccess() failed (Error %lu)\n", dwError);
         HeapFree(GetProcessHeap(), 0, hHandle);
         return dwError;
     }
@@ -2545,21 +2552,21 @@ DWORD RQueryServiceConfigW(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_QUERY_CONFIG))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -2753,21 +2760,21 @@ DWORD RStartServiceW(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_START))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -2810,7 +2817,7 @@ DWORD RGetServiceDisplayNameW(
 //    hManager = (PMANAGER_HANDLE)hSCManager;
 //    if (hManager->Handle.Tag != MANAGER_TAG)
 //    {
-//        DPRINT1("Invalid manager handle!\n");
+//        DPRINT("Invalid manager handle!\n");
 //        return ERROR_INVALID_HANDLE;
 //    }
 
@@ -2818,7 +2825,7 @@ DWORD RGetServiceDisplayNameW(
     lpService = ScmGetServiceEntryByName(lpServiceName);
     if (lpService == NULL)
     {
-        DPRINT1("Could not find a service!\n");
+        DPRINT("Could not find a service!\n");
 
         /* If the service could not be found and lpcchBuffer is less than 2, windows
            puts null in lpDisplayName and puts 2 in lpcchBuffer */
@@ -2884,7 +2891,7 @@ DWORD RGetServiceKeyNameW(
 //    hManager = (PMANAGER_HANDLE)hSCManager;
 //    if (hManager->Handle.Tag != MANAGER_TAG)
 //    {
-//        DPRINT1("Invalid manager handle!\n");
+//        DPRINT("Invalid manager handle!\n");
 //        return ERROR_INVALID_HANDLE;
 //    }
 
@@ -2892,7 +2899,7 @@ DWORD RGetServiceKeyNameW(
     lpService = ScmGetServiceEntryByDisplayName(lpDisplayName);
     if (lpService == NULL)
     {
-        DPRINT1("Could not find a service!\n");
+        DPRINT("Could not find a service!\n");
 
         /* If the service could not be found and lpcchBuffer is less than 2, windows
            puts null in lpDisplayName and puts 2 in lpcchBuffer */
@@ -2979,21 +2986,21 @@ DWORD RChangeServiceConfigA(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_CHANGE_CONFIG))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -3002,7 +3009,7 @@ DWORD RChangeServiceConfigA(
     if (lpService->bDeleted)
     {
         /* FIXME: Unlock database */
-        DPRINT1("The service has already been marked for delete!\n");
+        DPRINT("The service has already been marked for delete!\n");
         return ERROR_SERVICE_MARKED_FOR_DELETE;
     }
 
@@ -3414,8 +3421,8 @@ DWORD REnumDependentServicesA(
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SC_MANAGER_ENUMERATE_SERVICE))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n",
-                hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n",
+               hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
@@ -3456,7 +3463,7 @@ DWORD REnumDependentServicesA(
                                 (dwServicesReturned + 1) * sizeof(PSERVICE));
     if (!lpServicesArray)
     {
-        DPRINT1("Could not allocate a buffer!!\n");
+        DPRINT("Could not allocate a buffer!!\n");
         dwError = ERROR_NOT_ENOUGH_MEMORY;
         goto Done;
     }
@@ -3554,7 +3561,7 @@ DWORD REnumServicesStatusA(
         lpStatusPtrW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufSize);
         if (!lpStatusPtrW)
         {
-            DPRINT1("Failed to allocate buffer!\n");
+            DPRINT("Failed to allocate buffer!\n");
             return ERROR_NOT_ENOUGH_MEMORY;
         }
     }
@@ -3719,21 +3726,21 @@ DWORD RQueryServiceConfigA(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_QUERY_CONFIG))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -3952,7 +3959,7 @@ DWORD RStartServiceA(
     PSERVICE_HANDLE hSvc;
     PSERVICE lpService = NULL;
 
-    DPRINT1("RStartServiceA() called\n");
+    DPRINT("RStartServiceA() called\n");
 
     if (ScmShutdown)
         return ERROR_SHUTDOWN_IN_PROGRESS;
@@ -3960,21 +3967,21 @@ DWORD RStartServiceA(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_START))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -4017,7 +4024,7 @@ DWORD RGetServiceDisplayNameA(
 //    hManager = (PMANAGER_HANDLE)hSCManager;
 //    if (hManager->Handle.Tag != MANAGER_TAG)
 //    {
-//        DPRINT1("Invalid manager handle!\n");
+//        DPRINT("Invalid manager handle!\n");
 //        return ERROR_INVALID_HANDLE;
 //    }
 
@@ -4044,7 +4051,7 @@ DWORD RGetServiceDisplayNameA(
 
     if (lpService == NULL)
     {
-        DPRINT1("Could not find a service!\n");
+        DPRINT("Could not find a service!\n");
 
         /* If the service could not be found and lpcchBuffer is 0, windows
            puts null in lpDisplayName and puts 1 in lpcchBuffer */
@@ -4140,7 +4147,7 @@ DWORD RGetServiceKeyNameA(
 
     if (lpService == NULL)
     {
-        DPRINT1("Could not find the service!\n");
+        DPRINT("Could not find the service!\n");
 
         /* If the service could not be found and lpcchBuffer is 0,
            put null in lpDisplayName and puts 1 in lpcchBuffer, verified WINXP. */
@@ -4341,21 +4348,21 @@ DWORD RChangeServiceConfig2W(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_CHANGE_CONFIG))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -4364,7 +4371,7 @@ DWORD RChangeServiceConfig2W(
     if (lpService->bDeleted)
     {
         /* FIXME: Unlock database */
-        DPRINT1("The service has already been marked for delete!\n");
+        DPRINT("The service has already been marked for delete!\n");
         return ERROR_SERVICE_MARKED_FOR_DELETE;
     }
 
@@ -4385,7 +4392,7 @@ DWORD RChangeServiceConfig2W(
         if (lpServiceDescription != NULL &&
             lpServiceDescription->lpDescription != NULL)
         {
-            DPRINT1("Setting value %S\n", lpServiceDescription->lpDescription);
+            DPRINT("Setting value %S\n", lpServiceDescription->lpDescription);
             RegSetValueExW(hServiceKey,
                            L"Description",
                            0,
@@ -4430,8 +4437,8 @@ DWORD RQueryServiceConfig2A(
     LPWSTR lpDescriptionW = NULL;
     LPSTR lpDescription = NULL;
 
-    DPRINT1("RQueryServiceConfig2A() called hService %p dwInfoLevel %u, lpBuffer %p cbBufSize %u pcbBytesNeeded %p\n",
-            hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
+    DPRINT("RQueryServiceConfig2A() called hService %p dwInfoLevel %u, lpBuffer %p cbBufSize %u pcbBytesNeeded %p\n",
+           hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded);
 
     if (!lpBuffer)
         return ERROR_INVALID_ADDRESS;
@@ -4442,21 +4449,21 @@ DWORD RQueryServiceConfig2A(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_QUERY_CONFIG))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -4562,21 +4569,21 @@ DWORD RQueryServiceConfig2W(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_QUERY_CONFIG))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -4715,21 +4722,21 @@ DWORD RQueryServiceStatusEx(
     hSvc = (PSERVICE_HANDLE)hService;
     if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG)
     {
-        DPRINT1("Invalid handle tag!\n");
+        DPRINT("Invalid handle tag!\n");
         return ERROR_INVALID_HANDLE;
     }
 
     if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess,
                                   SERVICE_QUERY_STATUS))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
     lpService = hSvc->ServiceEntry;
     if (lpService == NULL)
     {
-        DPRINT1("lpService == NULL!\n");
+        DPRINT("lpService == NULL!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -4775,7 +4782,7 @@ DWORD REnumServicesStatusExA(
         pszGroupNameW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (strlen(pszGroupName) + 1) * sizeof(WCHAR));
         if (!pszGroupNameW)
         {
-             DPRINT1("Failed to allocate buffer!\n");
+             DPRINT("Failed to allocate buffer!\n");
              return ERROR_NOT_ENOUGH_MEMORY;
         }
 
@@ -4792,7 +4799,7 @@ DWORD REnumServicesStatusExA(
         lpStatusPtrW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbBufSize);
         if (!lpStatusPtrW)
         {
-            DPRINT1("Failed to allocate buffer!\n");
+            DPRINT("Failed to allocate buffer!\n");
             return ERROR_NOT_ENOUGH_MEMORY;
         }
     }
@@ -4908,7 +4915,7 @@ DWORD REnumServicesStatusExW(
     hManager = (PMANAGER_HANDLE)hSCManager;
     if (!hManager || hManager->Handle.Tag != MANAGER_TAG)
     {
-        DPRINT1("Invalid manager handle!\n");
+        DPRINT("Invalid manager handle!\n");
         return ERROR_INVALID_HANDLE;
     }
 
@@ -4917,13 +4924,13 @@ DWORD REnumServicesStatusExW(
 
     if ((dwServiceType!=SERVICE_DRIVER) && (dwServiceType!=SERVICE_WIN32))
     {
-        DPRINT1("Not a valid Service Type!\n");
+        DPRINT("Not a valid Service Type!\n");
         return ERROR_INVALID_PARAMETER;
     }
 
     if ((dwServiceState<SERVICE_ACTIVE) || (dwServiceState>SERVICE_STATE_ALL))
     {
-        DPRINT1("Not a valid Service State!\n");
+        DPRINT("Not a valid Service State!\n");
         return ERROR_INVALID_PARAMETER;
     }
 
@@ -4931,8 +4938,8 @@ DWORD REnumServicesStatusExW(
     if (!RtlAreAllAccessesGranted(hManager->Handle.DesiredAccess,
                                   SC_MANAGER_ENUMERATE_SERVICE))
     {
-        DPRINT1("Insufficient access rights! 0x%lx\n",
-                hManager->Handle.DesiredAccess);
+        DPRINT("Insufficient access rights! 0x%lx\n",
+               hManager->Handle.DesiredAccess);
         return ERROR_ACCESS_DENIED;
     }
 
index 44ee8f3..2d97ce4 100644 (file)
@@ -279,7 +279,7 @@ ShutdownHandlerRoutine(DWORD dwCtrlType)
 {
     DPRINT1("ShutdownHandlerRoutine() called\n");
 
-    if (dwCtrlType == CTRL_SHUTDOWN_EVENT)
+    if (dwCtrlType & (CTRL_SHUTDOWN_EVENT | CTRL_LOGOFF_EVENT))
     {
         DPRINT1("Shutdown event received!\n");
         ScmShutdown = TRUE;
index 23022dc..8371ad1 100644 (file)
@@ -42,7 +42,6 @@ typedef struct _SERVICE
     DWORD dwResumeCount;
     DWORD dwRefCount;
 
-    CLIENT_HANDLE hClient;
     SERVICE_STATUS Status;
     DWORD dwStartType;
     DWORD dwErrorControl;
@@ -112,15 +111,18 @@ DWORD ScmStartService(PSERVICE Service,
 PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName);
 PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName);
 PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
-PSERVICE ScmGetServiceEntryByClientHandle(HANDLE Handle);
 DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
                                 PSERVICE *lpServiceRecord);
 VOID ScmDeleteServiceRecord(PSERVICE lpService);
 DWORD ScmMarkServiceForDelete(PSERVICE pService);
 
 DWORD ScmControlService(PSERVICE Service,
-                        DWORD dwControl,
-                        LPSERVICE_STATUS lpServiceStatus);
+                        DWORD dwControl);
+
+BOOL ScmLockDatabaseExclusive(VOID);
+BOOL ScmLockDatabaseShared(VOID);
+VOID ScmUnlockDatabase(VOID);
+
 
 /* driver.c */
 
index 3989076..22acc39 100644 (file)
@@ -14,11 +14,11 @@ END
 
 IDD_GINALOADFAILED DIALOGEX  58, 83, 231, 119
 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Benutzer Interface Fehler"
+CAPTION "Benutzerinterface-Fehler"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Die Logon Benutzer Schnittstelle DLL %s konnte nicht geladen werden.", IDC_GINALOADFAILED, 39, 16, 156, 24
-    LTEXT "Kontaktieren Sie Ihren Systemadministrator um die DLL zu ersetzen, oder stellen Sie die Original-DLL wieder her.", IDC_GINALOADFAILEDCONTACT, 39, 53, 151, 25
+    LTEXT "Die Logon-Benutzerschnittstellen-DLL %s konnte nicht geladen werden.", IDC_GINALOADFAILED, 39, 16, 156, 24
+    LTEXT "Kontaktieren Sie Ihren Systemadministrator, um die DLL zu ersetzen, oder stellen Sie die Original-DLL wieder her.", IDC_GINALOADFAILEDCONTACT, 39, 53, 151, 25
     DEFPUSHBUTTON "Neusta&rt", 1, 80, 91, 68, 14
 END
 
@@ -32,9 +32,9 @@ BEGIN
     IDS_RUNNINGLOGOFFSCRIPTS "Abmeldeskripte ausführen..."
     IDS_RUNNINGLOGONSCRIPTS "Anmeldeskripte ausführen..."
     IDS_LOADINGYOURPERSONALSETTINGS "Ihre persönlichen Einstellungen laden..."
-    IDS_CLOSINGNETWORKCONNECTIONS "Netzwerkverbindungen schliessen..."
+    IDS_CLOSINGNETWORKCONNECTIONS "Netzwerkverbindungen schließen..."
     IDS_REACTOSISSHUTTINGDOWN "ReactOS fährt herunter..."
-    IDS_PREPARETOSTANDBY "Vorbereiten für den StandBy Modus..."
+    IDS_PREPARETOSTANDBY "Vorbereiten für den Stromsparmodus..."
     IDS_PREPARETOHIBERNATE "Vorbereiten für den Ruhezustand..."
     IDS_SAVEYOURSETTINGS "Speichern Ihrer persönlichen Einstellungen..."
     IDS_REACTOSISSTARTINGUP "ReactOS startet..."
index efc1d4a..d16dbf3 100644 (file)
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __SETUP_H__
-#define __SETUP_H__
+#pragma once
 
 DWORD GetSetupType (VOID);
 BOOL RunSetup (VOID);
 
-#endif /* __SETUP_H__ */
-
 /* EOF */
index 38f23cb..80401c1 100644 (file)
@@ -3,6 +3,7 @@
 <group xmlns:xi="http://www.w3.org/2001/XInclude">
        <property name="BASEADDRESS_REGTESTS"           value="0x07000000" />
        <property name="BASEADDRESS_NOTIFYHOOK"         value="0x08000000" />
+       <property name="BASEADDRESS_FAULTREP"           value="0x107A0000" />
        <property name="BASEADDRESS_QMGRPRXY"           value="0x1f710000" />
        <property name="BASEADDRESS_CRYPTDLG"           value="0x209c0000" />
        <property name="BASEADDRESS_COMCAT"             value="0x20a50000" />
@@ -25,6 +26,7 @@
        <property name="BASEADDRESS_MSGSM32ACM"         value="0x56db0000" />
        <property name="BASEADDRESS_MSG711ACM"          value="0x584f0000" />
        <property name="BASEADDRESS_IMAADP32ACM"        value="0x585e0000" />
+       <property name="BASEADDRESS_BDAPLGIN"   value="0x58600000" />
        <property name="BASEADDRESS_TELEPHON"           value="0x58750000" />
        <property name="BASEADDRESS_PWRCFG"             value="0x587e0000" />
        <property name="BASEADDRESS_MMSYS"              value="0x588a0000" />
        <property name="BASEADDRESS_CARDS"              value="0x701a0000" />
        <property name="BASEADDRESS_WININET"            value="0x70200000" />
        <property name="BASEADDRESS_WINHTTP"            value="0x70c60000" />
+       <property name="BASEADDRESS_BATT"               value="0x70cb0000" />
        <property name="BASEADDRESS_AMSTREAM"           value="0x71030000" />
        <property name="BASEADDRESS_ACLUI"              value="0x71550000" />
        <property name="BASEADDRESS_DHCPCSVC"           value="0x71650000" />
index 5e254c4..2566c78 100644 (file)
@@ -1,65 +1,66 @@
 <?xml version="1.0"?>
-<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
 <group>
-               <module name="armllb" type="bootloader" installbase=".." installname="armllb.bin">
-                       <bootstrap installbase="loader" />
-                       <library>libcntpr</library>
-                       <library>rtl</library>
-                       <include base="armllb">./inc</include>
-                       <if property="SARCH" value="omap3">
-                <define name="_OMAP3_" />
-                <group linkerset="ld">
-                    <linkerflag>-Wl,--image-base=0x401FEFF8</linkerflag>
-                       </group>
-            </if>
-            <if property="SARCH" value="versatile">
-                <define name="_VERSATILE_" />
-                <group linkerset="ld">
-                    <linkerflag>-Wl,--image-base=0xF000</linkerflag>
-                       </group>
-            </if>
-            <file first="true">boot.s</file>
-            <file>main.c</file>
-            <file>crtsupp.c</file>
-           <file>envir.c</file>
-           <file>fw.c</file>
-            <directory name="hw">
-                <file>keyboard.c</file>
-                <file>serial.c</file>
-                <file>time.c</file>
-                <file>video.c</file>
-                <if property="SARCH" value="omap3">
-                    <directory name="omap3">
-                        <file>hwdata.c</file>
-                        <file>hwdss.c</file>
-                        <file>hwuart.c</file>
-                        <file>hwinfo.c</file>
-                        <file<hwinit.c</file>
-                    </directory>
-                </if>
-                <if property="SARCH" value="versatile">
-                    <directory name="versatile">
-                        <file>hwclcd.c</file>
-                        <file>hwkmi.c</file>
-                        <file>hwuart.c</file>
-                        <file>hwinfo.c</file>
-                        <file>hwinit.c</file>
-                    </directory>
-                </if>
-            </directory>
-            <directory name="os">
-                <file>loader.c</file>
-            </directory>
-            <group compilerset="gcc">
-                <compilerflag>-fms-extensions</compilerflag>
-                <compilerflag>-ffreestanding</compilerflag>
-                       <compilerflag>-fno-builtin</compilerflag>
-                       <compilerflag>-fno-inline</compilerflag>
-                       <compilerflag>-fno-zero-initialized-in-bss</compilerflag>
-                <compilerflag>-Os</compilerflag>
-            </group>
-            <group linkerset="ld">
-                <linkerflag>-lgcc</linkerflag>
-            </group>
-               </module>
+<module name="armllb" type="bootloader" installbase=".." installname="armllb.bin">
+       <bootstrap installbase="loader" />
+       <library>libcntpr</library>
+       <library>rtl</library>
+       <include base="armllb">./inc</include>
+       <if property="SARCH" value="omap3">
+               <define name="_OMAP3_" />
+               <group linkerset="ld">
+                       <linkerflag>-Wl,--image-base=0x401FEFF8</linkerflag>
+               </group>
+       </if>
+       <if property="SARCH" value="versatile">
+               <define name="_VERSATILE_" />
+               <group linkerset="ld">
+                       <linkerflag>-Wl,--image-base=0xF000</linkerflag>
+               </group>
+       </if>
+       <file first="true">boot.s</file>
+       <file>main.c</file>
+       <file>crtsupp.c</file>
+       <file>envir.c</file>
+       <file>fw.c</file>
+       <directory name="hw">
+               <file>keyboard.c</file>
+               <file>serial.c</file>
+               <file>time.c</file>
+               <file>video.c</file>
+               <if property="SARCH" value="omap3">
+                       <directory name="omap3">
+                               <file>hwdata.c</file>
+                               <file>hwdss.c</file>
+                               <file>hwuart.c</file>
+                               <file>hwinfo.c</file>
+                               <file>hwinit.c</file>
+                               </directory>
+               </if>
+               <if property="SARCH" value="versatile">
+                       <directory name="versatile">
+                               <file>hwclcd.c</file>
+                               <file>hwkmi.c</file>
+                               <file>hwuart.c</file>
+                               <file>hwinfo.c</file>
+                               <file>hwinit.c</file>
+                       </directory>
+               </if>
+       </directory>
+       <directory name="os">
+               <file>loader.c</file>
+       </directory>
+       <group compilerset="gcc">
+               <compilerflag>-fms-extensions</compilerflag>
+               <compilerflag>-ffreestanding</compilerflag>
+               <compilerflag>-fno-builtin</compilerflag>
+               <compilerflag>-fno-inline</compilerflag>
+               <compilerflag>-fno-zero-initialized-in-bss</compilerflag>
+               <compilerflag>-Os</compilerflag>
+               
+       </group>
+       <group linkerset="ld">
+               <linkerflag>-lgcc</linkerflag>
+       </group>
+</module>
 </group>
index 82dcd7a..4286b4a 100644 (file)
@@ -8,6 +8,26 @@
 
 #include "precomp.h"
 
+USHORT ColorPalette[16][3] =
+{
+    {0x00, 0x00, 0x00},
+    {0x00, 0x00, 0xAA},
+    {0x00, 0xAA, 0x00},
+    {0x00, 0xAA, 0xAA},
+    {0xAA, 0x00, 0x00},
+    {0xAA, 0x00, 0xAA},
+    {0xAA, 0x55, 0x00},
+    {0xAA, 0xAA, 0xAA},
+    {0x55, 0x55, 0x55},
+    {0x55, 0x55, 0xFF},
+    {0x55, 0xFF, 0x55},
+    {0x55, 0xFF, 0xFF},
+    {0xFF, 0x55, 0x55},
+    {0xFF, 0x55, 0xFF},
+    {0xFF, 0xFF, 0x55},
+    {0xFF, 0xFF, 0xFF},
+};
+
 VOID
 LlbFwPutChar(INT Ch)
 {
@@ -53,55 +73,6 @@ LlbFwVideoGetDisplaySize(OUT PULONG Width,
     *Depth = 16;
 }
 
-ULONG
-LlbFwVideoGetBufferSize(VOID)
-{
-    /* X * Y * BPP */
-    return LlbHwGetScreenWidth() * LlbHwGetScreenHeight() * 2;
-}
-
-VOID
-LlbFwVideoSetTextCursorPosition(IN ULONG X,
-                                IN ULONG Y)
-{
-    printf("%s is UNIMPLEMENTED", __FUNCTION__);
-    while (TRUE);
-}
-
-VOID
-LlbFwVideoHideShowTextCursor(IN BOOLEAN Show)
-{
-    /* Nothing to do */
-    return;
-}
-
-USHORT ColorPalette[16][3] =
-{
-    {0x00, 0x00, 0x00},
-    {0x00, 0x00, 0xAA},
-    {0x00, 0xAA, 0x00},
-    {0x00, 0xAA, 0xAA},
-    {0xAA, 0x00, 0x00},
-    {0xAA, 0x00, 0xAA},
-    {0xAA, 0x55, 0x00},
-    {0xAA, 0xAA, 0xAA},
-    {0x55, 0x55, 0x55},
-    {0x55, 0x55, 0xFF},
-    {0x55, 0xFF, 0x55},
-    {0x55, 0xFF, 0xFF},
-    {0xFF, 0x55, 0x55},
-    {0xFF, 0x55, 0xFF},
-    {0xFF, 0xFF, 0x55},
-    {0xFF, 0xFF, 0xFF},
-};
-
-VOID
-LlbFwVideoCopyOffScreenBufferToVRAM(IN PVOID Buffer)
-{
-    /* No double-buffer is used on ARM */
-    return;
-}
-
 VOID
 LlbFwVideoClearScreen(IN UCHAR Attr)
 {
@@ -133,43 +104,6 @@ LlbFwVideoPutChar(IN INT c,
     LlbVideoDrawChar(c, Buffer, Color, BackColor);
 }
 
-BOOLEAN
-LlbFwVideoIsPaletteFixed(VOID)
-{
-    printf("%s is UNIMPLEMENTED", __FUNCTION__);
-    while (TRUE);
-    return TRUE;
-}
-
-VOID
-LlbFwVideoSetPaletteColor(IN UCHAR Color,
-                          IN UCHAR Red,
-                          IN UCHAR Green,
-                          IN UCHAR Blue)
-{
-    printf("%s is UNIMPLEMENTED", __FUNCTION__);
-    while (TRUE);
-    return;
-}
-
-VOID
-LlbFwVideoGetPaletteColor(IN UCHAR Color,
-                          OUT PUCHAR Red,
-                          OUT PUCHAR Green,
-                          OUT PUCHAR Blue)
-{
-    printf("%s is UNIMPLEMENTED", __FUNCTION__);
-    while (TRUE);
-    return;
-}
-
-VOID
-LlbFwVideoSync(VOID)
-{
-    printf("%s is UNIMPLEMENTED", __FUNCTION__);
-    while (TRUE);
-    return;
-}
 
 TIMEINFO*
 LlbFwGetTime(VOID)
index 438804d..3131880 100755 (executable)
@@ -32,7 +32,7 @@ LlbHwVersaClcdInitialize(VOID)
     WRITE_REGISTER_ULONG(PL110_LCDUPBASE, (ULONG)LlbHwGetFrameBuffer());
     WRITE_REGISTER_ULONG(PL110_LCDLPBASE, (ULONG)LlbHwGetFrameBuffer());
     
-    /* Initialize timings to 1024x720 */
+    /* Initialize timings to 720x400 */
        WRITE_REGISTER_ULONG(PL110_LCDTIMING0, LCDTIMING0_PPL(LlbHwGetScreenWidth()));
        WRITE_REGISTER_ULONG(PL110_LCDTIMING1, LCDTIMING1_LPP(LlbHwGetScreenHeight()));
     
index c312e12..c1dd350 100755 (executable)
@@ -47,8 +47,8 @@ LlbHwGetSerialUart(VOID)
 // 0x00000200 - 0x0000FFFF ARM STACK                                [ 62 KB]
 // 0x00010000 - 0x0001FFFF ARM LLB                                  [ 64 KB]
 // 0x00020000 - 0x0009FFFF ARM OS LOADER                            [512 KB]
-// 0x000A0000 - 0x000FFFFF ARM FRAMEBUFFER                          [384 KB]
-// 0x00100000 - 0x007FFFFF OS LOADER FREE/UNUSED                    [  7 MB]
+// 0x000A0000 - 0x0013FFFF ARM FRAMEBUFFER                          [640 KB]
+// 0x00140000 - 0x007FFFFF OS LOADER FREE/UNUSED                    [  6 MB]
 // 0x00800000 - 0x017FFFFF KERNEL, HAL, INITIAL DRIVER LOAD ADDR    [ 16 MB]
 // 0x01800000 - 0x037FFFFF RAM DISK                                 [ 32 MB]
 // 0x03800000 - 0x07FFFFFF FREE RAM                                 [ 72 MB]
@@ -61,8 +61,8 @@ BIOS_MEMORY_MAP LlbHwVersaMemoryMap[] =
     {0x00000200, 0x0000FE00, BiosMemoryBootStrap,  0},
     {0x00010000, 0x00010000, BiosMemoryBootStrap,  0},
     {0x00020000, 0x00080000, BiosMemoryBootLoader, 0},
-    {0x000A0000, 0x00060000, BiosMemoryBootLoader, 0},
-    {0x00100000, 0x01700000, BiosMemoryUsable,     0},
+    {0x000A0000, 0x000A0000, BiosMemoryBootLoader, 0},
+    {0x00140000, 0x016C0000, BiosMemoryUsable,     0},
     {0x01800000, 0x02000000, BiosMemoryReserved,   0},
     {0x10000000, 0x10000000, BiosMemoryReserved,   0},
     {0, 0, 0, 0}
index cfe1f60..3e3179a 100644 (file)
@@ -274,7 +274,7 @@ ULONG ScreenCursor;
 
 VOID
 NTAPI
-LlbVideoDrawChar(IN CHAR c,
+LlbVideoDrawChar(IN UCHAR c,
                  IN PUSHORT Buffer,
                  IN USHORT Color,
                  IN USHORT BackColor)
@@ -342,7 +342,7 @@ LlbVideoClearScreen(IN BOOLEAN OsLoader)
 
 VOID
 NTAPI
-LlbVideoPutChar(IN CHAR c)
+LlbVideoPutChar(IN UCHAR c)
 {
     ULONG cx, cy, CharsPerLine, BackColor, ScreenWidth;
     
index 0e67123..c38ce42 100755 (executable)
@@ -15,13 +15,13 @@ LlbVideoClearScreen(
 VOID
 NTAPI
 LlbVideoPutChar(
-    IN CHAR c
+    IN UCHAR c
 );
 
 VOID
 NTAPI
 LlbVideoDrawChar(
-    IN CHAR c,
+    IN UCHAR c,
     IN PUSHORT Buffer,
     IN USHORT Color,
     IN USHORT BackColor
index 7d0e9fc..5b7caa6 100755 (executable)
@@ -76,16 +76,7 @@ LlbBuildArmBlock(VOID)
     ArmBlock.VideoClearScreen = LlbFwVideoClearScreen;
     ArmBlock.VideoSetDisplayMode = LlbFwVideoSetDisplayMode;
     ArmBlock.VideoGetDisplaySize = LlbFwVideoGetDisplaySize;
-    ArmBlock.VideoGetBufferSize = LlbFwVideoGetBufferSize;
-    ArmBlock.VideoSetTextCursorPosition = LlbFwVideoSetTextCursorPosition;
-    ArmBlock.VideoSetTextCursorPosition = LlbFwVideoSetTextCursorPosition;
-    ArmBlock.VideoHideShowTextCursor = LlbFwVideoHideShowTextCursor;
     ArmBlock.VideoPutChar = LlbFwVideoPutChar;
-    ArmBlock.VideoCopyOffScreenBufferToVRAM = LlbFwVideoCopyOffScreenBufferToVRAM;
-    ArmBlock.VideoIsPaletteFixed = LlbFwVideoIsPaletteFixed;
-    ArmBlock.VideoSetPaletteColor = LlbFwVideoSetPaletteColor;
-    ArmBlock.VideoGetPaletteColor = LlbFwVideoGetPaletteColor;
-    ArmBlock.VideoSync = LlbFwVideoSync;
     ArmBlock.GetTime = LlbFwGetTime;
 }
 
index 8697427..1e0a3f9 100644 (file)
@@ -19,9 +19,7 @@
  */
 
 
-#ifndef __RS232_H
-#define __RS232_H
-
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
@@ -42,5 +40,3 @@ BOOL  Rs232WriteByteWin32(BYTE DataByte);
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
-
-#endif // !defined(__RS232_H)
index a21fea7..422cd3c 100644 (file)
                <xi:include href="freeldr/freeldr_base.rbuild" />
                <xi:include href="freeldr/freeldr_arch.rbuild" />
                <xi:include href="freeldr/freeldr_main.rbuild" />
-               <xi:include href="freeldr/setupldr_main.rbuild" />
                <xi:include href="freeldr/freeldr.rbuild" />
-               <xi:include href="freeldr/setupldr.rbuild" />
+               <if property="ARCH" value="i386">
+                   <xi:include href="freeldr/setupldr_main.rbuild" />
+                   <xi:include href="freeldr/setupldr.rbuild" />               
+               </if>
+               <if property="ARCH" value="ppc">
+                   <xi:include href="freeldr/setupldr_main.rbuild" />
+                   <xi:include href="freeldr/setupldr.rbuild" />               
+               </if>
+               <if property="ARCH" value="amd64">
+                   <xi:include href="freeldr/setupldr_main.rbuild" />
+                   <xi:include href="freeldr/setupldr.rbuild" />               
+               </if>
        </directory>
 </group>
index 64cf06a..cbe9e9b 100644 (file)
 
 L_ArmInit:
     .long ArmInit
-
-.global PageDirectoryStart, PageDirectoryEnd
-.global startup_pagedirectory
-.global kernel_pagetable
-
-.bss
-PageDirectoryStart:
-kernel_pagetable:
-    .fill 2*4096, 1, 0
-    .space 4096
-startup_pagedirectory:
-    .fill 4*4096, 1, 0
-    
-
-.global PageDirectoryEnd
-PageDirectoryEnd:
diff --git a/reactos/boot/freeldr/freeldr/arch/arm/loader.c b/reactos/boot/freeldr/freeldr/arch/arm/loader.c
deleted file mode 100644 (file)
index 80bb14f..0000000
+++ /dev/null
@@ -1,1668 +0,0 @@
-/*
- * PROJECT:         ReactOS Boot Loader
- * LICENSE:         BSD - See COPYING.ARM in the top level directory
- * FILE:            boot/freeldr/arch/arm/loader.c
- * PURPOSE:         ARM Kernel Loader
- * PROGRAMMERS:     ReactOS Portable Systems Group
- */
-
-/* INCLUDES *******************************************************************/
-
-#include <freeldr.h>
-#include <internal/arm/ke.h>
-#include <internal/arm/mm.h>
-#include <internal/arm/intrin_i.h>
-
-#define KERNEL_DESCRIPTOR_PAGE(x) (((ULONG_PTR)x &~ KSEG0_BASE) >> PAGE_SHIFT)
-
-/* GLOBALS ********************************************************************/
-
-typedef struct _BIOS_MEMORY_DESCRIPTOR
-{
-    ULONG BlockBase;
-    ULONG BlockSize;
-} BIOS_MEMORY_DESCRIPTOR, *PBIOS_MEMORY_DESCRIPTOR;
-
-ULONG PageDirectoryStart, PageDirectoryEnd;
-PLOADER_PARAMETER_BLOCK ArmLoaderBlock;
-CHAR ArmCommandLine[256];
-CHAR ArmArcBootPath[64];
-CHAR ArmArcHalPath[64];
-CHAR ArmNtHalPath[64];
-CHAR ArmNtBootPath[64];
-PNLS_DATA_BLOCK ArmNlsDataBlock;
-PLOADER_PARAMETER_EXTENSION ArmExtension;
-BIOS_MEMORY_DESCRIPTOR ArmBoardMemoryDescriptors[16] = {{0}};
-PBIOS_MEMORY_DESCRIPTOR ArmBoardMemoryList = ArmBoardMemoryDescriptors;
-ULONG NumberDescriptors = 0;
-MEMORY_DESCRIPTOR MDArray[16] = {{0}};
-ULONG ArmSharedHeapSize;
-PCHAR ArmSharedHeap;
-
-extern PAGE_DIRECTORY_ARM startup_pagedirectory;
-extern ROS_KERNEL_ENTRY_POINT KernelEntryPoint;
-extern ULONG_PTR KernelBase;
-
-extern ADDRESS_RANGE ArmBoardMemoryMap[16];
-extern ULONG ArmBoardMemoryMapRangeCount;
-extern ULONG_PTR AnsiData, OemData, UnicodeData, RegistryData, KernelData, HalData, DriverData[16];
-extern ULONG RegistrySize, AnsiSize, OemSize, UnicodeSize, KernelSize, HalSize, DriverSize[16];
-extern PCHAR DriverName[16];
-extern ULONG Drivers;
-extern ULONG BootStack;
-
-ULONG SizeBits[] =
-{
-    -1,      // INVALID
-    -1,      // INVALID
-    1 << 12, // 4KB
-    1 << 13, // 8KB
-    1 << 14, // 16KB
-    1 << 15, // 32KB
-    1 << 16, // 64KB
-    1 << 17  // 128KB
-};
-
-ULONG AssocBits[] =
-{
-    -1,      // INVALID
-    -1,      // INVALID
-    4        // 4-way associative
-};
-
-ULONG LenBits[] =
-{
-    -1,      // INVALID
-    -1,      // INVALID
-    8        // 8 words per line (32 bytes)
-};
-
-//
-// Where to map the serial port
-//
-#define UART_VIRTUAL 0xE0000000
-
-/* FUNCTIONS ******************************************************************/
-
-PVOID
-ArmAllocateFromSharedHeap(IN ULONG Size)
-{
-    PVOID Buffer;
-
-    //
-    // Allocate from the shared heap
-    //
-    Buffer = &ArmSharedHeap[ArmSharedHeapSize];
-    ArmSharedHeapSize += Size;
-    return Buffer;
-}
-
-PMEMORY_ALLOCATION_DESCRIPTOR
-NTAPI
-ArmAllocateMemoryDescriptor(VOID)
-{
-    //
-    // Allocate a descriptor from the heap
-    //
-    return ArmAllocateFromSharedHeap(sizeof(MEMORY_ALLOCATION_DESCRIPTOR));
-}
-
-VOID
-NTAPI
-ArmAddBoardMemoryDescriptor(IN ULONG Address,
-                            IN ULONG Size)
-{
-    PBIOS_MEMORY_DESCRIPTOR BiosBlock = ArmBoardMemoryList;
-    
-    //
-    // Loop board DRAM configuration
-    //
-    while (BiosBlock->BlockSize > 0)
-    {
-        /* Check if we've found a matching head block */
-        if (Address + Size == BiosBlock->BlockBase)
-        {
-            /* Simply enlarge and rebase it */
-            BiosBlock->BlockBase = Address;
-            BiosBlock->BlockSize += Size;
-            break;
-        }
-        
-        /* Check if we've found a matching tail block */
-        if (Address == (BiosBlock->BlockBase + BiosBlock->BlockSize))
-        {
-            /* Simply enlarge it */
-            BiosBlock->BlockSize += Size;
-            break;
-        }
-        
-        /* Nothing suitable found, try the next block */
-        BiosBlock++;
-    }
-    
-    /* No usable blocks found, found a free block instead */
-    if (!BiosBlock->BlockSize)
-    {
-        /* Write our data */
-        BiosBlock->BlockBase = Address;
-        BiosBlock->BlockSize = Size;
-        
-        /* Create a new block and mark it as the end of the array */
-        BiosBlock++;
-        BiosBlock->BlockBase = BiosBlock->BlockSize = 0L;
-    }
-}
-
-VOID
-NTAPI
-ArmBuildBoardMemoryMap(VOID)
-{
-    ULONG BlockBegin, BlockEnd;
-    ULONG j;
-    
-    /* Loop the BIOS Memory Map */
-    for (j = 0; j < ArmBoardMemoryMapRangeCount; j++)
-    {
-        /* Get the start and end addresses */
-        BlockBegin = ArmBoardMemoryMap[j].BaseAddrLow;
-        BlockEnd = ArmBoardMemoryMap[j].BaseAddrLow + ArmBoardMemoryMap[j].LengthLow - 1;
-        
-        /* Make sure this isn't a > 4GB descriptor */
-        if (!ArmBoardMemoryMap[j].BaseAddrHigh)
-        {
-            /* Make sure we don't overflow */
-            if (BlockEnd < BlockBegin) BlockEnd = 0xFFFFFFFF;
-            
-            /* Check if this is free memory */
-            if (ArmBoardMemoryMap[j].Type == 1)
-            {
-                /* Add it to our BIOS descriptors */
-                ArmAddBoardMemoryDescriptor(BlockBegin, BlockEnd - BlockBegin + 1);
-            }
-        }
-    }
-}
-
-NTSTATUS
-NTAPI
-ArmConfigureArcDescriptor(IN ULONG PageBegin,
-                          IN ULONG PageEnd,
-                          IN TYPE_OF_MEMORY MemoryType)
-{
-    ULONG i;
-    ULONG BlockBegin, BlockEnd;
-    MEMORY_TYPE BlockType;
-    BOOLEAN Combined = FALSE;
-    
-    /* If this descriptor seems bogus, just return */
-    if (PageEnd <= PageBegin) return STATUS_SUCCESS;
-    
-    /* Loop every ARC descriptor, trying to find one we can modify */
-    for (i = 0; i < NumberDescriptors; i++)
-    {
-        /* Get its settings */
-        BlockBegin = MDArray[i].BasePage;
-        BlockEnd = MDArray[i].BasePage + MDArray[i].PageCount;
-        BlockType = MDArray[i].MemoryType;
-        
-        /* Check if we can fit inside this block */
-        if (BlockBegin < PageBegin)
-        {
-            /* Check if we are larger then it */
-            if ((BlockEnd > PageBegin) && (BlockEnd <= PageEnd))
-            {
-                /* Make it end where we start */
-                BlockEnd = PageBegin;
-            }
-            
-            /* Check if it ends after we do */
-            if (BlockEnd > PageEnd)
-            {
-                /* Make sure we can allocate a descriptor */
-                if (NumberDescriptors == 60) return ENOMEM;
-                
-                /* Create a descriptor for whatever memory we're not part of */
-                MDArray[NumberDescriptors].MemoryType = BlockType;
-                MDArray[NumberDescriptors].BasePage = PageEnd;
-                MDArray[NumberDescriptors].PageCount  = BlockEnd - PageEnd;
-                NumberDescriptors++;
-                
-                /* The next block ending is now where we begin */
-                BlockEnd = PageBegin;
-            }
-        }
-        else
-        {
-            /* Check if the blog begins inside our range */
-            if (BlockBegin < PageEnd)
-            {
-                /* Check if it ends before we do */
-                if (BlockEnd < PageEnd)
-                {
-                    /* Then make it disappear */
-                    BlockEnd = BlockBegin;
-                }
-                else
-                {
-                    /* Otherwise make it start where we end */
-                    BlockBegin = PageEnd;
-                }
-            }
-        }
-        
-        /* Check if the block matches us, and we haven't tried combining yet */
-        if ((BlockType == MemoryType) && !(Combined))
-        {
-            /* Check if it starts where we end */
-            if (BlockBegin == PageEnd)
-            {
-                /* Make it start with us, and combine us */
-                BlockBegin = PageBegin;
-                Combined = TRUE;
-            }
-            else if (BlockEnd == PageBegin)
-            {
-                /* Otherwise, it ends where we begin, combine its ending */
-                BlockEnd = PageEnd;
-                Combined = TRUE;
-            }
-        }
-        
-        /* Check the original block data matches with what we came up with */
-        if ((MDArray[i].BasePage == BlockBegin) &&
-            (MDArray[i].PageCount == BlockEnd - BlockBegin))
-        {
-            /* Then skip it */
-            continue;
-        }
-        
-        /* Otherwise, set our new settings for this block */
-        MDArray[i].BasePage  = BlockBegin;
-        MDArray[i].PageCount = BlockEnd - BlockBegin;
-        
-        /* Check if we are killing the block */
-        if (BlockBegin == BlockEnd)
-        {
-            /* Delete this block and restart the loop properly */
-            NumberDescriptors--;
-            if (i < NumberDescriptors) MDArray[i] = MDArray[NumberDescriptors];
-            i--;
-        }
-    }
-    
-    /* If we got here without combining, we need to allocate a new block */
-    if (!(Combined) && (MemoryType < LoaderMaximum))
-    {
-        /* Make sure there's enough descriptors */
-        if (NumberDescriptors == 60) return ENOMEM;
-        
-        /* Allocate a new block with our data */
-        MDArray[NumberDescriptors].MemoryType = MemoryType;
-        MDArray[NumberDescriptors].BasePage = PageBegin;
-        MDArray[NumberDescriptors].PageCount  = PageEnd - PageBegin;
-        NumberDescriptors++;
-    }
-    
-    /* Changes complete, return success */
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-ArmBuildOsMemoryMap(VOID)
-{
-    PBIOS_MEMORY_DESCRIPTOR MdBlock;
-    ULONG BlockStart, BlockEnd, BiasedStart, BiasedEnd, PageStart, PageEnd;
-    NTSTATUS Status = STATUS_SUCCESS;
-    
-    /* Loop the BIOS Memory Descriptor List */
-    MdBlock = ArmBoardMemoryList;
-    while (MdBlock->BlockSize)
-    {
-        /* Get the statrt and end addresses */
-        BlockStart = MdBlock->BlockBase;
-        BlockEnd = BlockStart + MdBlock->BlockSize - 1;
-        
-        /* Align them to page boundaries */
-        BiasedStart = BlockStart & (PAGE_SIZE - 1);
-        if (BiasedStart) BlockStart = BlockStart + PAGE_SIZE - BiasedStart;
-        BiasedEnd = (BlockEnd + 1) & (ULONG)(PAGE_SIZE - 1);
-        if (BiasedEnd) BlockEnd -= BiasedEnd;
-        
-        /* Get the actual page numbers */
-        PageStart = BlockStart >> PAGE_SHIFT;
-        PageEnd = (BlockEnd + 1) >> PAGE_SHIFT;
-
-        /* Check if we did any alignment */
-        if (BiasedStart)
-        {
-            /* Mark that region as reserved */
-            Status = ArmConfigureArcDescriptor(PageStart - 1,
-                                               PageStart,
-                                               MemorySpecialMemory);
-            if (Status != STATUS_SUCCESS) break;
-        }
-        
-        /* Check if we did any alignment */
-        if (BiasedEnd)
-        {
-            /* Mark that region as reserved */
-            Status = ArmConfigureArcDescriptor(PageEnd - 1,
-                                               PageEnd,
-                                               MemorySpecialMemory);
-            if (Status != STATUS_SUCCESS) break;
-        }
-        
-        /* It is, mark the memory a free */
-        Status = ArmConfigureArcDescriptor(PageStart,
-                                           PageEnd,
-                                           LoaderFree);
-        
-        /* If we failed, break out, otherwise, go to the next BIOS block */
-        if (Status != STATUS_SUCCESS) break;
-        MdBlock++;
-    }
-    
-    /* Return error code */
-    return Status;
-}
-
-VOID
-NTAPI
-ArmInsertMemoryDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor)
-{
-    PLIST_ENTRY ListHead, PreviousEntry, NextEntry;
-    PMEMORY_ALLOCATION_DESCRIPTOR Descriptor = NULL, NextDescriptor = NULL;
-    
-    /* Loop the memory descriptor list */
-    ListHead = &ArmLoaderBlock->MemoryDescriptorListHead;
-    PreviousEntry = ListHead;
-    NextEntry = ListHead->Flink;
-    while (NextEntry != ListHead)
-    {
-        /* Get the current descriptor and check if it's below ours */
-        NextDescriptor = CONTAINING_RECORD(NextEntry,
-                                           MEMORY_ALLOCATION_DESCRIPTOR,
-                                           ListEntry);
-        if (NewDescriptor->BasePage < NextDescriptor->BasePage) break;
-        
-        /* It isn't, save the previous entry and descriptor, and try again */
-        PreviousEntry = NextEntry;
-        Descriptor = NextDescriptor;
-        NextEntry = NextEntry->Flink;
-    }
-    
-    /* So we found the right spot to insert. Is this free memory? */
-    if (NewDescriptor->MemoryType != LoaderFree)
-    {
-        /* It isn't, so insert us before the last descriptor */
-        InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry);
-    }
-    else
-    {
-        /* We're free memory. Check if the entry we found is also free memory */
-        if ((PreviousEntry != ListHead) &&
-            ((Descriptor->MemoryType == LoaderFree) ||
-             (Descriptor->MemoryType == LoaderReserve)) &&
-            ((Descriptor->BasePage + Descriptor->PageCount) ==
-             NewDescriptor->BasePage))
-        {
-            /* It's free memory, and we're right after it. Enlarge that block */
-            Descriptor->PageCount += NewDescriptor->PageCount;
-            NewDescriptor = Descriptor;
-        }
-        else
-        {
-            /* Our range scan't be combined, so just insert us separately */
-            InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry);
-        }
-        
-        /* Check if we merged with an existing free memory block */
-        if ((NextEntry != ListHead) &&
-            ((NextDescriptor->MemoryType == LoaderFree) ||
-             (NextDescriptor->MemoryType == LoaderReserve)) &&
-            ((NewDescriptor->BasePage + NewDescriptor->PageCount) ==
-             NextDescriptor->BasePage))
-        {
-            /* Update our own block */
-            NewDescriptor->PageCount += NextDescriptor->PageCount;
-            
-            /* Remove the next block */
-            RemoveEntryList(&NextDescriptor->ListEntry);
-        }
-    }
-}
-
-NTSTATUS
-NTAPI
-ArmBuildMemoryDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor,
-                         IN MEMORY_TYPE MemoryType,
-                         IN ULONG BasePage,
-                         IN ULONG PageCount)
-{
-    PMEMORY_ALLOCATION_DESCRIPTOR Descriptor, NextDescriptor = NULL;
-    LONG Delta;
-    TYPE_OF_MEMORY CurrentType;
-    BOOLEAN UseNext;
-    
-    /* Check how many pages we'll be consuming */
-    Delta = BasePage - MemoryDescriptor->BasePage;
-    if (!(Delta) && (PageCount == MemoryDescriptor->PageCount))
-    {
-        /* We can simply convert the current descriptor into our new type */
-        MemoryDescriptor->MemoryType = MemoryType;
-    }
-    else
-    {
-        /* Get the current memory type of the descriptor, and reserve it */
-        CurrentType = MemoryDescriptor->MemoryType;
-        MemoryDescriptor->MemoryType = LoaderSpecialMemory;
-        
-        /* Check if we'll need another descriptor for what's left of memory */
-        UseNext = ((BasePage != MemoryDescriptor->BasePage) &&
-                   (Delta + PageCount != MemoryDescriptor->PageCount));
-        
-        /* Get a descriptor */
-        Descriptor = ArmAllocateMemoryDescriptor();
-        if (!Descriptor) return STATUS_INSUFFICIENT_RESOURCES;
-        
-        /* Check if we are using another descriptor */
-        if (UseNext)
-        {
-            /* Allocate that one too */
-            NextDescriptor = ArmAllocateMemoryDescriptor();
-            if (!NextDescriptor) return STATUS_INSUFFICIENT_RESOURCES;
-        }
-        
-        /* Build the descriptor we got */
-        Descriptor->MemoryType = MemoryType;
-        Descriptor->BasePage = BasePage;
-        Descriptor->PageCount = PageCount;
-        
-        /* Check if we're starting at the same place as the old one */
-        if (BasePage == MemoryDescriptor->BasePage)
-        {
-            /* Simply decrease the old descriptor and rebase it */
-            MemoryDescriptor->BasePage += PageCount;
-            MemoryDescriptor->PageCount -= PageCount;
-            MemoryDescriptor->MemoryType = CurrentType;
-        }
-        else if (Delta + PageCount == MemoryDescriptor->PageCount)
-        {
-            /* We finish where the old one did, shorten it */
-            MemoryDescriptor->PageCount -= PageCount;
-            MemoryDescriptor->MemoryType = CurrentType;
-        }
-        else
-        {
-            /* We're inside the current block, mark our free region */
-            NextDescriptor->MemoryType = LoaderFree;
-            NextDescriptor->BasePage = BasePage + PageCount;
-            NextDescriptor->PageCount = MemoryDescriptor->PageCount -
-            (PageCount + Delta);
-            
-            /* And cut down the current descriptor */
-            MemoryDescriptor->PageCount = Delta;
-            MemoryDescriptor->MemoryType = CurrentType;
-            
-            /* Finally, insert our new free descriptor into the list */
-            ArmInsertMemoryDescriptor(NextDescriptor);
-        }
-        
-        /* Insert the descriptor we allocated */
-        ArmInsertMemoryDescriptor(Descriptor);
-    }
-    
-    /* Return success */
-    return STATUS_SUCCESS;
-}
-
-PMEMORY_ALLOCATION_DESCRIPTOR
-NTAPI
-ArmFindMemoryDescriptor(IN ULONG BasePage)
-{
-    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock = NULL;
-    PLIST_ENTRY NextEntry, ListHead;
-    
-    /* Scan the memory descriptor list */
-    ListHead = &ArmLoaderBlock->MemoryDescriptorListHead;
-    NextEntry = ListHead->Flink;
-    while (NextEntry != ListHead)
-    {
-        /* Get the current descriptor */
-        MdBlock = CONTAINING_RECORD(NextEntry,
-                                    MEMORY_ALLOCATION_DESCRIPTOR,
-                                    ListEntry);
-
-        /* Check if it can contain our memory range */
-        if ((MdBlock->BasePage <= BasePage) &&
-            (MdBlock->BasePage + MdBlock->PageCount > BasePage))
-        {
-            /* It can, break out */
-            break;
-        }
-        
-        /* Go to the next descriptor */
-        NextEntry = NextEntry->Flink;
-    }
-    
-    /* Return the descriptor we found, if any */
-    return MdBlock;
-}
-
-NTSTATUS
-NTAPI
-ArmCreateMemoryDescriptor(IN TYPE_OF_MEMORY MemoryType,
-                      IN ULONG BasePage,
-                      IN ULONG PageCount,
-                      IN ULONG Alignment,
-                      OUT PULONG ReturnedBase)
-{
-    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
-    ULONG AlignedBase, AlignedLimit;
-    PMEMORY_ALLOCATION_DESCRIPTOR ActiveMdBlock;
-    ULONG ActiveAlignedBase = 0;
-    PLIST_ENTRY NextEntry, ListHead;
-    
-    /* If no information was given, make some assumptions */
-    if (!Alignment) Alignment = 1;
-    if (!PageCount) PageCount = 1;
-    
-    /* Start looking for a matching descvriptor */
-    do
-    {
-        /* Calculate the limit of the range */
-        AlignedLimit = PageCount + BasePage;
-        
-        /* Find a descriptor that already contains our base address */
-        MdBlock = ArmFindMemoryDescriptor(BasePage);
-        if (MdBlock)
-        {
-            /* If it contains our limit as well, break out early */
-            if ((MdBlock->PageCount + MdBlock->BasePage) >= AlignedLimit) break;
-        }
-        
-        /* Loop the memory list */
-        AlignedBase = 0;
-        ActiveMdBlock = NULL;
-        ListHead = &ArmLoaderBlock->MemoryDescriptorListHead;
-        NextEntry = ListHead->Flink;
-        while (NextEntry != ListHead)
-        {
-            /* Get the current descriptors */
-            MdBlock = CONTAINING_RECORD(NextEntry,
-                                        MEMORY_ALLOCATION_DESCRIPTOR,
-                                        ListEntry);
-            
-            /* Align the base address and our limit */
-            AlignedBase = (MdBlock->BasePage + (Alignment - 1)) &~ Alignment;
-            AlignedLimit = MdBlock->PageCount -
-                           AlignedBase +
-                           MdBlock->BasePage;
-            
-            /* Check if this is a free block that can satisfy us */
-            if ((MdBlock->MemoryType == LoaderFree) &&
-                (AlignedLimit <= MdBlock->PageCount) &&
-                (PageCount <= AlignedLimit))
-            {
-                /* It is, stop searching */
-                ActiveMdBlock = MdBlock;
-                ActiveAlignedBase = AlignedBase;
-                break;
-            }
-            
-            /* Try the next block */
-            NextEntry = NextEntry->Flink;
-        }
-        
-        /* See if we came up with an adequate block */
-        if (ActiveMdBlock)
-        {
-            /* Generate a descriptor in it */
-            *ReturnedBase = AlignedBase;
-            return ArmBuildMemoryDescriptor(ActiveMdBlock,
-                                          MemoryType,
-                                          ActiveAlignedBase,
-                                          PageCount);
-        }
-    } while (TRUE);
-    
-    /* We found a matching block, generate a descriptor with it */
-    *ReturnedBase = BasePage;
-    return ArmBuildMemoryDescriptor(MdBlock, MemoryType, BasePage, PageCount);
-}
-
-NTSTATUS
-NTAPI
-ArmBuildLoaderMemoryList(VOID)
-{
-    PMEMORY_ALLOCATION_DESCRIPTOR Descriptor;
-    MEMORY_DESCRIPTOR *Memory;
-    ULONG i;
-    
-    /* Loop all BIOS Memory Descriptors */
-    for (i = 0; i < NumberDescriptors; i++)
-    {
-        /* Get the current descriptor */
-        Memory = &MDArray[i];
-        
-        /* Allocate an NT Memory Descriptor */
-        Descriptor = ArmAllocateMemoryDescriptor();
-        if (!Descriptor) return ENOMEM;
-        
-        /* Copy the memory type */
-        Descriptor->MemoryType = Memory->MemoryType;
-        if (Memory->MemoryType == MemoryFreeContiguous)
-        {
-            /* Convert this to free */
-            Descriptor->MemoryType = LoaderFree;
-        }
-        else if (Memory->MemoryType == MemorySpecialMemory)
-        {
-            /* Convert this to special memory */
-            Descriptor->MemoryType = LoaderSpecialMemory;
-        }
-        
-        /* Copy the range data */
-        Descriptor->BasePage = Memory->BasePage;
-        Descriptor->PageCount = Memory->PageCount;
-        
-        /* Insert the descriptor */
-        if (Descriptor->PageCount) ArmInsertMemoryDescriptor(Descriptor);
-    }
-    
-    /* All went well */
-    return STATUS_SUCCESS;
-}
-
-#define PFN_SHIFT                   12
-#define LARGE_PFN_SHIFT             20
-
-#define STARTUP_BASE                0xC0000000
-#define HAL_BASE                    0xFFC00000
-#define MMIO_BASE                   0x10000000
-
-#define LowMemPageTableIndex        0
-#define StartupPageTableIndex       (STARTUP_BASE >> PDE_SHIFT)
-#define MmioPageTableIndex          (MMIO_BASE >> PDE_SHIFT)
-#define HalPageTableIndex           (HAL_BASE >> PDE_SHIFT)
-
-/* Converts a Physical Address into a Page Frame Number */
-#define PaToPfn(p)                  ((p) >> PFN_SHIFT)
-#define PaToLargePfn(p)             ((p) >> LARGE_PFN_SHIFT)
-    
-VOID
-ArmSetupPageDirectory(VOID)
-{
-    PPAGE_DIRECTORY_ARM PageDir;
-    ULONG KernelPageTableIndex;
-    //ULONG i;
-    
-    /* Get the Kernel Table Index */
-    KernelPageTableIndex = KernelBase >> PDE_SHIFT;
-    printf("Kernel Base: 0x%p (PDE Index: %lx)\n", KernelBase, KernelPageTableIndex);
-    
-    /* Get the Startup Page Directory */
-    PageDir = (PPAGE_DIRECTORY_ARM)&startup_pagedirectory;
-    printf("Initial Page Directory: 0x%p\n", PageDir);
-    
-    /* Setup the Low Memory PDE as an identity-mapped Large Page (1MB) */
-    ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[LowMemPageTableIndex].LargePage = 1;
-    ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[LowMemPageTableIndex].Accessed = 1;
-    ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[LowMemPageTableIndex].PageFrameNumber = 0;
-    
-    /* Setup the MMIO PDE as two identity mapped large pages -- the kernel will blow these away later */
-    ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex].LargePage = 1;
-    ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex].Accessed = 1;
-    ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex].PageFrameNumber = PaToLargePfn(0x10000000);
-    ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex+1].LargePage = 1;
-    ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex+1].Accessed = 1;
-    ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex+1].PageFrameNumber = PaToLargePfn(0x10100000);
-    printf("Paging init done\n");
-    
-    #if 0
-    ARM_PTE Pte;
-    ULONG i, j;
-    PARM_TRANSLATION_TABLE ArmTable;
-    PARM_COARSE_PAGE_TABLE BootTable, KernelTable, FlatMapTable, MasterTable;
-    
-    //
-    // Get the PDEs that we will use
-    //
-    ArmTable = &ArmTranslationTable;
-    BootTable = &BootTranslationTable;
-    KernelTable = &KernelTranslationTable;
-    FlatMapTable = &FlatMapTranslationTable;
-    MasterTable = &MasterTranslationTable;
-    
-    //
-    // Set the master L1 PDE as the TTB
-    //
-    TtbRegister.AsUlong = (ULONG)ArmTable;
-    ASSERT(TtbRegister.Reserved == 0);
-    KeArmTranslationTableRegisterSet(TtbRegister);
-    
-    //
-    // Use Domain 0, enforce AP bits (client)
-    //
-    DomainRegister.AsUlong = 0;
-    DomainRegister.Domain0 = ClientDomain;
-    KeArmDomainRegisterSet(DomainRegister);
-    
-    //
-    // Set Fault PTEs everywhere
-    //
-    RtlZeroMemory(ArmTable, sizeof(ARM_TRANSLATION_TABLE));
-    
-    //
-    // Identity map the first MB of memory
-    //
-    Pte.L1.Section.Type = SectionPte;
-    Pte.L1.Section.Buffered = FALSE;
-    Pte.L1.Section.Cached = FALSE;
-    Pte.L1.Section.Reserved = 1; // ARM926EJ-S manual recommends setting to 1
-    Pte.L1.Section.Domain = Domain0;
-    Pte.L1.Section.Access = SupervisorAccess;
-    Pte.L1.Section.BaseAddress = 0;
-    Pte.L1.Section.Ignored = Pte.L1.Section.Ignored1 = 0;
-    ArmTable->Pte[0] = Pte;
-    
-    //
-    // Map the page in MMIO space that contains the serial port and timers
-    //
-    Pte.L1.Section.BaseAddress = ArmBoardBlock->UartRegisterBase >> PDE_SHIFT;
-    ArmTable->Pte[UART_VIRTUAL >> PDE_SHIFT] = Pte;
-
-    //
-    // Create template PTE for the coarse page table which maps the PTE_BASE
-    //
-    Pte.L1.Coarse.Type = CoarsePte;
-    Pte.L1.Coarse.Domain = Domain0;
-    Pte.L1.Coarse.Reserved = 1; // ARM926EJ-S manual recommends setting to 1
-    Pte.L1.Coarse.Ignored = Pte.L1.Coarse.Ignored1 = 0;
-    Pte.L1.Coarse.BaseAddress = (ULONG)FlatMapTable >> CPT_SHIFT;
-
-    //
-    // On x86, there is 4MB of space, starting at 0xC0000000 to 0xC0400000
-    // which contains the mappings for each PTE on the system. 4MB is needed
-    // since for 4GB, there will be 1 million PTEs, each of 4KB.
-    //
-    // To describe a 4MB region, on x86, only requires a page table, which can
-    // be linked from the page table directory.
-    //
-    // On the other hand, on ARM, we can only describe 1MB regions, so we need
-    // four times less PTE entries to represent a single mapping (an L2 coarse
-    // page table). This is problematic, because this would only take up 1KB of
-    // space, and we can't have a page that small.
-    //
-    // This means we must:
-    //
-    // - Allocate page tables (in physical memory) with 4KB granularity, instead
-    //   of 1KB (the other 3KB is unused and invalid).
-    //
-    // - "Skip" the other 3KB in the region, because we can't point to another
-    //   coarse page table after just 1KB.
-    //
-    // So 0xC0000000 will be mapped to the page table that maps the range of
-    // 0x00000000 to 0x01000000, while 0xC0001000 till be mapped to the page
-    // table that maps the area from 0x01000000 to 0x02000000, and so on. In
-    // total, this will require 4 million entries, and additionally, because of
-    // the padding, since each 256 entries will be 4KB (instead of 1KB), this
-    // means we'll need 16MB (0xC0000000 to 0xC1000000).
-    //
-    // We call this region the flat-map area
-    //
-    for (i = (PTE_BASE >> PDE_SHIFT); i < ((PTE_BASE + 0x1000000) >> PDE_SHIFT); i++)
-    {
-        //
-        // Write PTE and update the base address (next MB) for the next one
-        //
-        ArmTable->Pte[i] = Pte;
-        Pte.L1.Coarse.BaseAddress += 4;
-    }
-    
-    //
-    // On x86, there is also the region of 0xC0300000 to 0xC03080000 which maps
-    // to the various PDEs on the system. Yes, this overlaps with the above, and
-    // works because of an insidious dark magic (self-mapping the PDE as a PTE).
-    // Unfortunately, this doesn't work on ARM, firstly because the size of a L1
-    // page table is different than from an L2 page table, and secondly, which
-    // is even worse, the format for an L1 page table is different than the one
-    // for an L2 page table -- basically meaning we cannot self-map.
-    //
-    // However, we somewhat emulate this behavior on ARM. This will be expensive
-    // since we manually need to keep track of every page directory added and
-    // add an entry in our flat-map region. We also need to keep track of every
-    // change in the TTB, so that we can update the mappings in our PDE region.
-    //
-    // Note that for us, this region starts at 0xC1000000, after the flat-map
-    // area.
-    //
-    // Finally, to deal with different sizes (1KB page tables, 4KB page size!),
-    // we pad the ARM L2 page tables to make them 4KB, so that each page will
-    // therefore point to an L2 page table.
-    //
-    // This region is a lot easier than the first -- an L1 page table is only
-    // 16KB, so to access any index inside it, we just need 4 pages, since each
-    // page is 4KB... Clearly, there's also no need to pad in this case.
-    //
-    // We'll call this region the master translation area.
-    //
-    Pte.L1.Coarse.BaseAddress = (ULONG)MasterTable >> CPT_SHIFT;
-    ArmTable->Pte[PDE_BASE >> PDE_SHIFT] = Pte;
-
-    //
-    // Now create the template for the coarse page tables which map the first 8MB
-    //
-    Pte.L1.Coarse.BaseAddress = (ULONG)BootTable >> CPT_SHIFT;
-
-    //
-    // Map 0x00000000 - 0x007FFFFF to 0x80000000 - 0x807FFFFF.
-    // This is where the freeldr boot structures are located, and we need them.
-    //
-    for (i = (KSEG0_BASE >> PDE_SHIFT); i < ((KSEG0_BASE + 0x800000) >> PDE_SHIFT); i++)
-    {
-        //
-        // Write PTE and update the base address (next MB) for the next one
-        //
-        ArmTable->Pte[i] = Pte;
-        Pte.L1.Coarse.BaseAddress += 4;
-    }
-    
-    //
-    // Now create the template PTE for the coarse page tables for the next 6MB
-    //
-    Pte.L1.Coarse.BaseAddress = (ULONG)KernelTable >> CPT_SHIFT;
-
-    //
-    // Map 0x00800000 - 0x00DFFFFF to 0x80800000 - 0x80DFFFFF
-    // In this way, the KERNEL_PHYS_ADDR (0x800000) becomes 0x80800000
-    // which is the kernel virtual base address, just like on x86.
-    //
-    ASSERT(KernelBase == 0x80800000);
-    for (i = (KernelBase >> PDE_SHIFT); i < ((KernelBase + 0x600000) >> PDE_SHIFT); i++)
-    {
-        //
-        // Write PTE and update the base address (next MB) for the next one
-        //
-        ArmTable->Pte[i] = Pte;
-        Pte.L1.Coarse.BaseAddress += 4;
-    }
-    
-    //
-    // Now build the template PTE for the pages mapping the first 8MB
-    //
-    Pte.L2.Small.Type = SmallPte;
-    Pte.L2.Small.Buffered = Pte.L2.Small.Cached = 0;
-    Pte.L2.Small.Access0 =
-    Pte.L2.Small.Access1 =
-    Pte.L2.Small.Access2 =
-    Pte.L2.Small.Access3 = SupervisorAccess;
-    Pte.L2.Small.BaseAddress = 0;
-
-    //
-    // Loop each boot coarse page table (i).
-    // Each PDE describes 1MB. We're mapping an area of 8MB, so 8 times.
-    //
-    for (i = 0; i < 8; i++)
-    {
-        //
-        // Loop and set each the PTE (j).
-        // Each PTE describes 4KB. We're mapping an area of 1MB, so 256 times.
-        //
-        for (j = 0; j < (PDE_SIZE / PAGE_SIZE); j++)
-        {
-            //
-            // Write PTE and update the base address (next MB) for the next one
-            //
-            BootTable->Pte[j] = Pte;
-            Pte.L2.Small.BaseAddress++;        
-        }
-        
-        //
-        // Next iteration
-        //
-        BootTable++;
-    }
-    
-    //
-    // Now create the template PTE for the pages mapping the next 6MB
-    //
-    Pte.L2.Small.BaseAddress = (ULONG)KERNEL_BASE_PHYS >> PTE_SHIFT;
-    
-    //
-    // Loop each kernel coarse page table (i).
-    // Each PDE describes 1MB. We're mapping an area of 6MB, so 6 times.
-    //
-    for (i = 0; i < 6; i++)
-    {
-        //
-        // Loop and set each the PTE (j).
-        // Each PTE describes 4KB. We're mapping an area of 1MB, so 256 times.
-        //
-        for (j = 0; j < (PDE_SIZE / PAGE_SIZE); j++)
-        {
-            //
-            // Write PTE and update the base address (next MB) for the next one
-            //
-            KernelTable->Pte[j] = Pte;
-            Pte.L2.Small.BaseAddress++;
-        }
-
-        //
-        // Next iteration
-        //
-        KernelTable++;
-    }
-
-    //
-    // Now we need to create the PTEs for the addresses which have been mapped
-    // already.
-    //
-    // We have allocated 4 page table directories:
-    //
-    // - One for the kernel, 6MB
-    // - One for low-memory FreeLDR, 8MB
-    // - One for identity-mapping below 1MB, 1MB
-    // - And finally, one for the flat-map itself, 16MB
-    // 
-    // - Each MB mapped is a 1KB table, which we'll use a page to reference, so
-    //   we will require 31 pages.
-    //
-   
-    //
-    // For the 0x80000000 region (8MB)
-    //
-    Pte.L2.Small.BaseAddress = (ULONG)&BootTranslationTable >> PTE_SHIFT;
-    FlatMapTable = &(&FlatMapTranslationTable)[0x80000000 >> 28];
-    for (i = 0; i < 8; i++)
-    {
-        //
-        // Point to the page table mapping the next MB
-        //
-        FlatMapTable->Pte[i] = Pte;
-        Pte.L2.Small.BaseAddress++;        
-    }
-    
-    //
-    // For the 0x80800000 region (6MB)
-    //
-    Pte.L2.Small.BaseAddress = (ULONG)&KernelTranslationTable >> PTE_SHIFT;
-    for (i = 8; i < 14; i++)
-    {
-        //
-        // Point to the page table mapping the next MB
-        //
-        FlatMapTable->Pte[i] = Pte;
-        Pte.L2.Small.BaseAddress++;        
-    }
-    
-    //
-    // For the 0xC0000000 region (16MB)
-    //
-    Pte.L2.Small.BaseAddress = (ULONG)&FlatMapTranslationTable >> PTE_SHIFT;
-    FlatMapTable = &(&FlatMapTranslationTable)[0xC0000000 >> 28];
-    for (i = 0; i < 16; i++)
-    {
-        //
-        // Point to the page table mapping the next MB
-        //
-        FlatMapTable->Pte[i] = Pte;
-        Pte.L2.Small.BaseAddress++;        
-    }
-    
-    //
-    // For the 0xC1000000 region (1MB)
-    //
-    Pte.L2.Small.BaseAddress = (ULONG)&MasterTranslationTable >> PTE_SHIFT;
-    FlatMapTable->Pte[16] = Pte;
-    
-    //
-    // Now we handle the master translation area for our PDEs. We'll just make
-    // the 4 page tables point to the ARM TTB.
-    //
-    Pte.L2.Small.BaseAddress = (ULONG)&ArmTranslationTable >> PTE_SHIFT;
-    for (i = 0; i < 4; i++)
-    {
-        //
-        // Point to the page table mapping the next MB
-        //
-        MasterTable->Pte[i] = Pte;
-        Pte.L2.Small.BaseAddress++;        
-    }
-#endif
-}
-
-VOID
-ArmSetupPagingAndJump(IN ULONG Magic)
-{
-    ULONG_PTR PageDirectoryBaseAddress = (ULONG_PTR)&startup_pagedirectory;
-    ARM_CONTROL_REGISTER ControlRegister;
-    ARM_TTB_REGISTER TtbRegister;
-    ARM_DOMAIN_REGISTER DomainRegister;
-    
-    /* Set the TTBR */
-    TtbRegister.AsUlong = PageDirectoryBaseAddress;
-    ASSERT(TtbRegister.Reserved == 0);
-    KeArmTranslationTableRegisterSet(TtbRegister);
-
-    /* Disable domains and simply use access bits on PTEs */
-    DomainRegister.AsUlong = 0;
-    DomainRegister.Domain0 = ClientDomain;
-    KeArmDomainRegisterSet(DomainRegister);
-
-    /* Enable ARMv6+ paging (MMU), caches and the access bit */
-    ControlRegister = KeArmControlRegisterGet();
-    ControlRegister.MmuEnabled = TRUE;
-    ControlRegister.ICacheEnabled = TRUE;
-    ControlRegister.DCacheEnabled = TRUE;
-    ControlRegister.ForceAp = TRUE;
-    ControlRegister.ExtendedPageTables = TRUE;
-    KeArmControlRegisterSet(ControlRegister);
-       
-    /* Jump to Kernel */
-    TuiPrintf("Hello from MMU Enabled!\n");
-    while (TRUE);
-    (*KernelEntryPoint)((PVOID)((ULONG_PTR)ArmLoaderBlock | KSEG0_BASE));
-}
-
-VOID
-ArmPrepareForReactOS(IN BOOLEAN Setup)
-{   
-    ARM_CACHE_REGISTER CacheReg;
-    PVOID Base, MemBase;
-    PCHAR BootPath, HalPath;
-    NTSTATUS Status;
-    ULONG Dummy, i;
-    PLDR_DATA_TABLE_ENTRY LdrEntry;
-    PLIST_ENTRY NextEntry, OldEntry;
-    PARC_DISK_INFORMATION ArcDiskInformation;
-    PARC_DISK_SIGNATURE ArcDiskSignature;
-    ULONG ArcDiskCount = 0;
-#if 0
-    ULONG Checksum = 0;
-    PMASTER_BOOT_RECORD Mbr;
-    PULONG Buffer;
-#endif
-    PWCHAR ArmModuleName;
-
-    //
-    // Allocate the ARM Shared Heap
-    //
-    ArmSharedHeap = MmAllocateMemoryWithType(PAGE_SIZE, LoaderOsloaderHeap);
-    ArmSharedHeapSize = 0;
-    if (!ArmSharedHeap) return;
-    
-    //
-    // Allocate the loader block and extension
-    //
-    ArmLoaderBlock = ArmAllocateFromSharedHeap(sizeof(LOADER_PARAMETER_BLOCK));
-    if (!ArmLoaderBlock) return;
-    ArmExtension = ArmAllocateFromSharedHeap(sizeof(LOADER_PARAMETER_EXTENSION));
-    if (!ArmExtension) return;
-    
-    //
-    // Initialize the loader block
-    //
-    InitializeListHead(&ArmLoaderBlock->BootDriverListHead);
-    InitializeListHead(&ArmLoaderBlock->LoadOrderListHead);
-    InitializeListHead(&ArmLoaderBlock->MemoryDescriptorListHead);
-    
-    //
-    // Setup the extension and setup block
-    //
-    ArmLoaderBlock->Extension = (PVOID)((ULONG_PTR)ArmExtension | KSEG0_BASE);
-    ArmLoaderBlock->SetupLdrBlock = NULL;
-    
-    //
-    // Add the Board Memory Map from U-Boot into the STARTUP.COM-style 
-    // BIOS descriptor format -- this needs to be removed later.
-    //
-    ArmBuildBoardMemoryMap();
-    
-    //
-    // Now basically convert these entries to the ARC format, so that we can
-    // get a good map of free (usable) memory
-    //
-    ArmBuildOsMemoryMap();
-
-    //
-    // NT uses an extended ARC format, with slightly different memory types.
-    // We also want to link the ARC descriptors together into a linked list,
-    // instead of the array, and allocate the semi-permanent storage in which
-    // these entries will be stored so that the kernel can read them.
-    //
-    ArmBuildLoaderMemoryList();
-    
-    //
-    // Setup descriptor for the shared heap
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderOsloaderHeap,
-                                       (ULONG_PTR)ArmSharedHeap >> PAGE_SHIFT,
-                                       ADDRESS_AND_SIZE_TO_SPAN_PAGES(ArmSharedHeap,
-                                                                      ArmSharedHeapSize),
-                                       0,
-                                       &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-
-    //
-    // Setup descriptor for the boot stack
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderOsloaderStack,
-                                       (ULONG_PTR)&BootStack >> PAGE_SHIFT,
-                                       4,
-                                       0,
-                                       &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-#if 0
-    //
-    // Setup descriptor for the boot page tables
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderMemoryData,
-                                       (ULONG_PTR)&TranslationTableStart >> PAGE_SHIFT,
-                                       ((ULONG_PTR)&TranslationTableEnd -
-                                        (ULONG_PTR)&TranslationTableStart) / PAGE_SIZE,
-                                       0,
-                                       &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-#endif
-    //
-    // Setup descriptor for the kernel
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderSystemCode,
-                                       KernelData >> PAGE_SHIFT,
-                                       ADDRESS_AND_SIZE_TO_SPAN_PAGES(KernelData,
-                                                                      KernelSize),
-                                       0,
-                                       &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-    
-    //
-    // Setup descriptor for the HAL
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderHalCode,
-                                       HalData >> PAGE_SHIFT,
-                                       ADDRESS_AND_SIZE_TO_SPAN_PAGES(HalData,
-                                                                      HalSize),
-                                       0,
-                                       &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-    
-    //
-    // Setup registry data
-    //
-    ArmLoaderBlock->RegistryBase = (PVOID)((ULONG_PTR)RegistryData | KSEG0_BASE);
-    ArmLoaderBlock->RegistryLength = RegistrySize;
-    
-    //
-    // Create an MD for it
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderRegistryData,
-                                       RegistryData >> PAGE_SHIFT,
-                                       ADDRESS_AND_SIZE_TO_SPAN_PAGES(RegistryData,
-                                                                      RegistrySize),
-                                       0,
-                                       &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-    
-    //
-    // TODO: Setup ARC Hardware tree data
-    //
-    
-    //
-    // Setup NLS data
-    //
-    ArmNlsDataBlock = ArmAllocateFromSharedHeap(sizeof(NLS_DATA_BLOCK));
-    ArmLoaderBlock->NlsData = ArmNlsDataBlock;
-    ArmLoaderBlock->NlsData->AnsiCodePageData = (PVOID)(AnsiData | KSEG0_BASE);
-    ArmLoaderBlock->NlsData->OemCodePageData = (PVOID)(OemData | KSEG0_BASE);
-    ArmLoaderBlock->NlsData->UnicodeCodePageData = (PVOID)(UnicodeData | KSEG0_BASE);
-    ArmLoaderBlock->NlsData = (PVOID)((ULONG_PTR)ArmLoaderBlock->NlsData | KSEG0_BASE);
-    
-    //
-    // Setup ANSI NLS Memory Descriptor
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderNlsData,
-                                       AnsiData >> PAGE_SHIFT,
-                                       ADDRESS_AND_SIZE_TO_SPAN_PAGES(AnsiData,
-                                                                      AnsiSize),
-                                       0,
-                                       &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-    
-    //
-    // Setup OEM NLS Memory Descriptor
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderNlsData,
-                                       OemData >> PAGE_SHIFT,
-                                       ADDRESS_AND_SIZE_TO_SPAN_PAGES(OemData,
-                                                                      OemSize),
-                                       0,
-                                       &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-    
-    //
-    // Setup Unicode NLS Memory Descriptor
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderNlsData,
-                                       UnicodeData >> PAGE_SHIFT,
-                                       ADDRESS_AND_SIZE_TO_SPAN_PAGES(UnicodeData,
-                                                                      UnicodeSize),
-                                       0,
-                                       &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-    
-    //
-    // Setup loader entry for the kernel
-    //
-    ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR));
-    wcscpy(ArmModuleName, L"ntoskrnl.exe");
-    LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY));
-    RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY));
-    LdrEntry->DllBase = (PVOID)KernelBase;
-    LdrEntry->SizeOfImage = KernelSize;
-    LdrEntry->EntryPoint = KernelEntryPoint;
-    LdrEntry->LoadCount = 1;
-    LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED;
-    RtlInitUnicodeString(&LdrEntry->FullDllName, ArmModuleName);
-    RtlInitUnicodeString(&LdrEntry->BaseDllName, ArmModuleName);
-    LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE);
-    LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE);
-    InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks);
-
-    //
-    // Setup loader entry for the HAL
-    //
-    ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR));
-    wcscpy(ArmModuleName, L"hal.dll");
-    LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY));
-    RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY));
-    LdrEntry->DllBase = (PVOID)(HalData | KSEG0_BASE);
-    LdrEntry->SizeOfImage = HalSize;
-    LdrEntry->EntryPoint = (PVOID)RtlImageNtHeader((PVOID)HalData)->
-                                  OptionalHeader.AddressOfEntryPoint;
-    LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)LdrEntry->EntryPoint | KSEG0_BASE);
-    LdrEntry->LoadCount = 1;
-    LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED;
-    RtlInitUnicodeString(&LdrEntry->FullDllName, ArmModuleName);
-    RtlInitUnicodeString(&LdrEntry->BaseDllName, ArmModuleName);
-    LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE);
-    LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE);
-    InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks);
-    
-    //
-    // Build descriptors for the drivers loaded
-    //
-    for (i = 0; i < Drivers; i++)
-    {
-        //
-        // Setup loader entry for the driver
-        //
-        LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY));
-        RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY));
-        LdrEntry->DllBase = (PVOID)(DriverData[i] | KSEG0_BASE);
-        LdrEntry->SizeOfImage = DriverSize[i];
-        LdrEntry->EntryPoint = (PVOID)RtlImageNtHeader((PVOID)DriverData[i])->
-                                      OptionalHeader.AddressOfEntryPoint;
-        LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)LdrEntry->EntryPoint | KSEG0_BASE);
-        LdrEntry->LoadCount = 1;
-        LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED;
-        ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR));
-        RtlZeroMemory(ArmModuleName, 64 * sizeof(WCHAR));
-        LdrEntry->FullDllName.Length = strlen(DriverName[i]) * sizeof(WCHAR);
-        LdrEntry->FullDllName.MaximumLength = LdrEntry->FullDllName.Length;
-        LdrEntry->FullDllName.Buffer = ArmModuleName;
-        LdrEntry->BaseDllName = LdrEntry->FullDllName;
-        while (*DriverName[i]) *ArmModuleName++ = *DriverName[i]++;
-        LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE);
-        LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE);
-        InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks);
-
-        //
-        // Build a descriptor for the driver
-        //
-        Status = ArmCreateMemoryDescriptor(LoaderBootDriver,
-                                           DriverData[i] >> PAGE_SHIFT,
-                                           ADDRESS_AND_SIZE_TO_SPAN_PAGES(DriverData[i],
-                                                                          DriverSize[i]),
-                                           0,
-                                           &Dummy);
-        if (Status != STATUS_SUCCESS) return;
-    }
-    
-    //
-    // Loop driver list
-    //    
-    NextEntry = ArmLoaderBlock->LoadOrderListHead.Flink;
-    while (NextEntry != &ArmLoaderBlock->LoadOrderListHead)
-    {
-        //
-        // Remember the physical entry
-        //
-        OldEntry = NextEntry->Flink;
-        
-        //
-        // Edit the data
-        //
-        NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE);
-        NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE);
-        
-        //
-        // Keep looping
-        //
-        NextEntry = OldEntry;
-    }
-
-    //
-    // Now edit the root itself
-    //
-    NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE);
-    NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE);
-    
-    //
-    // Setup extension parameters
-    //
-    ArmExtension->Size = sizeof(LOADER_PARAMETER_EXTENSION);
-    ArmExtension->MajorVersion = 5;
-    ArmExtension->MinorVersion = 2;
-    
-    //
-    // Make a copy of the command line
-    //
-    ArmLoaderBlock->LoadOptions = ArmCommandLine;
-    strcpy(ArmCommandLine, reactos_kernel_cmdline);
-    
-    //
-    // Find the first \, separating the ARC path from NT path
-    //
-    BootPath = strchr(ArmCommandLine, '\\');
-    *BootPath = ANSI_NULL;
-    
-    //
-    // Set the ARC Boot Path
-    //
-    strncpy(ArmArcBootPath, ArmCommandLine, 63);
-    ArmLoaderBlock->ArcBootDeviceName = (PVOID)((ULONG_PTR)ArmArcBootPath | KSEG0_BASE);
-    
-    //
-    // The rest of the string is the NT path
-    //
-    HalPath = strchr(BootPath + 1, ' ');
-    *HalPath = ANSI_NULL;
-    ArmNtBootPath[0] = '\\';
-    strncat(ArmNtBootPath, BootPath + 1, 63);
-    strcat(ArmNtBootPath,"\\");
-    ArmLoaderBlock->NtBootPathName = (PVOID)((ULONG_PTR)ArmNtBootPath | KSEG0_BASE);
-    
-    //
-    // Set the HAL paths
-    //
-    strncpy(ArmArcHalPath, ArmArcBootPath, 63);
-    ArmLoaderBlock->ArcHalDeviceName = (PVOID)((ULONG_PTR)ArmArcHalPath | KSEG0_BASE);
-    strcpy(ArmNtHalPath, "\\");
-    ArmLoaderBlock->NtHalPathName = (PVOID)((ULONG_PTR)ArmNtHalPath | KSEG0_BASE);
-    
-    //
-    // Use this new command line
-    //
-    strncpy(ArmLoaderBlock->LoadOptions, HalPath + 2, 255);
-    
-    //
-    // Parse it and change every slash to a space
-    //
-    BootPath = ArmLoaderBlock->LoadOptions;
-    do {if (*BootPath == '/') *BootPath = ' ';} while (*BootPath++);
-
-    //
-    // Fixup command-line pointer
-    //
-    ArmLoaderBlock->LoadOptions = (PVOID)((ULONG_PTR)ArmLoaderBlock->LoadOptions | KSEG0_BASE);
-
-    //
-    // Setup cache information
-    //
-    CacheReg = KeArmCacheRegisterGet();   
-    ArmLoaderBlock->u.Arm.FirstLevelDcacheSize = SizeBits[CacheReg.DSize];
-    ArmLoaderBlock->u.Arm.FirstLevelDcacheFillSize = LenBits[CacheReg.DLength];
-    ArmLoaderBlock->u.Arm.FirstLevelDcacheFillSize <<= 2;
-    ArmLoaderBlock->u.Arm.FirstLevelIcacheSize = SizeBits[CacheReg.ISize];
-    ArmLoaderBlock->u.Arm.FirstLevelIcacheFillSize = LenBits[CacheReg.ILength];
-    ArmLoaderBlock->u.Arm.FirstLevelIcacheFillSize <<= 2;
-    ArmLoaderBlock->u.Arm.SecondLevelDcacheSize =
-    ArmLoaderBlock->u.Arm.SecondLevelDcacheFillSize =
-    ArmLoaderBlock->u.Arm.SecondLevelIcacheSize =
-    ArmLoaderBlock->u.Arm.SecondLevelIcacheFillSize = 0;
-    
-    //
-    // Allocate the Interrupt stack
-    //
-    Base = MmAllocateMemoryWithType(KERNEL_STACK_SIZE, LoaderStartupDpcStack);
-    ArmLoaderBlock->u.Arm.InterruptStack = KSEG0_BASE | (ULONG)Base;
-    ArmLoaderBlock->u.Arm.InterruptStack += KERNEL_STACK_SIZE;
-    
-    //
-    // Build an entry for it
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderStartupDpcStack,
-                                         (ULONG_PTR)Base >> PAGE_SHIFT,
-                                         KERNEL_STACK_SIZE / PAGE_SIZE,
-                                         0,
-                                         &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-        
-    //
-    // Allocate the Kernel Boot stack
-    //
-    Base = MmAllocateMemoryWithType(KERNEL_STACK_SIZE, LoaderStartupKernelStack);
-    ArmLoaderBlock->KernelStack = KSEG0_BASE | (ULONG)Base;
-    ArmLoaderBlock->KernelStack += KERNEL_STACK_SIZE;
-    
-    //
-    // Build an entry for it
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderStartupKernelStack,
-                                         (ULONG_PTR)Base >> PAGE_SHIFT,
-                                         KERNEL_STACK_SIZE / PAGE_SIZE,
-                                         0,
-                                         &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-
-    //
-    // Allocate the Abort stack
-    //
-    Base = MmAllocateMemoryWithType(KERNEL_STACK_SIZE, LoaderStartupPanicStack);
-    ArmLoaderBlock->u.Arm.PanicStack = KSEG0_BASE | (ULONG)Base;
-    ArmLoaderBlock->u.Arm.PanicStack += KERNEL_STACK_SIZE;
-    
-    //
-    // Build an entry for it
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderStartupPanicStack,
-                                         (ULONG_PTR)Base >> PAGE_SHIFT,
-                                         KERNEL_STACK_SIZE / PAGE_SIZE,
-                                         0,
-                                         &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-
-    //
-    // Allocate the PCR/KUSER_SHARED page -- align it to 1MB (we only need 2x4KB)
-    //
-    Base = MmAllocateMemoryWithType(2 * 1024 * 1024, LoaderStartupPcrPage);
-    MemBase = Base;
-    Base = (PVOID)ROUND_UP(Base, 1 * 1024 * 1024);
-    ArmLoaderBlock->u.Arm.PcrPage = (ULONG)Base >> PDE_SHIFT;
-    
-    //
-    // Build an entry for the KPCR and KUSER_SHARED_DATA
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderStartupPcrPage,
-                                         (ULONG_PTR)MemBase >> PAGE_SHIFT,
-                                         (2 * 1024 * 1024) / PAGE_SIZE,
-                                         0,
-                                         &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-    
-    //
-    // Allocate PDR pages -- align them to 1MB (we only need 3x4KB)
-    //
-    Base = MmAllocateMemoryWithType(4 * 1024 * 1024, LoaderStartupPdrPage);
-    MemBase = Base;
-    Base = (PVOID)ROUND_UP(Base, 1 * 1024 * 1024);
-    ArmLoaderBlock->u.Arm.PdrPage = (ULONG)Base >> PDE_SHIFT;
-
-    //
-    // Build an entry for the PDR, PRCB and initial KPROCESS/KTHREAD
-    //
-    Status = ArmCreateMemoryDescriptor(LoaderStartupPdrPage,
-                                         (ULONG_PTR)MemBase >> PAGE_SHIFT,
-                                         (4 * 1024 * 1024) / PAGE_SIZE,
-                                         0,
-                                         &Dummy);
-    if (Status != STATUS_SUCCESS) return;
-
-    //
-    // Set initial PRCB, Thread and Process on the last PDR page
-    //
-    Base = (PVOID)((ULONG)Base + 2 * 1024 * 1024);
-    ArmLoaderBlock->Prcb = KSEG0_BASE | (ULONG)Base;
-    ArmLoaderBlock->Process = ArmLoaderBlock->Prcb + sizeof(KPRCB);
-    ArmLoaderBlock->Thread = ArmLoaderBlock->Process + sizeof(EPROCESS);
-    
-    //
-    // Check if we're booting from RAM disk
-    //
-    if ((gRamDiskBase) && (gRamDiskSize))
-    {
-        //
-        // Allocate a descriptor to describe it
-        //
-        Status = ArmCreateMemoryDescriptor(LoaderXIPRom,
-                                           (ULONG_PTR)gRamDiskBase >> PAGE_SHIFT,
-                                           gRamDiskSize / PAGE_SIZE,
-                                           0,
-                                           &Dummy);
-        if (Status != STATUS_SUCCESS) return;
-    }
-    
-    //
-    // Loop memory list
-    //    
-    NextEntry = ArmLoaderBlock->MemoryDescriptorListHead.Flink;
-    while (NextEntry != &ArmLoaderBlock->MemoryDescriptorListHead)
-    {
-        //
-        // Remember the physical entry
-        //
-        OldEntry = NextEntry->Flink;
-        
-        //
-        // Edit the data
-        //
-        NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE);
-        NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE);
-        
-        //
-        // Keep looping
-        //
-        NextEntry = OldEntry;
-    }
-    
-    //
-    // Now edit the root itself
-    //
-    NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE);
-    NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE);
-    
-    //
-    // Allocate ARC disk structure
-    //
-    ArcDiskInformation = ArmAllocateFromSharedHeap(sizeof(ARC_DISK_INFORMATION));
-    InitializeListHead(&ArcDiskInformation->DiskSignatureListHead);
-    ArmLoaderBlock->ArcDiskInformation = (PVOID)((ULONG_PTR)ArcDiskInformation | KSEG0_BASE);
-    
-#if 0
-    //
-    // Read the MBR
-    //
-    MachDiskReadLogicalSectors(0x49, 0ULL, 1, (PVOID)DISKREADBUFFER);
-    Buffer = (ULONG*)DISKREADBUFFER;
-    Mbr = (PMASTER_BOOT_RECORD)DISKREADBUFFER;
-        
-    //
-    // Calculate the MBR checksum
-    //
-    for (i = 0; i < 128; i++) Checksum += Buffer[i];
-    Checksum = ~Checksum + 1;
-        
-#endif
-    //
-    // Allocate a disk signature and fill it out
-    //
-    ArcDiskSignature = ArmAllocateFromSharedHeap(sizeof(ARC_DISK_SIGNATURE));
-    ArcDiskSignature->Signature = 0xBADAB00B;// Mbr->Signature;
-    ArcDiskSignature->CheckSum = 0xFAB4BEEF; //Checksum;
-    
-    //
-    // Allocare a string for the name and fill it out
-    //
-    ArcDiskSignature->ArcName = ArmAllocateFromSharedHeap(256);
-    sprintf(ArcDiskSignature->ArcName, "multi(0)disk(0)rdisk(%lu)", ArcDiskCount++);
-    ArcDiskSignature->ArcName = (PVOID)((ULONG_PTR)ArcDiskSignature->ArcName | KSEG0_BASE);
-        
-    //
-    // Insert the descriptor into the list
-    //
-    InsertTailList(&ArcDiskInformation->DiskSignatureListHead,
-                   &ArcDiskSignature->ListEntry);
-
-    //
-    // Loop ARC disk list
-    //    
-    NextEntry = ArcDiskInformation->DiskSignatureListHead.Flink;
-    while (NextEntry != &ArcDiskInformation->DiskSignatureListHead)
-    {
-        //
-        // Remember the physical entry
-        //
-        OldEntry = NextEntry->Flink;
-        
-        //
-        // Edit the data
-        //
-        NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE);
-        NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE);
-        
-        //
-        // Keep looping
-        //
-        NextEntry = OldEntry;
-    }
-    
-    //
-    // Now edit the root itself
-    //
-    NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE);
-    NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE);
-}
-
-VOID
-FrLdrStartup(IN ULONG Magic)
-{
-    //
-    // Disable interrupts (already done)
-    //
-
-    //
-    // Set proper CPSR (already done)
-    //
-
-    //
-    // Initialize the page directory
-    //
-    ArmSetupPageDirectory();
-
-    //
-    // Initialize paging and load NTOSKRNL
-    //
-    ArmSetupPagingAndJump(Magic);
-}
index f8979bb..b0b8e27 100644 (file)
@@ -9,73 +9,79 @@
 /* INCLUDES *******************************************************************/
 
 #include <freeldr.h>
-#define RGB565(r, g, b) (((r >> 3) << 11)| ((g >> 2) << 5)| ((b >> 3) << 0))
+#include <internal/arm/intrin_i.h>
 
 /* GLOBALS ********************************************************************/
 
-UCHAR BootStack[0x4000];
-PUCHAR BootStackEnd = &BootStack[0x3FFF];
 PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock;
-ULONG BootDrive, BootPartition;
-VOID ArmPrepareForReactOS(IN BOOLEAN Setup);
-ADDRESS_RANGE ArmBoardMemoryMap[16];
-ULONG ArmBoardMemoryMapRangeCount;
 ULONG gDiskReadBuffer, gFileSysBuffer;
+BOOLEAN ArmHwDetectRan;
+PCONFIGURATION_COMPONENT_DATA RootNode;
+
+ULONG FirstLevelDcacheSize;
+ULONG FirstLevelDcacheFillSize;
+ULONG FirstLevelIcacheSize;
+ULONG FirstLevelIcacheFillSize;
+ULONG SecondLevelDcacheSize;
+ULONG SecondLevelDcacheFillSize;
+ULONG SecondLevelIcacheSize;
+ULONG SecondLevelIcacheFillSize;
+  
+ARC_DISK_SIGNATURE reactos_arc_disk_info;
+ULONG reactos_disk_count;
+CHAR reactos_arc_hardware_data[256];
+
+ULONG SizeBits[] =
+{
+    -1,      // INVALID
+    -1,      // INVALID
+    1 << 12, // 4KB
+    1 << 13, // 8KB
+    1 << 14, // 16KB
+    1 << 15, // 32KB
+    1 << 16, // 64KB
+    1 << 17  // 128KB
+};
+
+ULONG AssocBits[] =
+{
+    -1,      // INVALID
+    -1,      // INVALID
+    4        // 4-way associative
+};
+
+ULONG LenBits[] =
+{
+    -1,      // INVALID
+    -1,      // INVALID
+    8        // 8 words per line (32 bytes)
+};
 
 /* FUNCTIONS ******************************************************************/
 
 VOID
 ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext)
 {
-    ULONG i;
-
-    //
-    // Remember the pointer
-    //
+    /* Remember the pointer */
     ArmBoardBlock = BootContext;
     
-    //
-    // Let's make sure we understand the LLB
-    //
+    /* Let's make sure we understand the LLB */
     ASSERT(ArmBoardBlock->MajorVersion == ARM_BOARD_CONFIGURATION_MAJOR_VERSION);
     ASSERT(ArmBoardBlock->MinorVersion == ARM_BOARD_CONFIGURATION_MINOR_VERSION);
     
-    //
-    // This should probably go away once we support more boards
-    //
+    /* This should probably go away once we support more boards */
     ASSERT((ArmBoardBlock->BoardType == MACH_TYPE_FEROCEON) ||
            (ArmBoardBlock->BoardType == MACH_TYPE_VERSATILE_PB) ||
            (ArmBoardBlock->BoardType == MACH_TYPE_OMAP3_BEAGLE));
 
-    //
-    // Save data required for memory initialization
-    //
-    ArmBoardMemoryMapRangeCount = ArmBoardBlock->MemoryMapEntryCount;
-    ASSERT(ArmBoardMemoryMapRangeCount != 0);
-    ASSERT(ArmBoardMemoryMapRangeCount < 16);
-    for (i = 0; i < ArmBoardMemoryMapRangeCount; i++)
-    {
-        //
-        // Copy each entry
-        //
-        RtlCopyMemory(&ArmBoardMemoryMap[i],
-                      &ArmBoardBlock->MemoryMap[i],
-                      sizeof(ADDRESS_RANGE));
-    }
-
-    //
-    // Call FreeLDR's portable entrypoint with our command-line
-    //
+    /* Call FreeLDR's portable entrypoint with our command-line */
     BootMain(ArmBoardBlock->CommandLine);
 }
 
-BOOLEAN
-ArmDiskNormalizeSystemPath(IN OUT PCHAR SystemPath,
-                           IN unsigned Size)
+VOID
+ArmPrepareForReactOS(IN BOOLEAN Setup)
 {
-    /* Only RAMDISK supported for now */
-    if (!strstr(SystemPath, "ramdisk(0)")) return FALSE;
-    return TRUE;
+    return;
 }
 
 BOOLEAN
@@ -95,28 +101,42 @@ ArmDiskGetBootPath(OUT PCHAR BootPath,
 PCONFIGURATION_COMPONENT_DATA
 ArmHwDetect(VOID)
 {
-    PCONFIGURATION_COMPONENT_DATA RootNode;
+    ARM_CACHE_REGISTER CacheReg;
     
-    //
-    // Create the root node
-    //
+    /* Create the root node */
+    if (ArmHwDetectRan++) return RootNode;
     FldrCreateSystemKey(&RootNode);
     
-    //
-    // TODO:
-    // There's no such thing as "PnP" on embedded hardware.
-    // The boot loader will send us a device tree, similar to ACPI
-    // or OpenFirmware device trees, and we will convert it to ARC.
-    //
+    /*
+     * TODO:
+     * There's no such thing as "PnP" on embedded hardware.
+     * The boot loader will send us a device tree, similar to ACPI
+     * or OpenFirmware device trees, and we will convert it to ARC.
+     */
     
-    //
-    // Register RAMDISK Device
-    //
+    /* Get cache information */
+    CacheReg = KeArmCacheRegisterGet();   
+    FirstLevelDcacheSize = SizeBits[CacheReg.DSize];
+    FirstLevelDcacheFillSize = LenBits[CacheReg.DLength];
+    FirstLevelDcacheFillSize <<= 2;
+    FirstLevelIcacheSize = SizeBits[CacheReg.ISize];
+    FirstLevelIcacheFillSize = LenBits[CacheReg.ILength];
+    FirstLevelIcacheFillSize <<= 2;
+    SecondLevelDcacheSize =
+    SecondLevelDcacheFillSize =
+    SecondLevelIcacheSize =
+    SecondLevelIcacheFillSize = 0;
+    
+    /* Register RAMDISK Device */
     RamDiskInitialize();
     
-    //
-    // Return the root node
-    //
+    /* Fill out the ARC disk block */
+    reactos_arc_disk_info.Signature = 0xBADAB00F;
+    reactos_arc_disk_info.CheckSum = 0xDEADBABE;
+    reactos_arc_disk_info.ArcName = "ramdisk(0)";
+    reactos_disk_count = 1;
+    
+    /* Return the root node */
     return RootNode;
 }
 
@@ -124,34 +144,26 @@ ULONG
 ArmMemGetMemoryMap(OUT PBIOS_MEMORY_MAP BiosMemoryMap,
                    IN ULONG MaxMemoryMapSize)
 {
-    //
-    // Return whatever the board returned to us (CS0 Base + Size and FLASH0)
-    //
-    RtlCopyMemory(BiosMemoryMap,
-                  ArmBoardBlock->MemoryMap,
-                  ArmBoardBlock->MemoryMapEntryCount * sizeof(BIOS_MEMORY_MAP));
+    /* Return whatever the board returned to us (CS0 Base + Size and FLASH0) */
+    memcpy(BiosMemoryMap,
+           ArmBoardBlock->MemoryMap,
+           ArmBoardBlock->MemoryMapEntryCount * sizeof(BIOS_MEMORY_MAP));
     return ArmBoardBlock->MemoryMapEntryCount;
 }
 
 VOID
 MachInit(IN PCCH CommandLine)
 {
-    //
-    // Setup board-specific ARM routines
-    //
+    /* Setup board-specific ARM routines */
     switch (ArmBoardBlock->BoardType)
     {
-        //
-        // Check for Feroceon-base boards
-        //
+        /* Check for Feroceon-base boards */
         case MACH_TYPE_FEROCEON:
             TuiPrintf("Not implemented\n");
             while (TRUE);
             break;
             
-        //
-        // Check for ARM Versatile PB boards
-        //
+        /* Check for ARM Versatile PB boards */
         case MACH_TYPE_VERSATILE_PB:
             
             /* Copy Machine Routines from Firmware Table */
@@ -161,16 +173,7 @@ MachInit(IN PCCH CommandLine)
             MachVtbl.VideoClearScreen = ArmBoardBlock->VideoClearScreen;
             MachVtbl.VideoSetDisplayMode = ArmBoardBlock->VideoSetDisplayMode;
             MachVtbl.VideoGetDisplaySize = ArmBoardBlock->VideoGetDisplaySize;
-            MachVtbl.VideoGetBufferSize = ArmBoardBlock->VideoGetBufferSize;
-            MachVtbl.VideoSetTextCursorPosition = ArmBoardBlock->VideoSetTextCursorPosition;
-            MachVtbl.VideoSetTextCursorPosition = ArmBoardBlock->VideoSetTextCursorPosition;
-            MachVtbl.VideoHideShowTextCursor = ArmBoardBlock->VideoHideShowTextCursor;
             MachVtbl.VideoPutChar = ArmBoardBlock->VideoPutChar;
-            MachVtbl.VideoCopyOffScreenBufferToVRAM = ArmBoardBlock->VideoCopyOffScreenBufferToVRAM;
-            MachVtbl.VideoIsPaletteFixed = ArmBoardBlock->VideoIsPaletteFixed;
-            MachVtbl.VideoSetPaletteColor = ArmBoardBlock->VideoSetPaletteColor;
-            MachVtbl.VideoGetPaletteColor = ArmBoardBlock->VideoGetPaletteColor;
-            MachVtbl.VideoSync = ArmBoardBlock->VideoSync;
             MachVtbl.GetTime = ArmBoardBlock->GetTime;
                         
             /* Setup the disk and file system buffers */
@@ -178,10 +181,10 @@ MachInit(IN PCCH CommandLine)
             gFileSysBuffer = 0x00090000;
             break;
             
-        //
-        // Check for TI OMAP3 boards
-        // For now that means only Beagle, but ZOOM and others should be ok too
-        //
+        /
+         * Check for TI OMAP3 boards
+         * For now that means only Beagle, but ZOOM and others should be ok too
+         */
         case MACH_TYPE_OMAP3_BEAGLE:
             TuiPrintf("Not implemented\n");
             while (TRUE);
@@ -191,22 +194,9 @@ MachInit(IN PCCH CommandLine)
             ASSERT(FALSE);
     }
         
-    //
-    // Setup generic ARM routines for all boards
-    //
+    /* Setup generic ARM routines for all boards */
     MachVtbl.PrepareForReactOS = ArmPrepareForReactOS;
     MachVtbl.GetMemoryMap = ArmMemGetMemoryMap;
     MachVtbl.HwDetect = ArmHwDetect;
-    
-    //
-    // Setup disk I/O routines
-    //
     MachVtbl.DiskGetBootPath = ArmDiskGetBootPath;
-    MachVtbl.DiskNormalizeSystemPath = ArmDiskNormalizeSystemPath;
-    
-    //
-    // We can now print to the console
-    //
-    TuiPrintf("%s for ARM\n", GetFreeLoaderVersionString());
-    TuiPrintf("Bootargs: %s\n\n", CommandLine);
 }
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/halstub.c b/reactos/boot/freeldr/freeldr/arch/i386/halstub.c
new file mode 100644 (file)
index 0000000..02aca2b
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+* PROJECT:         ReactOS Kernel
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            boot/freeldr/freeldr/arch/i386/hal/halstub.c
+* PURPOSE:         I/O Stub HAL Routines
+* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+*/
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+FASTCALL
+xHalIoReadPartitionTable(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONG SectorSize,
+    IN BOOLEAN ReturnRecognizedPartitions,
+    OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
+{
+    return IoReadPartitionTable(DeviceObject,
+                                SectorSize,
+                                ReturnRecognizedPartitions,
+                                PartitionBuffer);
+}
+
+UCHAR
+NTAPI
+xHalVectorToIDTEntry(IN ULONG Vector)
+{
+    /* Return the vector */
+    return Vector;
+}
+
+VOID
+NTAPI
+xHalHaltSystem(VOID)
+{
+    /* Halt execution */
+    while (TRUE);
+}
+
+/* GLOBALS *******************************************************************/
+
+HAL_DISPATCH HalDispatchTable =
+{
+    HAL_DISPATCH_VERSION,
+    (pHalQuerySystemInformation)NULL,
+    (pHalSetSystemInformation)NULL,
+    (pHalQueryBusSlots)NULL,
+    0,
+    (pHalExamineMBR)NULL,
+    (pHalIoAssignDriveLetters)NULL,
+    (pHalIoReadPartitionTable)xHalIoReadPartitionTable,
+    (pHalIoSetPartitionInformation)NULL,
+    (pHalIoWritePartitionTable)NULL,
+    (pHalHandlerForBus)NULL,
+    (pHalReferenceBusHandler)NULL,
+    (pHalReferenceBusHandler)NULL,
+    (pHalInitPnpDriver)NULL,
+    (pHalInitPowerManagement)NULL,
+    (pHalGetDmaAdapter)NULL,
+    (pHalGetInterruptTranslator)NULL,
+    (pHalStartMirroring)NULL,
+    (pHalEndMirroring)NULL,
+    (pHalMirrorPhysicalMemory)NULL,
+    (pHalEndOfBoot)NULL,
+    (pHalMirrorVerify)NULL
+};
+
+HAL_PRIVATE_DISPATCH HalPrivateDispatchTable =
+{
+    HAL_PRIVATE_DISPATCH_VERSION,
+    (pHalHandlerForBus)NULL,
+    (pHalHandlerForConfigSpace)NULL,
+    (pHalLocateHiberRanges)NULL,
+    (pHalRegisterBusHandler)NULL,
+    (pHalSetWakeEnable)NULL,
+    (pHalSetWakeAlarm)NULL,
+    (pHalTranslateBusAddress)NULL,
+    (pHalAssignSlotResources)NULL,
+    (pHalHaltSystem)xHalHaltSystem,
+    (pHalFindBusAddressTranslation)NULL,
+    (pHalResetDisplay)NULL,
+    (pHalAllocateMapRegisters)NULL,
+    (pKdSetupPciDeviceForDebugging)NULL,
+    (pKdReleasePciDeviceForDebugging)NULL,
+    (pKdGetAcpiTablePhase0)NULL,
+    (pKdCheckPowerButton)NULL,
+    (pHalVectorToIDTEntry)xHalVectorToIDTEntry,
+    (pKdMapPhysicalMemory64)NULL,
+    (pKdUnmapVirtualAddress)NULL
+};
index 6b3d7a4..d4654cc 100644 (file)
@@ -433,11 +433,27 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
     ULONGLONG SectorOffset = 0;
     ULONGLONG SectorCount = 0;
     PARTITION_TABLE_ENTRY PartitionTableEntry;
+    GEOMETRY Geometry;
+    EXTENDED_GEOMETRY ExtGeometry;
     CHAR FileName[1];
 
     if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition))
         return EINVAL;
-    SectorSize = (DrivePartition == 0xff ? 2048 : 512);
+
+    ExtGeometry.Size = sizeof(EXTENDED_GEOMETRY);
+    if (DiskGetExtendedDriveParameters(DriveNumber, &ExtGeometry, ExtGeometry.Size))
+    {
+        SectorSize = ExtGeometry.BytesPerSector;
+        SectorCount = ExtGeometry.Sectors;
+    }
+    else if (MachDiskGetDriveGeometry(DriveNumber, &Geometry))
+    {
+        SectorSize = Geometry.BytesPerSector;
+        SectorCount = Geometry.Sectors;
+    }
+    else
+        return EINVAL;
+
     if (DrivePartition != 0xff && DrivePartition != 0)
     {
         if (!DiskGetPartitionEntry(DriveNumber, DrivePartition, &PartitionTableEntry))
@@ -445,10 +461,6 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
         SectorOffset = PartitionTableEntry.SectorCountBeforePartition;
         SectorCount = PartitionTableEntry.PartitionSectorCount;
     }
-    else
-    {
-        SectorCount = 0; /* FIXME */
-    }
 
     Context = MmHeapAlloc(sizeof(DISKCONTEXT));
     if (!Context)
index 70ad27f..c9ae5c4 100644 (file)
@@ -17,7 +17,6 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-#define _NTSYSTEM_
 #include <freeldr.h>
 
 #define NDEBUG
diff --git a/reactos/boot/freeldr/freeldr/arch/i386/ntoskrnl.c b/reactos/boot/freeldr/freeldr/arch/i386/ntoskrnl.c
new file mode 100644 (file)
index 0000000..dcc51ef
--- /dev/null
@@ -0,0 +1,114 @@
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <arch.h>
+
+VOID
+NTAPI
+KeInitializeEvent(
+    IN PRKEVENT Event,
+    IN EVENT_TYPE Type,
+    IN BOOLEAN State)
+{
+}
+
+VOID
+FASTCALL
+KiAcquireSpinLock(
+    IN PKSPIN_LOCK SpinLock)
+{
+}
+
+VOID
+FASTCALL
+KiReleaseSpinLock(
+    IN PKSPIN_LOCK SpinLock)
+{
+}
+
+VOID
+NTAPI
+KeSetTimeIncrement(
+    IN ULONG MaxIncrement,
+    IN ULONG MinIncrement)
+{
+}
+
+NTKERNELAPI
+VOID
+FASTCALL
+IoAssignDriveLetters(
+    IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
+    IN PSTRING NtDeviceName,
+    OUT PUCHAR NtSystemPath,
+    OUT PSTRING NtSystemPathString)
+{
+}
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoSetPartitionInformation(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONG SectorSize,
+    IN ULONG PartitionNumber,
+    IN ULONG PartitionType)
+{
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoWritePartitionTable(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONG SectorSize,
+    IN ULONG SectorsPerTrack,
+    IN ULONG NumberOfHeads,
+    IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer)
+{
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTHALAPI
+VOID
+NTAPI
+KeStallExecutionProcessor(
+    IN ULONG MicroSeconds)
+{
+    REGS Regs;
+    ULONG usec_this;
+
+    // Int 15h AH=86h
+    // BIOS - WAIT (AT,PS)
+    //
+    // AH = 86h
+    // CX:DX = interval in microseconds
+    // Return:
+    // CF clear if successful (wait interval elapsed)
+    // CF set on error or AH=83h wait already in progress
+    // AH = status (see #00496)
+
+    // Note: The resolution of the wait period is 977 microseconds on
+    // many systems because many BIOSes use the 1/1024 second fast
+    // interrupt from the AT real-time clock chip which is available on INT 70;
+    // because newer BIOSes may have much more precise timers available, it is
+    // not possible to use this function accurately for very short delays unless
+    // the precise behavior of the BIOS is known (or found through testing)
+
+    while (MicroSeconds)
+    {
+        usec_this = MicroSeconds;
+
+        if (usec_this > 4000000)
+        {
+            usec_this = 4000000;
+        }
+
+        Regs.b.ah = 0x86;
+        Regs.w.cx = usec_this >> 16;
+        Regs.w.dx = usec_this & 0xffff;
+        Int386(0x15, &Regs, &Regs);
+
+        MicroSeconds -= usec_this;
+    }
+}
index 66797a6..3bc1b79 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _FREELDR_ARCH_COMPAT_H
-#define _FREELDR_ARCH_COMPAT_H
+#pragma once
 
 #define __init
 #define __initdata
@@ -104,5 +103,3 @@ void *ioremap(__u32 phys, __u32 size);
 void iounmap(void *logical);
 
 __u32 GetPVR();
-
-#endif/*_FREELDR_ARCH_COMPAT_H*/
index 710f6ca..ea03fa0 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef FREELDR_ARCH_POWERPC_PREP_H
-#define FREELDR_ARCH_POWERPC_PREP_H
+#pragma once
 
 extern struct _pci_desc pci1_desc;
 extern struct _idectl_desc ide1_desc;
@@ -27,5 +26,3 @@ void vga_setup
 ( PCONFIGURATION_COMPONENT_DATA pci_bus,
   struct _pci_desc *pci_desc, struct _vga_desc *vga_desc,
   int bus, int dev, int fn );
-
-#endif//FREELDR_ARCH_POWERPC_PREP_H
index a83f294..0959de6 100644 (file)
@@ -119,6 +119,12 @@ VOID RunLoader(VOID)
                return;
        }
 
+       // Load additional SCSI driver (if any)
+       if (LoadBootDeviceDriver() != ESUCCESS)
+       {
+               UiMessageBoxCritical("Unable to load additional boot device driver");
+       }
+
        if (!IniFileInitialize())
        {
                UiMessageBoxCritical("Error initializing .ini file");
@@ -218,6 +224,7 @@ VOID RunLoader(VOID)
                IniOpenSection("Operating Systems", &SectionId);
                IniReadSettingByName(SectionId, SectionName, SettingValue, sizeof(SettingValue));
 
+#ifndef _M_ARM
                // Install the drive mapper according to this sections drive mappings
 #ifdef __i386__
                DriveMapMapDrivesInSection(SectionName);
@@ -270,6 +277,9 @@ VOID RunLoader(VOID)
                {
                        LoadAndBootDrive(SectionName);
                }
+#endif
+#else
+        LoadAndBootWindows(SectionName, SettingValue, _WIN32_WINNT_WS03);
 #endif
        }
 
index 3e3697a..0ef92ce 100644 (file)
@@ -18,6 +18,8 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
+#ifndef _M_ARM
 
 #include <freeldr.h>
 
@@ -285,3 +287,5 @@ BOOLEAN Rs232PortInUse(ULONG Base)
     return FALSE;
 #endif
 }
+
+#endif /* not _M_ARM */
index 86a4574..11cdc83 100644 (file)
@@ -21,7 +21,7 @@
 
 #include <debug.h>
 
-#if DBG
+#if DBG && !defined(_M_ARM)
 
 //#define DEBUG_ALL
 //#define DEBUG_INIFILE
@@ -171,6 +171,12 @@ VOID DebugPrintHeader(ULONG Mask)
        case DPRINT_HWDETECT:
            DbgPrint("HWDETECT: ");
                break;
+       case DPRINT_PELOADER:
+           DbgPrint("PELOADER: ");
+               break;
+       case DPRINT_SCSIPORT:
+           DbgPrint("SCSIPORT: ");
+               break;
        default:
            DbgPrint("UNKNOWN: ");
                break;
@@ -192,6 +198,12 @@ VOID DbgPrintMask(ULONG Mask, char *format, ...)
                return;
        }
 
+       // Disable file/line for scsiport messages
+       if (Mask & DPRINT_SCSIPORT)
+       {
+               DebugStartOfLine = FALSE;
+       }
+
        // Print the header if we have started a new line
        if (DebugStartOfLine)
        {
@@ -326,3 +338,22 @@ MsgBoxPrint(const char *Format, ...)
        return 0;
 }
 
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+KeBugCheckEx(
+    IN ULONG  BugCheckCode,
+    IN ULONG_PTR  BugCheckParameter1,
+    IN ULONG_PTR  BugCheckParameter2,
+    IN ULONG_PTR  BugCheckParameter3,
+    IN ULONG_PTR  BugCheckParameter4)
+{
+    char Buffer[70];
+    sprintf(Buffer, "*** STOP: 0x%08lX (0x%08lX, 0x%08lX, 0x%08lX, 0x%08lX)",
+        BugCheckCode, BugCheckParameter1, BugCheckParameter2,
+        BugCheckParameter3, BugCheckParameter4);
+    UiMessageBoxCritical(Buffer);
+    assert(FALSE);
+    for (;;);
+}
index 1ca0a94..16ee1be 100644 (file)
@@ -17,6 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#ifndef _M_ARM
 #include <freeldr.h>
 #include <debug.h>
 
@@ -167,3 +168,5 @@ DiskNormalizeSystemPath(char *SystemPath, unsigned Size)
 
 // This function is in arch/i386/i386disk.c
 //ULONG DiskGetCacheableBlockCount(ULONG DriveNumber)
+
+#endif
index a0198bf..8966e67 100644 (file)
@@ -17,6 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#ifndef _M_ARM
 #include <freeldr.h>
 #include <debug.h>
 
@@ -238,3 +239,153 @@ BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMA
 
        return TRUE;
 }
+
+NTSTATUS
+NTAPI
+IopReadBootRecord(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONGLONG LogicalSectorNumber,
+    IN ULONG SectorSize,
+    OUT PMASTER_BOOT_RECORD BootRecord)
+{
+    ULONG FileId = (ULONG)DeviceObject;
+    LARGE_INTEGER Position;
+    ULONG BytesRead;
+    ULONG Status;
+
+    Position.QuadPart = LogicalSectorNumber * SectorSize;
+    Status = ArcSeek(FileId, &Position, SeekAbsolute);
+    if (Status != ESUCCESS)
+        return STATUS_IO_DEVICE_ERROR;
+
+    Status = ArcRead(FileId, BootRecord, SectorSize, &BytesRead);
+    if (Status != ESUCCESS || BytesRead != SectorSize)
+        return STATUS_IO_DEVICE_ERROR;
+
+    return STATUS_SUCCESS;
+}
+
+BOOLEAN
+NTAPI
+IopCopyPartitionRecord(
+    IN BOOLEAN ReturnRecognizedPartitions,
+    IN ULONG SectorSize,
+    IN PPARTITION_TABLE_ENTRY PartitionTableEntry,
+    OUT PARTITION_INFORMATION *PartitionEntry)
+{
+    BOOLEAN IsRecognized;
+
+    IsRecognized = TRUE; /* FIXME */
+    if (!IsRecognized && ReturnRecognizedPartitions)
+        return FALSE;
+
+    PartitionEntry->StartingOffset.QuadPart = (ULONGLONG)PartitionTableEntry->SectorCountBeforePartition * SectorSize;
+    PartitionEntry->PartitionLength.QuadPart = (ULONGLONG)PartitionTableEntry->PartitionSectorCount * SectorSize;
+    PartitionEntry->HiddenSectors = 0;
+    PartitionEntry->PartitionNumber = 0; /* Will be filled later */
+    PartitionEntry->PartitionType = PartitionTableEntry->SystemIndicator;
+    PartitionEntry->BootIndicator = (PartitionTableEntry->BootIndicator & 0x80) ? TRUE : FALSE;
+    PartitionEntry->RecognizedPartition = IsRecognized;
+    PartitionEntry->RewritePartition = FALSE;
+
+    return TRUE;
+}
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoReadPartitionTable(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONG SectorSize,
+    IN BOOLEAN ReturnRecognizedPartitions,
+    OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
+{
+    PMASTER_BOOT_RECORD MasterBootRecord;
+    PDRIVE_LAYOUT_INFORMATION Partitions;
+    ULONG NbPartitions, i, Size;
+    NTSTATUS ret;
+
+    *PartitionBuffer = NULL;
+
+    if (SectorSize < sizeof(MASTER_BOOT_RECORD))
+        return STATUS_NOT_SUPPORTED;
+
+    MasterBootRecord = ExAllocatePool(NonPagedPool, SectorSize);
+    if (!MasterBootRecord)
+        return STATUS_NO_MEMORY;
+
+    /* Read disk MBR */
+    ret = IopReadBootRecord(DeviceObject, 0, SectorSize, MasterBootRecord);
+    if (!NT_SUCCESS(ret))
+    {
+        ExFreePool(MasterBootRecord);
+        return ret;
+    }
+
+    /* Check validity of boot record */
+    if (MasterBootRecord->MasterBootRecordMagic != 0xaa55)
+    {
+        ExFreePool(MasterBootRecord);
+        return STATUS_NOT_SUPPORTED;
+    }
+
+    /* Count number of partitions */
+    NbPartitions = 0;
+    for (i = 0; i < 4; i++)
+    {
+        NbPartitions++;
+
+        if (MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_EXTENDED ||
+            MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_XINT13_EXTENDED)
+        {
+            /* FIXME: unhandled case; count number of partitions */
+            UNIMPLEMENTED;
+        }
+    }
+
+    if (NbPartitions == 0)
+    {
+        ExFreePool(MasterBootRecord);
+        return STATUS_NOT_SUPPORTED;
+    }
+
+    /* Allocation space to store partitions */
+    Size = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION, PartitionEntry) +
+           NbPartitions * sizeof(PARTITION_INFORMATION);
+    Partitions = ExAllocatePool(NonPagedPool, Size);
+    if (!Partitions)
+    {
+        ExFreePool(MasterBootRecord);
+        return STATUS_NO_MEMORY;
+    }
+
+    /* Count number of partitions */
+    NbPartitions = 0;
+    for (i = 0; i < 4; i++)
+    {
+        if (IopCopyPartitionRecord(ReturnRecognizedPartitions,
+                                   SectorSize,
+                                   &MasterBootRecord->PartitionTable[i],
+                                   &Partitions->PartitionEntry[NbPartitions]))
+        {
+            Partitions->PartitionEntry[NbPartitions].PartitionNumber = NbPartitions + 1;
+            NbPartitions++;
+        }
+
+        if (MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_EXTENDED ||
+            MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_XINT13_EXTENDED)
+        {
+            /* FIXME: unhandled case; copy partitions */
+            UNIMPLEMENTED;
+        }
+    }
+
+    Partitions->PartitionCount = NbPartitions;
+    Partitions->Signature = MasterBootRecord->Signature;
+    ExFreePool(MasterBootRecord);
+
+    *PartitionBuffer = Partitions;
+    return STATUS_SUCCESS;
+}
+
+#endif
diff --git a/reactos/boot/freeldr/freeldr/disk/scsiport.c b/reactos/boot/freeldr/freeldr/disk/scsiport.c
new file mode 100644 (file)
index 0000000..d8d15b1
--- /dev/null
@@ -0,0 +1,1701 @@
+#include <freeldr.h>
+
+#define _SCSIPORT_
+
+#include <ntddk.h>
+#include <srb.h>
+#include <scsi.h>
+#include <ntddscsi.h>
+#include <ntddstor.h>
+#include <ntdddisk.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#define NDEBUG
+#include <debug.h>
+
+#define DPRINTM2(fmt, ...) DPRINTM(DPRINT_SCSIPORT, "(%s:%d) SCSIPORT: " fmt, __FILE__, __LINE__, __VA_ARGS__)
+
+#undef UNIMPLEMENTED
+#define UNIMPLEMENTED DPRINTM2("%s UNIMPLEMENTED\n", __FUNCTION__)
+
+#define SCSI_PORT_NEXT_REQUEST_READY  0x0008
+
+typedef struct
+{
+    PVOID NonCachedExtension;
+
+    ULONG BusNum;
+    ULONG MaxTargedIds;
+
+    ULONG InterruptFlags;
+
+    /* SRB extension stuff */
+    ULONG SrbExtensionSize;
+    PVOID SrbExtensionBuffer;
+
+    IO_SCSI_CAPABILITIES PortCapabilities;
+
+    PHW_INITIALIZE HwInitialize;
+    PHW_STARTIO HwStartIo;
+    PHW_INTERRUPT HwInterrupt;
+    PHW_RESET_BUS HwResetBus;
+
+    /* DMA related stuff */
+    PADAPTER_OBJECT AdapterObject;
+
+    ULONG CommonBufferLength;
+
+    PVOID MiniPortDeviceExtension;
+} SCSI_PORT_DEVICE_EXTENSION, *PSCSI_PORT_DEVICE_EXTENSION;
+
+PSCSI_PORT_DEVICE_EXTENSION ScsiDeviceExtensions[SCSI_MAXIMUM_BUSES];
+
+ULONG
+ntohl(
+    IN ULONG Value)
+{
+    FOUR_BYTE Dest;
+    PFOUR_BYTE Source = (PFOUR_BYTE)&Value;
+
+    Dest.Byte0 = Source->Byte3;
+    Dest.Byte1 = Source->Byte2;
+    Dest.Byte2 = Source->Byte1;
+    Dest.Byte3 = Source->Byte0;
+
+    return Dest.AsULong;
+}
+
+BOOLEAN
+SpiSendSynchronousSrb(
+    IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+    IN PSCSI_REQUEST_BLOCK Srb)
+{
+    BOOLEAN ret;
+
+    ASSERT(!(Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE));
+
+    /* HACK: handle lack of interrupts */
+    while (!(DeviceExtension->InterruptFlags & SCSI_PORT_NEXT_REQUEST_READY))
+    {
+        KeStallExecutionProcessor(100 * 1000);
+        DeviceExtension->HwInterrupt(DeviceExtension->MiniPortDeviceExtension);
+    }
+
+    DeviceExtension->InterruptFlags &= ~SCSI_PORT_NEXT_REQUEST_READY;
+    Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE;
+
+    if (!DeviceExtension->HwStartIo(
+            DeviceExtension->MiniPortDeviceExtension,
+            Srb))
+    {
+        ExFreePool(Srb);
+        return FALSE;
+    }
+
+    /* HACK: handle lack of interrupts */
+    while (Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE)
+    {
+        KeStallExecutionProcessor(100 * 1000);
+        DeviceExtension->HwInterrupt(DeviceExtension->MiniPortDeviceExtension);
+    }
+
+    ret = SRB_STATUS(Srb->SrbStatus) == SRB_STATUS_SUCCESS;
+    ExFreePool(Srb);
+
+    return ret;
+}
+
+typedef struct tagDISKCONTEXT
+{
+    /* Device ID */
+    PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+    ULONG PathId;
+    ULONG TargetId;
+    ULONG Lun;
+
+    /* Device characteristics */
+    ULONG SectorSize;
+    ULONGLONG SectorOffset;
+    ULONGLONG SectorCount;
+    ULONGLONG SectorNumber;
+} DISKCONTEXT;
+
+static LONG DiskClose(ULONG FileId)
+{
+    DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+
+    ExFreePool(Context);
+    return ESUCCESS;
+}
+
+static LONG DiskGetFileInformation(ULONG FileId, FILEINFORMATION* Information)
+{
+    DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+
+    RtlZeroMemory(Information, sizeof(FILEINFORMATION));
+    Information->EndingAddress.QuadPart = Context->SectorCount * Context->SectorSize;
+    Information->CurrentAddress.LowPart = Context->SectorNumber * Context->SectorSize;
+
+    return ESUCCESS;
+}
+
+static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
+{
+    PSCSI_REQUEST_BLOCK Srb;
+    PCDB Cdb;
+    READ_CAPACITY_DATA ReadCapacityBuffer;
+
+    DISKCONTEXT* Context;
+    PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+    ULONG ScsiBus, PathId, TargetId, Lun, Partition, PathSyntax;
+    ULONG SectorSize;
+    ULONGLONG SectorOffset = 0;
+    ULONGLONG SectorCount;
+
+    /* Parse ARC path */
+    if (!DissectArcPath2(Path, &ScsiBus, &TargetId, &Lun, &Partition, &PathSyntax))
+        return EINVAL;
+    if (PathSyntax != 0) /* scsi() format */
+        return EINVAL;
+    DeviceExtension = ScsiDeviceExtensions[ScsiBus];
+    PathId = ScsiBus - DeviceExtension->BusNum;
+
+    /* Get disk capacity and sector size */
+    Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK));
+    if (!Srb)
+        return ENOMEM;
+    RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK));
+    Srb->Length = sizeof(SCSI_REQUEST_BLOCK);
+    Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+    Srb->PathId = PathId;
+    Srb->TargetId = TargetId;
+    Srb->Lun = Lun;
+    Srb->CdbLength = 10;
+    Srb->SrbFlags = SRB_FLAGS_DATA_IN;
+    Srb->DataTransferLength = sizeof(READ_CAPACITY_DATA);
+    Srb->TimeOutValue = 5; /* in seconds */
+    Srb->DataBuffer = &ReadCapacityBuffer;
+    Cdb = (PCDB)Srb->Cdb;
+    Cdb->CDB10.OperationCode = SCSIOP_READ_CAPACITY;
+    if (!SpiSendSynchronousSrb(DeviceExtension, Srb))
+    {
+        return EIO;
+    }
+
+    /* Transform result to host endianness */
+    SectorCount = ntohl(ReadCapacityBuffer.LogicalBlockAddress);
+    SectorSize = ntohl(ReadCapacityBuffer.BytesPerBlock);
+
+    if (Partition != 0)
+    {
+        /* Need to offset start of disk and length */
+        UNIMPLEMENTED;
+        return EIO;
+    }
+
+    Context = ExAllocatePool(PagedPool, sizeof(DISKCONTEXT));
+    if (!Context)
+        return ENOMEM;
+    Context->DeviceExtension = DeviceExtension;
+    Context->PathId = PathId;
+    Context->TargetId = TargetId;
+    Context->Lun = Lun;
+    Context->SectorSize = SectorSize;
+    Context->SectorOffset = SectorOffset;
+    Context->SectorCount = SectorCount;
+    Context->SectorNumber = 0;
+    FsSetDeviceSpecific(*FileId, Context);
+
+    return ESUCCESS;
+}
+
+static LONG DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
+{
+    DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+    PSCSI_REQUEST_BLOCK Srb;
+    PCDB Cdb;
+    ULONG FullSectors, NbSectors;
+    ULONG Lba;
+
+    *Count = 0;
+
+    if (N == 0)
+        return ESUCCESS;
+
+    FullSectors = N / Context->SectorSize;
+    NbSectors = (N + Context->SectorSize - 1) / Context->SectorSize;
+    if (Context->SectorNumber + NbSectors >= Context->SectorCount)
+        return EINVAL;
+    if (FullSectors > 0xffff)
+        return EINVAL;
+
+    /* Read full sectors */
+    Lba = Context->SectorNumber;
+    if (FullSectors > 0)
+    {
+        Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK));
+        if (!Srb)
+            return ENOMEM;
+
+        RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK));
+        Srb->Length = sizeof(SCSI_REQUEST_BLOCK);
+        Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+        Srb->PathId = Context->PathId;
+        Srb->TargetId = Context->TargetId;
+        Srb->Lun = Context->Lun;
+        Srb->CdbLength = 10;
+        Srb->SrbFlags = SRB_FLAGS_DATA_IN;
+        Srb->DataTransferLength = FullSectors * Context->SectorSize;
+        Srb->TimeOutValue = 5; /* in seconds */
+        Srb->DataBuffer = Buffer;
+        Cdb = (PCDB)Srb->Cdb;
+        Cdb->CDB10.OperationCode = SCSIOP_READ;
+        Cdb->CDB10.LogicalUnitNumber = Srb->Lun;
+        Cdb->CDB10.LogicalBlockByte0 = (Lba >> 24) & 0xff;
+        Cdb->CDB10.LogicalBlockByte1 = (Lba >> 16) & 0xff;
+        Cdb->CDB10.LogicalBlockByte2 = (Lba >> 8) & 0xff;
+        Cdb->CDB10.LogicalBlockByte3 = Lba & 0xff;
+        Cdb->CDB10.TransferBlocksMsb = (FullSectors >> 8) & 0xff;
+        Cdb->CDB10.TransferBlocksLsb = FullSectors & 0xff;
+        if (!SpiSendSynchronousSrb(Context->DeviceExtension, Srb))
+        {
+            return EIO;
+        }
+        Buffer = (PUCHAR)Buffer + FullSectors * Context->SectorSize;
+        N -= FullSectors * Context->SectorSize;
+        *Count += FullSectors * Context->SectorSize;
+        Lba += FullSectors;
+    }
+
+    /* Read incomplete last sector */
+    if (N > 0)
+    {
+        PUCHAR Sector;
+
+        Sector = ExAllocatePool(PagedPool, Context->SectorSize);
+        if (!Sector)
+            return ENOMEM;
+
+        Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK));
+        if (!Srb)
+        {
+            ExFreePool(Sector);
+            return ENOMEM;
+        }
+
+        RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK));
+        Srb->Length = sizeof(SCSI_REQUEST_BLOCK);
+        Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+        Srb->PathId = Context->PathId;
+        Srb->TargetId = Context->TargetId;
+        Srb->Lun = Context->Lun;
+        Srb->CdbLength = 10;
+        Srb->SrbFlags = SRB_FLAGS_DATA_IN;
+        Srb->DataTransferLength = Context->SectorSize;
+        Srb->TimeOutValue = 5; /* in seconds */
+        Srb->DataBuffer = Sector;
+        Cdb = (PCDB)Srb->Cdb;
+        Cdb->CDB10.OperationCode = SCSIOP_READ;
+        Cdb->CDB10.LogicalUnitNumber = Srb->Lun;
+        Cdb->CDB10.LogicalBlockByte0 = (Lba >> 24) & 0xff;
+        Cdb->CDB10.LogicalBlockByte1 = (Lba >> 16) & 0xff;
+        Cdb->CDB10.LogicalBlockByte2 = (Lba >> 8) & 0xff;
+        Cdb->CDB10.LogicalBlockByte3 = Lba & 0xff;
+        Cdb->CDB10.TransferBlocksMsb = 0;
+        Cdb->CDB10.TransferBlocksLsb = 1;
+        if (!SpiSendSynchronousSrb(Context->DeviceExtension, Srb))
+        {
+            ExFreePool(Sector);
+            return EIO;
+        }
+        RtlCopyMemory(Buffer, Sector, N);
+        *Count += N;
+        ExFreePool(Sector);
+    }
+
+    return ESUCCESS;
+}
+
+static LONG DiskSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode)
+{
+    DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+
+    if (SeekMode != SeekAbsolute)
+        return EINVAL;
+    if (Position->QuadPart & (Context->SectorSize - 1))
+        return EINVAL;
+
+    Context->SectorNumber = Position->QuadPart / Context->SectorSize;
+    return ESUCCESS;
+}
+
+static const DEVVTBL DiskVtbl = {
+    DiskClose,
+    DiskGetFileInformation,
+    DiskOpen,
+    DiskRead,
+    DiskSeek,
+};
+
+NTSTATUS
+SpiCreatePortConfig(
+    IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+    IN PHW_INITIALIZATION_DATA HwInitData,
+    OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+    IN BOOLEAN ZeroStruct)
+{
+    ULONG Bus;
+
+    /* Zero out the struct if told so */
+    if (ZeroStruct)
+    {
+        /* First zero the portconfig */
+        RtlZeroMemory(ConfigInfo, sizeof(PORT_CONFIGURATION_INFORMATION));
+
+        /* Initialize the struct */
+        ConfigInfo->Length = sizeof(PORT_CONFIGURATION_INFORMATION);
+        ConfigInfo->AdapterInterfaceType = HwInitData->AdapterInterfaceType;
+        ConfigInfo->InterruptMode = Latched;
+        ConfigInfo->DmaChannel = SP_UNINITIALIZED_VALUE;
+        ConfigInfo->DmaPort = SP_UNINITIALIZED_VALUE;
+        ConfigInfo->MaximumTransferLength = SP_UNINITIALIZED_VALUE;
+        ConfigInfo->MaximumNumberOfTargets = SCSI_MAXIMUM_TARGETS_PER_BUS;
+
+        /* Store parameters */
+        ConfigInfo->NeedPhysicalAddresses = HwInitData->NeedPhysicalAddresses;
+        ConfigInfo->MapBuffers = HwInitData->MapBuffers;
+        ConfigInfo->AutoRequestSense = HwInitData->AutoRequestSense;
+        ConfigInfo->ReceiveEvent = HwInitData->ReceiveEvent;
+        ConfigInfo->TaggedQueuing = HwInitData->TaggedQueuing;
+        ConfigInfo->MultipleRequestPerLu = HwInitData->MultipleRequestPerLu;
+
+        /* Get the disk usage */
+        ConfigInfo->AtdiskPrimaryClaimed = FALSE; // FIXME
+        ConfigInfo->AtdiskSecondaryClaimed = FALSE; // FIXME
+
+        /* Initiator bus id is not set */
+        for (Bus = 0; Bus < 8; Bus++)
+            ConfigInfo->InitiatorBusId[Bus] = (CCHAR)SP_UNINITIALIZED_VALUE;
+    }
+
+    ConfigInfo->NumberOfPhysicalBreaks = 17;
+
+    return STATUS_SUCCESS;
+}
+
+VOID
+DDKCDECLAPI
+ScsiDebugPrint(
+    IN ULONG DebugPrintLevel,
+    IN PCCHAR DebugMessage,
+    IN ...)
+{
+    va_list ap;
+    CHAR Buffer[512];
+    ULONG Length;
+
+    if (DebugPrintLevel > 10)
+        return;
+
+    va_start(ap, DebugMessage);
+
+    /* Construct a string */
+    Length = _vsnprintf(Buffer, 512, DebugMessage, ap);
+
+    /* Check if we went past the buffer */
+    if (Length == MAXULONG)
+    {
+        /* Terminate it if we went over-board */
+        Buffer[sizeof(Buffer) - 1] = '\0';
+
+        /* Put maximum */
+        Length = sizeof(Buffer);
+    }
+
+    /* Print the message */
+    DPRINTM(DPRINT_SCSIPORT, "%s", Buffer);
+
+    /* Cleanup */
+    va_end(ap);
+}
+
+VOID
+DDKAPI
+ScsiPortCompleteRequest(
+    IN PVOID HwDeviceExtension,
+    IN UCHAR PathId,
+    IN UCHAR TargetId,
+    IN UCHAR Lun,
+    IN UCHAR SrbStatus)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+#undef ScsiPortConvertPhysicalAddressToUlong
+ULONG
+DDKAPI
+ScsiPortConvertPhysicalAddressToUlong(
+    IN SCSI_PHYSICAL_ADDRESS Address)
+{
+    return Address.LowPart;
+}
+
+SCSI_PHYSICAL_ADDRESS
+DDKAPI
+ScsiPortConvertUlongToPhysicalAddress(
+    IN ULONG UlongAddress)
+{
+    return RtlConvertUlongToLargeInteger(UlongAddress);
+}
+
+VOID
+DDKAPI
+ScsiPortFlushDma(
+    IN PVOID DeviceExtension)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortFreeDeviceBase(
+    IN PVOID HwDeviceExtension,
+    IN PVOID MappedAddress)
+{
+    // Nothing to do
+}
+
+ULONG
+DDKAPI
+ScsiPortGetBusData(
+    IN PVOID DeviceExtension,
+    IN ULONG BusDataType,
+    IN ULONG SystemIoBusNumber,
+    IN ULONG SlotNumber,
+    IN PVOID Buffer,
+    IN ULONG Length)
+{
+    return HalGetBusDataByOffset(BusDataType, SystemIoBusNumber, SlotNumber, Buffer, 0, Length);
+}
+
+PVOID
+DDKAPI
+ScsiPortGetDeviceBase(
+    IN PVOID HwDeviceExtension,
+    IN INTERFACE_TYPE BusType,
+    IN ULONG SystemIoBusNumber,
+    IN SCSI_PHYSICAL_ADDRESS IoAddress,
+    IN ULONG NumberOfBytes,
+    IN BOOLEAN InIoSpace)
+{
+    PHYSICAL_ADDRESS TranslatedAddress;
+    ULONG AddressSpace;
+
+    AddressSpace = (ULONG)InIoSpace;
+    if (HalTranslateBusAddress(BusType,
+                               SystemIoBusNumber,
+                               IoAddress,
+                               &AddressSpace,
+                               &TranslatedAddress) == FALSE)
+    {
+        return NULL;
+    }
+
+    /* I/O space */
+    if (AddressSpace != 0)
+        return (PVOID)TranslatedAddress.u.LowPart;
+
+    // FIXME
+    UNIMPLEMENTED;
+    return (PVOID)IoAddress.LowPart;
+}
+
+PVOID
+DDKAPI
+ScsiPortGetLogicalUnit(
+    IN PVOID HwDeviceExtension,
+    IN UCHAR PathId,
+    IN UCHAR TargetId,
+    IN UCHAR Lun)
+{
+    // FIXME
+    UNIMPLEMENTED;
+    return NULL;
+}
+
+SCSI_PHYSICAL_ADDRESS
+DDKAPI
+ScsiPortGetPhysicalAddress(
+    IN PVOID HwDeviceExtension,
+    IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
+    IN PVOID VirtualAddress,
+    OUT ULONG *Length)
+{
+    PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+    SCSI_PHYSICAL_ADDRESS PhysicalAddress;
+    ULONG BufferLength = 0;
+    ULONG Offset;
+
+    DPRINTM2("ScsiPortGetPhysicalAddress(%p %p %p %p)\n",
+        HwDeviceExtension, Srb, VirtualAddress, Length);
+
+    DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1;
+
+    if (Srb == NULL || Srb->SenseInfoBuffer == VirtualAddress)
+    {
+        /* Simply look it up in the allocated common buffer */
+        Offset = (PUCHAR)VirtualAddress - (PUCHAR)DeviceExtension->SrbExtensionBuffer;
+
+        BufferLength = DeviceExtension->CommonBufferLength - Offset;
+        PhysicalAddress.QuadPart = Offset;
+    }
+    else
+    {
+        /* Nothing */
+        *Length = 0;
+        PhysicalAddress.QuadPart = (LONGLONG)(SP_UNINITIALIZED_VALUE);
+    }
+
+    *Length = BufferLength;
+    return PhysicalAddress;
+}
+
+PSCSI_REQUEST_BLOCK
+DDKAPI
+ScsiPortGetSrb(
+    IN PVOID DeviceExtension,
+    IN UCHAR PathId,
+    IN UCHAR TargetId,
+    IN UCHAR Lun,
+    IN LONG QueueTag)
+{
+    // FIXME
+    UNIMPLEMENTED;
+    return NULL;
+}
+
+NTSTATUS
+SpiAllocateCommonBuffer(
+    IN OUT PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+    IN ULONG NonCachedSize)
+{
+    PVOID CommonBuffer;
+    ULONG CommonBufferLength, BufSize;
+
+    /* If size is 0, set it to 16 */
+    if (!DeviceExtension->SrbExtensionSize)
+        DeviceExtension->SrbExtensionSize = 16;
+
+    /* Calculate size */
+    BufSize = DeviceExtension->SrbExtensionSize;
+
+    /* Round it */
+    BufSize = (BufSize + sizeof(LONGLONG) - 1) & ~(sizeof(LONGLONG) - 1);
+
+    /* Sum up into the total common buffer length, and round it to page size */
+    CommonBufferLength =
+        ROUND_TO_PAGES(NonCachedSize);
+
+    /* Allocate it */
+    if (!DeviceExtension->AdapterObject)
+    {
+        /* From nonpaged pool if there is no DMA */
+        CommonBuffer = ExAllocatePool(NonPagedPool, CommonBufferLength);
+    }
+    else
+    {
+        /* Perform a full request since we have a DMA adapter*/
+        UNIMPLEMENTED;
+        CommonBuffer = NULL;
+    }
+
+    /* Fail in case of error */
+    if (!CommonBuffer)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* Zero it */
+    RtlZeroMemory(CommonBuffer, CommonBufferLength);
+
+    /* Store its size in Device Extension */
+    DeviceExtension->CommonBufferLength = CommonBufferLength;
+
+    /* SrbExtension buffer is located at the beginning of the buffer */
+    DeviceExtension->SrbExtensionBuffer = CommonBuffer;
+
+    /* Non-cached extension buffer is located at the end of
+       the common buffer */
+    if (NonCachedSize)
+    {
+        CommonBufferLength -=  NonCachedSize;
+        DeviceExtension->NonCachedExtension = (PUCHAR)CommonBuffer + CommonBufferLength;
+    }
+    else
+    {
+        DeviceExtension->NonCachedExtension = NULL;
+    }
+
+    return STATUS_SUCCESS;
+}
+
+PVOID
+DDKAPI
+ScsiPortGetUncachedExtension(
+    IN PVOID HwDeviceExtension,
+    IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+    IN ULONG NumberOfBytes)
+{
+    PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+    DEVICE_DESCRIPTION DeviceDescription;
+    ULONG MapRegistersCount;
+    NTSTATUS Status;
+
+    DPRINTM2("ScsiPortGetUncachedExtension(%p %p %lu)\n",
+        HwDeviceExtension, ConfigInfo, NumberOfBytes);
+
+    DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1;
+
+    /* Check for allocated common DMA buffer */
+    if (DeviceExtension->SrbExtensionBuffer != NULL)
+    {
+        return NULL;
+    }
+
+    /* Check for DMA adapter object */
+    if (DeviceExtension->AdapterObject == NULL)
+    {
+        /* Initialize DMA adapter description */
+        RtlZeroMemory(&DeviceDescription, sizeof(DEVICE_DESCRIPTION));
+
+        DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION;
+        DeviceDescription.Master = ConfigInfo->Master;
+        DeviceDescription.ScatterGather = ConfigInfo->ScatterGather;
+        DeviceDescription.DemandMode = ConfigInfo->DemandMode;
+        DeviceDescription.Dma32BitAddresses = ConfigInfo->Dma32BitAddresses;
+        DeviceDescription.BusNumber = ConfigInfo->SystemIoBusNumber;
+        DeviceDescription.DmaChannel = ConfigInfo->DmaChannel;
+        DeviceDescription.InterfaceType = ConfigInfo->AdapterInterfaceType;
+        DeviceDescription.DmaWidth = ConfigInfo->DmaWidth;
+        DeviceDescription.DmaSpeed = ConfigInfo->DmaSpeed;
+        DeviceDescription.MaximumLength = ConfigInfo->MaximumTransferLength;
+        DeviceDescription.DmaPort = ConfigInfo->DmaPort;
+
+        /* Get a DMA adapter object */
+#if 0
+        DeviceExtension->AdapterObject =
+            HalGetAdapter(&DeviceDescription, &MapRegistersCount);
+
+        /* Fail in case of error */
+        if (DeviceExtension->AdapterObject == NULL)
+        {
+            return NULL;
+        }
+#else
+        MapRegistersCount = 0;
+#endif
+
+        /* Set number of physical breaks */
+        if (ConfigInfo->NumberOfPhysicalBreaks != 0 &&
+            MapRegistersCount > ConfigInfo->NumberOfPhysicalBreaks)
+        {
+            DeviceExtension->PortCapabilities.MaximumPhysicalPages =
+                ConfigInfo->NumberOfPhysicalBreaks;
+        }
+        else
+        {
+            DeviceExtension->PortCapabilities.MaximumPhysicalPages = MapRegistersCount;
+        }
+    }
+
+    /* Update Srb extension size */
+    if (DeviceExtension->SrbExtensionSize != ConfigInfo->SrbExtensionSize)
+        DeviceExtension->SrbExtensionSize = ConfigInfo->SrbExtensionSize;
+
+    /* Allocate a common DMA buffer */
+    Status = SpiAllocateCommonBuffer(DeviceExtension, NumberOfBytes);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINTM2("SpiAllocateCommonBuffer() failed with Status = 0x%08X!\n", Status);
+        return NULL;
+    }
+
+    return DeviceExtension->NonCachedExtension;
+}
+
+PVOID
+DDKAPI
+ScsiPortGetVirtualAddress(
+    IN PVOID HwDeviceExtension,
+    IN SCSI_PHYSICAL_ADDRESS PhysicalAddress)
+{
+    // FIXME
+    UNIMPLEMENTED;
+    return NULL;
+}
+
+VOID
+SpiScanDevice(
+    IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+    IN PCHAR ArcName,
+    IN ULONG ScsiBus,
+    IN ULONG TargetId,
+    IN ULONG Lun)
+{
+    ULONG FileId, i;
+    ULONG Status;
+    NTSTATUS ret;
+    struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer;
+    CHAR PartitionName[64];
+
+    /* Register device with partition(0) suffix */
+    sprintf(PartitionName, "%spartition(0)", ArcName);
+    FsRegisterDevice(PartitionName, &DiskVtbl);
+
+    /* Read device partition table */
+    Status = ArcOpen(PartitionName, OpenReadOnly, &FileId);
+    if (Status == ESUCCESS)
+    {
+        ret = HALDISPATCH->HalIoReadPartitionTable((PDEVICE_OBJECT)FileId, 512, FALSE, &PartitionBuffer);
+        if (NT_SUCCESS(ret))
+        {
+            for (i = 0; i < PartitionBuffer->PartitionCount; i++)
+            {
+                if (PartitionBuffer->PartitionEntry[i].PartitionType != PARTITION_ENTRY_UNUSED)
+                {
+                    sprintf(PartitionName, "%spartition(%lu)",
+                            ArcName, PartitionBuffer->PartitionEntry[i].PartitionNumber);
+                    FsRegisterDevice(PartitionName, &DiskVtbl);
+                }
+            }
+            ExFreePool(PartitionBuffer);
+        }
+        ArcClose(FileId);
+    }
+}
+
+VOID
+SpiScanAdapter(
+    IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
+    IN ULONG ScsiBus,
+    IN ULONG PathId)
+{
+    CHAR ArcName[64];
+    PSCSI_REQUEST_BLOCK Srb;
+    PCDB Cdb;
+    INQUIRYDATA InquiryBuffer;
+    ULONG TargetId;
+    ULONG Lun;
+
+    if (!DeviceExtension->HwResetBus(DeviceExtension->MiniPortDeviceExtension, PathId))
+    {
+        return;
+    }
+
+    /* Remember the extension */
+    ScsiDeviceExtensions[ScsiBus] = DeviceExtension;
+
+    for (TargetId = 0; TargetId < DeviceExtension->MaxTargedIds; TargetId++)
+    {
+        Lun = 0;
+        do
+        {
+            DPRINTM2("Scanning SCSI device %d.%d.%d\n",
+                ScsiBus, TargetId, Lun);
+
+            Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK));
+            if (!Srb)
+                break;
+            RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK));
+            Srb->Length = sizeof(SCSI_REQUEST_BLOCK);
+            Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+            Srb->PathId = PathId;
+            Srb->TargetId = TargetId;
+            Srb->Lun = Lun;
+            Srb->CdbLength = 6;
+            Srb->SrbFlags = SRB_FLAGS_DATA_IN;
+            Srb->DataTransferLength = INQUIRYDATABUFFERSIZE;
+            Srb->TimeOutValue = 5; /* in seconds */
+            Srb->DataBuffer = &InquiryBuffer;
+            Cdb = (PCDB)Srb->Cdb;
+            Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY;
+            Cdb->CDB6INQUIRY.LogicalUnitNumber = Srb->Lun;
+            Cdb->CDB6INQUIRY.AllocationLength = Srb->DataTransferLength;
+            if (!SpiSendSynchronousSrb(DeviceExtension, Srb))
+            {
+                /* Don't check next LUNs */
+                break;
+            }
+
+            /* Device exists, create its ARC name */
+            if (InquiryBuffer.RemovableMedia)
+            {
+                sprintf(ArcName, "scsi(%ld)cdrom(%ld)fdisk(%ld)",
+                    ScsiBus, TargetId, Lun);
+                FsRegisterDevice(ArcName, &DiskVtbl);
+            }
+            else
+            {
+                sprintf(ArcName, "scsi(%ld)disk(%ld)rdisk(%ld)",
+                    ScsiBus, TargetId, Lun);
+                /* Now, check if it has partitions */
+                SpiScanDevice(DeviceExtension, ArcName, PathId, TargetId, Lun);
+            }
+
+            /* Check next LUN */
+            Lun++;
+        } while (Lun < SCSI_MAXIMUM_LOGICAL_UNITS);
+    }
+}
+
+VOID
+SpiResourceToConfig(
+    IN PHW_INITIALIZATION_DATA HwInitializationData,
+    IN PCM_FULL_RESOURCE_DESCRIPTOR ResourceDescriptor,
+    IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig)
+{
+    PACCESS_RANGE AccessRange;
+    PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialData;
+    ULONG RangeNumber;
+    ULONG Index;
+
+    RangeNumber = 0;
+
+    /* Loop through all entries */
+    for (Index = 0; Index < ResourceDescriptor->PartialResourceList.Count; Index++)
+    {
+        PartialData = &ResourceDescriptor->PartialResourceList.PartialDescriptors[Index];
+
+        switch (PartialData->Type)
+        {
+        case CmResourceTypePort:
+            /* Copy access ranges */
+            if (RangeNumber < HwInitializationData->NumberOfAccessRanges)
+            {
+                DPRINTM2("Got port at 0x%I64x, len 0x%x\n",
+                    PartialData->u.Port.Start.QuadPart, PartialData->u.Port.Length);
+                AccessRange = &((*(PortConfig->AccessRanges))[RangeNumber]);
+
+                AccessRange->RangeStart = PartialData->u.Port.Start;
+                AccessRange->RangeLength = PartialData->u.Port.Length;
+
+                AccessRange->RangeInMemory = FALSE;
+                RangeNumber++;
+            }
+            break;
+
+        case CmResourceTypeMemory:
+            /* Copy access ranges */
+            if (RangeNumber < HwInitializationData->NumberOfAccessRanges)
+            {
+                DPRINTM2("Got memory at 0x%I64x, len 0x%x\n",
+                    PartialData->u.Memory.Start.QuadPart, PartialData->u.Memory.Length);
+                AccessRange = &((*(PortConfig->AccessRanges))[RangeNumber]);
+
+                AccessRange->RangeStart = PartialData->u.Memory.Start;
+                AccessRange->RangeLength = PartialData->u.Memory.Length;
+
+                AccessRange->RangeInMemory = TRUE;
+                RangeNumber++;
+            }
+            break;
+
+        case CmResourceTypeInterrupt:
+            /* Copy interrupt data */
+            DPRINTM2("Got interrupt level %d, vector %d\n",
+                PartialData->u.Interrupt.Level, PartialData->u.Interrupt.Vector);
+            PortConfig->BusInterruptLevel = PartialData->u.Interrupt.Level;
+            PortConfig->BusInterruptVector = PartialData->u.Interrupt.Vector;
+
+            /* Set interrupt mode accordingly to the resource */
+            if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LATCHED)
+            {
+                PortConfig->InterruptMode = Latched;
+            }
+            else if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE)
+            {
+                PortConfig->InterruptMode = LevelSensitive;
+            }
+            break;
+
+        case CmResourceTypeDma:
+            DPRINTM2("Got DMA channel %d, port %d\n",
+                PartialData->u.Dma.Channel, PartialData->u.Dma.Port);
+            PortConfig->DmaChannel = PartialData->u.Dma.Channel;
+            PortConfig->DmaPort = PartialData->u.Dma.Port;
+            break;
+        }
+    }
+}
+
+BOOLEAN
+SpiGetPciConfigData(
+    IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
+    IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig,
+    IN ULONG BusNumber,
+    IN OUT PPCI_SLOT_NUMBER NextSlotNumber)
+{
+    PCI_COMMON_CONFIG PciConfig;
+    PCI_SLOT_NUMBER SlotNumber;
+    ULONG DataSize;
+    ULONG DeviceNumber;
+    ULONG FunctionNumber;
+    CHAR VendorIdString[8];
+    CHAR DeviceIdString[8];
+    PCM_RESOURCE_LIST ResourceList;
+    NTSTATUS Status;
+
+    RtlZeroMemory(&ResourceList, sizeof(PCM_RESOURCE_LIST));
+    SlotNumber.u.AsULONG = 0;
+
+    /* Loop through all devices */
+    for (DeviceNumber = NextSlotNumber->u.bits.DeviceNumber; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++)
+    {
+        SlotNumber.u.bits.DeviceNumber = DeviceNumber;
+
+        /* Loop through all functions */
+        for (FunctionNumber = NextSlotNumber->u.bits.FunctionNumber; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
+        {
+            SlotNumber.u.bits.FunctionNumber = FunctionNumber;
+
+            /* Get PCI config bytes */
+            DataSize = HalGetBusDataByOffset(
+                PCIConfiguration,
+                BusNumber,
+                SlotNumber.u.AsULONG,
+                &PciConfig,
+                0,
+                sizeof(ULONG));
+
+            /* If result of HalGetBusData is 0, then the bus is wrong */
+            if (DataSize == 0)
+                return FALSE;
+
+            /* If result is PCI_INVALID_VENDORID, then this device has no more
+               "Functions" */
+            if (PciConfig.VendorID == PCI_INVALID_VENDORID)
+                break;
+
+            sprintf(VendorIdString, "%04hx", PciConfig.VendorID);
+            sprintf(DeviceIdString, "%04hx", PciConfig.DeviceID);
+
+            if (_strnicmp(VendorIdString, HwInitializationData->VendorId, HwInitializationData->VendorIdLength) ||
+                _strnicmp(DeviceIdString, HwInitializationData->DeviceId, HwInitializationData->DeviceIdLength))
+            {
+                /* It is not our device */
+                continue;
+            }
+
+            DPRINTM2( "Found device 0x%04hx 0x%04hx at %1lu %2lu %1lu\n",
+                PciConfig.VendorID, PciConfig.DeviceID,
+                BusNumber,
+                SlotNumber.u.bits.DeviceNumber, SlotNumber.u.bits.FunctionNumber);
+
+            Status = HalAssignSlotResources(NULL,
+                                            NULL,
+                                            NULL,
+                                            NULL,
+                                            PCIBus,
+                                            BusNumber,
+                                            SlotNumber.u.AsULONG,
+                                            &ResourceList);
+
+            if (!NT_SUCCESS(Status))
+                break;
+
+            /* Create configuration information */
+            SpiResourceToConfig(HwInitializationData,
+                                ResourceList->List,
+                                PortConfig);
+
+            /* Free the resource list */
+            ExFreePool(ResourceList);
+
+            /* Set dev & fn numbers */
+            NextSlotNumber->u.bits.DeviceNumber = DeviceNumber;
+            NextSlotNumber->u.bits.FunctionNumber = FunctionNumber + 1;
+
+            /* Save the slot number */
+            PortConfig->SlotNumber = SlotNumber.u.AsULONG;
+
+            return TRUE;
+        }
+        NextSlotNumber->u.bits.FunctionNumber = 0;
+    }
+
+    NextSlotNumber->u.bits.DeviceNumber = 0;
+
+    return FALSE;
+}
+
+ULONG
+DDKAPI
+ScsiPortInitialize(
+    IN PVOID Argument1,
+    IN PVOID Argument2,
+    IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
+    IN PVOID HwContext OPTIONAL)
+{
+    PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+    ULONG DeviceExtensionSize;
+    PORT_CONFIGURATION_INFORMATION PortConfig;
+    BOOLEAN Again;
+    BOOLEAN FirstConfigCall = TRUE;
+    PCI_SLOT_NUMBER SlotNumber;
+    NTSTATUS Status;
+
+    if (HwInitializationData->HwInitializationDataSize != sizeof(HW_INITIALIZATION_DATA))
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Check params for validity */
+    if ((HwInitializationData->HwInitialize == NULL) ||
+        (HwInitializationData->HwStartIo == NULL) ||
+        (HwInitializationData->HwInterrupt == NULL) ||
+        (HwInitializationData->HwFindAdapter == NULL) ||
+        (HwInitializationData->HwResetBus == NULL))
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Zero starting slot number */
+    SlotNumber.u.AsULONG = 0;
+
+    while (TRUE)
+    {
+        Again = FALSE;
+
+        DeviceExtensionSize = sizeof(SCSI_PORT_DEVICE_EXTENSION) + HwInitializationData->DeviceExtensionSize;
+        DeviceExtension = MmHeapAlloc(DeviceExtensionSize);
+        if (!DeviceExtension)
+        {
+            return STATUS_NO_MEMORY;
+        }
+        RtlZeroMemory(DeviceExtension, DeviceExtensionSize);
+        DeviceExtension->InterruptFlags = SCSI_PORT_NEXT_REQUEST_READY;
+        DeviceExtension->HwInitialize = HwInitializationData->HwInitialize;
+        DeviceExtension->HwStartIo = HwInitializationData->HwStartIo;
+        DeviceExtension->HwInterrupt = HwInitializationData->HwInterrupt;
+        DeviceExtension->HwResetBus = HwInitializationData->HwResetBus;
+        DeviceExtension->MiniPortDeviceExtension = (PVOID)(DeviceExtension + 1);
+
+        Status = SpiCreatePortConfig(DeviceExtension,
+                                     HwInitializationData,
+                                     &PortConfig,
+                                     FirstConfigCall);
+        if (Status != STATUS_SUCCESS)
+        {
+            MmHeapFree(DeviceExtension);
+            return Status;
+        }
+
+        PortConfig.NumberOfAccessRanges = HwInitializationData->NumberOfAccessRanges;
+        PortConfig.AccessRanges = MmHeapAlloc(sizeof(ACCESS_RANGE) * HwInitializationData->NumberOfAccessRanges);
+        if (!PortConfig.AccessRanges)
+        {
+           MmHeapFree(DeviceExtension);
+           return STATUS_NO_MEMORY;
+        }
+        RtlZeroMemory(PortConfig.AccessRanges, sizeof(ACCESS_RANGE) * HwInitializationData->NumberOfAccessRanges);
+
+        /* Search for matching PCI device */
+        if ((HwInitializationData->AdapterInterfaceType == PCIBus) &&
+            (HwInitializationData->VendorIdLength > 0) &&
+            (HwInitializationData->VendorId != NULL) &&
+            (HwInitializationData->DeviceIdLength > 0) &&
+            (HwInitializationData->DeviceId != NULL))
+        {
+            PortConfig.BusInterruptLevel = 0;
+
+            /* Get PCI device data */
+            DPRINTM2("VendorId '%.*s'  DeviceId '%.*s'\n",
+                HwInitializationData->VendorIdLength,
+                HwInitializationData->VendorId,
+                HwInitializationData->DeviceIdLength,
+                HwInitializationData->DeviceId);
+
+            if (!SpiGetPciConfigData(HwInitializationData,
+                                     &PortConfig,
+                                     0, /* FIXME */
+                                     &SlotNumber))
+            {
+                /* Continue to the next bus, nothing here */
+                MmHeapFree(DeviceExtension);
+                return STATUS_INTERNAL_ERROR;
+            }
+
+            if (!PortConfig.BusInterruptLevel)
+            {
+                /* Bypass this slot, because no interrupt was assigned */
+                MmHeapFree(DeviceExtension);
+                return STATUS_INTERNAL_ERROR;
+            }
+        }
+
+        if (HwInitializationData->HwFindAdapter(
+             DeviceExtension->MiniPortDeviceExtension,
+             HwContext,
+             NULL,
+             NULL,
+             &PortConfig,
+             &Again) != SP_RETURN_FOUND)
+        {
+            MmHeapFree(DeviceExtension);
+            return STATUS_INTERNAL_ERROR;
+        }
+
+        /* Copy all stuff which we ever need from PortConfig to the DeviceExtension */
+        if (PortConfig.MaximumNumberOfTargets > SCSI_MAXIMUM_TARGETS_PER_BUS)
+            DeviceExtension->MaxTargedIds = SCSI_MAXIMUM_TARGETS_PER_BUS;
+        else
+            DeviceExtension->MaxTargedIds = PortConfig.MaximumNumberOfTargets;
+
+        DeviceExtension->BusNum = PortConfig.SystemIoBusNumber;
+
+        DPRINTM2("Adapter found: buses = %d, targets = %d\n",
+                 PortConfig.NumberOfBuses, DeviceExtension->MaxTargedIds);
+
+        /* Initialize adapter */
+        if (!DeviceExtension->HwInitialize(DeviceExtension->MiniPortDeviceExtension))
+        {
+            MmHeapFree(DeviceExtension);
+            return STATUS_INTERNAL_ERROR;
+        }
+
+        /* Scan bus */
+        {
+            ULONG ScsiBus;
+            for (ScsiBus = 0; ScsiBus < PortConfig.NumberOfBuses; ScsiBus++)
+            {
+                SpiScanAdapter(DeviceExtension, PortConfig.SystemIoBusNumber, ScsiBus);
+                PortConfig.SystemIoBusNumber++;
+            }
+        }
+
+        FirstConfigCall = FALSE;
+        if (!Again)
+        {
+            break;
+        }
+    }
+
+    return STATUS_SUCCESS;
+}
+
+VOID
+DDKAPI
+ScsiPortIoMapTransfer(
+    IN PVOID HwDeviceExtension,
+    IN PSCSI_REQUEST_BLOCK Srb,
+    IN PVOID LogicalAddress,
+    IN ULONG Length)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortLogError(
+    IN PVOID HwDeviceExtension,
+    IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
+    IN UCHAR PathId,
+    IN UCHAR TargetId,
+    IN UCHAR Lun,
+    IN ULONG ErrorCode,
+    IN ULONG UniqueId)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortMoveMemory(
+    IN PVOID WriteBuffer,
+    IN PVOID ReadBuffer,
+    IN ULONG Length)
+{
+    RtlMoveMemory(WriteBuffer, ReadBuffer, Length);
+}
+
+VOID
+DDKCDECLAPI
+ScsiPortNotification(
+    IN SCSI_NOTIFICATION_TYPE NotificationType,
+    IN PVOID HwDeviceExtension,
+    IN ...)
+{
+    PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+    PSCSI_REQUEST_BLOCK Srb;
+    va_list ap;
+
+    DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1;
+
+    va_start(ap, HwDeviceExtension);
+
+    switch (NotificationType)
+    {
+        case RequestComplete:
+            /* Mask the SRB as completed */
+            Srb = va_arg(ap, PSCSI_REQUEST_BLOCK);
+            Srb->SrbFlags &= ~SRB_FLAGS_IS_ACTIVE;
+            break;
+
+        case NextRequest:
+            /* Say that device is ready */
+            DeviceExtension->InterruptFlags |= SCSI_PORT_NEXT_REQUEST_READY;
+            break;
+
+        default:
+            // FIXME
+            UNIMPLEMENTED;
+    }
+
+    va_end(ap);
+}
+
+VOID
+DDKAPI
+ScsiPortReadPortBufferUchar(
+    IN PUCHAR Port,
+    OUT PUCHAR Buffer,
+    IN ULONG Count)
+{
+    __inbytestring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortReadPortBufferUlong(
+    IN PULONG Port,
+    OUT PULONG Buffer,
+    IN ULONG Count)
+{
+    __indwordstring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortReadPortBufferUshort(
+    IN PUSHORT Port,
+    OUT PUSHORT Buffer,
+    IN ULONG Count)
+{
+    __inwordstring(H2I(Port), Buffer, Count);
+}
+
+UCHAR
+DDKAPI
+ScsiPortReadPortUchar(
+    IN PUCHAR Port)
+{
+    DPRINTM2("ScsiPortReadPortUchar(%p)\n",
+        Port);
+
+    return READ_PORT_UCHAR(Port);
+}
+
+ULONG
+DDKAPI
+ScsiPortReadPortUlong(
+    IN PULONG Port)
+{
+    return READ_PORT_ULONG(Port);
+}
+
+USHORT
+DDKAPI
+ScsiPortReadPortUshort(
+    IN PUSHORT Port)
+{
+    return READ_PORT_USHORT(Port);
+}
+
+VOID
+DDKAPI
+ScsiPortReadRegisterBufferUchar(
+    IN PUCHAR Register,
+    IN PUCHAR Buffer,
+    IN ULONG Count)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortReadRegisterBufferUlong(
+    IN PULONG Register,
+    IN PULONG Buffer,
+    IN ULONG Count)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortReadRegisterBufferUshort(
+    IN PUSHORT Register,
+    IN PUSHORT Buffer,
+    IN ULONG Count)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+UCHAR
+DDKAPI
+ScsiPortReadRegisterUchar(
+    IN PUCHAR Register)
+{
+    return READ_REGISTER_UCHAR(Register);
+}
+
+ULONG
+DDKAPI
+ScsiPortReadRegisterUlong(
+    IN PULONG Register)
+{
+    return READ_REGISTER_ULONG(Register);
+}
+
+USHORT
+DDKAPI
+ScsiPortReadRegisterUshort(
+    IN PUSHORT Register)
+{
+    return READ_REGISTER_USHORT(Register);
+}
+
+ULONG
+DDKAPI
+ScsiPortSetBusDataByOffset(
+    IN PVOID DeviceExtension,
+    IN ULONG BusDataType,
+    IN ULONG SystemIoBusNumber,
+    IN ULONG SlotNumber,
+    IN PVOID Buffer,
+    IN ULONG Offset,
+    IN ULONG Length)
+{
+    // FIXME
+    UNIMPLEMENTED;
+    return 0;
+}
+
+VOID
+DDKAPI
+ScsiPortStallExecution(
+    IN ULONG Delay)
+{
+    KeStallExecutionProcessor(Delay);
+}
+
+BOOLEAN
+DDKAPI
+ScsiPortValidateRange(
+    IN PVOID HwDeviceExtension,
+    IN INTERFACE_TYPE BusType,
+    IN ULONG SystemIoBusNumber,
+    IN SCSI_PHYSICAL_ADDRESS IoAddress,
+    IN ULONG NumberOfBytes,
+    IN BOOLEAN InIoSpace)
+{
+    // FIXME
+    UNIMPLEMENTED;
+    return TRUE;
+}
+
+#if 0
+// ScsiPortWmi*
+#endif
+
+
+VOID
+DDKAPI
+ScsiPortWritePortBufferUchar(
+    IN PUCHAR Port,
+    IN PUCHAR Buffer,
+    IN ULONG Count)
+{
+    __outbytestring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortBufferUlong(
+    IN PULONG Port,
+    IN PULONG Buffer,
+    IN ULONG Count)
+{
+    __outdwordstring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortBufferUshort(
+    IN PUSHORT Port,
+    IN PUSHORT Buffer,
+    IN ULONG Count)
+{
+    __outwordstring(H2I(Port), Buffer, Count);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortUchar(
+    IN PUCHAR Port,
+    IN UCHAR Value)
+{
+    WRITE_PORT_UCHAR(Port, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortUlong(
+    IN PULONG Port,
+    IN ULONG Value)
+{
+    WRITE_PORT_ULONG(Port, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWritePortUshort(
+    IN PUSHORT Port,
+    IN USHORT Value)
+{
+    WRITE_PORT_USHORT(Port, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterBufferUchar(
+    IN PUCHAR Register,
+    IN PUCHAR Buffer,
+    IN ULONG Count)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterBufferUlong(
+    IN PULONG Register,
+    IN PULONG Buffer,
+    IN ULONG Count)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterBufferUshort(
+    IN PUSHORT Register,
+    IN PUSHORT Buffer,
+    IN ULONG Count)
+{
+    // FIXME
+    UNIMPLEMENTED;
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterUchar(
+    IN PUCHAR Register,
+    IN ULONG Value)
+{
+    WRITE_REGISTER_UCHAR(Register, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterUlong(
+    IN PULONG Register,
+    IN ULONG Value)
+{
+    WRITE_REGISTER_ULONG(Register, Value);
+}
+
+VOID
+DDKAPI
+ScsiPortWriteRegisterUshort(
+    IN PUSHORT Register,
+    IN USHORT Value)
+{
+    WRITE_REGISTER_USHORT(Register, Value);
+}
+
+ULONG
+LoadBootDeviceDriver(VOID)
+{
+    struct
+    {
+        CHAR* Name;
+        PVOID Function;
+    } ExportTable[] = 
+    {
+        { "ScsiDebugPrint", ScsiDebugPrint },
+        { "ScsiPortCompleteRequest", ScsiPortCompleteRequest },
+        { "ScsiPortConvertPhysicalAddressToUlong", ScsiPortConvertPhysicalAddressToUlong },
+        { "ScsiPortConvertUlongToPhysicalAddress", ScsiPortConvertUlongToPhysicalAddress },
+        { "ScsiPortFlushDma", ScsiPortFlushDma },
+        { "ScsiPortFreeDeviceBase", ScsiPortFreeDeviceBase },
+        { "ScsiPortGetBusData", ScsiPortGetBusData },
+        { "ScsiPortGetDeviceBase", ScsiPortGetDeviceBase },
+        { "ScsiPortGetLogicalUnit", ScsiPortGetLogicalUnit },
+        { "ScsiPortGetPhysicalAddress", ScsiPortGetPhysicalAddress },
+        { "ScsiPortGetSrb", ScsiPortGetSrb },
+        { "ScsiPortGetUncachedExtension", ScsiPortGetUncachedExtension },
+        { "ScsiPortGetVirtualAddress", ScsiPortGetVirtualAddress },
+        { "ScsiPortInitialize", ScsiPortInitialize },
+        { "ScsiPortIoMapTransfer", ScsiPortIoMapTransfer },
+        { "ScsiPortLogError", ScsiPortLogError },
+        { "ScsiPortMoveMemory", ScsiPortMoveMemory },
+        { "ScsiPortNotification", ScsiPortNotification },
+        { "ScsiPortReadPortBufferUchar", ScsiPortReadPortBufferUchar },
+        { "ScsiPortReadPortBufferUlong", ScsiPortReadPortBufferUlong },
+        { "ScsiPortReadPortBufferUshort", ScsiPortReadPortBufferUshort },
+        { "ScsiPortReadPortUchar", ScsiPortReadPortUchar },
+        { "ScsiPortReadPortUlong", ScsiPortReadPortUlong },
+        { "ScsiPortReadPortUshort", ScsiPortReadPortUshort },
+        { "ScsiPortReadRegisterBufferUchar", ScsiPortReadRegisterBufferUchar },
+        { "ScsiPortReadRegisterBufferUlong", ScsiPortReadRegisterBufferUlong },
+        { "ScsiPortReadRegisterBufferUshort", ScsiPortReadRegisterBufferUshort },
+        { "ScsiPortReadRegisterUchar", ScsiPortReadRegisterUchar },
+        { "ScsiPortReadRegisterUlong", ScsiPortReadRegisterUlong },
+        { "ScsiPortReadRegisterUshort", ScsiPortReadRegisterUshort },
+        { "ScsiPortSetBusDataByOffset", ScsiPortSetBusDataByOffset },
+        { "ScsiPortStallExecution", ScsiPortStallExecution },
+        { "ScsiPortValidateRange", ScsiPortValidateRange },
+        { "ScsiPortWritePortBufferUchar", ScsiPortWritePortBufferUchar },
+        { "ScsiPortWritePortBufferUlong", ScsiPortWritePortBufferUlong },
+        { "ScsiPortWritePortBufferUshort", ScsiPortWritePortBufferUshort },
+        { "ScsiPortWritePortUchar", ScsiPortWritePortUchar },
+        { "ScsiPortWritePortUlong", ScsiPortWritePortUlong },
+        { "ScsiPortWritePortUshort", ScsiPortWritePortUshort },
+        { "ScsiPortWriteRegisterBufferUchar", ScsiPortWriteRegisterBufferUchar },
+        { "ScsiPortWriteRegisterBufferUlong", ScsiPortWriteRegisterBufferUlong },
+        { "ScsiPortWriteRegisterBufferUshort", ScsiPortWriteRegisterBufferUshort },
+        { "ScsiPortWriteRegisterUchar", ScsiPortWriteRegisterUchar },
+        { "ScsiPortWriteRegisterUlong", ScsiPortWriteRegisterUlong },
+        { "ScsiPortWriteRegisterUshort", ScsiPortWriteRegisterUshort },
+    };
+    IMAGE_DOS_HEADER ImageDosHeader;
+    IMAGE_NT_HEADERS ImageNtHeaders;
+    IMAGE_EXPORT_DIRECTORY ImageExportDirectory;
+    CHAR* TableName[sizeof(ExportTable) / sizeof(ExportTable[0])];
+    USHORT OrdinalTable[sizeof(ExportTable) / sizeof(ExportTable[0])];
+    ULONG FunctionTable[sizeof(ExportTable) / sizeof(ExportTable[0])];
+
+    PIMAGE_NT_HEADERS NtHeaders;
+    LOADER_PARAMETER_BLOCK LoaderBlock;
+    PIMAGE_IMPORT_DESCRIPTOR ImportTable;
+    ULONG ImportTableSize;
+    PLDR_DATA_TABLE_ENTRY BootDdDTE, FreeldrDTE;
+    CHAR NtBootDdPath[MAX_PATH];
+    PVOID ImageBase;
+    ULONG (NTAPI *EntryPoint)(IN PVOID DriverObject, IN PVOID RegistryPath);
+    ULONG i;
+    BOOLEAN Status;
+
+    /* Some initialization of our temporary loader block */
+    RtlZeroMemory(&LoaderBlock, sizeof(LOADER_PARAMETER_BLOCK));
+    InitializeListHead(&LoaderBlock.LoadOrderListHead);
+
+    /* Create our fake executable header for freeldr.sys */
+    RtlZeroMemory(&ImageDosHeader, sizeof(IMAGE_DOS_HEADER));
+    RtlZeroMemory(&ImageNtHeaders, sizeof(IMAGE_NT_HEADERS));
+    RtlZeroMemory(&ImageExportDirectory, sizeof(IMAGE_EXPORT_DIRECTORY));
+    ImageDosHeader.e_magic = SWAPW(IMAGE_DOS_SIGNATURE);
+    ImageDosHeader.e_lfanew = SWAPD((ULONG_PTR)&ImageNtHeaders - (ULONG_PTR)&ImageDosHeader);
+    ImageNtHeaders.Signature = IMAGE_NT_SIGNATURE;
+    ImageNtHeaders.OptionalHeader.NumberOfRvaAndSizes = SWAPD(IMAGE_DIRECTORY_ENTRY_EXPORT + 1);
+    ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = 
+        SWAPW((ULONG_PTR)&ImageExportDirectory - (ULONG_PTR)&ImageDosHeader);
+    ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = 1;
+    ImageExportDirectory.NumberOfNames = sizeof(ExportTable) / sizeof(ExportTable[0]);
+    ImageExportDirectory.AddressOfNames = (ULONG_PTR)TableName - (ULONG_PTR)&ImageDosHeader;
+    ImageExportDirectory.AddressOfNameOrdinals = (ULONG_PTR)OrdinalTable - (ULONG_PTR)&ImageDosHeader;
+    ImageExportDirectory.NumberOfFunctions = sizeof(ExportTable) / sizeof(ExportTable[0]);
+    ImageExportDirectory.AddressOfFunctions = (ULONG_PTR)FunctionTable - (ULONG_PTR)&ImageDosHeader;
+
+    /* Fill freeldr.sys export table */
+    for (i = 0; i < sizeof(ExportTable) / sizeof(ExportTable[0]); i++)
+    {
+        TableName[i] = PaToVa((PVOID)((ULONG_PTR)ExportTable[i].Name - (ULONG_PTR)&ImageDosHeader));
+        OrdinalTable[i] = i;
+        FunctionTable[i] = (ULONG)((ULONG_PTR)ExportTable[i].Function - (ULONG_PTR)&ImageDosHeader);
+    }
+
+    /* Add freeldr.sys to list of loaded executables */
+    RtlZeroMemory(FreeldrDTE, sizeof(LDR_DATA_TABLE_ENTRY));
+    Status = WinLdrAllocateDataTableEntry(&LoaderBlock, "scsiport.sys",
+        "FREELDR.SYS", &ImageDosHeader, &FreeldrDTE);
+    if (!Status)
+        return EIO;
+
+    /* Create full ntbootdd.sys path */
+    MachDiskGetBootPath(NtBootDdPath, sizeof(NtBootDdPath));
+    strcat(NtBootDdPath, "\\NTBOOTDD.SYS");
+
+    /* Load file */
+    Status = WinLdrLoadImage(NtBootDdPath, LoaderBootDriver, &ImageBase);
+    if (!Status)
+    {
+        /* That's OK. File simply doesn't exist */
+        return ESUCCESS;
+    }
+
+    /* Fix imports */
+    Status = WinLdrAllocateDataTableEntry(&LoaderBlock, "ntbootdd.sys",
+        "NTBOOTDD.SYS", ImageBase, &BootDdDTE);
+    if (!Status)
+        return EIO;
+    Status = WinLdrScanImportDescriptorTable(&LoaderBlock, "", BootDdDTE);
+    if (!Status)
+        return EIO;
+
+    /* Change imports to PA */
+    ImportTable = (PIMAGE_IMPORT_DESCRIPTOR)RtlImageDirectoryEntryToData(VaToPa(BootDdDTE->DllBase),
+        TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ImportTableSize);
+    for (;(ImportTable->Name != 0) && (ImportTable->FirstThunk != 0);ImportTable++)
+    {
+        PIMAGE_THUNK_DATA ThunkData = (PIMAGE_THUNK_DATA)VaToPa(RVA(BootDdDTE->DllBase, ImportTable->FirstThunk));
+
+        while (((PIMAGE_THUNK_DATA)ThunkData)->u1.AddressOfData != 0)
+        {
+            ThunkData->u1.Function = (ULONG)VaToPa((PVOID)ThunkData->u1.Function);
+            ThunkData++;
+        }
+    }
+
+    /* Relocate image to PA */
+    NtHeaders = RtlImageNtHeader(VaToPa(BootDdDTE->DllBase));
+    if (!NtHeaders)
+        return EIO;
+    Status = LdrRelocateImageWithBias(
+        VaToPa(BootDdDTE->DllBase),
+        NtHeaders->OptionalHeader.ImageBase - (ULONG_PTR)BootDdDTE->DllBase,
+        "FreeLdr",
+        TRUE,
+        TRUE, /* in case of conflict still return success */
+        FALSE);
+    if (!Status)
+        return EIO;
+
+    /* Call the entrypoint */
+    EntryPoint = VaToPa(BootDdDTE->EntryPoint);
+    (*EntryPoint)(NULL, NULL);
+
+    return ESUCCESS;
+}
+
+/* EOF */
index 3fa9b47..5761ed9 100644 (file)
@@ -20,6 +20,9 @@
 #include <freeldr.h>
 #include <debug.h>
 
+VOID NTAPI HalpInitializePciStubs(VOID);
+VOID NTAPI HalpInitBusHandler(VOID);
+
 VOID BootMain(LPSTR CmdLine)
 {
        CmdLineParse(CmdLine);
@@ -44,5 +47,7 @@ VOID BootMain(LPSTR CmdLine)
                return;
        }
 
+       HalpInitializePciStubs();
+       HalpInitBusHandler();
        RunLoader();
 }
index dc83aaa..b513dab 100644 (file)
@@ -7,6 +7,7 @@
                        <library>freeldr_startup</library>
                        <library>freeldr_base64k</library>
                        <library>freeldr_base</library>
+                       <library>mini_hal</library>
                        <library>freeldr_arch</library>
                        <library>freeldr_main</library>
                        <library>rossym</library>
index 8d8287b..05ca7b3 100644 (file)
@@ -6,20 +6,9 @@
        <include base="ntoskrnl">include</include>
        <include base="ReactOS">include/reactos/libs</include>
        <include base="ReactOS">include/reactos/elf</include>
+       <define name="_BLDR_" />
        <define name="_NTHAL_" />
-       <group compilerset="gcc">
-               <compilerflag>-fno-inline</compilerflag>
-               <compilerflag>-fno-zero-initialized-in-bss</compilerflag>
-       </group>
-
-       <if property="ARCH" value="arm">
-               <group compilerset="gcc">
-                       <compilerflag>-ffreestanding</compilerflag>
-                       <compilerflag>-fno-builtin</compilerflag>
-                       <compilerflag>-Os</compilerflag>
-               </group>
-       </if>
-
+       <define name="_NTSYSTEM_" />
        <directory name="arch">
                <directory name="i386">
                        <if property="ARCH" value="i386">
@@ -27,6 +16,7 @@
                                <file>archmach.c</file>
                                <file>custom.c</file>
                                <file>drivemap.c</file>
+                               <file>halstub.c</file>
                                <file>hardware.c</file>
                                <file>hwacpi.c</file>
                                <file>hwapm.c</file>
@@ -37,6 +27,7 @@
                                <file>loader.c</file>
                                <file>machpc.c</file>
                                <file>miscboot.c</file>
+                               <file>ntoskrnl.c</file>
                                <file>pccons.c</file>
                                <file>pcdisk.c</file>
                                <file>pcmem.c</file>
@@ -73,7 +64,6 @@
                <directory name="arm">
                        <if property="ARCH" value="arm">
                                <file first="true">boot.s</file>
-                               <file>loader.c</file>
                                <file>macharm.c</file>
                        </if>
                </directory>
        </directory>
 
        <directory name="windows">
+       <if property="ARCH" value="arm">
+               <directory name="arm">
+                       <file>wlmemory.c</file>
+               </directory>
+       </if>
                <if property="ARCH" value="i386">
                        <directory name="i386">
                                <file>ntsetup.c</file>
index 16076bf..8edcd8e 100644 (file)
@@ -5,12 +5,9 @@
        <include base="freeldr_base">cache</include>
        <include base="cmlib">.</include>
        <include base="ntoskrnl">include</include>
+       <define name="_BLDR_" />
        <define name="_NTHAL_" />
        <define name="_NTSYSTEM_" />
-       <group compilerset="gcc">
-               <compilerflag>-fno-inline</compilerflag>
-               <compilerflag>-fno-zero-initialized-in-bss</compilerflag>
-       </group>
        <directory name="arcemul">
                <file>mm.c</file>
                <file>time.c</file>
@@ -26,6 +23,7 @@
                <file>disk.c</file>
                <file>partition.c</file>
                <file>ramdisk.c</file>
+               <file>scsiport.c</file>
        </directory>
        <directory name="fs">
                <file>ext2.c</file>
@@ -56,6 +54,7 @@
                <file>libsupp.c</file>
        </directory>
        <directory name="ui">
+           <file>directui.c</file>
                <file>gui.c</file>
                <file>minitui.c</file>
                <file>noui.c</file>
                <file>palette.c</file>
                <file>video.c</file>
        </directory>
-       <if property="ARCH" value="i386">
-               <directory name="windows">
-                       <file>conversion.c</file>
-                       <file>peloader.c</file>
-                       <file>winldr.c</file>
-                       <file>wlmemory.c</file>
-                       <file>wlregistry.c</file>
-               </directory>
-       </if>
-       <if property="ARCH" value="amd64">
-               <directory name="windows">
-                       <file>conversion.c</file>
-                       <file>peloader.c</file>
-                       <file>winldr.c</file>
-                       <file>wlmemory.c</file>
-                       <file>wlregistry.c</file>
-               </directory>
-       </if>
+       <directory name="windows">
+               <file>conversion.c</file>
+               <file>peloader.c</file>
+               <file>winldr.c</file>
+               <file>wlmemory.c</file>
+               <file>wlregistry.c</file>
+       </directory>
        <file>freeldr.c</file>
        <file>debug.c</file>
        <file>version.c</file>
index 29bf32c..b5127e6 100644 (file)
@@ -4,10 +4,6 @@
        <include base="freeldr_base64k">include</include>
        <include base="ntoskrnl">include</include>
        <define name="_NTHAL_" />
-       <group compilerset="gcc">
-               <compilerflag>-fno-inline</compilerflag>
-               <compilerflag>-fno-zero-initialized-in-bss</compilerflag>
-       </group>
        <directory name="arch">
                <if property="ARCH" value="i386">
                        <directory name="i386">
index 4a93dff..fbb410e 100644 (file)
@@ -4,9 +4,5 @@
        <include base="freeldr_main">include</include>
        <include base="ntoskrnl">include</include>
        <define name="_NTHAL_" />
-       <group compilerset="gcc">
-               <compilerflag>-fno-inline</compilerflag>
-               <compilerflag>-fno-zero-initialized-in-bss</compilerflag>
-       </group>
        <file>bootmgr.c</file>
 </module>
index 57d8795..836ecf6 100644 (file)
@@ -3,10 +3,6 @@
 <module name="freeldr_startup" type="objectlibrary">
        <include base="freeldr_startup">include</include>
        <include base="ntoskrnl">include</include>
-       <group compilerset="gcc">
-               <compilerflag>-fno-inline</compilerflag>
-               <compilerflag>-fno-zero-initialized-in-bss</compilerflag>
-       </group>
        <directory name="arch">
                <if property="ARCH" value="i386">
                        <directory name="i386">
index afd37ae..46f12fb 100644 (file)
@@ -17,6 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#ifndef _M_ARM
 #include <freeldr.h>
 #include <debug.h>
 
@@ -1308,3 +1309,6 @@ const DEVVTBL* Ext2Mount(ULONG DeviceId)
        else
                return NULL;
 }
+
+#endif
+
index 49f817c..eb23215 100644 (file)
@@ -319,15 +319,26 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
                     FileData[DeviceId].FuncTable = NULL;
                     return ret;
                 }
+                else if (!*FileName)
+                {
+                    /* Done, caller wanted to open the raw device */
+                    *FileId = DeviceId;
+                    pDevice->ReferenceCount++;
+                    return ESUCCESS;
+                }
 
                 /* Try to detect the file system */
+#ifndef _M_ARM
                 FileData[DeviceId].FileFuncTable = IsoMount(DeviceId);
                 if (!FileData[DeviceId].FileFuncTable)
+#endif
                     FileData[DeviceId].FileFuncTable = FatMount(DeviceId);
+#ifndef _M_ARM
                 if (!FileData[DeviceId].FileFuncTable)
                     FileData[DeviceId].FileFuncTable = NtfsMount(DeviceId);
                 if (!FileData[DeviceId].FileFuncTable)
                     FileData[DeviceId].FileFuncTable = Ext2Mount(DeviceId);
+#endif
                 if (!FileData[DeviceId].FileFuncTable)
                 {
                     /* Error, unable to detect file system */
index fc35402..dd12315 100644 (file)
@@ -18,6 +18,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#ifndef _M_ARM
 #include <freeldr.h>
 #include <debug.h>
 
@@ -510,3 +511,6 @@ const DEVVTBL* IsoMount(ULONG DeviceId)
        else
                return NULL;
 }
+
+#endif
+
index 23344dd..830e3ad 100644 (file)
@@ -23,6 +23,7 @@
  * - May crash on corrupted filesystem.
  */
 
+#ifndef _M_ARM
 #include <freeldr.h>
 #include <debug.h>
 
@@ -957,3 +958,5 @@ const DEVVTBL* NtfsMount(ULONG DeviceId)
     //
     return &NtfsFuncTable;
 }
+
+#endif
index c3e3c45..b9a6cc0 100644 (file)
@@ -17,9 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-
-#ifndef __ARCH_H
-#define __ARCH_H
+#pragma once
 
 #ifdef _M_AMD64
 #include <arch/amd64/amd64.h>
@@ -176,6 +174,3 @@ VOID        SoftReboot(VOID);                                       // Implemented in boot.S
 VOID   DetectHardware(VOID);           // Implemented in hardware.c
 
 #endif /* ! ASM */
-
-
-#endif // #defined __ARCH_H
index 0a1ff1d..9068e00 100644 (file)
@@ -18,8 +18,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __AMD64_AMD64_H_
-#define __AMD64_AMD64_H_
+#pragma once
 
 // This is needed because headers define wrong one for ReactOS
 #undef KIP0PCRADDRESS
@@ -63,6 +62,4 @@ VOID FrLdrSetupGdtIdt();
 
 #endif
 
-#endif /* __AMD64_AMD64_H_ */
-
 /* EOF */
index c1252af..b6da01e 100644 (file)
@@ -18,8 +18,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __AMD64_HARDWARE_H_
-#define __AMD64_HARDWARE_H_
+#pragma once
 
 #ifndef __REGISTRY_H
 #include "../../reactos/registry.h"
@@ -92,6 +91,4 @@ ULONG PnpBiosGetDeviceNodeCount(ULONG *NodeSize,
 ULONG PnpBiosGetDeviceNode(UCHAR *NodeId,
                         UCHAR *NodeBuffer);
 
-#endif /* __AMD64_HARDWARE_H_ */
-
 /* EOF */
index 91ad2d5..2efd7e8 100644 (file)
@@ -19,8 +19,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __I386_MACHPC_H_
-#define __I386_MACHPC_H_
+#pragma once
 
 #ifndef __MEMORY_H
 #include "mm.h"
@@ -59,6 +58,4 @@ TIMEINFO* PcGetTime(VOID);
 
 PCONFIGURATION_COMPONENT_DATA PcHwDetect(VOID);
 
-#endif /* __I386_MACHPC_H_ */
-
 /* EOF */
index c09d5bf..1668b4f 100644 (file)
@@ -6,8 +6,7 @@
  * PROGRAMMERS:     ReactOS Portable Systems Group
  */
 
-#ifndef _ARM_HARDWARE_
-#define __ARM_HARDWARE_
+#pragma once
 
 #ifndef __REGISTRY_H
 #include "../../reactos/registry.h"
 #include "../../../../../armllb/inc/osloader.h"
 #include "../../../../../armllb/inc/machtype.h"
 
-//
-// Static heap for ARC Hardware Component Tree
-// 16KB oughta be enough for anyone.
-//
-#define HW_MAX_ARC_HEAP_SIZE 16 * 1024
-
 //
 // ARC Component Configuration Routines
 //
@@ -31,21 +24,14 @@ FldrCreateSystemKey(
     OUT PCONFIGURATION_COMPONENT_DATA *SystemKey
 );
 
-VOID
-NTAPI
-FldrCreateComponentKey(
-    IN PCONFIGURATION_COMPONENT_DATA SystemKey,
-    IN CONFIGURATION_CLASS Class,
-    IN CONFIGURATION_TYPE Type,
-    IN IDENTIFIER_FLAG Flags,
-    IN ULONG Key,
-    IN ULONG Affinity,
-    IN PCHAR IdentifierString,
-    IN PCM_PARTIAL_RESOURCE_LIST ResourceList,
-    IN ULONG Size,
-    OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey
-);
+#define HW_MAX_ARC_HEAP_SIZE 256
 
 extern PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock;
-
-#endif
+extern ULONG FirstLevelDcacheSize;
+extern ULONG FirstLevelDcacheFillSize;
+extern ULONG FirstLevelIcacheSize;
+extern ULONG FirstLevelIcacheFillSize;
+extern ULONG SecondLevelDcacheSize;
+extern ULONG SecondLevelDcacheFillSize;
+extern ULONG SecondLevelIcacheSize;
+extern ULONG SecondLevelIcacheFillSize;
index 3594c4a..1ab1dcd 100644 (file)
@@ -17,8 +17,7 @@
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#ifndef __I386_OPTIONS_H
-#define __I386_OPTIONS_H
+#pragma once
 
 #define HAS_OPTION_MENU_CUSTOM_BOOT
 #define HAS_OPTION_MENU_REBOOT
@@ -31,5 +30,3 @@ VOID  OptionMenuCustomBootPartition(VOID);
 VOID   OptionMenuCustomBootBootSectorFile(VOID);
 VOID   OptionMenuCustomBootReactOS(VOID);
 VOID   OptionMenuCustomBootLinux(VOID);
-
-#endif // #defined __I386_OPTIONS_H
index e425fd8..aebd893 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __I386_DRIVEMAP_H
-#define __I386_DRIVEMAP_H
+#pragma once
 
 #include <pshpack1.h>
 typedef struct
@@ -38,5 +37,3 @@ extern PVOID                  DriveMapInt13HandlerStart;
 extern PVOID                   DriveMapInt13HandlerEnd;
 extern ULONG                           DriveMapOldInt13HandlerAddress;
 extern DRIVE_MAP_LIST  DriveMapInt13HandlerMapList;
-
-#endif // #defined __I386_DRIVEMAP_H
index 6282b26..c97ba88 100644 (file)
@@ -18,8 +18,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __I386_HARDWARE_H_
-#define __I386_HARDWARE_H_
+#pragma once
 
 #ifndef __REGISTRY_H
 #include "../../reactos/registry.h"
@@ -92,6 +91,4 @@ ULONG PnpBiosGetDeviceNodeCount(ULONG *NodeSize,
 ULONG PnpBiosGetDeviceNode(UCHAR *NodeId,
                         UCHAR *NodeBuffer);
 
-#endif /* __I386_HARDWARE_H_ */
-
 /* EOF */
index c58f595..faf26b8 100644 (file)
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __I386_I386_H_
-#define __I386_I386_H_
+#pragma once
 
 // This is needed because headers define wrong one for ReactOS
 #undef KIP0PCRADDRESS
 #define KIP0PCRADDRESS                      0xffdff000
 
-
-#endif /* __I386_I386_H_ */
-
 /* EOF */
index 7cf7876..1cb40b2 100644 (file)
@@ -19,8 +19,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __I386_MACHPC_H_
-#define __I386_MACHPC_H_
+#pragma once
 
 #ifndef __MEMORY_H
 #include "mm.h"
@@ -58,6 +57,4 @@ TIMEINFO* PcGetTime(VOID);
 
 PCONFIGURATION_COMPONENT_DATA PcHwDetect(VOID);
 
-#endif /* __I386_MACHPC_H_ */
-
 /* EOF */
index 5d0cd1e..febba0b 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __I386_MACHXBOX_H_
-#define __I386_MACHXBOX_H_
+#pragma once
 
 #ifndef __MEMORY_H
 #include "mm.h"
@@ -63,7 +62,4 @@ PCONFIGURATION_COMPONENT_DATA XboxHwDetect(VOID);
 
 VOID XboxSetLED(PCSTR Pattern);
 
-
-#endif /* __I386_HWXBOX_H_ */
-
 /* EOF */
index 3ee8ab3..df17f55 100644 (file)
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __I386_BOOT_H
-#define __I386_BOOT_H
+#pragma once
 
 VOID   LoadAndBootBootSector(PCSTR OperatingSystemName);
 VOID   LoadAndBootPartition(PCSTR OperatingSystemName);
 VOID   LoadAndBootDrive(PCSTR OperatingSystemName);
-
-#endif // defined __I386_BOOT_H
index da4a99f..9aebb0f 100644 (file)
@@ -18,8 +18,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __POWERPC_HARDWARE_H_
-#define __POWERPC_HARDWARE_H_
+#pragma once
 
 #ifndef __REGISTRY_H
 #include "../../reactos/registry.h"
@@ -68,6 +67,4 @@ VOID HalpCalibrateStallExecution(VOID);
 
 ULONGLONG RDTSC(VOID);
 
-#endif /* __POWERPC_HARDWARE_H_ */
-
 /* EOF */
index ccbfc7c..7392ba2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __BYTESEX_H_
-#define __BYTESEX_H_
+#pragma once
 
 #ifdef _PPC_
 #define SWAPD(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff))
@@ -10,5 +9,3 @@
 #endif
 #define SD(Object,Field) Object->Field = SWAPD(Object->Field)
 #define SW(Object,Field) Object->Field = SWAPW(Object->Field)
-
-#endif/*__BYTESEX_H_*/
index cd05fd7..abadfd3 100644 (file)
@@ -18,8 +18,7 @@
  */
 
 
-#ifndef __CACHE_H
-#define __CACHE_H
+#pragma once
 
 ///////////////////////////////////////////////////////////////////////////////////////
 //
@@ -90,5 +89,3 @@ VOID  CacheInvalidateCacheData(VOID);
 BOOLEAN        CacheReadDiskSectors(ULONG DiskNumber, ULONG StartSector, ULONG SectorCount, PVOID Buffer);
 BOOLEAN        CacheForceDiskSectorsIntoCache(ULONG DiskNumber, ULONG StartSector, ULONG SectorCount);
 BOOLEAN        CacheReleaseMemory(ULONG MinimumAmountToRelease);
-
-#endif // defined __CACHE_H
index 1910ef8..05b92f1 100644 (file)
@@ -18,8 +18,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __CMDLINE_H__
-#define __CMDLINE_H__
+#pragma once
 
 typedef struct tagCMDLINEINFO
 {
@@ -32,6 +31,4 @@ void CmdLineParse(char *CmdLine);
 const char *CmdLineGetDefaultOS(void);
 LONG CmdLineGetTimeOut(void);
 
-#endif /* __CMDLINE_H__ */
-
 /* EOF */
index 58ba859..511b705 100644 (file)
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __RS232_H
-#define __RS232_H
+#pragma once
 
 BOOLEAN Rs232PortInitialize(ULONG ComPort, ULONG BaudRate);
 BOOLEAN Rs232PortGetByte(PUCHAR ByteRecieved);
 BOOLEAN Rs232PortPollByte(PUCHAR ByteRecieved);
 VOID Rs232PortPutByte(UCHAR ByteToSend);
 BOOLEAN Rs232PortInUse(ULONG Base);
-
-
-#endif // defined __RS232_H
index b0d3c62..1e85536 100644 (file)
 #define DPRINT_HWDETECT     0x00000400  // OR this with DebugPrintMask to enable hardware detection messages
 #define DPRINT_WINDOWS      0x00000800  // OR this with DebugPrintMask to enable messages from Windows loader
 #define DPRINT_PELOADER     0x00001000  // OR this with DebugPrintMask to enable messages from PE images loader
+#define DPRINT_SCSIPORT     0x00002000  // OR this with DebugPrintMask to enable messages from SCSI miniport
 
 extern char* g_file;
 extern int g_line;
 
-#if DBG
+#if DBG && !defined(_M_ARM)
 
     VOID       DbgPrintMask(ULONG Mask, char *format, ...);
        VOID    DebugInit(VOID);
@@ -80,7 +81,7 @@ void  MEMORY_WRITE_BREAKPOINT4(unsigned long addr);
 
 #else
 
-       #define DebugInit()
+       #define DebugInit(x)
        #define DPRINTM(_x_, ...)
        #define BugCheck(_x_)
        #define DbgDumpBuffer(_x_, _y_, _z_)
index a1a09fa..daaaa49 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __DISK_H
-#define __DISK_H
+#pragma once
 
 #include <reactos/rosioctl.h>
 
@@ -142,4 +141,4 @@ BOOLEAN     DiskGetFirstPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord, PPARTIT
 BOOLEAN        DiskGetFirstExtendedPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord, PPARTITION_TABLE_ENTRY PartitionTableEntry);
 BOOLEAN        DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMASTER_BOOT_RECORD BootRecord);
 
-#endif  // defined __DISK_H
+ULONG LoadBootDeviceDriver(VOID);
index ca8788d..c80fed6 100644 (file)
@@ -32,6 +32,7 @@
 #define NTOSAPI
 #define printf TuiPrintf
 #include <ntddk.h>
+#include <ntifs.h>
 #include <ioaccess.h>
 #include <arc/arc.h>
 #include <ketypes.h>
@@ -39,6 +40,7 @@
 #include <ndk/asm.h>
 #include <ndk/rtlfuncs.h>
 #include <ndk/ldrtypes.h>
+#include <ndk/halfuncs.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <ctype.h>
@@ -60,6 +62,8 @@
 #include <reactos.h>
 #include <registry.h>
 #include <winldr.h>
+#include <ntdddisk.h>
+#include <internal/hal.h>
 /* file system headers */
 #include <fs/ext2.h>
 #include <fs/fat.h>
index 1ecacea..2aa1525 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __FS_H
-#define __FS_H
+#pragma once
 
 typedef struct tagDEVVTBL
 {
@@ -60,5 +59,3 @@ ULONG         FsGetNumPathParts(PCSTR Path);
 VOID   FsGetFirstNameFromPath(PCHAR Buffer, PCSTR Path);
 
 #define MAX_FDS 60
-
-#endif // #defined __FS_H
index 5189f6e..8a2b518 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __EXT2_H
-#define __EXT2_H
+#pragma once
 
 /*
  *  grub/fs/ext2.c
@@ -237,5 +236,3 @@ typedef struct
 } EXT2_FILE_INFO, * PEXT2_FILE_INFO;
 
 const DEVVTBL* Ext2Mount(ULONG DeviceId);
-
-#endif // #defined __EXT2_H
index 5812f0a..1bf99bf 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __FAT_H
-#define __FAT_H
+#pragma once
 
 #include <pshpack1.h>
 typedef struct _FAT_BOOTSECTOR
@@ -174,5 +173,3 @@ typedef struct
 #define ISFATX(FT) ((FT) == FATX16 || (FT) == FATX32)
 
 const DEVVTBL* FatMount(ULONG DeviceId);
-
-#endif // #defined __FAT_H
index 957d083..eacfc97 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __ISO_H
-#define __ISO_H
+#pragma once
 
 #include <pshpack1.h>
 struct _DIR_RECORD
@@ -100,5 +99,3 @@ typedef struct
 } ISO_FILE_INFO, * PISO_FILE_INFO;
 
 const DEVVTBL* IsoMount(ULONG DeviceId);
-
-#endif // #defined __FAT_H
index 06421f7..1235086 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __NTFS_H
-#define __NTFS_H
+#pragma once
 
 #define NTFS_FILE_MFT                          0
 #define NTFS_FILE_MFTMIRR                      1
@@ -226,5 +225,3 @@ typedef struct
 #include <poppack.h>
 
 const DEVVTBL* NtfsMount(ULONG DeviceId);
-
-#endif // #defined __NTFS_H
index 938f8b9..89afe6d 100644 (file)
@@ -25,9 +25,7 @@
  *                  Eric Kohl
  */
 
-#ifndef __INFCACHE_H__
-#define __INFCACHE_H__
-
+#pragma once
 
 #define STATUS_BAD_SECTION_NAME_LINE   (0xC0700001)
 #define STATUS_SECTION_NAME_TOO_LONG   (0xC0700002)
@@ -125,6 +123,4 @@ InfGetDataField (PINFCONTEXT Context,
                 ULONG FieldIndex,
                 PCSTR *Data);
 
-#endif /* __INFCACHE_H__ */
-
 /* EOF */
index 72d633e..ac71d55 100644 (file)
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __PARSEINI_H
-#define __PARSEINI_H
+#pragma once
 
 #define INI_FILE_COMMENT_CHAR  ';'
 
-
-
 // This structure describes a single .ini file item
 // The item format in the .ini file is:
 // Name=Value
@@ -78,6 +75,3 @@ BOOLEAN       IniReadSettingByNumber(ULONG_PTR SectionId, ULONG SettingNumber, PCHAR S
 BOOLEAN        IniReadSettingByName(ULONG_PTR SectionId, PCSTR SettingName, PCHAR Buffer, ULONG BufferSize);
 BOOLEAN        IniAddSection(PCSTR SectionName, ULONG_PTR* SectionId);
 BOOLEAN        IniAddSettingValueToSection(ULONG_PTR SectionId, PCSTR SettingName, PCSTR SettingValue);
-
-
-#endif // defined __PARSEINI_H
index 55e03ed..5d781f9 100644 (file)
@@ -17,9 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __KEYCODES_H
-#define __KEYCODES_H
-
+#pragma once
 
 // Key codes
 #define KEY_EXTENDED   0x00
@@ -41,6 +39,3 @@
 #define KEY_F8                 0x42
 #define KEY_F9                 0x43
 #define KEY_F10                        0x44
-
-
-#endif // #defined __KEYCODES_H
index 440755d..0c0076f 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __MACHINE_H_
-#define __MACHINE_H_
+#pragma once
 
 #ifndef __DISK_H
 #include "disk.h"
@@ -126,6 +125,4 @@ VOID MachPrepareForReactOS(IN BOOLEAN Setup);
 #define MachDiskGetCacheableBlockCount(Drive)  MachVtbl.DiskGetCacheableBlockCount(Drive)
 #define MachHwDetect()                         MachVtbl.HwDetect()
 
-#endif /* __MACHINE_H_ */
-
 /* EOF */
index cfec147..a7840e3 100644 (file)
@@ -17,9 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-
-#ifndef __MEMORY_H
-#define __MEMORY_H
+#pragma once
 
 typedef enum
 {
@@ -119,4 +117,6 @@ PVOID       MmAllocateHighestMemoryBelowAddress(ULONG MemorySize, PVOID DesiredAddress
 PVOID  MmHeapAlloc(ULONG MemorySize);
 VOID   MmHeapFree(PVOID MemoryPointer);
 
-#endif // defined __MEMORY_H
+#define ExAllocatePool(pool, size) MmHeapAlloc(size)
+#define ExAllocatePoolWithTag(pool, size, tag) MmHeapAlloc(size)
+#define ExFreePool(p) MmHeapFree(p)
index be28f2b..dd3467f 100644 (file)
@@ -16,8 +16,7 @@
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef __MULTIBOOT_H
-#define __MULTIBOOT_H
+#pragma once
 
 /* Macros. */
 
@@ -103,6 +102,3 @@ typedef struct memory_map
 } memory_map_t;
 
 #endif /* ! ASM */
-
-
-#endif // defined __MULTIBOOT_H
diff --git a/reactos/boot/freeldr/freeldr/include/ntoskrnl.h b/reactos/boot/freeldr/freeldr/include/ntoskrnl.h
new file mode 100644 (file)
index 0000000..f2e9e46
--- /dev/null
@@ -0,0 +1,17 @@
+#include <ntdef.h>
+#undef _NTHAL_
+//#undef DECLSPEC_IMPORT
+//#define DECLSPEC_IMPORT
+#undef NTSYSAPI
+#define NTSYSAPI
+
+/* Windows Device Driver Kit */
+#include <ntddk.h>
+#include <ndk/haltypes.h>
+
+//typedef GUID UUID;
+
+/* Disk stuff */
+typedef PVOID PLOADER_PARAMETER_BLOCK;
+#include <ntdddisk.h>
+#include <internal/hal.h>
index 8ab77b2..76c9d21 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef FREELDR_OF_H
-#define FREELDR_OF_H
+#pragma once
 
 #define OF_FAILED 0
 #define ERR_NOT_FOUND 0xc0000010
@@ -15,5 +14,3 @@ extern of_proxy ofproxy;
 int setjmp( jmp_buf buf );
 int longjmp( jmp_buf buf, int retval );
 int ofw_callmethod_ret(const char *method, int handle, int nargs, int *args, int ret);
-
-#endif/*FREELDR_OF_H*/
index bfa6479..124b64e 100644 (file)
@@ -17,9 +17,6 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __OPTIONS_H
-#define __OPTIONS_H
+#pragma once
 
 VOID   DoOptionsMenu(VOID);
-
-#endif // #defined __OPTIONS_H
index 0f3ab77..04df0fa 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __OSLIST_H
-#define __OSLIST_H
+#pragma once
 
 typedef struct tagOperatingSystemItem
 {
@@ -28,5 +27,3 @@ typedef struct tagOperatingSystemItem
 } OperatingSystemItem;
 
 OperatingSystemItem* InitOperatingSystemList(ULONG* OperatingSystemCountPointer);
-
-#endif // #defined __OSLIST_H
index c77c09e..8979bcf 100644 (file)
@@ -6,8 +6,7 @@
  * PROGRAMMERS:     ReactOS Portable Systems Group
  */
 
-#ifndef _RAMDISK_
-#define _RAMDISK_
+#pragma once
 
 //
 // Ramdisk Routines
@@ -26,5 +25,3 @@ RamDiskInitialize(
 
 extern PVOID gRamDiskBase;
 extern ULONG gRamDiskSize;
-
-#endif
index de15973..82e23ab 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __REACTOS_H
-#define __REACTOS_H
+#pragma once
 
 /* Base Addres of Kernel in Physical Memory */
 #define KERNEL_BASE_PHYS 0x800000
@@ -74,6 +73,14 @@ VOID ReactOSRunSetupLoader(VOID);
 // ARC Path Functions
 //
 ///////////////////////////////////////////////////////////////////////////////////////
+BOOLEAN
+DissectArcPath2(
+    IN CHAR* ArcPath,
+    OUT ULONG* x,
+    OUT ULONG* y,
+    OUT ULONG* z,
+    OUT ULONG* Partition,
+    OUT ULONG *PathSyntax);
 BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* BootPartition);
 VOID ConstructArcPath(PCHAR ArcPath, PCHAR SystemFolder, ULONG Disk, ULONG Partition);
 ULONG ConvertArcNameToBiosDriveNumber(PCHAR ArcPath);
@@ -128,5 +135,3 @@ FrLdrLoadImage(
     IN INT nPos,
     IN ULONG ImageType
 );
-
-#endif // defined __REACTOS_H
index 877f217..d4ef384 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __STDLIB_H
-#define __STDLIB_H
+#pragma once
 
 #include <freeldr.h>
 
@@ -28,5 +27,3 @@ char *        convert_i64_to_ascii(char *buf, int c, unsigned long long num);
 void   PcBeep(void);
 void   delay(unsigned msec);
 void   sound(int freq);
-
-#endif  // defined __STDLIB_H
index ee58003..1b57fd9 100644 (file)
@@ -17,9 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __UI_H
-#define __UI_H
-
+#pragma once
 
 extern ULONG           UiScreenWidth;                                                                  // Screen Width
 extern ULONG           UiScreenHeight;                                                                 // Screen Height
@@ -176,5 +174,3 @@ extern UIVTBL UiVtbl;
 #define D_HORZ (0xcd)  /* Double horizontal line.*/
 #define VERT    (0xb3)  /* Single vertical line   */
 #define D_VERT  (0xba)  /* Double vertical line.  */
-
-#endif // #defined __UI_H
index 076fa05..77a983a 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __GUI_H
-#define __GUI_H
+#pragma once
 
 #define        TUI_SCREEN_MEM                          0xB8000
 #define TITLE_BOX_CHAR_HEIGHT          5
@@ -52,5 +51,3 @@ UCHAR GuiTextToFillStyle(PCSTR FillStyleText);                                // Converts the text fill into
 BOOLEAN        GuiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem);
 
 extern const UIVTBL GuiVtbl;
-
-#endif // #defined __GUI_H
index d20230b..d845c52 100644 (file)
@@ -6,8 +6,7 @@
  * PROGRAMMERS:     Hervé Poussineau
  */
 
-#ifndef __MINITUI_H
-#define __MINITUI_H
+#pragma once
 
 ///////////////////////////////////////////////////////////////////////////////////////
 //
@@ -29,5 +28,3 @@ VOID MiniTuiDrawProgressBar(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UL
 VOID MiniTuiDrawMenu(PUI_MENU_INFO MenuInfo);
 
 extern const UIVTBL MiniTuiVtbl;
-
-#endif // #defined __TUI_H
index df53ce1..de027d7 100644 (file)
@@ -6,8 +6,7 @@
  * PROGRAMMERS:     Hervé Poussineau
  */
 
-#ifndef _NOUI_H_
-#define _NOUI_H_
+#pragma once
 
 ///////////////////////////////////////////////////////////////////////////////////////
 //
@@ -47,5 +46,3 @@ VOID NoUiDrawMenu(PUI_MENU_INFO MenuInfo);
 
 BOOLEAN NoUiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem, BOOLEAN CanEscape, UiMenuKeyPressFilterCallback KeyPressFilter);
 VOID NoUiDrawMenu(PUI_MENU_INFO MenuInfo);
-
-#endif /* _NOUI_H_ */
index 5c0c0c3..ad7faa4 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __TUI_H
-#define __TUI_H
+#pragma once
 
 #define        TUI_SCREEN_MEM                          0xB8000
 #define TUI_TITLE_BOX_CHAR_HEIGHT      5
@@ -80,12 +79,6 @@ VOID NTAPI TuiDrawMenuItem(PUI_MENU_INFO MenuInfo, ULONG MenuItemNumber);
 ULONG  NTAPI TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo, UiMenuKeyPressFilterCallback KeyPressFilter);
 BOOLEAN TuiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem, BOOLEAN CanEscape, UiMenuKeyPressFilterCallback KeyPressFilter);
 
-
-
-
-
-
-
 /* Definitions for corners, depending on HORIZ and VERT */
 #define UL             (0xda)
 #define UR             (0xbf)  /* HORZ and VERT */
@@ -108,5 +101,3 @@ BOOLEAN TuiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultM
 #define VD_LR  (0xbd)
 
 extern const UIVTBL TuiVtbl;
-
-#endif // #defined __TUI_H
index 2f94f80..d078f8e 100644 (file)
@@ -17,9 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __VERSION_H
-#define __VERSION_H
-
+#pragma once
 
 /* just some stuff */
 #define VERSION                        "FreeLoader v3.0"
@@ -44,6 +42,3 @@
 PCHAR  GetFreeLoaderVersionString(VOID);
 
 #endif // ASM
-
-
-#endif  // defined __VERSION_H
index 60d338a..921f28d 100644 (file)
@@ -17,8 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __VIDEO_H
-#define __VIDEO_H
+#pragma once
 
 #include <pshpack1.h>
 typedef struct
@@ -43,6 +42,3 @@ VOID  VideoRestorePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount);
 VOID   VideoSetAllColorsToBlack(ULONG ColorCount);
 VOID   VideoFadeIn(PPALETTE_ENTRY Palette, ULONG ColorCount);
 VOID   VideoFadeOut(ULONG ColorCount);
-
-
-#endif  // defined __VIDEO_H
index 8fc5ef8..ac42a40 100644 (file)
@@ -18,9 +18,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __WINLDR_H
-#define __WINLDR_H
-
+#pragma once
 
 ///////////////////////////////////////////////////////////////////////////////////////
 //
@@ -108,6 +106,3 @@ typedef struct  /* Root System Descriptor Pointer */
        CHAR             reserved [3];           /* reserved field must be 0 */
 } RSDP_DESCRIPTOR, *PRSDP_DESCRIPTOR;
 #include <poppack.h>
-
-
-#endif // defined __WINLDR_H
index e3755c9..10c2017 100644 (file)
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-
+#ifndef _M_ARM
 #include <freeldr.h>
 #include <debug.h>
-
 #ifdef __i386__
 #define        LINUX_READ_CHUNK_SIZE   0x20000                 // Read 128k at a time
 
@@ -516,3 +516,4 @@ BOOLEAN LinuxReadInitrd(PFILE LinuxInitrdFile)
        return TRUE;
 }
 #endif /* __i386__ */
+#endif
index e3e62c8..f59a43f 100644 (file)
@@ -102,8 +102,11 @@ VOID MmInitializeHeap(PVOID PageLookupTable)
 {
        ULONG PagesNeeded;
        ULONG HeapStart;
-
+       MEMORY_TYPE Type;
+       PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable;
+       
        // HACK: Make it so it doesn't overlap kernel space
+       Type = RealPageLookupTable[0x100].PageAllocated;
        MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, LoaderSystemCode);
 
        // Find contigious memory block for HEAP:STACK
@@ -111,7 +114,7 @@ VOID MmInitializeHeap(PVOID PageLookupTable)
        HeapStart = MmFindAvailablePages(PageLookupTable, TotalPagesInLookupTable, PagesNeeded, FALSE);
 
        // Unapply the hack
-       MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, LoaderFree);
+       MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, Type);
 
        if (HeapStart == 0)
        {
index c06bb00..f4a4c69 100644 (file)
@@ -345,3 +345,54 @@ PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(ULONG *NoEntries)
 
        return RealPageLookupTable;
 }
+
+#undef ExAllocatePoolWithTag
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithTag(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes,
+    IN ULONG Tag)
+{
+    return MmHeapAlloc(NumberOfBytes);
+}
+
+#undef ExFreePool
+NTKERNELAPI
+VOID
+NTAPI
+ExFreePool(
+    IN PVOID P)
+{
+    MmHeapFree(P);
+}
+
+PVOID
+NTAPI
+RtlAllocateHeap(
+    IN PVOID HeapHandle,
+    IN ULONG Flags,
+    IN SIZE_T Size)
+{
+    PVOID ptr;
+
+    ptr = MmHeapAlloc(Size);
+    if (ptr && (Flags & HEAP_ZERO_MEMORY))
+    {
+        RtlZeroMemory(ptr, Size);
+    }
+
+    return ptr;
+}
+
+BOOLEAN
+NTAPI
+RtlFreeHeap(
+    IN PVOID HeapHandle,
+    IN ULONG Flags,
+    IN PVOID HeapBase)
+{
+    MmHeapFree(HeapBase);
+    return TRUE;
+}
index e46022c..3ca69fa 100644 (file)
@@ -104,6 +104,62 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B
        return TRUE;
 }
 
+/* PathSyntax: scsi() = 0, multi() = 1, ramdisk() = 2 */
+BOOLEAN
+DissectArcPath2(
+    IN CHAR* ArcPath,
+    OUT ULONG* x,
+    OUT ULONG* y,
+    OUT ULONG* z,
+    OUT ULONG* Partition,
+    OUT ULONG *PathSyntax)
+{
+    /* Detect ramdisk() */
+    if (_strnicmp(ArcPath, "ramdisk(0)", 10) == 0)
+    {
+        *x = *y = *z = 0;
+        *Partition = 1;
+        *PathSyntax = 2;
+        return TRUE;
+    }
+    /* Detect scsi()disk()rdisk()partition() */
+    else if (sscanf(ArcPath, "scsi(%lu)disk(%lu)rdisk(%lu)partition(%lu)", x, y, z, Partition) == 4)
+    {
+        *PathSyntax = 0;
+        return TRUE;
+    }
+    /* Detect scsi()cdrom()fdisk() */
+    else if (sscanf(ArcPath, "scsi(%lu)cdrom(%lu)fdisk(%lu)", x, y, z) == 3)
+    {
+        *Partition = 0;
+        *PathSyntax = 0;
+        return TRUE;
+    }
+    /* Detect multi()disk()rdisk()partition() */
+    else if (sscanf(ArcPath, "multi(%lu)disk(%lu)rdisk(%lu)partition(%lu)", x, y, z, Partition) == 4)
+    {
+        *PathSyntax = 1;
+        return TRUE;
+    }
+    /* Detect multi()disk()cdrom() */
+    else if (sscanf(ArcPath, "multi(%lu)disk(%lu)cdrom(%lu)", x, y, z) == 3)
+    {
+        *Partition = 1;
+        *PathSyntax = 1;
+        return TRUE;
+    }
+    /* Detect multi()disk()fdisk() */
+    else if (sscanf(ArcPath, "multi(%lu)disk(%lu)fdisk(%lu)", x, y, z) == 3)
+    {
+        *Partition = 1;
+        *PathSyntax = 1;
+        return TRUE;
+    }
+
+    /* Unknown syntax */
+    return FALSE;
+}
+
 VOID ConstructArcPath(PCHAR ArcPath, PCHAR SystemFolder, ULONG Disk, ULONG Partition)
 {
        char    tmp[50];
index 1e50115..296e3af 100644 (file)
@@ -1,3 +1,4 @@
+#ifndef _M_ARM
 #include <freeldr.h>
 #include <debug.h>
 
@@ -780,5 +781,5 @@ FrLdrMapImage(IN PFILE Image,
     /* Return the final mapped address */
     return LoadBase;
 }
-
+#endif
 /* EOF */
index 0700dca..12c8c66 100644 (file)
@@ -18,6 +18,7 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
+#ifndef _M_ARM
 
 #include <freeldr.h>
 #include <debug.h>
@@ -889,6 +890,7 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
      * Load boot drivers
      */
     FrLdrLoadBootDrivers(szBootPath, 40);
+    UiDrawProgressBarCenter(100, 100, szLoadingMsg);
     //UiUnInitialize("Booting ReactOS...");
 
     //
@@ -901,5 +903,6 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
     //
     FrLdrStartup(0x2badb002);
 }
+#endif
 
 /* EOF */
index 20d0c74..0a352f4 100644 (file)
@@ -11,6 +11,7 @@
        <library>cmlib</library>
        <library>rtl</library>
        <library>libcntpr</library>
+       <library>mini_hal</library>
        <group linkerset="ld">
                <linkerflag>-nostartfiles</linkerflag>
                <linkerflag>-nostdlib</linkerflag>
diff --git a/reactos/boot/freeldr/freeldr/ui/directui.c b/reactos/boot/freeldr/freeldr/ui/directui.c
new file mode 100644 (file)
index 0000000..2a9db37
--- /dev/null
@@ -0,0 +1,574 @@
+/*
+ * PROJECT:         ReactOS Boot Loader
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            boot/freeldr/freeldr/ui/directui.c
+ * PURPOSE:         FreeLDR UI Routines
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+#ifdef _M_ARM
+
+/* INCLUDES *******************************************************************/
+
+#include <freeldr.h>
+#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
+/* FUNCTIONS ******************************************************************/
+
+ULONG UiScreenWidth;
+ULONG UiScreenHeight;
+UCHAR UiMenuFgColor = COLOR_GRAY;
+UCHAR UiMenuBgColor = COLOR_BLACK;
+UCHAR UiTextColor = COLOR_GRAY;
+UCHAR UiSelectedTextColor = COLOR_BLACK;
+UCHAR UiSelectedTextBgColor = COLOR_GRAY;
+CHAR UiTimeText[260] = "Seconds until highlighted choice will be started automatically:   ";
+
+INT
+TuiPrintf(const char *Format,
+          ...)
+{
+       int i;
+       int Length;
+       va_list ap;
+       CHAR Buffer[512];
+
+       va_start(ap, Format);
+       Length = _vsnprintf(Buffer, sizeof(Buffer), Format, ap);
+       va_end(ap);
+
+       if (Length == -1) Length = sizeof(Buffer);
+
+       for (i = 0; i < Length; i++)
+       {
+               MachConsPutChar(Buffer[i]);
+       }
+
+       return Length;
+}
+
+BOOLEAN
+UiInitialize(IN BOOLEAN ShowGui)
+{
+       ULONG Depth;
+    
+    /* Nothing to do */
+    if (!ShowGui) return TRUE;
+
+    /* Set mode and query size */
+       MachVideoSetDisplayMode(NULL, TRUE);
+       MachVideoGetDisplaySize(&UiScreenWidth, &UiScreenHeight, &Depth);
+       return TRUE;
+}
+
+VOID
+UiUnInitialize(IN PCSTR BootText)
+{
+    /* Nothing to do */
+    return;
+}
+
+VOID
+UiDrawBackdrop(VOID)
+{
+       /* Clear the screen */
+       MachVideoClearScreen(ATTR(COLOR_WHITE, COLOR_BLACK));
+}
+
+VOID
+UiDrawText(IN ULONG X,
+           IN ULONG Y,
+           IN PCSTR Text,
+           IN UCHAR Attr)
+{
+       ULONG i, j;
+
+    /* Draw the text character by character, but don't exceed the width */
+       for (i = X, j = 0; Text[j] && i < UiScreenWidth; i++, j++)
+       {
+           /* Write the character */
+        MachVideoPutChar(Text[j], Attr, i, Y);
+       }
+}
+
+VOID
+UiDrawCenteredText(IN ULONG Left,
+                   IN ULONG Top,
+                   IN ULONG Right,
+                   IN ULONG Bottom,
+                   IN PCSTR TextString,
+                   IN UCHAR Attr)
+{
+       ULONG TextLength, BoxWidth, BoxHeight, LineBreakCount, Index, LastIndex;
+       ULONG RealLeft, RealTop, X, Y;
+       CHAR Temp[2];
+
+    /* Query text length */
+       TextLength = strlen(TextString);
+
+    /* Count the new lines and the box width */
+       LineBreakCount = 0;
+       BoxWidth = 0;
+       LastIndex = 0;
+       for (Index=0; Index < TextLength; Index++)
+       {
+           /* Scan for new lines */
+               if (TextString[Index] == '\n')
+               {
+                   /* Remember the new line */
+                       LastIndex = Index;
+                       LineBreakCount++;
+               }
+               else
+               {
+                   /* Check for new larger box width */
+                       if ((Index - LastIndex) > BoxWidth)
+                       {
+                           /* Update it */
+                               BoxWidth = (Index - LastIndex);
+                       }
+               }
+       }
+
+    /* Base the box height on the number of lines */
+       BoxHeight = LineBreakCount + 1;
+
+    /* Create the centered coordinates */
+       RealLeft = (((Right - Left) - BoxWidth) / 2) + Left;
+       RealTop = (((Bottom - Top) - BoxHeight) / 2) + Top;
+
+    /* Now go for a second scan */
+       LastIndex = 0;
+       for (Index=0; Index < TextLength; Index++)
+       {
+           /* Look for new lines again */
+               if (TextString[Index] == '\n')
+               {
+                   /* Update where the text should start */
+                       RealTop++;
+                       LastIndex = 0;
+               }
+               else
+               {
+                   /* We've got a line of text to print, do it */
+                       X = RealLeft + LastIndex;
+                       Y = RealTop;
+                       LastIndex++;
+                       Temp[0] = TextString[Index];
+                       Temp[1] = 0;
+                       UiDrawText(X, Y, Temp, Attr);
+               }
+       }
+}
+
+VOID
+UiDrawStatusText(IN PCSTR StatusText)
+{
+    return;
+}
+
+VOID
+UiInfoBox(IN PCSTR MessageText)
+{
+    TuiPrintf(MessageText);
+}
+
+VOID
+UiMessageBox(IN PCSTR MessageText)
+{
+    TuiPrintf(MessageText);
+}
+
+VOID
+UiMessageBoxCritical(IN PCSTR MessageText)
+{
+    TuiPrintf(MessageText);
+}
+
+VOID
+UiDrawProgressBarCenter(IN ULONG Position,
+                        IN ULONG Range,
+                        IN PCHAR ProgressText)
+{
+    ULONG Left, Top, Right, Bottom, Width, Height;
+
+       /* Build the coordinates and sizes */
+       Height = 2;
+       Width = UiScreenWidth;
+       Left = 0;
+       Right = (Left + Width) - 1;
+       Top = UiScreenHeight - Height - 4;
+       Bottom = Top + Height + 1;
+
+    /* Draw the progress bar */
+       UiDrawProgressBar(Left, Top, Right, Bottom, Position, Range, ProgressText);
+}
+
+VOID
+UiDrawProgressBar(IN ULONG Left,
+                  IN ULONG Top,
+                  IN ULONG Right,
+                  IN ULONG Bottom, 
+                  IN ULONG Position,
+                  IN ULONG Range,
+                  IN PCHAR ProgressText)
+{
+    ULONG i, ProgressBarWidth;
+       
+       /* Calculate the width of the bar proper */
+       ProgressBarWidth = (Right - Left) - 3;
+
+       /* First make sure the progress bar text fits */
+       UiTruncateStringEllipsis(ProgressText, ProgressBarWidth - 4);
+       if (Position > Range) Position = Range;
+
+       /* Draw the "Loading..." text */
+       UiDrawCenteredText(Left + 2, Top + 1, Right - 2, Top + 1, ProgressText, ATTR(7, 0));
+
+       /* Draw the percent complete */
+       for (i = 0; i < (Position * ProgressBarWidth) / Range; i++)
+       {
+           /* Use the fill character */
+               UiDrawText(Left + 2 + i, Top + 2, "\xDB", ATTR(UiTextColor, UiMenuBgColor));
+       }
+}
+
+VOID
+UiShowMessageBoxesInSection(IN PCSTR SectionName)
+{
+    return;
+}
+
+VOID
+UiTruncateStringEllipsis(IN PCHAR StringText,
+                         IN ULONG MaxChars)
+{
+    /* If it's too large, just add some ellipsis past the maximum */
+       if (strlen(StringText) > MaxChars) strcpy(&StringText[MaxChars - 3], "...");
+}
+
+VOID
+NTAPI
+UiDrawMenuBox(IN PUI_MENU_INFO MenuInfo)
+{
+    CHAR MenuLineText[80], TempString[80];
+    ULONG i;
+
+    /* If there is a timeout draw the time remaining */
+    if (MenuInfo->MenuTimeRemaining >= 0)
+    {
+        /* Copy the integral time text string, and remove the last 2 chars */
+        strcpy(TempString, UiTimeText);
+        i = strlen(TempString);
+        TempString[i - 2] = 0;
+
+        /* Display the first part of the string and the remaining time */
+        strcpy(MenuLineText, TempString);
+        _itoa(MenuInfo->MenuTimeRemaining, TempString, 10);
+        strcat(MenuLineText, TempString);
+
+        /* Add the last 2 chars */
+        strcat(MenuLineText, &UiTimeText[i - 2]);
+
+        /* Display under the menu directly */
+        UiDrawText(0,
+                   MenuInfo->Bottom + 3,
+                   MenuLineText,
+                   ATTR(UiMenuFgColor, UiMenuBgColor));
+    }
+    else
+    {
+        /* Erase the timeout string with spaces, and 0-terminate for sure */
+        for (i=0; i<sizeof(MenuLineText)-1; i++)
+        {
+            MenuLineText[i] = ' ';
+        }
+        MenuLineText[sizeof(MenuLineText)-1] = 0;
+
+        /* Draw this "empty" string to erase */
+        UiDrawText(0,
+                   MenuInfo->Bottom + 3,
+                   MenuLineText,
+                   ATTR(UiMenuFgColor, UiMenuBgColor));
+    }
+
+    /* Loop each item */
+    for (i = 0; i < MenuInfo->MenuItemCount; i++)
+    {
+        /* Check if it's a separator */
+        if (!(_stricmp(MenuInfo->MenuItemList[i], "SEPARATOR")))
+        {
+            /* Draw the separator line */
+            UiDrawText(MenuInfo->Left,
+                       MenuInfo->Top + i + 1,
+                       "\xC7",
+                       ATTR(UiMenuFgColor, UiMenuBgColor));
+            UiDrawText(MenuInfo->Right,
+                       MenuInfo->Top + i + 1,
+                       "\xB6",
+                       ATTR(UiMenuFgColor, UiMenuBgColor));
+        }
+    }
+}
+
+VOID
+NTAPI
+UiDrawMenuItem(IN PUI_MENU_INFO MenuInfo,
+               IN ULONG MenuItemNumber)
+{
+    CHAR MenuLineText[80];
+    UCHAR Attribute = ATTR(UiTextColor, UiMenuBgColor);
+
+    /* Simply left-align it */
+    MenuLineText[0] = '\0';
+    strcat(MenuLineText, "    ");
+
+    /* Now append the text string */
+    strcat(MenuLineText, MenuInfo->MenuItemList[MenuItemNumber]);
+
+    /* If it is a separator */
+    if (!(_stricmp(MenuInfo->MenuItemList[MenuItemNumber], "SEPARATOR")))
+    {
+        /* Make it a separator line and use menu colors */
+        memset(MenuLineText, 0, 80);
+        memset(MenuLineText, 0xC4, (MenuInfo->Right - MenuInfo->Left - 1));
+        Attribute = ATTR(UiMenuFgColor, UiMenuBgColor);
+    }
+    else if (MenuItemNumber == MenuInfo->SelectedMenuItem)
+    {
+        /*  If this is the selected item, use the selected colors */
+        Attribute = ATTR(UiSelectedTextColor, UiSelectedTextBgColor);
+    }
+
+    /* Draw the item */
+    UiDrawText(MenuInfo->Left + 1,
+               MenuInfo->Top + 1 + MenuItemNumber,
+               MenuLineText,
+               Attribute);
+}
+
+VOID
+UiDrawMenu(IN PUI_MENU_INFO MenuInfo)
+{
+    ULONG i;
+
+    /* No GUI status bar text, just minimal text. first to tell the user to choose */
+    UiDrawText(0,
+               MenuInfo->Top - 2,
+               "Please select the operating system to start:",
+               ATTR(UiMenuFgColor, UiMenuBgColor));
+
+    /* Now tell him how to choose */
+    UiDrawText(0,
+               MenuInfo->Bottom + 1,
+               "Use the up and down arrow keys to move the highlight to "
+               "your choice.",
+               ATTR(UiMenuFgColor, UiMenuBgColor));
+    UiDrawText(0,
+               MenuInfo->Bottom + 2,
+               "Press ENTER to choose.",
+               ATTR(UiMenuFgColor, UiMenuBgColor));
+
+    /* And offer F8 options */
+    UiDrawText(0,
+               UiScreenHeight - 4,
+               "For troubleshooting and advanced startup options for "
+               "ReactOS, press F8.",
+               ATTR(UiMenuFgColor, UiMenuBgColor));
+
+    /* Draw the menu box */
+    UiDrawMenuBox(MenuInfo);
+
+    /* Draw each line of the menu */
+    for (i = 0; i < MenuInfo->MenuItemCount; i++) UiDrawMenuItem(MenuInfo, i);
+}
+
+ULONG
+NTAPI
+UiProcessMenuKeyboardEvent(IN PUI_MENU_INFO MenuInfo,
+                           IN UiMenuKeyPressFilterCallback KeyPressFilter)
+{
+    ULONG KeyEvent = 0, Selected, Count;
+
+    /* Check for a keypress */
+    if (MachConsKbHit())
+    {
+        /* Check if the timeout is not already complete */
+        if (MenuInfo->MenuTimeRemaining != -1)
+        {
+            //
+            // Cancel it and remove it
+            //
+            MenuInfo->MenuTimeRemaining = -1;
+            UiDrawMenuBox(MenuInfo);
+        }
+
+        /* Get the key */
+        KeyEvent = MachConsGetCh();
+
+        /* Is it extended? Then get the extended key */
+        if (!KeyEvent) KeyEvent = MachConsGetCh();
+
+        /* Call the supplied key filter callback function to see if it is going to handle this keypress. */
+        if ((KeyPressFilter) && (KeyPressFilter(KeyEvent)))
+        {
+            /* It processed the key character, so redraw and exit */
+            UiDrawMenu(MenuInfo);
+            return 0;
+        }
+
+        /* Process the key */
+        if ((KeyEvent == KEY_UP) || (KeyEvent == KEY_DOWN))
+        {
+            /* Get the current selected item and count */
+            Selected = MenuInfo->SelectedMenuItem;
+            Count = MenuInfo->MenuItemCount - 1;
+
+            /* Check if this was a key up and there's a selected menu item */
+            if ((KeyEvent == KEY_UP) && (Selected))
+            {
+                /* Update the menu (Deselect previous item) */
+                MenuInfo->SelectedMenuItem--;
+                UiDrawMenuItem(MenuInfo, Selected);
+                Selected--;
+
+                /* Skip past any separators */
+                if ((Selected) &&
+                    !(_stricmp(MenuInfo->MenuItemList[Selected], "SEPARATOR")))
+                {
+                    MenuInfo->SelectedMenuItem--;
+                }
+            }
+            else if ((KeyEvent == KEY_DOWN) && (Selected < Count))
+            {
+                /* Update the menu (deselect previous item) */
+                MenuInfo->SelectedMenuItem++;
+                UiDrawMenuItem(MenuInfo, Selected);
+                Selected++;
+
+                /* Skip past any separators */
+                if ((Selected < Count) &&
+                    !(_stricmp(MenuInfo->MenuItemList[Selected], "SEPARATOR")))
+                {
+                    MenuInfo->SelectedMenuItem++;
+                }
+            }
+
+            /* Select new item and update video buffer */
+            UiDrawMenuItem(MenuInfo, MenuInfo->SelectedMenuItem);
+        }
+    }
+
+    /*  Return the pressed key */
+    return KeyEvent;
+}
+
+VOID
+NTAPI
+UiCalcMenuBoxSize(IN PUI_MENU_INFO MenuInfo)
+{
+    ULONG i, Width = 0, Height, Length;
+
+    /* Height is the menu item count plus 2 (top border & bottom border) */
+    Height = MenuInfo->MenuItemCount + 2;
+    Height -= 1; // Height is zero-based
+
+    /* Loop every item */
+    for (i = 0; i < MenuInfo->MenuItemCount; i++)
+    {
+        /* Get the string length and make it become the new width if necessary */
+        Length = strlen(MenuInfo->MenuItemList[i]);
+        if (Length > Width) Width = Length;
+    }
+
+    /* Allow room for left & right borders, plus 8 spaces on each side */
+    Width += 18;
+
+    /* Put the menu in the default left-corner position */
+    MenuInfo->Left = -1;
+    MenuInfo->Top = 4;
+
+    /* The other margins are the same */
+    MenuInfo->Right = (MenuInfo->Left) + Width;
+    MenuInfo->Bottom = (MenuInfo->Top) + Height;
+}
+
+BOOLEAN
+UiDisplayMenu(IN PCSTR MenuItemList[],
+              IN ULONG MenuItemCount,
+              IN ULONG DefaultMenuItem,
+              IN LONG MenuTimeOut,
+              OUT PULONG SelectedMenuItem,
+              IN BOOLEAN CanEscape,
+              IN UiMenuKeyPressFilterCallback KeyPressFilter)
+{
+    UI_MENU_INFO MenuInformation;
+    ULONG LastClockSecond;
+    ULONG CurrentClockSecond;
+    ULONG KeyPress;
+
+    /* Check if there's no timeout */
+    if (!MenuTimeOut)
+    {
+        /* Return the default selected item */
+        if (SelectedMenuItem) *SelectedMenuItem = DefaultMenuItem;
+        return TRUE;
+    }
+
+    /* Setup the MENU_INFO structure */
+    MenuInformation.MenuItemList = MenuItemList;
+    MenuInformation.MenuItemCount = MenuItemCount;
+    MenuInformation.MenuTimeRemaining = MenuTimeOut;
+    MenuInformation.SelectedMenuItem = DefaultMenuItem;
+
+    /* Calculate the size of the menu box */
+    UiCalcMenuBoxSize(&MenuInformation);
+
+    /* Draw the menu */
+    UiDrawMenu(&MenuInformation);
+
+    /* Get the current second of time */
+    LastClockSecond = ArcGetTime()->Second;
+
+    /* Process keys */
+    while (TRUE)
+    {
+        /* Process key presses */
+        KeyPress = UiProcessMenuKeyboardEvent(&MenuInformation,
+                                              KeyPressFilter);
+
+        /* Check for ENTER or ESC */
+        if (KeyPress == KEY_ENTER) break;
+        if (CanEscape && KeyPress == KEY_ESC) return FALSE;
+
+        /* Check if there is a countdown */
+        if (MenuInformation.MenuTimeRemaining)
+        {
+            /* Get the updated time, seconds only */
+            CurrentClockSecond = ArcGetTime()->Second;
+
+            /* Check if more then a second has now elapsed */
+            if (CurrentClockSecond != LastClockSecond)
+            {
+                /* Update the time information */
+                LastClockSecond = CurrentClockSecond;
+                MenuInformation.MenuTimeRemaining--;
+
+                /* Update the menu */
+                UiDrawMenuBox(&MenuInformation);
+            }
+        }
+        else
+        {
+            /* A time out occurred, exit this loop and return default OS */
+            break;
+        }
+    }
+
+    /* Return the selected item */
+    if (SelectedMenuItem) *SelectedMenuItem = MenuInformation.SelectedMenuItem;
+    return TRUE;
+}
+
+#endif
index e188ecd..56b0faa 100644 (file)
@@ -17,6 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#ifndef _M_ARM
 #include <freeldr.h>
 
 VOID GuiDrawBackdrop(VOID)
@@ -103,3 +104,4 @@ const UIVTBL GuiVtbl =
        NULL, NULL, NULL, NULL, NULL, NULL, NULL,
        NULL, NULL, NULL, NULL, NULL, NULL, NULL
 };
+#endif
index bbc36a8..adaa68c 100644 (file)
@@ -6,7 +6,7 @@
  * PROGRAMMERS:     Brian Palmer <brianp@sginet.com>
  *                  Hervé Poussineau
  */
-
+#ifndef _M_ARM
 #include <freeldr.h>
 
 VOID MiniTuiDrawBackdrop(VOID)
@@ -154,3 +154,4 @@ const UIVTBL MiniTuiVtbl =
        TuiDisplayMenu,
        MiniTuiDrawMenu,
 };
+#endif
index a52c81c..433ddb7 100644 (file)
@@ -5,7 +5,7 @@
  * PURPOSE:         No Text UI interface
  * PROGRAMMERS:     Hervé Poussineau
  */
-
+#ifndef _M_ARM
 #include <freeldr.h>
 
 BOOLEAN NoUiInitialize(VOID)
@@ -118,3 +118,4 @@ BOOLEAN NoUiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG Default
 VOID NoUiDrawMenu(PUI_MENU_INFO MenuInfo)
 {
 }
+#endif
index d0016f4..91356d2 100644 (file)
@@ -16,7 +16,7 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-
+#ifndef _M_ARM
 #include <freeldr.h>
 
 PVOID  TextVideoBuffer = NULL;
@@ -325,13 +325,8 @@ VOID TuiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr)
        // Draw the text
        for (i=X, j=0; Text[j]  && i<UiScreenWidth; i++,j++)
        {
-#ifndef _ARM_
                ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)] = (UCHAR)Text[j];
                ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)+1] = Attr;
-#else
-        UNREFERENCED_PARAMETER(ScreenMemory);
-        MachVideoPutChar(Text[j], Attr, i, Y);
-#endif
        }
 }
 
@@ -985,3 +980,4 @@ const UIVTBL TuiVtbl =
        TuiDisplayMenu,
        TuiDrawMenu,
 };
+#endif
index 68cb05f..055e1b4 100644 (file)
@@ -8,7 +8,7 @@
  */
 
 /* INCLUDES ******************************************************************/
-
+#ifndef _M_ARM
 #include <freeldr.h>
 
 /* FUNCTIONS *****************************************************************/
@@ -530,3 +530,4 @@ TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo,
     //
     return KeyEvent;
 }
+#endif
index 4864f0a..9a6a237 100644 (file)
@@ -16,7 +16,7 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-
+#ifndef _M_ARM
 #include <freeldr.h>
 #include <debug.h>
 
@@ -496,3 +496,4 @@ BOOLEAN UiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length)
 {
        return UiVtbl.EditBox(MessageText, EditTextBuffer, Length);
 }
+#endif
index 9839f2a..4cfd435 100644 (file)
@@ -16,7 +16,7 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-
+#ifndef _M_ARM
 #include <freeldr.h>
 
 #define RGB_MAX                                                64
@@ -130,3 +130,4 @@ VOID VideoFadeOut(ULONG ColorCount)
                }
        }
 }
+#endif
index 8b1f469..c631648 100644 (file)
@@ -16,9 +16,8 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-
+#ifndef _M_ARM
 #include <freeldr.h>
-
 VOID VideoSavePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount)
 {
        ULONG           Color;
@@ -40,3 +39,4 @@ VOID VideoRestorePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount)
                MachVideoSetPaletteColor(Color, Palette[Color].Red, Palette[Color].Green, Palette[Color].Blue);
        }
 }
+#endif
index 0f9fc9a..5401d81 100644 (file)
@@ -16,7 +16,7 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-
+#ifndef _M_ARM
 #include <freeldr.h>
 
 PVOID  VideoOffScreenBuffer = NULL;
@@ -42,3 +42,4 @@ VOID VideoCopyOffScreenBufferToVRAM(VOID)
 {
        MachVideoCopyOffScreenBufferToVRAM(VideoOffScreenBuffer);
 }
+#endif
diff --git a/reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c
new file mode 100644 (file)
index 0000000..660656a
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+ * PROJECT:         ReactOS Boot Loader
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            boot/freeldr/arch/arm/loader.c
+ * PURPOSE:         ARM Kernel Loader
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES ***************************************************************/
+
+#include <freeldr.h>
+#include <debug.h>
+#include <internal/arm/mm.h>
+#include <internal/arm/intrin_i.h>
+
+#define PFN_SHIFT                   12
+#define LARGE_PFN_SHIFT             20
+
+#define PTE_BASE                    0xC0000000
+#define PDE_BASE                    0xC0400000
+#define PDR_BASE                    0xFFD00000
+#define MMIO_BASE                   0x10000000
+#define VECTOR_BASE                 0xFFFF0000
+
+#define LowMemPageTableIndex        0
+#define KernelPageTableIndex        (KSEG0_BASE >> PDE_SHIFT)
+#define StartupPtePageTableIndex    (PTE_BASE >> PDE_SHIFT)
+#define StartupPdePageTableIndex    (PDE_BASE >> PDE_SHIFT)
+#define MmioPageTableIndex          (MMIO_BASE >> PDE_SHIFT)
+#define PdrPageTableIndex           (PDR_BASE >> PDE_SHIFT)
+#define VectorPageTableIndex        (VECTOR_BASE >> PDE_SHIFT)
+
+/* Converts a Physical Address into a Page Frame Number */
+#define PaToPfn(p)                  ((p) >> PFN_SHIFT)
+#define PaToLargePfn(p)             ((p) >> LARGE_PFN_SHIFT)
+#define PaPtrToPfn(p)               (((ULONG_PTR)(p)) >> PFN_SHIFT)
+
+/* Converts a Physical Address into a Coarse Page Table PFN */
+#define PaPtrToPdePfn(p)            (((ULONG_PTR)(p)) >> CPT_SHIFT)
+
+typedef struct _KPDR_PAGE
+{
+    PAGE_DIRECTORY_ARM PageDir;             // 0xC0400000 [0xFFD00000]
+    CHAR HyperSpace[233 * PAGE_SIZE];       // 0xC0404000 [0xFFD04000]
+    PAGE_TABLE_ARM KernelPageTable[3];      // 0xC04ED000 [0xFFDED000]
+    CHAR SharedData[PAGE_SIZE];             // 0xC04F0000 [0xFFDF0000]
+    CHAR KernelStack[KERNEL_STACK_SIZE];    // 0xC04F1000 [0xFFDF1000]
+    CHAR PanicStack[KERNEL_STACK_SIZE];     // 0xC04F4000 [0xFFDF4000]
+    CHAR InterruptStack[KERNEL_STACK_SIZE]; // 0xC04F7000 [0xFFDF7000]
+    CHAR InitialProcess[PAGE_SIZE];         // 0xC04FA000 [0xFFDFA000]
+    CHAR InitialThread[PAGE_SIZE];          // 0xC04FB000 [0xFFDFB000]
+    CHAR Prcb[PAGE_SIZE];                   // 0xC04FC000 [0xFFDFC000]
+    PAGE_TABLE_ARM PageDirPageTable;        // 0xC04FD000 [0xFFDFD000]
+    PAGE_TABLE_ARM VectorPageTable;         // 0xC04FE000 [0xFFDFE000]
+    CHAR Pcr[PAGE_SIZE];                    // 0xC04FF000 [0xFFDFF000]
+} KPDR_PAGE, *PKPDR_PAGE;
+
+C_ASSERT(sizeof(KPDR_PAGE) == (1 * 1024 * 1024));
+
+HARDWARE_PTE_ARMV6 TempPte;
+HARDWARE_LARGE_PTE_ARMV6 TempLargePte;
+HARDWARE_PDE_ARMV6 TempPde;
+PKPDR_PAGE PdrPage;
+
+/* FUNCTIONS **************************************************************/
+
+BOOLEAN
+MempSetupPaging(IN ULONG StartPage,
+                       IN ULONG NumberOfPages)
+{
+    return TRUE;
+}
+
+VOID
+MempUnmapPage(IN ULONG Page)
+{
+    return;
+}
+
+VOID
+MempDump(VOID)
+{
+    return;
+}
+
+BOOLEAN
+WinLdrMapSpecialPages(ULONG PcrBasePage)
+{
+    ULONG i;
+    PHARDWARE_PTE_ARMV6 PointerPte;
+    PHARDWARE_PDE_ARMV6 PointerPde;
+    PHARDWARE_LARGE_PTE_ARMV6 LargePte;
+    PFN_NUMBER Pfn;
+    
+    /* Setup the Startup PDE */
+    LargePte = &PdrPage->PageDir.Pte[StartupPdePageTableIndex];
+    TempLargePte.PageFrameNumber = PaToLargePfn((ULONG_PTR)&PdrPage->PageDir);
+    *LargePte = TempLargePte;
+    
+    /* Map-in the PDR */
+    LargePte = &PdrPage->PageDir.Pte[PdrPageTableIndex];
+    *LargePte = TempLargePte;
+
+    /* After this point, any MiAddressToPde is guaranteed not to fault */
+
+    /*
+     * Link them in the Startup PDE.
+     * Note these are the entries in the PD at (MiAddressToPde(PTE_BASE)).
+     */
+    PointerPde = &PdrPage->PageDir.Pde[StartupPtePageTableIndex];
+    Pfn = PaPtrToPdePfn(&PdrPage->PageDirPageTable);
+    for (i = 0; i < 4; i++)
+    {
+        TempPde.PageFrameNumber = Pfn++;
+        *PointerPde++ = TempPde;
+    }
+
+    /* 
+     * Now map these page tables in PTE space (MiAddressToPte(PTE_BASE)).
+     * Note that they all live on a single page, since each is 1KB.
+     */
+    PointerPte = &PdrPage->PageDirPageTable.Pte[0x300];
+    TempPte.PageFrameNumber = PaPtrToPfn(&PdrPage->PageDirPageTable);
+    *PointerPte = TempPte;
+
+    /*
+     * After this point, MiAddressToPte((PDE_BASE) to MiAddressToPte(PDE_TOP))
+     * is guaranteed not to fault.
+     * Any subsequent page allocation will first need its page table created
+     * and mapped in the PTE_BASE first, then the page table itself will be
+     * editable through its flat PTE address.
+     */
+
+    /* Setup the Vector PDE */
+    PointerPde = &PdrPage->PageDir.Pde[VectorPageTableIndex];
+    TempPde.PageFrameNumber = PaPtrToPdePfn(&PdrPage->VectorPageTable);
+    *PointerPde = TempPde;
+
+    /* Setup the Vector PTEs */
+    PointerPte = &PdrPage->VectorPageTable.Pte[0xF0];
+    TempPte.PageFrameNumber = 0;
+    *PointerPte = TempPte;
+
+    /* TODO: Map in the kernel CPTs */ 
+    return TRUE;
+}
+
+VOID
+WinLdrSetupForNt(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+                 IN PVOID *GdtIdt,
+                 IN ULONG *PcrBasePage,
+                 IN ULONG *TssBasePage)
+{
+    PKPDR_PAGE PdrPage = (PVOID)0xFFD00000;
+
+    /* Load cache information */
+    LoaderBlock->u.Arm.FirstLevelDcacheSize = FirstLevelDcacheSize;
+    LoaderBlock->u.Arm.FirstLevelDcacheFillSize = FirstLevelDcacheFillSize;
+    LoaderBlock->u.Arm.FirstLevelIcacheSize = FirstLevelIcacheSize;
+    LoaderBlock->u.Arm.FirstLevelIcacheFillSize = FirstLevelIcacheFillSize;
+    LoaderBlock->u.Arm.SecondLevelDcacheSize = SecondLevelDcacheSize;
+    LoaderBlock->u.Arm.SecondLevelDcacheFillSize = SecondLevelDcacheFillSize;
+    LoaderBlock->u.Arm.SecondLevelIcacheSize = SecondLevelIcacheSize;
+    LoaderBlock->u.Arm.SecondLevelIcacheFillSize = SecondLevelIcacheSize;
+    
+    /* Write initial context information */
+    LoaderBlock->KernelStack = (ULONG_PTR)PdrPage->KernelStack;
+    LoaderBlock->KernelStack += KERNEL_STACK_SIZE;
+    LoaderBlock->u.Arm.PanicStack = (ULONG_PTR)PdrPage->PanicStack;
+    LoaderBlock->u.Arm.PanicStack += KERNEL_STACK_SIZE;
+    LoaderBlock->u.Arm.InterruptStack = (ULONG_PTR)PdrPage->InterruptStack;
+    LoaderBlock->u.Arm.InterruptStack += KERNEL_STACK_SIZE;
+    LoaderBlock->Prcb = (ULONG_PTR)PdrPage->Prcb;
+    LoaderBlock->Process = (ULONG_PTR)PdrPage->InitialProcess;
+    LoaderBlock->Thread = (ULONG_PTR)PdrPage->InitialThread;
+}
+
+BOOLEAN
+MempAllocatePageTables(VOID)
+{
+    ULONG i;
+    PHARDWARE_PTE_ARMV6 PointerPte;
+    PHARDWARE_PDE_ARMV6 PointerPde;
+    PHARDWARE_LARGE_PTE_ARMV6 LargePte;
+    PFN_NUMBER Pfn;
+
+    /* Setup templates */
+    TempPte.Accessed = TempPte.Valid = TempLargePte.LargePage = TempLargePte.Accessed = TempPde.Valid = 1;
+
+    /* Allocate the 1MB "PDR" (Processor Data Region). Must be 1MB aligned */
+    PdrPage = MmAllocateMemoryAtAddress(sizeof(KPDR_PAGE), (PVOID)0x700000, LoaderMemoryData);
+
+    /* Setup the Low Memory PDE as an identity-mapped Large Page (1MB) */
+    LargePte = &PdrPage->PageDir.Pte[LowMemPageTableIndex];
+    *LargePte = TempLargePte;
+
+    /* Setup the MMIO PDE as two identity mapped large pages -- the kernel will blow these away later */
+    LargePte = &PdrPage->PageDir.Pte[MmioPageTableIndex];
+    Pfn = PaToLargePfn(0x10000000);
+    for (i = 0; i < 2; i++)
+    {
+        TempLargePte.PageFrameNumber = Pfn++;
+        *LargePte++ = TempLargePte;
+    }
+
+    /* Setup the Kernel PDEs */
+    PointerPde = &PdrPage->PageDir.Pde[KernelPageTableIndex];
+    Pfn = PaPtrToPdePfn(PdrPage->KernelPageTable);
+    for (i = 0; i < 12; i++)
+    {
+        TempPde.PageFrameNumber = Pfn;
+        *PointerPde++ = TempPde;
+        Pfn++;
+    }
+
+    /* Setup the Kernel PTEs */
+    PointerPte = PdrPage->KernelPageTable[0].Pte;
+    Pfn = 0;
+    for (i = 0; i < 3072; i++)
+    {
+        TempPte.PageFrameNumber = Pfn++;
+        *PointerPte++ = TempPte;
+    }
+    
+    /* Done */
+    return TRUE;
+}
+
+VOID
+WinLdrSetProcessorContext(PVOID GdtIdt,
+                          IN ULONG Pcr,
+                          IN ULONG Tss)
+{    
+       ARM_CONTROL_REGISTER ControlRegister;
+    ARM_TTB_REGISTER TtbRegister;
+    ARM_DOMAIN_REGISTER DomainRegister;
+    
+    /* Set the TTBR */
+    TtbRegister.AsUlong = (ULONG_PTR)&PdrPage->PageDir;
+    ASSERT(TtbRegister.Reserved == 0);
+    KeArmTranslationTableRegisterSet(TtbRegister);
+
+    /* Disable domains and simply use access bits on PTEs */
+    DomainRegister.AsUlong = 0;
+    DomainRegister.Domain0 = ClientDomain;
+    KeArmDomainRegisterSet(DomainRegister);
+
+    /* Enable ARMv6+ paging (MMU), caches and the access bit */
+    ControlRegister = KeArmControlRegisterGet();
+    ControlRegister.MmuEnabled = TRUE;
+    ControlRegister.ICacheEnabled = TRUE;
+    ControlRegister.DCacheEnabled = TRUE;
+    ControlRegister.ForceAp = TRUE;
+    ControlRegister.ExtendedPageTables = TRUE;
+    KeArmControlRegisterSet(ControlRegister); 
+}
index 42ca170..fae23d6 100644 (file)
@@ -56,7 +56,7 @@ WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
        PLDR_DATA_TABLE_ENTRY DataTableEntry;
        LIST_ENTRY *ModuleEntry;
 
-       DPRINTM(DPRINT_PELOADER, "WinLdrCheckForLoadedDll: DllName %X, LoadedEntry: %X\n",
+       DPRINTM(DPRINT_PELOADER, "WinLdrCheckForLoadedDll: DllName %s, LoadedEntry: %X\n",
                DllName, LoadedEntry);
 
        /* Just go through each entry in the LoadOrderList and compare loaded module's
@@ -277,7 +277,7 @@ WinLdrLoadImage(IN PCHAR FileName,
        Status = ArcOpen(FileName, OpenReadOnly, &FileId);
        if (Status != ESUCCESS)
        {
-               UiMessageBox("Can not open the file");
+               //UiMessageBox("Can not open the file");
                return FALSE;
        }
 
index 4d96515..dc210bd 100644 (file)
@@ -37,6 +37,7 @@ extern char reactos_arc_strings[32][256];
 
 extern BOOLEAN UseRealHeap;
 extern ULONG LoaderPagesSpanned;
+extern BOOLEAN AcpiPresent;
 
 BOOLEAN
 WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock,
@@ -196,6 +197,13 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
        Extension->MinorVersion = VersionToBoot & 0xFF;
        Extension->Profile.Status = 2;
 
+       /* Check if ACPI is present */
+       if (AcpiPresent)
+       {
+               /* See KiRosFrldrLpbToNtLpb for details */
+               Extension->AcpiTable = (PVOID)1;
+       }
+
        /* Load drivers database */
        strcpy(MiscFiles, BootPath);
        strcat(MiscFiles, "AppPatch\\drvmain.sdb");
@@ -224,7 +232,7 @@ WinLdrLoadDeviceDriver(PLOADER_PARAMETER_BLOCK LoaderBlock,
        PVOID DriverBase;
 
        // Separate the path to file name and directory path
-       sprintf(DriverPath, "%S", FilePath->Buffer);
+       snprintf(DriverPath, sizeof(DriverPath), "%wZ", FilePath);
        DriverNamePos = strrchr(DriverPath, '\\');
        if (DriverNamePos != NULL)
        {
@@ -253,7 +261,7 @@ WinLdrLoadDeviceDriver(PLOADER_PARAMETER_BLOCK LoaderBlock,
        }
 
        // It's not loaded, we have to load it
-       sprintf(FullPath,"%s%S", BootPath, FilePath->Buffer);
+       snprintf(FullPath, sizeof(FullPath), "%s%wZ", BootPath, FilePath);
        Status = WinLdrLoadImage(FullPath, LoaderBootDriver, &DriverBase);
        if (!Status)
        {
@@ -320,6 +328,7 @@ WinLdrLoadBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock,
 
                // Convert the RegistryPath and DTE addresses to VA since we are not going to use it anymore
                BootDriver->RegistryPath.Buffer = PaToVa(BootDriver->RegistryPath.Buffer);
+               BootDriver->FilePath.Buffer = PaToVa(BootDriver->FilePath.Buffer);
                BootDriver->LdrEntry = PaToVa(BootDriver->LdrEntry);
 
                NextBd = BootDriver->Link.Flink;
@@ -590,7 +599,7 @@ LoadAndBootWindows(PCSTR OperatingSystemName,
 DbgPrint("Heeelooo\n");
 
        /* Save final value of LoaderPagesSpanned */
-       LoaderBlock->Extension->LoaderPagesSpanned = LoaderPagesSpanned;
+       LoaderBlockVA->Extension->LoaderPagesSpanned = LoaderPagesSpanned;
 
        DPRINTM(DPRINT_WINDOWS, "Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n",
                KiSystemStartup, LoaderBlockVA);
index 668dea3..bfa68ab 100644 (file)
@@ -198,6 +198,10 @@ MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
        }
 }
 
+#ifdef _M_ARM
+#define PKTSS PVOID
+#endif
+
 BOOLEAN
 WinLdrTurnOnPaging(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
                    ULONG PcrBasePage,
index beace92..a2c5eff 100644 (file)
@@ -18,7 +18,4 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __INSTALL_H
-#define __INSTALL_H
-
-#endif // defined __INSTALL_H
+#pragma once
index b4aa6ae..12b3ee8 100644 (file)
@@ -1,6 +1,4 @@
-#ifndef __FINSTEXT2_H
-#define __FINSTEXT2_H
-
+#pragma once
 
 #define PACKED                 __attribute__((packed))
 
@@ -28,8 +26,4 @@ typedef struct
        unsigned char   BootPartition;
        unsigned short  BootSignature;
 
-} PACKED EXT2_BOOTCODE, *PEXT2_BOOTCODE;
-
-
-
-#endif // defined __FINSTEXT2_H
\ No newline at end of file
+} PACKED EXT2_BOOTCODE, *PEXT2_BOOTCODE;
\ No newline at end of file
index f173a6a..26654fc 100644 (file)
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef __VOLUME_H
-#define __VOLUME_H
+#pragma once
 
 BOOL   OpenVolume(LPCTSTR lpszVolumeName);
 void   CloseVolume(void);
 BOOL   ReadVolumeSector(ULONG SectorNumber, PVOID SectorBuffer);
 BOOL   WriteVolumeSector(ULONG SectorNumber, PVOID SectorBuffer);
-
-#endif // defined __VOLUME_H
index 954b094..88c29d2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_SYSDM_H
-#define __CPL_SYSDM_H
+#pragma once
 
 typedef LONG (CALLBACK *APPLET_INITPROC)(VOID);
 
@@ -59,6 +58,4 @@ INT_PTR CALLBACK KeyboardPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
 INT_PTR CALLBACK MousePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 INT_PTR CALLBACK SoundPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
-#endif /* __CPL_SYSDM_H */
-
 /* EOF */
index 3f8de37..50fb674 100644 (file)
@@ -23,7 +23,7 @@ BEGIN
   AUTOCHECKBOX "&Signalfunktion benutzen",IDC_TOGGLE_BOX,PROPSHEETPADDING(2),LABELLINE(20)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14
   PUSHBUTTON "Ei&nstellungen",IDC_TOGGLE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(20)+2,PROPSHEETPADDING(15),14
 
-  AUTOCHECKBOX "Extra Tastaturhilfe in &Programmen anzeigen ",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14
+  AUTOCHECKBOX "Extra-Tastaturhilfe in &Programmen anzeigen ",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14
 END
 
 
@@ -75,7 +75,7 @@ CAPTION "Maus"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
   GROUPBOX "Tastaturmaus",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
-  LTEXT "Aktivieren Sie diese Option, um den Mauszeiger mit dem Nummernpad der Tastatur zu steuern.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3)
+  LTEXT "Aktivieren Sie diese Option, um den Mauszeiger mit den Nummerntasten der Tastatur zu steuern.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3)
   AUTOCHECKBOX "&Tastaturmaus aktivieren",IDC_MOUSE_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14
   PUSHBUTTON "&Einstellungen",IDC_MOUSE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14
 END
@@ -112,12 +112,12 @@ CAPTION "Einstellungen f
 FONT 8, "MS Shell Dlg"
 BEGIN
   GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
-  LTEXT "Drücken Sie fünfmal die Umschalttaste um die Einrastfunktion zu aktivieren.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3)
+  LTEXT "Drücken Sie fünfmal die Umschalttaste, um die Einrastfunktion zu aktivieren.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3)
   AUTOCHECKBOX "Tastenkombination a&ktivieren",IDC_STICKY_ACTIVATE_CHECK,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETPADDING(17)+4,14
 
   GROUPBOX "Optionen",-1,PROPSHEETPADDING(1),LABELLINE(9),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1)
   AUTOCHECKBOX "&Zum Einrasten Feststelltaste zweimal drücken.",IDC_STICKY_LOCK_CHECK,PROPSHEETPADDING(2),LABELLINE(10)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14
-  AUTOCHECKBOX "&Einrastfunktion deaktivieren wenn zwei Tasten gedrückt sind.",IDC_STICKY_UNLOCK_CHECK,PROPSHEETPADDING(2),LABELLINE(12),PROPSHEETWIDTH-PROPSHEETPADDING(4),14
+  AUTOCHECKBOX "&Einrastfunktion deaktivieren, wenn zwei Tasten gedrückt sind.",IDC_STICKY_UNLOCK_CHECK,PROPSHEETPADDING(2),LABELLINE(12),PROPSHEETWIDTH-PROPSHEETPADDING(4),14
 
   GROUPBOX "Mitteilungen",-1,PROPSHEETPADDING(1),LABELLINE(15),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1)
   AUTOCHECKBOX "&Ausgabe eines Tons wenn die Feststelltaste gedrückt wird.",IDC_STICKY_SOUND_CHECK,PROPSHEETPADDING(2),LABELLINE(16)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14
@@ -130,7 +130,7 @@ END
 
 IDD_FILTERKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Anschlagverzögerung Einstellungen"
+CAPTION "AnschlagverzögerungseEinstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
   GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
@@ -150,13 +150,13 @@ BEGIN
   AUTOCHECKBOX "Status der Ansc&hlagverzögerung auf dem Bildschirm anzeigen.",IDC_FILTER_STATUS_CHECK,PROPSHEETPADDING(2),LABELLINE(20)+6,PROPSHEETWIDTH-PROPSHEETPADDING(4),10
 
   DEFPUSHBUTTON "OK", IDOK, PROPSHEETWIDTH-111, PROPSHEETHEIGHT-21, 50, 14
-  PUSHBUTTON "Abrechen", IDCANCEL, PROPSHEETWIDTH-57, PROPSHEETHEIGHT-21, 50, 14
+  PUSHBUTTON "Abbrechen", IDCANCEL, PROPSHEETWIDTH-57, PROPSHEETHEIGHT-21, 50, 14
 END
 
 
 IDD_TOGGLEKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Toggle Keys Einstellungen"
+CAPTION "Toggle-Keys-Einstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
   GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
@@ -170,14 +170,14 @@ END
 
 IDD_CONTRASTOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Hoher Konstrast Einstellungen"
+CAPTION "Einstellungen für hohen Konstrast"
 FONT 8, "MS Shell Dlg"
 BEGIN
   GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
   LTEXT "Die Tastenkombination für hohen Kontrast ist:\nDrücke <Left Alt+Left Shift+Print Screen>.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3)
   AUTOCHECKBOX "&Wähle Schnelltaste",IDC_CONTRAST_ACTIVATE_CHECK,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14
 
-  GROUPBOX "Hoher Kontrast Farbschema",-1,PROPSHEETPADDING(1),LABELLINE(9),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1)
+  GROUPBOX "Hoher-Kontrast-Farbschema",-1,PROPSHEETPADDING(1),LABELLINE(9),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1)
   LTEXT "Derzeitiges Farbschema:",-1,PROPSHEETPADDING(2),LABELLINE(10)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(1)
   COMBOBOX IDC_CONTRAST_COMBO, PROPSHEETPADDING(2), LABELLINE(11)+2, PROPSHEETWIDTH-PROPSHEETPADDING(4), LABELLINE(6),
            CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP
@@ -189,7 +189,7 @@ END
 
 IDD_MOUSEKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Tastaturmaus Einstellungen"
+CAPTION "Tastaturmaus-Einstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
   GROUPBOX "Tastenkombiation",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1)
@@ -223,10 +223,10 @@ END
 
 IDD_BOUNCEKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Erweiterte Anschlagverzögerung Einstellungen"
+CAPTION "Einstellungen für die erweiterte Anschlagverzögerung"
 FONT 8, "MS Shell Dlg"
 BEGIN
-  GROUPBOX "Bounce Keys",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5)
+  GROUPBOX "Tastenanschläge",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5)
   LTEXT "&Tastenanschläge igorieren, die schneller wiederholt werden als:",-1,PROPSHEETPADDING(2),LABELLINE(2)+1,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2)
   COMBOBOX IDC_BOUNCE_TIME_COMBO, PROPSHEETPADDING(2), LABELLINE(3)+5, PROPSHEETWIDTH-PROPSHEETPADDING(4), LABELLINE(6),
            CBS_DROPDOWNLIST | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP
@@ -241,10 +241,10 @@ END
 
 IDD_REPEATKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Erweiterte Anschlagverzögerung Einstellungen"
+CAPTION "Einstellungen für die erweiterte Anschlagverzögerung"
 FONT 8, "MS Shell Dlg"
 BEGIN
-  GROUPBOX "Repeat Keys",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(12)
+  GROUPBOX "Tastenwiederholung",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(12)
   LTEXT "Tastatureinstellungen in der Systemsteuerung übergehen:",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2)
 
   AUTORADIOBUTTON "&Keine Wiederholung",IDC_REPEAT_NOREPEAT_RADIO,PROPSHEETPADDING(2),LABELLINE(3)+3,78,LABELLINE(1),WS_GROUP
@@ -273,7 +273,7 @@ END
 
 IDD_SERIALKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "SerialKeys Einstellungen"
+CAPTION "SerialKeys-Einstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
   GROUPBOX "Serial Keys",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(10)
index 88f6ffa..04ab118 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* metrics */
 #define PROPSHEETWIDTH  246
 #define IDC_SERIAL_PORT_COMBO          275
 #define IDC_SERIAL_BAUD_COMBO          276
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index c243997..8ee2bd4 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_APPWIZ_H
-#define __CPL_APPWIZ_H
+#pragma once
 
 #define COBJMACROS
 #include <windows.h>
@@ -41,6 +40,4 @@ NewLinkHere(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
 
 void ShowLastWin32Error(HWND hWndOwner);
 
-#endif /* __CPL_APPWIZ_H */
-
 /* EOF */
index fe55301..b2c32d2 100644 (file)
@@ -43,7 +43,7 @@ END
 
 STRINGTABLE
 BEGIN
-       IDS_CPLSYSTEMNAME "Programme Hinzufügen/Entfernen"
+       IDS_CPLSYSTEMNAME "Programme hinzufügen/entfernen"
        IDS_CPLSYSTEMDESCRIPTION "Installiert Programme und erstellt Verknüpfungen."
     IDS_CREATE_SHORTCUT "Verknüpfung erstellen"
     IDS_ERROR_NOT_FOUND "Die Datei %s konnte nicht gefunden werden."
index e889faf..b0dda40 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* metrics */
 #define PROPSHEETWIDTH         380
@@ -32,6 +31,4 @@
 #define IDC_SHORTCUT_BROWSE            108
 #define IDC_SHORTCUT_NAME              109
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index e01dc0a..a661141 100644 (file)
@@ -20,7 +20,7 @@ GROUPBOX "Cursorgr
 CONTROL "&Klein", IDC_RADIO_SMALL_CURSOR, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 25, 90, 10
 CONTROL "&Mittel", IDC_RADIO_MEDIUM_CURSOR, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 40, 90, 10
 CONTROL "&Groß", IDC_RADIO_LARGE_CURSOR, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 90, 10
-GROUPBOX "Display Einstellungen", -1, 140, 15, 100, 70, WS_CHILD | WS_VISIBLE | WS_GROUP
+GROUPBOX "Anzeigeeinstellungen", -1, 140, 15, 100, 70, WS_CHILD | WS_VISIBLE | WS_GROUP
 CONTROL "&Fenster", IDC_RADIO_DISPLAY_WINDOW, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 150, 35, 70, 10
 CONTROL "V&ollbild", IDC_RADIO_DISPLAY_FULL, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 150, 50, 70, 10
 GROUPBOX "Befehlsspeicher:", -1, 15, 90, 120, 70, WS_CHILD | WS_VISIBLE | WS_GROUP
@@ -34,7 +34,7 @@ CHECKBOX "&Alte Duplikate l
 
 
 GROUPBOX "Bearbeitungsoptionen", -1, 140, 90, 100, 70, BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP
-CHECKBOX "&QuickEdit Modus", IDC_CHECK_QUICK_EDIT, 150, 100, 70, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+CHECKBOX "&QuickEdit-Modus", IDC_CHECK_QUICK_EDIT, 150, 100, 70, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 CHECKBOX "&Einfügemodus", IDC_CHECK_INSERT_MODE, 150, 120, 70, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
@@ -53,7 +53,7 @@ LISTBOX IDC_LBOX_TYPE, 10, 120, 110, 50, LBS_DISABLENOSCROLL | WS_VSCROLL
 GROUPBOX "", IDC_GROUPBOX_FONT_NAME, 10, 155, 200, 50
 CONTROL "", IDC_STATIC_SELECT_FONT_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 15, 165, 95, 35
 LTEXT "Jedes Zeichen ist:", -1, 130, 165, 75, 10
-LTEXT "screen pixel breit\nscreen pixel hoch", -1, 140, 180, 65, 20
+LTEXT "Bildschirmpixeö breit\nBildschirmpixel hoch", -1, 140, 180, 65, 20
 LTEXT "", IDC_FONT_SIZE_X, 125, 180, 10, 10
 LTEXT "", IDC_FONT_SIZE_Y, 125, 188, 10, 10
 END
@@ -147,5 +147,5 @@ BEGIN
   IDS_CPLDESCRIPTION "Konfiguriert die Konsoleneigenschaften."
   IDS_APPLY_SHORTCUT_ALL "Modifiziere die &Verknüpfung, die das Fenster startete"
   IDS_SCREEN_TEXT "C:\ReactOS> dir\nSYSTEM          <DIR>     10-01-99     5:00\nSYSTEM32      <DIR>     10-01-99     5:00"
-  IDS_RASTERFONTS "Raster Schriften"
+  IDS_RASTERFONTS "Rasterschriften"
 END
index e621cc6..09ffcce 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef RESOURCE_H__
-#define RESOURCE_H__
+#pragma once
 
 #define IDC_CPLICON                            40
 #define IDS_CPLNAME                            41
@@ -92,5 +91,3 @@
 //string ids
 #define IDS_SCREEN_TEXT                                        700
 #define IDS_RASTERFONTS                                        701
-
-#endif
index 8b1d9de..a486ead 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_DESK_H__
-#define __CPL_DESK_H__
+#pragma once
 
 #define COBJMACROS
 #include <windows.h>
@@ -96,6 +95,3 @@ HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY,LPCWSTR,UINT,IDataObject*);
 
 INT_PTR CALLBACK
 AdvGeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-#endif /* __CPL_DESK_H__ */
-
index 4deba82..d0829d9 100644 (file)
@@ -124,7 +124,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Einstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT           "Verschieben Sie die Monitor-Symbole, sodass sie der physikalischen Anordnung Ihrer Monitore entsprechen.",-1,3,1,240,16
+    LTEXT           "Verschieben Sie die Monitor-Symbole, so dass sie der physikalischen Anordnung Ihrer Monitore entsprechen.",-1,3,1,240,16
     CONTROL         "",IDC_SETTINGS_MONSEL,"MONITORSELWNDCLASS",WS_CHILD|WS_VISIBLE|WS_TABSTOP,3,20,240,82,WS_EX_CLIENTEDGE
     LTEXT           "&Anzeige:",1820,3,106,30,8
     LTEXT           "<kein>",IDC_SETTINGS_DEVICE,9,115,224,8
@@ -178,8 +178,8 @@ END
 
 STRINGTABLE  DISCARDABLE
 BEGIN
-    IDS_SLIDEEFFECT "Slide-Effekt"
-    IDS_FADEEFFECT  "Fade-Effekt"
+    IDS_SLIDEEFFECT "Gleiten"
+    IDS_FADEEFFECT  "Ausblenden"
 END
 
 STRINGTABLE DISCARDABLE
index 0c4761b..01d7c79 100644 (file)
@@ -63,7 +63,7 @@ BEGIN
                     WS_VISIBLE | WS_BORDER, 7, 7, 232, 120
     LTEXT           "Schemat kolorów", IDC_STATIC, 7, 140, 64, 7
     COMBOBOX        IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "&Effects...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15
+    PUSHBUTTON      "&Efekty...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15
     PUSHBUTTON      "Zaawansowane", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15
 END
 
@@ -108,24 +108,24 @@ END
 IDD_EFFAPPEARANCE DIALOGEX DISCARDABLE 0, 0, 285, 185
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE
-CAPTION "Effects"
+CAPTION "Efekty"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    CONTROL         "&Use the following transition effect for menus and tooltips:",IDC_EFFAPPEARANCE_ANIMATION,"button",
+    CONTROL         "&U¿yj nastêpuj¹cego efektu przej\9ccia dla menu i etykiet narzêdzi:",IDC_EFFAPPEARANCE_ANIMATION,"button",
                     BS_AUTOCHECKBOX | WS_TABSTOP, 10, 5, 285, 19
     COMBOBOX        IDC_EFFAPPEARANCE_ANIMATIONTYPE, 20, 25, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "U&se the following method to smooth edges of screen fonts:",IDC_EFFAPPEARANCE_SMOOTHING,"button",
+    CONTROL         "U¿&yj nastêpuj¹cej metody wyg³adzania krawêdzi czcionek ekranowych:",IDC_EFFAPPEARANCE_SMOOTHING,"button",
                     BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 42, 285, 19
     COMBOBOX        IDC_EFFAPPEARANCE_SMOOTHINGTYPE, 20, 62, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
-    CONTROL         "Us&e large icons",IDC_EFFAPPEARANCE_LARGEICONS,"button",
+    CONTROL         "U¿y&j du¿ych ikon",IDC_EFFAPPEARANCE_LARGEICONS,"button",
                     BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 80, 285, 19
-    CONTROL         "Show sh&adows under menus",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button",
+    CONTROL         "Pok&a¿ cienie pod menu",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button",
                     BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 95, 285, 19
-    CONTROL         "Show &window contents while dragging",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button",
+    CONTROL         "Poka¿ za&warto\9cæ okna podczas przeci¹gania",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button",
                     BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 110, 285, 19
-    CONTROL         "&Hide underlined letters for keyboard navigation until I press the Alt key",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button",
+    CONTROL         "U&kryj podkre\9clenie liter do nawigacji klawiatur¹ dopóki nie nacisnê klawisza Alt",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button",
                     BS_AUTOCHECKBOX | WS_TABSTOP, 10, 125, 285, 19
-    PUSHBUTTON "Cancel", IDCANCEL, 226, 165, 50, 14
+    PUSHBUTTON "Anuluj", IDCANCEL, 226, 165, 50, 14
     DEFPUSHBUTTON "OK", IDOK, 172, 165, 50, 14
 END
 
@@ -188,13 +188,13 @@ END
 
 STRINGTABLE  DISCARDABLE
 BEGIN
-    IDS_SLIDEEFFECT "Slide effect"
-    IDS_FADEEFFECT  "Fade effect"
+    IDS_SLIDEEFFECT "Efekt przewijania"
+    IDS_FADEEFFECT  "Efekt przej\9ccia"
 END
 
 STRINGTABLE DISCARDABLE
 BEGIN
-    IDS_STANDARDEFFECT  "Standard"
+    IDS_STANDARDEFFECT  "Standardowe"
     IDS_CLEARTYPEEFFECT "ClearType"
 END
 
index 28326ea..7ee3244 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __MONSLCTL__H
-#define __MONSLCTL__H
+#pragma once
 
 /* Control extended styles */
 #define MSLM_EX_ALLOWSELECTNONE 0x1
@@ -214,5 +213,3 @@ typedef struct _MONSL_MONNMMONITORCHANGING
 
 BOOL RegisterMonitorSelectionControl(IN HINSTANCE hInstance);
 VOID UnregisterMonitorSelectionControl(IN HINSTANCE hInstance);
-
-#endif /* __MONSLCTL__H */
index 54fa074..ae02aba 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_DESK_RESOURCE_H__
-#define __CPL_DESK_RESOURCE_H__
+#pragma once
 
 /* metrics */
 #define PROPSHEETWIDTH                  246
 #define IDC_RESTART_RB                  5002
 #define IDC_WITHOUTREBOOT_RB            5003
 #define IDC_ASKME_RB                    5004
-
-#endif /* __CPL_DESK_RESOURCE_H__ */
-
-
index b480ad1..3712adb 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_HDWWIZ_H
-#define __CPL_HDWWIZ_H
+#pragma once
 
 #include <windows.h>
 #include <commctrl.h>
@@ -19,6 +18,4 @@
 
 extern HINSTANCE hApplet;
 
-#endif /* __CPL_HDWWIZ_H */
-
 /* EOF */
index 6ef031b..9fb5c2d 100644 (file)
@@ -2,21 +2,21 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
 
 IDD_STARTPAGE DIALOG DISCARDABLE 0, 0, 317, 186
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT "Wilkommen zum Hardware Assistenten", IDC_FINISHTITLE, 114, 8, 203, 24
+       LTEXT "Wilkommen zum Hardwareassistenten", IDC_FINISHTITLE, 114, 8, 203, 24
        LTEXT "Dieser Assistent unterstützt Sie bei:", -1, 114, 40, 182, 8
        LTEXT "1) Software installieren, um die an den Computer angeschlossene Hardware zu unterstützen.", -1, 121, 56, 184, 16
        LTEXT "2) Probleme lösen, die Sie mit Ihrer Hardware haben.", -1, 121, 78, 185, 16
        ICON IDI_WARNINGICON, IDC_WARNINGICON, 124, 109, 20, 20
-       LTEXT "Falls die Hardware mit einer Installations CD geliefert wurde, ist es empfehlenswert den Assistenten zu beenden und die Installations CD des Anbieters zu verwenden.", 503, 150, 106, 155, 50
-       LTEXT "Klicken Sie ""Weiter"", um fortzufahren.", -1, 114, 166, 193, 8
+       LTEXT "Falls die Hardware mit einer Installations-CD geliefert wurde, ist es empfehlenswert, den Assistenten zu beenden und die Installations-CD des Anbieters zu verwenden.", 503, 150, 106, 155, 50
+       LTEXT "Klicken Sie auf ""Weiter"", um fortzufahren.", -1, 114, 166, 193, 8
 END
 
 IDD_SEARCHPAGE DIALOG DISCARDABLE 0, 0, 317, 143
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
        LTEXT "", IDC_STATUSTEXT, 21, 8, 275, 32
@@ -25,7 +25,7 @@ END
 
 IDD_ISCONNECTEDPAGE DIALOG DISCARDABLE 0, 0, 317, 143
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
        LTEXT "Ist die Hardware bereits am Computer angeschlossen?", -1, 20, 11, 275, 8
@@ -35,21 +35,21 @@ END
 
 IDD_PROBELISTPAGE DIALOG DISCARDABLE 0, 0, 317, 143
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
        LTEXT "Wählen Sie aus der Liste ein installiertes Gerät aus und klicken Sie auf ""Weiter"", um die Einstellungen zu überprüfen und mögliche Probleme zu lösen.", -1, 21, 8, 275, 22
-       LTEXT "Um Hardware zu installieren, die nicht in der Liste aufgelistet ist, klicken Sie ""Ein neues Gerät hinzufügen.""", -1, 21, 32, 275, 24
+       LTEXT "Um Hardware zu installieren, die nicht in der Liste aufgelistet ist, klicken Sie auf ""Ein neues Gerät hinzufügen.""", -1, 21, 32, 275, 24
        LTEXT "I&nstallierte Hardware:", -1, 21, 62, 140, 8
        CONTROL "", IDC_PROBELIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHAREIMAGELISTS  | LVS_NOCOLUMNHEADER, 21, 72, 275, 66
 END
 
 IDD_SELECTWAYPAGE DIALOG DISCARDABLE 0, 0, 317, 143
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT "Der Assistent kann automatisch Hardware suchen und diese installieren. Oder, falls Sie das zu installierende Gerät genau kennen, können Sie es aus der Liste auswählen.", -1, 21, 8, 280, 24
+       LTEXT "Der Assistent kann automatisch Hardware suchen und diese installieren oder, falls Sie das zu installierende Gerät genau kennen, können Sie es aus der Liste auswählen.", -1, 21, 8, 280, 24
        LTEXT "Wie wollen Sie den Assistenten fortsetzen?", -1, 23, 40, 275, 8
        AUTORADIOBUTTON "Automatisch nach neuer Hardware &suchen und installieren (empfohlen)", IDC_AUTOINSTALL, 30, 55, 266, 8, WS_GROUP | NOT WS_TABSTOP
        AUTORADIOBUTTON "&Manuell aus der Liste ausgewählte Hardware installieren (erweitert)", IDC_MANUALLYINST, 30, 70, 266, 8, NOT WS_TABSTOP
@@ -57,7 +57,7 @@ END
 
 IDD_DETECTEDHWPAGE DIALOG DISCARDABLE 0, 0, 317, 143
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
        LTEXT "", IDC_STATUSTEXT, 21, 9, 275, 40
@@ -67,20 +67,20 @@ END
 
 IDD_HWTYPESPAGE DIALOG DISCARDABLE 0, 0, 317, 143
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT "Wenn Sie die Hardwarekategorie, die Sie benötigen nicht finden, wählen Sie ""Alle Geräte"".", IDC_STATUSTEXT, 21, 9, 275, 18
-       LTEXT "Bekannte &Hardware Typen:", IDC_HWTYPESTEXT, 21, 31, 180, 8
+       LTEXT "Wenn Sie die Hardwarekategorie, die Sie benötigen, nicht finden, wählen Sie ""Alle Geräte"".", IDC_STATUSTEXT, 21, 9, 275, 18
+       LTEXT "Bekannte &Hardwaretypen:", IDC_HWTYPESTEXT, 21, 31, 180, 8
        CONTROL "", IDC_HWTYPESLIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | LVS_NOCOLUMNHEADER, 21, 42, 275, 92
 END
 
 IDD_PROGRESSPAGE DIALOG DISCARDABLE 0, 0, 317, 143
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT "Der Hardware Suchvorgang kann mehere Minuten dauern.", -1, 21, 8, 275, 15
+       LTEXT "Der Hardware-Suchvorgang kann mehrere Minuten dauern.", -1, 21, 8, 275, 15
        LTEXT "Fortschitt:", IDC_TPROGRESSTEXT, 21, 25, 275, 8
        CONTROL "", IDC_TPROGRESSBAR, "msctls_progress32", 0, 21, 37, 275, 14
        LTEXT "", IDC_PROGRESSTEXT, 58, 58, 200, 8, SS_NOPREFIX
@@ -89,21 +89,21 @@ END
 
 IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 186
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT "Hardware Assistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 203, 24
-       LTEXT "Der Hardware Assistent wurde erfolgreich abgeschlossen.", -1, 114, 32, 193, 19
+       LTEXT "Hardwareassistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 203, 24
+       LTEXT "Der Hardwareassistent wurde erfolgreich abgeschlossen.", -1, 114, 32, 193, 19
        LTEXT "", IDC_STATUSTEXT, 114, 70, 193, 92
        LTEXT "Klicken Sie ""Beenden"", um den Assistenten zu schließen.", -1, 114, 166, 192, 8
 END
 
 IDD_ISFOUNDPAGE DIALOG DISCARDABLE 0, 0, 317, 186
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT "Hardware Assistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 203, 24
+       LTEXT "Hardwareassistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 203, 24
        LTEXT "Der Assistent fand folgende Hardware an ihrem Computer:", -1, 114, 32, 193, 19
        LTEXT "Klicken Sie ""Beenden"", um den Assistenten zu schließen.", -1, 114, 166, 132, 8
        CONTROL "", IDC_FOUNDHARDWARELIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHAREIMAGELISTS, 114, 56, 193, 78
@@ -111,10 +111,10 @@ END
 
 IDD_HWSTATUSPAGE DIALOG DISCARDABLE 0, 0, 317, 186
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT "Hardware Assistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 195, 28
+       LTEXT "Hardwareassistent wird vervollständigt", IDC_FINISHTITLE, 114, 8, 195, 28
        LTEXT "Derzeitiger Status der ausgewählten Hardware:", -1, 114, 40, 193, 19
        EDITTEXT IDC_HWSTATUSEDIT, 114, 60, 193, 70, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | NOT WS_TABSTOP
        LTEXT "Klicken Sie ""Beenden"", um Hilfe zum Lösen von möglichen Problemen zu erhalten.", -1, 114, 136, 193, 16
@@ -123,10 +123,10 @@ END
 
 IDD_NOTCONNECTEDPAGE DIALOG DISCARDABLE 0, 0, 317, 186
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware Assistent"
+CAPTION "Hardwareassistent"
 FONT 8, "MS Shell Dlg"
 BEGIN
-       LTEXT "Hardware Assistent kann nicht fortgesetzt werden", IDC_FINISHTITLE, 114, 8, 203, 28
+       LTEXT "Hardwareassistent kann nicht fortgesetzt werden", IDC_FINISHTITLE, 114, 8, 203, 28
        LTEXT "Um fortsetzen zu können, verbinden Sie folgende Hardware mit dem Computer.", -1, 114, 40, 193, 16
        AUTOCHECKBOX "&Nach Beenden den Computer neustarten, um die Hardware anschließen zu können.", IDC_TURNOFFCHECKBOX, 114, 64, 203, 20, BS_TOP | BS_MULTILINE
        LTEXT "In den meisten Fällen wird ReactOS die Hardware automatisch installieren, wenn Sie sie mit dem Computer verbinden. Andernfalls können Sie den Assistenten erneut starten, um die zu unterstützende Hardware zu installieren.", -1, 114, 98, 193, 32
@@ -139,7 +139,7 @@ BEGIN
        IDS_CPLDESCRIPTION "Installiert neue Hardwarekomponenten."
        IDS_SEARCHTITLE "Bitte warten Sie, während der Assistent neue Hardware sucht..."
        IDS_SEARCHTEXT "Dieser Assistent sucht nach Hardware, die vor kurzem an Ihren Computer angeschlossen, aber noch nicht installiert wurde."
-       IDS_ISCONNECTED "Ist die Hardware bereits verbunden?"
+       IDS_ISCONNECTED "Ist die Hardware bereits angeschlossen?"
        IDS_PROBELISTTITLE "Folgende Hardware ist bereits auf Ihrem Computer installiert"
        IDS_ADDNEWDEVICE "Ein neues Gerät hinzufügen"
        IDS_SELECTWAYTITLE "Der Assistent kann Sie bei der Installation anderer Hardware unterstützen"
index 98f8a9c..1d5a832 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* Icons */
 #define IDI_CPLICON               100
@@ -57,6 +56,4 @@
 #define IDC_NOTCONNECTED          505
 #define IDC_TURNOFFCHECKBOX       506
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index 3e2ca9f..edfe121 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_INPUT_H
-#define __CPL_INPUT_H
+#pragma once
 
 #include <windows.h>
 #include <commctrl.h>
@@ -66,6 +65,4 @@ GetHotkeys(LPTSTR szHotkey, LPTSTR szLangHotkey, LPTSTR szLayoutHotkey);
 
 void ShowLastWin32Error(HWND hWndOwner);
 
-#endif /* __CPL_INPUT_H */
-
 /* EOF */
index c44f155..6412b5a 100644 (file)
@@ -5,7 +5,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Einstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Wählen Sie die Dienste, die Sie für die Eingabesprachen in der Liste verwenden wollen.\nVerwenden Sie Hinzufügen und Entfernen, um die Liste zu bearbeiten.", -1, 9, 6, 238, 25
+    LTEXT "Wählen Sie die Dienste aus, die Sie für die Eingabesprachen in der Liste verwenden wollen.\nVerwenden Sie Hinzufügen und Entfernen, um die Liste zu bearbeiten.", -1, 9, 6, 238, 25
     CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101
     PUSHBUTTON "&Als Standard", IDC_SET_DEFAULT, 101, 159, 144, 14
     PUSHBUTTON "&Hinzufügen...", IDC_ADD_BUTTON, 27, 142, 70, 14
@@ -22,7 +22,7 @@ FONT 8, "MS Shell Dlg"
 BEGIN
     GROUPBOX "Um Caps Lock zu deaktivieren", -1, 7, 7, 258, 26
     AUTORADIOBUTTON "Caps &Lock Taste drücken", IDC_PRESS_CL_KEY_RB, 14, 17, 120, 11, WS_GROUP
-    AUTORADIOBUTTON "&Shift Taste drücken", IDC_PRESS_SHIFT_KEY_RB, 144, 17, 120, 11, NOT WS_TABSTOP
+    AUTORADIOBUTTON "Um&schalttaste drücken", IDC_PRESS_SHIFT_KEY_RB, 144, 17, 120, 11, NOT WS_TABSTOP
     GROUPBOX "Schnelltasten für Eingabesprachen", -1, 7, 37, 258, 95
     LTEXT "Aktion", -1, 14, 47, 60, 9
     RTEXT "Tasten&kombination", -1, 177, 47, 79, 9
@@ -57,7 +57,7 @@ BEGIN
     AUTORADIOBUTTON "&Strg", IDC_CTRL_LANG, 29, 31, 30, 11
     AUTORADIOBUTTON "&Alt links", IDC_LEFT_ALT_LANG, 29, 45, 46, 12
     AUTOCHECKBOX "&Tastaturlayout umschalten", IDC_SWITCH_KBLAYOUTS_CB, 16, 65, 141, 12
-    LTEXT "Shift", -1, 74, 87, 27, 12
+    LTEXT "Umschalt", -1, 74, 87, 27, 12
     CTEXT "+", -1, 63, 87, 8, 9
     AUTORADIOBUTTON "S&trg", IDC_CTRL_LAYOUT, 30, 81, 30, 11
     AUTORADIOBUTTON "A&lt links", IDC_LEFT_ALT_LAYOUT, 30, 95, 44, 12
@@ -67,7 +67,7 @@ END
 
 IDD_INPUT_LANG_PROP DIALOGEX 20, 20, 227, 75
 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
-CAPTION "Eingabesprache Einstellungen"
+CAPTION "Eingabespracheneinstellungen"
 FONT 8, "MS Shell Dlg"
 BEGIN
     LTEXT "Eingabesprache:", -1, 7, 7, 61, 8
@@ -94,8 +94,8 @@ BEGIN
     IDS_CONFIRMATION         "Bestätigung"
     IDS_LAYOUT_EXISTS        "Dieses Layout existiert bereits."
     IDS_LAYOUT_EXISTS2       "Dieses Layout existiert bereits und kann nicht hinzugefügt werden."
-    IDS_CTRL_SHIFT           "Strg+Shift"
-    IDS_LEFT_ALT_SHIFT       "Alt links+Shift"
+    IDS_CTRL_SHIFT           "Strg+Umschalt"
+    IDS_LEFT_ALT_SHIFT       "Alt links+Umschalt"
     IDS_SWITCH_BET_INLANG    "Zwischen Eingabesprachen umschalten"
 END
 
@@ -171,7 +171,7 @@ BEGIN
     IDS_CHINESE_TRADITIONAL_BIG5CODE_LAYOUT,        "Chinesisch (traditionell) - Big5-Code"
     IDS_CHINESE_TRADITIONAL_DAYI_LAYOUT,            "Chinesisch (traditionell) - DaYi"
     IDS_CHINESE_TRADITIONAL_UNICODE_LAYOUT,         "Chinesisch (traditionell) - Unicode"
-    IDS_CHINESE_TRADITIONAL_ALPHANUMERIC_LAYOUT,    "Chinesisch (traditionell) - Alphanumerisch"
+    IDS_CHINESE_TRADITIONAL_ALPHANUMERIC_LAYOUT,    "Chinesisch (traditionell) - Alphanummerisch"
     IDS_CHINESE_SIMPLIFIED_USKEYBOARD_LAYOUT,       "Chinesisch (vereinfacht) - US-Tastatur"
     IDS_CHINESE_SIMPLIFIED_QUANPIN_LAYOUT,          "Chinesisch (vereinfacht) - QuanPin"
     IDS_CHINESE_SIMPLIFIED_SHUANGPIN_LAYOUT,        "Chinesisch (vereinfacht) - ShuangPin"
@@ -220,7 +220,7 @@ BEGIN
     IDS_ARMENIAN_EASTERN_LAYOUT,                    "Ostarmenisch"
     IDS_ARMENIAN_WESTERN_LAYOUT,                    "Westarmenisch"
     IDS_GREEK_POLYTONIC_LAYOUT,                     "Griechisch (Polytonisch)"
-    IDS_USENG_TABLE_IBM_ARABIC238L_LAYOUT,          "US-Englische Tabelle für IBM Arabisch 238_L"
+    IDS_USENG_TABLE_IBM_ARABIC238L_LAYOUT,          "US-englische Tabelle für IBM Arabisch 238_L"
     IDS_FARSI_LAYOUT,                               "Farsi"
     IDS_GAELIC_LAYOUT,                              "Gälisch"
     IDS_PORTUGUESE_BRAZIL_ABNT2_LAYOUT,             "Portugiesisch (Brasilianisch, ABNT2)"
@@ -231,12 +231,12 @@ BEGIN
     IDS_SYRIAC_PHONETIC_LAYOUT,                     "Syrisch (Phonetisch)"
     IDS_DIVEHI_PHONETIC_LAYOUT,                     "Divehi (Phonetisch)"
     IDS_DIVEHI_TYPEWRITER_LAYOUT,                   "Divehi (Schreibmaschine)"
-    IDS_BULGARIAN_PHONETIC_CLASSIC_LAYOUT,          "Bulgarian Phonetic (Classic)"
-    IDS_BULGARIAN_PHONETIC_BDS_LAYOUT,              "Bulgarian Phonetic (BDS)"
-    IDS_BULGARIAN_BDS_LAYOUT,                       "Bulgarian BDS 5237-1978"
-    IDS_GERMAN_RISTOME_LAYOUT,                      "German (RISTOME)"
-    IDS_GERMAN_NEO_11_LAYOUT,                       "German (NEO-1.1)"
-    IDS_GERMAN_DE_ERGO_LAYOUT,                      "German (de_ergo)"
-    IDS_BURMESE_LAYOUT,                             "Burmese"
+    IDS_BULGARIAN_PHONETIC_CLASSIC_LAYOUT,          "Bulgarisch (klassisch phonetisch)"
+    IDS_BULGARIAN_PHONETIC_BDS_LAYOUT,              "Bulgarisch BDS (phonetisch)"
+    IDS_BULGARIAN_BDS_LAYOUT,                       "Bulgarisch BDS 5237-1978"
+    IDS_GERMAN_RISTOME_LAYOUT,                      "Deutsch (RISTOME)"
+    IDS_GERMAN_NEO_11_LAYOUT,                       "Deutsch (NEO-1.1)"
+    IDS_GERMAN_DE_ERGO_LAYOUT,                      "Deutsch (de_ergo)"
+    IDS_BURMESE_LAYOUT,                             "Burmesisch"
     IDS_UKRAINIAN_STUDENT_LAYOUT,                   "Ukrainian (Student)"
 END
index 9d6408a..4147d2c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* metrics */
 #define PROPSHEETWIDTH                                  252
 #define IDS_BURMESE_LAYOUT                              5140
 #define IDS_UKRAINIAN_STUDENT_LAYOUT                    5141
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index 9e58f77..12de475 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_INTL_H
-#define __CPL_INTL_H
+#pragma once
 
 #include <cpl.h>
 
@@ -103,6 +102,4 @@ SetupApplet(HWND hwndDlg, LCID lcid);
 /* kblayouts.c */
 VOID AddNewKbLayoutsByLcid(LCID Lcid);
 
-#endif /* __CPL_INTL_H */
-
 /* EOF */
index cbb8ca8..9096529 100644 (file)
@@ -22,7 +22,7 @@ BEGIN
     EDITTEXT IDC_SHORTTIMESAMPLE_EDIT, 89, 131, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | NOT WS_TABSTOP
     EDITTEXT IDC_FULLTIMESAMPLE_EDIT, 89, 146, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | NOT WS_TABSTOP
     GROUPBOX "Geografische Lage", -1, 5, 172, 234, 55
-    LTEXT "Wählen Sie Ihren Standort, sodass Dienste Sie mit lokalen Informationen, wie Nachrichten und Wettervorhersagen, versorgen können.", -1, 14, 184, 210, 24
+    LTEXT "Wählen Sie Ihren Standort, so dass Dienste Sie mit lokalen Informationen, wie Nachrichten und Wettervorhersagen, versorgen können.", -1, 14, 184, 210, 24
     COMBOBOX IDC_LOCATION_COMBO, 14, 210, 217, 160, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SORT
 END
 
@@ -36,7 +36,7 @@ BEGIN
     PUSHBUTTON "&Details...", IDC_DETAIL_BUTTON, 177, 34, 54, 14
     GROUPBOX "Zusätzliche Sprachunterstützung", -1, 5, 62, 234, 82
     LTEXT "Die meisten Sprachen sind standardmäßig installiert. Um weitere Sprachen zu installieren, aktivieren Sie die unteren Kontollkästchen.", -1, 12, 72, 220, 18
-    CHECKBOX "Dateien für Sprachen mit &komplexer Schrift und Rechts-nach-Links Schreibstil installieren.", IDC_INST_FILES_FOR_RTOL_LANG, 12, 92, 215, 22, BS_MULTILINE
+    CHECKBOX "Dateien für Sprachen mit &komplexer Schrift und Rechts-nach-Links-Schreibstil installieren.", IDC_INST_FILES_FOR_RTOL_LANG, 12, 92, 215, 22, BS_MULTILINE
     CHECKBOX "Dateien für &ostasiatische Sprachen installieren.", IDC_INST_FILES_FOR_ASIAN, 12, 114, 180, 22, BS_MULTILINE
 END
 
@@ -47,12 +47,12 @@ FONT 8, "MS Shell Dlg"
 BEGIN
     GROUPBOX "Sprache für Unicode-Inkompatible Programme", -1, 5, 5, 234, 90
     COMBOBOX IDC_LANGUAGE_COMBO, 14, 75, 217, 160, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SORT
-    LTEXT "Diese Einstellung ermöglicht es Unicode-Inkompatiblen Programmen, Menüs und Dialoge in der örtlichen Sprache darzustellen. Dies beeinflusst Unicode-Kompatible Programme nicht, wird aber für alle Nutzer des Computers angewendet.", -1, 14, 18, 223, 33
-    LTEXT "Wählen Sie eine Sprache aus, die der Sprachversion des Programmes entspricht, dass Sie nutzen wollen:", -1, 14, 55, 223, 18
+    LTEXT "Diese Einstellung ermöglicht es, Unicode-Inkompatiblen Programmen, Menüs und Dialoge in der örtlichen Sprache darzustellen. Dies beeinflusst Unicode-Kompatible Programme nicht, wird aber für alle Nutzer des Computers angewendet.", -1, 14, 18, 223, 33
+    LTEXT "Wählen Sie eine Sprache aus, die der Sprachversion des Programmes entspricht, das Sie nutzen wollen:", -1, 14, 55, 223, 18
     GROUPBOX "Codepage Konvertierungstabellen", -1, 5, 101, 234, 88
     CONTROL "", IDC_CONV_TABLES, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP, 14, 114, 217, 70
     GROUPBOX "Standardeinstellungen für Benutzerkonten", -1, 5, 193, 234, 30
-    CHECKBOX "Einstellungen &auf das aktive und Standardkonto anwenden.", IDC_APPLY_CUR_USER_DEF_PROFILE, 12, 200, 220, 22, BS_MULTILINE
+    CHECKBOX "Einstellungen &auf das aktive und das Standardkonto anwenden.", IDC_APPLY_CUR_USER_DEF_PROFILE, 12, 200, 220, 22, BS_MULTILINE
 END
 
 IDD_NUMBERSPAGE DIALOGEX 0, 0, 246, 234
@@ -143,7 +143,7 @@ CAPTION "Datum"
 FONT 8, "MS Shell Dlg"
 BEGIN
     GROUPBOX "Kalender", -1, 7, 7, 230, 74
-    LTEXT "Eine Zweistellige Jahreszahl in folgendem Zeitraum interpretieren:", -1, 13, 18, 215, 8
+    LTEXT "Eine zweistellige Jahreszahl in folgendem Zeitraum interpretieren:", -1, 13, 18, 215, 8
     EDITTEXT IDC_FIRSTYEAR_EDIT, 13, 30, 36, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED
     LTEXT "und", -1, 55, 32, 17, 8
     EDITTEXT IDC_SECONDYEAR_EDIT, 77, 30, 36, 12, ES_LEFT | ES_NUMBER | WS_GROUP
@@ -178,7 +178,7 @@ FONT 8, "MS Shell Dlg"
 BEGIN
     GROUPBOX "Sortierung", -1, 7, 7, 230, 74
     LTEXT "Sortiermethoden definieren die Sortierreihenfolge von Zeichen, Wörtern, Dateien und Ordnern.", -1, 14, 17, 220, 25
-    LTEXT "Wählen Sie eine Sortiermethode für Ihre Sprache:", -1, 14, 37, 220, 22
+    LTEXT "Wählen Sie eine Sortiermethode für Ihre Sprache aus:", -1, 14, 37, 220, 22
     COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
 END
 
index de4582e..8491517 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 #define IDC_FLAGS                         2
 
@@ -76,6 +75,4 @@
 #define IDS_CUSTOMIZE_TITLE               1002
 #define IDS_SPAIN                         1003
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index 4aacd59..7e1b30c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_JOY_H
-#define __CPL_JOY_H
+#pragma once
 
 #include <windows.h>
 #include <commctrl.h>
@@ -35,6 +34,4 @@ extern HINSTANCE hApplet;
 
 void ShowLastWin32Error(HWND hWndOwner);
 
-#endif /* __CPL_JOY_H */
-
 /* EOF */
index 1d8ae57..e80697d 100644 (file)
@@ -3,12 +3,12 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
 IDD_PROPPAGEMAIN DIALOGEX 0, 0, 252, 205
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION
 EXSTYLE WS_EX_CONTEXTHELP
-CAPTION "Gamecontroller"
+CAPTION "Spielcontroller"
 FONT 8, "MS Shell Dlg"
 BEGIN
     ICON IDI_CPLSYSTEM, -1, 7, 7, 20, 20
-    LTEXT "Über diese Einstellungen können an den PC angeschlossene Gamecontroller konfiguriert werden.", -1, 33, 7, 214, 20, NOT WS_GROUP
-    GROUPBOX "I&nstallierte Gamecontroller", -1, 7, 34, 238, 117
+    LTEXT "Über diese Einstellungen können an den PC angeschlossene Spielcontroller konfiguriert werden.", -1, 33, 7, 214, 20, NOT WS_GROUP
+    GROUPBOX "I&nstallierte Spielcontroller", -1, 7, 34, 238, 117
     CONTROL "List1", IDC_CONTROLLER_LIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | 0x0000808D, 14, 44, 224, 80
     PUSHBUTTON "&Hinzufügen...", IDC_ADD_BUTTON, 35, 129, 65, 14
     PUSHBUTTON "&Entfernen", IDC_REMOVE_BUTTON, 104, 129, 65, 14, WS_DISABLED
@@ -21,15 +21,15 @@ END
 IDD_ADD DIALOGEX 0, 0, 265, 200
 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_CAPTION
 EXSTYLE WS_EX_CONTEXTHELP
-CAPTION "Gamecontroller hinzufügen"
+CAPTION "Spielcontroller hinzufügen"
 FONT 8, "MS Shell Dlg"
 BEGIN
     ICON IDI_CPLSYSTEM, -1, 8, 7, 20, 20
-    LTEXT "Wählen Sie einen Gamecontroller aus der Liste und klicken Sie auf OK. Wenn ihr Gamecontroller nicht in der Liste erscheint, klicken Sie auf Benutzerdefiniert.", -1, 35, 7, 210, 33
-    LTEXT "&Gamecontroller:", -1, 8, 45, 126, 8
+    LTEXT "Wählen Sie einen Spielcontroller aus der Liste und klicken Sie auf OK. Wenn ihr Spielcontroller nicht in der Liste erscheint, klicken Sie auf Benutzerdefiniert.", -1, 35, 7, 210, 33
+    LTEXT "&Spielcontroller:", -1, 8, 45, 126, 8
     LISTBOX IDC_GAME_CONTROLLERS_LIST, 7, 55, 251, 57, LBS_STANDARD | LBS_NOINTEGRALHEIGHT | LBS_WANTKEYBOARDINPUT | WS_HSCROLL | WS_TABSTOP
     AUTOCHECKBOX "&Ruder und Pedale aktivieren", IDC_ENABLE_RUDDERS_CHECKBOX, 7, 114, 105, 10, WS_GROUP
-    LTEXT "&Game Port:", -1, 7, 134, 38, 8, NOT WS_VISIBLE
+    LTEXT "&Gameport:", -1, 7, 134, 38, 8, NOT WS_VISIBLE
     COMBOBOX IDC_GAME_PORT_COMBO, 7, 147, 140, 50, CBS_DROPDOWNLIST | CBS_SORT | NOT WS_VISIBLE | WS_VSCROLL
     PUSHBUTTON "&Benutzerdefiniert...", IDC_CUSTOM_BUTTON, 195, 147, 63, 14
     CONTROL "", -25525, "STATIC", SS_ETCHEDHORZ, 7, 170, 251, 1
@@ -40,7 +40,7 @@ END
 IDD_CUSTOM DIALOGEX 0, 0, 265, 183, 0
 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_CAPTION
 EXSTYLE WS_EX_CONTEXTHELP
-CAPTION "Benutzerdefinierter Gamecontroller"
+CAPTION "Benutzerdefinierter Spielcontroller"
 FONT 8, "MS Shell Dlg"
 BEGIN
     GROUPBOX "Spezielle Eigenschaften", -1, 7, 7, 245, 52
@@ -51,10 +51,10 @@ BEGIN
     GROUPBOX "&Achsen", -1, 7, 67, 116, 44, WS_GROUP
     COMBOBOX IDC_AXES_COMBO, 37, 79, 48, 50, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL
     AUTORADIOBUTTON "Ruder/Pedale", IDC_RUDDER_PEDALS_RADIO, 14, 97, 63, 10, NOT WS_VISIBLE
-    AUTORADIOBUTTON "Z Achse", IDC_Z_AXIS_RADIO, 81, 97, 40, 10, NOT WS_VISIBLE
+    AUTORADIOBUTTON "Z-Achse", IDC_Z_AXIS_RADIO, 81, 97, 40, 10, NOT WS_VISIBLE
     GROUPBOX "&Tasten", -1, 137, 67, 116, 44
     COMBOBOX IDC_BUTTONS_COMBO, 178, 79, 48, 50, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL, WS_EX_CLIENTEDGE
-    AUTOCHECKBOX "Beinhaltet eine &Point of View Steuerung", IDC_INC_POINT_CHECKBOX, 7, 123, 140, 10
+    AUTOCHECKBOX "Beinhaltet eine &Point-of-View-Steuerung", IDC_INC_POINT_CHECKBOX, 7, 123, 140, 10
     LTEXT "C&ontrollername:", -1, 7, 139, 200, 9
     EDITTEXT IDC_CONTROLLER_NAME_EDIT, 7, 150, 116, 15, ES_AUTOHSCROLL, WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
     DEFPUSHBUTTON "OK", IDOK, 137, 150, 50, 14
@@ -77,8 +77,8 @@ END
 
 STRINGTABLE
 BEGIN
-    IDS_CPLSYSTEMNAME "Gamecontroller"
-    IDS_CPLSYSTEMDESCRIPTION "Hinzufügen, Entfernen und Konfigurieren von Gamecontroller Hardware, wie Joysticks und Gamepads."
+    IDS_CPLSYSTEMNAME "Spielcontroller"
+    IDS_CPLSYSTEMDESCRIPTION "Hinzufügen, Entfernen und Konfigurieren von Spielcontrollerhardware wie Joysticks und Gamepads."
     IDS_CONTROLLER "Controller"
     IDS_STATUS "Status"
 END
index a2083da..17efe67 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* icons */
 #define IDI_CPLSYSTEM  102
@@ -39,6 +38,4 @@
 #define IDC_CONTROLLER_NAME_EDIT       1056
 #define IDC_PREFERRED_DEV_COMBO                8195
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index cdb2910..b5d6813 100644 (file)
@@ -4,11 +4,11 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
 
 IDD_PROPPAGE1 DIALOGEX DISCARDABLE  20, 40, 315, 104
 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_OVERLAPPED | WS_CAPTION | WS_VISIBLE | WS_SYSMENU
-CAPTION "Chose Licensing Mode"
+CAPTION "Wählen sie den Lizenzmodus aus"
 FONT 8, "Helv"
 BEGIN
-       CONTROL "Client Lizenzierungs Modus",                         100, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 4, 4, 239, 94
-       CONTROL "Per Gerät oder Per Benutzer",                        102, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 13, 79, 107, 12
+       CONTROL "Client-Lizenzierungsmodus",                         100, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 4, 4, 239, 94
+       CONTROL "Per Gerät oder per Benutzer",                        102, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 13, 79, 107, 12
        CONTROL "Per Server. Nummer der gleichzeitigen Verbindungen:", 103, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 13, 38, 163, 9
        CONTROL "Produkt:",                                      105, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 13, 20, 31, 8
        CONTROL "",                                              106, "COMBOBOX", CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP, 49, 20, 171, 12
@@ -23,7 +23,7 @@ END
 
 STRINGTABLE
 BEGIN
-  IDS_CPLNAME_1 "Lizenz Manager"
-  IDS_CPLDESCRIPTION_1 "Lizenz Manager"
+  IDS_CPLNAME_1 "Lizenzmanager"
+  IDS_CPLDESCRIPTION_1 "Lizenzmanager"
   IDS_REACTOS "ReactOS - Freie Software"
 END
index 817bd4f..694663d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_SAMPLE_H
-#define __CPL_SAMPLE_H
+#pragma once
 
 typedef struct
 {
@@ -11,6 +10,4 @@ typedef struct
 
 extern HINSTANCE hApplet;
 
-#endif /* __CPL_SAMPLE_H */
-
 /* EOF */
index 917dc15..b1cbbf7 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* ids */
 
@@ -13,6 +12,4 @@
 #define IDC_OK         107
 #define IDC_CANCEL     108
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index 97ed969..cc63724 100644 (file)
@@ -91,7 +91,7 @@ STYLE DS_SHELLFONT | WS_CAPTION | WS_SYSMENU
 CAPTION "Schema speichern"
 FONT 8, "MS Shell Dlg"
 BEGIN
-  LTEXT "Cursorschema speichern unter:", -1, 5, 5, 100, 10
+  LTEXT "Zeigerschema speichern unter:", -1, 5, 5, 100, 10
   EDITTEXT IDC_EDIT_SCHEME_NAME, 5, 15, 180, 15, WS_CHILD | WS_VISIBLE | WS_GROUP
   PUSHBUTTON "&OK", IDOK, 60, 45, 50, 15
   PUSHBUTTON "&Abbrechen", IDCANCEL, 115, 45, 50, 15
@@ -169,7 +169,7 @@ BEGIN
   IDS_REMOVE_TITLE "Löschen des Cursorschemas bestätigen"
   IDS_REMOVE_TEXT "Soll das Cursorschema '%s' wirklich gelöscht werden?"
   IDS_OVERWRITE_TITLE "Cursorschema überscheiben"
-  IDS_OVERWRITE_TEXT "Ein Cursorschema mit diesem Namen existiert bereits. Möchen Sie das existierende Cursorschema überscheiben?"
+  IDS_OVERWRITE_TEXT "Ein Cursorschema mit diesem Namen existiert bereits. Möchten Sie das existierende Cursorschema überscheiben?"
   IDS_ANIMATE_CURSOR "Animierter Cursor"
 END
 
index 18d713c..2c32c7e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_MAIN_H
-#define __CPL_MAIN_H
+#pragma once
 
 typedef enum
 {
@@ -46,6 +45,4 @@ PropSheetAddPage(HPROPSHEETPAGE hpage, LPARAM lParam);
 LONG APIENTRY
 MouseApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam);
 
-#endif /* __CPL_MAIN_H */
-
 /* EOF */
index cc4d770..169c2ea 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* Icons */
 #define IDC_CPLICON_1                       100
 #define IDC_TEXT_TRAIL_SHORT                2057
 #define IDC_TEXT_TRAIL_LONG                 2058
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index cfcfb47..81e3d43 100644 (file)
@@ -12,10 +12,10 @@ BEGIN
     CONTROL "",IDC_VOLUME_TRACKBAR, "msctls_trackbar32", TBS_AUTOTICKS | TBS_ENABLESELRANGE | TBS_BOTTOM | TBS_HORZ | WS_TABSTOP, 65, 45, 140, 14
     LTEXT "Niedrig",-1,62,66,30,17
     LTEXT "Hoch",-1,195,66,30,17
-    CHECKBOX "Stu&mmschalten", IDC_MUTE_CHECKBOX, 50, 78, 140, 10
+    CHECKBOX "Stu&mm schalten", IDC_MUTE_CHECKBOX, 50, 78, 140, 10
     CHECKBOX "Lautstärkeregelungs-&Icon in der Taskleiste zeigen", IDC_ICON_IN_TASKBAR, 50, 92, 170, 10
     PUSHBUTTON "Er&weitert", IDC_ADVANCED_BTN, 150,105,75,15
-    GROUPBOX "Lautsprechereintellungen", IDC_SPEAKER_SET_BTN, 7,140,230,80
+    GROUPBOX "Lautsprechereinstellungen", IDC_SPEAKER_SET_BTN, 7,140,230,80
     CONTROL "", IDC_SPEAKIMG, "Static", SS_OWNERDRAW, 4, 160, 70, 70
     LTEXT "Verwenden Sie die unteren Einstellungen um die Lautstäre einzelner Geräte und andere Einstellungen zu verändern.",-1,70,155,150,36
     PUSHBUTTON "&Lautstärke...", IDC_SPEAKER_VOL_BTN, 70,195,75,15
@@ -24,18 +24,18 @@ END
 
 IDD_SOUNDS DIALOGEX 0, 0, 246, 228
 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Sounds"
+CAPTION "Klänge"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "Ein Soundschema ist eine Kollektion von Sounds, die bestimmten Programmereignissen in ReactOS zugordnet sind. Sie können ein existierendes Schema anwählen oder ein modifiziertes speichern.",-1,8,7,230,40
-    LTEXT "Sounds&chema:",-1,8,42,150,17
+    LTEXT "Ein Klangschema ist eine Sammlung von Klängen, die bestimmten Programmereignissen in ReactOS zugordnet sind. Sie können ein existierendes Schema auswählen oder ein modifiziertes speichern.",-1,8,7,230,40
+    LTEXT "Klang&schema:",-1,8,42,150,17
     COMBOBOX IDC_SOUND_SCHEME, 8, 53, 230, 46, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON "Sp&eichern unter...", IDC_SAVEAS_BTN, 120,70,65,15
     PUSHBUTTON "&Löschen", IDC_DELETE_BTN, 188,70,50,15
-    LTEXT "Um Sounds zu ändern, klicken Sie auf ein Programmereignis in der folgenden Liste und wählen Sie einen Sound. Sie können Änderungen als neue Soundschemata speichern.",-1,8,90,230,40
-    LTEXT "&Pogrammereignisse:",-1,8,118,150,17
+    LTEXT "Um Klänge zu ändern, klicken Sie auf ein Programmereignis in der folgenden Liste und wählen Sie einen Klang aus. Sie können Änderungen als neue Klangschemata speichern.",-1,8,90,230,40
+    LTEXT "&Programmereignisse:",-1,8,118,150,17
     CONTROL "", IDC_SCHEME_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, 8, 130, 230, 60, WS_EX_CLIENTEDGE
-    LTEXT "&Sounds:", IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED
+    LTEXT "&Klänge:", IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED
     COMBOBOX IDC_SOUND_LIST, 8, 205, 155, 146, CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
     PUSHBUTTON "", IDC_PLAY_SOUND, 168,205,15,15, WS_DISABLED | BS_ICON
     PUSHBUTTON "&Durchsuchen...", IDC_BROWSE_SOUND, 188,205,81,15, WS_DISABLED
@@ -52,7 +52,7 @@ BEGIN
     COMBOBOX IDC_DEVICE_PLAY_LIST, 50, 30, 180, 46, CBS_DROPDOWNLIST
     PUSHBUTTON "&Lautstärke...", IDC_VOLUME1_BTN, 85,47,70,15
     PUSHBUTTON "&Erweitert...", IDC_ADV2_BTN, 160,47,70,15
-    GROUPBOX "Soundaufnahme", -1, 7,75,230,60
+    GROUPBOX "Tonaufnahme", -1, 7,75,230,60
     ICON IDI_MICROPHONE_ICON, IDI_MICROPHONE_ICON, 15,88,32,32
     LTEXT "S&tandardgerät:",-1,50,88,80,17
     COMBOBOX IDC_DEVICE_REC_LIST, 50, 98, 180, 46, CBS_DROPDOWNLIST
@@ -101,7 +101,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBL
 CAPTION "Schema speichern unter"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    LTEXT "&Dieses Soundschema speichern unter:", -1, 7, 7, 212, 9
+    LTEXT "&Dieses Klangschema speichern unter:", -1, 7, 7, 212, 9
     EDITTEXT 8960, 7, 17, 211, 14, ES_AUTOHSCROLL
     DEFPUSHBUTTON "OK", IDOK, 93, 36, 60, 14
     PUSHBUTTON "Abbrechen", IDCANCEL, 157, 36, 60, 14
@@ -136,8 +136,8 @@ BEGIN
     LTEXT "Voll", 8498, 214, 56, 21, 9
     LTEXT "Gut", 8499, 128, 123, 21, 10
     LTEXT "Beste", 8500, 214, 123, 23, 9
-    LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Capture Gerät", 5399, 13, 145, 227, 21
-    LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Render Gerät", 5398, 13, 78, 227, 22
+    LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Capture-Gerät", 5399, 13, 145, 227, 21
+    LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Render-Gerät", 5398, 13, 78, 227, 22
 END
 
 IDD_PERFORMANCE2 DIALOG 0, 0, 257, 218
@@ -157,8 +157,8 @@ BEGIN
     LTEXT "Voll", 8498, 217, 46, 19, 9
     LTEXT "Gut", 8499, 125, 103, 24, 10
     LTEXT "Beste", 8500, 217, 103, 19, 9
-    LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Capture Gerät", 5399, 13, 125, 222, 21
-    LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Render Gerät", 5398, 13, 68, 218, 24
+    LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Capture-Gerät", 5399, 13, 125, 222, 21
+    LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung für das Render-Gerät", 5398, 13, 68, 218, 24
 END
 
 IDD_SETUP1 DIALOG 0, 0, 227, 206
@@ -168,11 +168,11 @@ FONT 8, "MS Shell Dlg"
 BEGIN
     GROUPBOX "ReactOS Audio", 10243, 7, 5, 213, 192
     ICON 4393, 10241, 26, 26, 20, 20
-    LTEXT "Dieser Computer kann keine Audiodaten abspielen, da der ReactOS Audio-Dienst nicht aktiviert ist.", 10245, 60, 25, 150, 40
+    LTEXT "Dieser Computer kann keine Audiodaten abspielen, da der ReactOS-Audiodienst nicht aktiviert ist.", 10245, 60, 25, 150, 40
     AUTOCHECKBOX "&ReactOS Audio aktivieren", 10253, 60, 68, 150, 9
     LTEXT "Informationen", 10246, 58, 87, 150, 11
     LTEXT "1. Sie müssen Administrator sein, um diesen Dienst aktivieren zu können. Wenn Sie nicht als Administrator angemeldet sind, werden Sie nach dem Administaratornamen und Passwort gefragt.", 10247, 60, 100, 150, 40
-    LTEXT "2. Nach Aktivierung des ReactOS Audio Dienstes müssen Sie den Computer neustarten.", 10248, 60, 140, 150, 40
+    LTEXT "2. Nach Aktivierung des ReactOS-Audiodienstes müssen Sie den Computer neu starten.", 10248, 60, 140, 150, 40
 END
 
 IDD_MULTICHANNEL DIALOG 0, 0, 227, 218
@@ -224,17 +224,17 @@ FONT 8, "MS Shell Dlg"
 BEGIN
     GROUPBOX "ReactOS Audio", 10259, 7, 5, 213, 192
     ICON 4394, 10257, 25, 25, 20, 20
-    LTEXT "Der ReactOS Audio Dienst ist nun aktiviert. Dennoch kann es sein, dass die Audiowiedergabe nicht richtig funktioniert, bis Sie ReactOS neugestartet haben. Wenn Sie jetzt neustarten wollen, speichern Sie Ihre Arbeit und beenden Sie alle Programme.", 10261, 60, 25, 150, 50
-    LTEXT "Um ReactOS neuzustarten, klicken Sie OK.", 10262, 60, 75, 150, 20
-    LTEXT "Wenn Sie abbrechen, müssen Sie später neustarten, um sichergehen zu können, dass die Audiowiedergabe richtig funktioniert.", 10263, 60, 100, 150, 40
+    LTEXT "Der ReactOS-Audiodienst ist nun aktiviert. Dennoch kann es sein, dass die Audiowiedergabe nicht richtig funktioniert, bis Sie ReactOS neu gestartet haben. Wenn Sie jetzt neu starten wollen, speichern Sie Ihre Arbeit und beenden Sie alle Programme.", 10261, 60, 25, 150, 50
+    LTEXT "Um ReactOS neu zu starten, klicken Sie auf OK.", 10262, 60, 75, 150, 20
+    LTEXT "Wenn Sie abbrechen, müssen Sie später neu starten, um sichergehen zu können, dass die Audiowiedergabe richtig funktioniert.", 10263, 60, 100, 150, 40
 END
 
 STRINGTABLE
 BEGIN
-    IDS_CPLNAME "Sounds und Audio Geräte"
-    IDS_CPLDESCRIPTION "Ändert das Sound-Schema Ihres Computers, oder konfiguriert die Einstellungen für Ihre Lautsprecher und Aufnahmegeräte."
+    IDS_CPLNAME "Klänge und Audiogeräte"
+    IDS_CPLDESCRIPTION "Ändert das Klangschema Ihres Computers oder konfiguriert die Einstellungen für Ihre Lautsprecher und Aufnahmegeräte."
     IDS_NO_SOUND "(Kein)"
-       IDS_NO_DEVICES "No Devices"
+       IDS_NO_DEVICES "Keine Geräte"
 
     5825 "Programmfehler"
     5826 "Programm schließen"
index 87d313f..ed6c480 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_MMSYS_H
-#define __CPL_MMSYS_H
+#pragma once
 
 //typedef LONG (CALLBACK *APPLET_PROC)(VOID);
 
@@ -64,6 +63,4 @@ AudioDlgProc(HWND hwndDlg,
              WPARAM wParam,
              LPARAM lParam);
 
-#endif /* __CPL_MMSYS_H */
-
 /* EOF */
index c8511da..6423de9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* Icons */
 #define IDI_CPLICON                3004
@@ -77,6 +76,4 @@
 #define IDS_NO_SOUND               1002
 #define IDS_NO_DEVICES             1003
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index e1e7e33..8a534c4 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef ODBCCP32_H__ // odbccp32.h
-#define ODBCCP32_H__
+#pragma once
 
 #include <windows.h>
 #include <commctrl.h>
@@ -8,5 +7,3 @@
 
 extern HINSTANCE hApplet;
 extern HMODULE hLibrary;
-
-#endif /* end of ODBCCP32_H__ */
index ff72dde..b209830 100644 (file)
@@ -47,7 +47,7 @@ BEGIN
     CONTROL         "Slider1",IDC_ALARMBAR1,"msctls_trackbar32",TBS_HORZ |
                     TBS_AUTOTICKS | WS_TABSTOP,30,40,170,15
     LTEXT           "100%",-1,215,40,25,10
-    PUSHBUTTON      "Alar&m Action...",-1,20,70,70,15,WS_DISABLED
+    PUSHBUTTON      "Alar&maktion...",-1,20,70,70,15,WS_DISABLED
     LTEXT           "Benachrichtigung:",-1,95,70,60,10
     LTEXT           "Unbekannt",IDC_ALARMMSG1,155,70,95,10
     LTEXT           "Aktion:",-1,95,80,45,10
@@ -63,7 +63,7 @@ BEGIN
     CONTROL         "Slider1",IDC_ALARMBAR2,"msctls_trackbar32",TBS_HORZ |
                     TBS_AUTOTICKS | WS_TABSTOP,30,140,170,15
     LTEXT           "100%",-1,215,140,25,10
-    PUSHBUTTON      "Alar&m Action...",-1,20,170,70,15,WS_DISABLED
+    PUSHBUTTON      "Alar&maktion...",-1,20,170,70,15,WS_DISABLED
     LTEXT           "Benachrichtigung:",-1,95,170,60,10
     LTEXT           "Unbekannt",IDC_ALARMMSG2,155,170,95,10
     LTEXT           "Aktion:",-1,95,180,45,10
@@ -122,7 +122,7 @@ BEGIN
   IDS_CPLNAME_1 "Energieoptionen"
   IDS_CPLDESCRIPTION_1 "Konfiguriert die Energiespareinstellungen für den Computer."
   IDS_PROCENT "%i%%"
-  IDS_SOUND "Sound"
+  IDS_SOUND "Klang"
   IDS_TEXT "Text"
   IDS_CONFIG1 "Einstellungen für Energieschema %s."
   IDS_CONFIG2 "Erweiterte Einstellungen für %s."
@@ -134,7 +134,7 @@ BEGIN
 
   IDS_PowerActionNone1 "Keine Aktion"
   IDS_PowerActionUnknown "Unbekannt"
-  IDS_PowerActionSleep "In den Standbymodus wechseln"
+  IDS_PowerActionSleep "In den Stromsparmodus wechseln"
   IDS_PowerActionHibernate "In den Ruhezustand wechseln"
   IDS_PowerActionShutdown "Computer herunterfahren"
   IDS_PowerActionRestart "Computer neu starten"
@@ -159,6 +159,6 @@ BEGIN
   IDS_TIMEOUT15 "Nach 5 Stunden"
   IDS_TIMEOUT16 "Nie"
 
-  IDS_DEL_SCHEME "Sind Sie sicher, dass Sie das Energieschema löschen wollen?"
+  IDS_DEL_SCHEME "Sind Sie sich sicher, dass Sie das Energieschema löschen wollen?"
   IDS_DEL_SCHEME_TITLE "Schema löschen"
 END
index 1a0fc7d..27b54e5 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef POWERCFG_H
-#define POWERCFG_H
+#pragma once
 
 #include "powrprof.h"
 
@@ -23,6 +22,4 @@ INT_PTR CALLBACK AlarmsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP
 INT_PTR CALLBACK AdvancedDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 INT_PTR CALLBACK HibernateDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
-#endif /* __CPL_SAMPLE_H */
-
 /* EOF */
index e98c602..5993106 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* metrics */
 #define PROPSHEETWIDTH  246
 
 #define IDS_CPLDESCRIPTION_1           901
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index e87d23d..9228224 100644 (file)
@@ -53,12 +53,12 @@ END
 
 IDD_SYSSETTINGS DIALOGEX 0, 0, 221, 106
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
-CAPTION "System Einstellungen"
+CAPTION "Systemeinstellungen"
 FONT 8, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
-    GROUPBOX        "Versions Info",IDC_STATIC,6,3,210,73
+    GROUPBOX        "Versionsinfo",IDC_STATIC,6,3,210,73
     CONTROL         "Als Workstation identifizieren",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,110,10
-    LTEXT           "ReactOS ist als Server OS konzipiert und identifiziert sich auch als solches. Diese Einstellung ändert das Verhalten für Anwendungen.",IDC_STATIC,15,15,183,41
+    LTEXT           "ReactOS ist als Serversystem konzipiert worden und identifiziert sich auch als solches. Diese Einstellung ändert das Verhalten für Anwendungen.",IDC_STATIC,15,15,183,41
     PUSHBUTTON      "OK",IDOK,166,83,50,14
 END
 
@@ -68,9 +68,9 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
 CAPTION "Erweitert"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
-    LTEXT       "Administrator-Rechte werden für die meisten dieser Einstellungen benötigt.", IDC_STATIC, 12, 5, 242, 8
+    LTEXT       "Administratorrechte werden für die meisten dieser Einstellungen benötigt.", IDC_STATIC, 12, 5, 242, 8
     GROUPBOX    "Leistung", IDC_STATIC, 6, 18, 244, 50
-    LTEXT       "Mit Leistungs-Optionen können Sie einstellen, wie Programme Speicher benutzen sollen. Diese Einstellungen beeinflussen die Leistung ihres Computers.", IDC_STATIC, 16, 29, 210, 24
+    LTEXT       "Mit Leistungsoptionen können Sie einstellen, wie Programme Speicher benutzen sollen. Diese Einstellungen beeinflussen die Leistung ihres Computers.", IDC_STATIC, 16, 29, 210, 24
     PUSHBUTTON  "Einstellungen", IDC_PERFOR, 194, 48, 50, 14
 
     GROUPBOX    "Benutzerprofile", IDC_STATIC, 6,75,244,48
@@ -78,7 +78,7 @@ BEGIN
     PUSHBUTTON  "Einstellungen", IDC_USERPROFILE, 194, 103, 50, 14
 
     GROUPBOX    "Starten und Wiederherstellen", IDC_STATIC, 6, 131, 244, 52
-    LTEXT       "Start- und Wiederherstellungs-Einstellungen regeln, wie der Computer gestartet werden soll und was passieren soll, wenn ein Fehler auftritt.", IDC_STATIC, 16, 144, 210, 27
+    LTEXT       "Start- und Wiederherstellungseinstellungen regeln, wie der Computer gestartet werden soll und was passieren soll, wenn ein Fehler auftritt.", IDC_STATIC, 16, 144, 210, 27
     PUSHBUTTON  "Einstellungen", IDC_STAREC, 194, 162, 50, 14
 
     PUSHBUTTON  "Umgebungsvariablen", IDC_ENVVAR, 84, 192, 80, 14
@@ -88,12 +88,12 @@ END
 
 IDD_HARDWAREPROFILES DIALOGEX 6, 18, 254, 234
 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Hardware-Profile"
+CAPTION "Hardwareprofile"
 FONT 8, "MS Shell Dlg"
 BEGIN
     ICON        IDI_HARDPROF, IDC_STATIC, 8, 11, 18, 20, SS_ICON
-    LTEXT       "Sie können Hardware-Profile für verschiedene Hardware-Konfigurationen einrichten. Beim Starten können Sie dann das Profil auswählen, welches benutzt werden soll.", IDC_STATIC, 46, 11, 200, 25
-    LTEXT       "Verfügbare Hardware-Profile:", IDC_STATIC, 8, 41, 120, 8
+    LTEXT       "Sie können Hardwareprofile für verschiedene Hardware-Konfigurationen einrichten. Beim Starten können Sie dann das Profil auswählen, welches benutzt werden soll.", IDC_STATIC, 46, 11, 200, 25
+    LTEXT       "Verfügbare Hardwareprofile:", IDC_STATIC, 8, 41, 120, 8
     LISTBOX     IDC_HRDPROFLSTBOX, 8, 52, 215, 54, LBS_NOTIFY
     PUSHBUTTON  "", IDC_HRDPROFUP, 232, 59, 15, 14, BS_ICON
     PUSHBUTTON  "", IDC_HRDPROFDWN, 232, 79, 15, 14, BS_ICON
@@ -102,11 +102,11 @@ BEGIN
     PUSHBUTTON  "&Umbenennen", IDC_HRDPROFRENAME, 118, 106, 50, 14
     PUSHBUTTON  "&Löschen", IDC_HRDPROFDEL, 173, 106, 50, 14
 
-    GROUPBOX    "Hardware-Profil Auswahl", IDC_STATIC, 7, 130, 240, 75
+    GROUPBOX    "Hardwareprofil-Auswahl", IDC_STATIC, 7, 130, 240, 75
     LTEXT       "Wenn ReactOS startet:", IDC_STATIC, 14, 142, 210, 8
-    AUTORADIOBUTTON "&Warten, bis ein Hardware-Profil gewählt wird", IDC_HRDPROFWAIT, 14, 158, 170, 8, WS_GROUP
-    AUTORADIOBUTTON "&Das erste Profil aus der Liste wählen, wenn ich kein Profil innerhalb von", IDC_HRDPROFSELECT, 14, 173, 200, 8
-    LTEXT       "Sekunden gewählt wird", IDC_STATIC, 65, 187, 80, 8
+    AUTORADIOBUTTON "&Warten, bis ein Hardwareprofil gewählt wird", IDC_HRDPROFWAIT, 14, 158, 170, 8, WS_GROUP
+    AUTORADIOBUTTON "&Das erste Profil aus der Liste auswählen, wenn ich kein Profil innerhalb von", IDC_HRDPROFSELECT, 14, 173, 200, 8
+    LTEXT       "Sekunden gewählt habe", IDC_STATIC, 65, 187, 80, 8
     EDITTEXT    IDC_HRDPROFEDIT, 25, 185, 35, 12
     CONTROL     "", IDC_HRDPROFUPDWN, "msctls_updown32", UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 25, 185, 7, 10
 
@@ -136,7 +136,7 @@ CAPTION "Benutzerprofile"
 FONT 8, "MS Shell Dlg"
 BEGIN
     ICON        IDI_USERPROF, IDC_STATIC, 6, 11, 16, 16, SS_ICON
-    LTEXT       "Benutzerprofile enthalten Desktop-Einstellungen und andere Informationen bezüglich ihrer Anmeldung. Sie können unterschiedliche Profile, für jeden Computer, den Sie benutzen, einrichten, oder aber auch ein einziges Profil wählen, welches auf jedem Computer gleich ist.",
+    LTEXT       "Benutzerprofile enthalten Desktopeinstellungen und andere Informationen bezüglich ihrer Anmeldung. Sie können unterschiedliche Profile, für jeden Computer, den Sie benutzen, einrichten, oder aber auch ein einziges Profil wählen, welches auf jedem Computer gleich ist.",
                     IDC_STATIC, 40, 7, 204, 40
     LTEXT       "Auf diesem Computer gespeicherte Profile:", IDC_STATIC, 16, 51, 204, 9
     CONTROL     "", IDC_USERPROFILE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
@@ -157,8 +157,8 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS
 CAPTION "Starten und Wiederherstellen"
 FONT 8, "MS Shell Dlg"
 BEGIN
-    GROUPBOX    "System-Start", IDC_STATIC, 7, 12, 238, 95
-    LTEXT       "Standard Betriebs&system:", IDC_STATIC, 14, 26, 100, 8
+    GROUPBOX    "Systemstart", IDC_STATIC, 7, 12, 238, 95
+    LTEXT       "Standard-Betriebs&system:", IDC_STATIC, 14, 26, 100, 8
     COMBOBOX    IDC_STRECOSCOMBO, 14, 37, 224, 46, CBS_DROPDOWNLIST
     AUTOCHECKBOX "&Anzeigedauer der Betriebssystem-Liste:", IDC_STRECLIST, 14, 56, 150, 8
     EDITTEXT    IDC_STRRECLISTEDIT, 185, 54, 30, 12, ES_NUMBER
@@ -168,10 +168,10 @@ BEGIN
     EDITTEXT    IDC_STRRECRECEDIT, 185, 68, 30, 12, ES_NUMBER
     CONTROL     "", IDC_STRRECRECUPDWN, "msctls_updown32", UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 0, 0, 8, 13
     LTEXT       "Sek.", IDC_STATIC, 221, 70, 14, 8
-    LTEXT       "Um die Start-Optionen manuell zu bearbeiten, klicken Sie auf ""Bearbeiten"".", IDC_STATIC, 14, 84, 170, 18
+    LTEXT       "Um die Startoptionen manuell zu bearbeiten, klicken Sie auf ""Bearbeiten"".", IDC_STATIC, 14, 84, 170, 18
     PUSHBUTTON  "Be&arbeiten", IDC_STRRECEDIT, 188, 87, 50, 14
 
-    GROUPBOX    "System-Fehler", IDC_STATIC, 7, 111, 238, 140
+    GROUPBOX    "Systemfehler", IDC_STATIC, 7, 111, 238, 140
     AUTOCHECKBOX "Ereignis in das Systemprotokoll &eintragen", IDC_STRRECWRITEEVENT, 14, 124, 148, 10
     AUTOCHECKBOX "Administrator-Warnmeldung &senden", IDC_STRRECSENDALERT, 14, 138, 148, 10
     AUTOCHECKBOX "Automatisch &neu starten", IDC_STRRECRESTART, 14, 152, 145, 10
@@ -234,7 +234,7 @@ BEGIN
     PUSHBUTTON  "&Neu...", IDC_USER_VARIABLE_NEW, 80, 90, 50, 14
     PUSHBUTTON  "Be&arbeiten...", IDC_USER_VARIABLE_EDIT, 134, 90, 50, 14
     PUSHBUTTON  "&Löschen", IDC_USER_VARIABLE_DELETE, 188, 90, 50, 14
-    GROUPBOX    "System-Variablen", IDC_STATIC, 7, 116, 238, 100
+    GROUPBOX    "Systemvariablen", IDC_STATIC, 7, 116, 238, 100
     CONTROL     "", IDC_SYSTEM_VARIABLE_LIST, "SysListView32",
                     LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOSORTHEADER |
                     WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 14, 129, 224, 58, WS_EX_CLIENTEDGE
index b111e5c..f0918a3 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 #define IDC_STATIC  -1
 
 #define RTDATA                          1503
 
 #define IDS_DEVS                        2000
-
-#endif /* __CPL_RESOURCE_H */
index a4be13c..9d2319a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
+#pragma once
 
 /* icons */
 #define IDI_CPLSYSTEM  100
@@ -8,6 +7,4 @@
 #define IDS_CPLSYSTEMNAME                      1001
 #define IDS_CPLSYSTEMDESCRIPTION       2001
 
-#endif /* __CPL_RESOURCE_H */
-
 /* EOF */
index 5b0e99f..7221427 100644 (file)
@@ -40,11 +40,11 @@ END
 
 IDD_INETTIMEPAGE DIALOGEX 0, 0, 252, 146
 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Internet Zeit"
+CAPTION "Internetzeit"
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
     COMBOBOX        IDC_SERVERLIST, 65, 22, 117, 136, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Automatisch mit einem Internet Zeitserver synchronisieren", IDC_AUTOSYNC,
+    CONTROL         "Automatisch mit einem Internetzeitserver synchronisieren", IDC_AUTOSYNC,
                     "Button", BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,11,7,241,10
     LTEXT           "Server:", -1, 34, 22, 28, 13
     PUSHBUTTON      "Jetzt updaten", IDC_UPDATEBUTTON, 187, 22, 49, 14
index 501500a..b420c35 100644 (file)
@@ -1,6 +1,4 @@
-#ifndef __CPL_RESOURCE_H
-#define __CPL_RESOURCE_H
-
+#pragma once
 
 #define IDC_CPLICON             1
 
@@ -38,5 +36,3 @@
 #define IDS_INETTIMENEXTSYNC    1007
 #define IDS_INETTIMESYNCING     1008
 #define IDS_INETTIMEERROR       1009
-
-#endif /* __CPL_RESOURCE_H */
index 5491556..ced96a1 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_SAMPLE_H
-#define __CPL_SAMPLE_H
+#pragma once
 
 #include <windows.h>
 #include <windowsx.h>
@@ -112,6 +111,4 @@ typedef struct _NMMCCAUTOUPDATE
 BOOL RegisterMonthCalControl(IN HINSTANCE hInstance);
 VOID UnregisterMonthCalControl(IN HINSTANCE hInstance);
 
-#endif /* __CPL_SAMPLE_H */
-
 /* EOF */
diff --git a/reactos/dll/cpl/usrmgr/lang/de-DE.rc b/reactos/dll/cpl/usrmgr/lang/de-DE.rc
new file mode 100644 (file)
index 0000000..c8fa221
--- /dev/null
@@ -0,0 +1,223 @@
+LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
+
+/*
+ * Attention Translators:
+ *   DO NOT TRANSLATE THESE RESOURCES YET!
+ */
+
+/* Dialogs */
+
+IDD_USERS DIALOGEX DISCARDABLE  0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Benutzer"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    CONTROL "", IDC_USERS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+            7, 7, 238, 85, WS_EX_CLIENTEDGE
+END
+
+
+IDD_GROUPS DIALOGEX DISCARDABLE  0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Gruppen"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    CONTROL "", IDC_GROUPS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+            7, 7, 238, 85, WS_EX_CLIENTEDGE
+END
+
+
+IDD_EXTRA DIALOGEX DISCARDABLE  0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Extra"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT "Dieser Platz wurde absichtlich leer gelassen.", IDC_STATIC, 66, 90, 112, 8
+END
+
+
+IDD_USER_GENERAL DIALOGEX DISCARDABLE  0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Allgemein"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT "", IDC_USER_GENERAL_NAME, 7, 12, 112, 8
+    LTEXT "Voller Name:", -1, 7, 46, 63, 8
+    EDITTEXT IDC_USER_GENERAL_FULL_NAME,77,43,168,13,ES_AUTOHSCROLL
+    LTEXT "Beschreibung:", -1, 7, 64, 63, 8
+    EDITTEXT IDC_USER_GENERAL_DESCRIPTION,77,61,168,13,ES_AUTOHSCROLL
+    AUTOCHECKBOX    "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_GENERAL_FORCE_CHANGE,7,82,210,10
+    AUTOCHECKBOX    "Benutzer kann das Passwort nicht ändern",IDC_USER_GENERAL_CANNOT_CHANGE,7,95,210,10
+    AUTOCHECKBOX    "Passwort läuft nie ab",IDC_USER_GENERAL_NEVER_EXPIRES,7,108,210,10
+    AUTOCHECKBOX    "Konto ist deativiert",IDC_USER_GENERAL_DISABLED,7,121,210,10
+    AUTOCHECKBOX    "Konto ist gesperrt",IDC_USER_GENERAL_LOCKED,7,134,210,10
+END
+
+
+IDD_USER_MEMBERSHIP DIALOGEX DISCARDABLE  0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Mitgliedschaft"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT "Mitglied von:", -1, 7, 7, 56, 8
+    CONTROL "", IDC_USER_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+            7, 18, 238, 173, WS_EX_CLIENTEDGE
+    PUSHBUTTON "Hzfg...", IDC_USER_MEMBERSHIP_ADD, 7, 197, 50, 14
+    PUSHBUTTON "Entfernen", IDC_USER_MEMBERSHIP_REMOVE, 61, 197, 50, 14, WS_DISABLED
+END
+
+
+IDD_USER_PROFILE DIALOGEX DISCARDABLE  0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Profil"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    GROUPBOX "Benutzerprofil", -1, 7, 7, 238, 54
+    LTEXT "Profilpfad:", -1, 16, 22, 55, 8
+    EDITTEXT IDC_USER_PROFILE_PATH, 78, 19, 160, 13, ES_AUTOHSCROLL
+    LTEXT "Anmeldeskript:", -1, 16, 40, 55, 8
+    EDITTEXT IDC_USER_PROFILE_SCRIPT, 78, 37, 160, 13, ES_AUTOHSCROLL
+
+    GROUPBOX "Benutzerverzeichnis", -1, 7, 68, 238, 54
+    AUTORADIOBUTTON "Lokaler Pfad:", IDC_USER_PROFILE_LOCAL, 16, 83, 60, 10
+    AUTORADIOBUTTON "Verbinden:", IDC_USER_PROFILE_REMOTE, 16, 100, 60, 10
+    EDITTEXT IDC_USER_PROFILE_LOCAL_PATH, 78, 81, 160, 13, ES_AUTOHSCROLL
+    COMBOBOX IDC_USER_PROFILE_DRIVE, 78, 99, 26, 160, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
+    LTEXT "to:", -1, 112, 101, 12, 8
+    EDITTEXT IDC_USER_PROFILE_REMOTE_PATH, 130, 99, 108, 13, ES_AUTOHSCROLL
+END
+
+
+IDD_GROUP_GENERAL DIALOGEX DISCARDABLE  0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Allgemein"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT "", IDC_GROUP_GENERAL_NAME, 7, 12, 112, 8
+    LTEXT "Beschreibung:", -1, 7, 45, 46, 8
+    EDITTEXT IDC_GROUP_GENERAL_DESCRIPTION,65,42,180,13,ES_AUTOHSCROLL
+    LTEXT "Mitglieder:", -1, 7, 63, 45, 8
+    CONTROL "", IDC_GROUP_GENERAL_MEMBERS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+            7, 74, 238, 117, WS_EX_CLIENTEDGE
+    PUSHBUTTON "Hzfg...", IDC_GROUP_GENERAL_ADD, 7, 197, 50, 14
+    PUSHBUTTON "Entfernen", IDC_GROUP_GENERAL_REMOVE, 61, 197, 50, 14, WS_DISABLED
+END
+
+
+IDD_CHANGE_PASSWORD DIALOGEX DISCARDABLE  0, 0, 267, 74
+STYLE  DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "Passwort ändern"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    EDITTEXT        IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL | ES_PASSWORD
+    RTEXT           "Neues Passwort!", -1,7,10,96,8
+    EDITTEXT        IDC_EDIT_PASSWORD2,107,25,153,14,ES_AUTOHSCROLL | ES_PASSWORD
+    RTEXT           "Passwort wiederholen:", -1,7,28,96,8
+    DEFPUSHBUTTON   "OK",IDOK,156,53,50,14
+    PUSHBUTTON      "Abbrechen",IDCANCEL,210,53,50,14
+END
+
+
+IDD_USER_NEW DIALOGEX DISCARDABLE  0, 0, 267, 200
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "Neuer Benutzer"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    EDITTEXT        IDC_USER_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL
+    RTEXT           "Benutzername:", -1,7,10,96,8
+    EDITTEXT        IDC_USER_NEW_FULL_NAME,107,25,153,14,ES_AUTOHSCROLL
+    RTEXT           "Vollständiger Name:", -1,7,28,96,8
+    EDITTEXT        IDC_USER_NEW_DESCRIPTION,107,43,153,14,ES_AUTOHSCROLL
+    RTEXT           "Beschreibung:", -1,7,46,96,8
+    EDITTEXT        IDC_USER_NEW_PASSWORD1,107,67,153,14,ES_AUTOHSCROLL | ES_PASSWORD
+    RTEXT           "Passwort:", -1,7,70,96,8
+    EDITTEXT        IDC_USER_NEW_PASSWORD2,107,85,153,14,ES_AUTOHSCROLL | ES_PASSWORD
+    RTEXT           "Passwort wiederholen:", -1,7,88,96,8
+    AUTOCHECKBOX    "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_NEW_FORCE_CHANGE,7,109,200,10
+    AUTOCHECKBOX    "Benutzer kann das Passwort nicht ändern",IDC_USER_NEW_CANNOT_CHANGE,7,123,200,10,WS_DISABLED
+    AUTOCHECKBOX    "Passwort läuft nie ab",IDC_USER_NEW_NEVER_EXPIRES,7,137,200,10,WS_DISABLED
+    AUTOCHECKBOX    "Konto ist deaktiviert",IDC_USER_NEW_DISABLED,7,151,200,10
+    DEFPUSHBUTTON   "OK",IDOK,156,179,50,14,WS_DISABLED
+    PUSHBUTTON      "Abbrechen",IDCANCEL,210,179,50,14
+END
+
+
+IDD_GROUP_NEW DIALOGEX DISCARDABLE  0, 0, 267, 74
+STYLE  DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "Neue Gruppe"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    EDITTEXT        IDC_GROUP_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL
+    RTEXT           "Gruppenname:", -1,7,10,96,8
+    EDITTEXT        IDC_GROUP_NEW_DESCRIPTION,107,25,153,14,ES_AUTOHSCROLL
+    RTEXT           "Beschreibung:", -1,7,28,96,8
+    DEFPUSHBUTTON   "OK",IDOK,156,53,50,14,WS_DISABLED
+    PUSHBUTTON      "Abbrechen",IDCANCEL,210,53,50,14
+END
+
+
+IDD_USER_ADD_MEMBERSHIP DIALOGEX DISCARDABLE  0, 0, 252, 223
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "Gruppenmitgliedschaft"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    LTEXT "Mitglied von:", -1, 7, 7, 56, 8
+    CONTROL "", IDC_USER_ADD_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+            7, 18, 238, 173, WS_EX_CLIENTEDGE
+    DEFPUSHBUTTON   "OK",IDOK,141,197,50,14
+    PUSHBUTTON      "Abbrechen",IDCANCEL,195,197,50,14
+END
+
+
+/* Menus */
+
+IDM_POPUP_GROUP MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Neue Gruppe...", IDM_GROUP_NEW
+    END
+    POPUP ""
+    BEGIN
+        MENUITEM "Mitglied hinzufügen", IDM_GROUP_ADD_MEMBER, GRAYED
+        MENUITEM SEPARATOR
+        MENUITEM "Löschen", IDM_GROUP_DELETE
+        MENUITEM "Umbenennen", IDM_GROUP_RENAME
+        MENUITEM SEPARATOR
+        MENUITEM "Eigenschaften", IDM_GROUP_PROPERTIES
+    END
+END
+
+
+IDM_POPUP_USER MENU DISCARDABLE
+BEGIN
+    POPUP ""
+    BEGIN
+        MENUITEM "Neuer Benutzer...", IDM_USER_NEW
+    END
+    POPUP ""
+    BEGIN
+        MENUITEM "Passwort ändern", IDM_USER_CHANGE_PASSWORD
+        MENUITEM SEPARATOR
+        MENUITEM "Löschen", IDM_USER_DELETE
+        MENUITEM "Umbenennen", IDM_USER_RENAME
+        MENUITEM SEPARATOR
+        MENUITEM "Eigenschaften", IDM_USER_PROPERTIES
+    END
+END
+
+
+/* Strings */
+
+STRINGTABLE
+BEGIN
+    IDS_CPLNAME "Benutzerkonten"
+    IDS_CPLDESCRIPTION "Verwaltet Benutzer und Gruppen"
+END
+
+STRINGTABLE
+BEGIN
+    IDS_NAME "Name"
+    IDS_FULLNAME "Voller Name"
+    IDS_DESCRIPTION "Beschreibung"
+END
index 34910d4..c0c7bfa 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_USRMGR_RESOURCE_H__
-#define __CPL_USRMGR_RESOURCE_H__
+#pragma once
 
 #include <commctrl.h>
 
 #define IDM_USER_DELETE             133
 #define IDM_USER_RENAME             134
 #define IDM_USER_PROPERTIES         135
-
-#endif /* __CPL_USRMGR_RESOURCE_H__ */
-
index 2102d74..5e400c1 100644 (file)
@@ -1,6 +1,7 @@
 #include <windows.h>
 #include "resource.h"
 
+#include "lang/de-DE.rc"
 #include "lang/en-US.rc"
 #include "lang/pl-PL.rc"
 #include "lang/ru-RU.rc"
index 9820606..13896cd 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __CPL_DESK_H__
-#define __CPL_DESK_H__
+#pragma once
 
 #include <windows.h>
 #include <commctrl.h>
@@ -45,6 +44,3 @@ CheckAccountName(HWND hwndDlg,
 /* userprops.c */
 BOOL
 UserProperties(HWND hwndDlg);
-
-#endif /* __CPL_DESK_H__ */
-
index 9e4d45a..f8ae2a6 100644 (file)
@@ -35,7 +35,7 @@
 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
 
 typedef struct {
-    IAMMultiMediaStream lpVtbl;
+    const IAMMultiMediaStreamVtbl *lpVtbl;
     LONG ref;
     IGraphBuilder* pFilterGraph;
     IPin* ipin;
@@ -63,7 +63,7 @@ HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj)
         return E_OUTOFMEMORY;
     }
 
-    object->lpVtbl.lpVtbl = &AM_Vtbl;
+    object->lpVtbl = &AM_Vtbl;
     object->ref = 1;
 
     *ppObj = object;
@@ -129,7 +129,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetMediaStream(IAMMultiMediaStream
     MSPID PurposeId;
     unsigned int i;
 
-    TRACE("(%p/%p)->(%p,%p)\n", This, iface, idPurpose, ppMediaStream);
+    TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(idPurpose), ppMediaStream);
 
     for (i = 0; i < This->nbStreams; i++)
     {
@@ -214,7 +214,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_Initialize(IAMMultiMediaStream* if
     IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface;
     HRESULT hr = S_OK;
 
-    FIXME("(%p/%p)->(%x,%x,%p) partial stub!\n", This, iface, (DWORD)StreamType, dwFlags, pFilterGraph);
+    TRACE("(%p/%p)->(%x,%x,%p)\n", This, iface, (DWORD)StreamType, dwFlags, pFilterGraph);
 
     if (pFilterGraph)
     {
@@ -238,9 +238,17 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilterGraph(IAMMultiMediaStream
 {
     IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface;
 
-    FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppGraphBuilder);
+    TRACE("(%p/%p)->(%p)\n", This, iface, ppGraphBuilder);
 
-    return E_NOTIMPL;
+    if (!ppGraphBuilder)
+        return E_POINTER;
+
+    if (This->pFilterGraph)
+        return IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)ppGraphBuilder);
+    else
+        *ppGraphBuilder = NULL;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilter(IAMMultiMediaStream* iface, IMediaStreamFilter** ppFilter)
@@ -260,7 +268,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_AddMediaStream(IAMMultiMediaStream
     IMediaStream* pStream;
     IMediaStream** pNewStreams;
 
-    FIXME("(%p/%p)->(%p,%p,%x,%p) partial stub!\n", This, iface, pStreamObject, PurposeId, dwFlags, ppNewStream);
+    FIXME("(%p/%p)->(%p,%s,%x,%p) partial stub!\n", This, iface, pStreamObject, debugstr_guid(PurposeId), dwFlags, ppNewStream);
 
     if (IsEqualGUID(PurposeId, &MSPID_PrimaryVideo))
         hr = DirectDrawMediaStream_create((IMultiMediaStream*)iface, PurposeId, This->StreamType, &pStream);
@@ -341,6 +349,14 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenFile(IAMMultiMediaStream* ifac
         goto end;
     }
 
+    /* If Initialize was not called before, we do it here */
+    if (!This->pFilterGraph)
+    {
+        ret = IAMMultiMediaStream_Initialize(iface, STREAMTYPE_READ, 0, NULL);
+        if (FAILED(ret))
+            goto end;
+    }
+
     ret = IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)&This->GraphBuilder);
     if(ret != S_OK)
     {
index bf197aa..dc4ec64 100644 (file)
 #include "wingdi.h"
 
 #include "amstream_private.h"
-#include "ddstream.h"
 #include "amstream.h"
 
+#include "ddstream.h"
+
 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
 
 typedef struct {
-    IMediaStream lpVtbl;
+    const IMediaStreamVtbl *lpVtbl;
     LONG ref;
     IMultiMediaStream* Parent;
     MSPID PurposeId;
@@ -43,7 +44,7 @@ typedef struct {
 } IMediaStreamImpl;
 
 typedef struct {
-    IDirectDrawMediaStream lpVtbl;
+    const IDirectDrawMediaStreamVtbl *lpVtbl;
     LONG ref;
     IMultiMediaStream* Parent;
     MSPID PurposeId;
@@ -57,7 +58,7 @@ HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, S
 {
     IMediaStreamImpl* object; 
 
-    TRACE("(%p,%p,%p)\n", Parent, pPurposeId, ppMediaStream);
+    TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream);
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl));
     if (!object)
@@ -66,7 +67,7 @@ HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, S
         return E_OUTOFMEMORY;
     }
 
-    object->lpVtbl.lpVtbl = &MediaStream_Vtbl;
+    object->lpVtbl = &MediaStream_Vtbl;
     object->ref = 1;
 
     object->Parent = Parent;
@@ -197,7 +198,7 @@ HRESULT DirectDrawMediaStream_create(IMultiMediaStream* Parent, const MSPID* pPu
 {
     IDirectDrawMediaStreamImpl* object;
 
-    TRACE("(%p,%p,%p)\n", Parent, pPurposeId, ppMediaStream);
+    TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream);
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl));
     if (!object)
@@ -206,7 +207,7 @@ HRESULT DirectDrawMediaStream_create(IMultiMediaStream* Parent, const MSPID* pPu
         return E_OUTOFMEMORY;
     }
 
-    object->lpVtbl.lpVtbl = &DirectDrawMediaStream_Vtbl;
+    object->lpVtbl = &DirectDrawMediaStream_Vtbl;
     object->ref = 1;
 
     object->Parent = Parent;
index af335fd..4a4d712 100644 (file)
@@ -36,7 +36,7 @@
 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
 
 typedef struct {
-    IMediaStreamFilter lpVtbl;
+    const IMediaStreamFilterVtbl *lpVtbl;
     LONG ref;
     CRITICAL_SECTION csFilter;
     FILTER_STATE state;
@@ -63,7 +63,7 @@ HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, LPVOID *ppObj)
         return E_OUTOFMEMORY;
     }
 
-    object->lpVtbl.lpVtbl = &MediaStreamFilter_Vtbl;
+    object->lpVtbl = &MediaStreamFilter_Vtbl;
     object->ref = 1;
 
     *ppObj = object;
@@ -120,7 +120,7 @@ static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter * iface)
 
     if (!refCount)
     {
-        This->lpVtbl.lpVtbl = NULL;
+        This->lpVtbl = NULL;
         HeapFree(GetProcessHeap(), 0, This);
     }
 
index 028c68d..9c32891 100644 (file)
@@ -456,6 +456,13 @@ static struct regsvr_coclass const coclass_list[] = {
        "Both"
     },
 
+    {   &CLSID_MediaStreamFilter,
+       "SFilter Class",
+       NULL,
+       "amstream.dll",
+       "Both"
+    },
+
     { NULL }                   /* list terminator */
 };
 
diff --git a/reactos/dll/directx/bdaplgin/bdaplgin.cpp b/reactos/dll/directx/bdaplgin/bdaplgin.cpp
new file mode 100644 (file)
index 0000000..39ddb8a
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/bdaplgin/classfactory.cpp
+ * PURPOSE:         ClassFactory interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID CBDADeviceControl_GUID = {STATIC_KSMETHODSETID_BdaChangeSync};
+const GUID CBDAPinControl_GUID = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
+
+static INTERFACE_TABLE InterfaceTable[] =
+{
+    {&CBDADeviceControl_GUID, CBDADeviceControl_fnConstructor},
+    {&CBDAPinControl_GUID, CBDAPinControl_fnConstructor},
+    {NULL, NULL}
+};
+
+extern "C"
+BOOL
+WINAPI
+DllMain(
+    HINSTANCE hInstDLL,
+    DWORD fdwReason,
+    LPVOID lpvReserved)
+{
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            CoInitialize(NULL);
+
+#ifdef BDAPLGIN_TRACE
+            OutputDebugStringW(L"BDAPLGIN::DllMain()\n");
+#endif
+
+            DisableThreadLibraryCalls(hInstDLL);
+            break;
+    default:
+        break;
+    }
+
+    return TRUE;
+}
+
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllUnregisterServer(void)
+{
+    return S_OK;
+}
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllRegisterServer(void)
+{
+    return S_OK;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllGetClassObject(
+    REFCLSID rclsid,
+    REFIID riid,
+    LPVOID *ppv)
+{
+    UINT i;
+    HRESULT hres = E_OUTOFMEMORY;
+    IClassFactory * pcf = NULL;        
+
+    if (!ppv)
+        return E_INVALIDARG;
+
+    *ppv = NULL;
+
+    for (i = 0; InterfaceTable[i].riid; i++) 
+    {
+        if (IsEqualIID(*InterfaceTable[i].riid, rclsid)) 
+        {
+            pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
+            break;
+        }
+    }
+
+    if (!pcf) 
+    {
+        return CLASS_E_CLASSNOTAVAILABLE;
+    }
+
+    hres = pcf->QueryInterface(riid, ppv);
+    pcf->Release();
+
+    return hres;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllCanUnloadNow(void)
+{
+    return S_OK;
+}
diff --git a/reactos/dll/directx/bdaplgin/bdaplgin.rbuild b/reactos/dll/directx/bdaplgin/bdaplgin.rbuild
new file mode 100644 (file)
index 0000000..0824323
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<group>
+<module name="bdaplgin" type="win32dll" baseaddress="${BASEADDRESS_BDAPLGIN}" installbase="system32" installname="bdaplgin.ax">
+       <importlibrary definition="bdaplgin.spec" />
+       <include base="bdaplgin">.</include>
+       <library>ntdll</library>
+       <library>kernel32</library>
+       <library>advapi32</library>
+       <library>ole32</library>
+       <library>advapi32</library>
+       <library>msvcrt</library>
+       <library>ksproxy</library>
+       <group compilerset="gcc">
+               <compilerflag compiler="cxx">-fno-exceptions</compilerflag>
+               <compilerflag compiler="cxx">-fno-rtti</compilerflag>
+       </group>
+       <group compilerset="msc">
+               <compilerflag compiler="cxx">/GR-</compilerflag>
+       </group>
+
+       <file>bdaplgin.cpp</file>
+       <file>bdaplgin.rc</file>
+       <file>classfactory.cpp</file>
+       <file>controlnode.cpp</file>
+       <file>devicecontrol.cpp</file>
+       <file>digitaldemo.cpp</file>
+       <file>frequencyfilter.cpp</file>
+       <file>lnbinfo.cpp</file>
+       <file>pincontrol.cpp</file>
+       <file>signalstatistics.cpp</file>
+</module>
+</group>
diff --git a/reactos/dll/directx/bdaplgin/bdaplgin.rc b/reactos/dll/directx/bdaplgin/bdaplgin.rc
new file mode 100644 (file)
index 0000000..05b576c
--- /dev/null
@@ -0,0 +1,12 @@
+#include <windows.h>
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION   "ReactOS BDA Device Control Plug-in for MPEG2 based networks\0"
+#define REACTOS_STR_INTERNAL_NAME      "BdaPlgin.ax\0"
+#define REACTOS_STR_ORIGINAL_FILENAME  "BdaPlgin.ax\0"
+#define REACTOS_STR_PRODUCT_VERSION     "5.3.2600.3264\0"
+#define REACTOS_STR_FILE_VERSION        "5.3.2600.3264\0"
+
+#include <reactos/version.rc>
diff --git a/reactos/dll/directx/bdaplgin/bdaplgin.spec b/reactos/dll/directx/bdaplgin/bdaplgin.spec
new file mode 100644 (file)
index 0000000..5baed04
--- /dev/null
@@ -0,0 +1,4 @@
+@ stdcall DllCanUnloadNow()
+@ stdcall DllGetClassObject(ptr ptr ptr)
+@ stdcall DllRegisterServer()
+@ stdcall DllUnregisterServer()
diff --git a/reactos/dll/directx/bdaplgin/classfactory.cpp b/reactos/dll/directx/bdaplgin/classfactory.cpp
new file mode 100644 (file)
index 0000000..d6aaa3e
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/bdaplgin/classfactory.cpp
+ * PURPOSE:         ClassFactory interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID IID_IUnknown           = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+const GUID IID_IClassFactory      = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+
+class CClassFactory : public IClassFactory
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
+    HRESULT WINAPI LockServer(BOOL fLock);
+
+    CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst)
+    {};
+
+    virtual ~CClassFactory(){};
+
+protected:
+    LONG m_Ref;
+    LPFNCREATEINSTANCE m_lpfnCI;
+    IID * m_IID;
+};
+
+HRESULT
+WINAPI
+CClassFactory::QueryInterface(
+    REFIID riid,
+    LPVOID *ppvObj)
+{
+    *ppvObj = NULL;
+    if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
+    {
+        *ppvObj = PVOID(this);
+        InterlockedIncrement(&m_Ref);
+        return S_OK;
+    }
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::CreateInstance(
+    LPUNKNOWN pUnkOuter,
+    REFIID riid,
+    LPVOID *ppvObject)
+{
+    *ppvObject = NULL;
+
+    if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown))
+    {
+        return m_lpfnCI(pUnkOuter, riid, ppvObject);
+    }
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::LockServer(
+    BOOL fLock)
+{
+    return E_NOTIMPL;
+}
+
+IClassFactory * 
+CClassFactory_fnConstructor(
+    LPFNCREATEINSTANCE lpfnCI, 
+    PLONG pcRefDll, 
+    IID * riidInst)
+{
+    CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst);
+
+    if (!factory)
+        return NULL;
+
+    if (pcRefDll)
+        InterlockedIncrement(pcRefDll);
+
+    return (LPCLASSFACTORY)factory;
+}
diff --git a/reactos/dll/directx/bdaplgin/controlnode.cpp b/reactos/dll/directx/bdaplgin/controlnode.cpp
new file mode 100644 (file)
index 0000000..5cd98cc
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/bdaplgin/controlnode.cpp
+ * PURPOSE:         ControlNode interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID IID_IKsPropertySet = {0x31efac30, 0x515c, 0x11d0, {0xa9,0xaa, 0x00,0xaa,0x00,0x61,0xbe,0x93}};
+
+class CControlNode : public IUnknown
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    CControlNode(HANDLE hFile, ULONG NodeType, ULONG PinId) : m_Ref(0), m_hFile(hFile), m_NodeType(NodeType), m_PinId(PinId){};
+    virtual ~CControlNode(){};
+
+protected:
+    LONG m_Ref;
+    HANDLE m_hFile;
+    ULONG m_NodeType;
+    ULONG m_PinId;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CControlNode::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if(IsEqualGUID(refiid, IID_IBDA_FrequencyFilter))
+    {
+        return CBDAFrequencyFilter_fnConstructor(m_hFile, m_NodeType, refiid, Output);
+    }
+    else if(IsEqualGUID(refiid, IID_IBDA_SignalStatistics))
+    {
+        return CBDASignalStatistics_fnConstructor(m_hFile, m_NodeType, refiid, Output);
+    }
+    else if(IsEqualGUID(refiid, IID_IBDA_LNBInfo))
+    {
+        return CBDALNBInfo_fnConstructor(m_hFile, m_NodeType, refiid, Output);
+    }
+    else if(IsEqualGUID(refiid, IID_IBDA_DigitalDemodulator))
+    {
+        return CBDADigitalDemodulator_fnConstructor(m_hFile, m_NodeType, refiid, Output);
+    }
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CControlNode::QueryInterface: NoInterface for %s", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+#endif
+
+    return E_NOINTERFACE;
+}
+
+
+HRESULT
+WINAPI
+CControlNode_fnConstructor(
+    HANDLE hFile,
+    IBaseFilter * pFilter,
+    ULONG NodeType,
+    ULONG PinId,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    WCHAR Buffer[100];
+    HRESULT hr;
+    IPin * pPin = NULL;
+    IKsObject * pObject = NULL;
+
+    // store pin id
+    swprintf(Buffer, L"%u", PinId);
+
+    // try find target pin
+    hr = pFilter->FindPin(Buffer, &pPin);
+
+    if (FAILED(hr))
+    {
+#ifdef BDAPLGIN_TRACE
+        swprintf(Buffer, L"CControlNode_fnConstructor failed find pin %lu with %lx\n", PinId, hr);
+        OutputDebugStringW(Buffer);
+#endif
+        return hr;
+    }
+
+    // query IKsObject interface
+    hr = pPin->QueryInterface(IID_IKsObject, (void**)&pObject);
+
+#ifdef BDAPLGIN_TRACE
+    swprintf(Buffer, L"CControlNode_fnConstructor get IID_IKsObject status %lx\n", hr);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (SUCCEEDED(hr))
+    {
+        // get pin handle
+        hFile = pObject->KsGetObjectHandle();
+        // release IKsObject interface
+        pObject->Release();
+    }
+    // release IPin interface
+    pPin->Release();
+
+    // construct device control
+    CControlNode * handler = new CControlNode(hFile, NodeType, PinId);
+
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CControlNode_fnConstructor\n");
+#endif
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/bdaplgin/devicecontrol.cpp b/reactos/dll/directx/bdaplgin/devicecontrol.cpp
new file mode 100644 (file)
index 0000000..661eba5
--- /dev/null
@@ -0,0 +1,558 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/bdaplgin/classfactory.cpp
+ * PURPOSE:         ClassFactory interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}};
+const GUID IID_IAC3Filter         = {0xe4539501, 0xc609, 0x46ea, {0xad, 0x2a, 0x0e, 0x97, 0x00, 0x24, 0x56, 0x83}};
+const GUID IID_IAsyncReader       = {0x56A868AA, 0x0AD4, 0x11CE, {0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}};
+const GUID IID_IMatrixMixer       = {0xafc57835, 0x2fd1, 0x4541, {0xa6, 0xd9, 0x0d, 0xb7, 0x18, 0x56, 0xe5, 0x89}};
+const GUID IID_IBDA_NetworkProvider   = {0xfd501041, 0x8ebe, 0x11ce, {0x81, 0x83, 0x00, 0xaa, 0x00, 0x57, 0x7d, 0xa2}};
+const GUID IID_IAMOpenProgress    = {0x8E1C39A1, 0xDE53, 0x11cf, {0xAA, 0x63, 0x00, 0x80, 0xC7, 0x44, 0x52, 0x8D}};
+const GUID IID_IDistributorNotify = {0x56a868af, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
+const GUID IID_IBDA_DeviceControl = {0xFD0A5AF3, 0xB41D, 0x11d2, {0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0}};
+const GUID IID_IBDA_Topology      = {0x79B56888, 0x7FEA, 0x4690, {0xB4, 0x5D, 0x38, 0xFD, 0x3C, 0x78, 0x49, 0xBE}};
+const GUID IID_IKsObject           = {0x423c13a2, 0x2070, 0x11d0, {0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}};
+const GUID KSPROPSETID_BdaTopology = {0xa14ee835, 0x0a23, 0x11d3, {0x9c, 0xc7, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
+const GUID KSMETHODSETID_BdaDeviceConfiguration = {0x71985f45, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
+const GUID IID_IBaseFilter         = {0x56a86895, 0x0ad4, 0x11ce, {0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70}};
+const GUID KSMETHODSETID_BdaChangeSync = {0xfd0a5af3, 0xb41d, 0x11d2, {0x9c, 0x95, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
+
+class CBDADeviceControl : public IBDA_DeviceControl,
+                          public IBDA_Topology
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IBDA_DeviceControl methods
+    HRESULT STDMETHODCALLTYPE StartChanges( void);
+    HRESULT STDMETHODCALLTYPE CheckChanges( void);
+    HRESULT STDMETHODCALLTYPE CommitChanges( void);
+    HRESULT STDMETHODCALLTYPE GetChangeState(ULONG *pState);
+
+    // IBDA_Topology methods
+    HRESULT STDMETHODCALLTYPE GetNodeTypes(ULONG *pulcNodeTypes, ULONG ulcNodeTypesMax, ULONG * rgulNodeTypes);
+    HRESULT STDMETHODCALLTYPE GetNodeDescriptors(ULONG *ulcNodeDescriptors, ULONG ulcNodeDescriptorsMax, BDANODE_DESCRIPTOR * rgNodeDescriptors);
+    HRESULT STDMETHODCALLTYPE GetNodeInterfaces(ULONG ulNodeType, ULONG *pulcInterfaces, ULONG ulcInterfacesMax, GUID * rgguidInterfaces);
+    HRESULT STDMETHODCALLTYPE GetPinTypes(ULONG *pulcPinTypes, ULONG ulcPinTypesMax, ULONG *rgulPinTypes);
+    HRESULT STDMETHODCALLTYPE GetTemplateConnections(ULONG *pulcConnections, ULONG ulcConnectionsMax, BDA_TEMPLATE_CONNECTION * rgConnections);
+    HRESULT STDMETHODCALLTYPE CreatePin(ULONG ulPinType, ULONG *pulPinId);
+    HRESULT STDMETHODCALLTYPE DeletePin(ULONG ulPinId);
+    HRESULT STDMETHODCALLTYPE SetMediaType(ULONG ulPinId, AM_MEDIA_TYPE *pMediaType);
+    HRESULT STDMETHODCALLTYPE SetMedium(ULONG ulPinId, REGPINMEDIUM *pMedium);
+    HRESULT STDMETHODCALLTYPE CreateTopology(ULONG ulInputPinId, ULONG ulOutputPinId);
+    HRESULT STDMETHODCALLTYPE GetControlNode(ULONG ulInputPinId, ULONG ulOutputPinId, ULONG ulNodeType, IUnknown **ppControlNode);
+
+    CBDADeviceControl(IUnknown * pUnkOuter, IBaseFilter *pFilter, HANDLE hFile) : m_Ref(0), m_pUnkOuter(pUnkOuter), m_Handle(hFile), m_pFilter(pFilter){};
+    virtual ~CBDADeviceControl(){};
+
+protected:
+    LONG m_Ref;
+    IUnknown * m_pUnkOuter;
+    HANDLE m_Handle;
+    IBaseFilter * m_pFilter;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IBDA_DeviceControl))
+    {
+        *Output = (IBDA_DeviceControl*)(this);
+        reinterpret_cast<IBDA_DeviceControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IBDA_Topology))
+    {
+        *Output = (IBDA_Topology*)(this);
+        reinterpret_cast<IBDA_Topology*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    return E_NOINTERFACE;
+}
+
+
+//-------------------------------------------------------------------
+// IBDA_DeviceControl methods
+//
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::StartChanges( void)
+{
+    KSMETHOD Method;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    /* setup request */
+    Method.Set = KSMETHODSETID_BdaChangeSync;
+    Method.Id = KSMETHOD_BDA_START_CHANGES;
+    Method.Flags = KSMETHOD_TYPE_NONE;
+
+    /* execute request */
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)&Method, sizeof(KSMETHOD), NULL, 0, &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADeviceControl::StartChanges: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::CheckChanges( void)
+{
+    KSMETHOD Method;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    /* setup request */
+    Method.Set = KSMETHODSETID_BdaChangeSync;
+    Method.Id = KSMETHOD_BDA_CHECK_CHANGES;
+    Method.Flags = KSMETHOD_TYPE_NONE;
+
+    /* execute request */
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)&Method, sizeof(KSMETHOD), NULL, 0, &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADeviceControl::CheckChanges: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::CommitChanges( void)
+{
+    KSMETHOD Method;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    /* setup request */
+    Method.Set = KSMETHODSETID_BdaChangeSync;
+    Method.Id = KSMETHOD_BDA_COMMIT_CHANGES;
+    Method.Flags = KSMETHOD_TYPE_NONE;
+
+    /* execute request */
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)&Method, sizeof(KSMETHOD), NULL, 0, &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADeviceControl::CommitChanges: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::GetChangeState(ULONG *pState)
+{
+    if (pState)
+    {
+        *pState = BDA_CHANGES_COMPLETE;
+        return S_OK;
+    }
+    else
+    {
+        return E_POINTER;
+    }
+}
+
+//-------------------------------------------------------------------
+// IBDA_Topology methods
+//
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::GetNodeTypes(ULONG *pulcNodeTypes, ULONG ulcNodeTypesMax, ULONG * rgulNodeTypes)
+{
+    KSPROPERTY Property;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Property.Set = KSPROPSETID_BdaTopology;
+    Property.Id = KSPROPERTY_BDA_NODE_TYPES;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), rgulNodeTypes, sizeof(ULONG) * ulcNodeTypesMax, &BytesReturned);
+
+    *pulcNodeTypes = (BytesReturned / sizeof(ULONG));
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADeviceControl::GetNodeTypes: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+
+    if (SUCCEEDED(hr))
+    {
+        for(ULONG Index = 0; Index < *pulcNodeTypes; Index++)
+        {
+            swprintf(Buffer, L"CBDADeviceControl::GetPinTypes: Index %lu Value %lx\n", Index, rgulNodeTypes[Index]);
+            OutputDebugStringW(Buffer);
+        }
+    }
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::GetNodeDescriptors(ULONG *ulcNodeDescriptors, ULONG ulcNodeDescriptorsMax, BDANODE_DESCRIPTOR * rgNodeDescriptors)
+{
+    KSPROPERTY Property;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+
+    // setup request
+    Property.Set = KSPROPSETID_BdaTopology;
+    Property.Id = KSPROPERTY_BDA_NODE_DESCRIPTORS;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), rgNodeDescriptors, sizeof(BDANODE_DESCRIPTOR) * ulcNodeDescriptorsMax, &BytesReturned);
+
+    *ulcNodeDescriptors = (BytesReturned / sizeof(BDANODE_DESCRIPTOR));
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[1000];
+    swprintf(Buffer, L"CBDADeviceControl::GetNodeDescriptors: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+
+
+    if (SUCCEEDED(hr))
+    {
+        for(ULONG Index = 0; Index < min(*ulcNodeDescriptors, ulcNodeDescriptorsMax); Index++)
+        {
+            LPOLESTR pGUIDFunction, pGUIDName;
+
+            StringFromCLSID(rgNodeDescriptors[Index].guidFunction, &pGUIDFunction);
+            StringFromCLSID(rgNodeDescriptors[Index].guidName, &pGUIDName);
+
+            swprintf(Buffer, L"CBDADeviceControl::GetPinTypes: Index %lu Value %lx\nFunction %s\n Name %s\n-----\n", Index, rgNodeDescriptors[Index].ulBdaNodeType, pGUIDFunction, pGUIDName);
+            OutputDebugStringW(Buffer);
+        }
+    }
+#endif
+
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::GetNodeInterfaces(ULONG ulNodeType, ULONG *pulcInterfaces, ULONG ulcInterfacesMax, GUID * rgguidInterfaces)
+{
+    KSP_NODE Property;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+
+    // setup request
+    Property.Property.Set = KSPROPSETID_BdaTopology;
+    Property.Property.Id = KSPROPERTY_BDA_NODE_PROPERTIES;
+    Property.Property.Flags = KSPROPERTY_TYPE_GET;
+    Property.NodeId = ulNodeType;
+    Property.Reserved = 0;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_NODE), rgguidInterfaces, sizeof(GUID) * ulcInterfacesMax, &BytesReturned);
+
+    *pulcInterfaces = (BytesReturned / sizeof(GUID));
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADeviceControl::GetNodeInterfaces: hr %lx, BytesReturned %lu ulNodeType %lu\n", hr, BytesReturned, ulNodeType);
+    OutputDebugStringW(Buffer);
+
+    if (SUCCEEDED(hr))
+    {
+        for(ULONG Index = 0; Index < min(*pulcInterfaces, ulcInterfacesMax); Index++)
+        {
+            LPOLESTR pstr;
+
+            StringFromCLSID(rgguidInterfaces[Index], &pstr);
+
+            swprintf(Buffer, L"CBDADeviceControl::GetNodeInterfaces: Index %lu Name %s\n", Index, pstr);
+            OutputDebugStringW(Buffer);
+        }
+    }
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::GetPinTypes(ULONG *pulcPinTypes, ULONG ulcPinTypesMax, ULONG *rgulPinTypes)
+{
+    KSPROPERTY Property;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Property.Set = KSPROPSETID_BdaTopology;
+    Property.Id = KSPROPERTY_BDA_PIN_TYPES;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), rgulPinTypes, sizeof(ULONG) * ulcPinTypesMax, &BytesReturned);
+
+    *pulcPinTypes = (BytesReturned / sizeof(ULONG));
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADeviceControl::GetPinTypes: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+
+    if (SUCCEEDED(hr))
+    {
+        for(ULONG Index = 0; Index < *pulcPinTypes; Index++)
+        {
+            swprintf(Buffer, L"CBDADeviceControl::GetPinTypes: Index %lu Value %lx\n", Index, rgulPinTypes[Index]);
+            OutputDebugStringW(Buffer);
+        }
+    }
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::GetTemplateConnections(ULONG *pulcConnections, ULONG ulcConnectionsMax, BDA_TEMPLATE_CONNECTION * rgConnections)
+{
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDADeviceControl::GetTemplateConnections: NotImplemented\n");
+#endif
+
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::CreatePin(ULONG ulPinType, ULONG *pulPinId)
+{
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDADeviceControl::CreatePin: NotImplemented\n");
+#endif
+
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::DeletePin(ULONG ulPinId)
+{
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDADeviceControl::DeletePin: NotImplemented\n");
+#endif
+
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::SetMediaType(ULONG ulPinId, AM_MEDIA_TYPE *pMediaType)
+{
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDADeviceControl::SetMediaType: NotImplemented\n");
+#endif
+
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::SetMedium(ULONG ulPinId, REGPINMEDIUM *pMedium)
+{
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDADeviceControl::SetMedium: NotImplemented\n");
+#endif
+
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::CreateTopology(ULONG ulInputPinId, ULONG ulOutputPinId)
+{
+    KSM_BDA_PIN_PAIR Method;
+    HRESULT hr;
+    ULONG BytesReturned = 0;
+
+    Method.Method.Flags  = KSMETHOD_TYPE_NONE;
+    Method.Method.Id = KSMETHOD_BDA_CREATE_TOPOLOGY;
+    Method.Method.Set = KSMETHODSETID_BdaDeviceConfiguration;
+    Method.InputPinId = ulInputPinId;
+    Method.OutputPinId = ulOutputPinId;
+
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)&Method, sizeof(KSM_BDA_PIN_PAIR), NULL, 0, &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADeviceControl::CreateTopology: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADeviceControl::GetControlNode(ULONG ulInputPinId, ULONG ulOutputPinId, ULONG ulNodeType, IUnknown **ppControlNode)
+{
+    HRESULT hr;
+    ULONG PinId = 0;
+    ULONG BytesReturned;
+    KSP_BDA_NODE_PIN Property;
+
+    //setup request
+    Property.Property.Set = KSPROPSETID_BdaTopology;
+    Property.Property.Id = KSPROPERTY_BDA_CONTROLLING_PIN_ID;
+    Property.Property.Flags = KSPROPERTY_TYPE_GET;
+    Property.ulInputPinId = ulInputPinId;
+    Property.ulOutputPinId = ulOutputPinId;
+    Property.ulNodeType = ulNodeType;
+
+    // perform request
+    // WinXP SP3 expects minimum sizeof(KSP_BDA_NODE_PIN) + sizeof(ULONG)
+    // seems a driver to be a driver bug
+
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_BDA_NODE_PIN) + sizeof(ULONG), &PinId, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx, BytesReturned %lu PinId %lu\n", hr, BytesReturned, PinId);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (FAILED(hr))
+        return hr;
+
+    hr = CControlNode_fnConstructor(m_Handle, m_pFilter, ulNodeType, PinId, IID_IUnknown, (LPVOID*)ppControlNode);
+
+#ifdef BDAPLGIN_TRACE
+    swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx\n", hr);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+WINAPI
+CBDADeviceControl_fnConstructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    HRESULT hr;
+    IKsObject *pObject = NULL;
+    IBaseFilter *pFilter = NULL;
+    HANDLE hFile;
+
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDADeviceControl_fnConstructor\n");
+#endif
+
+    //DebugBreak();
+
+    // sanity check
+    assert(pUnkOuter);
+
+    // query for IKsObject
+    hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject);
+
+    if (FAILED(hr))
+        return E_NOINTERFACE;
+
+    // sanity check
+    assert(hr == NOERROR);
+
+    // query for IBaseFilter interface support
+    hr = pUnkOuter->QueryInterface(IID_IBaseFilter, (void**)&pFilter);
+
+    if (FAILED(hr))
+    {
+        // release 
+       pObject->Release();
+       return E_NOINTERFACE;
+    }
+
+    // another sanity check
+    assert(pObject != NULL);
+
+    // get file handle
+    hFile = pObject->KsGetObjectHandle();
+
+    // one more sanity check
+    assert(hFile != NULL && hFile != INVALID_HANDLE_VALUE);
+
+    // release IKsObject interface
+    pObject->Release();
+
+    // release filter
+    pFilter->Release();
+
+    // construct device control
+    CBDADeviceControl * handler = new CBDADeviceControl(pUnkOuter, pFilter, hFile);
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/bdaplgin/digitaldemo.cpp b/reactos/dll/directx/bdaplgin/digitaldemo.cpp
new file mode 100644 (file)
index 0000000..2d1b7ed
--- /dev/null
@@ -0,0 +1,355 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/bdaplgin/digitaldemo.cpp
+ * PURPOSE:         IBDA_DigitalDemodulator interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID IID_IBDA_DigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x04, 0xe1, 0xe0}};
+const GUID KSPROPSETID_BdaDigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x4, 0xe1, 0xe0}};
+
+class CBDADigitalDemodulator : public IBDA_DigitalDemodulator
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+    //IBDA_DigitalDemodulator methods
+    HRESULT STDMETHODCALLTYPE put_ModulationType(ModulationType *pModulationType);
+    HRESULT STDMETHODCALLTYPE get_ModulationType(ModulationType *pModulationType);
+    HRESULT STDMETHODCALLTYPE put_InnerFECMethod(FECMethod *pFECMethod);
+    HRESULT STDMETHODCALLTYPE get_InnerFECMethod(FECMethod *pFECMethod);
+    HRESULT STDMETHODCALLTYPE put_InnerFECRate(BinaryConvolutionCodeRate *pFECRate);
+    HRESULT STDMETHODCALLTYPE get_InnerFECRate(BinaryConvolutionCodeRate *pFECRate);
+    HRESULT STDMETHODCALLTYPE put_OuterFECMethod(FECMethod *pFECMethod);
+    HRESULT STDMETHODCALLTYPE get_OuterFECMethod(FECMethod *pFECMethod);
+    HRESULT STDMETHODCALLTYPE put_OuterFECRate(BinaryConvolutionCodeRate *pFECRate);
+    HRESULT STDMETHODCALLTYPE get_OuterFECRate(BinaryConvolutionCodeRate *pFECRate);
+    HRESULT STDMETHODCALLTYPE put_SymbolRate(ULONG *pSymbolRate);
+    HRESULT STDMETHODCALLTYPE get_SymbolRate(ULONG *pSymbolRate);
+    HRESULT STDMETHODCALLTYPE put_SpectralInversion(SpectralInversion *pSpectralInversion);
+    HRESULT STDMETHODCALLTYPE get_SpectralInversion(SpectralInversion *pSpectralInversion);
+
+    CBDADigitalDemodulator(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
+    ~CBDADigitalDemodulator(){};
+
+protected:
+    LONG m_Ref;
+    HANDLE m_hFile;
+    ULONG m_NodeId;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IBDA_DigitalDemodulator))
+    {
+        *Output = (IBDA_DigitalDemodulator*)(this);
+        reinterpret_cast<IBDA_DigitalDemodulator*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CBDADigitalDemodulator::QueryInterface: NoInterface for %s", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+#endif
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::put_ModulationType(ModulationType *pModulationType)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
+    Node.Property.Id = KSPROPERTY_BDA_MODULATION_TYPE;
+    Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pModulationType, sizeof(ModulationType), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADigitalDemodulator::put_ModulationType: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::get_ModulationType(ModulationType *pModulationType)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::put_InnerFECMethod(FECMethod *pFECMethod)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
+    Node.Property.Id = KSPROPERTY_BDA_INNER_FEC_TYPE;
+    Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::get_InnerFECMethod(FECMethod *pFECMethod)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::put_InnerFECRate(BinaryConvolutionCodeRate *pFECRate)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
+    Node.Property.Id = KSPROPERTY_BDA_INNER_FEC_RATE;
+    Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::get_InnerFECRate(BinaryConvolutionCodeRate *pFECRate)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::put_OuterFECMethod(FECMethod *pFECMethod)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
+    Node.Property.Id = KSPROPERTY_BDA_OUTER_FEC_TYPE;
+    Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE CBDADigitalDemodulator::get_OuterFECMethod(FECMethod *pFECMethod)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::put_OuterFECRate(BinaryConvolutionCodeRate *pFECRate)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
+    Node.Property.Id = KSPROPERTY_BDA_OUTER_FEC_RATE;
+    Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::get_OuterFECRate(BinaryConvolutionCodeRate *pFECRate)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::put_SymbolRate(ULONG *pSymbolRate)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
+    Node.Property.Id = KSPROPERTY_BDA_SYMBOL_RATE;
+    Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSymbolRate, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADigitalDemodulator::put_SymbolRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::get_SymbolRate(ULONG *pSymbolRate)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::put_SpectralInversion(SpectralInversion *pSpectralInversion)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator;
+    Node.Property.Id = KSPROPERTY_BDA_SPECTRAL_INVERSION;
+    Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSpectralInversion, sizeof(SpectralInversion), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDADigitalDemodulator::put_SpectralInversion: hr %lx, BytesReturned %lu\n", hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDADigitalDemodulator::get_SpectralInversion(SpectralInversion *pSpectralInversion)
+{
+    return E_NOINTERFACE;
+}
+
+
+HRESULT
+WINAPI
+CBDADigitalDemodulator_fnConstructor(
+    HANDLE hFile,
+    ULONG NodeId,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    // construct device control
+    CBDADigitalDemodulator * handler = new CBDADigitalDemodulator(hFile, NodeId);
+
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDADigitalDemodulator_fnConstructor\n");
+#endif
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/bdaplgin/frequencyfilter.cpp b/reactos/dll/directx/bdaplgin/frequencyfilter.cpp
new file mode 100644 (file)
index 0000000..90d1e6a
--- /dev/null
@@ -0,0 +1,297 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/bdaplgin/frequencyfilter.cpp
+ * PURPOSE:         IBDA_FrequencyFilter interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID IID_IBDA_FrequencyFilter = {0x71985f47, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x00, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
+const GUID KSPROPSETID_BdaFrequencyFilter = {0x71985f47, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
+
+class CBDAFrequencyFilter : public IBDA_FrequencyFilter
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    HRESULT STDMETHODCALLTYPE put_Autotune(ULONG ulTransponder);
+    HRESULT STDMETHODCALLTYPE get_Autotune(ULONG *pulTransponder);
+    HRESULT STDMETHODCALLTYPE put_Frequency(ULONG ulFrequency);
+    HRESULT STDMETHODCALLTYPE get_Frequency(ULONG *pulFrequency);
+    HRESULT STDMETHODCALLTYPE put_Polarity(Polarisation Polarity);
+    HRESULT STDMETHODCALLTYPE get_Polarity(Polarisation *pPolarity);
+    HRESULT STDMETHODCALLTYPE put_Range(ULONG ulRange);
+    HRESULT STDMETHODCALLTYPE get_Range(ULONG *pulRange);
+    HRESULT STDMETHODCALLTYPE put_Bandwidth(ULONG ulBandwidth);
+    HRESULT STDMETHODCALLTYPE get_Bandwidth(ULONG *pulBandwidth);
+    HRESULT STDMETHODCALLTYPE put_FrequencyMultiplier(ULONG ulMultiplier);
+    HRESULT STDMETHODCALLTYPE get_FrequencyMultiplier(ULONG *pulMultiplier);
+
+    CBDAFrequencyFilter(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
+    virtual ~CBDAFrequencyFilter(){};
+
+protected:
+    LONG m_Ref;
+    HANDLE m_hFile;
+    ULONG m_NodeId;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IBDA_FrequencyFilter))
+    {
+        *Output = (IBDA_FrequencyFilter*)(this);
+        reinterpret_cast<IBDA_FrequencyFilter*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CControlNode::QueryInterface: NoInterface for %s", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+#endif
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::put_Autotune(ULONG ulTransponder)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::get_Autotune(ULONG *pulTransponder)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::put_Frequency(ULONG ulFrequency)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
+    Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_FREQUENCY;
+    Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulFrequency, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDAFrequencyFilter::put_Frequency: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::get_Frequency(ULONG *pulFrequency)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::put_Polarity(Polarisation Polarity)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
+    Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_POLARITY;
+    Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Polarity, sizeof(Polarisation), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::get_Polarity(Polarisation *pPolarity)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::put_Range(ULONG ulRange)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
+    Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_RANGE;
+    Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulRange, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::get_Range(ULONG *pulRange)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::put_Bandwidth(ULONG ulBandwidth)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
+    Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_BANDWIDTH;
+    Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulBandwidth, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDAFrequencyFilter::put_Bandwidth: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::get_Bandwidth(ULONG *pulBandwidth)
+{
+    return E_NOINTERFACE;
+}
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::put_FrequencyMultiplier(ULONG ulMultiplier)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaFrequencyFilter;
+    Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER;
+    Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulMultiplier, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDAFrequencyFilter::put_FrequencyMultiplier: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAFrequencyFilter::get_FrequencyMultiplier(ULONG *pulMultiplier)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CBDAFrequencyFilter_fnConstructor(
+    HANDLE hFile,
+    ULONG NodeId,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    // construct device control
+    CBDAFrequencyFilter * handler = new CBDAFrequencyFilter(hFile, NodeId);
+
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDAFrequencyFilter_fnConstructor\n");
+#endif
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
\ No newline at end of file
diff --git a/reactos/dll/directx/bdaplgin/lnbinfo.cpp b/reactos/dll/directx/bdaplgin/lnbinfo.cpp
new file mode 100644 (file)
index 0000000..a663883
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/bdaplgin/lnbinfo.cpp
+ * PURPOSE:         IBDA_LNBInfo interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID IID_IBDA_LNBInfo = {0x992cf102, 0x49f9, 0x4719, {0xa6, 0x64,  0xc4, 0xf2, 0x3e, 0x24, 0x08, 0xf4}};
+const GUID KSPROPSETID_BdaLNBInfo = {0x992cf102, 0x49f9, 0x4719, {0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x8, 0xf4}};
+
+class CBDALNBInfo : public IBDA_LNBInfo
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    //IBDA_LNBInfo methods
+    HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyLowBand(ULONG ulLOFLow);
+    HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyLowBand(ULONG *pulLOFLow);
+    HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyHighBand(ULONG ulLOFHigh);
+    HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyHighBand(ULONG *pulLOFHigh);
+    HRESULT STDMETHODCALLTYPE put_HighLowSwitchFrequency(ULONG ulSwitchFrequency);
+    HRESULT STDMETHODCALLTYPE get_HighLowSwitchFrequency(ULONG *pulSwitchFrequency);
+
+    CBDALNBInfo(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
+    ~CBDALNBInfo(){};
+
+protected:
+    LONG m_Ref;
+    HANDLE m_hFile;
+    ULONG m_NodeId;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CBDALNBInfo::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IBDA_LNBInfo))
+    {
+        *Output = (IBDA_LNBInfo*)(this);
+        reinterpret_cast<IBDA_LNBInfo*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CBDALNBInfo::QueryInterface: NoInterface for %s", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+#endif
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDALNBInfo::put_LocalOscilatorFrequencyLowBand(ULONG ulLOFLow)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaLNBInfo;
+    Node.Property.Id = KSPROPERTY_BDA_LNB_LOF_LOW_BAND;
+    Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFLow, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyLowBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDALNBInfo::get_LocalOscilatorFrequencyLowBand(ULONG *pulLOFLow)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDALNBInfo::put_LocalOscilatorFrequencyHighBand(ULONG ulLOFHigh)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaLNBInfo;
+    Node.Property.Id = KSPROPERTY_BDA_LNB_LOF_HIGH_BAND;
+    Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFHigh, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyHighBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDALNBInfo::get_LocalOscilatorFrequencyHighBand(ULONG *pulLOFHigh)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDALNBInfo::put_HighLowSwitchFrequency(ULONG ulSwitchFrequency)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaLNBInfo;
+    Node.Property.Id = KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY;
+    Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = m_NodeId;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulSwitchFrequency, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDALNBInfo::put_HighLowSwitchFrequency: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDALNBInfo::get_HighLowSwitchFrequency(ULONG *pulSwitchFrequency)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CBDALNBInfo_fnConstructor(
+    HANDLE hFile,
+    ULONG NodeId,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    // construct device control
+    CBDALNBInfo * handler = new CBDALNBInfo(hFile, NodeId);
+
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDALNBInfo_fnConstructor\n");
+#endif
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
\ No newline at end of file
diff --git a/reactos/dll/directx/bdaplgin/pincontrol.cpp b/reactos/dll/directx/bdaplgin/pincontrol.cpp
new file mode 100644 (file)
index 0000000..a5b9912
--- /dev/null
@@ -0,0 +1,306 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/bdaplgin/classfactory.cpp
+ * PURPOSE:         ClassFactory interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID IID_IBDA_PinControl       = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
+const GUID KSPROPSETID_BdaPinControl = {0x0ded49d5, 0xa8b7, 0x4d5d, {0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d}};
+const GUID IID_IPin = {0x56a86891, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
+
+class CBDAPinControl : public IBDA_PinControl
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+    // IBDA_PinControl methods
+    HRESULT STDMETHODCALLTYPE GetPinID(ULONG *pulPinID);
+    HRESULT STDMETHODCALLTYPE GetPinType(ULONG *pulPinType);
+    HRESULT STDMETHODCALLTYPE RegistrationContext(ULONG *pulRegistrationCtx);
+
+
+    CBDAPinControl(HANDLE hFile, IBDA_NetworkProvider * pProvider, IPin * pConnectedPin) : m_Ref(0), m_Handle(hFile), m_pProvider(pProvider), m_pConnectedPin(pConnectedPin){};
+    virtual ~CBDAPinControl()
+    {
+        //m_pConnectedPin->Release();
+        //m_pProvider->Release();
+    };
+
+protected:
+    LONG m_Ref;
+    HANDLE m_Handle;
+    IBDA_NetworkProvider * m_pProvider;
+    IPin * m_pConnectedPin;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAPinControl::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IBDA_PinControl))
+    {
+        *Output = (IBDA_PinControl*)(this);
+        reinterpret_cast<IBDA_PinControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CBDAPinControl::QueryInterface: NoInterface for %s", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+#endif
+
+    return E_NOINTERFACE;
+}
+//-------------------------------------------------------------------
+// IBDA_PinControl methods
+//
+HRESULT
+STDMETHODCALLTYPE
+CBDAPinControl::GetPinID(ULONG *pulPinID)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+    HRESULT hr;
+
+    // setup request
+    Property.Set = KSPROPSETID_BdaPinControl;
+    Property.Id = KSPROPERTY_BDA_PIN_ID;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), pulPinID, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDAPinControl::GetPinID: hr %lx pulPinID %lu BytesReturned %lx\n", hr, *pulPinID, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAPinControl::GetPinType(ULONG *pulPinType)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+    HRESULT hr;
+
+    // setup request
+    Property.Set = KSPROPSETID_BdaPinControl;
+    Property.Id = KSPROPERTY_BDA_PIN_TYPE;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), pulPinType, sizeof(ULONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDAPinControl::GetPinType: hr %lx pulPinType %lu BytesReturned %lx\n", hr, *pulPinType, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDAPinControl::RegistrationContext(ULONG *pulRegistrationCtx)
+{
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDAPinControl::RegistrationContext: NotImplemented\n");
+#endif
+
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CBDAPinControl_fnConstructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    IPin * pConnectedPin = NULL;
+    IBDA_NetworkProvider * pNetworkProvider = NULL;
+    HANDLE hFile = INVALID_HANDLE_VALUE;
+
+#if 0
+    if (!IsEqualGUID(riid, IID_IUnknown))
+    {
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDAPinControl_fnConstructor: Expected IUnknown\n");
+#endif
+        return REGDB_E_CLASSNOTREG;
+    }
+
+
+    HRESULT hr;
+    IKsObject * pObject = NULL;
+    IPin * pPin = NULL;
+    IEnumFilters *pEnumFilters = NULL;
+
+    IBaseFilter * ppFilter[1];
+    PIN_INFO PinInfo;
+    FILTER_INFO FilterInfo;
+
+
+    if (!pUnkOuter)
+        return E_POINTER;
+
+    // query for IKsObject interface
+    hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject);
+
+    if (FAILED(hr))
+        return hr;
+
+    // query for IPin interface
+    hr = pObject->QueryInterface(IID_IPin, (void**)&pPin);
+
+    if (FAILED(hr))
+    {
+        //clean up
+       pObject->Release();
+       return hr;
+    }
+
+    // get pin info
+    hr = pPin->QueryPinInfo(&PinInfo);
+
+    if (FAILED(hr))
+    {
+        //clean up
+       pObject->Release();
+       pPin->Release();
+       return hr;
+    }
+
+    // sanity checks
+    assert(PinInfo.dir == PINDIR_OUTPUT);
+    assert(PinInfo.pFilter != NULL);
+
+    // query filter info
+    hr = PinInfo.pFilter->QueryFilterInfo(&FilterInfo);
+
+    // sanity check
+    assert(FilterInfo.pGraph != NULL);
+
+    // get IEnumFilters interface
+    hr = FilterInfo.pGraph->EnumFilters(&pEnumFilters);
+
+    if (FAILED(hr))
+    {
+        //clean up
+       FilterInfo.pGraph->Release();
+       PinInfo.pFilter->Release();
+       pObject->Release();
+       pPin->Release();
+       return hr;
+    }
+
+    while(pEnumFilters->Next(1, ppFilter, NULL) == S_OK)
+    {
+        // check if that filter supports the IBDA_NetworkProvider interface
+        hr = ppFilter[0]->QueryInterface(IID_IBDA_NetworkProvider, (void**)&pNetworkProvider);
+
+        // release IBaseFilter
+        ppFilter[0]->Release();
+
+        if (SUCCEEDED(hr))
+            break;
+    }
+
+    // release IEnumFilters interface
+    pEnumFilters->Release();
+
+    // release IFilterGraph interface
+    FilterInfo.pGraph->Release();
+
+    // release IBaseFilter interface
+    PinInfo.pFilter->Release();
+
+    if (pNetworkProvider)
+    {
+        // get connected pin handle
+        hr = pPin->ConnectedTo(&pConnectedPin);
+
+        // get file handle
+        hFile = pObject->KsGetObjectHandle();
+
+        if (FAILED(hr) || hFile == INVALID_HANDLE_VALUE)
+        {
+            // pin not connected
+            pNetworkProvider->Release();
+            // set zero
+            pNetworkProvider = NULL;
+        }
+    }
+
+    // release IPin 
+    pPin->Release();
+
+    // release IKsObject
+    pObject->Release();
+
+
+    if (pNetworkProvider == NULL)
+    {
+        // no network provider interface in graph
+        return E_NOINTERFACE;
+    }
+#endif
+
+    CBDAPinControl * handler = new CBDAPinControl(hFile, pNetworkProvider, pConnectedPin);
+
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDAPinControl_fnConstructor");
+#endif
+
+    DebugBreak();
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/bdaplgin/precomp.h b/reactos/dll/directx/bdaplgin/precomp.h
new file mode 100644 (file)
index 0000000..771a798
--- /dev/null
@@ -0,0 +1,104 @@
+#ifndef PRECOMP_H__
+#define PRECOMP_H__
+
+//#define BDAPLGIN_TRACE
+#define BUILDING_KS
+#define _KSDDK_
+#include <dshow.h>
+//#include <streams.h>
+#include <ks.h>
+#define __STREAMS__
+#include <ksproxy.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <tchar.h>
+#include <uuids.h>
+#include <bdatypes.h>
+#include <bdaiface.h>
+#include <bdamedia.h>
+#include <assert.h>
+
+typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
+
+typedef struct
+{
+    const GUID* riid;
+    LPFNCREATEINSTANCE lpfnCI;
+} INTERFACE_TABLE;
+
+/* classfactory.cpp */
+IClassFactory *
+CClassFactory_fnConstructor(
+    LPFNCREATEINSTANCE lpfnCI,
+    PLONG pcRefDll,
+    IID * riidInst);
+
+/* devicecontrol.cpp */
+HRESULT
+WINAPI
+CBDADeviceControl_fnConstructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+
+/* pincontrol.cpp */
+HRESULT
+WINAPI
+CBDAPinControl_fnConstructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* controlnode.cpp */
+
+HRESULT
+WINAPI
+CControlNode_fnConstructor(
+    HANDLE hFile,
+    IBaseFilter * pFilter,
+    ULONG NodeType,
+    ULONG PinId,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* frequencyfilter.cpp */
+
+HRESULT
+WINAPI
+CBDAFrequencyFilter_fnConstructor(
+    HANDLE hFile,
+    ULONG NodeId,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* signalstatistics.cpp */
+
+HRESULT
+WINAPI
+CBDASignalStatistics_fnConstructor(
+    HANDLE hFile,
+    ULONG NodeId,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* lnbinfo.cpp */
+
+HRESULT
+WINAPI
+CBDALNBInfo_fnConstructor(
+    HANDLE hFile,
+    ULONG NodeId,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* digitaldemo.cpp */
+HRESULT
+WINAPI
+CBDADigitalDemodulator_fnConstructor(
+    HANDLE hFile,
+    ULONG NodeId,
+    REFIID riid,
+    LPVOID * ppv);
+
+#endif
diff --git a/reactos/dll/directx/bdaplgin/signalstatistics.cpp b/reactos/dll/directx/bdaplgin/signalstatistics.cpp
new file mode 100644 (file)
index 0000000..ae6079e
--- /dev/null
@@ -0,0 +1,297 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/bdaplgin/frequencyfilter.cpp
+ * PURPOSE:         IBDA_FrequencyFilter interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID IID_IBDA_SignalStatistics = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0x0d, 0x9a, 0x2a, 0x43, 0x38}};
+const GUID KSPROPSETID_BdaSignalStats = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0xd, 0x9a, 0x2a, 0x43, 0x38}};
+
+class CBDASignalStatistics : public IBDA_SignalStatistics
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IBDA_SignalStatistics methods
+    HRESULT STDMETHODCALLTYPE put_SignalStrength(LONG lDbStrength);
+    HRESULT STDMETHODCALLTYPE get_SignalStrength(LONG *plDbStrength);
+    HRESULT STDMETHODCALLTYPE put_SignalQuality(LONG lPercentQuality);
+    HRESULT STDMETHODCALLTYPE get_SignalQuality(LONG *plPercentQuality);
+    HRESULT STDMETHODCALLTYPE put_SignalPresent(BOOLEAN fPresent);
+    HRESULT STDMETHODCALLTYPE get_SignalPresent(BOOLEAN *pfPresent);
+    HRESULT STDMETHODCALLTYPE put_SignalLocked(BOOLEAN fLocked);
+    HRESULT STDMETHODCALLTYPE get_SignalLocked(BOOLEAN *pfLocked);
+    HRESULT STDMETHODCALLTYPE put_SampleTime(LONG lmsSampleTime);
+    HRESULT STDMETHODCALLTYPE get_SampleTime(LONG *plmsSampleTime);
+
+    CBDASignalStatistics(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
+    ~CBDASignalStatistics(){};
+
+protected:
+    LONG m_Ref;
+    HANDLE m_hFile;
+    ULONG m_NodeId;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IBDA_SignalStatistics))
+    {
+        *Output = (IBDA_SignalStatistics*)(this);
+        reinterpret_cast<IBDA_SignalStatistics*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::put_SignalStrength(LONG lDbStrength)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::get_SignalStrength(LONG *plDbStrength)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaSignalStats;
+    Node.Property.Id = KSPROPERTY_BDA_SIGNAL_STRENGTH;
+    Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = (ULONG)-1;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plDbStrength, sizeof(LONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDASignalStatistics::get_SignalStrength: m_NodeId %lu hr %lx, BytesReturned %lu plDbStrength %ld\n", m_NodeId, hr, BytesReturned, *plDbStrength);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::put_SignalQuality(LONG lPercentQuality)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::get_SignalQuality(LONG *plPercentQuality)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaSignalStats;
+    Node.Property.Id = KSPROPERTY_BDA_SIGNAL_QUALITY;
+    Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = (ULONG)-1;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plPercentQuality, sizeof(LONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDASignalStatistics::get_SignalQuality: m_NodeId %lu hr %lx, BytesReturned %lu plPercentQuality %lu\n", m_NodeId, hr, BytesReturned, *plPercentQuality);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::put_SignalPresent(BOOLEAN fPresent)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::get_SignalPresent(BOOLEAN *pfPresent)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG Present;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaSignalStats;
+    Node.Property.Id = KSPROPERTY_BDA_SIGNAL_PRESENT;
+    Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = (ULONG)-1;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Present, sizeof(ULONG), &BytesReturned);
+    // store result
+    *pfPresent = Present;
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDASignalStatistics::get_SignalPresent: m_NodeId %lu hr %lx, BytesReturned %lu Present %lu\n", m_NodeId, hr, BytesReturned, Present);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::put_SignalLocked(BOOLEAN fLocked)
+{
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::get_SignalLocked(BOOLEAN *pfLocked)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG Locked;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaSignalStats;
+    Node.Property.Id = KSPROPERTY_BDA_SIGNAL_LOCKED;
+    Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = (ULONG)-1;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Locked, sizeof(ULONG), &BytesReturned);
+    *pfLocked = Locked;
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDASignalStatistics::get_SignalLocked: m_NodeId %lu hr %lx, BytesReturned %lu Locked %lu\n", m_NodeId, hr, BytesReturned, Locked);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::put_SampleTime(LONG lmsSampleTime)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaSignalStats;
+    Node.Property.Id = KSPROPERTY_BDA_SAMPLE_TIME;
+    Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = (ULONG)-1;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &lmsSampleTime, sizeof(LONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDASignalStatistics::put_SampleTime: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CBDASignalStatistics::get_SampleTime(LONG *plmsSampleTime)
+{
+    KSP_NODE Node;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    // setup request
+    Node.Property.Set = KSPROPSETID_BdaSignalStats;
+    Node.Property.Id = KSPROPERTY_BDA_SAMPLE_TIME;
+    Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY;
+    Node.NodeId = (ULONG)-1;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plmsSampleTime, sizeof(LONG), &BytesReturned);
+
+#ifdef BDAPLGIN_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CBDASignalStatistics::get_SampleTime: m_NodeId %lu hr %lx, BytesReturned %lu \n", m_NodeId, hr, BytesReturned);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return hr;
+}
+
+HRESULT
+WINAPI
+CBDASignalStatistics_fnConstructor(
+    HANDLE hFile,
+    ULONG NodeId,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    // construct device control
+    CBDASignalStatistics * handler = new CBDASignalStatistics(hFile, NodeId);
+
+#ifdef BDAPLGIN_TRACE
+    OutputDebugStringW(L"CBDASignalStatistics_fnConstructor\n");
+#endif
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
index f38172e..6cb0f20 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __DDRAW_PRIVATE
-#define __DDRAW_PRIVATE
+#pragma once
 
 /********* Includes  *********/
 #include <windows.h>
@@ -283,5 +282,3 @@ VOID Hal_DirectDraw_Release (LPDIRECTDRAW7);
     #define DX_STUB_str(x) //
 
 #endif
-
-#endif /* __DDRAW_PRIVATE */
index 1f5718d..78508ec 100644 (file)
@@ -4,6 +4,9 @@
        <directory name="amstream">
                <xi:include href="amstream/amstream.rbuild" />
        </directory>
+       <directory name="bdaplgin">
+               <xi:include href="bdaplgin/bdaplgin.rbuild" />
+       </directory>
        <directory name="d3d8thk">
                <xi:include href="d3d8thk/d3d8thk.rbuild" />
        </directory>
index 754f56b..8a630c2 100644 (file)
@@ -121,6 +121,12 @@ IDirectSound8_fnCreateSoundBuffer(
             return DSERR_INVALIDPARAM;
         }
 
+        if (lpcDSBufferDesc->dwBufferBytes != 0)
+        {
+            /* buffer size must be zero for primary sound buffer */
+            return DSERR_INVALIDPARAM;
+        }
+
         if (This->PrimaryBuffer)
         {
             /* primary buffer already exists */
@@ -129,7 +135,7 @@ IDirectSound8_fnCreateSoundBuffer(
             return S_OK;
         }
 
-        hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel);
+        hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags);
         if (SUCCEEDED(hResult))
         {
             /* store primary buffer */
@@ -145,9 +151,15 @@ IDirectSound8_fnCreateSoundBuffer(
             return DSERR_INVALIDPARAM;
         }
 
+        if (lpcDSBufferDesc->dwBufferBytes < DSBSIZE_MIN || lpcDSBufferDesc->dwBufferBytes > DSBSIZE_MAX)
+        {
+            /* buffer size must be within bounds for secondary sound buffer*/
+            return DSERR_INVALIDPARAM;
+        }
+
         if (!This->PrimaryBuffer)
         {
-            hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel);
+            hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags);
             if (SUCCEEDED(hResult))
             {
                 /* store primary buffer */
diff --git a/reactos/dll/directx/dsound_new/dsound_convert.c b/reactos/dll/directx/dsound_new/dsound_convert.c
new file mode 100644 (file)
index 0000000..0a6e474
--- /dev/null
@@ -0,0 +1,435 @@
+/* DirectSound format conversion and mixing routines
+ *
+ * Copyright 2007 Maarten Lankhorst
+ *
+ * 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
+ */
+
+/* 8 bits is unsigned, the rest is signed.
+ * First I tried to reuse existing stuff from alsa-lib, after that
+ * didn't work, I gave up and just went for individual hacks.
+ *
+ * 24 bit is expensive to do, due to unaligned access.
+ * In dlls/winex11.drv/dib_convert.c convert_888_to_0888_asis there is a way
+ * around it, but I'm happy current code works, maybe something for later.
+ *
+ * The ^ 0x80 flips the signed bit, this is the conversion from
+ * signed (-128.. 0.. 127) to unsigned (0...255)
+ * This is only temporary: All 8 bit data should be converted to signed.
+ * then when fed to the sound card, it should be converted to unsigned again.
+ *
+ * Sound is LITTLE endian
+ */
+
+#include "config.h"
+
+#include <stdarg.h>
+
+#define NONAMELESSSTRUCT
+#define NONAMELESSUNION
+#include "windef.h"
+#include "winbase.h"
+#include "mmsystem.h"
+#include "winternl.h"
+#include "wine/debug.h"
+#include "dsound.h"
+#include "dsdriver.h"
+#include "dsound_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(dsound);
+
+#ifdef WORDS_BIGENDIAN
+#define le16(x) RtlUshortByteSwap((x))
+#define le32(x) RtlUlongByteSwap((x))
+#else
+#define le16(x) (x)
+#define le32(x) (x)
+#endif
+
+static inline void src_advance(const void **src, UINT stride, INT *count, UINT *freqAcc, UINT adj)
+{
+    *freqAcc += adj;
+    if (*freqAcc >= (1 << DSOUND_FREQSHIFT))
+    {
+        ULONG adv = (*freqAcc >> DSOUND_FREQSHIFT);
+        *freqAcc &= (1 << DSOUND_FREQSHIFT) - 1;
+        *(const char **)src += adv * stride;
+        *count -= adv;
+    }
+}
+
+static void convert_8_to_8 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        *(BYTE *)dst = *(const BYTE *)src;
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_8_to_16 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        WORD dest = *(const BYTE *)src, *dest16 = dst;
+        *dest16 = le16(dest * 257 - 32768);
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_8_to_24 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        BYTE dest = *(const BYTE *)src;
+        BYTE *dest24 = dst;
+        dest24[0] = dest;
+        dest24[1] = dest;
+        dest24[2] = dest - 0x80;
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_8_to_32 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        DWORD dest = *(const BYTE *)src, *dest32 = dst;
+        *dest32 = le32(dest * 16843009 - 2147483648U);
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_16_to_8 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        BYTE *dst8 = dst;
+        *dst8 = (le16(*(const WORD *)src)) / 256;
+        *dst8 -= 0x80;
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_16_to_16 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        *(WORD *)dst = *(const WORD *)src;
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_16_to_24 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        WORD dest = le16(*(const WORD *)src);
+        BYTE *dest24 = dst;
+
+        dest24[0] = dest / 256;
+        dest24[1] = dest;
+        dest24[2] = dest / 256;
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_16_to_32 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        DWORD dest = *(const WORD *)src, *dest32 = dst;
+        *dest32 = dest * 65537;
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_24_to_8 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        BYTE *dst8 = dst;
+        *dst8 = ((const BYTE *)src)[2];
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_24_to_16 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        WORD *dest16 = dst;
+        const BYTE *source = src;
+        *dest16 = le16(source[2] * 256 + source[1]);
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_24_to_24 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        BYTE *dest24 = dst;
+        const BYTE *src24 = src;
+
+        dest24[0] = src24[0];
+        dest24[1] = src24[1];
+        dest24[2] = src24[2];
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_24_to_32 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        DWORD *dest32 = dst;
+        const BYTE *source = src;
+        *dest32 = le32(source[2] * 16777217 + source[1] * 65536 + source[0] * 256);
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_32_to_8 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        BYTE *dst8 = dst;
+        *dst8 = (le32(*(const DWORD *)src) / 16777216);
+        *dst8 -= 0x80;
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_32_to_16 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        WORD *dest16 = dst;
+        *dest16 = le16(le32(*(const DWORD *)src) / 65536);
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_32_to_24 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        DWORD dest = le32(*(const DWORD *)src);
+        BYTE *dest24 = dst;
+
+        dest24[0] = dest / 256;
+        dest24[1] = dest / 65536;
+        dest24[2] = dest / 16777216;
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+static void convert_32_to_32 (const void *src, void *dst, UINT src_stride,
+        UINT dst_stride, INT count, UINT freqAcc, UINT adj)
+{
+    while (count > 0)
+    {
+        DWORD *dest = dst;
+        *dest = *(const DWORD *)src;
+
+        dst = (char *)dst + dst_stride;
+        src_advance(&src, src_stride, &count, &freqAcc, adj);
+    }
+}
+
+const bitsconvertfunc convertbpp[4][4] = {
+    { convert_8_to_8, convert_8_to_16, convert_8_to_24, convert_8_to_32 },
+    { convert_16_to_8, convert_16_to_16, convert_16_to_24, convert_16_to_32 },
+    { convert_24_to_8, convert_24_to_16, convert_24_to_24, convert_24_to_32 },
+    { convert_32_to_8, convert_32_to_16, convert_32_to_24, convert_32_to_32 },
+};
+
+static void mix8(signed char *src, INT *dst, unsigned len)
+{
+    TRACE("%p - %p %d\n", src, dst, len);
+    while (len--)
+        /* 8-bit WAV is unsigned, it's here converted to signed, normalize function will convert it back again */
+        *(dst++) += (signed char)((BYTE)*(src++) - (BYTE)0x80);
+}
+
+static void mix16(SHORT *src, INT *dst, unsigned len)
+{
+    TRACE("%p - %p %d\n", src, dst, len);
+    len /= 2;
+    while (len--)
+    {
+        *dst += le16(*src);
+        ++dst; ++src;
+    }
+}
+
+static void mix24(BYTE *src, INT *dst, unsigned len)
+{
+    TRACE("%p - %p %d\n", src, dst, len);
+    len /= 3;
+    while (len--)
+    {
+        DWORD field;
+        field = ((DWORD)src[2] << 16) + ((DWORD)src[1] << 8) + (DWORD)src[0];
+        if (src[2] & 0x80)
+            field |= 0xFF000000U;
+        *(dst++) += field;
+        ++src;
+    }
+}
+
+static void mix32(INT *src, LONGLONG *dst, unsigned len)
+{
+    TRACE("%p - %p %d\n", src, dst, len);
+    len /= 4;
+    while (len--)
+        *(dst++) += le32(*(src++));
+}
+
+const mixfunc mixfunctions[4] = {
+    (mixfunc)mix8,
+    (mixfunc)mix16,
+    (mixfunc)mix24,
+    (mixfunc)mix32
+};
+
+static void norm8(INT *src, signed char *dst, unsigned len)
+{
+    TRACE("%p - %p %d\n", src, dst, len);
+    while (len--)
+    {
+        *dst = (*src) + 0x80;
+        if (*src < -0x80)
+            *dst = 0;
+        else if (*src > 0x7f)
+            *dst = 0xff;
+        ++dst;
+        ++src;
+    }
+}
+
+static void norm16(INT *src, SHORT *dst, unsigned len)
+{
+    TRACE("%p - %p %d\n", src, dst, len);
+    len /= 2;
+    while (len--)
+    {
+        *dst = le16(*src);
+        if (*src <= -0x8000)
+            *dst = le16(0x8000);
+        else if (*src > 0x7fff)
+            *dst = le16(0x7fff);
+        ++dst;
+        ++src;
+    }
+}
+
+static void norm24(INT *src, BYTE *dst, unsigned len)
+{
+    TRACE("%p - %p %d\n", src, dst, len);
+    len /= 3;
+    while (len--)
+    {
+        if (*src <= -0x800000)
+        {
+            dst[0] = 0;
+            dst[1] = 0;
+            dst[2] = 0x80;
+        }
+        else if (*src > 0x7fffff)
+        {
+            dst[0] = 0xff;
+            dst[1] = 0xff;
+            dst[2] = 0x7f;
+        }
+        else
+        {
+            dst[0] = *src;
+            dst[1] = *src >> 8;
+            dst[2] = *src >> 16;
+        }
+        ++dst;
+        ++src;
+    }
+}
+
+static void norm32(LONGLONG *src, INT *dst, unsigned len)
+{
+    TRACE("%p - %p %d\n", src, dst, len);
+    len /= 4;
+    while (len--)
+    {
+        *dst = le32(*src);
+        if (*src <= -(LONGLONG)0x80000000)
+            *dst = le32(0x80000000);
+        else if (*src > 0x7fffffff)
+            *dst = le32(0x7fffffff);
+        ++dst;
+        ++src;
+    }
+}
+
+const normfunc normfunctions[4] = {
+    (normfunc)norm8,
+    (normfunc)norm16,
+    (normfunc)norm24,
+    (normfunc)norm32,
+};
index 36139b7..71c314c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef PRECOMP_H__
-#define PRECOMP_H__
+#pragma once
 
 #define COBJMACROS
 #define NONAMELESSUNION
@@ -15,7 +14,7 @@
 #include <dsconf.h>
 #include <vfwmsgs.h>
 #include <setupapi.h>
-#define NDEBUG
+#define YDEBUG
 #include <debug.h>
 #include <ks.h>
 #include <ksmedia.h>
@@ -201,7 +200,8 @@ HRESULT
 NewPrimarySoundBuffer(
     LPDIRECTSOUNDBUFFER8 *OutBuffer,
     LPFILTERINFO Filter,
-    DWORD dwLevel);
+    DWORD dwLevel,
+    DWORD dwFlags);
 
 HRESULT
 PrimaryDirectSoundBuffer_SetFormat(
@@ -266,5 +266,3 @@ NewDirectSoundNotify(
     BOOL bMix,
     HANDLE hPin,
     DWORD BufferSize);
-
-#endif
index 9b5e822..2a62cce 100644 (file)
@@ -17,6 +17,10 @@ typedef struct
 
     LPFILTERINFO Filter;
     DWORD dwLevel;
+    DWORD dwFlags;
+    DWORD dwFrequency;
+    LONG Volume;
+    LONG VolumePan;
     WAVEFORMATEX Format;
     HANDLE hPin;
     CRITICAL_SECTION Lock;
@@ -94,8 +98,29 @@ PrimaryDirectSoundBuffer8Impl_fnGetCaps(
     LPDIRECTSOUNDBUFFER8 iface,
     LPDSBCAPS pDSBufferCaps)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetCaps\n");
+
+    if (!pDSBufferCaps)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    if (pDSBufferCaps->dwSize < sizeof(DSBCAPS))
+    {
+        /* invalid buffer size */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* get buffer details */
+    pDSBufferCaps->dwUnlockTransferRate = 0;
+    pDSBufferCaps->dwPlayCpuOverhead = 0;
+    pDSBufferCaps->dwSize = 0; //FIXME
+    pDSBufferCaps->dwFlags = This->dwFlags;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -105,7 +130,23 @@ PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition(
     LPDWORD pdwCurrentPlayCursor,
     LPDWORD pdwCurrentWriteCursor)
 {
-    UNIMPLEMENTED
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition\n");
+
+    if (This->dwLevel < DSSCL_PRIORITY)
+    {
+        /* needs priority level */
+        return DSERR_PRIOLEVELNEEDED;
+    }
+
+    if (!pdwCurrentPlayCursor && !pdwCurrentWriteCursor)
+    {
+        /* all parameters are null */
+        return DSERR_INVALIDPARAM;
+    }
+
+    UNIMPLEMENTED;
     return DSERR_INVALIDPARAM;
 }
 
@@ -120,6 +161,8 @@ PrimaryDirectSoundBuffer8Impl_fnGetFormat(
     DWORD FormatSize;
     LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
 
+    DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetFormat\n");
+
     FormatSize = sizeof(WAVEFORMATEX) + This->Format.cbSize;
 
     if (!pwfxFormat && !pdwSizeWritten)
@@ -160,8 +203,20 @@ PrimaryDirectSoundBuffer8Impl_fnGetVolume(
     LPDIRECTSOUNDBUFFER8 iface,
     LPLONG plVolume)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetVolume\n");
+
+    if (!plVolume)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* get volume */
+    *plVolume = This->Volume;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -170,8 +225,20 @@ PrimaryDirectSoundBuffer8Impl_fnGetPan(
     LPDIRECTSOUNDBUFFER8 iface,
     LPLONG plPan)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetPan\n");
+
+    if (!plPan)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* get frequency */
+    *plPan = This->VolumePan;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -180,8 +247,20 @@ PrimaryDirectSoundBuffer8Impl_fnGetFrequency(
     LPDIRECTSOUNDBUFFER8 iface,
     LPDWORD pdwFrequency)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetFrequency\n");
+
+    if (!pdwFrequency)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* get frequency */
+    *pdwFrequency = This->dwFrequency;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -190,8 +269,24 @@ PrimaryDirectSoundBuffer8Impl_fnGetStatus(
     LPDIRECTSOUNDBUFFER8 iface,
     LPDWORD pdwStatus)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetStatus\n");
+
+    if (!pdwStatus)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    *pdwStatus = 0;
+    if (This->State == KSSTATE_RUN || This->State == KSSTATE_ACQUIRE)
+    {
+        /* buffer is playing */
+        *pdwStatus |= DSBSTATUS_PLAYING | DSBSTATUS_LOOPING;
+    }
+
+    return DS_OK;
 }
 
 HRESULT
@@ -201,8 +296,8 @@ PrimaryDirectSoundBuffer8Impl_fnInitialize(
     LPDIRECTSOUND pDirectSound,
     LPCDSBUFFERDESC pcDSBufferDesc)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    /* RTFM */
+    return DSERR_ALREADYINITIALIZED;
 }
 
 HRESULT
@@ -229,8 +324,39 @@ PrimaryDirectSoundBuffer8Impl_fnPlay(
     DWORD dwPriority,
     DWORD dwFlags)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    DPRINT("PrimaryDirectSoundBuffer8Impl_fnPlay dwFlags %x\n", dwFlags);
+
+    if (dwReserved1 != 0 || !(dwFlags & DSBPLAY_LOOPING))
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    PrimaryDirectSoundBuffer_AcquireLock(iface);
+
+    if (This->State == KSSTATE_STOP)
+    {
+        PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_ACQUIRE);
+        ASSERT(This->State == KSSTATE_ACQUIRE);
+    }
+
+    if (This->State == KSSTATE_ACQUIRE)
+    {
+        PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_PAUSE);
+        ASSERT(This->State == KSSTATE_PAUSE);
+    }
+
+    if (This->State == KSSTATE_PAUSE)
+    {
+        PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_RUN);
+        ASSERT(This->State == KSSTATE_RUN);
+    }
+
+    PrimaryDirectSoundBuffer_ReleaseLock(iface);
+
+    return DS_OK;
 }
 
 HRESULT
@@ -239,8 +365,8 @@ PrimaryDirectSoundBuffer8Impl_fnSetCurrentPosition(
     LPDIRECTSOUNDBUFFER8 iface,
     DWORD dwNewPosition)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    /* The position of a primary buffer can't be set */
+    return DSERR_INVALIDCALL;
 }
 
 HRESULT
@@ -274,8 +400,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetVolume(
     LPDIRECTSOUNDBUFFER8 iface,
     LONG lVolume)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* TODO: call volume node */
+
+    /* Store volume */
+    This->Volume = lVolume;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -284,8 +422,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetPan(
     LPDIRECTSOUNDBUFFER8 iface,
     LONG lPan)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* TODO: call volume node */
+
+    /* Store volume pan */
+    This->VolumePan = lPan;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -294,8 +444,16 @@ PrimaryDirectSoundBuffer8Impl_fnSetFrequency(
     LPDIRECTSOUNDBUFFER8 iface,
     DWORD dwFrequency)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (This->dwLevel < DSSCL_PRIORITY)
+    {
+        /* needs priority level */
+        return DSERR_PRIOLEVELNEEDED;
+    }
+
+    /* invalid request */
+    return DSERR_CONTROLUNAVAIL;
 }
 
 HRESULT
@@ -303,8 +461,33 @@ WINAPI
 PrimaryDirectSoundBuffer8Impl_fnStop(
     LPDIRECTSOUNDBUFFER8 iface)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    DPRINT("PrimaryDirectSoundBuffer8Impl_fnStop\n");
+
+    PrimaryDirectSoundBuffer_AcquireLock(iface);
+
+    if (This->State == KSSTATE_RUN)
+    {
+        PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_PAUSE);
+        ASSERT(This->State == KSSTATE_PAUSE);
+    }
+
+    if (This->State == KSSTATE_PAUSE)
+    {
+        PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_ACQUIRE);
+        ASSERT(This->State == KSSTATE_ACQUIRE);
+    }
+
+    if (This->State == KSSTATE_ACQUIRE)
+    {
+        PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_STOP);
+        ASSERT(This->State == KSSTATE_STOP);
+    }
+
+    PrimaryDirectSoundBuffer_ReleaseLock(iface);
+
+    return DS_OK;
 }
 
 
@@ -322,8 +505,6 @@ PrimaryDirectSoundBuffer8Impl_fnUnlock(
 }
 
 
-
-
 HRESULT
 WINAPI
 PrimaryDirectSoundBuffer8Impl_fnRestore(
@@ -468,9 +649,10 @@ PrimaryDirectSoundBuffer_GetPosition(
     KSAUDIO_POSITION Position;
     KSPROPERTY Request;
     DWORD Result;
-
     LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
 
+    //DPRINT("PrimaryDirectSoundBuffer_GetPosition\n");
+
     if (!This->hPin)
     {
         if (pdwCurrentPlayCursor)
@@ -541,7 +723,10 @@ PrimaryDirectSoundBuffer_SetFormat(
         Result = OpenPin(This->Filter->hFilter, PinId, (LPWAVEFORMATEX)pcfxFormat, &This->hPin, bLooped);
         DPRINT("PinId %u Result %u\n", PinId, Result);
         if (Result == ERROR_SUCCESS)
+        {
+            This->dwFrequency = pcfxFormat->nSamplesPerSec;
             break;
+        }
 
         This->hPin = NULL;
         DeviceId++;
@@ -583,7 +768,8 @@ HRESULT
 NewPrimarySoundBuffer(
     LPDIRECTSOUNDBUFFER8 *OutBuffer,
     LPFILTERINFO Filter,
-    DWORD dwLevel)
+    DWORD dwLevel,
+    DWORD dwFlags)
 {
     LPCDirectSoundBuffer This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CDirectSoundBuffer));
 
@@ -597,8 +783,21 @@ NewPrimarySoundBuffer(
     This->lpVtbl = &vt_DirectSoundBuffer8;
     This->Filter = Filter;
     This->dwLevel = dwLevel;
+    This->dwFlags = dwFlags;
+    This->dwFrequency = 0;
+    This->Volume = DSBVOLUME_MAX;
+    This->VolumePan = DSBPAN_CENTER;
     This->hPin = NULL;
 
+    /* FIXME: determine default format for audio device */
+    This->Format.cbSize = sizeof(WAVEFORMATEX);
+    This->Format.nChannels = 2;
+    This->Format.nSamplesPerSec = 44100;
+    This->Format.wBitsPerSample = 16;
+    This->Format.wFormatTag = WAVE_FORMAT_PCM;
+    This->Format.nBlockAlign = (This->Format.nChannels * This->Format.wBitsPerSample) / 8;
+    This->Format.nAvgBytesPerSec = (This->Format.nChannels * This->Format.nSamplesPerSec * This->Format.wBitsPerSample) / 8;
+
     InitializeCriticalSection(&This->Lock);
 
     *OutBuffer = (LPDIRECTSOUNDBUFFER8)&This->lpVtbl;
index 5c963cc..04f9ebf 100644 (file)
@@ -1,16 +1,4 @@
-#ifndef RESOURCE_H__
-#define RESOURCE_H__
+#pragma once
 
 #define IDS_PRIMARY_PLAYBACK_DEVICE        100
 #define IDS_PRIMARY_RECORD_DEVICE          101
-
-
-
-
-
-
-
-
-
-
-#endif
index a3fe2b1..2293d34 100644 (file)
@@ -17,6 +17,11 @@ typedef struct
 
     LPFILTERINFO Filter;
     DWORD dwLevel;
+    DWORD dwFlags;
+    DWORD dwFrequency;
+    DWORD BufferPosition;
+    LONG Volume;
+    LONG VolumePan;
     LPWAVEFORMATEX Format;
     PUCHAR Buffer;
     DWORD BufferSize;
@@ -97,8 +102,27 @@ SecondaryDirectSoundBuffer8Impl_fnGetCaps(
     LPDIRECTSOUNDBUFFER8 iface,
     LPDSBCAPS pDSBufferCaps)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (!pDSBufferCaps)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    if (pDSBufferCaps->dwSize < sizeof(DSBCAPS))
+    {
+        /* invalid buffer size */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* get buffer details */
+    pDSBufferCaps->dwUnlockTransferRate = 0;
+    pDSBufferCaps->dwPlayCpuOverhead = 0;
+    pDSBufferCaps->dwSize = This->BufferSize;
+    pDSBufferCaps->dwFlags = This->dwFlags;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -112,15 +136,20 @@ SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition(
 
     //DPRINT("SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition This %p Play %p Write %p\n", This, pdwCurrentPlayCursor, pdwCurrentWriteCursor);
 
-    return PrimaryDirectSoundBuffer_GetPosition(This->PrimaryBuffer, pdwCurrentPlayCursor, pdwCurrentWriteCursor);
+    if (pdwCurrentWriteCursor)
+    {
+        *pdwCurrentWriteCursor = This->BufferPosition;
+    }
+
+    return PrimaryDirectSoundBuffer_GetPosition(This->PrimaryBuffer, pdwCurrentPlayCursor, NULL);
 }
 
 HRESULT
 WINAPI
 SecondaryDirectSoundBuffer8Impl_fnGetFormat(
     LPDIRECTSOUNDBUFFER8 iface,
-    LPWAVEFORMATEX pwfxFormat, 
-    DWORD dwSizeAllocated, 
+    LPWAVEFORMATEX pwfxFormat,
+    DWORD dwSizeAllocated,
     LPDWORD pdwSizeWritten)
 {
     DWORD FormatSize;
@@ -166,8 +195,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetVolume(
     LPDIRECTSOUNDBUFFER8 iface,
     LPLONG plVolume)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (!plVolume)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* get volume */
+    *plVolume = This->Volume;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -176,8 +215,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetPan(
     LPDIRECTSOUNDBUFFER8 iface,
     LPLONG plPan)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (!plPan)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* get frequency */
+    *plPan = This->VolumePan;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -186,8 +235,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetFrequency(
     LPDIRECTSOUNDBUFFER8 iface,
     LPDWORD pdwFrequency)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (!pdwFrequency)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* get frequency */
+    *pdwFrequency = This->dwFrequency;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -223,8 +282,8 @@ SecondaryDirectSoundBuffer8Impl_fnInitialize(
     LPDIRECTSOUND pDirectSound,
     LPCDSBUFFERDESC pcDSBufferDesc)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    /* RTFM */
+    return DSERR_ALREADYINITIALIZED;
 }
 
 HRESULT
@@ -263,11 +322,18 @@ SecondaryDirectSoundBuffer8Impl_fnLock(
     else
     {
         ASSERT(dwOffset < This->BufferSize);
-        ASSERT(dwBytes < This->BufferSize);
-        ASSERT(dwBytes + dwOffset <= This->BufferSize);
+        ASSERT(dwBytes <= This->BufferSize);
+
+        dwBytes = min(This->BufferSize - dwOffset, dwBytes);
 
         *ppvAudioPtr1 = This->Buffer + dwOffset;
         *pdwAudioBytes1 = dwBytes;
+
+        This->BufferPosition = dwOffset + dwBytes;
+
+        if (This->BufferPosition == This->BufferSize)
+            This->BufferPosition = 0;
+
         if (ppvAudioPtr2)
             *ppvAudioPtr2 = NULL;
         if (pdwAudioBytes2)
@@ -297,6 +363,13 @@ SecondaryDirectSoundBuffer8Impl_fnPlay(
     /* sanity check */
     ASSERT(dwFlags & DSBPLAY_LOOPING);
 
+
+    if (This->State == KSSTATE_RUN)
+    {
+        /* sound buffer is already playing */
+        return DS_OK;
+    }
+
     /* set dataformat */
     hResult = PrimaryDirectSoundBuffer_SetFormat(This->PrimaryBuffer, This->Format, TRUE);
 
@@ -316,7 +389,9 @@ SecondaryDirectSoundBuffer8Impl_fnPlay(
     /* release primary buffer */
     PrimaryDirectSoundBuffer_ReleaseLock(This->PrimaryBuffer);
 
-    DPRINT1("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer);
+    DPRINT("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer);
+    This->State = KSSTATE_RUN;
+
     return DS_OK;
 }
 
@@ -340,6 +415,7 @@ SecondaryDirectSoundBuffer8Impl_fnSetFormat(
     LPDIRECTSOUNDBUFFER8 iface,
     LPCWAVEFORMATEX pcfxFormat)
 {
+    /* RTFM */
     return DSERR_INVALIDCALL;
 }
 
@@ -349,8 +425,19 @@ SecondaryDirectSoundBuffer8Impl_fnSetVolume(
     LPDIRECTSOUNDBUFFER8 iface,
     LONG lVolume)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+
+    /* Store volume */
+    This->Volume = lVolume;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -359,8 +446,18 @@ SecondaryDirectSoundBuffer8Impl_fnSetPan(
     LPDIRECTSOUNDBUFFER8 iface,
     LONG lPan)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT)
+    {
+        /* invalid parameter */
+        return DSERR_INVALIDPARAM;
+    }
+
+    /* Store volume pan */
+    This->VolumePan = lPan;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -369,8 +466,29 @@ SecondaryDirectSoundBuffer8Impl_fnSetFrequency(
     LPDIRECTSOUNDBUFFER8 iface,
     DWORD dwFrequency)
 {
-    UNIMPLEMENTED
-    return DSERR_INVALIDPARAM;
+    LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+    if (dwFrequency == DSBFREQUENCY_ORIGINAL)
+    {
+        /* restore original frequency */
+        dwFrequency = This->Format->nSamplesPerSec;
+    }
+
+    if (dwFrequency < DSBFREQUENCY_MIN || dwFrequency > DSBFREQUENCY_MAX)
+    {
+        /* invalid frequency */
+        return DSERR_INVALIDPARAM;
+    }
+
+    if (dwFrequency != This->dwFrequency)
+    {
+        /* FIXME handle frequency change */
+    }
+
+    /* store frequency */
+    This->dwFrequency = dwFrequency;
+
+    return DS_OK;
 }
 
 HRESULT
@@ -384,6 +502,13 @@ SecondaryDirectSoundBuffer8Impl_fnStop(
     PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_ACQUIRE);
     PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_STOP);
 
+    DPRINT("SecondaryDirectSoundBuffer8Impl_fnStop\n");
+
+
+    /* set state to stop */
+    This->State = KSSTATE_STOP;
+    This->BufferPosition = 0;
+
     return DS_OK;
 }
 
@@ -522,12 +647,18 @@ NewSecondarySoundBuffer(
         return DSERR_OUTOFMEMORY;
     }
 
+    /* fill buffer with silence */
+    FillMemory(This->Buffer, lpcDSBufferDesc->dwBufferBytes, lpcDSBufferDesc->lpwfxFormat->wBitsPerSample == 8 ? 0x80 : 0);
 
     This->ref = 1;
     This->lpVtbl = &vt_DirectSoundBuffer8;
     This->Filter = Filter;
     This->dwLevel = dwLevel;
+    This->dwFlags = lpcDSBufferDesc->dwFlags;
+    This->dwFrequency = lpcDSBufferDesc->lpwfxFormat->nSamplesPerSec;
     This->State = KSSTATE_STOP;
+    This->Volume = DSBVOLUME_MAX;
+    This->VolumePan = DSBPAN_CENTER;
     This->Flags = 0;
     This->Position = 0;
     This->BufferSize = lpcDSBufferDesc->dwBufferBytes;
diff --git a/reactos/dll/directx/ksproxy/allocator.cpp b/reactos/dll/directx/ksproxy/allocator.cpp
new file mode 100644 (file)
index 0000000..f5b9c1e
--- /dev/null
@@ -0,0 +1,606 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/allocator.cpp
+ * PURPOSE:         IKsAllocator interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID IID_IKsAllocatorEx = {0x091bb63a, 0x603f, 0x11d1, {0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02}};
+const GUID IID_IKsAllocator   = {0x8da64899, 0xc0d9, 0x11d0, {0x84, 0x13, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a}};
+
+class CKsAllocator : public IKsAllocatorEx,
+                     public IMemAllocatorCallbackTemp
+{
+public:
+    typedef std::stack<IMediaSample *>MediaSampleStack;
+    typedef std::list<IMediaSample *>MediaSampleList;
+
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+    //IKsAllocator
+    HANDLE STDMETHODCALLTYPE KsGetAllocatorHandle();
+    KSALLOCATORMODE STDMETHODCALLTYPE KsGetAllocatorMode();
+    HRESULT STDMETHODCALLTYPE KsGetAllocatorStatus(PKSSTREAMALLOCATOR_STATUS AllocatorStatus);
+    VOID STDMETHODCALLTYPE KsSetAllocatorMode(KSALLOCATORMODE Mode);
+
+    //IKsAllocatorEx
+    PALLOCATOR_PROPERTIES_EX STDMETHODCALLTYPE KsGetProperties();
+    VOID STDMETHODCALLTYPE KsSetProperties(PALLOCATOR_PROPERTIES_EX Properties);
+    VOID STDMETHODCALLTYPE KsSetAllocatorHandle(HANDLE AllocatorHandle);
+    HANDLE STDMETHODCALLTYPE KsCreateAllocatorAndGetHandle(IKsPin* KsPin);
+
+    //IMemAllocator
+    HRESULT STDMETHODCALLTYPE SetProperties(ALLOCATOR_PROPERTIES *pRequest, ALLOCATOR_PROPERTIES *pActual);
+    HRESULT STDMETHODCALLTYPE GetProperties(ALLOCATOR_PROPERTIES *pProps);
+    HRESULT STDMETHODCALLTYPE Commit();
+    HRESULT STDMETHODCALLTYPE Decommit();
+    HRESULT STDMETHODCALLTYPE GetBuffer(IMediaSample **ppBuffer, REFERENCE_TIME *pStartTime, REFERENCE_TIME *pEndTime, DWORD dwFlags);
+    HRESULT STDMETHODCALLTYPE ReleaseBuffer(IMediaSample *pBuffer);
+
+    //IMemAllocatorCallbackTemp
+    HRESULT STDMETHODCALLTYPE SetNotify(IMemAllocatorNotifyCallbackTemp *pNotify);
+    HRESULT STDMETHODCALLTYPE GetFreeCount(LONG *plBuffersFree);
+
+
+    CKsAllocator();
+    virtual ~CKsAllocator(){}
+    VOID STDMETHODCALLTYPE FreeMediaSamples();
+protected:
+    LONG m_Ref;
+    HANDLE m_hAllocator;
+    KSALLOCATORMODE m_Mode;
+    ALLOCATOR_PROPERTIES_EX m_Properties;
+    IMemAllocatorNotifyCallbackTemp *m_Notify;
+    ULONG m_Allocated;
+    LONG m_cbBuffer;
+    LONG m_cBuffers;
+    LONG m_cbAlign;
+    LONG m_cbPrefix;
+    BOOL m_Commited;
+    CRITICAL_SECTION m_CriticalSection;
+    MediaSampleStack m_FreeList;
+    MediaSampleList m_UsedList;
+    LPVOID m_Buffer;
+    BOOL m_FreeSamples;
+};
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown) ||
+        IsEqualGUID(refiid, IID_IKsAllocator) ||
+        IsEqualGUID(refiid, IID_IKsAllocatorEx))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IMemAllocator) ||
+        IsEqualGUID(refiid, IID_IMemAllocatorCallbackTemp))
+    {
+        *Output = (IMemAllocatorCallbackTemp*)(this);
+        reinterpret_cast<IMemAllocatorCallbackTemp*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    return E_NOINTERFACE;
+}
+
+CKsAllocator::CKsAllocator() : m_Ref(0), 
+                               m_hAllocator(0), 
+                               m_Mode(KsAllocatorMode_User),
+                               m_Notify(0),
+                               m_Allocated(0),
+                               m_cbBuffer(0),
+                               m_cBuffers(0),
+                               m_cbAlign(0),
+                               m_cbPrefix(0),
+                               m_Commited(FALSE),
+                               m_FreeList(),
+                               m_UsedList(),
+                               m_Buffer(0),
+                               m_FreeSamples(FALSE)
+{
+   InitializeCriticalSection(&m_CriticalSection);
+
+}
+
+//-------------------------------------------------------------------
+// IMemAllocator
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::SetProperties(
+    ALLOCATOR_PROPERTIES *pRequest,
+    ALLOCATOR_PROPERTIES *pActual)
+{
+    SYSTEM_INFO SystemInfo;
+
+    EnterCriticalSection(&m_CriticalSection);
+    OutputDebugStringW(L"CKsAllocator::SetProperties\n");
+
+    if (!pRequest || !pActual)
+        return E_POINTER;
+
+    // zero output properties
+    ZeroMemory(pActual, sizeof(ALLOCATOR_PROPERTIES));
+
+    // get system info
+    GetSystemInfo(&SystemInfo);
+
+    if (!pRequest->cbAlign || (pRequest->cbAlign - 1) & SystemInfo.dwAllocationGranularity)
+    {
+        // bad alignment
+        LeaveCriticalSection(&m_CriticalSection);
+        return VFW_E_BADALIGN;
+    }
+
+    if (m_Mode == KsAllocatorMode_Kernel)
+    {
+        // u can't change a kernel allocator
+        LeaveCriticalSection(&m_CriticalSection);
+        return VFW_E_ALREADY_COMMITTED;
+    }
+
+    if (m_Commited)
+    {
+        // need to decommit first
+        LeaveCriticalSection(&m_CriticalSection);
+        return VFW_E_ALREADY_COMMITTED;
+    }
+
+    if (m_Allocated != m_FreeList.size())
+    {
+        // outstanding buffers
+        LeaveCriticalSection(&m_CriticalSection);
+        return VFW_E_BUFFERS_OUTSTANDING;
+    }
+
+    pActual->cbAlign = m_cbAlign = pRequest->cbAlign;
+    pActual->cbBuffer = m_cbBuffer = pRequest->cbBuffer;
+    pActual->cbPrefix = m_cbPrefix = pRequest->cbPrefix;
+    pActual->cBuffers = m_cBuffers = pRequest->cBuffers;
+
+    LeaveCriticalSection(&m_CriticalSection);
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::GetProperties(
+    ALLOCATOR_PROPERTIES *pProps)
+{
+    if (!pProps)
+        return E_POINTER;
+
+    pProps->cbBuffer = m_cbBuffer;
+    pProps->cBuffers = m_cBuffers;
+    pProps->cbAlign = m_cbAlign;
+    pProps->cbPrefix = m_cbPrefix;
+
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::Commit()
+{
+    LONG Index;
+    PUCHAR CurrentBuffer;
+    IMediaSample * Sample;
+    HRESULT hr;
+
+    //TODO integer overflow checks
+    EnterCriticalSection(&m_CriticalSection);
+
+    OutputDebugStringW(L"CKsAllocator::Commit\n");
+
+    if (m_Mode == KsAllocatorMode_Kernel)
+    {
+        /* no-op for kernel allocator */
+       LeaveCriticalSection(&m_CriticalSection);
+       return NOERROR;
+    }
+
+    if (m_Commited)
+    {
+        // already commited
+        LeaveCriticalSection(&m_CriticalSection);
+        return NOERROR;
+    }
+
+    if (m_cbBuffer < 0 || m_cBuffers < 0 || m_cbPrefix < 0)
+    {
+        // invalid parameter
+        LeaveCriticalSection(&m_CriticalSection);
+        return E_OUTOFMEMORY;
+    }
+
+    LONG Size = m_cbBuffer + m_cbPrefix;
+
+    if (m_cbAlign > 1)
+    {
+        //check alignment
+        LONG Mod = Size % m_cbAlign;
+        if (Mod)
+        {
+            // calculate aligned size
+            Size += m_cbAlign - Mod;
+        }
+    }
+
+    LONG TotalSize = Size * m_cBuffers;
+
+    assert(TotalSize);
+    assert(m_cBuffers);
+    assert(Size);
+
+    // now allocate buffer
+    m_Buffer = VirtualAlloc(NULL, TotalSize, MEM_COMMIT, PAGE_READWRITE);
+    if (!m_Buffer)
+    {
+        LeaveCriticalSection(&m_CriticalSection);
+        return E_OUTOFMEMORY;
+    }
+
+    ZeroMemory(m_Buffer, TotalSize);
+
+    CurrentBuffer = (PUCHAR)m_Buffer;
+
+    for (Index = 0; Index < m_cBuffers; Index++)
+    {
+        // construct media sample
+        hr = CMediaSample_Constructor((IMemAllocator*)this, CurrentBuffer + m_cbPrefix, m_cbBuffer, IID_IMediaSample, (void**)&Sample);
+        if (FAILED(hr))
+        {
+            LeaveCriticalSection(&m_CriticalSection);
+            return E_OUTOFMEMORY;
+        }
+
+        // add to free list
+        m_FreeList.push(Sample);
+        m_Allocated++;
+
+        //next sample buffer
+        CurrentBuffer += Size;
+    }
+
+    // we are now commited
+    m_Commited = true;
+
+    LeaveCriticalSection(&m_CriticalSection);
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::Decommit()
+{
+    EnterCriticalSection(&m_CriticalSection);
+
+    OutputDebugStringW(L"CKsAllocator::Decommit\n");
+
+    if (m_Mode == KsAllocatorMode_Kernel)
+    {
+        /* no-op for kernel allocator */
+        LeaveCriticalSection(&m_CriticalSection);
+        return NOERROR;
+    }
+
+    m_Commited = false;
+
+    if (m_Allocated != m_FreeList.size())
+    {
+        // outstanding buffers
+        m_FreeSamples = true;
+        LeaveCriticalSection(&m_CriticalSection);
+        return NOERROR;
+    }
+    else
+    {
+        // no outstanding buffers
+        // free to free them
+        FreeMediaSamples();
+    }
+
+    LeaveCriticalSection(&m_CriticalSection);
+    return NOERROR;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::GetBuffer(
+    IMediaSample **ppBuffer,
+    REFERENCE_TIME *pStartTime,
+    REFERENCE_TIME *pEndTime,
+    DWORD dwFlags)
+{
+    IMediaSample * Sample = NULL;
+    OutputDebugStringW(L"CKsAllocator::GetBuffer\n");
+
+    do
+    {
+        EnterCriticalSection(&m_CriticalSection);
+
+        if (!m_FreeList.empty())
+        {
+            Sample = m_FreeList.top();
+            m_FreeList.pop();
+        }
+
+        LeaveCriticalSection(&m_CriticalSection);
+
+        if (dwFlags & AM_GBF_NOWAIT)
+        {
+            // never wait untill a buffer becomes available
+            break;
+        }
+    }
+    while(Sample == NULL);
+
+    if (!Sample)
+    {
+        // no sample acquired
+        //HACKKKKKKK
+        Sample = m_UsedList.back();
+        m_UsedList.pop_back();
+
+        if (!Sample)
+            return VFW_E_TIMEOUT;
+    }
+
+    // store result
+    *ppBuffer = Sample;
+
+   // store sample in used list
+   m_UsedList.push_front(Sample);
+
+    // done
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::ReleaseBuffer(
+    IMediaSample *pBuffer)
+{
+    EnterCriticalSection(&m_CriticalSection);
+
+    OutputDebugStringW(L"CKsAllocator::ReleaseBuffer\n");
+
+    // media sample always 1 ref count in free list
+    pBuffer->AddRef();
+
+    // add the sample to the free list
+    m_FreeList.push(pBuffer);
+
+
+    if (m_FreeSamples)
+    {
+        // pending de-commit
+        if (m_FreeList.size () == m_Allocated)
+        {
+            FreeMediaSamples();
+        }
+    }
+
+    if (m_Notify)
+    {
+        //notify caller of an available buffer
+        m_Notify->NotifyRelease();
+    }
+
+    LeaveCriticalSection(&m_CriticalSection);
+    return S_OK;
+}
+
+//-------------------------------------------------------------------
+// IMemAllocatorCallbackTemp
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::SetNotify(
+    IMemAllocatorNotifyCallbackTemp *pNotify)
+{
+    EnterCriticalSection(&m_CriticalSection);
+    OutputDebugStringW(L"CKsAllocator::SetNotify\n");
+
+    if (pNotify)
+        pNotify->AddRef();
+
+    if (m_Notify)
+        m_Notify->Release();
+
+    m_Notify = pNotify;
+
+    LeaveCriticalSection(&m_CriticalSection);
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::GetFreeCount(
+    LONG *plBuffersFree)
+{
+    *plBuffersFree = m_Allocated - m_FreeList.size();
+    return S_OK;
+}
+
+//-------------------------------------------------------------------
+// IKsAllocator
+//
+HANDLE
+STDMETHODCALLTYPE
+CKsAllocator::KsGetAllocatorHandle()
+{
+    return m_hAllocator;
+}
+
+KSALLOCATORMODE
+STDMETHODCALLTYPE
+CKsAllocator::KsGetAllocatorMode()
+{
+    return m_Mode;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsAllocator::KsGetAllocatorStatus(
+    PKSSTREAMALLOCATOR_STATUS AllocatorStatus)
+{
+    return NOERROR;
+}
+VOID
+STDMETHODCALLTYPE
+CKsAllocator::KsSetAllocatorMode(
+    KSALLOCATORMODE Mode)
+{
+    m_Mode = Mode;
+}
+
+//-------------------------------------------------------------------
+// IKsAllocatorEx
+//
+PALLOCATOR_PROPERTIES_EX
+STDMETHODCALLTYPE
+CKsAllocator::KsGetProperties()
+{
+    return &m_Properties;
+}
+
+VOID
+STDMETHODCALLTYPE
+CKsAllocator::KsSetProperties(
+    PALLOCATOR_PROPERTIES_EX Properties)
+{
+    CopyMemory(&m_Properties, Properties, sizeof(ALLOCATOR_PROPERTIES_EX));
+}
+
+VOID
+STDMETHODCALLTYPE
+CKsAllocator::KsSetAllocatorHandle(
+    HANDLE AllocatorHandle)
+{
+    m_hAllocator = AllocatorHandle;
+}
+
+
+HANDLE
+STDMETHODCALLTYPE
+CKsAllocator::KsCreateAllocatorAndGetHandle(
+    IKsPin* KsPin)
+{
+    HRESULT hr;
+    IKsObject * pObject;
+    KSALLOCATOR_FRAMING AllocatorFraming;
+    HANDLE hPin;
+
+    OutputDebugStringW(L"CKsAllocator::KsCreateAllocatorAndGetHandle\n");
+
+    if (m_hAllocator)
+    {
+        CloseHandle(m_hAllocator);
+        m_hAllocator = NULL;
+    }
+
+    // get pin IKsObject interface
+    hr = KsPin->QueryInterface(IID_IKsObject, (void**)&pObject);
+    if (FAILED(hr))
+        return NULL;
+
+    // get pin handle
+    hPin = pObject->KsGetObjectHandle();
+
+    //release IKsObject interface
+    pObject->Release();
+
+    if (!hPin || hPin == INVALID_HANDLE_VALUE)
+        return NULL;
+
+    //setup allocator framing
+    AllocatorFraming.Frames = m_Properties.cBuffers;
+    AllocatorFraming.FrameSize = m_Properties.cbBuffer;
+    AllocatorFraming.FileAlignment = (m_Properties.cbAlign -1);
+    AllocatorFraming.OptionsFlags = KSALLOCATOR_OPTIONF_SYSTEM_MEMORY;
+    AllocatorFraming.PoolType = (m_Properties.LogicalMemoryType == KS_MemoryTypeKernelPaged);
+
+    DWORD dwError = KsCreateAllocator(hPin, &AllocatorFraming, &m_hAllocator);
+    if (dwError)
+        return NULL;
+
+    return m_hAllocator;
+}
+
+//-------------------------------------------------------------------
+VOID
+STDMETHODCALLTYPE
+CKsAllocator::FreeMediaSamples()
+{
+    ULONG Index;
+
+    for(Index = 0; Index < m_FreeList.size(); Index++)
+    {
+        IMediaSample * Sample = m_FreeList.top();
+        m_FreeList.pop();
+        delete Sample;
+    }
+
+    m_FreeSamples = false;
+    m_Allocated = 0;
+
+    if (m_Buffer)
+    {
+        // release buffer
+        VirtualFree(m_Buffer, 0, MEM_RELEASE);
+
+        m_Buffer = NULL;
+    }
+}
+
+HRESULT
+WINAPI
+CKsAllocator_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    OutputDebugStringW(L"CKsAllocator_Constructor\n");
+
+    CKsAllocator * handler = new CKsAllocator();
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/ksproxy/basicaudio.cpp b/reactos/dll/directx/ksproxy/basicaudio.cpp
new file mode 100644 (file)
index 0000000..7fec05f
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/basicaudio.cpp
+ * PURPOSE:         IBasicAudio interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CKsBasicAudio : public IBasicAudio,
+                      public IDistributorNotify
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IDistributorNotify methods
+    HRESULT STDMETHODCALLTYPE Stop();
+    HRESULT STDMETHODCALLTYPE Pause();
+    HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
+    HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock);
+    HRESULT STDMETHODCALLTYPE NotifyGraphChange();
+
+    // IDispatch methods
+    HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
+    HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
+    HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
+    HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+
+
+    // IBasicAudio methods
+    HRESULT STDMETHODCALLTYPE put_Volume(long lVolume);
+    HRESULT STDMETHODCALLTYPE get_Volume(long *plVolume);
+    HRESULT STDMETHODCALLTYPE put_Balance(long lBalance);
+    HRESULT STDMETHODCALLTYPE get_Balance(long *plBalance);
+
+
+    CKsBasicAudio() : m_Ref(0){}
+    virtual ~CKsBasicAudio(){}
+
+protected:
+    LONG m_Ref;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IDistributorNotify))
+    {
+        *Output = (IDistributorNotify*)(this);
+        reinterpret_cast<IDistributorNotify*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IBasicAudio))
+    {
+        *Output = (IBasicAudio*)(this);
+        reinterpret_cast<IBasicAudio*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDistributorNotify interface
+//
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::Stop()
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::Pause()
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::Run(
+    REFERENCE_TIME tStart)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::SetSyncSource(
+    IReferenceClock *pClock)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::NotifyGraphChange()
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IDispatch interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::GetTypeInfoCount(
+    UINT *pctinfo)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::GetTypeInfo(
+    UINT iTInfo,
+    LCID lcid,
+    ITypeInfo **ppTInfo)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::GetIDsOfNames(
+    REFIID riid,
+    LPOLESTR *rgszNames,
+    UINT cNames,
+    LCID lcid,
+    DISPID *rgDispId)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::Invoke(
+    DISPID dispIdMember,
+    REFIID riid,
+    LCID lcid,
+    WORD wFlags,
+    DISPPARAMS *pDispParams,
+    VARIANT *pVarResult,
+    EXCEPINFO *pExcepInfo,
+    UINT *puArgErr)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IBasicAudio interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::put_Volume(
+    long lVolume)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::get_Volume(
+    long *plVolume)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::put_Balance(
+    long lBalance)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsBasicAudio::get_Balance(
+    long *plBalance)
+{
+    OutputDebugStringW(L"UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CKsBasicAudio_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    OutputDebugStringW(L"CKsBasicAudio_Constructor\n");
+
+    CKsBasicAudio * handler = new CKsBasicAudio();
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/ksproxy/classfactory.cpp b/reactos/dll/directx/ksproxy/classfactory.cpp
new file mode 100644 (file)
index 0000000..5b90ade
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/classfactory.cpp
+ * PURPOSE:         IClassFactory interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CClassFactory : public IClassFactory
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
+    HRESULT WINAPI LockServer(BOOL fLock);
+
+    CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst)
+    {};
+
+    virtual ~CClassFactory(){};
+
+protected:
+    LONG m_Ref;
+    LPFNCREATEINSTANCE m_lpfnCI;
+    IID * m_IID;
+};
+
+HRESULT
+WINAPI
+CClassFactory::QueryInterface(
+    REFIID riid,
+    LPVOID *ppvObj)
+{
+    *ppvObj = NULL;
+    if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
+    {
+        *ppvObj = PVOID(this);
+        InterlockedIncrement(&m_Ref);
+        return S_OK;
+    }
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::CreateInstance(
+    LPUNKNOWN pUnkOuter,
+    REFIID riid,
+    LPVOID *ppvObject)
+{
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+
+    *ppvObject = NULL;
+
+    StringFromCLSID(riid, &lpstr);
+
+    swprintf(Buffer, L"riid %s", lpstr);
+    OutputDebugStringW(Buffer);
+
+
+    if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown))
+    {
+        return m_lpfnCI(pUnkOuter, riid, ppvObject);
+    }
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::LockServer(
+    BOOL fLock)
+{
+    return E_NOTIMPL;
+}
+
+IClassFactory * 
+CClassFactory_fnConstructor(
+    LPFNCREATEINSTANCE lpfnCI, 
+    PLONG pcRefDll, 
+    IID * riidInst)
+{
+    CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst);
+
+    if (!factory)
+        return NULL;
+
+    if (pcRefDll)
+        InterlockedIncrement(pcRefDll);
+
+    return (LPCLASSFACTORY)factory;
+}
diff --git a/reactos/dll/directx/ksproxy/clockforward.cpp b/reactos/dll/directx/ksproxy/clockforward.cpp
new file mode 100644 (file)
index 0000000..d692dec
--- /dev/null
@@ -0,0 +1,361 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/clockforward.cpp
+ * PURPOSE:         IKsClockForwarder interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+#ifndef _MSC_VER
+const GUID KSCATEGORY_CLOCK       = {0x53172480, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+#endif
+
+DWORD WINAPI CKsClockForwarder_ThreadStartup(LPVOID lpParameter);
+
+class CKsClockForwarder : public IDistributorNotify,
+                          public IKsObject
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IDistributorNotify interface
+    HRESULT STDMETHODCALLTYPE Stop();
+    HRESULT STDMETHODCALLTYPE Pause();
+    HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
+    HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock);
+    HRESULT STDMETHODCALLTYPE NotifyGraphChange();
+
+    // IKsObject interface
+    HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
+
+    CKsClockForwarder(HANDLE handle);
+    virtual ~CKsClockForwarder(){};
+    HRESULT STDMETHODCALLTYPE SetClockState(KSSTATE State);
+protected:
+    LONG m_Ref;
+    HANDLE m_Handle;
+    IReferenceClock * m_Clock;
+    HANDLE m_hEvent;
+    HANDLE m_hThread;
+    BOOL m_ThreadStarted;
+    BOOL m_PendingStop;
+    BOOL m_ForceStart;
+    KSSTATE m_State;
+    REFERENCE_TIME m_Time;
+
+    friend DWORD WINAPI CKsClockForwarder_ThreadStartup(LPVOID lpParameter);
+};
+
+CKsClockForwarder::CKsClockForwarder(
+    HANDLE handle) : m_Ref(0),
+                     m_Handle(handle),
+                     m_Clock(0),
+                     m_hEvent(NULL),
+                     m_hThread(NULL),
+                     m_ThreadStarted(FALSE),
+                     m_PendingStop(FALSE),
+                     m_ForceStart(FALSE),
+                     m_State(KSSTATE_STOP),
+                     m_Time(0)
+{
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsClockForwarder::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IKsObject))
+    {
+        *Output = (IKsObject*)(this);
+        reinterpret_cast<IKsObject*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IDistributorNotify))
+    {
+        *Output = (IDistributorNotify*)(this);
+        reinterpret_cast<IDistributorNotify*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+#if 0
+    if (IsEqualGUID(refiid, IID_IKsClockForwarder))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IKsObject*>(*Output)->AddRef();
+        return NOERROR;
+    }
+#endif
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDistributorNotify interface
+//
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsClockForwarder::Stop()
+{
+    OutputDebugString("CKsClockForwarder::Stop\n");
+
+    if (m_ThreadStarted)
+    {
+        // signal pending stop
+        m_PendingStop = true;
+
+        assert(m_hThread);
+        assert(m_hEvent);
+
+        // set stop event
+        SetEvent(m_hEvent);
+
+        // wait untill the thread has finished
+        WaitForSingleObject(m_hThread, INFINITE);
+
+        // close thread handle
+        CloseHandle(m_hThread);
+
+        // zero handle
+        m_hThread = NULL;
+    }
+
+    if (m_hEvent)
+    {
+        // close stop event
+        CloseHandle(m_hEvent);
+        m_hEvent = NULL;
+    }
+
+    m_PendingStop = false;
+
+    SetClockState(KSSTATE_STOP);
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsClockForwarder::Pause()
+{
+    OutputDebugString("CKsClockForwarder::Pause\n");
+
+    if (!m_hEvent)
+    {
+        m_hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+        if (!m_hEvent)
+            return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    if (m_State <= KSSTATE_PAUSE)
+    {
+        if (m_State == KSSTATE_STOP)
+            SetClockState(KSSTATE_ACQUIRE);
+
+        if (m_State == KSSTATE_ACQUIRE)
+            SetClockState(KSSTATE_PAUSE);
+    }
+    else
+    {
+        if (!m_ForceStart)
+        {
+            SetClockState(KSSTATE_PAUSE);
+        }
+    }
+
+    if (!m_hThread)
+    {
+        m_hThread = CreateThread(NULL, 0, CKsClockForwarder_ThreadStartup, (LPVOID)this, 0, NULL);
+        if (!m_hThread)
+            return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsClockForwarder::Run(
+    REFERENCE_TIME tStart)
+{
+    OutputDebugString("CKsClockForwarder::Run\n");
+
+    m_Time = tStart;
+
+    if (!m_hEvent || !m_hThread)
+    {
+        m_ForceStart = TRUE;
+        HRESULT hr = Pause();
+        m_ForceStart = FALSE;
+
+        if (FAILED(hr))
+            return hr;
+    }
+
+    assert(m_hThread);
+
+    SetClockState(KSSTATE_RUN);
+    SetEvent(m_hEvent);
+
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsClockForwarder::SetSyncSource(
+    IReferenceClock *pClock)
+{
+    OutputDebugString("CKsClockForwarder::SetSyncSource\n");
+
+    if (pClock)
+        pClock->AddRef();
+
+    if (m_Clock)
+        m_Clock->Release();
+
+
+    m_Clock = pClock;
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsClockForwarder::NotifyGraphChange()
+{
+    OutputDebugString("CKsClockForwarder::NotifyGraphChange\n");
+    DebugBreak();
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IKsObject interface
+//
+
+HANDLE
+STDMETHODCALLTYPE
+CKsClockForwarder::KsGetObjectHandle()
+{
+    return m_Handle;
+}
+
+//-------------------------------------------------------------------
+HRESULT
+STDMETHODCALLTYPE
+CKsClockForwarder::SetClockState(KSSTATE State)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+
+    Property.Set = KSPROPSETID_Clock;
+    Property.Id = KSPROPERTY_CLOCK_STATE;
+    Property.Flags = KSPROPERTY_TYPE_SET;
+
+    HRESULT hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), &State, sizeof(KSSTATE), &BytesReturned);
+    if (SUCCEEDED(hr))
+        m_State = State;
+
+    return hr;
+}
+
+DWORD
+WINAPI
+CKsClockForwarder_ThreadStartup(LPVOID lpParameter)
+{
+    REFERENCE_TIME Time;
+    ULONG BytesReturned;
+
+    CKsClockForwarder * Fwd = (CKsClockForwarder*)lpParameter;
+
+    Fwd->m_ThreadStarted = TRUE;
+
+    do
+    {
+        if (Fwd->m_PendingStop)
+            break;
+
+        if (Fwd->m_State != KSSTATE_RUN)
+            WaitForSingleObject(Fwd->m_hEvent, INFINITE);
+
+        KSPROPERTY Property;
+        Property.Set = KSPROPSETID_Clock;
+        Property.Id = KSPROPERTY_CLOCK_TIME;
+        Property.Flags = KSPROPERTY_TYPE_SET;
+
+        Fwd->m_Clock->GetTime(&Time);
+        Time -= Fwd->m_Time;
+
+        KsSynchronousDeviceControl(Fwd->m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), &Time, sizeof(REFERENCE_TIME), &BytesReturned);
+    }
+    while(TRUE);
+
+    Fwd->m_ThreadStarted = FALSE;
+    return NOERROR;
+}
+
+HRESULT
+WINAPI
+CKsClockForwarder_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    HRESULT hr;
+    HANDLE handle;
+
+    OutputDebugStringW(L"CKsClockForwarder_Constructor\n");
+
+    // open default clock
+    hr = KsOpenDefaultDevice(KSCATEGORY_CLOCK, GENERIC_READ | GENERIC_WRITE, &handle);
+
+    if (hr != NOERROR)
+    {
+         OutputDebugString("CKsClockForwarder_Constructor failed to open device\n");
+         return hr;
+    }
+
+    CKsClockForwarder * clock = new CKsClockForwarder(handle);
+
+    if (!clock)
+    {
+        // free clock handle
+        CloseHandle(handle);
+        return E_OUTOFMEMORY;
+    }
+
+    if (FAILED(clock->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete clock;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/ksproxy/cvpconfig.cpp b/reactos/dll/directx/ksproxy/cvpconfig.cpp
new file mode 100644 (file)
index 0000000..91d2006
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/cvpconfig.cpp
+ * PURPOSE:         IVPConfig interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CVPConfig : public IVPConfig,
+                  public IDistributorNotify
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IDistributorNotify interface
+    HRESULT STDMETHODCALLTYPE Stop();
+    HRESULT STDMETHODCALLTYPE Pause();
+    HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
+    HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock);
+    HRESULT STDMETHODCALLTYPE NotifyGraphChange();
+
+    // IVPBaseConfig
+    HRESULT STDMETHODCALLTYPE GetConnectInfo(LPDWORD pdwNumConnectInfo, IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo);
+    HRESULT STDMETHODCALLTYPE SetConnectInfo(DWORD dwChosenEntry);
+    HRESULT STDMETHODCALLTYPE GetVPDataInfo(LPAMVPDATAINFO pamvpDataInfo);
+    HRESULT STDMETHODCALLTYPE GetMaxPixelRate(LPAMVPSIZE pamvpSize, OUT LPDWORD pdwMaxPixelsPerSecond);
+    HRESULT STDMETHODCALLTYPE InformVPInputFormats(DWORD dwNumFormats, IN LPDDPIXELFORMAT pDDPixelFormats);
+    HRESULT STDMETHODCALLTYPE GetVideoFormats(LPDWORD pdwNumFormats, IN OUT LPDDPIXELFORMAT pddPixelFormats);
+    HRESULT STDMETHODCALLTYPE SetVideoFormat(DWORD dwChosenEntry);
+    HRESULT STDMETHODCALLTYPE SetInvertPolarity();
+    HRESULT STDMETHODCALLTYPE GetOverlaySurface(LPDIRECTDRAWSURFACE* ppddOverlaySurface);
+    HRESULT STDMETHODCALLTYPE SetDirectDrawKernelHandle(ULONG_PTR dwDDKernelHandle);
+    HRESULT STDMETHODCALLTYPE SetVideoPortID(IN DWORD dwVideoPortID);
+    HRESULT STDMETHODCALLTYPE SetDDSurfaceKernelHandles(DWORD cHandles, IN ULONG_PTR *rgDDKernelHandles);
+    HRESULT STDMETHODCALLTYPE SetSurfaceParameters(DWORD dwPitch, IN DWORD dwXOrigin, IN DWORD dwYOrigin);
+    // IVPConfig
+    HRESULT STDMETHODCALLTYPE IsVPDecimationAllowed(LPBOOL pbIsDecimationAllowed);
+    HRESULT STDMETHODCALLTYPE SetScalingFactors(LPAMVPSIZE pamvpSize);
+
+    CVPConfig() : m_Ref(0){}
+    virtual ~CVPConfig(){}
+
+protected:
+    LONG m_Ref;
+};
+
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IDistributorNotify))
+    {
+        *Output = (IDistributorNotify*)(this);
+        reinterpret_cast<IDistributorNotify*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IVPConfig))
+    {
+        *Output = (IVPConfig*)(this);
+        reinterpret_cast<IVPConfig*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDistributorNotify interface
+//
+
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::Stop()
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::Pause()
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::Run(
+    REFERENCE_TIME tStart)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::SetSyncSource(
+    IReferenceClock *pClock)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::NotifyGraphChange()
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IVPBaseConfig
+//
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::GetConnectInfo(
+    LPDWORD pdwNumConnectInfo, 
+    IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::SetConnectInfo(
+    DWORD dwChosenEntry)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::GetVPDataInfo(
+    LPAMVPDATAINFO pamvpDataInfo)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::GetMaxPixelRate(
+    LPAMVPSIZE pamvpSize,
+    OUT LPDWORD pdwMaxPixelsPerSecond)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::InformVPInputFormats(
+    DWORD dwNumFormats,
+    IN LPDDPIXELFORMAT pDDPixelFormats)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::GetVideoFormats(
+    LPDWORD pdwNumFormats, 
+    IN OUT LPDDPIXELFORMAT pddPixelFormats)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::SetVideoFormat(
+    DWORD dwChosenEntry)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::SetInvertPolarity()
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::GetOverlaySurface(
+    LPDIRECTDRAWSURFACE* ppddOverlaySurface)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::SetDirectDrawKernelHandle(
+    ULONG_PTR dwDDKernelHandle)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::SetVideoPortID(
+    IN DWORD dwVideoPortID)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::SetDDSurfaceKernelHandles(
+    DWORD cHandles,
+    IN ULONG_PTR *rgDDKernelHandles)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::SetSurfaceParameters(
+    DWORD dwPitch,
+    IN DWORD dwXOrigin,
+    IN DWORD dwYOrigin)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IVPConfig
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::IsVPDecimationAllowed(
+    LPBOOL pbIsDecimationAllowed)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPConfig::SetScalingFactors(
+    LPAMVPSIZE pamvpSize)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+
+
+
+HRESULT
+WINAPI
+CVPConfig_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    OutputDebugStringW(L"CVPConfig_Constructor\n");
+
+    CVPConfig * handler = new CVPConfig();
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
+
diff --git a/reactos/dll/directx/ksproxy/cvpvbiconfig.cpp b/reactos/dll/directx/ksproxy/cvpvbiconfig.cpp
new file mode 100644 (file)
index 0000000..016d060
--- /dev/null
@@ -0,0 +1,290 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/cvpvbiconfig.cpp
+ * PURPOSE:         CVPVBIConfig interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CVPVBIConfig : public IVPVBIConfig,
+                     public IDistributorNotify
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IDistributorNotify interface
+    HRESULT STDMETHODCALLTYPE Stop();
+    HRESULT STDMETHODCALLTYPE Pause();
+    HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
+    HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock);
+    HRESULT STDMETHODCALLTYPE NotifyGraphChange();
+
+    // IVPBaseConfig
+    HRESULT STDMETHODCALLTYPE GetConnectInfo(LPDWORD pdwNumConnectInfo, IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo);
+    HRESULT STDMETHODCALLTYPE SetConnectInfo(DWORD dwChosenEntry);
+    HRESULT STDMETHODCALLTYPE GetVPDataInfo(LPAMVPDATAINFO pamvpDataInfo);
+    HRESULT STDMETHODCALLTYPE GetMaxPixelRate(LPAMVPSIZE pamvpSize, OUT LPDWORD pdwMaxPixelsPerSecond);
+    HRESULT STDMETHODCALLTYPE InformVPInputFormats(DWORD dwNumFormats, IN LPDDPIXELFORMAT pDDPixelFormats);
+    HRESULT STDMETHODCALLTYPE GetVideoFormats(LPDWORD pdwNumFormats, IN OUT LPDDPIXELFORMAT pddPixelFormats);
+    HRESULT STDMETHODCALLTYPE SetVideoFormat(DWORD dwChosenEntry);
+    HRESULT STDMETHODCALLTYPE SetInvertPolarity();
+    HRESULT STDMETHODCALLTYPE GetOverlaySurface(LPDIRECTDRAWSURFACE* ppddOverlaySurface);
+    HRESULT STDMETHODCALLTYPE SetDirectDrawKernelHandle(ULONG_PTR dwDDKernelHandle);
+    HRESULT STDMETHODCALLTYPE SetVideoPortID(IN DWORD dwVideoPortID);
+    HRESULT STDMETHODCALLTYPE SetDDSurfaceKernelHandles(DWORD cHandles, IN ULONG_PTR *rgDDKernelHandles);
+    HRESULT STDMETHODCALLTYPE SetSurfaceParameters(DWORD dwPitch, IN DWORD dwXOrigin, IN DWORD dwYOrigin);
+
+    CVPVBIConfig() : m_Ref(0){}
+    virtual ~CVPVBIConfig(){}
+
+protected:
+    LONG m_Ref;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IDistributorNotify))
+    {
+        *Output = (IDistributorNotify*)(this);
+        reinterpret_cast<IDistributorNotify*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IVPVBIConfig))
+    {
+        *Output = (IVPConfig*)(this);
+        reinterpret_cast<IVPConfig*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDistributorNotify interface
+//
+
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::Stop()
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::Pause()
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::Run(
+    REFERENCE_TIME tStart)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::SetSyncSource(
+    IReferenceClock *pClock)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::NotifyGraphChange()
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IVPBaseConfig
+//
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::GetConnectInfo(
+    LPDWORD pdwNumConnectInfo, 
+    IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::SetConnectInfo(
+    DWORD dwChosenEntry)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::GetVPDataInfo(
+    LPAMVPDATAINFO pamvpDataInfo)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::GetMaxPixelRate(
+    LPAMVPSIZE pamvpSize,
+    OUT LPDWORD pdwMaxPixelsPerSecond)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::InformVPInputFormats(
+    DWORD dwNumFormats,
+    IN LPDDPIXELFORMAT pDDPixelFormats)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::GetVideoFormats(
+    LPDWORD pdwNumFormats, 
+    IN OUT LPDDPIXELFORMAT pddPixelFormats)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::SetVideoFormat(
+    DWORD dwChosenEntry)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::SetInvertPolarity()
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::GetOverlaySurface(
+    LPDIRECTDRAWSURFACE* ppddOverlaySurface)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::SetDirectDrawKernelHandle(
+    ULONG_PTR dwDDKernelHandle)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::SetVideoPortID(
+    IN DWORD dwVideoPortID)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::SetDDSurfaceKernelHandles(
+    DWORD cHandles,
+    IN ULONG_PTR *rgDDKernelHandles)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CVPVBIConfig::SetSurfaceParameters(
+    DWORD dwPitch,
+    IN DWORD dwXOrigin,
+    IN DWORD dwYOrigin)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+WINAPI
+CVPVBIConfig_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    OutputDebugStringW(L"CVPVBIConfig_Constructor\n");
+
+    CVPVBIConfig * handler = new CVPVBIConfig();
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/ksproxy/datatype.cpp b/reactos/dll/directx/ksproxy/datatype.cpp
new file mode 100644 (file)
index 0000000..5006b68
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/datatype.cpp
+ * PURPOSE:         IKsDataTypeHandler interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+/* FIXME guid mess */
+#ifndef _MSC_VER
+const GUID IID_IUnknown           = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+#endif
+const GUID IID_IClassFactory      = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+
+class CKsDataTypeHandler : public IKsDataTypeHandler
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    HRESULT STDMETHODCALLTYPE KsCompleteIoOperation(IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation, IN BOOL Cancelled);
+    HRESULT STDMETHODCALLTYPE KsIsMediaTypeInRanges(IN PVOID DataRanges);
+    HRESULT STDMETHODCALLTYPE KsPrepareIoOperation(IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation);
+    HRESULT STDMETHODCALLTYPE KsQueryExtendedSize(OUT ULONG* ExtendedSize);
+    HRESULT STDMETHODCALLTYPE KsSetMediaType(IN const AM_MEDIA_TYPE* AmMediaType);
+
+    CKsDataTypeHandler() : m_Ref(0), m_Type(0){};
+    virtual ~CKsDataTypeHandler()
+    {
+        if (m_Type)
+        {
+            if (m_Type->pbFormat)
+                CoTaskMemFree(m_Type->pbFormat);
+
+            if (m_Type->pUnk)
+                m_Type->pUnk->Release();
+
+            CoTaskMemFree(m_Type);
+        }
+
+    };
+
+protected:
+    LONG m_Ref;
+    AM_MEDIA_TYPE * m_Type;
+};
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsDataTypeHandler::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown) ||
+        IsEqualGUID(refiid, IID_IKsDataTypeHandler))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    return E_NOINTERFACE;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsDataTypeHandler::KsCompleteIoOperation(
+    IN OUT IMediaSample *Sample,
+    IN OUT PVOID StreamHeader,
+    IN KSIOOPERATION IoOperation,
+    IN BOOL Cancelled)
+{
+    return NOERROR;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsDataTypeHandler::KsIsMediaTypeInRanges(
+    IN PVOID DataRanges)
+{
+    PKSMULTIPLE_ITEM DataList;
+    PKSDATARANGE DataRange;
+    ULONG Index;
+    HRESULT hr = S_FALSE;
+
+    OutputDebugStringW(L"CKsDataTypeHandler::KsIsMediaTypeInRanges\n");
+
+    DataList = (PKSMULTIPLE_ITEM)DataRanges;
+    DataRange = (PKSDATARANGE)(DataList + 1);
+
+    for(Index = 0; Index < DataList->Count; Index++)
+    {
+        BOOL bMatch = FALSE;
+
+        if (DataRange->FormatSize >= sizeof(KSDATARANGE))
+        {
+            bMatch = IsEqualGUID(DataRange->MajorFormat, GUID_NULL);
+        }
+
+        if (!bMatch && DataRange->FormatSize >= sizeof(KSDATARANGE_AUDIO))
+        {
+            bMatch = IsEqualGUID(DataRange->MajorFormat, MEDIATYPE_Audio);
+        }
+
+        if (bMatch)
+        {
+            if (IsEqualGUID(DataRange->SubFormat, m_Type->subtype) ||
+                IsEqualGUID(DataRange->SubFormat, GUID_NULL))
+            {
+                if (IsEqualGUID(DataRange->Specifier, m_Type->formattype) ||
+                    IsEqualGUID(DataRange->Specifier, GUID_NULL))
+                {
+                    if (!IsEqualGUID(m_Type->formattype, FORMAT_WaveFormatEx) && !IsEqualGUID(DataRange->Specifier, FORMAT_WaveFormatEx))
+                    {
+                        //found match
+                        hr = S_OK;
+                        break;
+                    }
+
+                    if (DataRange->FormatSize >= sizeof(KSDATARANGE_AUDIO) && m_Type->cbFormat >= sizeof(WAVEFORMATEX))
+                    {
+                        LPWAVEFORMATEX Format = (LPWAVEFORMATEX)m_Type->pbFormat;
+                        PKSDATARANGE_AUDIO AudioRange = (PKSDATARANGE_AUDIO)DataRange;
+
+                        if (Format->nSamplesPerSec >= AudioRange->MinimumSampleFrequency &&
+                            Format->nSamplesPerSec <= AudioRange->MaximumSampleFrequency &&
+                            Format->wBitsPerSample >= AudioRange->MinimumSampleFrequency &&
+                            Format->wBitsPerSample <= AudioRange->MaximumBitsPerSample && 
+                            Format->nChannels <= AudioRange->MaximumChannels)
+                        {
+                            // found match
+                            hr = S_OK;
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        DataRange = (PKSDATARANGE)(((ULONG_PTR)DataRange + DataRange->FormatSize + 7) & ~7);
+    }
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsDataTypeHandler::KsPrepareIoOperation(
+    IN OUT IMediaSample *Sample,
+    IN OUT PVOID StreamHeader,
+    IN KSIOOPERATION IoOperation)
+{
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsDataTypeHandler::KsQueryExtendedSize(
+    OUT ULONG* ExtendedSize)
+{
+    /* no header extension required */
+    *ExtendedSize = 0;
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsDataTypeHandler::KsSetMediaType(
+    IN const AM_MEDIA_TYPE* AmMediaType)
+{
+    OutputDebugString("CKsDataTypeHandler::KsSetMediaType\n");
+
+    if (m_Type)
+    {
+        /* media type can only be set once */
+        return E_FAIL;
+    }
+
+    m_Type = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+    if (!m_Type)
+        return E_OUTOFMEMORY;
+
+    CopyMemory(m_Type, AmMediaType, sizeof(AM_MEDIA_TYPE));
+
+    if (m_Type->cbFormat)
+    {
+        m_Type->pbFormat = (BYTE*)CoTaskMemAlloc(m_Type->cbFormat);
+
+        if (!m_Type->pbFormat)
+        {
+            CoTaskMemFree(m_Type);
+            return E_OUTOFMEMORY;
+        }
+
+        CopyMemory(m_Type->pbFormat, AmMediaType->pbFormat, m_Type->cbFormat);
+    }
+
+    if (m_Type->pUnk)
+        m_Type->pUnk->AddRef();
+
+
+    return S_OK;
+}
+
+HRESULT
+WINAPI
+CKsDataTypeHandler_Constructor (
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    OutputDebugStringW(L"CKsDataTypeHandler_Constructor\n");
+    CKsDataTypeHandler * handler = new CKsDataTypeHandler();
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/ksproxy/enum_mediatypes.cpp b/reactos/dll/directx/ksproxy/enum_mediatypes.cpp
new file mode 100644 (file)
index 0000000..462ffda
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Network Provider for MPEG2 based networks
+ * FILE:            dll/directx/msdvbnp/enum_mediatypes.cpp
+ * PURPOSE:         IEnumMediaTypes interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumMediaTypes : public IEnumMediaTypes
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    HRESULT STDMETHODCALLTYPE Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched);
+    HRESULT STDMETHODCALLTYPE Skip(ULONG cMediaTypes);
+    HRESULT STDMETHODCALLTYPE Reset();
+    HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **ppEnum);
+
+
+    CEnumMediaTypes(ULONG MediaTypeCount, AM_MEDIA_TYPE * MediaTypes) : m_Ref(0), m_MediaTypeCount(MediaTypeCount), m_MediaTypes(MediaTypes), m_Index(0){};
+    virtual ~CEnumMediaTypes(){};
+
+protected:
+    LONG m_Ref;
+    ULONG m_MediaTypeCount;
+    AM_MEDIA_TYPE * m_MediaTypes;
+    ULONG m_Index;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IEnumMediaTypes))
+    {
+        *Output = (IEnumMediaTypes*)(this);
+        reinterpret_cast<IEnumMediaTypes*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IEnumMediaTypes
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Next(
+    ULONG cMediaTypes,
+    AM_MEDIA_TYPE **ppMediaTypes,
+    ULONG *pcFetched)
+{
+    ULONG i = 0;
+    AM_MEDIA_TYPE * MediaType;
+
+    if (!ppMediaTypes)
+        return E_POINTER;
+
+    if (cMediaTypes > 1 && !pcFetched)
+        return E_INVALIDARG;
+
+    while(i < cMediaTypes)
+    {
+        if (m_Index + i >= m_MediaTypeCount)
+            break;
+
+        MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+        if (!MediaType)
+            break;
+
+        if (m_MediaTypes[m_Index + i].cbFormat)
+        {
+            LPBYTE pFormat = (LPBYTE)CoTaskMemAlloc(m_MediaTypes[m_Index + i].cbFormat);
+            if (!pFormat)
+            {
+                CoTaskMemFree(MediaType);
+                break;
+            }
+
+            CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE));
+            MediaType->pbFormat = pFormat;
+            CopyMemory(MediaType->pbFormat, m_MediaTypes[m_Index + i].pbFormat, m_MediaTypes[m_Index + i].cbFormat);
+            MediaType->pUnk = (IUnknown *)this;
+            MediaType->pUnk->AddRef();
+        }
+        else
+        {
+            CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE));
+        }
+
+        if (MediaType->pUnk)
+        {
+            MediaType->pUnk->AddRef();
+        }
+
+        ppMediaTypes[i] = MediaType;
+        i++;
+    }
+
+    if (pcFetched)
+    {
+        *pcFetched = i;
+    }
+
+    m_Index += i;
+    if (i < cMediaTypes)
+        return S_FALSE;
+    else
+        return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Skip(
+    ULONG cMediaTypes)
+{
+    if (cMediaTypes + m_Index >= m_MediaTypeCount)
+    {
+        return S_FALSE;
+    }
+
+    m_Index += cMediaTypes;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Reset()
+{
+    m_Index = 0;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Clone(
+    IEnumMediaTypes **ppEnum)
+{
+    OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumMediaTypes_fnConstructor(
+    ULONG MediaTypeCount,
+    AM_MEDIA_TYPE * MediaTypes,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    CEnumMediaTypes * handler = new CEnumMediaTypes(MediaTypeCount, MediaTypes);
+
+#ifdef KSPROXY_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(riid, &lpstr);
+    swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (!handler)
+    {
+        CoTaskMemFree(MediaTypes);
+        return E_OUTOFMEMORY;
+    }
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
+
diff --git a/reactos/dll/directx/ksproxy/enumpins.cpp b/reactos/dll/directx/ksproxy/enumpins.cpp
new file mode 100644 (file)
index 0000000..5c0f0ec
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Network Provider for MPEG2 based networks
+ * FILE:            dll/directx/msdvbnp/enumpins.cpp
+ * PURPOSE:         IEnumPins interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumPins : public IEnumPins
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+
+    HRESULT STDMETHODCALLTYPE Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched);
+    HRESULT STDMETHODCALLTYPE Skip(ULONG cPins);
+    HRESULT STDMETHODCALLTYPE Reset();
+    HRESULT STDMETHODCALLTYPE Clone(IEnumPins **ppEnum);
+
+    CEnumPins(std::vector<IPin*> Pins) : m_Ref(0), m_Pins(Pins), m_Index(0){};
+    virtual ~CEnumPins(){};
+
+protected:
+    LONG m_Ref;
+    std::vector<IPin*> m_Pins;
+    ULONG m_Index;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IEnumPins))
+    {
+        *Output = (IEnumPins*)(this);
+        reinterpret_cast<IEnumPins*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Next(
+    ULONG cPins,
+    IPin **ppPins,
+    ULONG *pcFetched)
+{
+    ULONG i = 0;
+
+    if (!ppPins)
+        return E_POINTER;
+
+    if (cPins > 1 && !pcFetched)
+        return E_INVALIDARG;
+
+    while(i < cPins)
+    {
+        if (m_Index + i >= m_Pins.size())
+            break;
+
+        ppPins[i] = m_Pins[m_Index + i];
+        m_Pins[m_Index + i]->AddRef();
+
+        i++;
+    }
+
+    if (pcFetched)
+    {
+        *pcFetched = i;
+    }
+
+    m_Index += i;
+    if (i < cPins)
+        return S_FALSE;
+    else
+        return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Skip(
+    ULONG cPins)
+{
+    if (cPins + m_Index >= m_Pins.size())
+    {
+        return S_FALSE;
+    }
+
+    m_Index += cPins;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Reset()
+{
+    m_Index = 0;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Clone(
+    IEnumPins **ppEnum)
+{
+    OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumPins_fnConstructor(
+    std::vector<IPin*> Pins,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    CEnumPins * handler = new CEnumPins(Pins);
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
\ No newline at end of file
diff --git a/reactos/dll/directx/ksproxy/input_pin.cpp b/reactos/dll/directx/ksproxy/input_pin.cpp
new file mode 100644 (file)
index 0000000..783ff70
--- /dev/null
@@ -0,0 +1,1498 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/input_pin.cpp
+ * PURPOSE:         InputPin of Proxy Filter
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID IID_IKsPinPipe = {0xe539cd90, 0xa8b4, 0x11d1, {0x81, 0x89, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02}};
+const GUID IID_IKsPinEx   = {0x7bb38260L, 0xd19c, 0x11d2, {0xb3, 0x8a, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e}};
+
+
+#ifndef _MSC_VER
+
+const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+
+KSPIN_INTERFACE StandardPinInterface = 
+{
+    {STATIC_KSINTERFACESETID_Standard},
+    KSINTERFACE_STANDARD_STREAMING,
+    0
+};
+
+KSPIN_MEDIUM StandardPinMedium =
+{
+    {STATIC_KSMEDIUMSETID_Standard},
+    KSMEDIUM_TYPE_ANYINSTANCE,
+    0
+};
+
+#else
+
+KSPIN_INTERFACE StandardPinInterface = 
+{
+    STATIC_KSINTERFACESETID_Standard,
+    KSINTERFACE_STANDARD_STREAMING,
+    0
+};
+
+KSPIN_MEDIUM StandardPinMedium =
+{
+    STATIC_KSMEDIUMSETID_Standard,
+    KSMEDIUM_TYPE_ANYINSTANCE,
+    0
+};
+
+#endif
+
+class CInputPin : public IPin,
+                  public IKsPropertySet,
+                  public IKsControl,
+                  public IKsObject,
+                  public IKsPinEx,
+                  public IMemInputPin,
+                  public IKsPinPipe,
+                  public IKsPinFactory,
+                  public IStreamBuilder,
+                  public IKsAggregateControl,
+                  public IQualityControl,
+                  public ISpecifyPropertyPages
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    //IKsPinPipe
+    HRESULT STDMETHODCALLTYPE KsGetPinFramingCache(PKSALLOCATOR_FRAMING_EX *FramingEx, PFRAMING_PROP FramingProp, FRAMING_CACHE_OPS Option);
+    HRESULT STDMETHODCALLTYPE KsSetPinFramingCache(PKSALLOCATOR_FRAMING_EX FramingEx, PFRAMING_PROP FramingProp, FRAMING_CACHE_OPS Option);
+    IPin* STDMETHODCALLTYPE KsGetConnectedPin();
+    IKsAllocatorEx* STDMETHODCALLTYPE KsGetPipe(KSPEEKOPERATION Operation);
+    HRESULT STDMETHODCALLTYPE KsSetPipe(IKsAllocatorEx *KsAllocator);
+    ULONG STDMETHODCALLTYPE KsGetPipeAllocatorFlag();
+    HRESULT STDMETHODCALLTYPE KsSetPipeAllocatorFlag(ULONG Flag);
+    GUID STDMETHODCALLTYPE KsGetPinBusCache();
+    HRESULT STDMETHODCALLTYPE KsSetPinBusCache(GUID Bus);
+    PWCHAR STDMETHODCALLTYPE KsGetPinName();
+    PWCHAR STDMETHODCALLTYPE KsGetFilterName();
+
+    //IPin methods
+    HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE Disconnect();
+    HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pPin);
+    HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo);
+    HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir);
+    HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id);
+    HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum);
+    HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin);
+    HRESULT STDMETHODCALLTYPE EndOfStream();
+    HRESULT STDMETHODCALLTYPE BeginFlush();
+    HRESULT STDMETHODCALLTYPE EndFlush();
+    HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+    // ISpecifyPropertyPages
+    HRESULT STDMETHODCALLTYPE GetPages(CAUUID *pPages);
+
+    //IKsObject methods
+    HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
+
+    //IKsPropertySet
+    HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData);
+    HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData, DWORD *pcbReturned);
+    HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD *pTypeSupport);
+
+    //IKsControl
+    HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned);
+    HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned);
+    HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned);
+
+    //IKsPin
+    HRESULT STDMETHODCALLTYPE KsQueryMediums(PKSMULTIPLE_ITEM* MediumList);
+    HRESULT STDMETHODCALLTYPE KsQueryInterfaces(PKSMULTIPLE_ITEM* InterfaceList);
+    HRESULT STDMETHODCALLTYPE KsCreateSinkPinHandle(KSPIN_INTERFACE& Interface, KSPIN_MEDIUM& Medium);
+    HRESULT STDMETHODCALLTYPE KsGetCurrentCommunication(KSPIN_COMMUNICATION *Communication, KSPIN_INTERFACE *Interface, KSPIN_MEDIUM *Medium);
+    HRESULT STDMETHODCALLTYPE KsPropagateAcquire();
+    HRESULT STDMETHODCALLTYPE KsDeliver(IMediaSample* Sample, ULONG Flags);
+    HRESULT STDMETHODCALLTYPE KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment);
+    IMemAllocator * STDMETHODCALLTYPE KsPeekAllocator(KSPEEKOPERATION Operation);
+    HRESULT STDMETHODCALLTYPE KsReceiveAllocator(IMemAllocator *MemAllocator);
+    HRESULT STDMETHODCALLTYPE KsRenegotiateAllocator();
+    LONG STDMETHODCALLTYPE KsIncrementPendingIoCount();
+    LONG STDMETHODCALLTYPE KsDecrementPendingIoCount();
+    HRESULT STDMETHODCALLTYPE KsQualityNotify(ULONG Proportion, REFERENCE_TIME TimeDelta);
+    // IKsPinEx
+    VOID STDMETHODCALLTYPE KsNotifyError(IMediaSample* Sample, HRESULT hr);
+
+    //IMemInputPin
+    HRESULT STDMETHODCALLTYPE GetAllocator(IMemAllocator **ppAllocator);
+    HRESULT STDMETHODCALLTYPE NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly);
+    HRESULT STDMETHODCALLTYPE GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps);
+    HRESULT STDMETHODCALLTYPE Receive(IMediaSample *pSample);
+    HRESULT STDMETHODCALLTYPE ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed);
+    HRESULT STDMETHODCALLTYPE ReceiveCanBlock( void);
+
+    //IKsPinFactory
+    HRESULT STDMETHODCALLTYPE KsPinFactory(ULONG* PinFactory);
+
+    //IStreamBuilder
+    HRESULT STDMETHODCALLTYPE Render(IPin *ppinOut, IGraphBuilder *pGraph);
+    HRESULT STDMETHODCALLTYPE Backout(IPin *ppinOut, IGraphBuilder *pGraph);
+
+    //IKsAggregateControl
+    HRESULT STDMETHODCALLTYPE KsAddAggregate(IN REFGUID AggregateClass);
+    HRESULT STDMETHODCALLTYPE KsRemoveAggregate(REFGUID AggregateClass);
+
+    //IQualityControl
+    HRESULT STDMETHODCALLTYPE Notify(IBaseFilter *pSelf, Quality q);
+    HRESULT STDMETHODCALLTYPE SetSink(IQualityControl *piqc);
+
+    //---------------------------------------------------------------
+    HRESULT STDMETHODCALLTYPE CheckFormat(const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE CreatePin(const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE CreatePinHandle(PKSPIN_MEDIUM Medium, PKSPIN_INTERFACE Interface, const AM_MEDIA_TYPE *pmt);
+    CInputPin(IBaseFilter * ParentFilter, LPCWSTR PinName, HANDLE hFilter, ULONG PinId, KSPIN_COMMUNICATION Communication);
+    virtual ~CInputPin(){};
+
+protected:
+    LONG m_Ref;
+    IBaseFilter * m_ParentFilter;
+    LPCWSTR m_PinName;
+    HANDLE m_hFilter;
+    HANDLE m_hPin;
+    ULONG m_PinId;
+    IMemAllocator * m_MemAllocator;
+    LONG m_IoCount;
+    KSPIN_COMMUNICATION m_Communication;
+    KSPIN_INTERFACE m_Interface;
+    KSPIN_MEDIUM m_Medium;
+    AM_MEDIA_TYPE m_MediaFormat;
+    IPin * m_Pin;
+    BOOL m_ReadOnly;
+    IKsInterfaceHandler * m_InterfaceHandler;
+    IKsAllocatorEx * m_KsAllocatorEx;
+    ULONG m_PipeAllocatorFlag;
+    BOOL m_bPinBusCacheInitialized;
+    GUID m_PinBusCache;
+    LPWSTR m_FilterName;
+    FRAMING_PROP m_FramingProp[4];
+    PKSALLOCATOR_FRAMING_EX m_FramingEx[4];
+};
+
+CInputPin::CInputPin(
+    IBaseFilter * ParentFilter, 
+    LPCWSTR PinName,
+    HANDLE hFilter,
+    ULONG PinId,
+    KSPIN_COMMUNICATION Communication) : m_Ref(0),
+                                         m_ParentFilter(ParentFilter),
+                                         m_PinName(PinName),
+                                         m_hFilter(hFilter),
+                                         m_hPin(INVALID_HANDLE_VALUE),
+                                         m_PinId(PinId),
+                                         m_MemAllocator(0),
+                                         m_IoCount(0),
+                                         m_Communication(Communication),
+                                         m_Pin(0),
+                                         m_ReadOnly(0),
+                                         m_InterfaceHandler(0),
+                                         m_KsAllocatorEx(0),
+                                         m_PipeAllocatorFlag(0),
+                                         m_bPinBusCacheInitialized(0),
+                                         m_FilterName(0)
+{
+    ZeroMemory(m_FramingProp, sizeof(m_FramingProp));
+    ZeroMemory(m_FramingEx, sizeof(m_FramingEx));
+
+    ZeroMemory(&m_MediaFormat, sizeof(AM_MEDIA_TYPE));
+    HRESULT hr = KsGetMediaType(0, &m_MediaFormat, m_hFilter, m_PinId);
+    assert(hr == S_OK);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    WCHAR Buffer[100];
+
+    *Output = NULL;
+
+    if (IsEqualGUID(refiid, IID_IUnknown) ||
+        IsEqualGUID(refiid, IID_IPin))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IMemInputPin))
+    {
+        if (m_hPin == INVALID_HANDLE_VALUE)
+        {
+            HRESULT hr = CreatePin(&m_MediaFormat);
+            if (FAILED(hr))
+                return hr;
+        }
+
+        *Output = (IMemInputPin*)(this);
+        reinterpret_cast<IMemInputPin*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsObject))
+    {
+        *Output = (IKsObject*)(this);
+        reinterpret_cast<IKsObject*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsPropertySet))
+    {
+        if (m_hPin == INVALID_HANDLE_VALUE)
+        {
+            HRESULT hr = CreatePin(&m_MediaFormat);
+            if (FAILED(hr))
+                return hr;
+        }
+
+        *Output = (IKsPropertySet*)(this);
+        reinterpret_cast<IKsPropertySet*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsControl))
+    {
+        *Output = (IKsControl*)(this);
+        reinterpret_cast<IKsControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsPin) ||
+             IsEqualGUID(refiid, IID_IKsPinEx))
+    {
+        *Output = (IKsPinEx*)(this);
+        reinterpret_cast<IKsPinEx*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsPinPipe))
+    {
+        *Output = (IKsPinPipe*)(this);
+        reinterpret_cast<IKsPinPipe*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsPinFactory))
+    {
+        *Output = (IKsPinFactory*)(this);
+        reinterpret_cast<IKsPinFactory*>(*Output)->AddRef();
+        return NOERROR;
+    }
+#if 0
+    else if (IsEqualGUID(refiid, IID_IStreamBuilder))
+    {
+        *Output = (IStreamBuilder*)(this);
+        reinterpret_cast<IStreamBuilder*>(*Output)->AddRef();
+        return NOERROR;
+    }
+#endif
+    else if (IsEqualGUID(refiid, IID_IKsAggregateControl))
+    {
+        *Output = (IKsAggregateControl*)(this);
+        reinterpret_cast<IKsAggregateControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IQualityControl))
+    {
+        *Output = (IQualityControl*)(this);
+        reinterpret_cast<IQualityControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_ISpecifyPropertyPages))
+    {
+        *Output = (ISpecifyPropertyPages*)(this);
+        reinterpret_cast<ISpecifyPropertyPages*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CInputPin::QueryInterface: NoInterface for %s\n", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+    return E_NOINTERFACE;
+}
+//-------------------------------------------------------------------
+// IQualityControl interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Notify(
+    IBaseFilter *pSelf,
+    Quality q)
+{
+    OutputDebugStringW(L"CInputPin::Notify NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::SetSink(
+    IQualityControl *piqc)
+{
+    OutputDebugStringW(L"CInputPin::SetSink NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+
+//-------------------------------------------------------------------
+// IKsAggregateControl interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsAddAggregate(
+    IN REFGUID AggregateClass)
+{
+    OutputDebugStringW(L"CInputPin::KsAddAggregate NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsRemoveAggregate(
+    REFGUID AggregateClass)
+{
+    OutputDebugStringW(L"CInputPin::KsRemoveAggregate NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IStreamBuilder
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Render(
+    IPin *ppinOut,
+    IGraphBuilder *pGraph)
+{
+    OutputDebugStringW(L"CInputPin::Render\n");
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Backout(
+    IPin *ppinOut, 
+    IGraphBuilder *pGraph)
+{
+    OutputDebugStringW(L"CInputPin::Backout\n");
+    return S_OK;
+}
+
+//-------------------------------------------------------------------
+// IKsPinFactory
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsPinFactory(
+    ULONG* PinFactory)
+{
+    OutputDebugStringW(L"CInputPin::KsPinFactory\n");
+    *PinFactory = m_PinId;
+    return S_OK;
+}
+
+//-------------------------------------------------------------------
+// IKsPinPipe
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsGetPinFramingCache(
+    PKSALLOCATOR_FRAMING_EX *FramingEx,
+    PFRAMING_PROP FramingProp,
+    FRAMING_CACHE_OPS Option)
+{
+    if (Option > Framing_Cache_Write || Option < Framing_Cache_ReadLast)
+    {
+        // invalid argument
+        return E_INVALIDARG;
+    }
+
+    // get framing properties
+    *FramingProp = m_FramingProp[Option];
+    *FramingEx = m_FramingEx[Option];
+
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsSetPinFramingCache(
+    PKSALLOCATOR_FRAMING_EX FramingEx,
+    PFRAMING_PROP FramingProp,
+    FRAMING_CACHE_OPS Option)
+{
+    ULONG Index;
+    ULONG RefCount = 0;
+
+    if (m_FramingEx[Option])
+    {
+        for(Index = 1; Index < 4; Index++)
+        {
+            if (m_FramingEx[Index] == m_FramingEx[Option])
+                RefCount++;
+        }
+
+        if (RefCount == 1)
+        {
+            // existing framing is only used once
+            CoTaskMemFree(m_FramingEx[Option]);
+        }
+    }
+
+    // store framing
+    m_FramingEx[Option] = FramingEx;
+    m_FramingProp[Option] = *FramingProp;
+
+    return S_OK;
+}
+
+IPin*
+STDMETHODCALLTYPE
+CInputPin::KsGetConnectedPin()
+{
+    return m_Pin;
+}
+
+IKsAllocatorEx*
+STDMETHODCALLTYPE
+CInputPin::KsGetPipe(
+    KSPEEKOPERATION Operation)
+{
+    if (Operation == KsPeekOperation_AddRef)
+    {
+        if (m_KsAllocatorEx)
+            m_KsAllocatorEx->AddRef();
+    }
+    return m_KsAllocatorEx;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsSetPipe(
+    IKsAllocatorEx *KsAllocator)
+{
+    if (KsAllocator)
+        KsAllocator->AddRef();
+
+    if (m_KsAllocatorEx)
+        m_KsAllocatorEx->Release();
+
+    m_KsAllocatorEx = KsAllocator;
+    return NOERROR;
+}
+
+ULONG
+STDMETHODCALLTYPE
+CInputPin::KsGetPipeAllocatorFlag()
+{
+    return m_PipeAllocatorFlag;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsSetPipeAllocatorFlag(
+    ULONG Flag)
+{
+    m_PipeAllocatorFlag = Flag;
+    return NOERROR;
+}
+
+GUID
+STDMETHODCALLTYPE
+CInputPin::KsGetPinBusCache()
+{
+    if (!m_bPinBusCacheInitialized)
+    {
+        CopyMemory(&m_PinBusCache, &m_Medium.Set, sizeof(GUID));
+        m_bPinBusCacheInitialized = TRUE;
+    }
+
+    return m_PinBusCache;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsSetPinBusCache(
+    GUID Bus)
+{
+    CopyMemory(&m_PinBusCache, &Bus, sizeof(GUID));
+    return NOERROR;
+}
+
+PWCHAR
+STDMETHODCALLTYPE
+CInputPin::KsGetPinName()
+{
+    return (PWCHAR)m_PinName;
+}
+
+
+PWCHAR
+STDMETHODCALLTYPE
+CInputPin::KsGetFilterName()
+{
+    return m_FilterName;
+}
+
+//-------------------------------------------------------------------
+// ISpecifyPropertyPages
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::GetPages(CAUUID *pPages)
+{
+    if (!pPages)
+        return E_POINTER;
+
+    pPages->cElems = 0;
+    pPages->pElems = NULL;
+
+    return S_OK;
+}
+
+//-------------------------------------------------------------------
+// IMemInputPin
+//
+
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::GetAllocator(IMemAllocator **ppAllocator)
+{
+    OutputDebugStringW(L"CInputPin::GetAllocator\n");
+    return VFW_E_NO_ALLOCATOR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly)
+{
+    WCHAR Buffer[100];
+    HRESULT hr;
+    ALLOCATOR_PROPERTIES Properties;
+
+    hr = pAllocator->GetProperties(&Properties);
+    swprintf(Buffer, L"CInputPin::NotifyAllocator hr %lx bReadOnly, %u cbAlign %u cbBuffer %u cbPrefix %u cBuffers %u\n", hr, bReadOnly, Properties.cbAlign, Properties.cbBuffer, Properties.cbPrefix, Properties.cBuffers);
+    OutputDebugStringW(Buffer);
+
+    if (pAllocator)
+    {
+        pAllocator->AddRef();
+    }
+
+    if (m_MemAllocator)
+    {
+        m_MemAllocator->Release();
+    }
+
+    m_MemAllocator = pAllocator;
+    m_ReadOnly = bReadOnly;
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps)
+{
+    KSALLOCATOR_FRAMING Framing;
+    KSPROPERTY Property;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    Property.Set = KSPROPSETID_Connection;
+    Property.Id = KSPROPERTY_CONNECTION_ALLOCATORFRAMING;
+    Property.Flags = KSPROPERTY_TYPE_SET;
+
+    hr = KsProperty(&Property, sizeof(KSPROPERTY), (PVOID)&Framing, sizeof(KSALLOCATOR_FRAMING), &BytesReturned);
+    if (SUCCEEDED(hr))
+    {
+        pProps->cBuffers = Framing.Frames;
+        pProps->cbBuffer = Framing.FrameSize;
+        pProps->cbAlign = Framing.FileAlignment;
+        pProps->cbPrefix = 0;
+    }
+    else
+        hr = E_NOTIMPL;
+
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CInputPin::GetAllocatorRequirements hr %lx m_hPin %p cBuffers %u cbBuffer %u cbAlign %u cbPrefix %u\n", hr, m_hPin, pProps->cBuffers, pProps->cbBuffer, pProps->cbAlign, pProps->cbPrefix);
+    OutputDebugStringW(Buffer);
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Receive(IMediaSample *pSample)
+{
+    OutputDebugStringW(L"CInputPin::Receive NotImplemented\n");
+    DebugBreak();
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed)
+{
+    OutputDebugStringW(L"CInputPin::ReceiveMultiple NotImplemented\n");
+    DebugBreak();
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ReceiveCanBlock( void)
+{
+    OutputDebugStringW(L"CInputPin::ReceiveCanBlock NotImplemented\n");
+    DebugBreak();
+    return S_FALSE;
+}
+
+//-------------------------------------------------------------------
+// IKsPin
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsQueryMediums(
+    PKSMULTIPLE_ITEM* MediumList)
+{
+    return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsQueryInterfaces(
+    PKSMULTIPLE_ITEM* InterfaceList)
+{
+    return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsCreateSinkPinHandle(
+    KSPIN_INTERFACE& Interface,
+    KSPIN_MEDIUM& Medium)
+{
+    return CreatePin(&m_MediaFormat);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsGetCurrentCommunication(
+    KSPIN_COMMUNICATION *Communication,
+    KSPIN_INTERFACE *Interface,
+    KSPIN_MEDIUM *Medium)
+{
+    if (Communication)
+    {
+        *Communication = m_Communication;
+    }
+
+    if (Interface)
+    {
+        if (!m_hPin)
+            return VFW_E_NOT_CONNECTED;
+
+        CopyMemory(Interface, &m_Interface, sizeof(KSPIN_INTERFACE));
+    }
+
+    if (Medium)
+    {
+        if (!m_hPin)
+            return VFW_E_NOT_CONNECTED;
+
+        CopyMemory(Medium, &m_Medium, sizeof(KSPIN_MEDIUM));
+    }
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsPropagateAcquire()
+{
+    KSPROPERTY Property;
+    KSSTATE State;
+    ULONG BytesReturned;
+    HRESULT hr;
+
+    assert(m_hPin != INVALID_HANDLE_VALUE);
+
+    Property.Set = KSPROPSETID_Connection;
+    Property.Id = KSPROPERTY_CONNECTION_STATE;
+    Property.Flags = KSPROPERTY_TYPE_SET;
+
+    State = KSSTATE_ACQUIRE;
+
+    hr = KsProperty(&Property, sizeof(KSPROPERTY), (LPVOID)&State, sizeof(KSSTATE), &BytesReturned);
+
+    //TODO
+    //propagate to connected pin on the pipe
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsDeliver(
+    IMediaSample* Sample,
+    ULONG Flags)
+{
+    return E_FAIL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment)
+{
+    return NOERROR;
+}
+
+IMemAllocator * 
+STDMETHODCALLTYPE
+CInputPin::KsPeekAllocator(KSPEEKOPERATION Operation)
+{
+    if (Operation == KsPeekOperation_AddRef)
+    {
+        // add reference on allocator
+        m_MemAllocator->AddRef();
+    }
+
+    return m_MemAllocator;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsReceiveAllocator(IMemAllocator *MemAllocator)
+{
+
+    if (MemAllocator)
+    {
+        MemAllocator->AddRef();
+    }
+
+    if (m_MemAllocator)
+    {
+        m_MemAllocator->Release();
+    }
+
+    m_MemAllocator = MemAllocator;
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsRenegotiateAllocator()
+{
+    return E_FAIL;
+}
+
+LONG
+STDMETHODCALLTYPE
+CInputPin::KsIncrementPendingIoCount()
+{
+    return InterlockedIncrement((volatile LONG*)&m_IoCount);
+}
+
+LONG
+STDMETHODCALLTYPE
+CInputPin::KsDecrementPendingIoCount()
+{
+    return InterlockedDecrement((volatile LONG*)&m_IoCount);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsQualityNotify(
+    ULONG Proportion,
+    REFERENCE_TIME TimeDelta)
+{
+    OutputDebugStringW(L"CInputPin::KsQualityNotify NotImplemented\n");
+    DebugBreak();
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IKsPinEx
+//
+
+VOID
+STDMETHODCALLTYPE
+CInputPin::KsNotifyError(
+    IMediaSample* Sample,
+    HRESULT hr)
+{
+    OutputDebugStringW(L"CInputPin::KsNotifyError NotImplemented\n");
+}
+
+
+//-------------------------------------------------------------------
+// IKsControl
+//
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsProperty(
+    PKSPROPERTY Property,
+    ULONG PropertyLength,
+    LPVOID PropertyData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_hPin != INVALID_HANDLE_VALUE);
+    return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsMethod(
+    PKSMETHOD Method,
+    ULONG MethodLength,
+    LPVOID MethodData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_hPin != INVALID_HANDLE_VALUE);
+    return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::KsEvent(
+    PKSEVENT Event,
+    ULONG EventLength,
+    LPVOID EventData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_hPin != INVALID_HANDLE_VALUE);
+
+    if (EventLength)
+        return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned);
+    else
+        return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned);
+}
+
+
+//-------------------------------------------------------------------
+// IKsPropertySet
+//
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Set(
+    REFGUID guidPropSet,
+    DWORD dwPropID,
+    LPVOID pInstanceData,
+    DWORD cbInstanceData,
+    LPVOID pPropData,
+    DWORD cbPropData)
+{
+    ULONG BytesReturned;
+
+    if (cbInstanceData)
+    {
+        PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData);
+        if (!Property)
+            return E_OUTOFMEMORY;
+
+        Property->Set = guidPropSet;
+        Property->Id = dwPropID;
+        Property->Flags = KSPROPERTY_TYPE_SET;
+
+        CopyMemory((Property+1), pInstanceData, cbInstanceData);
+
+        HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned);
+        CoTaskMemFree(Property);
+        return hr;
+    }
+    else
+    {
+        KSPROPERTY Property;
+
+        Property.Set = guidPropSet;
+        Property.Id = dwPropID;
+        Property.Flags = KSPROPERTY_TYPE_SET;
+
+        HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned);
+        return hr;
+    }
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Get(
+    REFGUID guidPropSet,
+    DWORD dwPropID,
+    LPVOID pInstanceData,
+    DWORD cbInstanceData,
+    LPVOID pPropData,
+    DWORD cbPropData,
+    DWORD *pcbReturned)
+{
+    ULONG BytesReturned;
+
+    if (cbInstanceData)
+    {
+        PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData);
+        if (!Property)
+            return E_OUTOFMEMORY;
+
+        Property->Set = guidPropSet;
+        Property->Id = dwPropID;
+        Property->Flags = KSPROPERTY_TYPE_GET;
+
+        CopyMemory((Property+1), pInstanceData, cbInstanceData);
+
+        HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned);
+        CoTaskMemFree(Property);
+        return hr;
+    }
+    else
+    {
+        KSPROPERTY Property;
+
+        Property.Set = guidPropSet;
+        Property.Id = dwPropID;
+        Property.Flags = KSPROPERTY_TYPE_GET;
+
+        HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned);
+        return hr;
+    }
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QuerySupported(
+    REFGUID guidPropSet,
+    DWORD dwPropID,
+    DWORD *pTypeSupport)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+
+    Property.Set = guidPropSet;
+    Property.Id = dwPropID;
+    Property.Flags = KSPROPERTY_TYPE_SETSUPPORT;
+
+    return KsProperty(&Property, sizeof(KSPROPERTY), pTypeSupport, sizeof(DWORD), &BytesReturned);
+}
+
+
+//-------------------------------------------------------------------
+// IKsObject
+//
+HANDLE
+STDMETHODCALLTYPE
+CInputPin::KsGetObjectHandle()
+{
+    assert(m_hPin);
+    return m_hPin;
+}
+
+//-------------------------------------------------------------------
+// IPin interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
+{
+    OutputDebugStringW(L"CInputPin::Connect NotImplemented\n");
+    DebugBreak();
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt)
+{
+    HRESULT hr;
+
+    if (m_Pin)
+    {
+        // already connected
+        return VFW_E_ALREADY_CONNECTED;
+    }
+
+    // first check format
+    hr = CheckFormat(pmt);
+    if (FAILED(hr))
+    {
+        // format is not supported
+        return hr;
+    }
+
+    hr = CreatePin(pmt);
+    if (FAILED(hr))
+    {
+        return hr;
+    }
+
+    m_Pin = pConnector;
+    m_Pin->AddRef();
+
+    return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::Disconnect( void)
+{
+    if (!m_Pin)
+    {
+        // pin was not connected
+        return S_FALSE;
+    }
+
+    //FIXME
+    //check if filter is active
+
+    m_Pin->Release();
+    m_Pin = NULL;
+
+    OutputDebugStringW(L"CInputPin::Disconnect\n");
+    return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ConnectedTo(IPin **pPin)
+{
+    if (!pPin)
+        return E_POINTER;
+
+    if (m_Pin)
+    {
+        // increment reference count
+        m_Pin->AddRef();
+        *pPin = m_Pin;
+        return S_OK;
+    }
+
+    *pPin = NULL;
+    return VFW_E_NOT_CONNECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt)
+{
+    if (!m_Pin)
+        return VFW_E_NOT_CONNECTED;
+
+    OutputDebugStringW(L"CInputPin::ConnectionMediaType NotImplemented\n");
+    DebugBreak();
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryPinInfo(PIN_INFO *pInfo)
+{
+    wcscpy(pInfo->achName, m_PinName);
+    pInfo->dir = PINDIR_INPUT;
+    pInfo->pFilter = m_ParentFilter;
+    m_ParentFilter->AddRef();
+
+    return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryDirection(PIN_DIRECTION *pPinDir)
+{
+    if (pPinDir)
+    {
+        *pPinDir = PINDIR_INPUT;
+        return S_OK;
+    }
+
+    return E_POINTER;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryId(LPWSTR *Id)
+{
+    *Id = (LPWSTR)CoTaskMemAlloc((wcslen(m_PinName)+1)*sizeof(WCHAR));
+    if (!*Id)
+        return E_OUTOFMEMORY;
+
+    wcscpy(*Id, m_PinName);
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryAccept(
+    const AM_MEDIA_TYPE *pmt)
+{
+    return CheckFormat(pmt);
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
+{
+    HRESULT hr;
+    ULONG MediaTypeCount = 0, Index;
+    AM_MEDIA_TYPE * MediaTypes;
+
+    // query media type count
+    hr = KsGetMediaTypeCount(m_hFilter, m_PinId, &MediaTypeCount);
+    if (FAILED(hr) || !MediaTypeCount)
+        return hr;
+
+    // allocate media types
+    MediaTypes = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * MediaTypeCount);
+    if (!MediaTypes)
+    {
+        // not enough memory
+        return E_OUTOFMEMORY;
+    }
+
+    // zero media types
+    ZeroMemory(MediaTypes, sizeof(AM_MEDIA_TYPE) * MediaTypeCount);
+
+    for(Index = 0; Index < MediaTypeCount; Index++)
+    {
+        // get media type
+        hr = KsGetMediaType(Index, &MediaTypes[Index], m_hFilter, m_PinId);
+        if (FAILED(hr))
+        {
+            // failed
+            CoTaskMemFree(MediaTypes);
+            return hr;
+        }
+    }
+
+    return CEnumMediaTypes_fnConstructor(MediaTypeCount, MediaTypes, IID_IEnumMediaTypes, (void**)ppEnum);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin)
+{
+    OutputDebugStringW(L"CInputPin::QueryInternalConnections NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::EndOfStream( void)
+{
+    OutputDebugStringW(L"CInputPin::EndOfStream NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::BeginFlush( void)
+{
+    OutputDebugStringW(L"CInputPin::BeginFlush NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::EndFlush( void)
+{
+    OutputDebugStringW(L"CInputPin::EndFlush NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
+{
+    OutputDebugStringW(L"CInputPin::NewSegment NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+
+//-------------------------------------------------------------------
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::CheckFormat(
+    const AM_MEDIA_TYPE *pmt)
+{
+    PKSMULTIPLE_ITEM MultipleItem;
+    PKSDATAFORMAT DataFormat;
+    HRESULT hr;
+
+    if (!pmt)
+        return E_POINTER;
+
+    hr = KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem);
+    if (FAILED(hr))
+        return S_FALSE;
+
+    DataFormat = (PKSDATAFORMAT)(MultipleItem + 1);
+    for(ULONG Index = 0; Index < MultipleItem->Count; Index++)
+    {
+        if (IsEqualGUID(pmt->majortype, DataFormat->MajorFormat) &&
+            IsEqualGUID(pmt->subtype, DataFormat->SubFormat) &&
+            IsEqualGUID(pmt->formattype, DataFormat->Specifier))
+        {
+            // format is supported
+            CoTaskMemFree(MultipleItem);
+            OutputDebugStringW(L"CInputPin::CheckFormat format OK\n");
+            return S_OK;
+        }
+        DataFormat = (PKSDATAFORMAT)((ULONG_PTR)DataFormat + DataFormat->FormatSize);
+    }
+    //format is not supported
+    CoTaskMemFree(MultipleItem);
+    return S_FALSE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::CreatePin(
+    const AM_MEDIA_TYPE *pmt)
+{
+    PKSMULTIPLE_ITEM MediumList;
+    PKSMULTIPLE_ITEM InterfaceList;
+    PKSPIN_MEDIUM Medium;
+    PKSPIN_INTERFACE Interface;
+    IKsInterfaceHandler * InterfaceHandler;
+    HRESULT hr;
+
+    // query for pin medium
+    hr = KsQueryMediums(&MediumList);
+    if (FAILED(hr))
+        return hr;
+
+    // query for pin interface
+    hr = KsQueryInterfaces(&InterfaceList);
+    if (FAILED(hr))
+    {
+        // failed
+        CoTaskMemFree(MediumList);
+        return hr;
+    }
+
+    if (MediumList->Count)
+    {
+        //use first available medium
+        Medium = (PKSPIN_MEDIUM)(MediumList + 1);
+    }
+    else
+    {
+        // default to standard medium
+        Medium = &StandardPinMedium;
+    }
+
+    if (InterfaceList->Count)
+    {
+        //use first available interface
+        Interface = (PKSPIN_INTERFACE)(InterfaceList + 1);
+    }
+    else
+    {
+        // default to standard interface
+        Interface = &StandardPinInterface;
+    }
+
+    if (m_Communication != KSPIN_COMMUNICATION_BRIDGE && m_Communication != KSPIN_COMMUNICATION_NONE)
+    {
+        if (!m_InterfaceHandler)
+        {
+            // now load the IKsInterfaceHandler plugin
+            hr = CoCreateInstance(Interface->Set, NULL, CLSCTX_INPROC_SERVER, IID_IKsInterfaceHandler, (void**)&InterfaceHandler);
+            if (FAILED(hr))
+            {
+                // failed to load interface handler plugin
+                OutputDebugStringW(L"CInputPin::CreatePin failed to load InterfaceHandlerPlugin\n");
+                CoTaskMemFree(MediumList);
+                CoTaskMemFree(InterfaceList);
+
+                return hr;
+            }
+
+            // now set the pin
+            hr = InterfaceHandler->KsSetPin((IKsPin*)this);
+            if (FAILED(hr))
+            {
+                // failed to load interface handler plugin
+                OutputDebugStringW(L"CInputPin::CreatePin failed to initialize InterfaceHandlerPlugin\n");
+                InterfaceHandler->Release();
+                CoTaskMemFree(MediumList);
+                CoTaskMemFree(InterfaceList);
+                return hr;
+            }
+
+            // store interface handler
+            m_InterfaceHandler = InterfaceHandler;
+        }
+
+        // now create pin
+        hr = CreatePinHandle(Medium, Interface, pmt);
+        if (FAILED(hr))
+        {
+            m_InterfaceHandler->Release();
+            m_InterfaceHandler = InterfaceHandler;
+        }
+    }
+    else
+    {
+        WCHAR Buffer[100];
+        swprintf(Buffer, L"CInputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName);
+        OutputDebugStringW(Buffer);
+        DebugBreak();
+        hr = E_FAIL;
+    }
+
+    // free medium / interface / dataformat
+    CoTaskMemFree(MediumList);
+    CoTaskMemFree(InterfaceList);
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CInputPin::CreatePinHandle(
+    PKSPIN_MEDIUM Medium,
+    PKSPIN_INTERFACE Interface,
+    const AM_MEDIA_TYPE *pmt)
+{
+    PKSPIN_CONNECT PinConnect;
+    PKSDATAFORMAT DataFormat;
+    ULONG Length;
+    HRESULT hr;
+
+    if (m_hPin != INVALID_HANDLE_VALUE)
+    {
+        // pin already exists
+        //CloseHandle(m_hPin);
+        //m_hPin = INVALID_HANDLE_VALUE;
+        return S_OK;
+    }
+
+
+    // calc format size
+    Length = sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT) + pmt->cbFormat;
+
+    // allocate pin connect
+    PinConnect = (PKSPIN_CONNECT)CoTaskMemAlloc(Length);
+    if (!PinConnect)
+    {
+        // failed
+        return E_OUTOFMEMORY;
+    }
+
+    // setup request
+    CopyMemory(&PinConnect->Interface, Interface, sizeof(KSPIN_INTERFACE));
+    CopyMemory(&PinConnect->Medium, Medium, sizeof(KSPIN_MEDIUM));
+    PinConnect->PinId = m_PinId;
+    PinConnect->PinToHandle = NULL;
+    PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL;
+    PinConnect->Priority.PrioritySubClass = KSPRIORITY_NORMAL;
+
+    // get dataformat offset
+    DataFormat = (PKSDATAFORMAT)(PinConnect + 1);
+
+    // copy data format
+    DataFormat->FormatSize = sizeof(KSDATAFORMAT) + pmt->cbFormat;
+    DataFormat->Flags = 0;
+    DataFormat->SampleSize = pmt->lSampleSize;
+    DataFormat->Reserved = 0;
+    CopyMemory(&DataFormat->MajorFormat, &pmt->majortype, sizeof(GUID));
+    CopyMemory(&DataFormat->SubFormat,  &pmt->subtype, sizeof(GUID));
+    CopyMemory(&DataFormat->Specifier, &pmt->formattype, sizeof(GUID));
+
+    if (pmt->cbFormat)
+    {
+        // copy extended format
+        CopyMemory((DataFormat + 1), pmt->pbFormat, pmt->cbFormat);
+    }
+
+    // create pin
+    hr = KsCreatePin(m_hFilter, PinConnect, GENERIC_WRITE, &m_hPin);
+
+    if (SUCCEEDED(hr))
+    {
+        // store current interface / medium
+        CopyMemory(&m_Medium, Medium, sizeof(KSPIN_MEDIUM));
+        CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE));
+        CopyMemory(&m_MediaFormat, pmt, sizeof(AM_MEDIA_TYPE));
+
+        LPOLESTR pMajor, pSub, pFormat;
+        StringFromIID(m_MediaFormat.majortype, &pMajor);
+        StringFromIID(m_MediaFormat.subtype , &pSub);
+        StringFromIID(m_MediaFormat.formattype, &pFormat);
+        WCHAR Buffer[200];
+        swprintf(Buffer, L"CInputPin::CreatePinHandle Major %s SubType %s Format %s pbFormat %p cbFormat %u\n", pMajor, pSub, pFormat, pmt->pbFormat, pmt->cbFormat);
+        CoTaskMemFree(pMajor);
+        CoTaskMemFree(pSub);
+        CoTaskMemFree(pFormat);
+        OutputDebugStringW(Buffer);
+
+        if (pmt->cbFormat)
+        {
+            m_MediaFormat.pbFormat = (BYTE*)CoTaskMemAlloc(pmt->cbFormat);
+            if (!m_MediaFormat.pbFormat)
+            {
+                CoTaskMemFree(PinConnect);
+                m_MediaFormat.pbFormat = NULL;
+                m_MediaFormat.cbFormat = 0;
+                return E_OUTOFMEMORY;
+            }
+            CopyMemory(m_MediaFormat.pbFormat, pmt->pbFormat, pmt->cbFormat);
+        }
+
+        //TODO
+        // connect pin pipes
+
+    }
+
+    // free pin connect
+     CoTaskMemFree(PinConnect);
+
+    return hr;
+}
+
+HRESULT
+WINAPI
+CInputPin_Constructor(
+    IBaseFilter * ParentFilter,
+    LPCWSTR PinName,
+    HANDLE hFilter,
+    ULONG PinId,
+    KSPIN_COMMUNICATION Communication,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    CInputPin * handler = new CInputPin(ParentFilter, PinName, hFilter, PinId, Communication);
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return S_OK;
+}
diff --git a/reactos/dll/directx/ksproxy/interface.cpp b/reactos/dll/directx/ksproxy/interface.cpp
new file mode 100644 (file)
index 0000000..3d1af0d
--- /dev/null
@@ -0,0 +1,497 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/interface.cpp
+ * PURPOSE:         IKsInterfaceHandler interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID IID_IKsObject           = {0x423c13a2, 0x2070, 0x11d0, {0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}};
+
+class CKsInterfaceHandler : public IKsInterfaceHandler
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+    HRESULT STDMETHODCALLTYPE KsSetPin(IKsPin *KsPin);
+    HRESULT STDMETHODCALLTYPE KsProcessMediaSamples(IKsDataTypeHandler *KsDataTypeHandler, IMediaSample** SampleList, PLONG SampleCount, KSIOOPERATION IoOperation, PKSSTREAM_SEGMENT *StreamSegment);
+    HRESULT STDMETHODCALLTYPE KsCompleteIo(PKSSTREAM_SEGMENT StreamSegment);
+
+    CKsInterfaceHandler() : m_Ref(0), m_Handle(NULL), m_Pin(0) {m_PinName[0] = L'\0';};
+    virtual ~CKsInterfaceHandler(){};
+
+protected:
+    LONG m_Ref;
+    HANDLE m_Handle;
+    IKsPinEx * m_Pin;
+    WCHAR m_PinName[129];
+};
+
+typedef struct
+{
+    KSSTREAM_SEGMENT StreamSegment;
+    OVERLAPPED Overlapped;
+    IMediaSample * MediaSample[64];
+
+    ULONG SampleCount;
+    ULONG ExtendedSize;
+    PKSSTREAM_HEADER StreamHeader;
+}KSSTREAM_SEGMENT_EXT, *PKSSTREAM_SEGMENT_EXT;
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsInterfaceHandler::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown) ||
+        IsEqualGUID(refiid, IID_IKsInterfaceHandler))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsInterfaceHandler::KsSetPin(
+    IKsPin *KsPin)
+{
+    HRESULT hr;
+    IKsObject * KsObject;
+    IKsPinEx * Pin;
+
+    // get IKsPinEx interface
+    hr = KsPin->QueryInterface(IID_IKsPinEx, (void**)&Pin);
+    if (SUCCEEDED(hr))
+    {
+        // check if IKsObject is supported
+        hr = KsPin->QueryInterface(IID_IKsObject, (void**)&KsObject);
+
+        if (SUCCEEDED(hr))
+        {
+            // get pin handle
+            m_Handle = KsObject->KsGetObjectHandle();
+
+            // release IKsObject interface
+            KsObject->Release();
+
+            if (!m_Handle)
+            {
+                // expected a file handle
+                hr = E_UNEXPECTED;
+                Pin->Release();
+            }
+            else
+            {
+                if (m_Pin)
+                {
+                    // release old interface
+                    m_Pin->Release();
+                }
+                m_Pin = Pin;
+            }
+        }
+        else
+        {
+            //release IKsPinEx interface
+            Pin->Release();
+        }
+    }
+#if 1
+    //DBG code
+    PIN_INFO PinInfo;
+    IPin * pPin;
+    if (SUCCEEDED(KsPin->QueryInterface(IID_IPin, (void**)&pPin)))
+    {
+        if (SUCCEEDED(pPin->QueryPinInfo(&PinInfo)))
+        {
+            if (PinInfo.pFilter)
+                PinInfo.pFilter->Release();
+
+            wcscpy(m_PinName, PinInfo.achName);
+        }
+        pPin->Release();
+    }
+#endif
+
+    // done
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsInterfaceHandler::KsProcessMediaSamples(
+     IKsDataTypeHandler *KsDataTypeHandler,
+     IMediaSample** SampleList,
+     PLONG SampleCount,
+     KSIOOPERATION IoOperation,
+     PKSSTREAM_SEGMENT *OutStreamSegment)
+{
+    PKSSTREAM_SEGMENT_EXT StreamSegment;
+    ULONG ExtendedSize, Index, BytesReturned;
+    HRESULT hr = S_OK;
+
+    // sanity check
+    assert(*SampleCount);
+
+    if (*SampleCount == 0 || *SampleCount < 0)
+        return E_FAIL;
+
+    // zero stream segment
+    *OutStreamSegment = NULL;
+
+    // allocate stream segment
+    StreamSegment = (PKSSTREAM_SEGMENT_EXT)CoTaskMemAlloc(sizeof(KSSTREAM_SEGMENT_EXT));
+    if (!StreamSegment)
+        return E_OUTOFMEMORY;
+
+    // zero stream segment
+    ZeroMemory(StreamSegment, sizeof(KSSTREAM_SEGMENT_EXT));
+
+    //allocate event
+    StreamSegment->StreamSegment.CompletionEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+    if (!StreamSegment->StreamSegment.CompletionEvent)
+    {
+        // failed to create event
+        CoTaskMemFree(StreamSegment);
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    // increase our own reference count
+    AddRef();
+
+    // setup stream segment
+    StreamSegment->StreamSegment.KsDataTypeHandler = KsDataTypeHandler;
+    StreamSegment->StreamSegment.KsInterfaceHandler = (IKsInterfaceHandler*)this;
+    StreamSegment->StreamSegment.IoOperation = IoOperation;
+    StreamSegment->Overlapped.hEvent = StreamSegment->StreamSegment.CompletionEvent;
+
+
+    // ge extension size
+    ExtendedSize = 0;
+    if (KsDataTypeHandler)
+    {
+        // query extension size
+        KsDataTypeHandler->KsQueryExtendedSize(&ExtendedSize);
+
+        if (ExtendedSize)
+        {
+            // increment reference count
+            KsDataTypeHandler->AddRef();
+        }
+        else
+        {
+            // no need for the datatype handler
+            StreamSegment->StreamSegment.KsDataTypeHandler = NULL;
+        }
+    }
+
+    StreamSegment->ExtendedSize = ExtendedSize;
+    StreamSegment->SampleCount = (ULONG)*SampleCount;
+
+    // calculate stream header size count
+    ULONG StreamHeaderSize = StreamSegment->SampleCount * (sizeof(KSSTREAM_HEADER) + ExtendedSize);
+
+    // allocate stream header
+    StreamSegment->StreamHeader = (PKSSTREAM_HEADER)CoTaskMemAlloc(StreamHeaderSize);
+    if (!StreamSegment->StreamHeader)
+    {
+        // not enough memory
+        CloseHandle(StreamSegment->StreamSegment.CompletionEvent);
+
+        if (StreamSegment->StreamSegment.KsDataTypeHandler)
+            StreamSegment->StreamSegment.KsDataTypeHandler->Release();
+
+        // free stream segment
+        CoTaskMemFree(StreamSegment);
+
+        //release our reference count
+        Release();
+        return E_OUTOFMEMORY;
+    }
+
+    // zero stream headers
+    ZeroMemory(StreamSegment->StreamHeader, StreamHeaderSize);
+
+    PKSSTREAM_HEADER CurStreamHeader = StreamSegment->StreamHeader;
+
+    // initialize all stream headers
+    for(Index = 0; Index < StreamSegment->SampleCount; Index++)
+    {
+         if (ExtendedSize)
+         {
+             // initialize extended size
+             hr = KsDataTypeHandler->KsPrepareIoOperation(SampleList[Index], (CurStreamHeader + 1), IoOperation);
+             // sanity check
+             assert(hr == NOERROR);
+         }
+
+         // query for IMediaSample2 interface
+         IMediaSample2 * MediaSample;
+         AM_SAMPLE2_PROPERTIES Properties;
+         ZeroMemory(&Properties, sizeof(AM_SAMPLE2_PROPERTIES));
+
+         hr = SampleList[Index]->QueryInterface(IID_IMediaSample2, (void**)&MediaSample);
+         if (SUCCEEDED(hr))
+         {
+             //get properties
+
+             hr = MediaSample->GetProperties(sizeof(AM_SAMPLE2_PROPERTIES), (BYTE*)&Properties);
+
+             //release IMediaSample2 interface
+             MediaSample->Release();
+         }
+         else
+         {
+             // get properties
+             hr = SampleList[Index]->GetPointer((BYTE**)&Properties.pbBuffer);
+             assert(hr == NOERROR);
+             hr = SampleList[Index]->GetTime(&Properties.tStart, &Properties.tStop);
+
+             Properties.cbBuffer = SampleList[Index]->GetSize();
+             assert(Properties.cbBuffer);
+
+             Properties.dwSampleFlags = 0;
+
+             if (SampleList[Index]->IsDiscontinuity() == S_OK)
+                 Properties.dwSampleFlags |= AM_SAMPLE_DATADISCONTINUITY;
+
+             if (SampleList[Index]->IsPreroll() == S_OK)
+                 Properties.dwSampleFlags |= AM_SAMPLE_PREROLL;
+
+             if (SampleList[Index]->IsSyncPoint() == S_OK)
+                 Properties.dwSampleFlags |= AM_SAMPLE_SPLICEPOINT;
+         }
+
+         WCHAR Buffer[200];
+         swprintf(Buffer, L"CKsInterfaceHandler::KsProcessMediaSamples PinName %s BufferLength %lu Property Buffer %p ExtendedSize %u lActual %u dwSampleFlags %lx\n", m_PinName, Properties.cbBuffer, Properties.pbBuffer, ExtendedSize, Properties.lActual, Properties.dwSampleFlags);
+         //OutputDebugStringW(Buffer);
+
+         CurStreamHeader->Size = sizeof(KSSTREAM_HEADER) + ExtendedSize;
+         CurStreamHeader->PresentationTime.Denominator = 1;
+         CurStreamHeader->PresentationTime.Numerator = 1;
+         CurStreamHeader->FrameExtent = Properties.cbBuffer;
+         CurStreamHeader->Data = Properties.pbBuffer;
+
+         if (IoOperation == KsIoOperation_Write)
+         {
+             // set flags
+             CurStreamHeader->OptionsFlags = Properties.dwSampleFlags;
+             CurStreamHeader->DataUsed = Properties.lActual;
+             // increment reference count
+             SampleList[Index]->AddRef();
+         }
+
+         // store sample in stream segment
+         StreamSegment->MediaSample[Index] = SampleList[Index];
+
+         // move to next header
+         CurStreamHeader = (PKSSTREAM_HEADER)((ULONG_PTR)CurStreamHeader + CurStreamHeader->Size);
+    }
+
+    // submit to device
+    m_Pin->KsIncrementPendingIoCount();
+
+    if (DeviceIoControl(m_Handle,
+                        IoOperation == KsIoOperation_Write ? IOCTL_KS_WRITE_STREAM : IOCTL_KS_READ_STREAM,
+                        NULL, 0,
+                        StreamSegment->StreamHeader,
+                        StreamHeaderSize,
+                        &BytesReturned,
+                        &StreamSegment->Overlapped))
+    {
+        // signal completion
+        SetEvent(StreamSegment->StreamSegment.CompletionEvent);
+        hr = S_OK;
+        *OutStreamSegment = (PKSSTREAM_SEGMENT)StreamSegment;
+    }
+    else
+    {
+        if (GetLastError() == ERROR_IO_PENDING)
+        {
+            *OutStreamSegment = (PKSSTREAM_SEGMENT)StreamSegment;
+            hr = S_OK;
+        }
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsInterfaceHandler::KsCompleteIo(
+    PKSSTREAM_SEGMENT InStreamSegment)
+{
+    PKSSTREAM_SEGMENT_EXT StreamSegment;
+    PKSSTREAM_HEADER CurStreamHeader;
+    DWORD dwError = ERROR_SUCCESS, BytesReturned;
+    BOOL bOverlapped;
+    ULONG Index;
+    HRESULT hr;
+    IMediaSample2 * MediaSample;
+    AM_SAMPLE2_PROPERTIES Properties;
+    REFERENCE_TIME Start, Stop;
+
+    // get private stream segment
+    StreamSegment = (PKSSTREAM_SEGMENT_EXT)InStreamSegment;
+
+    // get result
+    bOverlapped = GetOverlappedResult(m_Handle, &StreamSegment->Overlapped, &BytesReturned, FALSE);
+    dwError = GetLastError();
+
+    CurStreamHeader = StreamSegment->StreamHeader;
+
+    //iterate through all stream headers
+    for(Index = 0; Index < StreamSegment->SampleCount; Index++)
+    {
+        if (!bOverlapped)
+        {
+            // operation failed
+            m_Pin->KsNotifyError(StreamSegment->MediaSample[Index], MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, dwError));
+        }
+
+        // query IMediaSample2 interface
+        hr = StreamSegment->MediaSample[Index]->QueryInterface(IID_IMediaSample2, (void**)&MediaSample);
+        if (SUCCEEDED(hr))
+        {
+            // media sample properties
+            hr = MediaSample->GetProperties(sizeof(AM_SAMPLE2_PROPERTIES), (BYTE*)&Properties);
+            if (SUCCEEDED(hr))
+            {
+                //update media sample properties
+                Properties.dwTypeSpecificFlags = CurStreamHeader->TypeSpecificFlags;
+                Properties.dwSampleFlags |= (CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY);
+
+                MediaSample->SetProperties(sizeof(AM_SAMPLE2_PROPERTIES), (BYTE*)&Properties);
+            }
+            // release IMediaSample2 interface
+            MediaSample->Release();
+        }
+
+        // was an extended header used
+        if (StreamSegment->ExtendedSize)
+        {
+            // unprepare stream header extension
+            StreamSegment->StreamSegment.KsDataTypeHandler->KsCompleteIoOperation(StreamSegment->MediaSample[Index], (CurStreamHeader + 1), StreamSegment->StreamSegment.IoOperation, bOverlapped == FALSE);
+        }
+
+        Start = 0;
+        Stop = 0;
+        if (bOverlapped && StreamSegment->StreamSegment.IoOperation == KsIoOperation_Read)
+        {
+            // update common media sample details
+            StreamSegment->MediaSample[Index]->SetSyncPoint((CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT));
+            StreamSegment->MediaSample[Index]->SetPreroll((CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_PREROLL));
+            StreamSegment->MediaSample[Index]->SetDiscontinuity((CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY));
+
+            if (CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TIMEVALID)
+            {
+                // use valid timestamp
+                Start = CurStreamHeader->PresentationTime.Time;
+
+                if (CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_DURATIONVALID)
+                {
+                    Stop = CurStreamHeader->PresentationTime.Time + CurStreamHeader->Duration;
+                }
+            }
+        }
+
+        // now set time
+        hr = StreamSegment->MediaSample[Index]->SetTime(&Start, &Stop);
+        if (FAILED(hr))
+        {
+            // use start time
+            StreamSegment->MediaSample[Index]->SetTime(&Start, &Start);
+        }
+
+        // set valid data length
+        StreamSegment->MediaSample[Index]->SetActualDataLength(CurStreamHeader->DataUsed);
+
+        if (StreamSegment->StreamSegment.IoOperation == KsIoOperation_Read)
+        {
+            if (bOverlapped)
+            {
+                // deliver sample
+                m_Pin->KsDeliver(StreamSegment->MediaSample[Index], CurStreamHeader->OptionsFlags);
+            }
+        }
+        else if (StreamSegment->StreamSegment.IoOperation == KsIoOperation_Write)
+        {
+            // release media sample reference
+            StreamSegment->MediaSample[Index]->Release();
+        }
+
+        CurStreamHeader = (PKSSTREAM_HEADER)((ULONG_PTR)CurStreamHeader + CurStreamHeader->Size);
+    }
+
+    // delete stream headers
+    CoTaskMemFree(StreamSegment->StreamHeader);
+
+    if (StreamSegment->StreamSegment.KsDataTypeHandler)
+    {
+        // release reference
+        StreamSegment->StreamSegment.KsDataTypeHandler->Release();
+    }
+
+    // decrement pending i/o count
+    m_Pin->KsDecrementPendingIoCount();
+
+    //notify of completion
+    m_Pin->KsMediaSamplesCompleted(InStreamSegment);
+
+    //destroy stream segment
+    CoTaskMemFree(StreamSegment);
+
+    //release reference to ourselves
+    Release();
+
+    // done
+    // Event handle is closed by caller
+    return S_OK;
+}
+
+HRESULT
+WINAPI
+CKsInterfaceHandler_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    OutputDebugStringW(L"CKsInterfaceHandler_Constructor\n");
+
+    CKsInterfaceHandler * handler = new CKsInterfaceHandler();
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/ksproxy/ksproxy.c b/reactos/dll/directx/ksproxy/ksproxy.c
deleted file mode 100644 (file)
index bb89957..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * KSPROXY.AX - ReactOS WDM Streaming ActiveMovie Proxy
- *
- * Copyright 2008 Dmitry Chapyshev
- *
- * 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 <windows.h>
-#include <stdio.h>
-#include <wchar.h>
-#include <tchar.h>
-#include <ks.h>
-#include <dshow.h>
-
-HRESULT WINAPI
-KsSynchronousDeviceControl(
-    HANDLE     Handle,
-    ULONG      IoControl,
-    PVOID      InBuffer,
-    ULONG      InLength,
-    PVOID      OutBuffer,
-    ULONG      OutLength,
-    PULONG     BytesReturned)
-{
-    return NOERROR;
-}
-
-HRESULT WINAPI
-KsResolveRequiredAttributes(
-    PKSDATARANGE     DataRange,
-    KSMULTIPLE_ITEM  *Attributes OPTIONAL)
-{
-    return NOERROR;
-}
-
-HRESULT WINAPI
-KsOpenDefaultDevice(
-    REFGUID      Category,
-    ACCESS_MASK  Access,
-    PHANDLE      DeviceHandle)
-{
-    return NOERROR;
-}
-
-HRESULT WINAPI
-KsGetMultiplePinFactoryItems(
-    HANDLE  FilterHandle,
-    ULONG   PinFactoryId,
-    ULONG   PropertyId,
-    PVOID   *Items)
-{
-    return NOERROR;
-}
-
-HRESULT WINAPI
-KsGetMediaTypeCount(
-    HANDLE  FilterHandle,
-    ULONG   PinFactoryId,
-    ULONG   *MediaTypeCount)
-{
-    return NOERROR;
-}
-
-HRESULT WINAPI
-KsGetMediaType(
-    int  Position,
-    AM_MEDIA_TYPE  *AmMediaType,
-    HANDLE         FilterHandle,
-    ULONG          PinFactoryId)
-{
-    return NOERROR;
-}
-
-HRESULT WINAPI
-DllUnregisterServer(void)
-{
-    return S_OK;
-}
-
-HRESULT WINAPI
-DllRegisterServer(void)
-{
-    return S_OK;
-}
-
-HRESULT WINAPI
-DllGetClassObject(
-       REFCLSID rclsid,
-       REFIID riid,
-       LPVOID *ppv)
-{
-    return S_OK;
-}
-
-HRESULT WINAPI
-DllCanUnloadNow(void)
-{
-    return S_OK;
-}
-
diff --git a/reactos/dll/directx/ksproxy/ksproxy.cpp b/reactos/dll/directx/ksproxy/ksproxy.cpp
new file mode 100644 (file)
index 0000000..f1e17c9
--- /dev/null
@@ -0,0 +1,402 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/ksproxy.c
+ * PURPOSE:         ActiveMovie Proxy functions
+ *
+ * PROGRAMMERS:     Dmitry Chapyshev
+                    Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+
+const GUID CLSID_KsClockForwarder              = {0x877e4351, 0x6fea, 0x11d0, {0xb8, 0x63, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}};
+const GUID CLSID_KsQualityForwarder            = {0xe05592e4, 0xc0b5, 0x11d0, {0xa4, 0x39, 0x00, 0xa0, 0xc9, 0x22, 0x31, 0x96}};
+
+
+#ifndef _MSC_VER
+const GUID CLSID_KsIBasicAudioInterfaceHandler = {0xb9f8ac3e, 0x0f71, 0x11d2, {0xb7, 0x2c, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d}};
+const GUID KSPROPSETID_Pin                     = {0x8C134960, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
+const GUID KSINTERFACESETID_Standard           = {STATIC_KSINTERFACESETID_Standard};
+const GUID CLSID_Proxy                         = {0x17CCA71B, 0xECD7, 0x11D0, {0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
+#endif
+
+static INTERFACE_TABLE InterfaceTable[] =
+{
+    {&MEDIATYPE_Audio, CKsDataTypeHandler_Constructor},
+    {&KSINTERFACESETID_Standard, CKsInterfaceHandler_Constructor},
+    {&CLSID_KsClockForwarder, CKsClockForwarder_Constructor},
+    {&CLSID_KsQualityForwarder, CKsQualityForwarder_Constructor},
+    {&IID_IVPConfig, CVPConfig_Constructor},
+    {&IID_IVPVBIConfig, CVPVBIConfig_Constructor},
+    {&CLSID_KsIBasicAudioInterfaceHandler, CKsBasicAudio_Constructor},
+    {&CLSID_Proxy, CKsProxy_Constructor},
+    {NULL, NULL}
+};
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsSynchronousDeviceControl(
+    HANDLE     Handle,
+    ULONG      IoControl,
+    PVOID      InBuffer,
+    ULONG      InLength,
+    PVOID      OutBuffer,
+    ULONG      OutLength,
+    PULONG     BytesReturned)
+{
+    OVERLAPPED Overlapped;
+    DWORD Transferred;
+
+    /* zero overlapped */
+    RtlZeroMemory(&Overlapped, sizeof(OVERLAPPED));
+
+    /* create notification event */
+    Overlapped.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
+
+    if (!Overlapped.hEvent)
+    {
+        /* failed */
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    if (!DeviceIoControl(Handle, IoControl, InBuffer, InLength, OutBuffer, OutLength, BytesReturned, &Overlapped))
+    {
+        /* operation failed */
+        if (GetLastError() != ERROR_IO_PENDING)
+        {
+            /* failed */
+            CloseHandle(Overlapped.hEvent);
+            return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+        }
+    }
+
+    /* get result of pending operation */
+    if (!GetOverlappedResult(Handle, &Overlapped, &Transferred, TRUE))
+    {
+        /* failed */
+        CloseHandle(Overlapped.hEvent);
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    /* store number of bytes transferred */
+    *BytesReturned = Transferred;
+
+    /* close event object */
+    CloseHandle(Overlapped.hEvent);
+
+    /* done */
+    return NOERROR;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsResolveRequiredAttributes(
+    PKSDATARANGE     DataRange,
+    KSMULTIPLE_ITEM  *Attributes OPTIONAL)
+{
+    //UNIMPLEMENTED
+    return NOERROR;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsOpenDefaultDevice(
+    REFGUID      Category,
+    ACCESS_MASK  Access,
+    PHANDLE      DeviceHandle)
+{
+    HDEVINFO hList;
+    SP_DEVINFO_DATA DeviceInfoData;
+    SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
+    PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData;
+    WCHAR Path[MAX_PATH+sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W)];
+
+    /* open device list */
+    hList = SetupDiGetClassDevsW(&Category, NULL, NULL, DIGCF_DEVICEINTERFACE  | DIGCF_PRESENT);
+
+    if (hList == INVALID_HANDLE_VALUE)
+    {
+        /* failed */
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    /* setup parameters */
+    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+    DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
+
+    if (SetupDiEnumDeviceInterfaces(hList, NULL, &Category, 0, &DeviceInterfaceData))
+    {
+        /* setup interface data struct */
+        DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA_W)Path;
+        DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W);
+
+        /* get device interface details */
+        if (SetupDiGetDeviceInterfaceDetailW(hList, &DeviceInterfaceData, DeviceInterfaceDetailData, sizeof(Path), NULL, NULL))
+        {
+            /* open device */
+            *DeviceHandle = CreateFileW(DeviceInterfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL, NULL);
+
+            if (*DeviceHandle != INVALID_HANDLE_VALUE)
+            {
+                /* operation succeeded */
+                SetupDiDestroyDeviceInfoList(hList);
+                return NOERROR;
+            }
+        }
+    }
+
+    /* free device list */
+    SetupDiDestroyDeviceInfoList(hList);
+
+    /* failed */
+    return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsGetMultiplePinFactoryItems(
+    HANDLE  FilterHandle,
+    ULONG   PinFactoryId,
+    ULONG   PropertyId,
+    PVOID   *Items)
+{
+    KSP_PIN Property;
+    ULONG BytesReturned, NumData;
+    HRESULT hResult;
+
+    /* zero pin property */
+    RtlZeroMemory(&Property, sizeof(KSP_PIN));
+    Property.Property.Set = KSPROPSETID_Pin;
+    Property.Property.Id = PropertyId;
+    Property.Property.Flags = KSPROPERTY_TYPE_GET;
+    Property.PinId = PinFactoryId;
+
+    /* query pin factory */
+    hResult = KsSynchronousDeviceControl(FilterHandle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), NULL, 0, &BytesReturned);
+
+    if (hResult == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INSUFFICIENT_BUFFER))
+    {
+        /* buffer too small */
+        hResult = KsSynchronousDeviceControl(FilterHandle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)&NumData, sizeof(ULONG), &BytesReturned);
+
+        if (SUCCEEDED(hResult))
+        {
+            /* store required data size */
+            BytesReturned = NumData;
+            hResult = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA);
+        }
+    }
+
+    if (hResult == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA))
+    {
+        /* allocate data */
+        *Items = CoTaskMemAlloc(BytesReturned);
+
+        if (!*Items)
+        {
+            /* no memory */
+            return E_OUTOFMEMORY;
+        }
+
+        /* retry querying property */
+        hResult = KsSynchronousDeviceControl(FilterHandle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)*Items, BytesReturned, &BytesReturned);
+
+        /* check for success */
+        if (FAILED(hResult))
+        {
+            /* free memory */
+            CoTaskMemFree(*Items);
+        }
+    }
+
+    /* done */
+    return hResult;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsGetMediaTypeCount(
+    HANDLE  FilterHandle,
+    ULONG   PinFactoryId,
+    ULONG   *MediaTypeCount)
+{
+    PKSMULTIPLE_ITEM MultipleItem;
+    HRESULT hr;
+
+    /* try get contrained data ranges */
+    hr = KsGetMultiplePinFactoryItems(FilterHandle, PinFactoryId, KSPROPERTY_PIN_CONSTRAINEDDATARANGES, (PVOID*)&MultipleItem);
+
+    /* check for failure*/
+    if (FAILED(hr))
+    {
+        /* try getting default data ranges */
+        hr = KsGetMultiplePinFactoryItems(FilterHandle, PinFactoryId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem);
+    }
+
+    if (SUCCEEDED(hr))
+    {
+        /* store number of media types */
+        *MediaTypeCount = MultipleItem->Count;
+
+        /* free memory */
+        CoTaskMemFree(MultipleItem);
+    }
+
+    /* done */
+    return hr;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsGetMediaType(
+    int  Position,
+    AM_MEDIA_TYPE  *AmMediaType,
+    HANDLE         FilterHandle,
+    ULONG          PinFactoryId)
+{
+    HRESULT hr;
+    PKSMULTIPLE_ITEM ItemList;
+    int i = 0;
+    PKSDATAFORMAT DataFormat;
+
+    if (Position < 0)
+        return E_INVALIDARG;
+
+    // get current supported ranges
+    hr = KsGetMultiplePinFactoryItems(FilterHandle, PinFactoryId, KSPROPERTY_PIN_CONSTRAINEDDATARANGES, (PVOID*)&ItemList);
+    if (FAILED(hr))
+    {
+        // get standard dataranges
+        hr = KsGetMultiplePinFactoryItems(FilterHandle, PinFactoryId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&ItemList);
+
+        //check for success
+        if (FAILED(hr))
+            return hr;
+    }
+
+    if ((ULONG)Position >= ItemList->Count)
+    {
+        // out of bounds
+        CoTaskMemFree(ItemList);
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NO_MORE_ITEMS);
+    }
+
+    // goto first datarange
+    DataFormat = (PKSDATAFORMAT)(ItemList + 1);
+
+    while(i != Position)
+    {
+        // goto next format;
+        DataFormat = (PKSDATAFORMAT)(ULONG_PTR)(DataFormat + DataFormat->FormatSize);
+        i++;
+    }
+
+
+    DataFormat->FormatSize -= sizeof(KSDATAFORMAT);
+    if (DataFormat->FormatSize)
+    {
+         // copy extra format buffer
+        AmMediaType->pbFormat = (BYTE*)CoTaskMemAlloc(DataFormat->FormatSize);
+        if (!AmMediaType->pbFormat)
+        {
+            // not enough memory
+            CoTaskMemFree(ItemList);
+            return E_OUTOFMEMORY;
+        }
+        // copy format buffer
+        CopyMemory(AmMediaType->pbFormat, (DataFormat + 1), DataFormat->FormatSize);
+        AmMediaType->cbFormat = DataFormat->FormatSize;
+    }
+    else
+    {
+        // no format buffer
+        AmMediaType->pbFormat = NULL;
+        AmMediaType->cbFormat = 0;
+    }
+
+    // copy type info
+    CopyMemory(&AmMediaType->majortype, &DataFormat->MajorFormat, sizeof(GUID));
+    CopyMemory(&AmMediaType->subtype, &DataFormat->SubFormat, sizeof(GUID));
+    CopyMemory(&AmMediaType->formattype, &DataFormat->Specifier, sizeof(GUID));
+    AmMediaType->bTemporalCompression = FALSE; //FIXME verify
+    AmMediaType->pUnk = NULL; //FIXME
+    AmMediaType->lSampleSize = DataFormat->SampleSize;
+    AmMediaType->bFixedSizeSamples = (AmMediaType->lSampleSize) ? TRUE : FALSE;
+
+    // free dataformat list
+    CoTaskMemFree(ItemList);
+
+    return NOERROR;
+}
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllUnregisterServer(void)
+{
+    return S_OK;
+}
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllRegisterServer(void)
+{
+    return S_OK;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllGetClassObject(
+    REFCLSID rclsid,
+    REFIID riid,
+    LPVOID *ppv)
+{
+    UINT i;
+    HRESULT hres = E_OUTOFMEMORY;
+    IClassFactory * pcf = NULL;        
+
+    if (!ppv)
+        return E_INVALIDARG;
+
+    *ppv = NULL;
+
+    for (i = 0; InterfaceTable[i].riid; i++) 
+    {
+        if (IsEqualIID(*InterfaceTable[i].riid, rclsid)) 
+        {
+            pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
+            break;
+        }
+    }
+
+    if (!pcf) 
+    {
+        return CLASS_E_CLASSNOTAVAILABLE;
+    }
+
+    hres = pcf->QueryInterface(riid, ppv);
+    pcf->Release();
+
+    return hres;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllCanUnloadNow(void)
+{
+    return S_OK;
+}
+
index c4c177b..86cd50a 100644 (file)
@@ -4,9 +4,39 @@
 <module name="ksproxy" type="win32dll" entrypoint="0" baseaddress="${BASEADDRESS_KSPROXY}" installbase="system32" installname="ksproxy.ax">
        <importlibrary definition="ksproxy.spec" />
        <include base="ksproxy">.</include>
-       <library>advapi32</library>
        <library>ntdll</library>
-       <file>ksproxy.c</file>
+       <library>kernel32</library>
+       <library>advapi32</library>
+       <library>ole32</library>
+       <library>setupapi</library>
+       <library>msvcrt</library>
+       <library>strmiids</library>
+       <library>ksuser</library>
+       <group compilerset="gcc">
+               <compilerflag compiler="cxx">-fno-exceptions</compilerflag>
+               <compilerflag compiler="cxx">-fno-rtti</compilerflag>
+       </group>
+
+       <group compilerset="msc">
+               <compilerflag compiler="cxx">/GR-</compilerflag>
+       </group>
+       <file>allocator.cpp</file>
+       <file>basicaudio.cpp</file>
+       <file>classfactory.cpp</file>
+       <file>clockforward.cpp</file>
+       <file>cvpconfig.cpp</file>
+       <file>cvpvbiconfig.cpp</file>
+       <file>datatype.cpp</file>
+       <file>enum_mediatypes.cpp</file>
+       <file>enumpins.cpp</file>
+       <file>input_pin.cpp</file>
+       <file>interface.cpp</file>
+       <file>ksproxy.cpp</file>
        <file>ksproxy.rc</file>
+       <file>mediasample.cpp</file>
+       <file>node.cpp</file>
+       <file>output_pin.cpp</file>
+       <file>proxy.cpp</file>
+       <file>qualityforward.cpp</file>
 </module>
 </group>
index cf8ecb4..2539cac 100644 (file)
@@ -1,9 +1,98 @@
+// Microsoft Visual C++ generated resource script.
+//
+//#include "resource."
 
-#define REACTOS_VERSION_DLL
-#define REACTOS_STR_FILE_DESCRIPTION   "ReactOS WDM Streaming ActiveMovie Proxy\0"
-#define REACTOS_STR_INTERNAL_NAME      "ksproxy\0"
-#define REACTOS_STR_ORIGINAL_FILENAME  "ksproxy.ax\0"
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
 
-#include <reactos/reactx.h>
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Deutsch (Deutschland) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""afxres.h""\r\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 5,3,2600,3264
+ PRODUCTVERSION 5,3,2600,3264
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040704b0"
+        BEGIN
+            VALUE "CompanyName", "ReactOS WDM Streaming ActiveMovie Proxy"
+            VALUE "FileDescription", "ReactOS WDM Streaming ActiveMovie Proxy"
+            VALUE "FileVersion", "5, 3, 2600, 3264"
+            VALUE "InternalName", "ksproxy"
+            VALUE "LegalCopyright", "Copyright (C) 2010"
+            VALUE "OriginalFilename", "ksproxy.dll"
+            VALUE "ProductName", "ReactOS WDM Streaming ActiveMovie Proxy"
+            VALUE "ProductVersion", "5, 3, 2600, 3264"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x407, 1200
+    END
+END
+
+#endif    // Deutsch (Deutschland) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+ /////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
 
-#include <reactos/version.rc>
diff --git a/reactos/dll/directx/ksproxy/mediasample.cpp b/reactos/dll/directx/ksproxy/mediasample.cpp
new file mode 100644 (file)
index 0000000..8e317ef
--- /dev/null
@@ -0,0 +1,370 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/mediasample.cpp
+ * PURPOSE:         IMediaSample interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CMediaSample : public IMediaSample
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        DebugBreak();
+        if (!m_Ref)
+        {
+            if (m_Allocator)
+            {
+                m_Allocator->ReleaseBuffer((IMediaSample*)this);
+                return 0;
+            }
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    HRESULT STDMETHODCALLTYPE GetPointer(BYTE **ppBuffer);
+    long STDMETHODCALLTYPE GetSize(void);
+    HRESULT STDMETHODCALLTYPE GetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd);
+    HRESULT STDMETHODCALLTYPE SetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd);
+    HRESULT STDMETHODCALLTYPE IsSyncPoint();
+    HRESULT STDMETHODCALLTYPE SetSyncPoint(BOOL bIsSyncPoint);
+    HRESULT STDMETHODCALLTYPE IsPreroll();
+    HRESULT STDMETHODCALLTYPE SetPreroll(BOOL bIsPreroll);
+    long STDMETHODCALLTYPE GetActualDataLength();
+    HRESULT STDMETHODCALLTYPE SetActualDataLength(long Length);
+    HRESULT STDMETHODCALLTYPE GetMediaType(AM_MEDIA_TYPE **ppMediaType);
+    HRESULT STDMETHODCALLTYPE SetMediaType(AM_MEDIA_TYPE *pMediaType);
+    HRESULT STDMETHODCALLTYPE IsDiscontinuity();
+    HRESULT STDMETHODCALLTYPE SetDiscontinuity(BOOL bDiscontinuity);
+    HRESULT STDMETHODCALLTYPE GetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd);
+    HRESULT STDMETHODCALLTYPE SetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd);
+
+    CMediaSample(IMemAllocator * Allocator, BYTE * Buffer, LONG BufferSize);
+    virtual ~CMediaSample(){}
+
+protected:
+    ULONG m_Flags;
+    ULONG m_TypeFlags;
+    BYTE * m_Buffer;
+    LONG m_ActualLength;
+    LONG m_BufferSize;
+    IMemAllocator * m_Allocator;
+    CMediaSample * m_Next;
+    REFERENCE_TIME m_StartTime;
+    REFERENCE_TIME m_StopTime;
+    LONGLONG m_MediaStart;
+    LONGLONG m_MediaStop;
+    AM_MEDIA_TYPE * m_MediaType;
+    ULONG m_StreamId;
+
+public:
+    LONG m_Ref;
+
+    BOOL m_bMediaTimeValid;
+
+
+};
+
+CMediaSample::CMediaSample(
+    IMemAllocator * Allocator,
+    BYTE * Buffer,
+    LONG BufferSize) : 
+                       m_Flags(0),
+                       m_TypeFlags(0),
+                       m_Buffer(Buffer),
+                       m_ActualLength(BufferSize),
+                       m_BufferSize(BufferSize),
+                       m_Allocator(Allocator),
+                       m_Next(0),
+                       m_StartTime(0),
+                       m_StopTime(0),
+                       m_MediaStart(0),
+                       m_MediaStop(0),
+                       m_MediaType(0),
+                       m_StreamId(0),
+                       m_Ref(0),
+                       m_bMediaTimeValid(0)
+{
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown) ||
+        IsEqualGUID(refiid, IID_IMediaSample))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IMediaSample*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IMediaSample2))
+    {
+
+        OutputDebugStringW(L"CMediaSample::QueryInterface requested IMediaSample2 interface\n");
+#if 0
+        *Output = (IMediaSample2*)(this);
+        reinterpret_cast<IMediaSample2*>(*Output)->AddRef();
+        return NOERROR;
+#endif
+    }
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IMediaSample interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::GetPointer(
+    BYTE **ppBuffer)
+{
+    if (!ppBuffer)
+        return E_POINTER;
+
+    *ppBuffer = m_Buffer;
+    return S_OK;
+}
+
+long
+STDMETHODCALLTYPE
+CMediaSample::GetSize()
+{
+    return m_BufferSize;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::GetTime(
+    REFERENCE_TIME *pTimeStart,
+    REFERENCE_TIME *pTimeEnd)
+{
+    HRESULT hr;
+
+    if (!pTimeStart || !pTimeEnd)
+        return E_POINTER;
+
+    if (!(m_Flags & (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID)))
+    {
+        // no time is set
+        return VFW_E_SAMPLE_TIME_NOT_SET;
+    }
+
+    *pTimeStart = m_StartTime;
+
+    if (m_Flags & AM_SAMPLE_STOPVALID)
+    {
+        *pTimeEnd = m_StopTime;
+        hr = NOERROR;
+    }
+    else
+    {
+        *pTimeEnd = m_StartTime + 1;
+        hr = VFW_S_NO_STOP_TIME;
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::SetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd)
+{
+    if (!pTimeStart)
+    {
+        m_Flags &= ~(AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID);
+        return NOERROR;
+    }
+
+    if (!pTimeEnd)
+    {
+        m_Flags &= ~(AM_SAMPLE_STOPVALID);
+        m_Flags |= AM_SAMPLE_TIMEVALID;
+        m_StartTime = *pTimeStart;
+        return NOERROR;
+    }
+
+
+    m_Flags |= (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID);
+    m_StartTime = *pTimeStart;
+    m_StopTime = *pTimeEnd;
+
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::IsSyncPoint()
+{
+    return (m_Flags & AM_SAMPLE_SPLICEPOINT) ? S_OK : S_FALSE;
+}
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::SetSyncPoint(BOOL bIsSyncPoint)
+{
+    if (bIsSyncPoint)
+        m_Flags |= AM_SAMPLE_SPLICEPOINT;
+    else
+        m_Flags &= ~AM_SAMPLE_SPLICEPOINT;
+
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::IsPreroll()
+{
+    return (m_Flags & AM_SAMPLE_PREROLL) ? S_OK : S_FALSE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::SetPreroll(BOOL bIsPreroll)
+{
+    if (bIsPreroll)
+        m_Flags |= AM_SAMPLE_PREROLL;
+    else
+        m_Flags &= ~AM_SAMPLE_PREROLL;
+
+    return NOERROR;
+}
+
+long
+STDMETHODCALLTYPE
+CMediaSample::GetActualDataLength()
+{
+    return m_ActualLength;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::SetActualDataLength(long Length)
+{
+    if (Length > m_BufferSize)
+        return VFW_E_BUFFER_OVERFLOW;
+
+    m_ActualLength = Length;
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::GetMediaType(AM_MEDIA_TYPE **ppMediaType)
+{
+    OutputDebugStringW(L"CMediaSample::GetMediaType\n");
+
+    if (!m_MediaType)
+    {
+        *ppMediaType = NULL;
+        return S_FALSE;
+    }
+
+    assert(0);
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::SetMediaType(AM_MEDIA_TYPE *pMediaType)
+{
+    OutputDebugStringW(L"CMediaSample::SetMediaType NotImplemented\n");
+    DebugBreak();
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::IsDiscontinuity()
+{
+    return (m_Flags & AM_SAMPLE_DATADISCONTINUITY) ? S_OK : S_FALSE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::SetDiscontinuity(BOOL bDiscontinuity)
+{
+    if (bDiscontinuity)
+        m_Flags |= AM_SAMPLE_DATADISCONTINUITY;
+    else
+        m_Flags &= ~AM_SAMPLE_DATADISCONTINUITY;
+
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::GetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd)
+{
+    if (!pTimeStart || !pTimeEnd)
+        return E_POINTER;
+
+    if (!m_bMediaTimeValid)
+        return VFW_E_MEDIA_TIME_NOT_SET;
+
+    m_MediaStart = *pTimeStart;
+    m_MediaStop = *pTimeEnd;
+
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CMediaSample::SetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd)
+{
+    if (!pTimeStart || !pTimeEnd)
+    {
+        m_bMediaTimeValid = false;
+        return NOERROR;
+    }
+
+    m_MediaStart = *pTimeStart;
+    m_MediaStop = *pTimeEnd;
+
+    return NOERROR;
+}
+
+
+
+
+HRESULT
+WINAPI
+CMediaSample_Constructor(
+    IMemAllocator* Allocator, 
+    BYTE* pBuffer,
+    ULONG BufferSize,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    OutputDebugStringW(L"CMediaSample_Constructor\n");
+
+    CMediaSample * handler = new CMediaSample(Allocator, pBuffer, BufferSize);
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/ksproxy/node.cpp b/reactos/dll/directx/ksproxy/node.cpp
new file mode 100644 (file)
index 0000000..d2686bb
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/node.cpp
+ * PURPOSE:         Control Node
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CKsNode : public IKsControl
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    //IKsControl
+    HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned);
+    HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned);
+    HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned);
+
+    CKsNode(IUnknown * pUnkOuter, HANDLE Handle) : m_Ref(0), m_pUnkOuter(pUnkOuter), m_Handle(Handle){};
+    virtual ~CKsNode()
+    {
+        CloseHandle(m_Handle);
+    };
+
+protected:
+    LONG m_Ref;
+    IUnknown * m_pUnkOuter;
+    HANDLE m_Handle;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CKsNode::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown) ||
+        IsEqualGUID(refiid, IID_IKsControl))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IKsControl
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsNode::KsProperty(
+    PKSPROPERTY Property,
+    ULONG PropertyLength,
+    LPVOID PropertyData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_Handle != 0);
+    return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsNode::KsMethod(
+    PKSMETHOD Method,
+    ULONG MethodLength,
+    LPVOID MethodData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_Handle != 0);
+    return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsNode::KsEvent(
+    PKSEVENT Event,
+    ULONG EventLength,
+    LPVOID EventData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_Handle != 0);
+
+    if (EventLength)
+        return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned);
+    else
+        return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned);
+}
+
+HRESULT
+WINAPI
+CKsNode_Constructor(
+    IUnknown * pUnkOuter,
+    HANDLE ParentHandle,
+    ULONG NodeId,
+    ACCESS_MASK DesiredAccess,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    HRESULT hr;
+    HANDLE handle;
+    KSNODE_CREATE NodeCreate;
+
+    OutputDebugStringW(L"CKsNode_Constructor\n");
+
+    //setup request
+    NodeCreate.CreateFlags = 0;
+    NodeCreate.Node = NodeId;
+
+    hr = KsCreateTopologyNode(ParentHandle, &NodeCreate, DesiredAccess, &handle);
+    if (hr != NOERROR)
+    {
+         OutputDebugString("CKsNode_Constructor failed to open device\n");
+         return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, hr);
+    }
+
+    CKsNode * quality = new CKsNode(pUnkOuter, handle);
+
+    if (!quality)
+    {
+        // free clock handle
+        CloseHandle(handle);
+        return E_OUTOFMEMORY;
+    }
+
+    if (FAILED(quality->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete quality;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/ksproxy/output_pin.cpp b/reactos/dll/directx/ksproxy/output_pin.cpp
new file mode 100644 (file)
index 0000000..e5f172b
--- /dev/null
@@ -0,0 +1,2149 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/output_pin.cpp
+ * PURPOSE:         OutputPin of Proxy Filter
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class COutputPin : public IPin,
+                   public IKsObject,
+                   public IKsPropertySet,
+                   public IStreamBuilder,
+                   public IKsPinFactory,
+                   public ISpecifyPropertyPages,
+                   public IKsPinEx,
+                   public IKsPinPipe,
+                   public IKsControl,
+                   public IKsAggregateControl,
+                   public IQualityControl,
+                   public IMediaSeeking,
+                   public IAMBufferNegotiation,
+                   public IAMStreamConfig,
+                   public IMemAllocatorNotifyCallbackTemp
+
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            //delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    //IKsPin
+    HRESULT STDMETHODCALLTYPE KsQueryMediums(PKSMULTIPLE_ITEM* MediumList);
+    HRESULT STDMETHODCALLTYPE KsQueryInterfaces(PKSMULTIPLE_ITEM* InterfaceList);
+    HRESULT STDMETHODCALLTYPE KsCreateSinkPinHandle(KSPIN_INTERFACE& Interface, KSPIN_MEDIUM& Medium);
+    HRESULT STDMETHODCALLTYPE KsGetCurrentCommunication(KSPIN_COMMUNICATION *Communication, KSPIN_INTERFACE *Interface, KSPIN_MEDIUM *Medium);
+    HRESULT STDMETHODCALLTYPE KsPropagateAcquire();
+    HRESULT STDMETHODCALLTYPE KsDeliver(IMediaSample* Sample, ULONG Flags);
+    HRESULT STDMETHODCALLTYPE KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment);
+    IMemAllocator * STDMETHODCALLTYPE KsPeekAllocator(KSPEEKOPERATION Operation);
+    HRESULT STDMETHODCALLTYPE KsReceiveAllocator(IMemAllocator *MemAllocator);
+    HRESULT STDMETHODCALLTYPE KsRenegotiateAllocator();
+    LONG STDMETHODCALLTYPE KsIncrementPendingIoCount();
+    LONG STDMETHODCALLTYPE KsDecrementPendingIoCount();
+    HRESULT STDMETHODCALLTYPE KsQualityNotify(ULONG Proportion, REFERENCE_TIME TimeDelta);
+    // IKsPinEx
+    VOID STDMETHODCALLTYPE KsNotifyError(IMediaSample* Sample, HRESULT hr);
+
+    //IKsPinPipe
+    HRESULT STDMETHODCALLTYPE KsGetPinFramingCache(PKSALLOCATOR_FRAMING_EX *FramingEx, PFRAMING_PROP FramingProp, FRAMING_CACHE_OPS Option);
+    HRESULT STDMETHODCALLTYPE KsSetPinFramingCache(PKSALLOCATOR_FRAMING_EX FramingEx, PFRAMING_PROP FramingProp, FRAMING_CACHE_OPS Option);
+    IPin* STDMETHODCALLTYPE KsGetConnectedPin();
+    IKsAllocatorEx* STDMETHODCALLTYPE KsGetPipe(KSPEEKOPERATION Operation);
+    HRESULT STDMETHODCALLTYPE KsSetPipe(IKsAllocatorEx *KsAllocator);
+    ULONG STDMETHODCALLTYPE KsGetPipeAllocatorFlag();
+    HRESULT STDMETHODCALLTYPE KsSetPipeAllocatorFlag(ULONG Flag);
+    GUID STDMETHODCALLTYPE KsGetPinBusCache();
+    HRESULT STDMETHODCALLTYPE KsSetPinBusCache(GUID Bus);
+    PWCHAR STDMETHODCALLTYPE KsGetPinName();
+    PWCHAR STDMETHODCALLTYPE KsGetFilterName();
+
+    //IPin methods
+    HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE Disconnect();
+    HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pPin);
+    HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo);
+    HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir);
+    HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id);
+    HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum);
+    HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin);
+    HRESULT STDMETHODCALLTYPE EndOfStream();
+    HRESULT STDMETHODCALLTYPE BeginFlush();
+    HRESULT STDMETHODCALLTYPE EndFlush();
+    HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+    // ISpecifyPropertyPages
+    HRESULT STDMETHODCALLTYPE GetPages(CAUUID *pPages);
+
+    //IKsObject methods
+    HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
+
+    //IKsPropertySet
+    HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData);
+    HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData, DWORD *pcbReturned);
+    HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD *pTypeSupport);
+
+    //IKsControl
+    HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned);
+    HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned);
+    HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned);
+
+    //IStreamBuilder
+    HRESULT STDMETHODCALLTYPE Render(IPin *ppinOut, IGraphBuilder *pGraph);
+    HRESULT STDMETHODCALLTYPE Backout(IPin *ppinOut, IGraphBuilder *pGraph);
+
+    //IKsPinFactory
+    HRESULT STDMETHODCALLTYPE KsPinFactory(ULONG* PinFactory);
+
+    //IKsAggregateControl
+    HRESULT STDMETHODCALLTYPE KsAddAggregate(IN REFGUID AggregateClass);
+    HRESULT STDMETHODCALLTYPE KsRemoveAggregate(REFGUID AggregateClass);
+
+    //IQualityControl
+    HRESULT STDMETHODCALLTYPE Notify(IBaseFilter *pSelf, Quality q);
+    HRESULT STDMETHODCALLTYPE SetSink(IQualityControl *piqc);
+
+    //IMediaSeeking
+    HRESULT STDMETHODCALLTYPE GetCapabilities(DWORD *pCapabilities);
+    HRESULT STDMETHODCALLTYPE CheckCapabilities(DWORD *pCapabilities);
+    HRESULT STDMETHODCALLTYPE IsFormatSupported(const GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE QueryPreferredFormat(GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE GetTimeFormat(GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE IsUsingTimeFormat(const GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE SetTimeFormat(const GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE GetDuration(LONGLONG *pDuration);
+    HRESULT STDMETHODCALLTYPE GetStopPosition(LONGLONG *pStop);
+    HRESULT STDMETHODCALLTYPE GetCurrentPosition(LONGLONG *pCurrent);
+    HRESULT STDMETHODCALLTYPE ConvertTimeFormat(LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat);
+    HRESULT STDMETHODCALLTYPE SetPositions(LONGLONG *pCurrent, DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags);
+    HRESULT STDMETHODCALLTYPE GetPositions(LONGLONG *pCurrent, LONGLONG *pStop);
+    HRESULT STDMETHODCALLTYPE GetAvailable(LONGLONG *pEarliest, LONGLONG *pLatest);
+    HRESULT STDMETHODCALLTYPE SetRate(double dRate);
+    HRESULT STDMETHODCALLTYPE GetRate(double *pdRate);
+    HRESULT STDMETHODCALLTYPE GetPreroll(LONGLONG *pllPreroll);
+
+    //IAMBufferNegotiation
+    HRESULT STDMETHODCALLTYPE SuggestAllocatorProperties(const ALLOCATOR_PROPERTIES *pprop);
+    HRESULT STDMETHODCALLTYPE GetAllocatorProperties(ALLOCATOR_PROPERTIES *pprop);
+
+    //IAMStreamConfig
+    HRESULT STDMETHODCALLTYPE SetFormat(AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE GetFormat(AM_MEDIA_TYPE **ppmt);
+    HRESULT STDMETHODCALLTYPE GetNumberOfCapabilities(int *piCount, int *piSize);
+    HRESULT STDMETHODCALLTYPE GetStreamCaps(int iIndex, AM_MEDIA_TYPE **ppmt, BYTE *pSCC);
+
+    //IMemAllocatorNotifyCallbackTemp
+    HRESULT STDMETHODCALLTYPE NotifyRelease();
+
+    //---------------------------------------------------------------
+    COutputPin(IBaseFilter * ParentFilter, LPCWSTR PinName, ULONG PinId, KSPIN_COMMUNICATION Communication);
+    virtual ~COutputPin();
+    HRESULT STDMETHODCALLTYPE CheckFormat(const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE CreatePin(const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE CreatePinHandle(PKSPIN_MEDIUM Medium, PKSPIN_INTERFACE Interface, const AM_MEDIA_TYPE *pmt);
+    HRESULT WINAPI IoProcessRoutine();
+    HRESULT WINAPI InitializeIOThread();
+
+    friend DWORD WINAPI COutputPin_IoThreadStartup(LPVOID lpParameter);
+    friend HRESULT STDMETHODCALLTYPE COutputPin_SetState(IPin * Pin, KSSTATE State);
+
+protected:
+    LONG m_Ref;
+    IBaseFilter * m_ParentFilter;
+    LPCWSTR m_PinName;
+    HANDLE m_hPin;
+    ULONG m_PinId;
+    IKsObject * m_KsObjectParent;
+    IPin * m_Pin;
+    IKsAllocatorEx * m_KsAllocatorEx;
+    ULONG m_PipeAllocatorFlag;
+    BOOL m_bPinBusCacheInitialized;
+    GUID m_PinBusCache;
+    LPWSTR m_FilterName;
+    FRAMING_PROP m_FramingProp[4];
+    PKSALLOCATOR_FRAMING_EX m_FramingEx[4];
+
+    IMemAllocator * m_MemAllocator;
+    IMemInputPin * m_MemInputPin;
+    LONG m_IoCount;
+    KSPIN_COMMUNICATION m_Communication;
+    KSPIN_INTERFACE m_Interface;
+    KSPIN_MEDIUM m_Medium;
+    AM_MEDIA_TYPE m_MediaFormat;
+
+    IMediaSeeking * m_FilterMediaSeeking;
+    ALLOCATOR_PROPERTIES m_Properties;
+    IKsInterfaceHandler * m_InterfaceHandler;
+
+    HANDLE m_hStartEvent;
+    HANDLE m_hBufferAvailable;
+    HANDLE m_hStopEvent;
+    BOOL m_StopInProgress;
+    BOOL m_IoThreadStarted;
+
+    KSSTATE m_State;
+};
+
+COutputPin::~COutputPin()
+{
+    if (m_KsObjectParent)
+        m_KsObjectParent->Release();
+}
+
+COutputPin::COutputPin(
+    IBaseFilter * ParentFilter,
+    LPCWSTR PinName,
+    ULONG PinId,
+    KSPIN_COMMUNICATION Communication) : m_Ref(0),
+                                         m_ParentFilter(ParentFilter),
+                                         m_PinName(PinName),
+                                         m_hPin(INVALID_HANDLE_VALUE),
+                                         m_PinId(PinId),
+                                         m_KsObjectParent(0),
+                                         m_Pin(0),
+                                         m_KsAllocatorEx(0),
+                                         m_PipeAllocatorFlag(0),
+                                         m_bPinBusCacheInitialized(0),
+                                         m_FilterName(0),
+                                         m_MemAllocator(0),
+                                         m_MemInputPin(0),
+                                         m_IoCount(0),
+                                         m_Communication(Communication),
+                                         m_FilterMediaSeeking(0),
+                                         m_InterfaceHandler(0),
+                                         m_hStartEvent(0),
+                                         m_hBufferAvailable(0),
+                                         m_hStopEvent(0),
+                                         m_StopInProgress(0),
+                                         m_IoThreadStarted(0),
+                                         m_State(KSSTATE_STOP)
+{
+    HRESULT hr;
+
+    hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&m_KsObjectParent);
+    assert(hr == S_OK);
+
+    hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&m_FilterMediaSeeking);
+    assert(hr == S_OK);
+
+    ZeroMemory(m_FramingProp, sizeof(m_FramingProp));
+    ZeroMemory(m_FramingEx, sizeof(m_FramingEx));
+
+    hr = KsGetMediaType(0, &m_MediaFormat, m_KsObjectParent->KsGetObjectHandle(), m_PinId);
+    assert(hr == S_OK);
+};
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+    if (IsEqualGUID(refiid, IID_IUnknown) ||
+        IsEqualGUID(refiid, IID_IPin))
+    {
+        OutputDebugStringW(L"COutputPin::QueryInterface IID_IPin\n");
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsObject))
+    {
+        if (m_hPin == INVALID_HANDLE_VALUE)
+        {
+            HRESULT hr = CreatePin(&m_MediaFormat);
+            if (FAILED(hr))
+                return hr;
+        }
+
+        OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsObject\n");
+        *Output = (IKsObject*)(this);
+        reinterpret_cast<IKsObject*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsPin) || IsEqualGUID(refiid, IID_IKsPinEx))
+    {
+        *Output = (IKsPinEx*)(this);
+        reinterpret_cast<IKsPinEx*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsPinPipe))
+    {
+        *Output = (IKsPinPipe*)(this);
+        reinterpret_cast<IKsPinPipe*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsAggregateControl))
+    {
+        *Output = (IKsAggregateControl*)(this);
+        reinterpret_cast<IKsAggregateControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IQualityControl))
+    {
+        *Output = (IQualityControl*)(this);
+        reinterpret_cast<IQualityControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsPropertySet))
+    {
+        if (m_hPin == INVALID_HANDLE_VALUE)
+        {
+            HRESULT hr = CreatePin(&m_MediaFormat);
+            if (FAILED(hr))
+                return hr;
+        }
+        OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsPropertySet\n");
+        *Output = (IKsPropertySet*)(this);
+        reinterpret_cast<IKsPropertySet*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsControl))
+    {
+        OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsControl\n");
+        *Output = (IKsControl*)(this);
+        reinterpret_cast<IKsControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+#if 0
+    else if (IsEqualGUID(refiid, IID_IStreamBuilder))
+    {
+        *Output = (IStreamBuilder*)(this);
+        reinterpret_cast<IStreamBuilder*>(*Output)->AddRef();
+        return NOERROR;
+    }
+#endif
+    else if (IsEqualGUID(refiid, IID_IKsPinFactory))
+    {
+        OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsPinFactory\n");
+        *Output = (IKsPinFactory*)(this);
+        reinterpret_cast<IKsPinFactory*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_ISpecifyPropertyPages))
+    {
+        OutputDebugStringW(L"COutputPin::QueryInterface IID_ISpecifyPropertyPages\n");
+        *Output = (ISpecifyPropertyPages*)(this);
+        reinterpret_cast<ISpecifyPropertyPages*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IMediaSeeking))
+    {
+        *Output = (IMediaSeeking*)(this);
+        reinterpret_cast<IMediaSeeking*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IAMBufferNegotiation))
+    {
+        *Output = (IAMBufferNegotiation*)(this);
+        reinterpret_cast<IAMBufferNegotiation*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IAMStreamConfig))
+    {
+        *Output = (IAMStreamConfig*)(this);
+        reinterpret_cast<IAMStreamConfig*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IMemAllocatorNotifyCallbackTemp))
+    {
+        *Output = (IMemAllocatorNotifyCallbackTemp*)(this);
+        reinterpret_cast<IMemAllocatorNotifyCallbackTemp*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"COutputPin::QueryInterface: NoInterface for %s PinId %u PinName %s\n", lpstr, m_PinId, m_PinName);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IAMBufferNegotiation interface
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::SuggestAllocatorProperties(
+    const ALLOCATOR_PROPERTIES *pprop)
+{
+    OutputDebugStringW(L"COutputPin::SuggestAllocatorProperties\n");
+
+    if (m_Pin)
+    {
+        // pin is already connected
+        return VFW_E_ALREADY_CONNECTED;
+    }
+
+    CopyMemory(&m_Properties, pprop, sizeof(ALLOCATOR_PROPERTIES));
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetAllocatorProperties(
+    ALLOCATOR_PROPERTIES *pprop)
+{
+    OutputDebugStringW(L"COutputPin::GetAllocatorProperties\n");
+
+    if (!m_Pin)
+    {
+        // you should call this method AFTER you connected
+        return E_UNEXPECTED;
+    }
+
+    if (!m_KsAllocatorEx)
+    {
+        // something went wrong while creating the allocator
+        return E_FAIL;
+    }
+
+    CopyMemory(pprop, &m_Properties, sizeof(ALLOCATOR_PROPERTIES));
+    return NOERROR;
+}
+
+//-------------------------------------------------------------------
+// IAMStreamConfig interface
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::SetFormat(
+    AM_MEDIA_TYPE *pmt)
+{
+    OutputDebugStringW(L"COutputPin::SetFormat NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetFormat(AM_MEDIA_TYPE **ppmt)
+{
+    OutputDebugStringW(L"COutputPin::GetFormat NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetNumberOfCapabilities(
+    int *piCount,
+    int *piSize)
+{
+    OutputDebugStringW(L"COutputPin::GetNumberOfCapabilities NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetStreamCaps(
+    int iIndex,
+    AM_MEDIA_TYPE **ppmt,
+    BYTE *pSCC)
+{
+    OutputDebugStringW(L"COutputPin::GetStreamCaps NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IMemAllocatorNotifyCallbackTemp interface
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::NotifyRelease()
+{
+    OutputDebugStringW(L"COutputPin::NotifyRelease\n");
+
+    // notify thread of new available sample
+    SetEvent(m_hBufferAvailable);
+
+    return NOERROR;
+}
+
+//-------------------------------------------------------------------
+// IMediaSeeking interface
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetCapabilities(
+    DWORD *pCapabilities)
+{
+    return m_FilterMediaSeeking->GetCapabilities(pCapabilities);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::CheckCapabilities(
+    DWORD *pCapabilities)
+{
+    return m_FilterMediaSeeking->CheckCapabilities(pCapabilities);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::IsFormatSupported(
+    const GUID *pFormat)
+{
+    return m_FilterMediaSeeking->IsFormatSupported(pFormat);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryPreferredFormat(
+    GUID *pFormat)
+{
+    return m_FilterMediaSeeking->QueryPreferredFormat(pFormat);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetTimeFormat(
+    GUID *pFormat)
+{
+    return m_FilterMediaSeeking->GetTimeFormat(pFormat);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::IsUsingTimeFormat(
+    const GUID *pFormat)
+{
+    return m_FilterMediaSeeking->IsUsingTimeFormat(pFormat);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::SetTimeFormat(
+    const GUID *pFormat)
+{
+    return m_FilterMediaSeeking->SetTimeFormat(pFormat);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetDuration(
+    LONGLONG *pDuration)
+{
+    return m_FilterMediaSeeking->GetDuration(pDuration);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetStopPosition(
+    LONGLONG *pStop)
+{
+    return m_FilterMediaSeeking->GetStopPosition(pStop);
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetCurrentPosition(
+    LONGLONG *pCurrent)
+{
+    return m_FilterMediaSeeking->GetCurrentPosition(pCurrent);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::ConvertTimeFormat(
+    LONGLONG *pTarget,
+    const GUID *pTargetFormat,
+    LONGLONG Source,
+    const GUID *pSourceFormat)
+{
+    return m_FilterMediaSeeking->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::SetPositions(
+    LONGLONG *pCurrent,
+    DWORD dwCurrentFlags,
+    LONGLONG *pStop,
+    DWORD dwStopFlags)
+{
+    return m_FilterMediaSeeking->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetPositions(
+    LONGLONG *pCurrent,
+    LONGLONG *pStop)
+{
+    return m_FilterMediaSeeking->GetPositions(pCurrent, pStop);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetAvailable(
+    LONGLONG *pEarliest,
+    LONGLONG *pLatest)
+{
+    return m_FilterMediaSeeking->GetAvailable(pEarliest, pLatest);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::SetRate(
+    double dRate)
+{
+    return m_FilterMediaSeeking->SetRate(dRate);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetRate(
+    double *pdRate)
+{
+    return m_FilterMediaSeeking->GetRate(pdRate);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetPreroll(
+    LONGLONG *pllPreroll)
+{
+    return m_FilterMediaSeeking->GetPreroll(pllPreroll);
+}
+
+//-------------------------------------------------------------------
+// IQualityControl interface
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::Notify(
+    IBaseFilter *pSelf,
+    Quality q)
+{
+    OutputDebugStringW(L"COutputPin::Notify NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::SetSink(
+    IQualityControl *piqc)
+{
+    OutputDebugStringW(L"COutputPin::SetSink NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+
+//-------------------------------------------------------------------
+// IKsAggregateControl interface
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsAddAggregate(
+    IN REFGUID AggregateClass)
+{
+    OutputDebugStringW(L"COutputPin::KsAddAggregate NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsRemoveAggregate(
+    REFGUID AggregateClass)
+{
+    OutputDebugStringW(L"COutputPin::KsRemoveAggregate NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+
+//-------------------------------------------------------------------
+// IKsPin
+//
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsQueryMediums(
+    PKSMULTIPLE_ITEM* MediumList)
+{
+    HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle();
+    return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsQueryInterfaces(
+    PKSMULTIPLE_ITEM* InterfaceList)
+{
+    HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle();
+
+    return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsCreateSinkPinHandle(
+    KSPIN_INTERFACE& Interface,
+    KSPIN_MEDIUM& Medium)
+{
+    OutputDebugStringW(L"COutputPin::KsCreateSinkPinHandle NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsGetCurrentCommunication(
+    KSPIN_COMMUNICATION *Communication,
+    KSPIN_INTERFACE *Interface,
+    KSPIN_MEDIUM *Medium)
+{
+    if (Communication)
+    {
+        *Communication = m_Communication;
+    }
+
+    if (Interface)
+    {
+        if (!m_hPin)
+            return VFW_E_NOT_CONNECTED;
+
+        CopyMemory(Interface, &m_Interface, sizeof(KSPIN_INTERFACE));
+    }
+
+    if (Medium)
+    {
+        if (!m_hPin)
+            return VFW_E_NOT_CONNECTED;
+
+        CopyMemory(Medium, &m_Medium, sizeof(KSPIN_MEDIUM));
+    }
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsPropagateAcquire()
+{
+    KSPROPERTY Property;
+    KSSTATE State;
+    ULONG BytesReturned;
+    HRESULT hr;
+
+    OutputDebugStringW(L"COutputPin::KsPropagateAcquire\n");
+
+    assert(m_hPin != INVALID_HANDLE_VALUE);
+
+    Property.Set = KSPROPSETID_Connection;
+    Property.Id = KSPROPERTY_CONNECTION_STATE;
+    Property.Flags = KSPROPERTY_TYPE_SET;
+
+    State = KSSTATE_ACQUIRE;
+
+    hr = KsProperty(&Property, sizeof(KSPROPERTY), (LPVOID)&State, sizeof(KSSTATE), &BytesReturned);
+
+    //TODO
+    //propagate to connected pin on the pipe
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsDeliver(
+    IMediaSample* Sample,
+    ULONG Flags)
+{
+    return E_FAIL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment)
+{
+    return NOERROR;
+}
+
+IMemAllocator * 
+STDMETHODCALLTYPE
+COutputPin::KsPeekAllocator(KSPEEKOPERATION Operation)
+{
+    if (Operation == KsPeekOperation_AddRef)
+    {
+        // add reference on allocator
+        m_MemAllocator->AddRef();
+    }
+
+    return m_MemAllocator;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsReceiveAllocator(IMemAllocator *MemAllocator)
+{
+    if (MemAllocator)
+    {
+        MemAllocator->AddRef();
+    }
+
+    if (m_MemAllocator)
+    {
+        m_MemAllocator->Release();
+    }
+
+    m_MemAllocator = MemAllocator;
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsRenegotiateAllocator()
+{
+    return E_FAIL;
+}
+
+LONG
+STDMETHODCALLTYPE
+COutputPin::KsIncrementPendingIoCount()
+{
+    return InterlockedIncrement((volatile LONG*)&m_IoCount);
+}
+
+LONG
+STDMETHODCALLTYPE
+COutputPin::KsDecrementPendingIoCount()
+{
+    return InterlockedDecrement((volatile LONG*)&m_IoCount);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsQualityNotify(
+    ULONG Proportion,
+    REFERENCE_TIME TimeDelta)
+{
+    OutputDebugStringW(L"COutputPin::KsQualityNotify NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IKsPinEx
+//
+
+VOID
+STDMETHODCALLTYPE
+COutputPin::KsNotifyError(
+    IMediaSample* Sample,
+    HRESULT hr)
+{
+    OutputDebugStringW(L"COutputPin::KsNotifyError NotImplemented\n");
+}
+
+
+//-------------------------------------------------------------------
+// IKsPinPipe
+//
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsGetPinFramingCache(
+    PKSALLOCATOR_FRAMING_EX *FramingEx,
+    PFRAMING_PROP FramingProp,
+    FRAMING_CACHE_OPS Option)
+{
+    if (Option > Framing_Cache_Write || Option < Framing_Cache_ReadLast)
+    {
+        // invalid argument
+        return E_INVALIDARG;
+    }
+
+    // get framing properties
+    *FramingProp = m_FramingProp[Option];
+    *FramingEx = m_FramingEx[Option];
+
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsSetPinFramingCache(
+    PKSALLOCATOR_FRAMING_EX FramingEx,
+    PFRAMING_PROP FramingProp,
+    FRAMING_CACHE_OPS Option)
+{
+    ULONG Index;
+    ULONG RefCount = 0;
+
+    if (m_FramingEx[Option])
+    {
+        for(Index = 1; Index < 4; Index++)
+        {
+            if (m_FramingEx[Index] == m_FramingEx[Option])
+                RefCount++;
+        }
+
+        if (RefCount == 1)
+        {
+            // existing framing is only used once
+            CoTaskMemFree(m_FramingEx[Option]);
+        }
+    }
+
+    // store framing
+    m_FramingEx[Option] = FramingEx;
+    m_FramingProp[Option] = *FramingProp;
+
+    return S_OK;
+}
+
+IPin*
+STDMETHODCALLTYPE
+COutputPin::KsGetConnectedPin()
+{
+    return m_Pin;
+}
+
+IKsAllocatorEx*
+STDMETHODCALLTYPE
+COutputPin::KsGetPipe(
+    KSPEEKOPERATION Operation)
+{
+    if (Operation == KsPeekOperation_AddRef)
+    {
+        if (m_KsAllocatorEx)
+            m_KsAllocatorEx->AddRef();
+    }
+    return m_KsAllocatorEx;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsSetPipe(
+    IKsAllocatorEx *KsAllocator)
+{
+    if (KsAllocator)
+        KsAllocator->AddRef();
+
+    if (m_KsAllocatorEx)
+        m_KsAllocatorEx->Release();
+
+    m_KsAllocatorEx = KsAllocator;
+    return NOERROR;
+}
+
+ULONG
+STDMETHODCALLTYPE
+COutputPin::KsGetPipeAllocatorFlag()
+{
+    return m_PipeAllocatorFlag;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsSetPipeAllocatorFlag(
+    ULONG Flag)
+{
+    m_PipeAllocatorFlag = Flag;
+    return NOERROR;
+}
+
+GUID
+STDMETHODCALLTYPE
+COutputPin::KsGetPinBusCache()
+{
+    if (!m_bPinBusCacheInitialized)
+    {
+        CopyMemory(&m_PinBusCache, &m_Medium.Set, sizeof(GUID));
+        m_bPinBusCacheInitialized = TRUE;
+    }
+
+    return m_PinBusCache;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsSetPinBusCache(
+    GUID Bus)
+{
+    CopyMemory(&m_PinBusCache, &Bus, sizeof(GUID));
+    return NOERROR;
+}
+
+PWCHAR
+STDMETHODCALLTYPE
+COutputPin::KsGetPinName()
+{
+    return (PWCHAR)m_PinName;
+}
+
+
+PWCHAR
+STDMETHODCALLTYPE
+COutputPin::KsGetFilterName()
+{
+    return m_FilterName;
+}
+
+//-------------------------------------------------------------------
+// ISpecifyPropertyPages
+//
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::GetPages(CAUUID *pPages)
+{
+    OutputDebugStringW(L"COutputPin::GetPages NotImplemented\n");
+
+    if (!pPages)
+        return E_POINTER;
+
+    pPages->cElems = 0;
+    pPages->pElems = NULL;
+
+    return S_OK;
+}
+
+//-------------------------------------------------------------------
+// IKsPinFactory
+//
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsPinFactory(
+    ULONG* PinFactory)
+{
+    OutputDebugStringW(L"COutputPin::KsPinFactory\n");
+    *PinFactory = m_PinId;
+    return S_OK;
+}
+
+
+//-------------------------------------------------------------------
+// IStreamBuilder
+//
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::Render(
+    IPin *ppinOut,
+    IGraphBuilder *pGraph)
+{
+    OutputDebugStringW(L"COutputPin::Render\n");
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::Backout(
+    IPin *ppinOut, 
+    IGraphBuilder *pGraph)
+{
+    OutputDebugStringW(L"COutputPin::Backout\n");
+    return S_OK;
+}
+//-------------------------------------------------------------------
+// IKsObject
+//
+HANDLE
+STDMETHODCALLTYPE
+COutputPin::KsGetObjectHandle()
+{
+    OutputDebugStringW(L"COutputPin::KsGetObjectHandle\n");
+    assert(m_hPin != INVALID_HANDLE_VALUE);
+    return m_hPin;
+}
+
+//-------------------------------------------------------------------
+// IKsControl
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsProperty(
+    PKSPROPERTY Property,
+    ULONG PropertyLength,
+    LPVOID PropertyData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    HRESULT hr;
+    WCHAR Buffer[100];
+    LPOLESTR pstr;
+
+    assert(m_hPin != INVALID_HANDLE_VALUE);
+
+    hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned);
+
+    StringFromCLSID(Property->Set, &pstr);
+    swprintf(Buffer, L"COutputPin::KsProperty Set %s Id %lu Flags %x hr %x\n", pstr, Property->Id, Property->Flags, hr);
+    OutputDebugStringW(Buffer);
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsMethod(
+    PKSMETHOD Method,
+    ULONG MethodLength,
+    LPVOID MethodData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_hPin != INVALID_HANDLE_VALUE);
+    OutputDebugStringW(L"COutputPin::KsMethod\n");
+    return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::KsEvent(
+    PKSEVENT Event,
+    ULONG EventLength,
+    LPVOID EventData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_hPin != INVALID_HANDLE_VALUE);
+
+    OutputDebugStringW(L"COutputPin::KsEvent\n");
+
+    if (EventLength)
+        return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned);
+    else
+        return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned);
+}
+
+
+//-------------------------------------------------------------------
+// IKsPropertySet
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::Set(
+    REFGUID guidPropSet,
+    DWORD dwPropID,
+    LPVOID pInstanceData,
+    DWORD cbInstanceData,
+    LPVOID pPropData,
+    DWORD cbPropData)
+{
+    ULONG BytesReturned;
+
+    if (cbInstanceData)
+    {
+        PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData);
+        if (!Property)
+            return E_OUTOFMEMORY;
+
+        Property->Set = guidPropSet;
+        Property->Id = dwPropID;
+        Property->Flags = KSPROPERTY_TYPE_SET;
+
+        CopyMemory((Property+1), pInstanceData, cbInstanceData);
+
+        HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned);
+        CoTaskMemFree(Property);
+        return hr;
+    }
+    else
+    {
+        KSPROPERTY Property;
+
+        Property.Set = guidPropSet;
+        Property.Id = dwPropID;
+        Property.Flags = KSPROPERTY_TYPE_SET;
+
+        HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned);
+        return hr;
+    }
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::Get(
+    REFGUID guidPropSet,
+    DWORD dwPropID,
+    LPVOID pInstanceData,
+    DWORD cbInstanceData,
+    LPVOID pPropData,
+    DWORD cbPropData,
+    DWORD *pcbReturned)
+{
+    ULONG BytesReturned;
+
+    if (cbInstanceData)
+    {
+        PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData);
+        if (!Property)
+            return E_OUTOFMEMORY;
+
+        Property->Set = guidPropSet;
+        Property->Id = dwPropID;
+        Property->Flags = KSPROPERTY_TYPE_GET;
+
+        CopyMemory((Property+1), pInstanceData, cbInstanceData);
+
+        HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned);
+        CoTaskMemFree(Property);
+        return hr;
+    }
+    else
+    {
+        KSPROPERTY Property;
+
+        Property.Set = guidPropSet;
+        Property.Id = dwPropID;
+        Property.Flags = KSPROPERTY_TYPE_GET;
+
+        HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned);
+        return hr;
+    }
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QuerySupported(
+    REFGUID guidPropSet,
+    DWORD dwPropID,
+    DWORD *pTypeSupport)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+
+    OutputDebugStringW(L"COutputPin::QuerySupported\n");
+
+    Property.Set = guidPropSet;
+    Property.Id = dwPropID;
+    Property.Flags = KSPROPERTY_TYPE_SETSUPPORT;
+
+    return KsProperty(&Property, sizeof(KSPROPERTY), pTypeSupport, sizeof(DWORD), &BytesReturned);
+}
+
+
+//-------------------------------------------------------------------
+// IPin interface
+//
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
+{
+    HRESULT hr;
+    ALLOCATOR_PROPERTIES Properties;
+    IMemAllocatorCallbackTemp *pMemCallback;
+    WCHAR Buffer[200];
+
+    OutputDebugStringW(L"COutputPin::Connect called\n");
+    if (pmt)
+    {
+        hr = pReceivePin->QueryAccept(pmt);
+        if (FAILED(hr))
+            return hr;
+    }
+    else
+    {
+        // query accept
+        hr = pReceivePin->QueryAccept(&m_MediaFormat);
+        if (FAILED(hr))
+            return hr;
+
+         pmt = &m_MediaFormat;
+    }
+
+    // query for IMemInput interface
+    hr = pReceivePin->QueryInterface(IID_IMemInputPin, (void**)&m_MemInputPin);
+    if (FAILED(hr))
+    {
+        OutputDebugStringW(L"COutputPin::Connect no IMemInputPin interface\n");
+        DebugBreak();
+        return hr;
+    }
+
+    // get input pin allocator properties
+    ZeroMemory(&Properties, sizeof(ALLOCATOR_PROPERTIES));
+    m_MemInputPin->GetAllocatorRequirements(&Properties);
+
+    //FIXME determine allocator properties
+    Properties.cBuffers = 32;
+    Properties.cbBuffer = 2048 * 188; //2048 frames * MPEG2 TS Payload size
+    Properties.cbAlign = 4;
+
+    // get input pin allocator
+#if 0
+    hr = m_MemInputPin->GetAllocator(&m_MemAllocator);
+    if (SUCCEEDED(hr))
+    {
+        // set allocator properties
+        hr = m_MemAllocator->SetProperties(&Properties, &m_Properties);
+        if (FAILED(hr))
+            m_MemAllocator->Release();
+    }
+#endif
+
+    if (1)
+    {
+        hr = CKsAllocator_Constructor(NULL, IID_IMemAllocator, (void**)&m_MemAllocator);
+        if (FAILED(hr))
+            return hr;
+
+        // set allocator properties
+        hr = m_MemAllocator->SetProperties(&Properties, &m_Properties);
+        if (FAILED(hr))
+        {
+            swprintf(Buffer, L"COutputPin::Connect IMemAllocator::SetProperties failed with hr %lx\n", hr);
+            OutputDebugStringW(Buffer);
+            m_MemAllocator->Release();
+            m_MemInputPin->Release();
+            return hr;
+        }
+    }
+
+    // commit property changes
+    hr = m_MemAllocator->Commit();
+    if (FAILED(hr))
+    {
+        swprintf(Buffer, L"COutputPin::Connect IMemAllocator::Commit failed with hr %lx\n", hr);
+        OutputDebugStringW(Buffer);
+        m_MemAllocator->Release();
+        m_MemInputPin->Release();
+        return hr;
+    }
+
+    // get callback interface
+    hr = m_MemAllocator->QueryInterface(IID_IMemAllocatorCallbackTemp, (void**)&pMemCallback);
+    if (FAILED(hr))
+    {
+        swprintf(Buffer, L"COutputPin::Connect No IMemAllocatorCallbackTemp interface hr %lx\n", hr);
+        OutputDebugStringW(Buffer);
+        m_MemAllocator->Release();
+        m_MemInputPin->Release();
+        return hr;
+    }
+
+    // set notification routine
+    hr = pMemCallback->SetNotify((IMemAllocatorNotifyCallbackTemp*)this);
+
+    // release IMemAllocatorNotifyCallbackTemp interface
+    pMemCallback->Release();
+
+    if (FAILED(hr))
+    {
+        swprintf(Buffer, L"COutputPin::Connect IMemAllocatorNotifyCallbackTemp::SetNotify failed hr %lx\n", hr);
+        OutputDebugStringW(Buffer);
+        m_MemAllocator->Release();
+        m_MemInputPin->Release();
+        return hr;
+    }
+
+    // now set allocator
+    hr = m_MemInputPin->NotifyAllocator(m_MemAllocator, TRUE);
+    if (FAILED(hr))
+    {
+        swprintf(Buffer, L"COutputPin::Connect IMemInputPin::NotifyAllocator failed with hr %lx\n", hr);
+        OutputDebugStringW(Buffer);
+        m_MemAllocator->Release();
+        m_MemInputPin->Release();
+        return hr;
+    }
+
+    if (!m_hPin)
+    {
+        //FIXME create pin handle
+        assert(0);
+    }
+
+    // receive connection;
+    hr = pReceivePin->ReceiveConnection((IPin*)this, pmt);
+    if (SUCCEEDED(hr))
+    {
+        // increment reference count
+        pReceivePin->AddRef();
+        m_Pin = pReceivePin;
+        OutputDebugStringW(L"COutputPin::Connect success\n");
+    }
+    else
+    {
+        m_MemInputPin->Release();
+        m_MemAllocator->Release();
+    }
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt)
+{
+    return E_UNEXPECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::Disconnect( void)
+{
+   OutputDebugStringW(L"COutputPin::Disconnect\n");
+
+    if (!m_Pin)
+    {
+        // pin was not connected
+        return S_FALSE;
+    }
+
+    //FIXME
+    //check if filter is active
+
+    m_Pin->Release();
+    m_Pin = NULL;
+    m_MemInputPin->Release();
+    m_MemAllocator->Release();
+
+    OutputDebugStringW(L"COutputPin::Disconnect\n");
+    return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::ConnectedTo(IPin **pPin)
+{
+   OutputDebugStringW(L"COutputPin::ConnectedTo\n");
+
+    if (!pPin)
+        return E_POINTER;
+
+    if (m_Pin)
+    {
+        // increment reference count
+        m_Pin->AddRef();
+        *pPin = m_Pin;
+        return S_OK;
+    }
+
+    *pPin = NULL;
+    return VFW_E_NOT_CONNECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt)
+{
+    OutputDebugStringW(L"COutputPin::ConnectionMediaType called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryPinInfo(PIN_INFO *pInfo)
+{
+    wcscpy(pInfo->achName, m_PinName);
+    pInfo->dir = PINDIR_OUTPUT;
+    pInfo->pFilter = m_ParentFilter;
+    m_ParentFilter->AddRef();
+
+    return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryDirection(PIN_DIRECTION *pPinDir)
+{
+    if (pPinDir)
+    {
+        *pPinDir = PINDIR_OUTPUT;
+        return S_OK;
+    }
+
+    return E_POINTER;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryId(LPWSTR *Id)
+{
+    *Id = (LPWSTR)CoTaskMemAlloc((wcslen(m_PinName)+1)*sizeof(WCHAR));
+    if (!*Id)
+        return E_OUTOFMEMORY;
+
+    wcscpy(*Id, m_PinName);
+    return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryAccept(const AM_MEDIA_TYPE *pmt)
+{
+    OutputDebugStringW(L"COutputPin::QueryAccept called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
+{
+    HRESULT hr;
+    ULONG MediaTypeCount = 0, Index;
+    AM_MEDIA_TYPE * MediaTypes;
+    HANDLE hFilter;
+
+    if (!m_KsObjectParent)
+    {
+        // no interface
+        return E_NOINTERFACE;
+    }
+
+    // get parent filter handle
+    hFilter = m_KsObjectParent->KsGetObjectHandle();
+
+    // query media type count
+    hr = KsGetMediaTypeCount(hFilter, m_PinId, &MediaTypeCount);
+    if (FAILED(hr) || !MediaTypeCount)
+    {
+        return hr;
+    }
+
+    // allocate media types
+    MediaTypes = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * MediaTypeCount);
+    if (!MediaTypes)
+    {
+        // not enough memory
+        return E_OUTOFMEMORY;
+    }
+
+    // zero media types
+    ZeroMemory(MediaTypes, sizeof(AM_MEDIA_TYPE) * MediaTypeCount);
+
+    for(Index = 0; Index < MediaTypeCount; Index++)
+    {
+        // get media type
+        hr = KsGetMediaType(Index, &MediaTypes[Index], hFilter, m_PinId);
+        if (FAILED(hr))
+        {
+            // failed
+            CoTaskMemFree(MediaTypes);
+            return hr;
+        }
+    }
+
+    return CEnumMediaTypes_fnConstructor(MediaTypeCount, MediaTypes, IID_IEnumMediaTypes, (void**)ppEnum);
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin)
+{
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::EndOfStream( void)
+{
+    /* should be called only on input pins */
+    return E_UNEXPECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::BeginFlush( void)
+{
+    /* should be called only on input pins */
+    return E_UNEXPECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::EndFlush( void)
+{
+    /* should be called only on input pins */
+    return E_UNEXPECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
+{
+    if (!m_Pin)
+    {
+        // we are not connected
+        return VFW_E_NOT_CONNECTED;
+    }
+
+    return m_Pin->NewSegment(tStart, tStop, dRate);
+}
+
+//-------------------------------------------------------------------
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::CheckFormat(
+    const AM_MEDIA_TYPE *pmt)
+{
+    PKSMULTIPLE_ITEM MultipleItem;
+    PKSDATAFORMAT DataFormat;
+    HRESULT hr;
+
+    if (!pmt)
+        return E_POINTER;
+
+    HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle();
+    assert(hFilter != NULL);
+
+    hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem);
+    if (FAILED(hr))
+        return S_FALSE;
+
+    DataFormat = (PKSDATAFORMAT)(MultipleItem + 1);
+    for(ULONG Index = 0; Index < MultipleItem->Count; Index++)
+    {
+        if (IsEqualGUID(pmt->majortype, DataFormat->MajorFormat) &&
+            IsEqualGUID(pmt->subtype, DataFormat->SubFormat) &&
+            IsEqualGUID(pmt->formattype, DataFormat->Specifier))
+        {
+            // format is supported
+            CoTaskMemFree(MultipleItem);
+            return S_OK;
+        }
+        DataFormat = (PKSDATAFORMAT)((ULONG_PTR)DataFormat + DataFormat->FormatSize);
+    }
+    //format is not supported
+    CoTaskMemFree(MultipleItem);
+    return S_FALSE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::CreatePin(
+    const AM_MEDIA_TYPE *pmt)
+{
+    PKSMULTIPLE_ITEM MediumList;
+    PKSMULTIPLE_ITEM InterfaceList;
+    PKSPIN_MEDIUM Medium;
+    PKSPIN_INTERFACE Interface;
+    IKsInterfaceHandler * InterfaceHandler;
+    HRESULT hr;
+
+    // query for pin medium
+    hr = KsQueryMediums(&MediumList);
+    if (FAILED(hr))
+        return hr;
+
+    // query for pin interface
+    hr = KsQueryInterfaces(&InterfaceList);
+    if (FAILED(hr))
+    {
+        // failed
+        CoTaskMemFree(MediumList);
+        return hr;
+    }
+
+    if (MediumList->Count)
+    {
+        //use first available medium
+        Medium = (PKSPIN_MEDIUM)(MediumList + 1);
+    }
+    else
+    {
+        // default to standard medium
+        Medium = &StandardPinMedium;
+    }
+
+    if (InterfaceList->Count)
+    {
+        //use first available interface
+        Interface = (PKSPIN_INTERFACE)(InterfaceList + 1);
+    }
+    else
+    {
+        // default to standard interface
+        Interface = &StandardPinInterface;
+    }
+
+    if (m_Communication != KSPIN_COMMUNICATION_BRIDGE && m_Communication != KSPIN_COMMUNICATION_NONE)
+    {
+        // now create pin
+        hr = CreatePinHandle(Medium, Interface, pmt);
+        if (FAILED(hr))
+        {
+            m_InterfaceHandler->Release();
+            m_InterfaceHandler = InterfaceHandler;
+        }
+
+        if (!m_InterfaceHandler)
+        {
+            // now load the IKsInterfaceHandler plugin
+            hr = CoCreateInstance(Interface->Set, NULL, CLSCTX_INPROC_SERVER, IID_IKsInterfaceHandler, (void**)&InterfaceHandler);
+            if (FAILED(hr))
+            {
+                // failed to load interface handler plugin
+                CoTaskMemFree(MediumList);
+                CoTaskMemFree(InterfaceList);
+
+                return hr;
+            }
+
+            // now set the pin
+            hr = InterfaceHandler->KsSetPin((IKsPin*)this);
+            if (FAILED(hr))
+            {
+                // failed to load interface handler plugin
+                InterfaceHandler->Release();
+                CoTaskMemFree(MediumList);
+                CoTaskMemFree(InterfaceList);
+                return hr;
+            }
+
+            // store interface handler
+            m_InterfaceHandler = InterfaceHandler;
+        }
+    }
+    else
+    {
+        WCHAR Buffer[100];
+        swprintf(Buffer, L"COutputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName);
+        OutputDebugStringW(Buffer);
+        DebugBreak();
+        hr = E_FAIL;
+    }
+
+    // free medium / interface / dataformat
+    CoTaskMemFree(MediumList);
+    CoTaskMemFree(InterfaceList);
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin::CreatePinHandle(
+    PKSPIN_MEDIUM Medium,
+    PKSPIN_INTERFACE Interface,
+    const AM_MEDIA_TYPE *pmt)
+{
+    PKSPIN_CONNECT PinConnect;
+    PKSDATAFORMAT DataFormat;
+    ULONG Length;
+    HRESULT hr;
+    //KSALLOCATOR_FRAMING Framing;
+    //KSPROPERTY Property;
+    //ULONG BytesReturned;
+
+    if (m_hPin != INVALID_HANDLE_VALUE)
+    {
+        // pin already exists
+        //CloseHandle(m_hPin);
+        //m_hPin = INVALID_HANDLE_VALUE;
+        return S_OK;
+    }
+
+
+    // calc format size
+    Length = sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT) + pmt->cbFormat;
+
+    // allocate pin connect
+    PinConnect = (PKSPIN_CONNECT)CoTaskMemAlloc(Length);
+    if (!PinConnect)
+    {
+        // failed
+        return E_OUTOFMEMORY;
+    }
+
+    // setup request
+    CopyMemory(&PinConnect->Interface, Interface, sizeof(KSPIN_INTERFACE));
+    CopyMemory(&PinConnect->Medium, Medium, sizeof(KSPIN_MEDIUM));
+    PinConnect->PinId = m_PinId;
+    PinConnect->PinToHandle = NULL;
+    PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL;
+    PinConnect->Priority.PrioritySubClass = KSPRIORITY_NORMAL;
+
+    // get dataformat offset
+    DataFormat = (PKSDATAFORMAT)(PinConnect + 1);
+
+    // copy data format
+    DataFormat->FormatSize = sizeof(KSDATAFORMAT) + pmt->cbFormat;
+    DataFormat->Flags = 0;
+    DataFormat->SampleSize = pmt->lSampleSize;
+    DataFormat->Reserved = 0;
+    CopyMemory(&DataFormat->MajorFormat, &pmt->majortype, sizeof(GUID));
+    CopyMemory(&DataFormat->SubFormat,  &pmt->subtype, sizeof(GUID));
+    CopyMemory(&DataFormat->Specifier, &pmt->formattype, sizeof(GUID));
+
+    if (pmt->cbFormat)
+    {
+        // copy extended format
+        CopyMemory((DataFormat + 1), pmt->pbFormat, pmt->cbFormat);
+    }
+
+    HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle();
+    assert(hFilter != NULL);
+
+    // create pin
+    hr = KsCreatePin(hFilter, PinConnect, GENERIC_READ, &m_hPin);
+
+    if (SUCCEEDED(hr))
+    {
+        // store current interface / medium
+        CopyMemory(&m_Medium, Medium, sizeof(KSPIN_MEDIUM));
+        CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE));
+        CopyMemory(&m_MediaFormat, pmt, sizeof(AM_MEDIA_TYPE));
+
+        LPOLESTR pMajor, pSub, pFormat;
+        StringFromIID(m_MediaFormat.majortype, &pMajor);
+        StringFromIID(m_MediaFormat.subtype , &pSub);
+        StringFromIID(m_MediaFormat.formattype, &pFormat);
+        WCHAR Buffer[200];
+        swprintf(Buffer, L"COutputPin::CreatePinHandle Major %s SubType %s Format %s pbFormat %p cbFormat %u\n", pMajor, pSub, pFormat, pmt->pbFormat, pmt->cbFormat);
+        CoTaskMemFree(pMajor);
+        CoTaskMemFree(pSub);
+        CoTaskMemFree(pFormat);
+        OutputDebugStringW(Buffer);
+
+        if (pmt->cbFormat)
+        {
+            m_MediaFormat.pbFormat = (BYTE*)CoTaskMemAlloc(pmt->cbFormat);
+            if (!m_MediaFormat.pbFormat)
+            {
+                CoTaskMemFree(PinConnect);
+                m_MediaFormat.pbFormat = NULL;
+                m_MediaFormat.cbFormat = 0;
+                return E_OUTOFMEMORY;
+            }
+            CopyMemory(m_MediaFormat.pbFormat, pmt->pbFormat, pmt->cbFormat);
+        }
+#if 0
+        Property.Set = KSPROPSETID_Connection;
+        Property.Id = KSPROPERTY_CONNECTION_ALLOCATORFRAMING;
+        Property.Flags = KSPROPERTY_TYPE_GET;
+
+        ZeroMemory(&Framing, sizeof(KSALLOCATOR_FRAMING));
+        hr = KsProperty(&Property, sizeof(KSPROPERTY), (PVOID)&Framing, sizeof(KSALLOCATOR_FRAMING), &BytesReturned);
+        if (SUCCEEDED(hr))
+        {
+            m_Properties.cbAlign = (Framing.FileAlignment + 1);
+            m_Properties.cbBuffer = Framing.FrameSize;
+            m_Properties.cbPrefix = 0; //FIXME
+            m_Properties.cBuffers = Framing.Frames;
+        }
+        hr = S_OK;
+#endif
+
+        if (FAILED(InitializeIOThread()))
+        {
+            OutputDebugStringW(L"COutputPin::CreatePinHandle failed to initialize i/o thread\n");
+            DebugBreak();
+        }
+
+        //TODO
+        // connect pin pipes
+
+    }
+    // free pin connect
+     CoTaskMemFree(PinConnect);
+
+    return hr;
+}
+
+HRESULT
+WINAPI
+COutputPin::IoProcessRoutine()
+{
+    IMediaSample *Sample;
+    LONG SampleCount;
+    HRESULT hr;
+    PKSSTREAM_SEGMENT StreamSegment;
+    HANDLE hEvent;
+    WCHAR Buffer[100];
+    IMediaSample * Samples[1];
+
+    // first wait for the start event to signal
+    WaitForSingleObject(m_hStartEvent, INFINITE);
+
+    assert(m_InterfaceHandler);
+    REFERENCE_TIME Start = 0;
+    REFERENCE_TIME Stop = 1;
+    do
+    {
+        if (m_StopInProgress)
+        {
+            // stop io thread
+            break;
+        }
+
+        // get buffer
+        hr = m_MemAllocator->GetBuffer(&Sample, NULL, NULL, AM_GBF_NOWAIT);
+
+        if (FAILED(hr))
+        {
+            OutputDebugStringW(L"OutOfSamples\n");
+            m_Pin->BeginFlush();
+            WaitForSingleObject(m_hBufferAvailable, INFINITE);
+            m_Pin->EndFlush();
+            OutputDebugStringW(L"After Wait OutOfSamples\n");
+            // now retry again
+            continue;
+        }
+
+        // fill buffer
+        SampleCount = 1;
+        Samples[0] = Sample;
+
+        Sample->SetTime(NULL, NULL);
+        hr = m_InterfaceHandler->KsProcessMediaSamples(NULL, /* FIXME */
+                                                       Samples,
+                                                       &SampleCount,
+                                                       KsIoOperation_Read,
+                                                       &StreamSegment);
+        if (FAILED(hr) || !StreamSegment)
+        {
+            swprintf(Buffer, L"COutputPin::IoProcessRoutine KsProcessMediaSamples FAILED PinName %s hr %lx\n", m_PinName, hr);
+            OutputDebugStringW(Buffer);
+            SetEvent(m_hStopEvent);
+            m_IoThreadStarted = false;
+            ExitThread(0);
+        }
+
+        // get completion event
+        hEvent = StreamSegment->CompletionEvent;
+
+        // wait for i/o completion
+        WaitForSingleObject(hEvent, INFINITE);
+
+        // perform completion
+        m_InterfaceHandler->KsCompleteIo(StreamSegment);
+
+        // close completion event
+        CloseHandle(hEvent);
+
+        if (SUCCEEDED(hr))
+        {
+            LONG Length = Sample->GetActualDataLength();
+            Stop += Length;
+           // Sample->SetMediaTime(&Start, &Stop);
+            Start = Stop;
+
+            // now deliver the sample
+            hr = m_MemInputPin->Receive(Sample);
+
+            swprintf(Buffer, L"COutputPin::IoProcessRoutine PinName %s IMemInputPin::Receive hr %lx Sample %p m_MemAllocator %p\n", m_PinName, hr, Sample, m_MemAllocator);
+            OutputDebugStringW(Buffer);
+             if (FAILED(hr))
+                                DebugBreak();
+            Sample = NULL;
+        }
+    }while(TRUE);
+
+    // signal end of i/o thread
+    SetEvent(m_hStopEvent);
+
+    m_IoThreadStarted = false;
+
+    return NOERROR;
+}
+
+DWORD
+WINAPI
+COutputPin_IoThreadStartup(
+    LPVOID lpParameter)
+{
+    COutputPin * Pin = (COutputPin*)lpParameter;
+    assert(Pin);
+
+    return Pin->IoProcessRoutine();
+}
+
+
+HRESULT
+WINAPI
+COutputPin::InitializeIOThread()
+{
+    HANDLE hThread;
+
+    if (m_IoThreadStarted)
+        return NOERROR;
+
+    if (!m_hStartEvent)
+        m_hStartEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+    else
+        ResetEvent(m_hStartEvent);
+
+    if (!m_hStartEvent)
+        return E_OUTOFMEMORY;
+
+    if (!m_hStopEvent)
+        m_hStopEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+    else
+        ResetEvent(m_hStopEvent);
+
+    if (!m_hStopEvent)
+        return E_OUTOFMEMORY;
+
+    if (!m_hBufferAvailable)
+        m_hBufferAvailable = CreateEventW(NULL, FALSE, FALSE, NULL);
+    else
+        ResetEvent(m_hBufferAvailable);
+
+    if (!m_hBufferAvailable)
+        return E_OUTOFMEMORY;
+
+    m_StopInProgress = false;
+    m_IoThreadStarted = true;
+
+    // now create the startup thread
+    hThread = CreateThread(NULL, 0, COutputPin_IoThreadStartup, (LPVOID)this, 0, NULL);
+    if (!hThread)
+        return E_OUTOFMEMORY;
+
+
+    // close thread handle
+    CloseHandle(hThread);
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin_SetState(
+    IPin * Pin,
+    KSSTATE State)
+{
+    HRESULT hr = S_OK;
+    KSPROPERTY Property;
+    KSSTATE CurState;
+    WCHAR Buffer[100];
+    ULONG BytesReturned;
+
+    COutputPin * pPin = (COutputPin*)Pin;
+
+
+    Property.Set = KSPROPSETID_Connection;
+    Property.Id = KSPROPERTY_CONNECTION_STATE;
+    Property.Flags = KSPROPERTY_TYPE_SET;
+
+
+    if (pPin->m_State < State)
+    {
+        if (pPin->m_State == KSSTATE_STOP)
+        {
+            CurState = KSSTATE_ACQUIRE;
+            hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+            swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_ACQUIRE PinName %s hr %lx\n", pPin->m_PinName, hr);
+            OutputDebugStringW(Buffer);
+            if (FAILED(hr))
+                return hr;
+
+            pPin->m_State = CurState;
+
+            if (pPin->m_State == State)
+                return hr;
+        }
+        if (pPin->m_State == KSSTATE_ACQUIRE)
+        {
+            CurState = KSSTATE_PAUSE;
+            hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+            swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_PAUSE PinName %s hr %lx\n", pPin->m_PinName, hr);
+            OutputDebugStringW(Buffer);
+            if (FAILED(hr))
+                return hr;
+
+            pPin->m_State = CurState;
+
+            if (pPin->m_State == State)
+                return hr;
+        }
+
+        CurState = KSSTATE_RUN;
+        hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+        swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_RUN PinName %s hr %lx\n", pPin->m_PinName, hr);
+        OutputDebugStringW(Buffer);
+        if (FAILED(hr))
+            return hr;
+
+        // signal start event
+        SetEvent(pPin->m_hStartEvent);
+
+
+        pPin->m_State = CurState;
+        return hr;
+    }
+    else
+    {
+        if (pPin->m_State == KSSTATE_RUN)
+        {
+            CurState = KSSTATE_PAUSE;
+            hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+            swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_PAUSE PinName %u hr %lx\n", pPin->m_PinName, hr);
+            OutputDebugStringW(Buffer);
+            if (FAILED(hr))
+                return hr;
+
+            pPin->m_State = CurState;
+
+            if (pPin->m_State == State)
+                return hr;
+        }
+        if (pPin->m_State == KSSTATE_PAUSE)
+        {
+            CurState = KSSTATE_ACQUIRE;
+            hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+            swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_ACQUIRE PinName %u hr %lx\n", pPin->m_PinName, hr);
+            OutputDebugStringW(Buffer);
+            if (FAILED(hr))
+                return hr;
+
+            pPin->m_State = CurState;
+
+            if (pPin->m_State == State)
+                return hr;
+        }
+
+        // setting pending stop flag
+        pPin->m_StopInProgress = true;
+
+        CurState = KSSTATE_STOP;
+        hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned);
+
+        swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_STOP PinName %s hr %lx\n", pPin->m_PinName, hr);
+        OutputDebugStringW(Buffer);
+        if (FAILED(hr))
+            return hr;
+
+        // release any waiting threads
+        SetEvent(pPin->m_hBufferAvailable);
+
+        // wait until i/o thread is done
+        WaitForSingleObject(pPin->m_hStopEvent, INFINITE);
+
+        pPin->m_State = CurState;
+        return hr;
+    }
+}
+
+
+HRESULT
+WINAPI
+COutputPin_Constructor(
+    IBaseFilter * ParentFilter,
+    LPCWSTR PinName,
+    ULONG PinId,
+    KSPIN_COMMUNICATION Communication,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    COutputPin * handler = new COutputPin(ParentFilter, PinName, PinId, Communication);
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return S_OK;
+}
diff --git a/reactos/dll/directx/ksproxy/precomp.h b/reactos/dll/directx/ksproxy/precomp.h
new file mode 100644 (file)
index 0000000..c02b6ad
--- /dev/null
@@ -0,0 +1,203 @@
+#pragma once
+
+#define _FORCENAMELESSUNION
+#define BUILDING_KS
+#define _KSDDK_
+#include <dshow.h>
+//#include <streams.h>
+#include <ks.h>
+#define __STREAMS__
+#include <ksproxy.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <tchar.h>
+#include <uuids.h>
+#include <dvp.h>
+#include <vptype.h>
+#include <vpconfig.h>
+#include <setupapi.h>
+#include <stdio.h>
+#include <vector>
+#include <stack>
+#include <list>
+#include <assert.h>
+#include <ksmedia.h>
+//#include <debug.h>
+
+
+interface DECLSPEC_UUID("877E4351-6FEA-11D0-B863-00AA00A216A1") IKsClock;
+
+#undef INTERFACE
+#define INTERFACE IKsClock
+
+DECLARE_INTERFACE_(IKsClock, IUnknown)
+{
+    STDMETHOD_(HANDLE, KsGetClockHandle)(
+        THIS
+    ) PURE;
+};
+
+
+typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
+
+typedef struct {
+    const GUID* riid;
+    LPFNCREATEINSTANCE lpfnCI;
+} INTERFACE_TABLE;
+
+/* classfactory.cpp */
+
+IClassFactory *
+CClassFactory_fnConstructor(
+    LPFNCREATEINSTANCE lpfnCI, 
+    PLONG pcRefDll,
+    IID * riidInst);
+
+/* datatype.cpp */
+HRESULT
+WINAPI
+CKsDataTypeHandler_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* interface.cpp */
+HRESULT
+WINAPI
+CKsInterfaceHandler_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* clockforward.cpp */
+HRESULT
+WINAPI
+CKsClockForwarder_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* qualityforward.cpp */
+HRESULT
+WINAPI
+CKsQualityForwarder_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* cvpconfig.cpp */
+HRESULT
+WINAPI
+CVPConfig_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* cvpvbiconfig.cpp */
+HRESULT
+WINAPI
+CVPVBIConfig_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* basicaudio.cpp */
+HRESULT
+WINAPI
+CKsBasicAudio_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* proxy.cpp */
+HRESULT
+WINAPI
+CKsProxy_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* input_pin.cpp */
+HRESULT
+WINAPI
+CInputPin_Constructor(
+    IBaseFilter * ParentFilter,
+    LPCWSTR PinName,
+    HANDLE hFilter,
+    ULONG PinId,
+    KSPIN_COMMUNICATION Communication,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* output_pin.cpp */
+HRESULT
+WINAPI
+COutputPin_Constructor(
+    IBaseFilter * ParentFilter,
+    LPCWSTR PinName,
+    ULONG PinId,
+    KSPIN_COMMUNICATION Communication,
+    REFIID riid,
+    LPVOID * ppv);
+
+HRESULT
+STDMETHODCALLTYPE
+COutputPin_SetState(
+    IPin * Pin,
+    KSSTATE State);
+
+/* enumpins.cpp */
+HRESULT
+WINAPI
+CEnumPins_fnConstructor(
+    std::vector<IPin*> Pins,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* enum_mediatypes.cpp */
+HRESULT
+WINAPI
+CEnumMediaTypes_fnConstructor(
+    ULONG MediaTypeCount,
+    AM_MEDIA_TYPE * MediaTypes,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* node.cpp */
+HRESULT
+WINAPI
+CKsNode_Constructor(
+    IUnknown * pUnkOuter,
+    HANDLE ParentHandle,
+    ULONG NodeId,
+    ACCESS_MASK DesiredAccess,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* allocator.cpp */
+HRESULT
+WINAPI
+CKsAllocator_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* mediasample.cpp */
+HRESULT
+WINAPI
+CMediaSample_Constructor(
+    IMemAllocator* Allocator, 
+    BYTE* pBuffer,
+    ULONG BufferSize,
+    REFIID riid,
+    LPVOID * ppv);
+
+
+extern const GUID IID_IKsObject;
+extern const GUID IID_IKsPinEx;
+extern const GUID IID_IKsAggregateControl;
+extern const GUID IID_IKsPinPipe;
+extern const GUID IID_IKsPinFactory;
+extern const GUID IID_IKsAllocatorEx;
+extern KSPIN_INTERFACE StandardPinInterface;
+extern KSPIN_MEDIUM StandardPinMedium;
diff --git a/reactos/dll/directx/ksproxy/proxy.cpp b/reactos/dll/directx/ksproxy/proxy.cpp
new file mode 100644 (file)
index 0000000..41d543f
--- /dev/null
@@ -0,0 +1,2926 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/proxy.cpp
+ * PURPOSE:         IKsProxy interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+#ifndef _MSC_VER
+const GUID IID_IPersistPropertyBag = {0x37D84F60, 0x42CB, 0x11CE, {0x81, 0x35, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51}};
+const GUID GUID_NULL                     = {0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+const GUID IID_ISpecifyPropertyPages = {0xB196B28B, 0xBAB4, 0x101A, {0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}};
+const GUID IID_IPersistStream = {0x00000109, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+const GUID KSPROPSETID_MediaSeeking = {0xEE904F0CL, 0xD09B, 0x11D0, {0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
+const GUID KSPROPSETID_Clock = {0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
+const GUID KSEVENTSETID_Clock = {0x364D8E20L, 0x62C7, 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 IID_IPersist = {0x0000010c, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+#endif
+
+const GUID IID_IBDA_DeviceControl = {0xFD0A5AF3, 0xB41D, 0x11d2, {0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0}};
+const GUID IID_IKsAggregateControl = {0x7F40EAC0, 0x3947, 0x11D2, {0x87, 0x4E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
+const GUID IID_IKsClockPropertySet = {0x5C5CBD84, 0xE755, 0x11D0, {0xAC, 0x18, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
+const GUID IID_IKsTopology             = {0x28F54683, 0x06FD, 0x11D2, {0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
+const GUID IID_IKsClock            = {0x877E4351, 0x6FEA, 0x11D0, {0xB8, 0x63, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xA1}};
+/*
+    Needs IKsClock, IKsNotifyEvent
+*/
+
+class CKsProxy : public IBaseFilter,
+                 public IAMovieSetup,
+                 public IPersistPropertyBag,
+                 public IKsObject,
+                 public IPersistStream,
+                 public IAMDeviceRemoval,
+                 public ISpecifyPropertyPages,
+                 public IReferenceClock,
+                 public IMediaSeeking,
+                 public IKsPropertySet,
+                 public IKsClock,
+                 public IKsClockPropertySet,
+                 public IAMFilterMiscFlags,
+                 public IKsControl,
+                 public IKsTopology,
+                 public IKsAggregateControl
+
+{
+public:
+    typedef std::vector<IUnknown *>ProxyPluginVector;
+    typedef std::vector<IPin *> PinVector;
+
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IBaseFilter methods
+    HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
+    HRESULT STDMETHODCALLTYPE Stop( void);
+    HRESULT STDMETHODCALLTYPE Pause( void);
+    HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
+    HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *State);
+    HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock);
+    HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **pClock);
+    HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum);
+    HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin);
+    HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo);
+    HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName);
+    HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo);
+
+    //IReferenceClock
+    HRESULT STDMETHODCALLTYPE GetTime(REFERENCE_TIME *pTime);
+    HRESULT STDMETHODCALLTYPE AdviseTime(REFERENCE_TIME baseTime, REFERENCE_TIME streamTime, HEVENT hEvent, DWORD_PTR *pdwAdviseCookie);
+    HRESULT STDMETHODCALLTYPE AdvisePeriodic(REFERENCE_TIME startTime, REFERENCE_TIME periodTime, HSEMAPHORE hSemaphore, DWORD_PTR *pdwAdviseCookie);
+    HRESULT STDMETHODCALLTYPE Unadvise(DWORD_PTR dwAdviseCookie);
+
+    //IMediaSeeking
+    HRESULT STDMETHODCALLTYPE GetCapabilities(DWORD *pCapabilities);
+    HRESULT STDMETHODCALLTYPE CheckCapabilities(DWORD *pCapabilities);
+    HRESULT STDMETHODCALLTYPE IsFormatSupported(const GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE QueryPreferredFormat(GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE GetTimeFormat(GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE IsUsingTimeFormat(const GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE SetTimeFormat(const GUID *pFormat);
+    HRESULT STDMETHODCALLTYPE GetDuration(LONGLONG *pDuration);
+    HRESULT STDMETHODCALLTYPE GetStopPosition(LONGLONG *pStop);
+    HRESULT STDMETHODCALLTYPE GetCurrentPosition(LONGLONG *pCurrent);
+    HRESULT STDMETHODCALLTYPE ConvertTimeFormat(LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat);
+    HRESULT STDMETHODCALLTYPE SetPositions(LONGLONG *pCurrent, DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags);
+    HRESULT STDMETHODCALLTYPE GetPositions(LONGLONG *pCurrent, LONGLONG *pStop);
+    HRESULT STDMETHODCALLTYPE GetAvailable(LONGLONG *pEarliest, LONGLONG *pLatest);
+    HRESULT STDMETHODCALLTYPE SetRate(double dRate);
+    HRESULT STDMETHODCALLTYPE GetRate(double *pdRate);
+    HRESULT STDMETHODCALLTYPE GetPreroll(LONGLONG *pllPreroll);
+
+    //IKsPropertySet
+    HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData);
+    HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData, DWORD *pcbReturned);
+    HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD *pTypeSupport);
+
+    //IAMFilterMiscFlags
+    ULONG STDMETHODCALLTYPE GetMiscFlags( void);
+
+    //IKsControl
+    HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned);
+    HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned);
+    HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned);
+
+    //IKsTopolology
+    HRESULT STDMETHODCALLTYPE CreateNodeInstance(ULONG NodeId, ULONG Flags, ACCESS_MASK DesiredAccess, IUnknown* UnkOuter, REFGUID InterfaceId, LPVOID* Interface);
+
+    //IKsAggregateControl
+    HRESULT STDMETHODCALLTYPE KsAddAggregate(IN REFGUID AggregateClass);
+    HRESULT STDMETHODCALLTYPE KsRemoveAggregate(REFGUID AggregateClass);
+
+    //IKsClockPropertySet
+    HRESULT STDMETHODCALLTYPE KsGetTime(LONGLONG* Time);
+    HRESULT STDMETHODCALLTYPE KsSetTime(LONGLONG Time);
+    HRESULT STDMETHODCALLTYPE KsGetPhysicalTime(LONGLONG* Time);
+    HRESULT STDMETHODCALLTYPE KsSetPhysicalTime(LONGLONG Time);
+    HRESULT STDMETHODCALLTYPE KsGetCorrelatedTime(KSCORRELATED_TIME* CorrelatedTime);
+    HRESULT STDMETHODCALLTYPE KsSetCorrelatedTime(KSCORRELATED_TIME* CorrelatedTime);
+    HRESULT STDMETHODCALLTYPE KsGetCorrelatedPhysicalTime(KSCORRELATED_TIME* CorrelatedTime);
+    HRESULT STDMETHODCALLTYPE KsSetCorrelatedPhysicalTime(KSCORRELATED_TIME* CorrelatedTime);
+    HRESULT STDMETHODCALLTYPE KsGetResolution(KSRESOLUTION* Resolution);
+    HRESULT STDMETHODCALLTYPE KsGetState(KSSTATE* State);
+
+
+    //IAMovieSetup methods
+    HRESULT STDMETHODCALLTYPE Register( void);
+    HRESULT STDMETHODCALLTYPE Unregister( void);
+
+    // IPersistPropertyBag methods
+    HRESULT STDMETHODCALLTYPE InitNew( void);
+    HRESULT STDMETHODCALLTYPE Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog);
+    HRESULT STDMETHODCALLTYPE Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties);
+
+    // IKsObject
+    HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
+
+    // IKsClock
+    HANDLE STDMETHODCALLTYPE KsGetClockHandle();
+
+    //IAMDeviceRemoval
+    HRESULT STDMETHODCALLTYPE DeviceInfo(CLSID *pclsidInterfaceClass, LPWSTR *pwszSymbolicLink);
+    HRESULT STDMETHODCALLTYPE Reassociate(void);
+    HRESULT STDMETHODCALLTYPE Disassociate( void);
+
+    //IPersistStream
+    HRESULT STDMETHODCALLTYPE IsDirty( void);
+    HRESULT STDMETHODCALLTYPE Load(IStream *pStm);
+    HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty);
+    HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize);
+
+    // ISpecifyPropertyPages
+    HRESULT STDMETHODCALLTYPE GetPages(CAUUID *pPages);
+
+
+    CKsProxy() : m_Ref(0), m_pGraph(0), m_ReferenceClock((IReferenceClock*)this), m_FilterState(State_Stopped), m_hDevice(0), m_Plugins(), m_Pins(), m_DevicePath(0), m_hClock(0) {};
+    ~CKsProxy()
+    {
+        if (m_hDevice)
+            CloseHandle(m_hDevice);
+    };
+
+    HRESULT STDMETHODCALLTYPE GetSupportedSets(LPGUID * pOutGuid, PULONG NumGuids);
+    HRESULT STDMETHODCALLTYPE LoadProxyPlugins(LPGUID pGuids, ULONG NumGuids);
+    HRESULT STDMETHODCALLTYPE GetNumberOfPins(PULONG NumPins);
+    HRESULT STDMETHODCALLTYPE GetPinInstanceCount(ULONG PinId, PKSPIN_CINSTANCES Instances);
+    HRESULT STDMETHODCALLTYPE GetPinDataflow(ULONG PinId, KSPIN_DATAFLOW * DataFlow);
+    HRESULT STDMETHODCALLTYPE GetPinName(ULONG PinId, KSPIN_DATAFLOW DataFlow, ULONG PinCount, LPWSTR * OutPinName);
+    HRESULT STDMETHODCALLTYPE GetPinCommunication(ULONG PinId, KSPIN_COMMUNICATION * Communication);
+    HRESULT STDMETHODCALLTYPE CreatePins();
+    HRESULT STDMETHODCALLTYPE GetMediaSeekingFormats(PKSMULTIPLE_ITEM *FormatList);
+    HRESULT STDMETHODCALLTYPE CreateClockInstance();
+    HRESULT STDMETHODCALLTYPE PerformClockProperty(ULONG PropertyId, ULONG PropertyFlags, PVOID OutputBuffer, ULONG OutputBufferSize);
+    HRESULT STDMETHODCALLTYPE SetPinState(KSSTATE State);
+
+
+protected:
+    LONG m_Ref;
+    IFilterGraph *m_pGraph;
+    IReferenceClock * m_ReferenceClock;
+    FILTER_STATE m_FilterState;
+    HANDLE m_hDevice;
+    ProxyPluginVector m_Plugins;
+    PinVector m_Pins;
+    LPWSTR m_DevicePath;
+    CLSID m_DeviceInterfaceGUID;
+    HANDLE m_hClock;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+
+    if (IsEqualGUID(refiid, IID_IUnknown) ||
+        IsEqualGUID(refiid, IID_IBaseFilter))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IPersistPropertyBag))
+    {
+        *Output = (IPersistPropertyBag*)(this);
+        reinterpret_cast<IPersistPropertyBag*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IAMDeviceRemoval))
+    {
+        *Output = (IAMDeviceRemoval*)(this);
+        reinterpret_cast<IAMDeviceRemoval*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IPersistStream))
+    {
+        *Output = (IPersistStream*)(this);
+        reinterpret_cast<IPersistStream*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IPersist))
+    {
+        *Output = (IPersistStream*)(this);
+        reinterpret_cast<IPersist*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsObject))
+    {
+        *Output = (IKsObject*)(this);
+        reinterpret_cast<IKsObject*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsClock))
+    {
+        *Output = (IKsClock*)(this);
+        reinterpret_cast<IKsClock*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IReferenceClock))
+    {
+        if (!m_hClock)
+        {
+            HRESULT hr = CreateClockInstance();
+            if (FAILED(hr))
+                return hr;
+        }
+
+        *Output = (IReferenceClock*)(this);
+        reinterpret_cast<IReferenceClock*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IMediaSeeking))
+    {
+        *Output = (IMediaSeeking*)(this);
+        reinterpret_cast<IMediaSeeking*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IAMFilterMiscFlags))
+    {
+        *Output = (IAMFilterMiscFlags*)(this);
+        reinterpret_cast<IAMFilterMiscFlags*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsControl))
+    {
+        *Output = (IKsControl*)(this);
+        reinterpret_cast<IKsControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsPropertySet))
+    {
+        *Output = (IKsPropertySet*)(this);
+        reinterpret_cast<IKsPropertySet*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsTopology))
+    {
+        *Output = (IKsTopology*)(this);
+        reinterpret_cast<IKsTopology*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsAggregateControl))
+    {
+        *Output = (IKsAggregateControl*)(this);
+        reinterpret_cast<IKsAggregateControl*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_IKsClockPropertySet))
+    {
+        if (!m_hClock)
+        {
+            HRESULT hr = CreateClockInstance();
+            if (FAILED(hr))
+                return hr;
+        }
+
+        *Output = (IKsClockPropertySet*)(this);
+        reinterpret_cast<IKsClockPropertySet*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    else if (IsEqualGUID(refiid, IID_ISpecifyPropertyPages))
+    {
+        *Output = (ISpecifyPropertyPages*)(this);
+        reinterpret_cast<ISpecifyPropertyPages*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    for(ULONG Index = 0; Index < m_Plugins.size(); Index++)
+    {
+        if (m_Pins[Index])
+        {
+            HRESULT hr = m_Plugins[Index]->QueryInterface(refiid, Output);
+            if (SUCCEEDED(hr))
+            {
+                WCHAR Buffer[100];
+                LPOLESTR lpstr;
+                StringFromCLSID(refiid, &lpstr);
+                swprintf(Buffer, L"CKsProxy::QueryInterface plugin %lu supports interface %s\n", Index, lpstr);
+                OutputDebugStringW(Buffer);
+                CoTaskMemFree(lpstr);
+                return hr;
+            }
+        }
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CKsProxy::QueryInterface: NoInterface for %s !!!\n", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// ISpecifyPropertyPages
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPages(CAUUID *pPages)
+{
+    OutputDebugStringW(L"CKsProxy::GetPages NotImplemented\n");
+
+    if (!pPages)
+        return E_POINTER;
+
+    pPages->cElems = 0;
+    pPages->pElems = NULL;
+
+    return S_OK;
+}
+
+//-------------------------------------------------------------------
+// IKsClockPropertySet interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::CreateClockInstance()
+{
+    HRESULT hr;
+    HANDLE hPin = INVALID_HANDLE_VALUE;
+    ULONG Index;
+    PIN_DIRECTION PinDir;
+    IKsObject *pObject;
+    KSCLOCK_CREATE ClockCreate;
+
+    // find output pin and handle
+    for(Index = 0; Index < m_Pins.size(); Index++)
+    {
+        //get pin
+        IPin * pin = m_Pins[Index];
+        if (!pin)
+            continue;
+
+        // get direction
+        hr = pin->QueryDirection(&PinDir);
+        if (FAILED(hr))
+            continue;
+
+        // query IKsObject interface
+        hr = pin->QueryInterface(IID_IKsObject, (void**)&pObject);
+        if (FAILED(hr))
+            continue;
+
+
+        // get pin handle
+        hPin = pObject->KsGetObjectHandle();
+
+        //release IKsObject
+        pObject->Release();
+
+        if (hPin != INVALID_HANDLE_VALUE)
+            break;
+    }
+
+    if (hPin == INVALID_HANDLE_VALUE)
+    {
+        // clock can only be instantiated on a pin handle
+        return E_NOTIMPL;
+    }
+
+    if (m_hClock)
+    {
+        // release clock handle
+        CloseHandle(m_hClock);
+    }
+
+    //setup clock create request
+    ClockCreate.CreateFlags = 0;
+
+    // setup clock create request
+    hr = KsCreateClock(hPin, &ClockCreate, &m_hClock); // FIXME KsCreateClock returns NTSTATUS
+    if (SUCCEEDED(hr))
+    {
+        // failed to create clock
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::PerformClockProperty(
+    ULONG PropertyId,
+    ULONG PropertyFlags,
+    PVOID OutputBuffer,
+    ULONG OutputBufferSize)
+{
+    KSPROPERTY Property;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    if (!m_hClock)
+    {
+        // create clock
+        hr = CreateClockInstance();
+        if (FAILED(hr))
+            return hr;
+    }
+
+    // setup request
+    Property.Set = KSPROPSETID_Clock;
+    Property.Id = PropertyId;
+    Property.Flags = PropertyFlags;
+
+    hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)OutputBuffer, OutputBufferSize, &BytesReturned);
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsGetTime(
+    LONGLONG* Time)
+{
+    OutputDebugStringW(L"CKsProxy::KsGetTime\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_TIME, KSPROPERTY_TYPE_GET, (PVOID)Time, sizeof(LONGLONG));
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsSetTime(
+    LONGLONG Time)
+{
+    OutputDebugStringW(L"CKsProxy::KsSetTime\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_TIME, KSPROPERTY_TYPE_SET, (PVOID)&Time, sizeof(LONGLONG));
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsGetPhysicalTime(
+    LONGLONG* Time)
+{
+    OutputDebugStringW(L"CKsProxy::KsGetPhysicalTime\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_PHYSICALTIME, KSPROPERTY_TYPE_GET, (PVOID)Time, sizeof(LONGLONG));
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsSetPhysicalTime(
+    LONGLONG Time)
+{
+    OutputDebugStringW(L"CKsProxy::KsSetPhysicalTime\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_PHYSICALTIME, KSPROPERTY_TYPE_SET, (PVOID)&Time, sizeof(LONGLONG));
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsGetCorrelatedTime(
+    KSCORRELATED_TIME* CorrelatedTime)
+{
+    OutputDebugStringW(L"CKsProxy::KsGetCorrelatedTime\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDTIME, KSPROPERTY_TYPE_GET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME));
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsSetCorrelatedTime(
+    KSCORRELATED_TIME* CorrelatedTime)
+{
+    OutputDebugStringW(L"CKsProxy::KsSetCorrelatedTime\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDTIME, KSPROPERTY_TYPE_SET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME));
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsGetCorrelatedPhysicalTime(
+    KSCORRELATED_TIME* CorrelatedTime)
+{
+    OutputDebugStringW(L"CKsProxy::KsGetCorrelatedPhysicalTime\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_TYPE_GET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME));
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsSetCorrelatedPhysicalTime(
+    KSCORRELATED_TIME* CorrelatedTime)
+{
+    OutputDebugStringW(L"CKsProxy::KsSetCorrelatedPhysicalTime\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_TYPE_SET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME));
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsGetResolution(
+    KSRESOLUTION* Resolution)
+{
+    OutputDebugStringW(L"CKsProxy::KsGetResolution\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_RESOLUTION, KSPROPERTY_TYPE_GET, (PVOID)Resolution, sizeof(KSRESOLUTION));
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsGetState(
+    KSSTATE* State)
+{
+    OutputDebugStringW(L"CKsProxy::KsGetState\n");
+    return PerformClockProperty(KSPROPERTY_CLOCK_STATE, KSPROPERTY_TYPE_GET, (PVOID)State, sizeof(KSSTATE));
+}
+
+//-------------------------------------------------------------------
+// IReferenceClock interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetTime(
+    REFERENCE_TIME *pTime)
+{
+    HRESULT hr;
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+
+    OutputDebugStringW(L"CKsProxy::GetTime\n");
+
+    if (!pTime)
+        return E_POINTER;
+
+    //
+    //FIXME locks
+    //
+
+    if (!m_hClock)
+    {
+        // create clock
+        hr = CreateClockInstance();
+        if (FAILED(hr))
+            return hr;
+    }
+
+    // setup request
+    Property.Set = KSPROPSETID_Clock;
+    Property.Id = KSPROPERTY_CLOCK_TIME;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    // perform request
+    hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pTime, sizeof(REFERENCE_TIME), &BytesReturned);
+
+    // TODO
+    // increment value
+    //
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::AdviseTime(
+    REFERENCE_TIME baseTime,
+    REFERENCE_TIME streamTime,
+    HEVENT hEvent,
+    DWORD_PTR *pdwAdviseCookie)
+{
+    HRESULT hr;
+    KSEVENT Property;
+    ULONG BytesReturned;
+    PKSEVENT_TIME_MARK Event;
+
+    OutputDebugStringW(L"CKsProxy::AdviseTime\n");
+
+    //
+    //FIXME locks
+    //
+
+    if (!pdwAdviseCookie)
+        return E_POINTER;
+
+    if (!m_hClock)
+    {
+        // create clock
+        hr = CreateClockInstance();
+        if (FAILED(hr))
+            return hr;
+    }
+
+    // allocate event entry
+    Event = (PKSEVENT_TIME_MARK)CoTaskMemAlloc(sizeof(KSEVENT_TIME_MARK));
+    if (Event)
+    {
+        // setup request
+        Property.Set = KSEVENTSETID_Clock;
+        Property.Id = KSEVENT_CLOCK_POSITION_MARK;
+        Property.Flags = KSEVENT_TYPE_ENABLE;
+
+        Event->EventData.NotificationType = KSEVENTF_EVENT_HANDLE;
+        Event->EventData.EventHandle.Event = (HANDLE)hEvent;
+        Event->EventData.Alignment.Alignment[0] = 0;
+        Event->EventData.Alignment.Alignment[1] = 0;
+        Event->MarkTime = baseTime + streamTime;
+
+        // perform request
+        hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSEVENT), (PVOID)Event, sizeof(KSEVENT_TIME_MARK), &BytesReturned);
+        if (SUCCEEDED(hr))
+        {
+            // store event handle
+            *pdwAdviseCookie = (DWORD_PTR)Event;
+        }
+        else
+        {
+            // failed to enable event
+            CoTaskMemFree(Event);
+        }
+    }
+    else
+    {
+         hr = E_OUTOFMEMORY;
+    }
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::AdvisePeriodic(
+    REFERENCE_TIME startTime,
+    REFERENCE_TIME periodTime,
+    HSEMAPHORE hSemaphore,
+    DWORD_PTR *pdwAdviseCookie)
+{
+    HRESULT hr;
+    KSEVENT Property;
+    ULONG BytesReturned;
+    PKSEVENT_TIME_INTERVAL Event;
+
+    OutputDebugStringW(L"CKsProxy::AdvisePeriodic\n");
+
+    //
+    //FIXME locks
+    //
+
+    if (!pdwAdviseCookie)
+        return E_POINTER;
+
+    if (!m_hClock)
+    {
+        // create clock
+        hr = CreateClockInstance();
+        if (FAILED(hr))
+            return hr;
+    }
+
+    // allocate event entry
+    Event = (PKSEVENT_TIME_INTERVAL)CoTaskMemAlloc(sizeof(KSEVENT_TIME_INTERVAL));
+    if (Event)
+    {
+        // setup request
+        Property.Set = KSEVENTSETID_Clock;
+        Property.Id = KSEVENT_CLOCK_INTERVAL_MARK;
+        Property.Flags = KSEVENT_TYPE_ENABLE;
+
+        Event->EventData.NotificationType = KSEVENTF_SEMAPHORE_HANDLE;
+        Event->EventData.SemaphoreHandle.Semaphore = (HANDLE)hSemaphore;
+        Event->EventData.SemaphoreHandle.Reserved = 0;
+        Event->EventData.SemaphoreHandle.Adjustment = 1;
+        Event->TimeBase = startTime;
+        Event->Interval = periodTime;
+
+        // perform request
+        hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSEVENT), (PVOID)Event, sizeof(KSEVENT_TIME_INTERVAL), &BytesReturned);
+        if (SUCCEEDED(hr))
+        {
+            // store event handle
+            *pdwAdviseCookie = (DWORD_PTR)Event;
+        }
+        else
+        {
+            // failed to enable event
+            CoTaskMemFree(Event);
+        }
+    }
+    else
+    {
+         hr = E_OUTOFMEMORY;
+    }
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Unadvise(
+    DWORD_PTR dwAdviseCookie)
+{
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    OutputDebugStringW(L"CKsProxy::Unadvise\n");
+
+    if (m_hClock)
+    {
+        //lets disable the event
+        hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_DISABLE_EVENT, (PVOID)dwAdviseCookie, sizeof(KSEVENTDATA), 0, 0, &BytesReturned);
+        if (SUCCEEDED(hr))
+        {
+            // lets free event data
+            CoTaskMemFree((LPVOID)dwAdviseCookie);
+        }
+    }
+    else
+    {
+        // no clock available
+        hr = E_FAIL;
+    }
+
+    return hr;
+}
+
+//-------------------------------------------------------------------
+// IMediaSeeking interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetCapabilities(
+    DWORD *pCapabilities)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned, Index;
+    HRESULT hr = S_OK;
+    DWORD TempCaps;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_CAPABILITIES;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    OutputDebugStringW(L"CKsProxy::GetCapabilities\n");
+
+    if (!pCapabilities)
+        return E_POINTER;
+
+
+    *pCapabilities = (KS_SEEKING_CanSeekAbsolute | KS_SEEKING_CanSeekForwards | KS_SEEKING_CanSeekBackwards | KS_SEEKING_CanGetCurrentPos |
+                      KS_SEEKING_CanGetStopPos | KS_SEEKING_CanGetDuration | KS_SEEKING_CanPlayBackwards);
+
+    KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pCapabilities, sizeof(KS_SEEKING_CAPABILITIES), &BytesReturned);
+    // check if plugins support it
+    for(Index = 0; Index < m_Plugins.size(); Index++)
+    {
+        // get plugin
+        IUnknown * Plugin = m_Plugins[Index];
+
+        if (!Plugin)
+           continue;
+
+        // query for IMediaSeeking interface
+        IMediaSeeking *pSeek = NULL;
+        hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+        if (FAILED(hr))
+        {
+            *pCapabilities = 0;
+            return hr;
+        }
+
+        TempCaps = 0;
+        // set time format
+        hr = pSeek->GetCapabilities(&TempCaps);
+        if (SUCCEEDED(hr))
+        {
+            // and with supported flags
+            *pCapabilities = (*pCapabilities & TempCaps);
+        }
+        // release IMediaSeeking interface
+        pSeek->Release();
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::CheckCapabilities(
+    DWORD *pCapabilities)
+{
+    DWORD Capabilities;
+    HRESULT hr;
+
+    OutputDebugStringW(L"CKsProxy::CheckCapabilities\n");
+
+    if (!pCapabilities)
+        return E_POINTER;
+
+    if (!*pCapabilities)
+        return E_FAIL;
+
+    hr = GetCapabilities(&Capabilities);
+    if (SUCCEEDED(hr))
+    {
+        if ((Capabilities | *pCapabilities) == Capabilities)
+        {
+            // all present
+            return S_OK;
+        }
+
+        Capabilities = (Capabilities & *pCapabilities);
+        if (Capabilities)
+        {
+            // not all present
+            *pCapabilities = Capabilities;
+            return S_FALSE;
+        }
+        // no capabilities are present
+        return E_FAIL;
+    }
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetMediaSeekingFormats(
+    PKSMULTIPLE_ITEM *FormatList)
+{
+    KSPROPERTY Property;
+    HRESULT hr;
+    ULONG BytesReturned;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_FORMATS;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    // query for format size list
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &BytesReturned);
+
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA))
+    {
+        // allocate format list
+        *FormatList = (PKSMULTIPLE_ITEM)CoTaskMemAlloc(BytesReturned);
+        if (!*FormatList)
+        {
+            // not enough memory
+            return E_OUTOFMEMORY;
+        }
+
+        // get format list
+        hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)*FormatList, BytesReturned, &BytesReturned);
+        if (FAILED(hr))
+        {
+            // failed to query format list
+            CoTaskMemFree(FormatList);
+        }
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::IsFormatSupported(
+    const GUID *pFormat)
+{
+    PKSMULTIPLE_ITEM FormatList;
+    LPGUID pGuid;
+    ULONG Index;
+    HRESULT hr = S_FALSE;
+
+    WCHAR Buffer[100];
+    LPOLESTR pstr;
+    StringFromCLSID(*pFormat, &pstr);
+    swprintf(Buffer, L"CKsProxy::IsFormatSupported %s\n",pstr);
+    OutputDebugStringW(Buffer);
+
+    if (!pFormat)
+        return E_POINTER;
+
+    // get media formats
+    hr = GetMediaSeekingFormats(&FormatList);
+    if (SUCCEEDED(hr))
+    {
+        swprintf(Buffer, L"CKsProxy::IsFormatSupported NumFormat %lu\n",FormatList->Count);
+        OutputDebugStringW(Buffer);
+
+        //iterate through format list
+        pGuid = (LPGUID)(FormatList + 1);
+        for(Index = 0; Index < FormatList->Count; Index++)
+        {
+            if (IsEqualGUID(*pGuid, *pFormat))
+            {
+                CoTaskMemFree(FormatList);
+                return S_OK;
+            }
+            pGuid++;
+        }
+        // free format list
+        CoTaskMemFree(FormatList);
+    }
+
+    // check if all plugins support it
+    for(Index = 0; Index < m_Plugins.size(); Index++)
+    {
+        // get plugin
+        IUnknown * Plugin = m_Plugins[Index];
+
+        if (!Plugin)
+            continue;
+
+        // query for IMediaSeeking interface
+        IMediaSeeking *pSeek = NULL;
+        hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+        if (FAILED(hr))
+        {
+            // plugin does not support interface
+            hr = S_FALSE;
+            OutputDebugStringW(L"CKsProxy::IsFormatSupported plugin does not support IMediaSeeking interface\n");
+            break;
+        }
+
+        // query if it is supported
+        hr = pSeek->IsFormatSupported(pFormat);
+        // release interface
+        pSeek->Release();
+
+        if (FAILED(hr) || hr == S_FALSE)
+            break;
+    }
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::QueryPreferredFormat(
+    GUID *pFormat)
+{
+    PKSMULTIPLE_ITEM FormatList;
+    HRESULT hr;
+    ULONG Index;
+
+    OutputDebugStringW(L"CKsProxy::QueryPreferredFormat\n");
+
+    if (!pFormat)
+        return E_POINTER;
+
+    hr = GetMediaSeekingFormats(&FormatList);
+    if (SUCCEEDED(hr))
+    {
+        if (FormatList->Count)
+        {
+            CopyMemory(pFormat, (FormatList + 1), sizeof(GUID));
+            CoTaskMemFree(FormatList);
+            return S_OK;
+        }
+        CoTaskMemFree(FormatList);
+    }
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        // check if plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (SUCCEEDED(hr))
+            {
+                // get preferred time format
+                hr = pSeek->QueryPreferredFormat(pFormat);
+                // release IMediaSeeking interface
+                pSeek->Release();
+
+                if (hr != S_FALSE)
+                    return hr;
+            }
+        }
+        hr = S_FALSE;
+    }
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetTimeFormat(
+    GUID *pFormat)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned, Index;
+    HRESULT hr;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_TIMEFORMAT;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    OutputDebugStringW(L"CKsProxy::GetTimeFormat\n");
+
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pFormat, sizeof(GUID), &BytesReturned);
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        // check if plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            hr = E_NOTIMPL;
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (SUCCEEDED(hr))
+            {
+                // set time format
+                hr = pSeek->GetTimeFormat(pFormat);
+                // release IMediaSeeking interface
+                pSeek->Release();
+
+                if (hr != S_FALSE)
+                    break;
+            }
+        }
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::IsUsingTimeFormat(
+    const GUID *pFormat)
+{
+    GUID Format;
+
+    OutputDebugStringW(L"CKsProxy::IsUsingTimeFormat\n");
+
+    if (FAILED(QueryPreferredFormat(&Format)))
+        return S_FALSE;
+
+    if (IsEqualGUID(Format, *pFormat))
+        return S_OK;
+    else
+        return S_FALSE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::SetTimeFormat(
+    const GUID *pFormat)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned, Index;
+    HRESULT hr;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_TIMEFORMAT;
+    Property.Flags = KSPROPERTY_TYPE_SET;
+
+    OutputDebugStringW(L"CKsProxy::SetTimeFormat\n");
+
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pFormat, sizeof(GUID), &BytesReturned);
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        // check if plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            hr = E_NOTIMPL;
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (FAILED(hr))
+            {
+                //not supported
+                break;
+            }
+            // set time format
+            hr = pSeek->SetTimeFormat(pFormat);
+            // release IMediaSeeking interface
+            pSeek->Release();
+
+            if (FAILED(hr))
+                break;
+        }
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetDuration(
+    LONGLONG *pDuration)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned, Index;
+    HRESULT hr;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_DURATION;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    OutputDebugStringW(L"CKsProxy::GetDuration\n");
+
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pDuration, sizeof(LONGLONG), &BytesReturned);
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        // check if plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            hr = E_NOTIMPL;
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (SUCCEEDED(hr))
+            {
+                // get duration
+                hr = pSeek->GetStopPosition(pDuration);
+                // release IMediaSeeking interface
+                pSeek->Release();
+
+                if (hr != S_FALSE) // plugin implements it
+                     break;
+            }
+        }
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetStopPosition(
+    LONGLONG *pStop)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned, Index;
+    HRESULT hr;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_STOPPOSITION;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    OutputDebugStringW(L"CKsProxy::GetStopPosition\n");
+
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pStop, sizeof(LONGLONG), &BytesReturned);
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        // check if plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            hr = E_NOTIMPL;
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (SUCCEEDED(hr))
+            {
+                // get stop position
+                hr = pSeek->GetStopPosition(pStop);
+                // release IMediaSeeking interface
+                pSeek->Release();
+
+                if (hr != S_FALSE) // plugin implements it
+                     break;
+            }
+        }
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetCurrentPosition(
+    LONGLONG *pCurrent)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned, Index;
+    HRESULT hr;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_POSITION;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    OutputDebugStringW(L"CKsProxy::GetCurrentPosition\n");
+
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pCurrent, sizeof(LONGLONG), &BytesReturned);
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        // check if plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            hr = E_NOTIMPL;
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (SUCCEEDED(hr))
+            {
+                // get current position
+                hr = pSeek->GetCurrentPosition(pCurrent);
+                // release IMediaSeeking interface
+                pSeek->Release();
+
+                if (hr != S_FALSE) // plugin implements it
+                     break;
+            }
+        }
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::ConvertTimeFormat(
+    LONGLONG *pTarget,
+    const GUID *pTargetFormat,
+    LONGLONG Source,
+    const GUID *pSourceFormat)
+{
+    KSP_TIMEFORMAT Property;
+    ULONG BytesReturned, Index;
+    GUID SourceFormat, TargetFormat;
+    HRESULT hr;
+
+    Property.Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Property.Id = KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT;
+    Property.Property.Flags = KSPROPERTY_TYPE_GET;
+
+    OutputDebugStringW(L"CKsProxy::ConvertTimeFormat\n");
+
+    if (!pTargetFormat)
+    {
+        // get current format
+        hr = GetTimeFormat(&TargetFormat);
+        if (FAILED(hr))
+            return hr;
+
+        pTargetFormat = &TargetFormat;
+    }
+
+    if (!pSourceFormat)
+    {
+        // get current format
+        hr = GetTimeFormat(&SourceFormat);
+        if (FAILED(hr))
+            return hr;
+
+        pSourceFormat = &SourceFormat;
+    }
+
+    Property.SourceFormat = *pSourceFormat;
+    Property.TargetFormat = *pTargetFormat;
+    Property.Time = Source;
+
+
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_TIMEFORMAT), (PVOID)pTarget, sizeof(LONGLONG), &BytesReturned);
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        //default error
+        hr = E_NOTIMPL;
+
+        // check if plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (SUCCEEDED(hr))
+            {
+                // convert time format
+                hr = pSeek->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat);
+                // release IMediaSeeking interface
+                pSeek->Release();
+
+                if (hr != S_FALSE) // plugin implements it
+                     break;
+            }
+        }
+    }
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::SetPositions(
+    LONGLONG *pCurrent,
+    DWORD dwCurrentFlags,
+    LONGLONG *pStop,
+    DWORD dwStopFlags)
+{
+    KSPROPERTY Property;
+    KSPROPERTY_POSITIONS Positions;
+    ULONG BytesReturned, Index;
+    HRESULT hr;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_POSITIONS;
+    Property.Flags = KSPROPERTY_TYPE_SET;
+
+    Positions.Current = *pCurrent;
+    Positions.CurrentFlags = (KS_SEEKING_FLAGS)dwCurrentFlags;
+    Positions.Stop = *pStop;
+    Positions.StopFlags = (KS_SEEKING_FLAGS)dwStopFlags;
+
+    OutputDebugStringW(L"CKsProxy::SetPositions\n");
+
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&Positions, sizeof(KSPROPERTY_POSITIONS), &BytesReturned);
+    if (SUCCEEDED(hr))
+    {
+        if (dwCurrentFlags & AM_SEEKING_ReturnTime)
+        {
+            // retrieve current position
+            hr = GetCurrentPosition(pCurrent);
+        }
+
+        if (SUCCEEDED(hr))
+        {
+            if (dwStopFlags & AM_SEEKING_ReturnTime)
+            {
+                // retrieve current position
+                hr = GetStopPosition(pStop);
+            }
+        }
+        return hr;
+    }
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        hr = E_NOTIMPL;
+
+        // check if plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (SUCCEEDED(hr))
+            {
+                // set positions
+                hr = pSeek->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+                // release IMediaSeeking interface
+                pSeek->Release();
+
+                if (FAILED(hr))
+                    break;
+            }
+        }
+    }
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPositions(
+    LONGLONG *pCurrent,
+    LONGLONG *pStop)
+{
+    HRESULT hr;
+
+    OutputDebugStringW(L"CKsProxy::GetPositions\n");
+
+    hr = GetCurrentPosition(pCurrent);
+    if (SUCCEEDED(hr))
+        hr = GetStopPosition(pStop);
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetAvailable(
+    LONGLONG *pEarliest,
+    LONGLONG *pLatest)
+{
+    KSPROPERTY Property;
+    KSPROPERTY_MEDIAAVAILABLE Media;
+    ULONG BytesReturned, Index;
+    HRESULT hr;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_AVAILABLE;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    OutputDebugStringW(L"CKsProxy::GetAvailable\n");
+
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&Media, sizeof(KSPROPERTY_MEDIAAVAILABLE), &BytesReturned);
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        // check if plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            hr = E_NOTIMPL;
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (SUCCEEDED(hr))
+            {
+                // delegate call
+                hr = pSeek->GetAvailable(pEarliest, pLatest);
+                // release IMediaSeeking interface
+                pSeek->Release();
+
+                if (hr != S_FALSE) // plugin implements it
+                     break;
+            }
+        }
+    }
+    else if (SUCCEEDED(hr))
+    {
+        *pEarliest = Media.Earliest;
+        *pLatest = Media.Latest;
+    }
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::SetRate(
+    double dRate)
+{
+    OutputDebugStringW(L"CKsProxy::SetRate\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetRate(
+    double *pdRate)
+{
+    OutputDebugStringW(L"CKsProxy::GetRate\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPreroll(
+    LONGLONG *pllPreroll)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned, Index;
+    HRESULT hr;
+
+    Property.Set = KSPROPSETID_MediaSeeking;
+    Property.Id = KSPROPERTY_MEDIASEEKING_PREROLL;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    OutputDebugStringW(L"CKsProxy::GetPreroll\n");
+
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pllPreroll, sizeof(LONGLONG), &BytesReturned);
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND))
+    {
+        // check if all plugins support it
+        for(Index = 0; Index < m_Plugins.size(); Index++)
+        {
+            // get plugin
+            IUnknown * Plugin = m_Plugins[Index];
+
+            if (!Plugin)
+               continue;
+
+            // query for IMediaSeeking interface
+            IMediaSeeking *pSeek = NULL;
+            hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
+            if (SUCCEEDED(hr))
+            {
+                // get preroll
+                hr = pSeek->GetPreroll(pllPreroll);
+                // release IMediaSeeking interface
+                pSeek->Release();
+
+                if (hr != S_FALSE) // plugin implements it
+                     break;
+            }
+        }
+        hr = E_NOTIMPL;
+    }
+    return hr;
+}
+
+//-------------------------------------------------------------------
+// IAMFilterMiscFlags interface
+//
+
+ULONG
+STDMETHODCALLTYPE
+CKsProxy::GetMiscFlags()
+{
+    ULONG Index;
+    ULONG Flags = 0;
+    HRESULT hr;
+    PIN_DIRECTION PinDirection;
+    KSPIN_COMMUNICATION Communication;
+    WCHAR Buffer[100];
+
+    for(Index = 0; Index < m_Pins.size(); Index++)
+    {
+        // get current pin
+        IPin * pin = m_Pins[Index];
+        // query direction
+        hr = pin->QueryDirection(&PinDirection);
+        if (SUCCEEDED(hr))
+        {
+            if (PinDirection == PINDIR_INPUT)
+            {
+                if (SUCCEEDED(GetPinCommunication(Index, //FIXME verify PinId
+                                        &Communication)))
+                {
+                    if (Communication != KSPIN_COMMUNICATION_NONE && Communication != KSPIN_COMMUNICATION_BRIDGE)
+                    {
+                        Flags |= AM_FILTER_MISC_FLAGS_IS_SOURCE;
+                    }
+                }
+            }
+        }
+    }
+
+    swprintf(Buffer, L"CKsProxy::GetMiscFlags stub Flags %x\n", Flags);
+    OutputDebugStringW(Buffer);
+    return Flags;
+}
+
+//-------------------------------------------------------------------
+// IKsControl
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsProperty(
+    PKSPROPERTY Property,
+    ULONG PropertyLength,
+    LPVOID PropertyData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_hDevice != 0);
+    OutputDebugStringW(L"CKsProxy::KsProperty\n");
+    return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsMethod(
+    PKSMETHOD Method,
+    ULONG MethodLength,
+    LPVOID MethodData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_hDevice != 0);
+    OutputDebugStringW(L"CKsProxy::KsMethod\n");
+    return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsEvent(
+    PKSEVENT Event,
+    ULONG EventLength,
+    LPVOID EventData,
+    ULONG DataLength,
+    ULONG* BytesReturned)
+{
+    assert(m_hDevice != 0);
+    OutputDebugStringW(L"CKsProxy::KsEvent\n");
+    if (EventLength)
+        return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned);
+    else
+        return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned);
+}
+
+
+//-------------------------------------------------------------------
+// IKsPropertySet
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Set(
+    REFGUID guidPropSet,
+    DWORD dwPropID,
+    LPVOID pInstanceData,
+    DWORD cbInstanceData,
+    LPVOID pPropData,
+    DWORD cbPropData)
+{
+    ULONG BytesReturned;
+
+    OutputDebugStringW(L"CKsProxy::Set\n");
+
+    if (cbInstanceData)
+    {
+        PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData);
+        if (!Property)
+            return E_OUTOFMEMORY;
+
+        Property->Set = guidPropSet;
+        Property->Id = dwPropID;
+        Property->Flags = KSPROPERTY_TYPE_SET;
+
+        CopyMemory((Property+1), pInstanceData, cbInstanceData);
+
+        HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned);
+        CoTaskMemFree(Property);
+        return hr;
+    }
+    else
+    {
+        KSPROPERTY Property;
+
+        Property.Set = guidPropSet;
+        Property.Id = dwPropID;
+        Property.Flags = KSPROPERTY_TYPE_SET;
+
+        HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned);
+        return hr;
+    }
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Get(
+    REFGUID guidPropSet,
+    DWORD dwPropID,
+    LPVOID pInstanceData,
+    DWORD cbInstanceData,
+    LPVOID pPropData,
+    DWORD cbPropData,
+    DWORD *pcbReturned)
+{
+    ULONG BytesReturned;
+
+    OutputDebugStringW(L"CKsProxy::Get\n");
+
+    if (cbInstanceData)
+    {
+        PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData);
+        if (!Property)
+            return E_OUTOFMEMORY;
+
+        Property->Set = guidPropSet;
+        Property->Id = dwPropID;
+        Property->Flags = KSPROPERTY_TYPE_GET;
+
+        CopyMemory((Property+1), pInstanceData, cbInstanceData);
+
+        HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned);
+        CoTaskMemFree(Property);
+        return hr;
+    }
+    else
+    {
+        KSPROPERTY Property;
+
+        Property.Set = guidPropSet;
+        Property.Id = dwPropID;
+        Property.Flags = KSPROPERTY_TYPE_GET;
+
+        HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned);
+        return hr;
+    }
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::QuerySupported(
+    REFGUID guidPropSet,
+    DWORD dwPropID,
+    DWORD *pTypeSupport)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+
+    OutputDebugStringW(L"CKsProxy::QuerySupported\n");
+
+    Property.Set = guidPropSet;
+    Property.Id = dwPropID;
+    Property.Flags = KSPROPERTY_TYPE_SETSUPPORT;
+
+    return KsProperty(&Property, sizeof(KSPROPERTY), pTypeSupport, sizeof(DWORD), &BytesReturned);
+}
+
+
+//-------------------------------------------------------------------
+// IKsTopology interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::CreateNodeInstance(
+    ULONG NodeId,
+    ULONG Flags,
+    ACCESS_MASK DesiredAccess,
+    IUnknown* UnkOuter,
+    REFGUID InterfaceId,
+    LPVOID* Interface)
+{
+    HRESULT hr;
+
+    OutputDebugStringW(L"CKsProxy::CreateNodeInstance\n");
+
+    *Interface = NULL;
+
+    if (IsEqualIID(IID_IUnknown, InterfaceId) || !UnkOuter)
+    {
+        hr = CKsNode_Constructor(UnkOuter, m_hDevice, NodeId, DesiredAccess, InterfaceId, Interface);
+    }
+    else
+    {
+        // interface not supported
+        hr = E_NOINTERFACE;
+    }
+
+    return hr;
+}
+
+//-------------------------------------------------------------------
+// IKsAggregateControl interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsAddAggregate(
+    IN REFGUID AggregateClass)
+{
+    OutputDebugStringW(L"CKsProxy::KsAddAggregate NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::KsRemoveAggregate(
+    REFGUID AggregateClass)
+{
+    OutputDebugStringW(L"CKsProxy::KsRemoveAggregate NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+
+//-------------------------------------------------------------------
+// IPersistStream interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::IsDirty()
+{
+    OutputDebugStringW(L"CKsProxy::IsDirty Notimplemented\n");
+    DebugBreak();
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Load(
+    IStream *pStm)
+{
+    HRESULT hr;
+    WCHAR Buffer[1000];
+    AM_MEDIA_TYPE MediaType;
+    ULONG BytesReturned;
+    LONG Length;
+
+    ULONG PinId;
+    LPOLESTR pMajor, pSub, pFormat;
+
+    OutputDebugStringW(L"CKsProxy::Load\n");
+
+#if 0
+    ULONG Version = ReadInt(pStm, hr);
+    if (Version != 1)
+        return E_FAIL;
+#endif
+
+    hr = pStm->Read(&Length, sizeof(ULONG), &BytesReturned);
+    swprintf(Buffer, L"Length hr %x hr length %lu\n", hr, Length);
+    OutputDebugStringW(Buffer);
+
+    do
+    {
+        hr = pStm->Read(&PinId, sizeof(ULONG), &BytesReturned);
+        swprintf(Buffer, L"Read: hr %08x PinId %lx BytesReturned %lu\n", hr, PinId, BytesReturned);
+        OutputDebugStringW(Buffer);
+
+        if (FAILED(hr) || !BytesReturned)
+            break;
+
+        Length -= BytesReturned;
+
+        hr = pStm->Read(&MediaType, sizeof(AM_MEDIA_TYPE), &BytesReturned);
+        if (FAILED(hr) || BytesReturned != sizeof(AM_MEDIA_TYPE))
+        {
+            swprintf(Buffer, L"Read failed with %lx\n", hr);
+            OutputDebugStringW(Buffer);
+            break;
+        }
+
+
+        StringFromIID(MediaType.majortype, &pMajor);
+        StringFromIID(MediaType.subtype , &pSub);
+        StringFromIID(MediaType.formattype, &pFormat);
+
+        swprintf(Buffer, L"BytesReturned %lu majortype %s subtype %s bFixedSizeSamples %u bTemporalCompression %u lSampleSize %u formattype %s, pUnk %p cbFormat %u pbFormat %p\n", BytesReturned, pMajor, pSub, MediaType.bFixedSizeSamples, MediaType.bTemporalCompression, MediaType.lSampleSize, pFormat, MediaType.pUnk, MediaType.cbFormat, MediaType.pbFormat);
+        OutputDebugStringW(Buffer);
+
+        Length -= BytesReturned;
+
+
+        if (MediaType.cbFormat)
+        {
+            MediaType.pbFormat = (BYTE*)CoTaskMemAlloc(MediaType.cbFormat);
+            if (!MediaType.pbFormat)
+                return E_OUTOFMEMORY;
+
+            hr = pStm->Read(&MediaType.pbFormat, sizeof(MediaType.cbFormat), &BytesReturned);
+            if (FAILED(hr))
+            {
+                swprintf(Buffer, L"ReadFormat failed with %lx\n", hr);
+                OutputDebugStringW(Buffer);
+                break;
+            }
+            Length -= BytesReturned;
+        }
+
+    }while(Length > 0);
+
+    DebugBreak();
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Save(
+    IStream *pStm,
+    BOOL fClearDirty)
+{
+    OutputDebugStringW(L"CKsProxy::Save Notimplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetSizeMax(
+    ULARGE_INTEGER *pcbSize)
+{
+    OutputDebugStringW(L"CKsProxy::GetSizeMax Notimplemented\n");
+    DebugBreak();
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IAMDeviceRemoval interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::DeviceInfo(CLSID *pclsidInterfaceClass, LPWSTR *pwszSymbolicLink)
+{
+
+    OutputDebugStringW(L"CKsProxy::DeviceInfo\n");
+
+    if (!m_DevicePath)
+    {
+        // object not initialized
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND);
+    }
+
+    // copy device interface guid
+    CopyMemory(pclsidInterfaceClass, &m_DeviceInterfaceGUID, sizeof(GUID));
+
+    if (pwszSymbolicLink)
+    {
+        *pwszSymbolicLink = (LPWSTR)CoTaskMemAlloc((wcslen(m_DevicePath)+1) * sizeof(WCHAR));
+        if (!*pwszSymbolicLink)
+            return E_OUTOFMEMORY;
+
+        wcscpy(*pwszSymbolicLink, m_DevicePath);
+    }
+    return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Reassociate(void)
+{
+    OutputDebugStringW(L"CKsProxy::Reassociate\n");
+
+    if (!m_DevicePath || m_hDevice)
+    {
+        // file path not available
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND);
+    }
+
+    m_hDevice = CreateFileW(m_DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
+    if (!m_hDevice)
+    {
+        // failed to open device
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    // success
+    return NOERROR;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Disassociate(void)
+{
+    OutputDebugStringW(L"CKsProxy::Disassociate\n");
+
+    if (!m_hDevice)
+        return E_HANDLE;
+
+    CloseHandle(m_hDevice);
+    m_hDevice = NULL;
+    return NOERROR;
+}
+
+//-------------------------------------------------------------------
+// IKsClock interface
+//
+
+HANDLE
+STDMETHODCALLTYPE
+CKsProxy::KsGetClockHandle()
+{
+    OutputDebugStringW(L"CKsProxy::KsGetClockHandle\n");
+    return m_hClock;
+}
+
+
+//-------------------------------------------------------------------
+// IKsObject interface
+//
+
+HANDLE
+STDMETHODCALLTYPE
+CKsProxy::KsGetObjectHandle()
+{
+    OutputDebugStringW(L"CKsProxy::KsGetObjectHandle\n");
+    return m_hDevice;
+}
+
+//-------------------------------------------------------------------
+// IPersistPropertyBag interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::InitNew( void)
+{
+    OutputDebugStringW(L"CKsProxy::InitNew\n");
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetSupportedSets(
+    LPGUID * pOutGuid,
+    PULONG NumGuids)
+{
+    KSPROPERTY Property;
+    LPGUID pGuid;
+    ULONG NumProperty = 0;
+    ULONG NumMethods = 0;
+    ULONG NumEvents = 0;
+    ULONG Length;
+    ULONG BytesReturned;
+    HRESULT hr;
+
+    Property.Set = GUID_NULL;
+    Property.Id = 0;
+    Property.Flags = KSPROPERTY_TYPE_SETSUPPORT;
+
+    KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumProperty);
+    KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumMethods);
+    KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumEvents);
+
+    Length = NumProperty + NumMethods + NumEvents;
+
+    // allocate guid buffer
+    pGuid = (LPGUID)CoTaskMemAlloc(Length);
+    if (!pGuid)
+    {
+        // failed
+        return E_OUTOFMEMORY;
+    }
+
+    NumProperty /= sizeof(GUID);
+    NumMethods /= sizeof(GUID);
+    NumEvents /= sizeof(GUID);
+
+    // get all properties
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pGuid, Length, &BytesReturned);
+    if (FAILED(hr))
+    {
+        CoTaskMemFree(pGuid);
+        return E_FAIL;
+    }
+    Length -= BytesReturned;
+
+    // get all methods
+    if (Length)
+    {
+        hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty], Length, &BytesReturned);
+        if (FAILED(hr))
+        {
+            CoTaskMemFree(pGuid);
+            return E_FAIL;
+        }
+        Length -= BytesReturned;
+    }
+
+    // get all events
+    if (Length)
+    {
+        hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty+NumMethods], Length, &BytesReturned);
+        if (FAILED(hr))
+        {
+            CoTaskMemFree(pGuid);
+            return E_FAIL;
+        }
+        Length -= BytesReturned;
+    }
+
+#ifdef KSPROXY_TRACE
+    WCHAR Buffer[200];
+    swprintf(Buffer, L"NumProperty %lu NumMethods %lu NumEvents %lu\n", NumProperty, NumMethods, NumEvents);
+    OutputDebugStringW(Buffer);
+#endif
+
+    *pOutGuid = pGuid;
+    *NumGuids = NumProperty+NumEvents+NumMethods;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::LoadProxyPlugins(
+    LPGUID pGuids,
+    ULONG NumGuids)
+{
+    ULONG Index;
+    LPOLESTR pStr;
+    HKEY hKey, hSubKey;
+    HRESULT hr;
+    IUnknown * pUnknown;
+
+    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\MediaInterfaces", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
+    {
+        OutputDebugStringW(L"CKsProxy::LoadProxyPlugins failed to open MediaInterfaces key\n");
+        return E_FAIL;
+    }
+
+    // enumerate all sets
+    for(Index = 0; Index < NumGuids; Index++)
+    {
+        // convert to string
+        hr = StringFromCLSID(pGuids[Index], &pStr);
+        if (FAILED(hr))
+            return E_FAIL;
+
+        // now try open class key
+        if (RegOpenKeyExW(hKey, pStr, 0, KEY_READ, &hSubKey) != ERROR_SUCCESS)
+        {
+            // no plugin for that set exists
+            CoTaskMemFree(pStr);
+            continue;
+        }
+
+        // try load plugin
+        hr = CoCreateInstance(pGuids[Index], (IBaseFilter*)this, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);
+        if (SUCCEEDED(hr))
+        {
+            // store plugin
+            m_Plugins.push_back(pUnknown);
+        }
+        // close key
+        RegCloseKey(hSubKey);
+    }
+
+    // close media interfaces key
+    RegCloseKey(hKey);
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetNumberOfPins(
+    PULONG NumPins)
+{
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+
+    // setup request
+    Property.Set = KSPROPSETID_Pin;
+    Property.Id = KSPROPERTY_PIN_CTYPES;
+    Property.Flags = KSPROPERTY_TYPE_GET;
+
+    return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)NumPins, sizeof(ULONG), &BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPinInstanceCount(
+    ULONG PinId,
+    PKSPIN_CINSTANCES Instances)
+{
+    KSP_PIN Property;
+    ULONG BytesReturned;
+
+    // setup request
+    Property.Property.Set = KSPROPSETID_Pin;
+    Property.Property.Id = KSPROPERTY_PIN_CINSTANCES;
+    Property.Property.Flags = KSPROPERTY_TYPE_GET;
+    Property.PinId = PinId;
+    Property.Reserved = 0;
+
+    return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)Instances, sizeof(KSPIN_CINSTANCES), &BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPinCommunication(
+    ULONG PinId,
+    KSPIN_COMMUNICATION * Communication)
+{
+    KSP_PIN Property;
+    ULONG BytesReturned;
+
+    // setup request
+    Property.Property.Set = KSPROPSETID_Pin;
+    Property.Property.Id = KSPROPERTY_PIN_COMMUNICATION;
+    Property.Property.Flags = KSPROPERTY_TYPE_GET;
+    Property.PinId = PinId;
+    Property.Reserved = 0;
+
+    return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)Communication, sizeof(KSPIN_COMMUNICATION), &BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPinDataflow(
+    ULONG PinId,
+    KSPIN_DATAFLOW * DataFlow)
+{
+    KSP_PIN Property;
+    ULONG BytesReturned;
+
+    // setup request
+    Property.Property.Set = KSPROPSETID_Pin;
+    Property.Property.Id = KSPROPERTY_PIN_DATAFLOW;
+    Property.Property.Flags = KSPROPERTY_TYPE_GET;
+    Property.PinId = PinId;
+    Property.Reserved = 0;
+
+    return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)DataFlow, sizeof(KSPIN_DATAFLOW), &BytesReturned);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetPinName(
+    ULONG PinId,
+    KSPIN_DATAFLOW DataFlow,
+    ULONG PinCount,
+    LPWSTR * OutPinName)
+{
+    KSP_PIN Property;
+    LPWSTR PinName;
+    ULONG BytesReturned;
+    HRESULT hr;
+    WCHAR Buffer[100];
+
+    // setup request
+    Property.Property.Set = KSPROPSETID_Pin;
+    Property.Property.Id = KSPROPERTY_PIN_NAME;
+    Property.Property.Flags = KSPROPERTY_TYPE_GET;
+    Property.PinId = PinId;
+    Property.Reserved = 0;
+
+    // #1 try get it from pin directly
+    hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), NULL, 0, &BytesReturned);
+
+    if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA))
+    {
+        // allocate pin name
+        PinName = (LPWSTR)CoTaskMemAlloc(BytesReturned);
+        if (!PinName)
+            return E_OUTOFMEMORY;
+
+        // retry with allocated buffer
+        hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), PinName, BytesReturned, &BytesReturned);
+        if (SUCCEEDED(hr))
+        {
+            *OutPinName = PinName;
+            return hr;
+        }
+
+        //free buffer
+        CoTaskMemFree(PinName);
+    }
+
+    //
+    // TODO: retrieve pin name from topology node
+    //
+
+    if (DataFlow == KSPIN_DATAFLOW_IN)
+    {
+        swprintf(Buffer, L"Input%lu", PinCount);
+    }
+    else
+    {
+        swprintf(Buffer, L"Output%lu", PinCount);
+    }
+
+    // allocate pin name 
+    PinName = (LPWSTR)CoTaskMemAlloc((wcslen(Buffer)+1) * sizeof(WCHAR));
+    if (!PinName)
+        return E_OUTOFMEMORY;
+
+    // copy pin name
+    wcscpy(PinName, Buffer);
+
+    // store result
+    *OutPinName = PinName;
+    // done
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::CreatePins()
+{
+    ULONG NumPins, Index;
+    KSPIN_CINSTANCES Instances;
+    KSPIN_DATAFLOW DataFlow;
+    KSPIN_COMMUNICATION Communication;
+    HRESULT hr;
+    WCHAR Buffer[100];
+    LPWSTR PinName;
+    IPin * pPin;
+    ULONG InputPin = 0;
+    ULONG OutputPin = 0;
+
+    // get number of pins
+    hr = GetNumberOfPins(&NumPins);
+    if (FAILED(hr))
+        return hr;
+
+    for(Index = 0; Index < NumPins; Index++)
+    {
+        // query current instance count
+        hr = GetPinInstanceCount(Index, &Instances);
+        if (FAILED(hr))
+            continue;
+
+        // query pin communication;
+        hr = GetPinCommunication(Index, &Communication);
+        if (FAILED(hr))
+            continue;
+
+        if (Instances.CurrentCount == Instances.PossibleCount)
+        {
+            // already maximum reached for this pin
+            continue;
+        }
+
+        // get direction of pin
+        hr = GetPinDataflow(Index, &DataFlow);
+        if (FAILED(hr))
+            continue;
+
+        if (DataFlow == KSPIN_DATAFLOW_IN)
+            hr = GetPinName(Index, DataFlow, InputPin, &PinName);
+        else
+            hr = GetPinName(Index, DataFlow, OutputPin, &PinName);
+
+        if (FAILED(hr))
+            continue;
+
+        // construct the pins
+        if (DataFlow == KSPIN_DATAFLOW_IN)
+        {
+            hr = CInputPin_Constructor((IBaseFilter*)this, PinName, m_hDevice, Index, Communication, IID_IPin, (void**)&pPin);
+            if (FAILED(hr))
+            {
+                CoTaskMemFree(PinName);
+                continue;
+            }
+            InputPin++;
+        }
+        else
+        {
+            hr = COutputPin_Constructor((IBaseFilter*)this, PinName, Index, Communication, IID_IPin, (void**)&pPin);
+            if (FAILED(hr))
+            {
+                CoTaskMemFree(PinName);
+                continue;
+            }
+            OutputPin++;
+        }
+
+        // store pins
+        m_Pins.push_back(pPin);
+
+        swprintf(Buffer, L"Index %lu DataFlow %lu Name %s\n", Index, DataFlow, PinName);
+        OutputDebugStringW(Buffer);
+    }
+
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog)
+{
+    HRESULT hr;
+    WCHAR Buffer[100];
+    VARIANT varName;
+    LPGUID pGuid;
+    ULONG NumGuids = 0;
+    HDEVINFO hList;
+    SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
+
+    OutputDebugStringW(L"CKsProxy::Load\n");
+
+    // read device path
+    varName.vt = VT_BSTR;
+    hr = pPropBag->Read(L"DevicePath", &varName, pErrorLog);
+
+    if (FAILED(hr))
+    {
+        swprintf(Buffer, L"CKsProxy::Load Read %lx\n", hr);
+        OutputDebugStringW(Buffer);
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    OutputDebugStringW(L"DevicePath: ");
+    OutputDebugStringW(varName.bstrVal);
+    OutputDebugStringW(L"\n");
+
+    // create device list
+    hList = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL);
+    if (hList == INVALID_HANDLE_VALUE)
+    {
+        // failed to create device list
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
+    if (!SetupDiOpenDeviceInterfaceW(hList, (PCWSTR)varName.bstrVal, 0, &DeviceInterfaceData))
+    {
+        // failed to open device interface
+        SetupDiDestroyDeviceInfoList(hList);
+    }
+
+    // FIXME handle device interface links(aliases)
+    CopyMemory(&m_DeviceInterfaceGUID, &DeviceInterfaceData.InterfaceClassGuid, sizeof(GUID));
+
+    // close device info list
+   SetupDiDestroyDeviceInfoList(hList);
+
+    // open device
+    m_hDevice = CreateFileW(varName.bstrVal, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
+
+    if (m_hDevice == INVALID_HANDLE_VALUE)
+    {
+        // failed to open device
+        swprintf(Buffer, L"CKsProxy:: failed to open device with %lx\n", GetLastError());
+        OutputDebugStringW(Buffer);
+
+        return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError());
+    }
+
+    // store device path
+    m_DevicePath = varName.bstrVal;
+
+    // get all supported sets
+    hr = GetSupportedSets(&pGuid, &NumGuids);
+    if (FAILED(hr))
+    {
+        CloseHandle(m_hDevice);
+        m_hDevice = NULL;
+        return hr;
+    }
+
+    // load all proxy plugins
+    hr = LoadProxyPlugins(pGuid, NumGuids);
+    if (FAILED(hr))
+    {
+        CloseHandle(m_hDevice);
+        m_hDevice = NULL;
+        return hr;
+    }
+
+    // free sets
+    CoTaskMemFree(pGuid);
+
+    // now create the input / output pins
+    hr = CreatePins();
+
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
+{
+    OutputDebugStringW(L"CKsProxy::Save\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IBaseFilter interface
+//     
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetClassID(
+    CLSID *pClassID)
+{
+    OutputDebugStringW(L"CKsProxy::GetClassID\n");
+    CopyMemory(pClassID, &CLSID_Proxy, sizeof(GUID));
+
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Stop()
+{
+    OutputDebugStringW(L"CKsProxy::Stop : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Pause()
+{
+    HRESULT hr = S_OK;
+
+    OutputDebugStringW(L"CKsProxy::Pause\n");
+
+    if (m_FilterState == State_Stopped)
+    {
+        hr = SetPinState(KSSTATE_PAUSE);
+        if (FAILED(hr))
+            return hr;
+
+    }
+
+    m_FilterState = State_Paused;
+    return hr;
+
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Run(
+    REFERENCE_TIME tStart)
+{
+    HRESULT hr;
+
+    OutputDebugStringW(L"CKsProxy::Run\n");
+
+    if (m_FilterState == State_Stopped)
+    {
+        // setting filter state to pause
+        hr = Pause();
+        if (FAILED(hr))
+            return hr;
+
+        assert(m_FilterState == State_Paused);
+    }
+
+    hr = SetPinState(KSSTATE_RUN);
+    if (FAILED(hr))
+        return hr;
+
+    m_FilterState = State_Running;
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::SetPinState(
+    KSSTATE State)
+{
+    HRESULT hr = S_OK;
+    ULONG Index;
+    IKsObject *pObject;
+    ULONG BytesReturned;
+    KSPROPERTY Property;
+    PIN_INFO PinInfo;
+
+    Property.Set = KSPROPSETID_Connection;
+    Property.Id = KSPROPERTY_CONNECTION_STATE;
+    Property.Flags = KSPROPERTY_TYPE_SET;
+
+    // set all pins to running state
+    for(Index = 0; Index < m_Pins.size(); Index++)
+    {
+        IPin * Pin = m_Pins[Index];
+        if (!Pin)
+            continue;
+
+        //check if the pin is connected
+        IPin * TempPin;
+        hr = Pin->ConnectedTo(&TempPin);
+        if (FAILED(hr))
+        {
+            // skip unconnected pins
+            continue;
+        }
+
+        // release connected pin
+        TempPin->Release();
+
+        // query for the pin info
+        hr = Pin->QueryPinInfo(&PinInfo);
+
+        if (SUCCEEDED(hr))
+        {
+            if (PinInfo.pFilter)
+                PinInfo.pFilter->Release();
+
+            if (PinInfo.dir == PINDIR_OUTPUT)
+            {
+                hr = COutputPin_SetState(Pin, State);
+                if (SUCCEEDED(hr))
+                    continue;
+            }
+        }
+
+        //query IKsObject interface
+        hr = Pin->QueryInterface(IID_IKsObject, (void**)&pObject);
+
+        // get pin handle
+        HANDLE hPin = pObject->KsGetObjectHandle();
+
+        // sanity check
+        assert(hPin && hPin != INVALID_HANDLE_VALUE);
+
+        // now set state
+        hr = KsSynchronousDeviceControl(hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&State, sizeof(KSSTATE), &BytesReturned);
+
+        WCHAR Buffer[100];
+        swprintf(Buffer, L"CKsProxy::SetPinState Index %u State %u hr %lx\n", Index, State, hr);
+        OutputDebugStringW(Buffer);
+
+        if (FAILED(hr))
+            return hr;
+    }
+    return hr;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetState(
+    DWORD dwMilliSecsTimeout,
+    FILTER_STATE *State)
+{
+    *State = m_FilterState;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::SetSyncSource(
+    IReferenceClock *pClock)
+{
+    HRESULT hr;
+    IKsClock *pKsClock;
+    HANDLE hClock, hPin;
+    ULONG Index;
+    IPin * pin;
+    IKsObject * pObject;
+    KSPROPERTY Property;
+    ULONG BytesReturned;
+    PIN_DIRECTION PinDir;
+
+// Plug In Distributor: IKsClock 
+    OutputDebugStringW(L"CKsProxy::SetSyncSource\n");
+
+    // FIXME
+    // need locks
+
+    if (pClock)
+    {
+        hr = pClock->QueryInterface(IID_IKsClock, (void**)&pKsClock);
+        if (FAILED(hr))
+        {
+            hr = m_ReferenceClock->QueryInterface(IID_IKsClock, (void**)&pKsClock);
+            if (FAILED(hr))
+                return hr;
+        }
+
+        // get clock handle
+        hClock = pKsClock->KsGetClockHandle();
+
+        // release IKsClock interface
+        pKsClock->Release();
+        m_hClock = hClock;
+    }
+    else
+    {
+        // no clock handle
+        m_hClock = NULL;
+    }
+
+
+    // distribute clock to all pins
+    for(Index = 0; Index < m_Pins.size(); Index++)
+    {
+        // get current pin
+        pin = m_Pins[Index];
+        if (!pin)
+            continue;
+
+        // get IKsObject interface
+        hr = pin->QueryInterface(IID_IKsObject, (void **)&pObject);
+        if (SUCCEEDED(hr))
+        {
+            // get pin handle
+            hPin = pObject->KsGetObjectHandle();
+            if (hPin != INVALID_HANDLE_VALUE && hPin)
+            {
+                // set clock
+                Property.Set = KSPROPSETID_Stream;
+                Property.Id = KSPROPERTY_STREAM_MASTERCLOCK;
+                Property.Flags = KSPROPERTY_TYPE_SET;
+
+                // set master clock
+                hr = KsSynchronousDeviceControl(hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&m_hClock, sizeof(HANDLE), &BytesReturned);
+
+                if (FAILED(hr))
+                {
+                    if (hr != MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND) &&
+                        hr != MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND))
+                    {
+                        // failed to set master clock
+                        pObject->Release();
+                        WCHAR Buffer[100];
+                        swprintf(Buffer, L"CKsProxy::SetSyncSource KSPROPERTY_STREAM_MASTERCLOCK failed with %lx\n", hr);
+                        OutputDebugStringW(Buffer);
+                        return hr;
+                    }
+                }
+            }
+            // release IKsObject
+            pObject->Release();
+        }
+
+        // now get the direction
+        hr = pin->QueryDirection(&PinDir);
+        if (SUCCEEDED(hr))
+        {
+            if (PinDir == PINDIR_OUTPUT)
+            {
+                // notify pin via
+                //CBaseStreamControl::SetSyncSource(pClock)
+            }
+        }
+    }
+
+    if (pClock)
+    {
+        pClock->AddRef();
+    }
+
+    if (m_ReferenceClock)
+    {
+        m_ReferenceClock->Release();
+    }
+
+    m_ReferenceClock = pClock;
+    OutputDebugStringW(L"CKsProxy::SetSyncSource done\n");
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::GetSyncSource(
+    IReferenceClock **pClock)
+{
+    OutputDebugStringW(L"CKsProxy::GetSyncSource\n");
+
+    if (!pClock)
+        return E_POINTER;
+
+    if (m_ReferenceClock)
+        m_ReferenceClock->AddRef();
+
+    *pClock = m_ReferenceClock;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::EnumPins(
+    IEnumPins **ppEnum)
+{
+    OutputDebugStringW(L"CKsProxy::EnumPins\n");
+    return CEnumPins_fnConstructor(m_Pins, IID_IEnumPins, (void**)ppEnum);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::FindPin(
+    LPCWSTR Id, IPin **ppPin)
+{
+    ULONG PinId;
+
+    OutputDebugStringW(L"CKsProxy::FindPin\n");
+
+    if (!ppPin)
+        return E_POINTER;
+
+    // convert to pin
+    int ret = swscanf(Id, L"%u", &PinId);
+
+    if (!ret || ret == EOF)
+    {
+        // invalid id
+        return VFW_E_NOT_FOUND;
+    }
+
+    if (PinId >= m_Pins.size() || m_Pins[PinId] == NULL)
+    {
+        // invalid id
+        return VFW_E_NOT_FOUND;
+    }
+
+    // found pin
+    *ppPin = m_Pins[PinId];
+    m_Pins[PinId]->AddRef();
+
+    return S_OK;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::QueryFilterInfo(
+    FILTER_INFO *pInfo)
+{
+    if (!pInfo)
+        return E_POINTER;
+
+    OutputDebugStringW(L"CKsProxy::QueryFilterInfo\n");
+
+    pInfo->achName[0] = L'\0';
+    pInfo->pGraph = m_pGraph;
+
+    if (m_pGraph)
+        m_pGraph->AddRef();
+
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::JoinFilterGraph(
+    IFilterGraph *pGraph,
+    LPCWSTR pName)
+{
+    OutputDebugStringW(L"CKsProxy::JoinFilterGraph\n");
+
+    if (pGraph)
+    {
+        // joining filter graph
+        m_pGraph = pGraph;
+    }
+    else
+    {
+        // leaving graph
+        m_pGraph = 0;
+    }
+
+    return S_OK;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::QueryVendorInfo(
+    LPWSTR *pVendorInfo)
+{
+    OutputDebugStringW(L"CKsProxy::QueryVendorInfo\n");
+    return StringFromCLSID(CLSID_Proxy, pVendorInfo);
+}
+
+//-------------------------------------------------------------------
+// IAMovieSetup interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Register()
+{
+    OutputDebugStringW(L"CKsProxy::Register : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CKsProxy::Unregister()
+{
+    OutputDebugStringW(L"CKsProxy::Unregister : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CKsProxy_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    WCHAR Buffer[100];
+    LPOLESTR pstr;
+    StringFromCLSID(riid, &pstr);
+    swprintf(Buffer, L"CKsProxy_Constructor pUnkOuter %p riid %s\n", pUnkOuter, pstr);
+    OutputDebugStringW(Buffer);
+
+    CKsProxy * handler = new CKsProxy();
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return S_OK;
+}
diff --git a/reactos/dll/directx/ksproxy/qualityforward.cpp b/reactos/dll/directx/ksproxy/qualityforward.cpp
new file mode 100644 (file)
index 0000000..88459d8
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
+ * FILE:            dll/directx/ksproxy/clockforward.cpp
+ * PURPOSE:         IKsClockForwarder interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+#ifndef _MSC_VER
+const GUID KSCATEGORY_QUALITY = {0x97EBAACB, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
+#endif
+
+#define IID_IKsQualityForwarder KSCATEGORY_QUALITY
+
+class CKsQualityForwarder : public IKsQualityForwarder
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IKsObject interface
+    HANDLE STDMETHODCALLTYPE KsGetObjectHandle();
+
+    // IKsQualityForwarder
+    VOID STDMETHODCALLTYPE KsFlushClient(IN IKsPin  *Pin); 
+
+    CKsQualityForwarder(HANDLE handle) : m_Ref(0), m_Handle(handle){}
+    virtual ~CKsQualityForwarder(){ if (m_Handle) CloseHandle(m_Handle);}
+
+protected:
+    LONG m_Ref;
+    HANDLE m_Handle;
+
+
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CKsQualityForwarder::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown) ||
+        IsEqualGUID(refiid, IID_IKsQualityForwarder))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IKsObject interface
+//
+
+HANDLE
+STDMETHODCALLTYPE
+CKsQualityForwarder::KsGetObjectHandle()
+{
+    return m_Handle;
+}
+
+//-------------------------------------------------------------------
+// IKsQualityForwarder interface
+//
+VOID
+STDMETHODCALLTYPE
+CKsQualityForwarder::KsFlushClient(
+    IN IKsPin  *Pin)
+{
+    OutputDebugString("UNIMPLEMENTED\n");
+}
+
+HRESULT
+WINAPI
+CKsQualityForwarder_Constructor(
+    IUnknown * pUnkOuter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    HRESULT hr;
+    HANDLE handle;
+
+    OutputDebugStringW(L"CKsQualityForwarder_Constructor\n");
+
+    // open default clock
+    hr = KsOpenDefaultDevice(KSCATEGORY_QUALITY, GENERIC_READ | GENERIC_WRITE, &handle);
+
+    if (hr != NOERROR)
+    {
+         OutputDebugString("CKsClockForwarder_Constructor failed to open device\n");
+         return hr;
+    }
+
+    CKsQualityForwarder * quality = new CKsQualityForwarder(handle);
+
+    if (!quality)
+    {
+        // free clock handle
+        CloseHandle(handle);
+        return E_OUTOFMEMORY;
+    }
+
+    if (FAILED(quality->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete quality;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
index 8d56523..8f62abf 100644 (file)
@@ -92,7 +92,7 @@ KsiCreateObjectType( HANDLE hHandle,
 *
 *--*/
 KSDDKAPI
-NTSTATUS
+DWORD
 NTAPI
 KsCreateAllocator(HANDLE ConnectionHandle,
                   PKSALLOCATOR_FRAMING AllocatorFraming,
@@ -130,7 +130,7 @@ KsCreateAllocator(HANDLE ConnectionHandle,
 *
 *--*/
 KSDDKAPI
-NTSTATUS
+DWORD
 NTAPI
 KsCreateClock(HANDLE ConnectionHandle,
               PKSCLOCK_CREATE ClockCreate,
@@ -225,7 +225,7 @@ KsCreatePin(HANDLE FilterHandle,
 *
 *--*/
 KSDDKAPI
-NTSTATUS
+DWORD
 NTAPI
 KsCreateTopologyNode(HANDLE ParentHandle,
                      PKSNODE_CREATE NodeCreate,
index 1d60b17..de44aab 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef KSUSER_H__
-#define KSUSER_H__
+#pragma once
 
 #define _KSDDK_
 
@@ -15,5 +14,3 @@
 
 #define ROUND_UP(n, align) \
     ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
-
-#endif
index ce4ee04..a3dc930 100644 (file)
@@ -787,11 +787,11 @@ HRESULT read_types(HKEY root, LPCWSTR key, ULONG *supplied, ULONG requested, DMO
  * DMOGetTypes (MSDMO.@)
  */
 HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO,
-               unsigned long ulInputTypesRequested,
-               unsigned long* pulInputTypesSupplied,
+               ULONG ulInputTypesRequested,
+               ULONG* pulInputTypesSupplied,
                DMO_PARTIAL_MEDIATYPE* pInputTypes,
-               unsigned long ulOutputTypesRequested,
-               unsigned long* pulOutputTypesSupplied,
+               ULONG ulOutputTypesRequested,
+               ULONG* pulOutputTypesSupplied,
                DMO_PARTIAL_MEDIATYPE* pOutputTypes)
 {
   HKEY root,hkey;
@@ -815,7 +815,7 @@ HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO,
 
   if (ulInputTypesRequested > 0)
   {
-    ret = read_types(hkey, szDMOInputType, (ULONG*)pulInputTypesSupplied, ulInputTypesRequested, pInputTypes );
+    ret = read_types(hkey, szDMOInputType, pulInputTypesSupplied, ulInputTypesRequested, pInputTypes );
   }
   else
     *pulInputTypesSupplied = 0;
@@ -823,7 +823,7 @@ HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO,
   if (ulOutputTypesRequested > 0)
   {
     HRESULT ret2;
-    ret2 = read_types(hkey, szDMOOutputType, (ULONG*)pulOutputTypesSupplied, ulOutputTypesRequested, pOutputTypes );
+    ret2 = read_types(hkey, szDMOOutputType, pulOutputTypesSupplied, ulOutputTypesRequested, pOutputTypes );
 
     if (ret == S_OK)
         ret = ret2;
diff --git a/reactos/dll/directx/msdvbnp/classfactory.cpp b/reactos/dll/directx/msdvbnp/classfactory.cpp
new file mode 100644 (file)
index 0000000..89b61c4
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/msdvbnp/classfactory.cpp
+ * PURPOSE:         IClassFactory interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID IID_IUnknown           = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+const GUID IID_IClassFactory      = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+
+class CClassFactory : public IClassFactory
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
+    HRESULT WINAPI LockServer(BOOL fLock);
+
+    CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst)
+    {};
+
+    virtual ~CClassFactory(){};
+
+protected:
+    LONG m_Ref;
+    LPFNCREATEINSTANCE m_lpfnCI;
+    IID * m_IID;
+};
+
+HRESULT
+WINAPI
+CClassFactory::QueryInterface(
+    REFIID riid,
+    LPVOID *ppvObj)
+{
+    *ppvObj = NULL;
+    if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
+    {
+        *ppvObj = PVOID(this);
+        InterlockedIncrement(&m_Ref);
+        return S_OK;
+    }
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::CreateInstance(
+    LPUNKNOWN pUnkOuter,
+    REFIID riid,
+    LPVOID *ppvObject)
+{
+    *ppvObject = NULL;
+
+    if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown))
+    {
+        return m_lpfnCI(pUnkOuter, riid, ppvObject);
+    }
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::LockServer(
+    BOOL fLock)
+{
+    return E_NOTIMPL;
+}
+
+IClassFactory * 
+CClassFactory_fnConstructor(
+    LPFNCREATEINSTANCE lpfnCI, 
+    PLONG pcRefDll, 
+    IID * riidInst)
+{
+    CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst);
+
+    if (!factory)
+        return NULL;
+
+    if (pcRefDll)
+        InterlockedIncrement(pcRefDll);
+
+    return (LPCLASSFACTORY)factory;
+}
diff --git a/reactos/dll/directx/msdvbnp/enum_mediatypes.cpp b/reactos/dll/directx/msdvbnp/enum_mediatypes.cpp
new file mode 100644 (file)
index 0000000..6cd887f
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Network Provider for MPEG2 based networks
+ * FILE:            dll/directx/msdvbnp/enum_mediatypes.cpp
+ * PURPOSE:         IEnumMediaTypes interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumMediaTypes : public IEnumMediaTypes
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    HRESULT STDMETHODCALLTYPE Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched);
+    HRESULT STDMETHODCALLTYPE Skip(ULONG cMediaTypes);
+    HRESULT STDMETHODCALLTYPE Reset();
+    HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **ppEnum);
+
+
+    CEnumMediaTypes(ULONG MediaTypeCount, AM_MEDIA_TYPE * MediaTypes) : m_Ref(0), m_MediaTypeCount(MediaTypeCount), m_MediaTypes(MediaTypes), m_Index(0){};
+    virtual ~CEnumMediaTypes(){};
+
+protected:
+    LONG m_Ref;
+    ULONG m_MediaTypeCount;
+    AM_MEDIA_TYPE * m_MediaTypes;
+    ULONG m_Index;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IEnumMediaTypes))
+    {
+        *Output = (IEnumMediaTypes*)(this);
+        reinterpret_cast<IEnumMediaTypes*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IEnumMediaTypes
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Next(
+    ULONG cMediaTypes,
+    AM_MEDIA_TYPE **ppMediaTypes,
+    ULONG *pcFetched)
+{
+    ULONG i = 0;
+    AM_MEDIA_TYPE * MediaType;
+
+    if (!ppMediaTypes)
+        return E_POINTER;
+
+    if (cMediaTypes > 1 && !pcFetched)
+        return E_INVALIDARG;
+
+    while(i < cMediaTypes)
+    {
+        if (m_Index + i >= m_MediaTypeCount)
+            break;
+
+        MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+        if (!MediaType)
+            break;
+
+        CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE));
+        ppMediaTypes[i] = MediaType;
+        i++;
+    }
+
+    if (pcFetched)
+    {
+        *pcFetched = i;
+    }
+
+    m_Index += i;
+
+    if (i < cMediaTypes)
+        return S_FALSE;
+    else
+        return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Skip(
+    ULONG cMediaTypes)
+{
+    if (cMediaTypes + m_Index >= m_MediaTypeCount)
+    {
+        return S_FALSE;
+    }
+
+    m_Index += cMediaTypes;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Reset()
+{
+    m_Index = 0;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumMediaTypes::Clone(
+    IEnumMediaTypes **ppEnum)
+{
+    OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumMediaTypes_fnConstructor(
+    IUnknown *pUnknown,
+    ULONG MediaTypeCount,
+    AM_MEDIA_TYPE * MediaTypes,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    CEnumMediaTypes * handler = new CEnumMediaTypes(MediaTypeCount, MediaTypes);
+
+#ifdef MSDVBNP_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(riid, &lpstr);
+    swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (!handler)
+    {
+        CoTaskMemFree(MediaTypes);
+        return E_OUTOFMEMORY;
+    }
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
+
diff --git a/reactos/dll/directx/msdvbnp/enumpins.cpp b/reactos/dll/directx/msdvbnp/enumpins.cpp
new file mode 100644 (file)
index 0000000..5677059
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Network Provider for MPEG2 based networks
+ * FILE:            dll/directx/msdvbnp/enumpins.cpp
+ * PURPOSE:         IEnumPins interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumPins : public IEnumPins
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+
+    HRESULT STDMETHODCALLTYPE Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched);
+    HRESULT STDMETHODCALLTYPE Skip(ULONG cPins);
+    HRESULT STDMETHODCALLTYPE Reset();
+    HRESULT STDMETHODCALLTYPE Clone(IEnumPins **ppEnum);
+
+    CEnumPins(ULONG NumPins, IPin ** pins) : m_Ref(0), m_NumPins(NumPins), m_Pins(pins), m_Index(0){};
+    virtual ~CEnumPins(){};
+
+protected:
+    LONG m_Ref;
+    ULONG m_NumPins;
+    IPin ** m_Pins;
+    ULONG m_Index;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IEnumPins))
+    {
+        *Output = (IEnumPins*)(this);
+        reinterpret_cast<IEnumPins*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CEnumPins::QueryInterface: NoInterface for %s\n", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Next(
+    ULONG cPins,
+    IPin **ppPins,
+    ULONG *pcFetched)
+{
+    ULONG i = 0;
+
+    if (!ppPins)
+        return E_POINTER;
+
+    if (cPins > 1 && !pcFetched)
+        return E_INVALIDARG;
+
+    while(i < cPins)
+    {
+        if (m_Index + i >= m_NumPins)
+            break;
+
+        ppPins[i] = m_Pins[m_Index + i];
+        m_Pins[m_Index + i]->AddRef();
+
+        i++;
+    }
+
+    if (pcFetched)
+    {
+        *pcFetched = i;
+    }
+
+    m_Index += i;
+
+    if (i < cPins)
+        return S_FALSE;
+    else
+        return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Skip(
+    ULONG cPins)
+{
+    if (cPins + m_Index >= m_NumPins)
+    {
+        return S_FALSE;
+    }
+
+    m_Index += cPins;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Reset()
+{
+    m_Index = 0;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumPins::Clone(
+    IEnumPins **ppEnum)
+{
+    OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumPins_fnConstructor(
+    IUnknown *pUnknown,
+    ULONG NumPins,
+    IPin ** pins,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    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;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
\ No newline at end of file
diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.cpp b/reactos/dll/directx/msdvbnp/msdvbnp.cpp
new file mode 100644 (file)
index 0000000..037a67e
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Network Provider for MPEG2 based networks
+ * FILE:            dll/directx/msdvbnp/msdvbnp.cpp
+ * PURPOSE:         COM Initialization
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}};
+
+static INTERFACE_TABLE InterfaceTable[] =
+{
+    {&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor},
+    {NULL, NULL}
+};
+
+extern "C"
+BOOL
+WINAPI
+DllMain(
+    HINSTANCE hInstDLL,
+    DWORD fdwReason,
+    LPVOID lpvReserved)
+{
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            CoInitialize(NULL);
+
+#ifdef MSDVBNP_TRACE
+            OutputDebugStringW(L"MSDVBNP::DllMain()\n");
+#endif
+
+            DisableThreadLibraryCalls(hInstDLL);
+            break;
+    default:
+        break;
+    }
+
+    return TRUE;
+}
+
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllUnregisterServer(void)
+{
+    return S_OK;
+}
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllRegisterServer(void)
+{
+    return S_OK;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllGetClassObject(
+    REFCLSID rclsid,
+    REFIID riid,
+    LPVOID *ppv)
+{
+    UINT i;
+    HRESULT hres = E_OUTOFMEMORY;
+    IClassFactory * pcf = NULL;        
+
+    if (!ppv)
+        return E_INVALIDARG;
+
+    *ppv = NULL;
+
+    for (i = 0; InterfaceTable[i].riid; i++) 
+    {
+        if (IsEqualIID(*InterfaceTable[i].riid, rclsid)) 
+        {
+            pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
+            break;
+        }
+    }
+
+    if (!pcf) 
+    {
+        return CLASS_E_CLASSNOTAVAILABLE;
+    }
+
+    hres = pcf->QueryInterface(riid, ppv);
+    pcf->Release();
+
+    return hres;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllCanUnloadNow(void)
+{
+    return S_OK;
+}
diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.rbuild b/reactos/dll/directx/msdvbnp/msdvbnp.rbuild
new file mode 100644 (file)
index 0000000..6213d7d
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<group>
+<module name="msdvbnp" type="win32dll" baseaddress="${BASEADDRESS_MSDVBNP}" installbase="system32" installname="msdvbnp.ax">
+       <importlibrary definition="msdvbnp.spec" />
+       <include base="msdvbnp">.</include>
+       <library>ntdll</library>
+       <library>kernel32</library>
+       <library>advapi32</library>
+       <library>ole32</library>
+       <library>advapi32</library>
+       <library>msvcrt</library>
+       <library>strmiids</library>
+       <group compilerset="gcc">
+               <compilerflag compiler="cxx">-fno-exceptions</compilerflag>
+               <compilerflag compiler="cxx">-fno-rtti</compilerflag>
+       </group>
+       <group compilerset="msc">
+               <compilerflag compiler="cxx">/GR-</compilerflag>
+       </group>
+
+       <file>classfactory.cpp</file>
+       <file>enum_mediatypes.cpp</file>
+       <file>enumpins.cpp</file>
+       <file>msdvbnp.cpp</file>
+       <file>msdvbnp.rc</file>
+       <file>networkprovider.cpp</file>
+       <file>pin.cpp</file>
+       <file>scanningtuner.cpp</file>
+</module>
+</group>
diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.rc b/reactos/dll/directx/msdvbnp/msdvbnp.rc
new file mode 100644 (file)
index 0000000..7df396e
--- /dev/null
@@ -0,0 +1,12 @@
+#include <windows.h>
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION   "ReactOS Network Provider for MPEG2 based networks\0"
+#define REACTOS_STR_INTERNAL_NAME      "MSDvBNP.ax\0"
+#define REACTOS_STR_ORIGINAL_FILENAME  "MSDvBNP.ax\0"
+#define REACTOS_STR_PRODUCT_VERSION     "6.5.2600.3264\0"
+#define REACTOS_STR_FILE_VERSION        "6.5.2600.3264\0"
+
+#include <reactos/version.rc>
diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.spec b/reactos/dll/directx/msdvbnp/msdvbnp.spec
new file mode 100644 (file)
index 0000000..5baed04
--- /dev/null
@@ -0,0 +1,4 @@
+@ stdcall DllCanUnloadNow()
+@ stdcall DllGetClassObject(ptr ptr ptr)
+@ stdcall DllRegisterServer()
+@ stdcall DllUnregisterServer()
diff --git a/reactos/dll/directx/msdvbnp/networkprovider.cpp b/reactos/dll/directx/msdvbnp/networkprovider.cpp
new file mode 100644 (file)
index 0000000..c69c233
--- /dev/null
@@ -0,0 +1,378 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Network Provider for MPEG2 based networks
+ * FILE:            dll/directx/msdvbnp/networkprovider.cpp
+ * PURPOSE:         IBDA_NetworkProvider interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CNetworkProvider : public IBaseFilter,
+                         public IAMovieSetup,
+                         public IBDA_NetworkProvider
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IBaseFilter methods
+    HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
+    HRESULT STDMETHODCALLTYPE Stop( void);
+    HRESULT STDMETHODCALLTYPE Pause( void);
+    HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
+    HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *State);
+    HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock);
+    HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **pClock);
+    HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum);
+    HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin);
+    HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo);
+    HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName);
+    HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo);
+
+    //IAMovieSetup methods
+    HRESULT STDMETHODCALLTYPE Register( void);
+    HRESULT STDMETHODCALLTYPE Unregister( void);
+
+    //IBDA_NetworkProvider methods
+    HRESULT STDMETHODCALLTYPE PutSignalSource(ULONG ulSignalSource);
+    HRESULT STDMETHODCALLTYPE GetSignalSource(ULONG *pulSignalSource);
+    HRESULT STDMETHODCALLTYPE GetNetworkType(GUID *pguidNetworkType);
+    HRESULT STDMETHODCALLTYPE PutTuningSpace(REFGUID guidTuningSpace);
+    HRESULT STDMETHODCALLTYPE GetTuningSpace(GUID *pguidTuingSpace);
+    HRESULT STDMETHODCALLTYPE RegisterDeviceFilter(IUnknown *pUnkFilterControl, ULONG *ppvRegisitrationContext);
+    HRESULT STDMETHODCALLTYPE UnRegisterDeviceFilter(ULONG pvRegistrationContext);
+
+    CNetworkProvider() : m_Ref(0), m_pGraph(0), m_ReferenceClock(0), m_FilterState(State_Stopped) {m_Pins[0] = 0;};
+    virtual ~CNetworkProvider(){};
+
+protected:
+    LONG m_Ref;
+    IFilterGraph *m_pGraph;
+    IReferenceClock * m_ReferenceClock;
+    FILTER_STATE m_FilterState;
+    IPin * m_Pins[1];
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    *Output = NULL;
+
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IBaseFilter))
+    {
+        *Output = (IBaseFilter*)(this);
+        reinterpret_cast<IBaseFilter*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_ITuner) ||
+        IsEqualGUID(refiid, IID_IScanningTuner))
+    {
+        // construct scanning tuner
+        return CScanningTunner_fnConstructor(NULL, refiid, Output);
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CNetworkProvider::QueryInterface: NoInterface for %s !!!\n", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IBaseFilter interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetClassID(
+    CLSID *pClassID)
+{
+    OutputDebugStringW(L"CNetworkProvider::GetClassID : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Stop()
+{
+    OutputDebugStringW(L"CNetworkProvider::Stop : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Pause()
+{
+    OutputDebugStringW(L"CNetworkProvider::Pause : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Run(
+    REFERENCE_TIME tStart)
+{
+    OutputDebugStringW(L"CNetworkProvider::Run : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetState(
+    DWORD dwMilliSecsTimeout,
+    FILTER_STATE *State)
+{
+    *State = m_FilterState;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::SetSyncSource(
+    IReferenceClock *pClock)
+{
+    if (pClock)
+    {
+        pClock->AddRef();
+
+    }
+
+    if (m_ReferenceClock)
+    {
+        m_ReferenceClock->Release();
+    }
+
+    m_ReferenceClock = pClock;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetSyncSource(
+    IReferenceClock **pClock)
+{
+    if (!pClock)
+        return E_POINTER;
+
+    if (m_ReferenceClock)
+        m_ReferenceClock->AddRef();
+
+    *pClock = m_ReferenceClock;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::EnumPins(
+    IEnumPins **ppEnum)
+{
+    if (m_Pins[0] == 0)
+    {
+        HRESULT hr = CPin_fnConstructor(NULL, (IBaseFilter*)this, IID_IUnknown, (void**)&m_Pins[0]);
+        if (FAILED(hr))
+            return hr;
+    }
+
+    return CEnumPins_fnConstructor(NULL, 1, m_Pins, IID_IEnumPins, (void**)ppEnum);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::FindPin(
+    LPCWSTR Id, IPin **ppPin)
+{
+    OutputDebugStringW(L"CNetworkProvider::FindPin : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::QueryFilterInfo(
+    FILTER_INFO *pInfo)
+{
+    if (!pInfo)
+        return E_POINTER;
+
+    pInfo->achName[0] = L'\0';
+    pInfo->pGraph = m_pGraph;
+
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::JoinFilterGraph(
+    IFilterGraph *pGraph,
+    LPCWSTR pName)
+{
+    if (pGraph)
+    {
+        // joining filter graph
+        m_pGraph = pGraph;
+    }
+    else
+    {
+        // leaving graph
+        m_pGraph = 0;
+    }
+
+    OutputDebugStringW(L"CNetworkProvider::JoinFilterGraph\n");
+    return S_OK;
+}
+
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::QueryVendorInfo(
+    LPWSTR *pVendorInfo)
+{
+    OutputDebugStringW(L"CNetworkProvider::QueryVendorInfo : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IAMovieSetup interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Register()
+{
+    OutputDebugStringW(L"CNetworkProvider::Register : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::Unregister()
+{
+    OutputDebugStringW(L"CNetworkProvider::Unregister : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IBDA_NetworkProvider interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::PutSignalSource(
+    ULONG ulSignalSource)
+{
+    OutputDebugStringW(L"CNetworkProvider::PutSignalSource : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetSignalSource(
+    ULONG *pulSignalSource)
+{
+    OutputDebugStringW(L"CNetworkProvider::GetSignalSource : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetNetworkType(
+    GUID *pguidNetworkType)
+{
+    OutputDebugStringW(L"CNetworkProvider::GetNetworkType : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::PutTuningSpace(
+    REFGUID guidTuningSpace)
+{
+    OutputDebugStringW(L"CNetworkProvider::PutTuningSpace : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::GetTuningSpace(
+    GUID *pguidTuingSpace)
+{
+    OutputDebugStringW(L"CNetworkProvider::GetTuningSpace : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::RegisterDeviceFilter(
+    IUnknown *pUnkFilterControl,
+    ULONG *ppvRegisitrationContext)
+{
+    OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CNetworkProvider::UnRegisterDeviceFilter(ULONG pvRegistrationContext)
+{
+    OutputDebugStringW(L"CNetworkProvider::UnRegisterDeviceFilter : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CNetworkProvider_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    CNetworkProvider * handler = new CNetworkProvider();
+
+#ifdef MSDVBNP_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(riid, &lpstr);
+    swprintf(Buffer, L"CNetworkProvider_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/msdvbnp/pin.cpp b/reactos/dll/directx/msdvbnp/pin.cpp
new file mode 100644 (file)
index 0000000..9662f80
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Network Provider for MPEG2 based networks
+ * FILE:            dll/directx/msdvbnp/pin.cpp
+ * PURPOSE:         IPin interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID KSDATAFORMAT_TYPE_BDA_ANTENNA = {0x71985f41, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
+const GUID GUID_NULL                     = {0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+
+class CPin : public IPin
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    //IPin methods
+    HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE Disconnect();
+    HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pPin);
+    HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo);
+    HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir);
+    HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id);
+    HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt);
+    HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum);
+    HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin);
+    HRESULT STDMETHODCALLTYPE EndOfStream();
+    HRESULT STDMETHODCALLTYPE BeginFlush();
+    HRESULT STDMETHODCALLTYPE EndFlush();
+    HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+    CPin(IBaseFilter * ParentFilter) : m_Ref(0), m_ParentFilter(ParentFilter){};
+    virtual ~CPin(){};
+
+    static LPCWSTR PIN_ID;
+
+protected:
+    LONG m_Ref;
+    IBaseFilter * m_ParentFilter;
+};
+
+
+LPCWSTR CPin::PIN_ID = L"Antenna Out";
+
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_IPin))
+    {
+        *Output = (IPin*)(this);
+        reinterpret_cast<IPin*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CPin::QueryInterface: NoInterface for %s\n", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IPin interface
+//
+HRESULT
+STDMETHODCALLTYPE
+CPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
+{
+    OutputDebugStringW(L"CPin::Connect called\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt)
+{
+    OutputDebugStringW(L"CPin::ReceiveConnection called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::Disconnect( void)
+{
+    OutputDebugStringW(L"CPin::Disconnect called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::ConnectedTo(IPin **pPin)
+{
+    OutputDebugStringW(L"CPin::ConnectedTo called\n");
+    return VFW_E_NOT_CONNECTED;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt)
+{
+    OutputDebugStringW(L"CPin::ConnectionMediaType called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryPinInfo(PIN_INFO *pInfo)
+{
+    wcscpy(pInfo->achName, PIN_ID);
+    pInfo->dir = PINDIR_OUTPUT;
+    pInfo->pFilter = m_ParentFilter;
+    m_ParentFilter->AddRef();
+
+    return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryDirection(PIN_DIRECTION *pPinDir)
+{
+    if (pPinDir)
+    {
+        *pPinDir = PINDIR_OUTPUT;
+        return S_OK;
+    }
+
+    return E_POINTER;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryId(LPWSTR *Id)
+{
+    *Id = (LPWSTR)CoTaskMemAlloc(sizeof(PIN_ID));
+    if (!*Id)
+        return E_OUTOFMEMORY;
+
+    wcscpy(*Id, PIN_ID);
+    return S_OK;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryAccept(const AM_MEDIA_TYPE *pmt)
+{
+    OutputDebugStringW(L"CPin::QueryAccept called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::EnumMediaTypes(IEnumMediaTypes **ppEnum)
+{
+    AM_MEDIA_TYPE *MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+
+    if (!MediaType)
+    {
+        return E_OUTOFMEMORY;
+    }
+
+    MediaType->majortype = KSDATAFORMAT_TYPE_BDA_ANTENNA;
+    MediaType->subtype = MEDIASUBTYPE_None;
+    MediaType->formattype = FORMAT_None;
+    MediaType->bFixedSizeSamples = true;
+    MediaType->bTemporalCompression = false;
+    MediaType->lSampleSize = sizeof(CHAR);
+    MediaType->pUnk = NULL;
+    MediaType->cbFormat = 0;
+    MediaType->pbFormat = NULL;
+
+    return CEnumMediaTypes_fnConstructor(NULL, 1, MediaType, IID_IEnumMediaTypes, (void**)ppEnum);
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::QueryInternalConnections(IPin **apPin, ULONG *nPin)
+{
+    OutputDebugStringW(L"CPin::QueryInternalConnections called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::EndOfStream( void)
+{
+    OutputDebugStringW(L"CPin::EndOfStream called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::BeginFlush( void)
+{
+    OutputDebugStringW(L"CPin::BeginFlush called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::EndFlush( void)
+{
+    OutputDebugStringW(L"CPin::EndFlush called\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
+{
+    OutputDebugStringW(L"CPin::NewSegment called\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CPin_fnConstructor(
+    IUnknown *pUnknown,
+    IBaseFilter * ParentFilter,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    CPin * handler = new CPin(ParentFilter);
+
+#ifdef MSDVBNP_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(riid, &lpstr);
+    swprintf(Buffer, L"CPin_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
\ No newline at end of file
diff --git a/reactos/dll/directx/msdvbnp/precomp.h b/reactos/dll/directx/msdvbnp/precomp.h
new file mode 100644 (file)
index 0000000..d20b9ac
--- /dev/null
@@ -0,0 +1,82 @@
+#ifndef PRECOMP_H__
+#define PRECOMP_H__
+
+#define MSDVBNP_TRACE
+#define BUILDING_KS
+#define _KSDDK_
+#include <dshow.h>
+//#include <streams.h>
+#include <ks.h>
+#define __STREAMS__
+#include <ksproxy.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <tchar.h>
+#include <uuids.h>
+#include <bdatypes.h>
+#include <bdaiface.h>
+#include <bdamedia.h>
+#include <tuner.h>
+#include <assert.h>
+
+typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
+
+typedef struct
+{
+    const GUID* riid;
+    LPFNCREATEINSTANCE lpfnCI;
+} INTERFACE_TABLE;
+
+/* classfactory.cpp */
+IClassFactory *
+CClassFactory_fnConstructor(
+    LPFNCREATEINSTANCE lpfnCI,
+    PLONG pcRefDll,
+    IID * riidInst);
+
+/* networkprovider.cpp */
+HRESULT
+WINAPI
+CNetworkProvider_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* scanningtunner.cpp */
+HRESULT
+WINAPI
+CScanningTunner_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* enumpins.cpp */
+HRESULT
+WINAPI
+CEnumPins_fnConstructor(
+    IUnknown *pUnknown,
+    ULONG NumPins,
+    IPin ** pins,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* pin.cpp */
+HRESULT
+WINAPI
+CPin_fnConstructor(
+    IUnknown *pUnknown,
+    IBaseFilter * ParentFilter,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* enum_mediatypes.cpp */
+HRESULT
+WINAPI
+CEnumMediaTypes_fnConstructor(
+    IUnknown *pUnknown,
+    ULONG MediaTypeCount,
+    AM_MEDIA_TYPE * MediaTypes,
+    REFIID riid,
+    LPVOID * ppv);
+
+#endif
diff --git a/reactos/dll/directx/msdvbnp/scanningtuner.cpp b/reactos/dll/directx/msdvbnp/scanningtuner.cpp
new file mode 100644 (file)
index 0000000..0c9b778
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Network Provider for MPEG2 based networks
+ * FILE:            dll/directx/msdvbnp/networkprovider.cpp
+ * PURPOSE:         IScanningTunner interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CScanningTunner : public IScanningTuner
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    //ITuner methods
+    HRESULT STDMETHODCALLTYPE get_TuningSpace(ITuningSpace **TuningSpace);
+    HRESULT STDMETHODCALLTYPE put_TuningSpace(ITuningSpace *TuningSpace);
+    HRESULT STDMETHODCALLTYPE EnumTuningSpaces(IEnumTuningSpaces **ppEnum);
+    HRESULT STDMETHODCALLTYPE get_TuneRequest(ITuneRequest **TuneRequest);
+    HRESULT STDMETHODCALLTYPE put_TuneRequest(ITuneRequest *TuneRequest);
+    HRESULT STDMETHODCALLTYPE Validate(ITuneRequest *TuneRequest);
+    HRESULT STDMETHODCALLTYPE get_PreferredComponentTypes(IComponentTypes **ComponentTypes);
+    HRESULT STDMETHODCALLTYPE put_PreferredComponentTypes(IComponentTypes *ComponentTypes);
+    HRESULT STDMETHODCALLTYPE get_SignalStrength(long *Strength);
+    HRESULT STDMETHODCALLTYPE TriggerSignalEvents(long Interval);
+
+    //IScanningTuner methods
+    HRESULT STDMETHODCALLTYPE SeekUp();
+    HRESULT STDMETHODCALLTYPE SeekDown();
+    HRESULT STDMETHODCALLTYPE ScanUp(long MillisecondsPause);
+    HRESULT STDMETHODCALLTYPE ScanDown(long MillisecondsPause);
+    HRESULT STDMETHODCALLTYPE AutoProgram();
+
+    CScanningTunner() : m_Ref(0), m_TuningSpace(0){};
+    virtual ~CScanningTunner(){};
+
+protected:
+    LONG m_Ref;
+    ITuningSpace * m_TuningSpace;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+    if (IsEqualGUID(refiid, IID_ITuner))
+    {
+        *Output = (ITuner*)(this);
+        reinterpret_cast<ITuner*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IScanningTuner))
+    {
+        *Output = (IScanningTuner*)(this);
+        reinterpret_cast<IScanningTuner*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CScanningTunner::QueryInterface: NoInterface for %s\n", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+//ITuner
+//
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::get_TuningSpace(
+    ITuningSpace **TuningSpace)
+{
+    OutputDebugStringW(L"CScanningTunner::get_TuningSpace\n");
+
+    *TuningSpace = m_TuningSpace;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::put_TuningSpace(
+    ITuningSpace *TuningSpace)
+{
+    OutputDebugStringW(L"CScanningTunner::put_TuningSpace\n");
+    m_TuningSpace = TuningSpace;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::EnumTuningSpaces(
+    IEnumTuningSpaces **ppEnum)
+{
+    OutputDebugStringW(L"CScanningTunner::EnumTuningSpaces : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::get_TuneRequest(
+    ITuneRequest **TuneRequest)
+{
+    OutputDebugStringW(L"CScanningTunner::get_TuneRequest : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::put_TuneRequest(
+    ITuneRequest *TuneRequest)
+{
+    OutputDebugStringW(L"CScanningTunner::put_TuneRequest : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::Validate(
+    ITuneRequest *TuneRequest)
+{
+    OutputDebugStringW(L"CScanningTunner::Validate : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::get_PreferredComponentTypes(
+    IComponentTypes **ComponentTypes)
+{
+    OutputDebugStringW(L"CScanningTunner::get_PreferredComponentTypes : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::put_PreferredComponentTypes(
+    IComponentTypes *ComponentTypes)
+{
+    OutputDebugStringW(L"CScanningTunner::put_PreferredComponentTypes : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::get_SignalStrength(
+    long *Strength)
+{
+    OutputDebugStringW(L"CScanningTunner::get_SignalStrength : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::TriggerSignalEvents(
+    long Interval)
+{
+    OutputDebugStringW(L"CScanningTunner::TriggerSignalEvents : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+//IScanningTuner
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::SeekUp()
+{
+    OutputDebugStringW(L"CScanningTunner::SeekUp : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::SeekDown()
+{
+    OutputDebugStringW(L"CScanningTunner::SeekDown : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::ScanUp(
+    long MillisecondsPause)
+{
+    OutputDebugStringW(L"CScanningTunner::ScanUp : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::ScanDown(
+    long MillisecondsPause)
+{
+    OutputDebugStringW(L"CScanningTunner::ScanDown : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CScanningTunner::AutoProgram()
+{
+    OutputDebugStringW(L"CScanningTunner::AutoProgram : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CScanningTunner_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    CScanningTunner * handler = new CScanningTunner();
+
+#ifdef MSDVBNP_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(riid, &lpstr);
+    swprintf(Buffer, L"CScanningTunner_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (!handler)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(handler->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete handler;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
\ No newline at end of file
diff --git a/reactos/dll/directx/msvidctl/classfactory.cpp b/reactos/dll/directx/msvidctl/classfactory.cpp
new file mode 100644 (file)
index 0000000..8af2a69
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/msvidctl/classfactory.cpp
+ * PURPOSE:         ClassFactory interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID IID_IUnknown           = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+const GUID IID_IClassFactory      = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+
+class CClassFactory : public IClassFactory
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject);
+    HRESULT WINAPI LockServer(BOOL fLock);
+
+    CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst)
+    {};
+
+    virtual ~CClassFactory(){};
+
+protected:
+    LONG m_Ref;
+    LPFNCREATEINSTANCE m_lpfnCI;
+    IID * m_IID;
+};
+
+HRESULT
+WINAPI
+CClassFactory::QueryInterface(
+    REFIID riid,
+    LPVOID *ppvObj)
+{
+    *ppvObj = NULL;
+    if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
+    {
+        *ppvObj = PVOID(this);
+        InterlockedIncrement(&m_Ref);
+        return S_OK;
+    }
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::CreateInstance(
+    LPUNKNOWN pUnkOuter,
+    REFIID riid,
+    LPVOID *ppvObject)
+{
+    *ppvObject = NULL;
+
+    if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown))
+    {
+        return m_lpfnCI(pUnkOuter, riid, ppvObject);
+    }
+
+    return E_NOINTERFACE;
+}
+
+HRESULT
+WINAPI
+CClassFactory::LockServer(
+    BOOL fLock)
+{
+    return E_NOTIMPL;
+}
+
+IClassFactory * 
+CClassFactory_fnConstructor(
+    LPFNCREATEINSTANCE lpfnCI, 
+    PLONG pcRefDll, 
+    IID * riidInst)
+{
+    CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst);
+
+    if (!factory)
+        return NULL;
+
+    if (pcRefDll)
+        InterlockedIncrement(pcRefDll);
+
+    return (LPCLASSFACTORY)factory;
+}
+
diff --git a/reactos/dll/directx/msvidctl/enumtuningspaces.cpp b/reactos/dll/directx/msvidctl/enumtuningspaces.cpp
new file mode 100644 (file)
index 0000000..22d3e31
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/msvidctl/tuningspace.cpp
+ * PURPOSE:         ITuningSpace interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CEnumTuningSpaces : public IEnumTuningSpaces
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            //delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    // IEnumTuningSpaces methods
+    HRESULT STDMETHODCALLTYPE Next(ULONG celt, ITuningSpace **rgelt, ULONG *pceltFetched);
+    HRESULT STDMETHODCALLTYPE Skip(ULONG celt);
+    HRESULT STDMETHODCALLTYPE Reset();
+    HRESULT STDMETHODCALLTYPE Clone(IEnumTuningSpaces **ppEnum);
+
+    CEnumTuningSpaces() : m_Ref(0){};
+
+    virtual ~CEnumTuningSpaces(){};
+
+protected:
+    LONG m_Ref;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IEnumTuningSpaces))
+    {
+        *Output = (IEnumTuningSpaces*)this;
+        reinterpret_cast<IEnumTuningSpaces*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CEnumTuningSpaces::QueryInterface: NoInterface for %s\n", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IEnumTuningSpaces
+//
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::Next(ULONG celt, ITuningSpace **rgelt, ULONG *pceltFetched)
+{
+    OutputDebugStringW(L"CEnumTuningSpaces::Next : stub\n");
+    return CTuningSpace_fnConstructor(NULL, IID_ITuningSpace, (void**)rgelt);
+
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::Skip(ULONG celt)
+{
+    OutputDebugStringW(L"CEnumTuningSpaces::Skip : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::Reset()
+{
+    OutputDebugStringW(L"CEnumTuningSpaces::Reset : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CEnumTuningSpaces::Clone(IEnumTuningSpaces **ppEnum)
+{
+    OutputDebugStringW(L"CEnumTuningSpaces::Clone : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CEnumTuningSpaces_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    // construct device control
+    CEnumTuningSpaces * tuningspaces = new CEnumTuningSpaces();
+
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(riid, &lpstr);
+    swprintf(Buffer, L"CEnumTuningSpaces_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (!tuningspaces)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(tuningspaces->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete tuningspaces;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
+
diff --git a/reactos/dll/directx/msvidctl/msvidctl.cpp b/reactos/dll/directx/msvidctl/msvidctl.cpp
new file mode 100644 (file)
index 0000000..b086e59
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS DVB
+ * FILE:            dll/directx/msvidctl/msvidctl.cpp
+ * PURPOSE:         ReactOS DVB Initialization
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+
+#include "precomp.h"
+
+static INTERFACE_TABLE InterfaceTable[] =
+{
+    {&CLSID_SystemTuningSpaces, CTuningSpaceContainer_fnConstructor},
+    {NULL, NULL}
+};
+
+extern "C"
+BOOL
+WINAPI
+DllMain(
+    HINSTANCE hInstDLL,
+    DWORD fdwReason,
+    LPVOID lpvReserved)
+{
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            CoInitialize(NULL);
+
+#ifdef MSDVBNP_TRACE
+            OutputDebugStringW(L"MSVIDCTL::DllMain()\n");
+#endif
+
+            DisableThreadLibraryCalls(hInstDLL);
+            break;
+    default:
+        break;
+    }
+
+    return TRUE;
+}
+
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllUnregisterServer(void)
+{
+    return S_OK;
+}
+
+extern "C"
+KSDDKAPI
+HRESULT
+WINAPI
+DllRegisterServer(void)
+{
+    return S_OK;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllGetClassObject(
+    REFCLSID rclsid,
+    REFIID riid,
+    LPVOID *ppv)
+{
+    UINT i;
+    HRESULT hres = E_OUTOFMEMORY;
+    IClassFactory * pcf = NULL;        
+
+    if (!ppv)
+        return E_INVALIDARG;
+
+    *ppv = NULL;
+
+    for (i = 0; InterfaceTable[i].riid; i++) 
+    {
+        if (IsEqualIID(*InterfaceTable[i].riid, rclsid)) 
+        {
+            pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL);
+            break;
+        }
+    }
+
+    if (!pcf) 
+    {
+        return CLASS_E_CLASSNOTAVAILABLE;
+    }
+
+    hres = pcf->QueryInterface(riid, ppv);
+    pcf->Release();
+
+    return hres;
+}
+
+KSDDKAPI
+HRESULT
+WINAPI
+DllCanUnloadNow(void)
+{
+    return S_OK;
+}
diff --git a/reactos/dll/directx/msvidctl/msvidctl.rbuild b/reactos/dll/directx/msvidctl/msvidctl.rbuild
new file mode 100644 (file)
index 0000000..a3da3fc
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<group>
+<module name="msvidctl" type="win32dll" baseaddress="${BASEADDRESS_MSVIDCTL}" installbase="system32" installname="msvidctl.dll">
+       <importlibrary definition="msvidctl.spec" />
+       <include base="msvidctl">.</include>
+       <library>ntdll</library>
+       <library>kernel32</library>
+       <library>advapi32</library>
+       <library>ole32</library>
+       <library>advapi32</library>
+       <library>msvcrt</library>
+       <library>strmiids</library>
+       <group compilerset="gcc">
+               <compilerflag compiler="cxx">-fno-exceptions</compilerflag>
+               <compilerflag compiler="cxx">-fno-rtti</compilerflag>
+       </group>
+       <group compilerset="msc">
+               <compilerflag compiler="cxx">/GR-</compilerflag>
+       </group>
+
+       <file>classfactory.cpp</file>
+       <file>enumtuningspaces.cpp</file>
+       <file>msvidctl.cpp</file>
+       <file>msvidctl.rc</file>
+       <file>tunerequest.cpp</file>
+       <file>tuningspace.cpp</file>
+       <file>tuningspace_container.cpp</file>
+</module>
+</group>
diff --git a/reactos/dll/directx/msvidctl/msvidctl.rc b/reactos/dll/directx/msvidctl/msvidctl.rc
new file mode 100644 (file)
index 0000000..4318790
--- /dev/null
@@ -0,0 +1,12 @@
+#include <windows.h>
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION   "ReactOS ActiveX Control for Streaming Video\0"
+#define REACTOS_STR_INTERNAL_NAME      "MSVidCtl\0"
+#define REACTOS_STR_ORIGINAL_FILENAME  "MSVidCtl\0"
+#define REACTOS_STR_PRODUCT_VERSION     "6.05.2600.3264\0"
+#define REACTOS_STR_FILE_VERSION        "6.05.2600.3264\0"
+
+#include <reactos/version.rc>
diff --git a/reactos/dll/directx/msvidctl/msvidctl.spec b/reactos/dll/directx/msvidctl/msvidctl.spec
new file mode 100644 (file)
index 0000000..5baed04
--- /dev/null
@@ -0,0 +1,4 @@
+@ stdcall DllCanUnloadNow()
+@ stdcall DllGetClassObject(ptr ptr ptr)
+@ stdcall DllRegisterServer()
+@ stdcall DllUnregisterServer()
diff --git a/reactos/dll/directx/msvidctl/precomp.h b/reactos/dll/directx/msvidctl/precomp.h
new file mode 100644 (file)
index 0000000..a5b8627
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef PRECOMP_H__
+#define PRECOMP_H__
+
+#define MSVIDCTL_TRACE
+#define BUILDING_KS
+#define _KSDDK_
+#include <dshow.h>
+//#include <streams.h>
+#include <ks.h>
+#define __STREAMS__
+#include <ksproxy.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <tchar.h>
+#include <uuids.h>
+#include <bdatypes.h>
+#include <bdaiface.h>
+#include <bdamedia.h>
+#include <tuner.h>
+#include <assert.h>
+
+typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject);
+
+typedef struct
+{
+    const GUID* riid;
+    LPFNCREATEINSTANCE lpfnCI;
+} INTERFACE_TABLE;
+
+/* classfactory.cpp */
+IClassFactory *
+CClassFactory_fnConstructor(
+    LPFNCREATEINSTANCE lpfnCI,
+    PLONG pcRefDll,
+    IID * riidInst);
+
+/* tuningspace_container.cpp */
+HRESULT
+WINAPI
+CTuningSpaceContainer_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* tuningspace.cpp */
+HRESULT
+WINAPI
+CTuningSpace_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* tunerequest.cpp */
+HRESULT
+WINAPI
+CTuneRequest_fnConstructor(
+    IUnknown *pUnknown,
+    ITuningSpace * TuningSpace,
+    REFIID riid,
+    LPVOID * ppv);
+
+/* enumtuningspaces.cpp */
+HRESULT
+WINAPI
+CEnumTuningSpaces_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv);
+
+
+
+#endif
diff --git a/reactos/dll/directx/msvidctl/tunerequest.cpp b/reactos/dll/directx/msvidctl/tunerequest.cpp
new file mode 100644 (file)
index 0000000..3bee7cf
--- /dev/null
@@ -0,0 +1,331 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/msvidctl/tuningspace.cpp
+ * PURPOSE:         ITuningRequest interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+class CTuneRequest : public IDVBTuneRequest
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            OutputDebugStringW(L"CTuneRequest::Release : delete\n");
+
+            WCHAR Buffer[100];
+            swprintf(Buffer, L"CTuneRequest::Release : m_TuningSpace %p delete\n", m_TuningSpace);
+            OutputDebugStringW(Buffer);
+
+
+            m_TuningSpace->Release();
+            //delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+    //IDispatch methods
+    HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
+    HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
+    HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
+    HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+
+     //ITuneRequest methods
+    HRESULT STDMETHODCALLTYPE get_TuningSpace(ITuningSpace **TuningSpace);
+    HRESULT STDMETHODCALLTYPE get_Components(IComponents **Components);
+    HRESULT STDMETHODCALLTYPE Clone(ITuneRequest **NewTuneRequest);
+    HRESULT STDMETHODCALLTYPE get_Locator(ILocator **Locator);
+    HRESULT STDMETHODCALLTYPE put_Locator(ILocator *Locator);
+
+    //IDVBTuneRequest methods
+    HRESULT STDMETHODCALLTYPE get_ONID(long *ONID);
+    HRESULT STDMETHODCALLTYPE put_ONID(long ONID);
+    HRESULT STDMETHODCALLTYPE get_TSID(long *TSID);
+    HRESULT STDMETHODCALLTYPE put_TSID(long TSID);
+    HRESULT STDMETHODCALLTYPE get_SID(long *SID);
+    HRESULT STDMETHODCALLTYPE put_SID(long SID);
+
+    CTuneRequest(ITuningSpace * TuningSpace) : m_Ref(0), m_ONID(-1), m_TSID(-1), m_SID(-1), m_Locator(0), m_TuningSpace(TuningSpace)
+    {
+        m_TuningSpace->AddRef();
+    };
+
+    CTuneRequest(ITuningSpace * TuningSpace, LONG ONID, LONG TSID, LONG SID, ILocator * Locator) : m_Ref(1), m_ONID(ONID), m_TSID(TSID), m_SID(SID), m_Locator(Locator), m_TuningSpace(TuningSpace)
+    {
+        if (m_Locator)
+            m_Locator->AddRef();
+
+        m_TuningSpace->AddRef();
+    };
+
+    virtual ~CTuneRequest(){};
+
+protected:
+    LONG m_Ref;
+    LONG m_ONID;
+    LONG m_TSID;
+    LONG m_SID;
+    ILocator * m_Locator;
+    ITuningSpace * m_TuningSpace;
+};
+
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_ITuneRequest))
+    {
+        *Output = (ITuneRequest*)this;
+        reinterpret_cast<ITuneRequest*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IDVBTuneRequest))
+    {
+        *Output = (IDVBTuneRequest*)this;
+        reinterpret_cast<IDVBTuneRequest*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CTuneRequest::QueryInterface: NoInterface for %s", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDispatch methods
+//
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::GetTypeInfoCount(UINT *pctinfo)
+{
+    OutputDebugStringW(L"CTuneRequest::GetTypeInfoCount : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+    OutputDebugStringW(L"CTuneRequest::GetTypeInfo : NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    OutputDebugStringW(L"CTuneRequest::GetIDsOfNames : NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    OutputDebugStringW(L"CTuneRequest::Invoke : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// ITuneRequest interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_TuningSpace(ITuningSpace **TuningSpace)
+{
+#ifdef MSVIDCTL_TRACE
+    OutputDebugStringW(L"CTuneRequest::get_TuningSpace\n");
+#endif
+
+    *TuningSpace = m_TuningSpace;
+    m_TuningSpace->AddRef();
+
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_Components(IComponents **Components)
+{
+    OutputDebugStringW(L"CTuneRequest::get_Components : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::Clone(ITuneRequest **NewTuneRequest)
+{
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CTuneRequest::Clone %p\n", NewTuneRequest);
+    OutputDebugStringW(Buffer);
+#endif
+
+    *NewTuneRequest = new CTuneRequest(m_TuningSpace, m_ONID, m_TSID, m_SID, m_Locator);
+
+    if (!*NewTuneRequest)
+        return E_OUTOFMEMORY;
+
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_Locator(ILocator **Locator)
+{
+    OutputDebugStringW(L"CTuneRequest::get_Locator : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::put_Locator(ILocator *Locator)
+{
+    OutputDebugStringW(L"CTuneRequest::put_Locator : stub\n");
+    m_Locator = Locator;
+
+    return S_OK;
+}
+
+//-------------------------------------------------------------------
+// IDVBTuneRequest interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_ONID(long *ONID)
+{
+#ifdef MSVIDCTL_TRACE
+    OutputDebugStringW(L"CTuneRequest::get_ONID\n");
+#endif
+
+    *ONID = m_ONID;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::put_ONID(long ONID)
+{
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CTuneRequest::put_ONID : %lu\n", ONID);
+    OutputDebugStringW(Buffer);
+#endif
+
+    m_ONID = ONID;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_TSID(long *TSID)
+{
+#ifdef MSVIDCTL_TRACE
+    OutputDebugStringW(L"CTuneRequest::get_TSID\n");
+#endif
+
+   *TSID = m_TSID;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::put_TSID(long TSID)
+{
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CTuneRequest::put_TSID : %lu\n", TSID);
+    OutputDebugStringW(Buffer);
+#endif
+
+    m_TSID = TSID;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::get_SID(long *SID)
+{
+#ifdef MSVIDCTL_TRACE
+    OutputDebugStringW(L"CTuneRequest::get_SID\n");
+#endif
+
+    *SID = m_SID;
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuneRequest::put_SID(long SID)
+{
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CTuneRequest::put_SID : %lu\n", SID);
+    OutputDebugStringW(Buffer);
+#endif
+
+    m_SID = SID;
+    return S_OK;
+}
+
+HRESULT
+WINAPI
+CTuneRequest_fnConstructor(
+    IUnknown *pUnknown,
+    ITuningSpace * TuningSpace,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    // construct device control
+    CTuneRequest * request = new CTuneRequest(TuningSpace);
+
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(riid, &lpstr);
+    swprintf(Buffer, L"CTuneRequest_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (!request)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(request->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete request;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
diff --git a/reactos/dll/directx/msvidctl/tuningspace.cpp b/reactos/dll/directx/msvidctl/tuningspace.cpp
new file mode 100644 (file)
index 0000000..035542e
--- /dev/null
@@ -0,0 +1,365 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/msvidctl/tuningspace.cpp
+ * PURPOSE:         ITuningSpace interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#include "precomp.h"
+
+const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}};
+
+class CTuningSpace : public IDVBTuningSpace
+{
+public:
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+
+            WCHAR Buffer[100];
+            swprintf(Buffer, L"CTuningSpace::Release : %p Ref %lu\n", this, m_Ref);
+            OutputDebugStringW(Buffer);
+
+        if (!m_Ref)
+        {
+            //delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+     // IDispatch methods
+     HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
+     HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
+     HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
+     HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+
+
+    //ITuningSpace methods
+    HRESULT STDMETHODCALLTYPE get_UniqueName(BSTR *Name);
+    HRESULT STDMETHODCALLTYPE put_UniqueName(BSTR Name);
+    HRESULT STDMETHODCALLTYPE get_FriendlyName(BSTR *Name);
+    HRESULT STDMETHODCALLTYPE put_FriendlyName(BSTR Name);
+    HRESULT STDMETHODCALLTYPE get_CLSID(BSTR *SpaceCLSID);
+    HRESULT STDMETHODCALLTYPE get_NetworkType(BSTR *NetworkTypeGuid);
+    HRESULT STDMETHODCALLTYPE put_NetworkType(BSTR NetworkTypeGuid);
+    HRESULT STDMETHODCALLTYPE get__NetworkType(GUID *NetworkTypeGuid);
+    HRESULT STDMETHODCALLTYPE put__NetworkType(REFCLSID NetworkTypeGuid);
+    HRESULT STDMETHODCALLTYPE CreateTuneRequest(ITuneRequest **TuneRequest);
+    HRESULT STDMETHODCALLTYPE EnumCategoryGUIDs(IEnumGUID **ppEnum);
+    HRESULT STDMETHODCALLTYPE EnumDeviceMonikers(IEnumMoniker **ppEnum);
+    HRESULT STDMETHODCALLTYPE get_DefaultPreferredComponentTypes(IComponentTypes **ComponentTypes);
+    HRESULT STDMETHODCALLTYPE put_DefaultPreferredComponentTypes(IComponentTypes *NewComponentTypes);
+    HRESULT STDMETHODCALLTYPE get_FrequencyMapping(BSTR *pMapping);
+    HRESULT STDMETHODCALLTYPE put_FrequencyMapping(BSTR Mapping);
+    HRESULT STDMETHODCALLTYPE get_DefaultLocator(ILocator **LocatorVal);
+    HRESULT STDMETHODCALLTYPE put_DefaultLocator(ILocator *LocatorVal);
+    HRESULT STDMETHODCALLTYPE Clone(ITuningSpace **NewTS);
+    // IDVBTuningSpace
+    HRESULT STDMETHODCALLTYPE get_SystemType(DVBSystemType *SysType);
+    HRESULT STDMETHODCALLTYPE put_SystemType(DVBSystemType SysType);
+
+    CTuningSpace() : m_Ref(0){};
+
+    virtual ~CTuningSpace(){};
+
+protected:
+    LONG m_Ref;
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_ITuningSpace))
+    {
+        *Output = (ITuningSpace*)this;
+        reinterpret_cast<ITuningSpace*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_IDVBTuningSpace))
+    {
+        *Output = (IDVBTuningSpace*)this;
+        reinterpret_cast<IDVBTuningSpace*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CTuningSpace::QueryInterface: NoInterface for %s", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDispatch methods
+//
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::GetTypeInfoCount(UINT *pctinfo)
+{
+    OutputDebugStringW(L"CTuningSpace::GetTypeInfoCount : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+    OutputDebugStringW(L"CTuningSpace::GetTypeInfo : NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    OutputDebugStringW(L"CTuningSpace::GetIDsOfNames : NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    OutputDebugStringW(L"CTuningSpace::Invoke : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+
+//-------------------------------------------------------------------
+// ITuningSpace interface
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_UniqueName(BSTR *Name)
+{
+    OutputDebugStringW(L"CTuningSpace::get_UniqueName : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_UniqueName(BSTR Name)
+{
+    OutputDebugStringW(L"CTuningSpace::put_UniqueName : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_FriendlyName(BSTR *Name)
+{
+    OutputDebugStringW(L"CTuningSpace::get_FriendlyName : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_FriendlyName(BSTR Name)
+{
+    OutputDebugStringW(L"CTuningSpace::put_FriendlyName : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_CLSID(BSTR *SpaceCLSID)
+{
+    OutputDebugStringW(L"CTuningSpace::get_CLSID : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_NetworkType(BSTR *NetworkTypeGuid)
+{
+    OutputDebugStringW(L"CTuningSpace::get_NetworkType : stub\n");
+    return StringFromCLSID(CLSID_DVBTNetworkProvider, (LPOLESTR*)NetworkTypeGuid);
+
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_NetworkType(BSTR NetworkTypeGuid)
+{
+    OutputDebugStringW(L"CTuningSpace::put_NetworkType : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get__NetworkType(GUID *NetworkTypeGuid)
+{
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[100];
+    swprintf(Buffer, L"CTuningSpace::get__NetworkType : %p stub\n", NetworkTypeGuid);
+    OutputDebugStringW(Buffer);
+#endif
+
+    CopyMemory(NetworkTypeGuid, &CLSID_DVBTNetworkProvider, sizeof(GUID));
+    OutputDebugStringW(L"CTuningSpace::get__NetworkType : done\n");
+    return S_OK;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put__NetworkType(REFCLSID NetworkTypeGuid)
+{
+    OutputDebugStringW(L"CTuningSpace::put__NetworkType : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::CreateTuneRequest(ITuneRequest **TuneRequest)
+{
+    OutputDebugStringW(L"CTuningSpace::CreateTuneRequest : stub\n");
+    return CTuneRequest_fnConstructor(NULL, (ITuningSpace*)this, IID_ITuneRequest, (void**)TuneRequest);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::EnumCategoryGUIDs(IEnumGUID **ppEnum)
+{
+    OutputDebugStringW(L"CTuningSpace::EnumCategoryGUIDs : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::EnumDeviceMonikers(IEnumMoniker **ppEnum)
+{
+    OutputDebugStringW(L"CTuningSpace::EnumDeviceMonikers : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_DefaultPreferredComponentTypes(IComponentTypes **ComponentTypes)
+{
+    OutputDebugStringW(L"CTuningSpace::get_DefaultPreferredComponentTypes : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_DefaultPreferredComponentTypes(IComponentTypes *NewComponentTypes)
+{
+    OutputDebugStringW(L"CTuningSpace::put_DefaultPreferredComponentTypes : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_FrequencyMapping(BSTR *pMapping)
+{
+    OutputDebugStringW(L"CTuningSpace::get_FrequencyMapping : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_FrequencyMapping(BSTR Mapping)
+{
+    OutputDebugStringW(L"CTuningSpace::put_FrequencyMapping : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_DefaultLocator(ILocator **LocatorVal)
+{
+    OutputDebugStringW(L"CTuningSpace::get_DefaultLocator : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_DefaultLocator(ILocator *LocatorVal)
+{
+    OutputDebugStringW(L"CTuningSpace::put_DefaultLocator : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::Clone(ITuningSpace **NewTS)
+{
+    OutputDebugStringW(L"CTuningSpace::Clone : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// IDVBTuningSpace
+//
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::get_SystemType(DVBSystemType *SysType)
+{
+    OutputDebugStringW(L"CTuningSpace::get_SystemType : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpace::put_SystemType(DVBSystemType SysType)
+{
+    OutputDebugStringW(L"CTuningSpace::put_SystemType : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+WINAPI
+CTuningSpace_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    // construct device control
+    CTuningSpace * space = new CTuningSpace();
+
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(riid, &lpstr);
+    swprintf(Buffer, L"CTuningSpace_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (!space)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(space->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete space;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
+
+
diff --git a/reactos/dll/directx/msvidctl/tuningspace_container.cpp b/reactos/dll/directx/msvidctl/tuningspace_container.cpp
new file mode 100644 (file)
index 0000000..e25fdc7
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS BDA Proxy
+ * FILE:            dll/directx/msvidctl/tuningspace_container.cpp
+ * PURPOSE:         ITuningSpaceContainer interface
+ *
+ * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
+ */
+#define _FORCENAMELESSUNION
+#include "precomp.h"
+
+
+class CTuningSpaceContainer : public ITuningSpaceContainer
+{
+public:
+
+    STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
+
+    STDMETHODIMP_(ULONG) AddRef()
+    {
+        InterlockedIncrement(&m_Ref);
+        return m_Ref;
+    }
+    STDMETHODIMP_(ULONG) Release()
+    {
+        InterlockedDecrement(&m_Ref);
+        if (!m_Ref)
+        {
+            OutputDebugStringW(L"CTuningSpaceContainer::Release : delete\n");
+            //delete this;
+            return 0;
+        }
+        return m_Ref;
+    }
+
+     // IDispatch methods
+     HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
+     HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
+     HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
+     HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+
+     //ITuningSpaceContainer methods
+     HRESULT STDMETHODCALLTYPE get_Count(long *Count);
+     HRESULT STDMETHODCALLTYPE get__NewEnum(IEnumVARIANT **NewEnum);
+     HRESULT STDMETHODCALLTYPE get_Item(VARIANT varIndex, ITuningSpace **TuningSpace);
+     HRESULT STDMETHODCALLTYPE put_Item(VARIANT varIndex, ITuningSpace *TuningSpace);
+     HRESULT STDMETHODCALLTYPE TuningSpacesForCLSID(BSTR SpaceCLSID, ITuningSpaces **NewColl);
+     HRESULT STDMETHODCALLTYPE _TuningSpacesForCLSID(REFCLSID SpaceCLSID, ITuningSpaces **NewColl);
+     HRESULT STDMETHODCALLTYPE TuningSpacesForName(BSTR Name, ITuningSpaces **NewColl);
+     HRESULT STDMETHODCALLTYPE FindID(ITuningSpace *TuningSpace, long *ID);
+     HRESULT STDMETHODCALLTYPE Add(ITuningSpace *TuningSpace, VARIANT *NewIndex);
+     HRESULT STDMETHODCALLTYPE get_EnumTuningSpaces(IEnumTuningSpaces **ppEnum);
+     HRESULT STDMETHODCALLTYPE Remove(VARIANT Index);
+     HRESULT STDMETHODCALLTYPE get_MaxCount(long *MaxCount);
+     HRESULT STDMETHODCALLTYPE put_MaxCount(long MaxCount);
+
+    CTuningSpaceContainer() : m_Ref(0){};
+
+    virtual ~CTuningSpaceContainer(){};
+
+protected:
+    LONG m_Ref;
+
+};
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::QueryInterface(
+    IN  REFIID refiid,
+    OUT PVOID* Output)
+{
+    if (IsEqualGUID(refiid, IID_IUnknown))
+    {
+        *Output = PVOID(this);
+        reinterpret_cast<IUnknown*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    if (IsEqualGUID(refiid, IID_ITuningSpaceContainer))
+    {
+        *Output = (ITuningSpaceContainer*)this;
+        reinterpret_cast<ITuningSpaceContainer*>(*Output)->AddRef();
+        return NOERROR;
+    }
+
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(refiid, &lpstr);
+    swprintf(Buffer, L"CTuningSpaceContainer::QueryInterface: NoInterface for %s", lpstr);
+    OutputDebugStringW(Buffer);
+    CoTaskMemFree(lpstr);
+
+
+    return E_NOINTERFACE;
+}
+
+//-------------------------------------------------------------------
+// IDispatch methods
+//
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::GetTypeInfoCount(UINT *pctinfo)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::GetTypeInfoCount : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::GetTypeInfo : NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::GetIDsOfNames : NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::Invoke : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+//-------------------------------------------------------------------
+// ITuningSpaceContainer methods
+//
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get_Count(long *Count)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::get_Count : NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get__NewEnum(IEnumVARIANT **NewEnum)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::get__NewEnum : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get_Item(VARIANT varIndex, ITuningSpace **TuningSpace)
+{
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[100];
+       swprintf(Buffer, L"CTuningSpaceContainer::get_Item : type %x value %s stub\n", varIndex.vt, varIndex.bstrVal);
+    OutputDebugStringW(Buffer);
+#endif
+
+    return CTuningSpace_fnConstructor(NULL, IID_ITuningSpace, (void**)TuningSpace);
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::put_Item(VARIANT varIndex, ITuningSpace *TuningSpace)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::put_Item : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::TuningSpacesForCLSID(BSTR SpaceCLSID, ITuningSpaces **NewColl)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::TuningSpacesForCLSID : NotImplemented\n");
+    return E_NOTIMPL;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::_TuningSpacesForCLSID(REFCLSID SpaceCLSID, ITuningSpaces **NewColl)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::_TuningSpacesForCLSID : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::TuningSpacesForName(BSTR Name, ITuningSpaces **NewColl)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::TuningSpacesForName : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::FindID(ITuningSpace *TuningSpace, long *ID)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::FindID : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::Add(ITuningSpace *TuningSpace, VARIANT *NewIndex)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::Add : stub\n");
+    TuningSpace->AddRef();
+    NewIndex->vt = VT_BSTR;
+    InterlockedIncrement(&m_Ref);
+    return TuningSpace->get_FriendlyName(&NewIndex->bstrVal);;
+}
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get_EnumTuningSpaces(IEnumTuningSpaces **ppEnum)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::get_EnumTuningSpaces : stub\n");
+    return CEnumTuningSpaces_fnConstructor(NULL, IID_IEnumTuningSpaces, (void**)ppEnum);
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::Remove(VARIANT Index)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::Remove: NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::get_MaxCount(long *MaxCount)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::get_MaxCount : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+HRESULT
+STDMETHODCALLTYPE
+CTuningSpaceContainer::put_MaxCount(long MaxCount)
+{
+    OutputDebugStringW(L"CTuningSpaceContainer::put_MaxCount : NotImplemented\n");
+    return E_NOTIMPL;
+}
+
+
+HRESULT
+WINAPI
+CTuningSpaceContainer_fnConstructor(
+    IUnknown *pUnknown,
+    REFIID riid,
+    LPVOID * ppv)
+{
+    // construct device control
+    CTuningSpaceContainer * provider = new CTuningSpaceContainer();
+
+#ifdef MSVIDCTL_TRACE
+    WCHAR Buffer[MAX_PATH];
+    LPOLESTR lpstr;
+    StringFromCLSID(riid, &lpstr);
+    swprintf(Buffer, L"CTuningSpaceContainer_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
+    OutputDebugStringW(Buffer);
+#endif
+
+    if (!provider)
+        return E_OUTOFMEMORY;
+
+    if (FAILED(provider->QueryInterface(riid, ppv)))
+    {
+        /* not supported */
+        delete provider;
+        return E_NOINTERFACE;
+    }
+
+    return NOERROR;
+}
\ No newline at end of file
index df00137..ede377f 100644 (file)
@@ -53,6 +53,7 @@ struct object_creation_info
 static const struct object_creation_info object_creation[] =
 {
     { &CLSID_MediaDet, MediaDet_create },
+    { &CLSID_SampleGrabber, SampleGrabber_create },
 };
 
 static HRESULT WINAPI
index 2cf37f9..3a13f71 100644 (file)
@@ -112,7 +112,7 @@ static HRESULT WINAPI MediaDet_put_Filter(IMediaDet* iface, IUnknown *newVal)
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, long *pVal)
+static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, LONG *pVal)
 {
     MediaDetImpl *This = (MediaDetImpl *)iface;
     IEnumPins *pins;
@@ -156,7 +156,7 @@ static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, long *pVal)
     return S_OK;
 }
 
-static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, long *pVal)
+static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, LONG *pVal)
 {
     MediaDetImpl *This = (MediaDetImpl *)iface;
     TRACE("(%p)\n", This);
@@ -209,16 +209,16 @@ static HRESULT SetCurPin(MediaDetImpl *This, long strm)
     return S_OK;
 }
 
-static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, long newVal)
+static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, LONG newVal)
 {
     MediaDetImpl *This = (MediaDetImpl *)iface;
     HRESULT hr;
 
-    TRACE("(%p)->(%ld)\n", This, newVal);
+    TRACE("(%p)->(%d)\n", This, newVal);
 
     if (This->num_streams == -1)
     {
-        long n;
+        LONG n;
         hr = MediaDet_get_OutputStreams(iface, &n);
         if (FAILED(hr))
             return hr;
@@ -310,7 +310,11 @@ static HRESULT GetFilterInfo(IMoniker *pMoniker, GUID *pclsid, VARIANT *pvar)
         hr = IPropertyBag_Read(pPropBagCat, wszClsidName, pvar, NULL);
 
     if (SUCCEEDED(hr))
+    {
         hr = CLSIDFromString(V_UNION(pvar, bstrVal), pclsid);
+        VariantClear(pvar);
+        V_VT(pvar) = VT_BSTR;
+    }
 
     if (SUCCEEDED(hr))
         hr = IPropertyBag_Read(pPropBagCat, wszFriendlyName, pvar, NULL);
@@ -387,10 +391,14 @@ static HRESULT GetSplitter(MediaDetImpl *This)
     hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER,
                           &IID_IBaseFilter, (void **) &splitter);
     if (FAILED(hr))
+    {
+        VariantClear(&var);
         return hr;
+    }
 
     hr = IGraphBuilder_AddFilter(This->graph, splitter,
                                  V_UNION(&var, bstrVal));
+    VariantClear(&var);
     if (FAILED(hr))
     {
         IBaseFilter_Release(splitter);
@@ -461,21 +469,21 @@ static HRESULT WINAPI MediaDet_put_Filename(IMediaDet* iface, BSTR newVal)
 
 static HRESULT WINAPI MediaDet_GetBitmapBits(IMediaDet* iface,
                                              double StreamTime,
-                                             long *pBufferSize, char *pBuffer,
-                                             long Width, long Height)
+                                             LONG *pBufferSize, char *pBuffer,
+                                             LONG Width, LONG Height)
 {
     MediaDetImpl *This = (MediaDetImpl *)iface;
-    FIXME("(%p)->(%f %p %p %ld %ld): not implemented!\n", This, StreamTime, pBufferSize, pBuffer,
+    FIXME("(%p)->(%f %p %p %d %d): not implemented!\n", This, StreamTime, pBufferSize, pBuffer,
           Width, Height);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI MediaDet_WriteBitmapBits(IMediaDet* iface,
-                                               double StreamTime, long Width,
-                                               long Height, BSTR Filename)
+                                               double StreamTime, LONG Width,
+                                               LONG Height, BSTR Filename)
 {
     MediaDetImpl *This = (MediaDetImpl *)iface;
-    FIXME("(%p)->(%f %ld %ld %p): not implemented!\n", This, StreamTime, Width, Height, Filename);
+    FIXME("(%p)->(%f %d %d %p): not implemented!\n", This, StreamTime, Width, Height, Filename);
     return E_NOTIMPL;
 }
 
index 78f7a55..f3285f4 100644 (file)
@@ -8,6 +8,7 @@
        <file>main.c</file>
        <file>mediadet.c</file>
        <file>regsvr.c</file>
+       <file>samplegrabber.c</file>
        <library>wine</library>
        <library>strmiids</library>
        <library>uuid</library>
index 87bcab0..cf4747f 100644 (file)
@@ -37,5 +37,6 @@
 #include "qedit.h"
 
 HRESULT MediaDet_create(IUnknown *pUnkOuter, LPVOID *ppObj);
+HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppObj);
 
 #endif /* __QEDIT_PRIVATE_INCLUDED__ */
index 9ff1852..d70c822 100644 (file)
@@ -294,6 +294,12 @@ static struct regsvr_coclass const coclass_list[] = {
         "qedit.dll",
         "Both"
     },
+    {   &CLSID_SampleGrabber,
+        "Sample Grabber",
+        NULL,
+        "qedit.dll",
+        "Both"
+    },
     { NULL }                    /* list terminator */
 };
 
diff --git a/reactos/dll/directx/qedit/samplegrabber.c b/reactos/dll/directx/qedit/samplegrabber.c
new file mode 100644 (file)
index 0000000..1875c51
--- /dev/null
@@ -0,0 +1,1475 @@
+/*              DirectShow Sample Grabber object (QEDIT.DLL)
+ *
+ * Copyright 2009 Paul Chitescu
+ *
+ * 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 <assert.h>
+#include <stdarg.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "ole2.h"
+
+#include "qedit_private.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(qedit);
+
+static WCHAR const vendor_name[] = { 'W', 'i', 'n', 'e', 0 };
+static WCHAR const pin_in_name[] = { 'I', 'n', 0 };
+static WCHAR const pin_out_name[] = { 'O', 'u', 't', 0 };
+
+IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount);
+IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype);
+
+/* Fixed pins enumerator, holds filter referenced */
+typedef struct _PE_Impl {
+    IEnumPins pe;
+    IBaseFilter *filter;
+    LONG refCount;
+    ULONG numPins;
+    ULONG index;
+    IPin *pins[0];
+} PE_Impl;
+
+
+/* IEnumPins interface implementation */
+
+/* IUnknown */
+static ULONG WINAPI
+Fixed_IEnumPins_AddRef(IEnumPins *iface)
+{
+    PE_Impl *This = (PE_Impl *)iface;
+    ULONG refCount = InterlockedIncrement(&This->refCount);
+    TRACE("(%p) new ref = %u\n", This, refCount);
+    return refCount;
+}
+
+/* IUnknown */
+static ULONG WINAPI
+Fixed_IEnumPins_Release(IEnumPins *iface)
+{
+    PE_Impl *This = (PE_Impl *)iface;
+    ULONG refCount = InterlockedDecrement(&This->refCount);
+    TRACE("(%p) new ref = %u\n", This, refCount);
+    if (refCount == 0)
+    {
+        IBaseFilter_Release(This->filter);
+        CoTaskMemFree(This);
+        return 0;
+    }
+    return refCount;
+}
+
+/* IUnknown */
+static HRESULT WINAPI
+Fixed_IEnumPins_QueryInterface(IEnumPins *iface, REFIID riid, void **ppvObject)
+{
+    PE_Impl *This = (PE_Impl *)iface;
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+    if (IsEqualIID(riid, &IID_IUnknown) ||
+        IsEqualIID(riid, &IID_IEnumPins)) {
+       Fixed_IEnumPins_AddRef(iface);
+        *ppvObject = &(This->pins);
+        return S_OK;
+    }
+    *ppvObject = NULL;
+    WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
+    return E_NOINTERFACE;
+}
+
+/* IEnumPins */
+static HRESULT WINAPI
+Fixed_IEnumPins_Next(IEnumPins *iface, ULONG nPins, IPin **pins, ULONG *fetched)
+{
+    PE_Impl *This = (PE_Impl *)iface;
+    ULONG count = 0;
+    TRACE("(%p)->(%u, %p, %p) index = %u\n", This, nPins, pins, fetched, This->index);
+    if (!nPins)
+        return E_INVALIDARG;
+    if (!pins || ((nPins != 1) && !fetched))
+        return E_POINTER;
+    while ((count < nPins) && (This->index < This->numPins)) {
+        IPin *pin = This->pins[This->index++];
+        IPin_AddRef(pin);
+        pins[count++] = pin;
+    }
+    if (fetched)
+        *fetched = count;
+    return (count == nPins) ? S_OK : S_FALSE;
+}
+
+/* IEnumPins */
+static HRESULT WINAPI
+Fixed_IEnumPins_Skip(IEnumPins *iface, ULONG nPins)
+{
+    PE_Impl *This = (PE_Impl *)iface;
+    TRACE("(%p)->(%u) index = %u\n", This, nPins, This->index);
+    nPins += This->index;
+    if (nPins >= This->numPins) {
+        This->index = This->numPins;
+        return S_FALSE;
+    }
+    This->index = nPins;
+    return S_OK;
+}
+
+/* IEnumPins */
+static HRESULT WINAPI
+Fixed_IEnumPins_Reset(IEnumPins *iface)
+{
+    PE_Impl *This = (PE_Impl *)iface;
+    TRACE("(%p)->() index = %u\n", This, This->index);
+    This->index = 0;
+    return S_OK;
+}
+
+/* IEnumPins */
+static HRESULT WINAPI
+Fixed_IEnumPins_Clone(IEnumPins *iface, IEnumPins **pins)
+{
+    PE_Impl *This = (PE_Impl *)iface;
+    TRACE("(%p)->(%p) index = %u\n", This, pins, This->index);
+    if (!pins)
+        return E_POINTER;
+    *pins = pinsenum_create(This->filter, This->pins, This->numPins);
+    if (!*pins)
+        return E_OUTOFMEMORY;
+    ((PE_Impl *)*pins)->index = This->index;
+    return S_OK;
+}
+
+
+/* Virtual tables and constructor */
+
+static const IEnumPinsVtbl IEnumPins_VTable =
+{
+    Fixed_IEnumPins_QueryInterface,
+    Fixed_IEnumPins_AddRef,
+    Fixed_IEnumPins_Release,
+    Fixed_IEnumPins_Next,
+    Fixed_IEnumPins_Skip,
+    Fixed_IEnumPins_Reset,
+    Fixed_IEnumPins_Clone,
+};
+
+IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount)
+{
+    ULONG len = sizeof(PE_Impl) + (pinCount * sizeof(IPin *));
+    PE_Impl *obj = CoTaskMemAlloc(len);
+    if (obj) {
+        ULONG i;
+        ZeroMemory(obj, len);
+        obj->pe.lpVtbl = &IEnumPins_VTable;
+        obj->refCount = 1;
+        obj->filter = filter;
+        obj->numPins = pinCount;
+        obj->index = 0;
+        for (i=0; i<pinCount; i++)
+            obj->pins[i] = pins[i];
+        IBaseFilter_AddRef(filter);
+    }
+    return &obj->pe;
+}
+
+
+/* Single media type enumerator */
+typedef struct _ME_Impl {
+    IEnumMediaTypes me;
+    LONG refCount;
+    BOOL past;
+    AM_MEDIA_TYPE mtype;
+} ME_Impl;
+
+
+/* IEnumMediaTypes interface implementation */
+
+/* IUnknown */
+static ULONG WINAPI
+Single_IEnumMediaTypes_AddRef(IEnumMediaTypes *iface)
+{
+    ME_Impl *This = (ME_Impl *)iface;
+    ULONG refCount = InterlockedIncrement(&This->refCount);
+    TRACE("(%p) new ref = %u\n", This, refCount);
+    return refCount;
+}
+
+/* IUnknown */
+static ULONG WINAPI
+Single_IEnumMediaTypes_Release(IEnumMediaTypes *iface)
+{
+    ME_Impl *This = (ME_Impl *)iface;
+    ULONG refCount = InterlockedDecrement(&This->refCount);
+    TRACE("(%p) new ref = %u\n", This, refCount);
+    if (refCount == 0)
+    {
+        if (This->mtype.pbFormat)
+            CoTaskMemFree(This->mtype.pbFormat);
+        CoTaskMemFree(This);
+        return 0;
+    }
+    return refCount;
+}
+
+/* IUnknown */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_QueryInterface(IEnumMediaTypes *iface, REFIID riid, void **ppvObject)
+{
+    ME_Impl *This = (ME_Impl *)iface;
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+    if (IsEqualIID(riid, &IID_IUnknown) ||
+        IsEqualIID(riid, &IID_IEnumMediaTypes)) {
+        Single_IEnumMediaTypes_AddRef(iface);
+        *ppvObject = &(This->me);
+        return S_OK;
+    }
+    *ppvObject = NULL;
+    WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
+    return E_NOINTERFACE;
+}
+
+/* IEnumMediaTypes */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_Next(IEnumMediaTypes *iface, ULONG nTypes, AM_MEDIA_TYPE **types, ULONG *fetched)
+{
+    ME_Impl *This = (ME_Impl *)iface;
+    ULONG count = 0;
+    TRACE("(%p)->(%u, %p, %p)\n", This, nTypes, types, fetched);
+    if (!nTypes)
+        return E_INVALIDARG;
+    if (!types || ((nTypes != 1) && !fetched))
+        return E_POINTER;
+    if (!This->past && !IsEqualGUID(&This->mtype.majortype,&GUID_NULL)) {
+        AM_MEDIA_TYPE *mtype = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+        *mtype = This->mtype;
+        if (mtype->cbFormat) {
+            mtype->pbFormat = CoTaskMemAlloc(mtype->cbFormat);
+            CopyMemory(mtype->pbFormat, This->mtype.pbFormat, mtype->cbFormat);
+        }
+        *types = mtype;
+        This->past = TRUE;
+        count = 1;
+    }
+    if (fetched)
+        *fetched = count;
+    return (count == nTypes) ? S_OK : S_FALSE;
+}
+
+/* IEnumMediaTypes */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_Skip(IEnumMediaTypes *iface, ULONG nTypes)
+{
+    ME_Impl *This = (ME_Impl *)iface;
+    TRACE("(%p)->(%u)\n", This, nTypes);
+    if (nTypes)
+        This->past = TRUE;
+    return This->past ? S_FALSE : S_OK;
+}
+
+/* IEnumMediaTypes */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_Reset(IEnumMediaTypes *iface)
+{
+    ME_Impl *This = (ME_Impl *)iface;
+    TRACE("(%p)->()\n", This);
+    This->past = FALSE;
+    return S_OK;
+}
+
+/* IEnumMediaTypes */
+static HRESULT WINAPI
+Single_IEnumMediaTypes_Clone(IEnumMediaTypes *iface, IEnumMediaTypes **me)
+{
+    ME_Impl *This = (ME_Impl *)iface;
+    TRACE("(%p)->(%p)\n", This, me);
+    if (!me)
+        return E_POINTER;
+    *me = mediaenum_create(&This->mtype);
+    if (!*me)
+        return E_OUTOFMEMORY;
+    ((ME_Impl *)*me)->past = This->past;
+    return S_OK;
+}
+
+
+/* Virtual tables and constructor */
+
+static const IEnumMediaTypesVtbl IEnumMediaTypes_VTable =
+{
+    Single_IEnumMediaTypes_QueryInterface,
+    Single_IEnumMediaTypes_AddRef,
+    Single_IEnumMediaTypes_Release,
+    Single_IEnumMediaTypes_Next,
+    Single_IEnumMediaTypes_Skip,
+    Single_IEnumMediaTypes_Reset,
+    Single_IEnumMediaTypes_Clone,
+};
+
+IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype)
+{
+    ME_Impl *obj = CoTaskMemAlloc(sizeof(ME_Impl));
+    if (obj) {
+        ZeroMemory(obj, sizeof(ME_Impl));
+        obj->me.lpVtbl = &IEnumMediaTypes_VTable;
+        obj->refCount = 1;
+        obj->past = FALSE;
+        if (mtype) {
+            obj->mtype = *mtype;
+            obj->mtype.pUnk = NULL;
+            if (mtype->cbFormat) {
+                obj->mtype.pbFormat = CoTaskMemAlloc(mtype->cbFormat);
+                CopyMemory(obj->mtype.pbFormat, mtype->pbFormat, mtype->cbFormat);
+            }
+            else
+                obj->mtype.pbFormat = NULL;
+        }
+        else
+            obj->mtype.majortype = GUID_NULL;
+    }
+    return &obj->me;
+}
+
+
+/* Sample Grabber pin implementation */
+typedef struct _SG_Pin {
+    const IPinVtbl* lpVtbl;
+    PIN_DIRECTION dir;
+    WCHAR const *name;
+    struct _SG_Impl *sg;
+    IPin *pair;
+} SG_Pin;
+
+/* Sample Grabber filter implementation */
+typedef struct _SG_Impl {
+    const IBaseFilterVtbl* IBaseFilter_Vtbl;
+    const ISampleGrabberVtbl* ISampleGrabber_Vtbl;
+    const IMemInputPinVtbl* IMemInputPin_Vtbl;
+    /* TODO: IMediaPosition, IMediaSeeking, IQualityControl */
+    LONG refCount;
+    CRITICAL_SECTION critSect;
+    FILTER_INFO info;
+    FILTER_STATE state;
+    AM_MEDIA_TYPE mtype;
+    SG_Pin pin_in;
+    SG_Pin pin_out;
+    IMemAllocator *allocator;
+    IReferenceClock *refClock;
+    IMemInputPin *memOutput;
+    ISampleGrabberCB *grabberIface;
+    LONG grabberMethod;
+    LONG oneShot;
+    LONG bufferLen;
+    void* bufferData;
+} SG_Impl;
+
+enum {
+    OneShot_None,
+    OneShot_Wait,
+    OneShot_Past,
+};
+
+/* Get the SampleGrabber implementation This pointer from various interface pointers */
+static inline SG_Impl *impl_from_IBaseFilter(IBaseFilter *iface)
+{
+    return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, IBaseFilter_Vtbl));
+}
+
+static inline SG_Impl *impl_from_ISampleGrabber(ISampleGrabber *iface)
+{
+    return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, ISampleGrabber_Vtbl));
+}
+
+static inline SG_Impl *impl_from_IMemInputPin(IMemInputPin *iface)
+{
+    return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, IMemInputPin_Vtbl));
+}
+
+
+/* Cleanup at end of life */
+static void SampleGrabber_cleanup(SG_Impl *This)
+{
+    TRACE("(%p)\n", This);
+    if (This->info.pGraph)
+       WARN("(%p) still joined to filter graph %p\n", This, This->info.pGraph);
+    if (This->allocator)
+        IMemAllocator_Release(This->allocator);
+    if (This->refClock)
+       IReferenceClock_Release(This->refClock);
+    if (This->memOutput)
+        IMemInputPin_Release(This->memOutput);
+    if (This->grabberIface)
+        ISampleGrabberCB_Release(This->grabberIface);
+    if (This->mtype.pbFormat)
+        CoTaskMemFree(This->mtype.pbFormat);
+    if (This->bufferData)
+        CoTaskMemFree(This->bufferData);
+    This->critSect.DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection(&This->critSect);
+}
+
+/* Common helper AddRef called from all interfaces */
+static ULONG SampleGrabber_addref(SG_Impl *This)
+{
+    ULONG refCount = InterlockedIncrement(&This->refCount);
+    TRACE("(%p) new ref = %u\n", This, refCount);
+    return refCount;
+}
+
+/* Common helper Release called from all interfaces */
+static ULONG SampleGrabber_release(SG_Impl *This)
+{
+    ULONG refCount = InterlockedDecrement(&This->refCount);
+    TRACE("(%p) new ref = %u\n", This, refCount);
+    if (refCount == 0)
+    {
+        SampleGrabber_cleanup(This);
+        CoTaskMemFree(This);
+        return 0;
+    }
+    return refCount;
+}
+
+/* Common helper QueryInterface called from all interfaces */
+static HRESULT SampleGrabber_query(SG_Impl *This, REFIID riid, void **ppvObject)
+{
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+    if (IsEqualIID(riid, &IID_IUnknown) ||
+        IsEqualIID(riid, &IID_IPersist) ||
+        IsEqualIID(riid, &IID_IMediaFilter) ||
+        IsEqualIID(riid, &IID_IBaseFilter)) {
+        SampleGrabber_addref(This);
+        *ppvObject = &(This->IBaseFilter_Vtbl);
+        return S_OK;
+    }
+    else if (IsEqualIID(riid, &IID_ISampleGrabber)) {
+        SampleGrabber_addref(This);
+        *ppvObject = &(This->ISampleGrabber_Vtbl);
+        return S_OK;
+    }
+    else if (IsEqualIID(riid, &IID_IMemInputPin)) {
+        SampleGrabber_addref(This);
+        *ppvObject = &(This->IMemInputPin_Vtbl);
+        return S_OK;
+    }
+    else if (IsEqualIID(riid, &IID_IMediaPosition))
+        FIXME("IMediaPosition not implemented\n");
+    else if (IsEqualIID(riid, &IID_IMediaSeeking))
+        FIXME("IMediaSeeking not implemented\n");
+    else if (IsEqualIID(riid, &IID_IQualityControl))
+        FIXME("IQualityControl not implemented\n");
+    *ppvObject = NULL;
+    WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
+    return E_NOINTERFACE;
+}
+
+/* Helper that buffers data and/or calls installed sample callbacks */
+static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
+{
+    double time = 0.0;
+    REFERENCE_TIME tStart, tEnd;
+    if (This->bufferLen >= 0) {
+        BYTE *data = 0;
+        long size = IMediaSample_GetActualDataLength(sample);
+        if (size >= 0 && SUCCEEDED(IMediaSample_GetPointer(sample, &data))) {
+            if (!data)
+                size = 0;
+            EnterCriticalSection(&This->critSect);
+            if (This->bufferLen != size) {
+                if (This->bufferData)
+                    CoTaskMemFree(This->bufferData);
+                This->bufferData = size ? CoTaskMemAlloc(size) : NULL;
+                This->bufferLen = size;
+            }
+            if (size)
+                CopyMemory(This->bufferData, data, size);
+            LeaveCriticalSection(&This->critSect);
+        }
+    }
+    if (!This->grabberIface)
+        return;
+    if (SUCCEEDED(IMediaSample_GetTime(sample, &tStart, &tEnd)))
+        time = 1e-7 * tStart;
+    switch (This->grabberMethod) {
+        case 0:
+           {
+               ULONG ref = IMediaSample_AddRef(sample);
+               ISampleGrabberCB_SampleCB(This->grabberIface, time, sample);
+               ref = IMediaSample_Release(sample) + 1 - ref;
+               if (ref)
+               {
+                   ERR("(%p) Callback referenced sample %p by %u\n", This, sample, ref);
+                   /* ugly as hell but some apps are sooo buggy */
+                   while (ref--)
+                       IMediaSample_Release(sample);
+               }
+           }
+            break;
+        case 1:
+            {
+                BYTE *data = 0;
+                long size = IMediaSample_GetActualDataLength(sample);
+                if (size && SUCCEEDED(IMediaSample_GetPointer(sample, &data)) && data)
+                    ISampleGrabberCB_BufferCB(This->grabberIface, time, data, size);
+            }
+            break;
+        case -1:
+            break;
+        default:
+            FIXME("unsupported method %ld\n", (long int)This->grabberMethod);
+            /* do not bother us again */
+            This->grabberMethod = -1;
+    }
+}
+
+
+/* SampleGrabber implementation of IBaseFilter interface */
+
+/* IUnknown */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppvObject)
+{
+    return SampleGrabber_query(impl_from_IBaseFilter(iface), riid, ppvObject);
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IBaseFilter_AddRef(IBaseFilter *iface)
+{
+    return SampleGrabber_addref(impl_from_IBaseFilter(iface));
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IBaseFilter_Release(IBaseFilter *iface)
+{
+    return SampleGrabber_release(impl_from_IBaseFilter(iface));
+}
+
+/* IPersist */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_GetClassID(IBaseFilter *iface, CLSID *pClassID)
+{
+    TRACE("(%p)\n", pClassID);
+    if (!pClassID)
+        return E_POINTER;
+    *pClassID = CLSID_SampleGrabber;
+    return S_OK;
+}
+
+/* IMediaFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_Stop(IBaseFilter *iface)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    TRACE("(%p)\n", This);
+    This->state = State_Stopped;
+    return S_OK;
+}
+
+/* IMediaFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_Pause(IBaseFilter *iface)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    TRACE("(%p)\n", This);
+    This->state = State_Paused;
+    return S_OK;
+}
+
+/* IMediaFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    TRACE("(%p)\n", This);
+    This->state = State_Running;
+    return S_OK;
+}
+
+/* IMediaFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_GetState(IBaseFilter *iface, DWORD msTout, FILTER_STATE *state)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    TRACE("(%p)->(%u, %p)\n", This, msTout, state);
+    if (!state)
+        return E_POINTER;
+    *state = This->state;
+    return S_OK;
+}
+
+/* IMediaFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_SetSyncSource(IBaseFilter *iface, IReferenceClock *clock)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    TRACE("(%p)->(%p)\n", This, clock);
+    if (clock != This->refClock)
+    {
+       if (clock)
+           IReferenceClock_AddRef(clock);
+       if (This->refClock)
+           IReferenceClock_Release(This->refClock);
+       This->refClock = clock;
+    }
+    return S_OK;
+}
+
+/* IMediaFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_GetSyncSource(IBaseFilter *iface, IReferenceClock **clock)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    TRACE("(%p)->(%p)\n", This, clock);
+    if (!clock)
+        return E_POINTER;
+    if (This->refClock)
+       IReferenceClock_AddRef(This->refClock);
+    *clock = This->refClock;
+    return S_OK;
+}
+
+/* IBaseFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_EnumPins(IBaseFilter *iface, IEnumPins **pins)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    IPin *pin[2];
+    TRACE("(%p)->(%p)\n", This, pins);
+    if (!pins)
+        return E_POINTER;
+    pin[0] = (IPin*)&This->pin_in.lpVtbl;
+    pin[1] = (IPin*)&This->pin_out.lpVtbl;
+    *pins = pinsenum_create(iface, pin, 2);
+    return *pins ? S_OK : E_OUTOFMEMORY;
+}
+
+/* IBaseFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_FindPin(IBaseFilter *iface, LPCWSTR id, IPin **pin)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    TRACE("(%p)->(%s, %p)\n", This, debugstr_w(id), pin);
+    if (!id || !pin)
+        return E_POINTER;
+    if (!lstrcmpiW(id,pin_in_name))
+    {
+        SampleGrabber_addref(This);
+        *pin = (IPin*)&(This->pin_in.lpVtbl);
+        return S_OK;
+    }
+    else if (!lstrcmpiW(id,pin_out_name))
+    {
+        SampleGrabber_addref(This);
+        *pin = (IPin*)&(This->pin_out.lpVtbl);
+        return S_OK;
+    }
+    *pin = NULL;
+    return VFW_E_NOT_FOUND;
+}
+
+/* IBaseFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *info)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    TRACE("(%p)->(%p)\n", This, info);
+    if (!info)
+        return E_POINTER;
+    if (This->info.pGraph)
+       IFilterGraph_AddRef(This->info.pGraph);
+    *info = This->info;
+    return S_OK;
+}
+
+/* IBaseFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *graph, LPCWSTR name)
+{
+    SG_Impl *This = impl_from_IBaseFilter(iface);
+    TRACE("(%p)->(%p, %s)\n", This, graph, debugstr_w(name));
+    This->info.pGraph = graph;
+    if (name)
+       lstrcpynW(This->info.achName,name,MAX_FILTER_NAME);
+    This->oneShot = OneShot_None;
+    return S_OK;
+}
+
+/* IBaseFilter */
+static HRESULT WINAPI
+SampleGrabber_IBaseFilter_QueryVendorInfo(IBaseFilter *iface, LPWSTR *vendor)
+{
+    TRACE("(%p)\n", vendor);
+    if (!vendor)
+        return E_POINTER;
+    *vendor = CoTaskMemAlloc(sizeof(vendor_name));
+    CopyMemory(*vendor, vendor_name, sizeof(vendor_name));
+    return S_OK;
+}
+
+
+/* SampleGrabber implementation of ISampleGrabber interface */
+
+/* IUnknown */
+static HRESULT WINAPI
+SampleGrabber_ISampleGrabber_QueryInterface(ISampleGrabber *iface, REFIID riid, void **ppvObject)
+{
+    return SampleGrabber_query(impl_from_ISampleGrabber(iface), riid, ppvObject);
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_ISampleGrabber_AddRef(ISampleGrabber *iface)
+{
+    return SampleGrabber_addref(impl_from_ISampleGrabber(iface));
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_ISampleGrabber_Release(ISampleGrabber *iface)
+{
+    return SampleGrabber_release(impl_from_ISampleGrabber(iface));
+}
+
+/* ISampleGrabber */
+static HRESULT WINAPI
+SampleGrabber_ISampleGrabber_SetOneShot(ISampleGrabber *iface, BOOL oneShot)
+{
+    SG_Impl *This = impl_from_ISampleGrabber(iface);
+    TRACE("(%p)->(%u)\n", This, oneShot);
+    This->oneShot = oneShot ? OneShot_Wait : OneShot_None;
+    return S_OK;
+}
+
+/* ISampleGrabber */
+static HRESULT WINAPI
+SampleGrabber_ISampleGrabber_SetMediaType(ISampleGrabber *iface, const AM_MEDIA_TYPE *type)
+{
+    SG_Impl *This = impl_from_ISampleGrabber(iface);
+    TRACE("(%p)->(%p)\n", This, type);
+    if (!type)
+        return E_POINTER;
+    TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n",
+       debugstr_guid(&type->majortype), debugstr_guid(&type->subtype),
+       type->lSampleSize,
+       debugstr_guid(&type->formattype), type->cbFormat);
+    if (This->mtype.pbFormat)
+        CoTaskMemFree(This->mtype.pbFormat);
+    This->mtype = *type;
+    This->mtype.pUnk = NULL;
+    if (type->cbFormat) {
+        This->mtype.pbFormat = CoTaskMemAlloc(type->cbFormat);
+        CopyMemory(This->mtype.pbFormat, type->pbFormat, type->cbFormat);
+    }
+    else
+        This->mtype.pbFormat = NULL;
+    return S_OK;
+}
+
+/* ISampleGrabber */
+static HRESULT WINAPI
+SampleGrabber_ISampleGrabber_GetConnectedMediaType(ISampleGrabber *iface, AM_MEDIA_TYPE *type)
+{
+    SG_Impl *This = impl_from_ISampleGrabber(iface);
+    TRACE("(%p)->(%p)\n", This, type);
+    if (!type)
+        return E_POINTER;
+    if (!This->pin_in.pair)
+        return VFW_E_NOT_CONNECTED;
+    *type = This->mtype;
+    if (type->cbFormat) {
+        type->pbFormat = CoTaskMemAlloc(type->cbFormat);
+        CopyMemory(type->pbFormat, This->mtype.pbFormat, type->cbFormat);
+    }
+    return S_OK;
+}
+
+/* ISampleGrabber */
+static HRESULT WINAPI
+SampleGrabber_ISampleGrabber_SetBufferSamples(ISampleGrabber *iface, BOOL bufferEm)
+{
+    SG_Impl *This = impl_from_ISampleGrabber(iface);
+    TRACE("(%p)->(%u)\n", This, bufferEm);
+    EnterCriticalSection(&This->critSect);
+    if (bufferEm) {
+        if (This->bufferLen < 0)
+            This->bufferLen = 0;
+    }
+    else
+        This->bufferLen = -1;
+    LeaveCriticalSection(&This->critSect);
+    return S_OK;
+}
+
+/* ISampleGrabber */
+static HRESULT WINAPI
+SampleGrabber_ISampleGrabber_GetCurrentBuffer(ISampleGrabber *iface, LONG *bufSize, LONG *buffer)
+{
+    SG_Impl *This = impl_from_ISampleGrabber(iface);
+    HRESULT ret = S_OK;
+    TRACE("(%p)->(%p, %p)\n", This, bufSize, buffer);
+    if (!bufSize)
+        return E_POINTER;
+    EnterCriticalSection(&This->critSect);
+    if (!This->pin_in.pair)
+        ret = VFW_E_NOT_CONNECTED;
+    else if (This->bufferLen < 0)
+        ret = E_INVALIDARG;
+    else if (This->bufferLen == 0)
+        ret = VFW_E_WRONG_STATE;
+    else {
+        if (buffer) {
+            if (*bufSize >= This->bufferLen)
+                CopyMemory(buffer, This->bufferData, This->bufferLen);
+            else
+                ret = E_OUTOFMEMORY;
+        }
+        *bufSize = This->bufferLen;
+    }
+    LeaveCriticalSection(&This->critSect);
+    return ret;
+}
+
+/* ISampleGrabber */
+static HRESULT WINAPI
+SampleGrabber_ISampleGrabber_GetCurrentSample(ISampleGrabber *iface, IMediaSample **sample)
+{
+    /* MS doesn't implement it either, noone should call it */
+    WARN("(%p): not implemented\n", sample);
+    return E_NOTIMPL;
+}
+
+/* ISampleGrabber */
+static HRESULT WINAPI
+SampleGrabber_ISampleGrabber_SetCallback(ISampleGrabber *iface, ISampleGrabberCB *cb, LONG whichMethod)
+{
+    SG_Impl *This = impl_from_ISampleGrabber(iface);
+    TRACE("(%p)->(%p, %u)\n", This, cb, whichMethod);
+    if (This->grabberIface)
+        ISampleGrabberCB_Release(This->grabberIface);
+    This->grabberIface = cb;
+    This->grabberMethod = whichMethod;
+    if (cb)
+        ISampleGrabberCB_AddRef(cb);
+    return S_OK;
+}
+
+
+/* SampleGrabber implementation of IMemInputPin interface */
+
+/* IUnknown */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_QueryInterface(IMemInputPin *iface, REFIID riid, void **ppvObject)
+{
+    return SampleGrabber_query(impl_from_IMemInputPin(iface), riid, ppvObject);
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IMemInputPin_AddRef(IMemInputPin *iface)
+{
+    return SampleGrabber_addref(impl_from_IMemInputPin(iface));
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IMemInputPin_Release(IMemInputPin *iface)
+{
+    return SampleGrabber_release(impl_from_IMemInputPin(iface));
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_GetAllocator(IMemInputPin *iface, IMemAllocator **allocator)
+{
+    SG_Impl *This = impl_from_IMemInputPin(iface);
+    TRACE("(%p)->(%p) allocator = %p\n", This, allocator, This->allocator);
+    if (!allocator)
+        return E_POINTER;
+    *allocator = This->allocator;
+    if (!*allocator)
+        return VFW_E_NO_ALLOCATOR;
+    IMemAllocator_AddRef(*allocator);
+    return S_OK;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_NotifyAllocator(IMemInputPin *iface, IMemAllocator *allocator, BOOL readOnly)
+{
+    SG_Impl *This = impl_from_IMemInputPin(iface);
+    TRACE("(%p)->(%p, %u) allocator = %p\n", This, allocator, readOnly, This->allocator);
+    if (This->allocator == allocator)
+        return S_OK;
+    if (This->allocator)
+        IMemAllocator_Release(This->allocator);
+    This->allocator = allocator;
+    if (allocator)
+        IMemAllocator_AddRef(allocator);
+    return S_OK;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_GetAllocatorRequirements(IMemInputPin *iface, ALLOCATOR_PROPERTIES *props)
+{
+    SG_Impl *This = impl_from_IMemInputPin(iface);
+    FIXME("(%p)->(%p): semi-stub\n", This, props);
+    if (!props)
+        return E_POINTER;
+    return This->memOutput ? IMemInputPin_GetAllocatorRequirements(This->memOutput, props) : E_NOTIMPL;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_Receive(IMemInputPin *iface, IMediaSample *sample)
+{
+    SG_Impl *This = impl_from_IMemInputPin(iface);
+    HRESULT hr;
+    TRACE("(%p)->(%p) output = %p, grabber = %p\n", This, sample, This->memOutput, This->grabberIface);
+    if (!sample)
+        return E_POINTER;
+    if ((This->state != State_Running) || (This->oneShot == OneShot_Past))
+        return S_FALSE;
+    SampleGrabber_callback(This, sample);
+    hr = This->memOutput ? IMemInputPin_Receive(This->memOutput, sample) : S_OK;
+    if (This->oneShot == OneShot_Wait) {
+        This->oneShot = OneShot_Past;
+        hr = S_FALSE;
+        if (This->pin_out.pair)
+            IPin_EndOfStream(This->pin_out.pair);
+    }
+    return hr;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_ReceiveMultiple(IMemInputPin *iface, IMediaSample **samples, LONG nSamples, LONG *nProcessed)
+{
+    SG_Impl *This = impl_from_IMemInputPin(iface);
+    LONG idx;
+    TRACE("(%p)->(%p, %u, %p) output = %p, grabber = %p\n", This, samples, nSamples, nProcessed, This->memOutput, This->grabberIface);
+    if (!samples || !nProcessed)
+        return E_POINTER;
+    if ((This->state != State_Running) || (This->oneShot == OneShot_Past))
+        return S_FALSE;
+    for (idx = 0; idx < nSamples; idx++)
+        SampleGrabber_callback(This, samples[idx]);
+    return This->memOutput ? IMemInputPin_ReceiveMultiple(This->memOutput, samples, nSamples, nProcessed) : S_OK;
+}
+
+/* IMemInputPin */
+static HRESULT WINAPI
+SampleGrabber_IMemInputPin_ReceiveCanBlock(IMemInputPin *iface)
+{
+    SG_Impl *This = impl_from_IMemInputPin(iface);
+    TRACE("(%p)\n", This);
+    return This->memOutput ? IMemInputPin_ReceiveCanBlock(This->memOutput) : S_OK;
+}
+
+
+/* SampleGrabber member pin implementation */
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IPin_AddRef(IPin *iface)
+{
+    return SampleGrabber_addref(((SG_Pin *)iface)->sg);
+}
+
+/* IUnknown */
+static ULONG WINAPI
+SampleGrabber_IPin_Release(IPin *iface)
+{
+    return SampleGrabber_release(((SG_Pin *)iface)->sg);
+}
+
+/* IUnknown */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryInterface(IPin *iface, REFIID riid, void **ppvObject)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+    if (IsEqualIID(riid, &IID_IUnknown) ||
+        IsEqualIID(riid, &IID_IPin)) {
+        SampleGrabber_addref(This->sg);
+        *ppvObject = This;
+        return S_OK;
+    }
+    else if (IsEqualIID(riid, &IID_IMemInputPin)) {
+        SampleGrabber_addref(This->sg);
+        *ppvObject = &(This->sg->IMemInputPin_Vtbl);
+        return S_OK;
+    }
+    *ppvObject = NULL;
+    WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject);
+    return E_NOINTERFACE;
+}
+
+/* IPin - input pin */
+static HRESULT WINAPI
+SampleGrabber_In_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *mtype)
+{
+    WARN("(%p, %p): unexpected\n", receiver, mtype);
+    return E_UNEXPECTED;
+}
+
+/* IPin - output pin */
+static HRESULT WINAPI
+SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *type)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    HRESULT hr;
+    TRACE("(%p)->(%p, %p)\n", This, receiver, type);
+    if (!receiver)
+        return E_POINTER;
+    if (This->pair)
+        return VFW_E_ALREADY_CONNECTED;
+    if (This->sg->state != State_Stopped)
+        return VFW_E_NOT_STOPPED;
+    if (type) {
+       TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n",
+           debugstr_guid(&type->majortype), debugstr_guid(&type->subtype),
+           type->lSampleSize,
+           debugstr_guid(&type->formattype), type->cbFormat);
+       if (!IsEqualGUID(&This->sg->mtype.majortype,&GUID_NULL) &&
+           !IsEqualGUID(&This->sg->mtype.majortype,&type->majortype))
+           return VFW_E_TYPE_NOT_ACCEPTED;
+       if (!IsEqualGUID(&This->sg->mtype.subtype,&MEDIASUBTYPE_None) &&
+           !IsEqualGUID(&This->sg->mtype.subtype,&type->subtype))
+           return VFW_E_TYPE_NOT_ACCEPTED;
+       if (!IsEqualGUID(&This->sg->mtype.formattype,&GUID_NULL) &&
+           !IsEqualGUID(&This->sg->mtype.formattype,&FORMAT_None) &&
+           !IsEqualGUID(&This->sg->mtype.formattype,&type->formattype))
+           return VFW_E_TYPE_NOT_ACCEPTED;
+    }
+    else
+       type = &This->sg->mtype;
+    if (!IsEqualGUID(&type->formattype, &FORMAT_None) &&
+       !IsEqualGUID(&type->formattype, &GUID_NULL) &&
+       !type->pbFormat)
+       return VFW_E_TYPE_NOT_ACCEPTED;
+    hr = IPin_ReceiveConnection(receiver,(IPin*)&This->lpVtbl,type);
+    if (FAILED(hr))
+       return hr;
+    This->pair = receiver;
+    if (This->sg->memOutput) {
+        IMemInputPin_Release(This->sg->memOutput);
+        This->sg->memOutput = NULL;
+    }
+    IPin_QueryInterface(receiver,&IID_IMemInputPin,(void **)&(This->sg->memOutput));
+    TRACE("(%p) Accepted IPin %p, IMemInputPin %p\n", This, receiver, This->sg->memOutput);
+    return S_OK;
+}
+
+/* IPin - input pin */
+static HRESULT WINAPI
+SampleGrabber_In_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_MEDIA_TYPE *type)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->(%p, %p)\n", This, connector, type);
+    if (!connector)
+        return E_POINTER;
+    if (This->pair)
+        return VFW_E_ALREADY_CONNECTED;
+    if (This->sg->state != State_Stopped)
+        return VFW_E_NOT_STOPPED;
+    if (type) {
+       TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n",
+           debugstr_guid(&type->majortype), debugstr_guid(&type->subtype),
+           type->lSampleSize,
+           debugstr_guid(&type->formattype), type->cbFormat);
+       if (!IsEqualGUID(&type->formattype, &FORMAT_None) &&
+           !IsEqualGUID(&type->formattype, &GUID_NULL) &&
+           !type->pbFormat)
+           return VFW_E_INVALIDMEDIATYPE;
+       if (!IsEqualGUID(&This->sg->mtype.majortype,&GUID_NULL) &&
+           !IsEqualGUID(&This->sg->mtype.majortype,&type->majortype))
+           return VFW_E_TYPE_NOT_ACCEPTED;
+       if (!IsEqualGUID(&This->sg->mtype.subtype,&MEDIASUBTYPE_None) &&
+           !IsEqualGUID(&This->sg->mtype.subtype,&type->subtype))
+           return VFW_E_TYPE_NOT_ACCEPTED;
+       if (!IsEqualGUID(&This->sg->mtype.formattype,&GUID_NULL) &&
+           !IsEqualGUID(&This->sg->mtype.formattype,&FORMAT_None) &&
+           !IsEqualGUID(&This->sg->mtype.formattype,&type->formattype))
+           return VFW_E_TYPE_NOT_ACCEPTED;
+        if (This->sg->mtype.pbFormat)
+            CoTaskMemFree(This->sg->mtype.pbFormat);
+        This->sg->mtype = *type;
+        This->sg->mtype.pUnk = NULL;
+        if (type->cbFormat) {
+            This->sg->mtype.pbFormat = CoTaskMemAlloc(type->cbFormat);
+            CopyMemory(This->sg->mtype.pbFormat, type->pbFormat, type->cbFormat);
+        }
+        else
+            This->sg->mtype.pbFormat = NULL;
+    }
+    This->pair = connector;
+    TRACE("(%p) Accepted IPin %p\n", This, connector);
+    return S_OK;
+}
+
+/* IPin - output pin */
+static HRESULT WINAPI
+SampleGrabber_Out_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_MEDIA_TYPE *mtype)
+{
+    WARN("(%p, %p): unexpected\n", connector, mtype);
+    return E_UNEXPECTED;
+}
+
+/* IPin - input pin */
+static HRESULT WINAPI
+SampleGrabber_In_IPin_Disconnect(IPin *iface)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->() pair = %p\n", This, This->pair);
+    if (This->sg->state != State_Stopped)
+        return VFW_E_NOT_STOPPED;
+    if (This->pair) {
+        This->pair = NULL;
+        return S_OK;
+    }
+    return S_FALSE;
+}
+
+/* IPin - output pin */
+static HRESULT WINAPI
+SampleGrabber_Out_IPin_Disconnect(IPin *iface)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->() pair = %p\n", This, This->pair);
+    if (This->sg->state != State_Stopped)
+        return VFW_E_NOT_STOPPED;
+    if (This->pair) {
+        This->pair = NULL;
+        if (This->sg->memOutput) {
+            IMemInputPin_Release(This->sg->memOutput);
+            This->sg->memOutput = NULL;
+        }
+        return S_OK;
+    }
+    return S_FALSE;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_ConnectedTo(IPin *iface, IPin **pin)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->(%p) pair = %p\n", This, pin, This->pair);
+    if (!pin)
+        return E_POINTER;
+    *pin = This->pair;
+    if (*pin) {
+        IPin_AddRef(*pin);
+        return S_OK;
+    }
+    return VFW_E_NOT_CONNECTED;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *mtype)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->(%p)\n", This, mtype);
+    if (!mtype)
+        return E_POINTER;
+    if (!This->pair)
+        return VFW_E_NOT_CONNECTED;
+    *mtype = This->sg->mtype;
+    if (mtype->cbFormat) {
+        mtype->pbFormat = CoTaskMemAlloc(mtype->cbFormat);
+        CopyMemory(mtype->pbFormat, This->sg->mtype.pbFormat, mtype->cbFormat);
+    }
+    return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryPinInfo(IPin *iface, PIN_INFO *info)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->(%p)\n", This, info);
+    if (!info)
+        return E_POINTER;
+    SampleGrabber_addref(This->sg);
+    info->pFilter = (IBaseFilter *)This->sg;
+    info->dir = This->dir;
+    lstrcpynW(info->achName,This->name,MAX_PIN_NAME);
+    return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryDirection(IPin *iface, PIN_DIRECTION *dir)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->(%p)\n", This, dir);
+    if (!dir)
+        return E_POINTER;
+    *dir = This->dir;
+    return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryId(IPin *iface, LPWSTR *id)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    int len;
+    TRACE("(%p)->(%p)\n", This, id);
+    if (!id)
+        return E_POINTER;
+    len = sizeof(WCHAR)*(1+lstrlenW(This->name));
+    *id = CoTaskMemAlloc(len);
+    CopyMemory(*id, This->name, len);
+    return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *mtype)
+{
+    TRACE("(%p)\n", mtype);
+    return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->(%p)\n", This, mtypes);
+    if (!mtypes)
+        return E_POINTER;
+    *mtypes = mediaenum_create(This->sg->pin_in.pair ? &This->sg->mtype : (const AM_MEDIA_TYPE *)NULL);
+    return *mtypes ? S_OK : E_OUTOFMEMORY;
+}
+
+/* IPin - input pin */
+static HRESULT WINAPI
+SampleGrabber_In_IPin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *nPins)
+{
+    SG_Pin *This = (SG_Pin *)iface;
+    TRACE("(%p)->(%p, %p) size = %u\n", This, pins, nPins, (nPins ? *nPins : 0));
+    if (!nPins)
+        return E_POINTER;
+    if (*nPins) {
+       if (!pins)
+           return E_POINTER;
+       IPin_AddRef((IPin*)&This->sg->pin_out.lpVtbl);
+       *pins = (IPin*)&This->sg->pin_out.lpVtbl;
+       *nPins = 1;
+       return S_OK;
+    }
+    *nPins = 1;
+    return S_FALSE;
+}
+
+/* IPin - output pin */
+static HRESULT WINAPI
+SampleGrabber_Out_IPin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *nPins)
+{
+    WARN("(%p, %p): unexpected\n", pins, nPins);
+    if (nPins)
+        *nPins = 0;
+    return E_NOTIMPL;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_EndOfStream(IPin *iface)
+{
+    FIXME(": stub\n");
+    return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_BeginFlush(IPin *iface)
+{
+    FIXME(": stub\n");
+    return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_EndFlush(IPin *iface)
+{
+    FIXME(": stub\n");
+    return S_OK;
+}
+
+/* IPin */
+static HRESULT WINAPI
+SampleGrabber_IPin_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double rate)
+{
+    FIXME(": stub\n");
+    return S_OK;
+}
+
+
+/* SampleGrabber vtables and constructor */
+
+static const IBaseFilterVtbl IBaseFilter_VTable =
+{
+    SampleGrabber_IBaseFilter_QueryInterface,
+    SampleGrabber_IBaseFilter_AddRef,
+    SampleGrabber_IBaseFilter_Release,
+    SampleGrabber_IBaseFilter_GetClassID,
+    SampleGrabber_IBaseFilter_Stop,
+    SampleGrabber_IBaseFilter_Pause,
+    SampleGrabber_IBaseFilter_Run,
+    SampleGrabber_IBaseFilter_GetState,
+    SampleGrabber_IBaseFilter_SetSyncSource,
+    SampleGrabber_IBaseFilter_GetSyncSource,
+    SampleGrabber_IBaseFilter_EnumPins,
+    SampleGrabber_IBaseFilter_FindPin,
+    SampleGrabber_IBaseFilter_QueryFilterInfo,
+    SampleGrabber_IBaseFilter_JoinFilterGraph,
+    SampleGrabber_IBaseFilter_QueryVendorInfo,
+};
+
+static const ISampleGrabberVtbl ISampleGrabber_VTable =
+{
+    SampleGrabber_ISampleGrabber_QueryInterface,
+    SampleGrabber_ISampleGrabber_AddRef,
+    SampleGrabber_ISampleGrabber_Release,
+    SampleGrabber_ISampleGrabber_SetOneShot,
+    SampleGrabber_ISampleGrabber_SetMediaType,
+    SampleGrabber_ISampleGrabber_GetConnectedMediaType,
+    SampleGrabber_ISampleGrabber_SetBufferSamples,
+    SampleGrabber_ISampleGrabber_GetCurrentBuffer,
+    SampleGrabber_ISampleGrabber_GetCurrentSample,
+    SampleGrabber_ISampleGrabber_SetCallback,
+};
+
+static const IMemInputPinVtbl IMemInputPin_VTable =
+{
+    SampleGrabber_IMemInputPin_QueryInterface,
+    SampleGrabber_IMemInputPin_AddRef,
+    SampleGrabber_IMemInputPin_Release,
+    SampleGrabber_IMemInputPin_GetAllocator,
+    SampleGrabber_IMemInputPin_NotifyAllocator,
+    SampleGrabber_IMemInputPin_GetAllocatorRequirements,
+    SampleGrabber_IMemInputPin_Receive,
+    SampleGrabber_IMemInputPin_ReceiveMultiple,
+    SampleGrabber_IMemInputPin_ReceiveCanBlock,
+};
+
+static const IPinVtbl IPin_In_VTable =
+{
+    SampleGrabber_IPin_QueryInterface,
+    SampleGrabber_IPin_AddRef,
+    SampleGrabber_IPin_Release,
+    SampleGrabber_In_IPin_Connect,
+    SampleGrabber_In_IPin_ReceiveConnection,
+    SampleGrabber_In_IPin_Disconnect,
+    SampleGrabber_IPin_ConnectedTo,
+    SampleGrabber_IPin_ConnectionMediaType,
+    SampleGrabber_IPin_QueryPinInfo,
+    SampleGrabber_IPin_QueryDirection,
+    SampleGrabber_IPin_QueryId,
+    SampleGrabber_IPin_QueryAccept,
+    SampleGrabber_IPin_EnumMediaTypes,
+    SampleGrabber_In_IPin_QueryInternalConnections,
+    SampleGrabber_IPin_EndOfStream,
+    SampleGrabber_IPin_BeginFlush,
+    SampleGrabber_IPin_EndFlush,
+    SampleGrabber_IPin_NewSegment,
+};
+
+static const IPinVtbl IPin_Out_VTable =
+{
+    SampleGrabber_IPin_QueryInterface,
+    SampleGrabber_IPin_AddRef,
+    SampleGrabber_IPin_Release,
+    SampleGrabber_Out_IPin_Connect,
+    SampleGrabber_Out_IPin_ReceiveConnection,
+    SampleGrabber_Out_IPin_Disconnect,
+    SampleGrabber_IPin_ConnectedTo,
+    SampleGrabber_IPin_ConnectionMediaType,
+    SampleGrabber_IPin_QueryPinInfo,
+    SampleGrabber_IPin_QueryDirection,
+    SampleGrabber_IPin_QueryId,
+    SampleGrabber_IPin_QueryAccept,
+    SampleGrabber_IPin_EnumMediaTypes,
+    SampleGrabber_Out_IPin_QueryInternalConnections,
+    SampleGrabber_IPin_EndOfStream,
+    SampleGrabber_IPin_BeginFlush,
+    SampleGrabber_IPin_EndFlush,
+    SampleGrabber_IPin_NewSegment,
+};
+
+HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
+{
+    SG_Impl* obj = NULL;
+
+    TRACE("(%p,%p)\n", ppv, pUnkOuter);
+
+    if (pUnkOuter)
+        return CLASS_E_NOAGGREGATION;
+
+    obj = CoTaskMemAlloc(sizeof(SG_Impl));
+    if (NULL == obj) {
+        *ppv = NULL;
+        return E_OUTOFMEMORY;
+    }
+    ZeroMemory(obj, sizeof(SG_Impl));
+
+    obj->refCount = 1;
+    obj->IBaseFilter_Vtbl = &IBaseFilter_VTable;
+    obj->ISampleGrabber_Vtbl = &ISampleGrabber_VTable;
+    obj->IMemInputPin_Vtbl = &IMemInputPin_VTable;
+    obj->pin_in.lpVtbl = &IPin_In_VTable;
+    obj->pin_in.dir = PINDIR_INPUT;
+    obj->pin_in.name = pin_in_name;
+    obj->pin_in.sg = obj;
+    obj->pin_in.pair = NULL;
+    obj->pin_out.lpVtbl = &IPin_Out_VTable;
+    obj->pin_out.dir = PINDIR_OUTPUT;
+    obj->pin_out.name = pin_out_name;
+    obj->pin_out.sg = obj;
+    obj->pin_out.pair = NULL;
+    InitializeCriticalSection(&obj->critSect);
+    obj->critSect.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SG_Impl.critSect");
+    obj->info.achName[0] = 0;
+    obj->info.pGraph = NULL;
+    obj->state = State_Stopped;
+    obj->mtype.majortype = GUID_NULL;
+    obj->mtype.subtype = MEDIASUBTYPE_None;
+    obj->mtype.formattype = FORMAT_None;
+    obj->allocator = NULL;
+    obj->refClock = NULL;
+    obj->memOutput = NULL;
+    obj->grabberIface = NULL;
+    obj->grabberMethod = -1;
+    obj->oneShot = OneShot_None;
+    obj->bufferLen = -1;
+    obj->bufferData = NULL;
+    *ppv = obj;
+
+    return S_OK;
+}
index edb170d..1d87a7f 100644 (file)
@@ -32,6 +32,7 @@
 #include "evcode.h"
 #include "strmif.h"
 #include "dsound.h"
+#include "amaudio.h"
 
 #include "wine/unicode.h"
 #include "wine/debug.h"
@@ -45,12 +46,14 @@ static const IPinVtbl DSoundRender_InputPin_Vtbl;
 static const IBasicAudioVtbl IBasicAudio_Vtbl;
 static const IReferenceClockVtbl IReferenceClock_Vtbl;
 static const IMediaSeekingVtbl IMediaSeeking_Vtbl;
+static const IAMDirectSoundVtbl IAMDirectSound_Vtbl;
 
 typedef struct DSoundRenderImpl
 {
     const IBaseFilterVtbl * lpVtbl;
     const IBasicAudioVtbl *IBasicAudio_vtbl;
     const IReferenceClockVtbl *IReferenceClock_vtbl;
+    const IAMDirectSoundVtbl *IAMDirectSound_vtbl;
 
     LONG refCount;
     CRITICAL_SECTION csFilter;
@@ -404,6 +407,7 @@ HRESULT DSoundRender_create(IUnknown * pUnkOuter, LPVOID * ppv)
     pDSoundRender->lpVtbl = &DSoundRender_Vtbl;
     pDSoundRender->IBasicAudio_vtbl = &IBasicAudio_Vtbl;
     pDSoundRender->IReferenceClock_vtbl = &IReferenceClock_Vtbl;
+    pDSoundRender->IAMDirectSound_vtbl = &IAMDirectSound_Vtbl;
     pDSoundRender->refCount = 1;
     InitializeCriticalSection(&pDSoundRender->csFilter);
     pDSoundRender->csFilter.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DSoundRenderImpl.csFilter");
@@ -473,6 +477,8 @@ static HRESULT WINAPI DSoundRender_QueryInterface(IBaseFilter * iface, REFIID ri
         *ppv = &This->IReferenceClock_vtbl;
     else if (IsEqualIID(riid, &IID_IMediaSeeking))
         *ppv = &This->mediaSeeking.lpVtbl;
+    else if (IsEqualIID(riid, &IID_IAMDirectSound))
+        *ppv = &This->IAMDirectSound_vtbl;
 
     if (*ppv)
     {
@@ -1328,3 +1334,121 @@ static const IMediaSeekingVtbl IMediaSeeking_Vtbl =
     MediaSeekingImpl_GetRate,
     MediaSeekingImpl_GetPreroll
 };
+
+/*** IUnknown methods ***/
+static HRESULT WINAPI AMDirectSound_QueryInterface(IAMDirectSound *iface,
+                                               REFIID riid,
+                                               LPVOID*ppvObj)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
+
+    return DSoundRender_QueryInterface((IBaseFilter*)This, riid, ppvObj);
+}
+
+static ULONG WINAPI AMDirectSound_AddRef(IAMDirectSound *iface)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    TRACE("(%p/%p)->()\n", This, iface);
+
+    return DSoundRender_AddRef((IBaseFilter*)This);
+}
+
+static ULONG WINAPI AMDirectSound_Release(IAMDirectSound *iface)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    TRACE("(%p/%p)->()\n", This, iface);
+
+    return DSoundRender_Release((IBaseFilter*)This);
+}
+
+/*** IAMDirectSound methods ***/
+static HRESULT WINAPI AMDirectSound_GetDirectSoundInterface(IAMDirectSound *iface,  IDirectSound **ds)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    FIXME("(%p/%p)->(%p): stub\n", This, iface, ds);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_GetPrimaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer **buf)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    FIXME("(%p/%p)->(%p): stub\n", This, iface, buf);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_GetSecondaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer **buf)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    FIXME("(%p/%p)->(%p): stub\n", This, iface, buf);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_ReleaseDirectSoundInterface(IAMDirectSound *iface, IDirectSound *ds)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    FIXME("(%p/%p)->(%p): stub\n", This, iface, ds);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_ReleasePrimaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer *buf)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    FIXME("(%p/%p)->(%p): stub\n", This, iface, buf);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_ReleaseSecondaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer *buf)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    FIXME("(%p/%p)->(%p): stub\n", This, iface, buf);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_SetFocusWindow(IAMDirectSound *iface, HWND hwnd, BOOL bgsilent)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    FIXME("(%p/%p)->(%p,%d): stub\n", This, iface, hwnd, bgsilent);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI AMDirectSound_GetFocusWindow(IAMDirectSound *iface, HWND hwnd)
+{
+    ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface);
+
+    FIXME("(%p/%p)->(%p): stub\n", This, iface, hwnd);
+
+    return E_NOTIMPL;
+}
+
+static const IAMDirectSoundVtbl IAMDirectSound_Vtbl =
+{
+    AMDirectSound_QueryInterface,
+    AMDirectSound_AddRef,
+    AMDirectSound_Release,
+    AMDirectSound_GetDirectSoundInterface,
+    AMDirectSound_GetPrimaryBufferInterface,
+    AMDirectSound_GetSecondaryBufferInterface,
+    AMDirectSound_ReleaseDirectSoundInterface,
+    AMDirectSound_ReleasePrimaryBufferInterface,
+    AMDirectSound_ReleaseSecondaryBufferInterface,
+    AMDirectSound_SetFocusWindow,
+    AMDirectSound_GetFocusWindow
+};
index 5f6350f..cb9282c 100644 (file)
@@ -395,7 +395,8 @@ static HRESULT WINAPI AsyncReader_QueryInterface(IBaseFilter * iface, REFIID rii
         return S_OK;
     }
 
-    if (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IMediaSeeking) && !IsEqualIID(riid, &IID_IVideoWindow))
+    if (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IMediaSeeking) &&
+        !IsEqualIID(riid, &IID_IVideoWindow) && !IsEqualIID(riid, &IID_IBasicAudio))
         FIXME("No interface for %s!\n", qzdebugstr_guid(riid));
 
     return E_NOINTERFACE;
index 7b8d954..bacb729 100644 (file)
@@ -479,11 +479,16 @@ static HRESULT WINAPI FilterMapper2_UnregisterFilter(
 static HRESULT FM2_WriteFriendlyName(IPropertyBag * pPropBag, LPCWSTR szName)
 {
     VARIANT var;
+    HRESULT ret;
+    BSTR value;
 
     V_VT(&var) = VT_BSTR;
-    V_UNION(&var, bstrVal) = (BSTR)szName;
+    V_UNION(&var, bstrVal) = value = SysAllocString(szName);
 
-    return IPropertyBag_Write(pPropBag, wszFriendlyName, &var);
+    ret = IPropertyBag_Write(pPropBag, wszFriendlyName, &var);
+    SysFreeString(value);
+
+    return ret;
 }
 
 static HRESULT FM2_WriteClsid(IPropertyBag * pPropBag, REFCLSID clsid)
index 2e24d52..ca34d93 100644 (file)
@@ -765,9 +765,6 @@ HRESULT WINAPI OutputPin_Connect(IPin * iface, IPin * pReceivePin, const AM_MEDI
                 {
                     assert(pmtCandidate);
                     dump_AM_MEDIA_TYPE(pmtCandidate);
-                    if (!IsEqualGUID(&FORMAT_None, &pmtCandidate->formattype)
-                        && !IsEqualGUID(&GUID_NULL, &pmtCandidate->formattype))
-                        assert(pmtCandidate->pbFormat);
                     if (( !pmt || CompareMediaTypes(pmt, pmtCandidate, TRUE) ) && 
                         (This->pConnectSpecific(iface, pReceivePin, pmtCandidate) == S_OK))
                     {
index 982a73d..b7097f6 100644 (file)
@@ -60,4 +60,5 @@
        <define name="REGISTER_PROXY_DLL"/>
        <define name="PROXY_DELEGATION"/>
        <file>quartz_strmif.idl</file>
-</module>
\ No newline at end of file
+</module>
+</group>
\ No newline at end of file
index 6300371..c471049 100644 (file)
@@ -35,7 +35,7 @@ void WINAPI DebugSetMute(void) {
     /* nothing to do */
 }
 
-IDirect3D8* WINAPI Direct3DCreate8(UINT SDKVersion) {
+IDirect3D8* WINAPI DECLSPEC_HOTPATCH Direct3DCreate8(UINT SDKVersion) {
     IDirect3D8Impl* object;
     TRACE("SDKVersion = %x\n", SDKVersion);
 
@@ -79,7 +79,12 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
 HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD* reserved2, BOOL bool, DWORD* toto)
 {
   HRESULT ret;
-  FIXME("(%p %p %p %d %p): stub\n", vertexshader, reserved1, reserved2, bool, toto);
+  static BOOL warned;
+
+  if (TRACE_ON(d3d8) || !warned) {
+      FIXME("(%p %p %p %d %p): stub\n", vertexshader, reserved1, reserved2, bool, toto);
+      warned = TRUE;
+  }
 
   if (!vertexshader)
       return E_FAIL;
@@ -109,7 +114,12 @@ HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD
 HRESULT WINAPI ValidatePixelShader(DWORD* pixelshader, DWORD* reserved1, BOOL bool, DWORD* toto)
 {
   HRESULT ret;
-  FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto);
+  static BOOL warned;
+
+  if (TRACE_ON(d3d8) || !warned) {
+      FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto);
+      warned = TRUE;
+  }
 
   if (!pixelshader)
       return E_FAIL;
index 2c5f66f..4ba399b 100644 (file)
@@ -275,18 +275,6 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic
         UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level,
         DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) DECLSPEC_HIDDEN;
 
-/* ------------------ */
-/* IDirect3DResource8 */
-/* ------------------ */
-
-/*****************************************************************************
- * Predeclare the interface implementation structures
- */
-extern const IDirect3DResource8Vtbl Direct3DResource8_Vtbl DECLSPEC_HIDDEN;
-
-/*****************************************************************************
- * IDirect3DResource8 implementation structure
- */
 struct IDirect3DResource8Impl
 {
     /* IUnknown fields */
index 5365640..11697b2 100644 (file)
@@ -1047,7 +1047,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_BeginScene(LPDIRECT3DDEVICE8 iface) {
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
     HRESULT hr;
 
index 339cc61..c405a57 100644 (file)
@@ -33,7 +33,7 @@ void WINAPI DebugSetMute(void) {
     /* nothing to do */
 }
 
-IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) {
+IDirect3D9* WINAPI DECLSPEC_HOTPATCH Direct3DCreate9(UINT SDKVersion) {
     IDirect3D9Impl* object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D9Impl));
 
     object->lpVtbl = &Direct3D9_Vtbl;
@@ -53,7 +53,7 @@ IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) {
     return (IDirect3D9*) object;
 }
 
-HRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) {
+HRESULT WINAPI DECLSPEC_HOTPATCH Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) {
     IDirect3D9 *ret;
     IDirect3D9Impl* object;
 
index 7736bea..eb3a032 100644 (file)
@@ -187,11 +187,6 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
 extern HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(IDirect3DDevice9Ex *iface,
         UINT iSwapChain, IDirect3DSwapChain9 **pSwapChain) DECLSPEC_HIDDEN;
 extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(IDirect3DDevice9Ex *iface,
-        D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface,
-        IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(IDirect3DDevice9Ex *iface,
         IDirect3DVertexDeclaration9 *pDecl) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(IDirect3DDevice9Ex *iface,
@@ -228,9 +223,6 @@ extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(IDirect3DDevi
         UINT StartRegister, const BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(IDirect3DDevice9Ex *iface,
         UINT StartRegister, BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(IDirect3DDevice9Ex *iface,
-        D3DQUERYTYPE Type, IDirect3DQuery9 **ppQuery) DECLSPEC_HIDDEN;
-
 
 /* ---------------- */
 /* IDirect3DVolume9 */
@@ -470,6 +462,8 @@ typedef struct  IDirect3DStateBlock9Impl {
     LPDIRECT3DDEVICE9EX       parentDevice;
 } IDirect3DStateBlock9Impl;
 
+HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Impl *device,
+        D3DSTATEBLOCKTYPE type, IWineD3DStateBlock *wined3d_stateblock) DECLSPEC_HIDDEN;
 
 /* --------------------------- */
 /* IDirect3DVertexDeclaration9 */
@@ -564,4 +558,7 @@ typedef struct IDirect3DQuery9Impl {
     LPDIRECT3DDEVICE9EX    parentDevice;
 } IDirect3DQuery9Impl;
 
+HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device,
+        D3DQUERYTYPE type) DECLSPEC_HIDDEN;
+
 #endif /* __WINE_D3D9_PRIVATE_H */
index 6b70c84..79a9ba0 100644 (file)
@@ -248,7 +248,7 @@ static ULONG WINAPI IDirect3DDevice9Impl_AddRef(LPDIRECT3DDEVICE9EX iface) {
     return ref;
 }
 
-static ULONG WINAPI  IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
+static ULONG WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     ULONG ref;
 
@@ -452,7 +452,7 @@ static BOOL     WINAPI  IDirect3DDevice9Impl_ShowCursor(LPDIRECT3DDEVICE9EX ifac
     return ret;
 }
 
-static HRESULT WINAPI  IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDevice9Ex *iface,
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDevice9Ex *iface,
         D3DPRESENT_PARAMETERS *present_parameters, IDirect3DSwapChain9 **swapchain)
 {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
@@ -541,7 +541,7 @@ static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data
     return ret;
 }
 
-static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
+static HRESULT  WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     WINED3DPRESENT_PARAMETERS localParameters;
     HRESULT hr;
@@ -619,7 +619,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DP
     return hr;
 }
 
-static HRESULT  WINAPI IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9EX iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA*
+static HRESULT  WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9EX iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA*
  pDirtyRegion) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
@@ -1182,7 +1182,7 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_BeginScene(LPDIRECT3DDEVICE9EX ifac
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
 
@@ -1388,7 +1388,7 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_GetClipPlane(LPDIRECT3DDEVICE9EX if
     return hr;
 }
 
-static HRESULT  WINAPI IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9EX iface, D3DRENDERSTATETYPE State, DWORD Value) {
+static HRESULT  WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9EX iface, D3DRENDERSTATETYPE State, DWORD Value) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
 
@@ -1414,6 +1414,97 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_GetRenderState(LPDIRECT3DDEVICE9EX
     return hr;
 }
 
+static HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(IDirect3DDevice9Ex *iface,
+        D3DSTATEBLOCKTYPE type, IDirect3DStateBlock9 **stateblock)
+{
+    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+    IDirect3DStateBlock9Impl *object;
+    HRESULT hr;
+
+    TRACE("iface %p, type %#x, stateblock %p.\n", iface, type, stateblock);
+
+    if (type != D3DSBT_ALL && type != D3DSBT_PIXELSTATE && type != D3DSBT_VERTEXSTATE)
+    {
+        WARN("Unexpected stateblock type, returning D3DERR_INVALIDCALL.\n");
+        return D3DERR_INVALIDCALL;
+    }
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+    if (!object)
+    {
+        ERR("Failed to allocate stateblock memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    hr = stateblock_init(object, This, type, NULL);
+    if (FAILED(hr))
+    {
+        WARN("Failed to initialize stateblock, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
+
+    TRACE("Created stateblock %p.\n", object);
+    *stateblock = (IDirect3DStateBlock9 *)object;
+
+    return D3D_OK;
+}
+
+static HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface)
+{
+    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+    HRESULT hr;
+
+    TRACE("iface %p.\n", iface);
+
+    wined3d_mutex_lock();
+    hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice);
+    wined3d_mutex_unlock();
+
+    return hr;
+}
+
+static HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, IDirect3DStateBlock9 **stateblock)
+{
+    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+    IWineD3DStateBlock *wined3d_stateblock;
+    IDirect3DStateBlock9Impl *object;
+    HRESULT hr;
+
+    TRACE("iface %p, stateblock %p.\n", iface, stateblock);
+
+    wined3d_mutex_lock();
+    hr = IWineD3DDevice_EndStateBlock(This->WineD3DDevice, &wined3d_stateblock);
+    wined3d_mutex_unlock();
+    if (FAILED(hr))
+    {
+       WARN("IWineD3DDevice_EndStateBlock() failed, hr %#x.\n", hr);
+       return hr;
+    }
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+    if (!object)
+    {
+        ERR("Failed to allocate stateblock memory.\n");
+        IWineD3DStateBlock_Release(wined3d_stateblock);
+        return E_OUTOFMEMORY;
+    }
+
+    hr = stateblock_init(object, This, 0, wined3d_stateblock);
+    if (FAILED(hr))
+    {
+        WARN("Failed to initialize stateblock, hr %#x.\n", hr);
+        IWineD3DStateBlock_Release(wined3d_stateblock);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
+
+    TRACE("Created stateblock %p.\n", object);
+    *stateblock = (IDirect3DStateBlock9 *)object;
+
+    return D3D_OK;
+}
+
 static HRESULT  WINAPI  IDirect3DDevice9Impl_SetClipStatus(LPDIRECT3DDEVICE9EX iface, CONST D3DCLIPSTATUS9* pClipStatus) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
@@ -1559,7 +1650,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetSamplerState(IDirect3DDevice9Ex *i
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9EX iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9EX iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
 
@@ -2178,6 +2269,37 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_DeletePatch(LPDIRECT3DDEVICE9EX ifa
     return hr;
 }
 
+static HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(IDirect3DDevice9Ex *iface,
+        D3DQUERYTYPE type, IDirect3DQuery9 **query)
+{
+    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
+    IDirect3DQuery9Impl *object;
+    HRESULT hr;
+
+    TRACE("iface %p, type %#x, query %p.\n", iface, type, query);
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+    if (!object)
+    {
+        ERR("Failed to allocate query memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    hr = query_init(object, This, type);
+    if (FAILED(hr))
+    {
+        WARN("Failed to initialize query, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
+
+    TRACE("Created query %p.\n", object);
+    if (query) *query = (IDirect3DQuery9 *)object;
+    else IDirect3DQuery9_Release((IDirect3DQuery9 *)object);
+
+    return D3D_OK;
+}
+
 static HRESULT WINAPI IDirect3DDevice9ExImpl_SetConvolutionMonoKernel(IDirect3DDevice9Ex *iface,
         UINT width, UINT height, float *rows, float *columns)
 {
index 5f5e8f9..1fcc8c4 100644 (file)
@@ -407,7 +407,7 @@ static HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9EX iface, UIN
     return ret;
 }
 
-static HRESULT WINAPI IDirect3D9Impl_CreateDevice(IDirect3D9Ex *iface, UINT adapter,
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9Impl_CreateDevice(IDirect3D9Ex *iface, UINT adapter,
         D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters,
         IDirect3DDevice9 **device)
 {
@@ -465,7 +465,7 @@ static HRESULT WINAPI IDirect3D9ExImpl_GetAdapterDisplayModeEx(IDirect3D9Ex *ifa
     return D3DERR_DRIVERINTERNALERROR;
 }
 
-static HRESULT WINAPI IDirect3D9ExImpl_CreateDeviceEx(IDirect3D9Ex *iface,
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9ExImpl_CreateDeviceEx(IDirect3D9Ex *iface,
         UINT adapter, D3DDEVTYPE device_type, HWND focus_window, DWORD flags,
         D3DPRESENT_PARAMETERS *parameters, D3DDISPLAYMODEEX *mode, IDirect3DDevice9Ex **device)
 {
index ecb2e71..a38dc9d 100644 (file)
@@ -150,49 +150,24 @@ static const IDirect3DQuery9Vtbl Direct3DQuery9_Vtbl =
     IDirect3DQuery9Impl_GetData
 };
 
+HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device, D3DQUERYTYPE type)
+{
+    HRESULT hr;
 
-/* IDirect3DDevice9 IDirect3DQuery9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(LPDIRECT3DDEVICE9EX iface, D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery) {
-    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
-    IDirect3DQuery9Impl *object = NULL;
-    HRESULT hr = D3D_OK;
-
-    TRACE("iface %p, type %#x, query %p.\n", iface, Type, ppQuery);
+    query->lpVtbl = &Direct3DQuery9_Vtbl;
+    query->ref = 1;
 
-    if (!ppQuery)
+    wined3d_mutex_lock();
+    hr = IWineD3DDevice_CreateQuery(device->WineD3DDevice, type, &query->wineD3DQuery, (IUnknown *)query);
+    wined3d_mutex_unlock();
+    if (FAILED(hr))
     {
-        wined3d_mutex_lock();
-        hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, NULL, NULL);
-        wined3d_mutex_unlock();
-
+        WARN("Failed to create wined3d query, hr %#x.\n", hr);
         return hr;
     }
 
-    /* Allocate the storage for the device */
-    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DQuery9Impl));
-    if (NULL == object) {
-        ERR("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n");
-        return D3DERR_OUTOFVIDEOMEMORY;
-    }
+    query->parentDevice = (IDirect3DDevice9Ex *)device;
+    IDirect3DDevice9Ex_AddRef(query->parentDevice);
 
-    object->lpVtbl = &Direct3DQuery9_Vtbl;
-    object->ref = 1;
-
-    wined3d_mutex_lock();
-    hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, &object->wineD3DQuery, (IUnknown *)object);
-    wined3d_mutex_unlock();
-
-    if (FAILED(hr)) {
-
-        /* free up object */
-        WARN("(%p) call to IWineD3DDevice_CreateQuery failed\n", This);
-        HeapFree(GetProcessHeap(), 0, object);
-    } else {
-        IDirect3DDevice9Ex_AddRef(iface);
-        object->parentDevice = iface;
-        *ppQuery = (LPDIRECT3DQUERY9) object;
-        TRACE("(%p) : Created query %p\n", This , object);
-    }
-    TRACE("(%p) : returning %x\n", This, hr);
-    return hr;
+    return D3D_OK;
 }
index 7cd3ba6..c4941db 100644 (file)
@@ -123,87 +123,33 @@ static const IDirect3DStateBlock9Vtbl Direct3DStateBlock9_Vtbl =
     IDirect3DStateBlock9Impl_Apply
 };
 
-
-/* IDirect3DDevice9 IDirect3DStateBlock9 Methods follow: */
-HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9EX iface, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppStateBlock) {
-   IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
-   IDirect3DStateBlock9Impl* object;
-   HRESULT hrc = D3D_OK;
-
-   TRACE("iface %p, type %#x, stateblock %p.\n", iface, Type, ppStateBlock);
-
-   if(Type != D3DSBT_ALL         && Type != D3DSBT_PIXELSTATE &&
-      Type != D3DSBT_VERTEXSTATE                              ) {
-       WARN("Unexpected stateblock type, returning D3DERR_INVALIDCALL\n");
-       return D3DERR_INVALIDCALL;
-   }
-
-   object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl));
-   if (NULL == object) return E_OUTOFMEMORY;
-   object->lpVtbl = &Direct3DStateBlock9_Vtbl;
-   object->ref = 1;
-
-   wined3d_mutex_lock();
-   hrc = IWineD3DDevice_CreateStateBlock(This->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)Type, &object->wineD3DStateBlock, (IUnknown*)object);
-   wined3d_mutex_unlock();
-
-   if(hrc != D3D_OK){
-       FIXME("(%p) Call to IWineD3DDevice_CreateStateBlock failed.\n", This);
-       HeapFree(GetProcessHeap(), 0, object);
-   } else {
-        IDirect3DDevice9Ex_AddRef(iface);
-        object->parentDevice = iface;
-        *ppStateBlock = (IDirect3DStateBlock9*)object;
-        TRACE("(%p) : Created stateblock %p\n", This, object);
-   }
-   TRACE("(%p) returning token (ptr to stateblock) of %p\n", This, object);
-   return hrc;
-}
-
-HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface)
+HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Impl *device,
+        D3DSTATEBLOCKTYPE type, IWineD3DStateBlock *wined3d_stateblock)
 {
-    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hr;
 
-    TRACE("iface %p.\n", iface);
-
-    wined3d_mutex_lock();
-    hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice);
-    wined3d_mutex_unlock();
-
-    return hr;
-}
+    stateblock->lpVtbl = &Direct3DStateBlock9_Vtbl;
+    stateblock->ref = 1;
 
-HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, IDirect3DStateBlock9 **ppSB)
-{
-    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
-    IWineD3DStateBlock *wineD3DStateBlock;
-    IDirect3DStateBlock9Impl *object;
-    HRESULT hr;
-
-    TRACE("iface %p, stateblock %p.\n", iface, ppSB);
-
-    /* Tell wineD3D to endstateblock before anything else (in case we run out
-     * of memory later and cause locking problems) */
-    wined3d_mutex_lock();
-    hr=IWineD3DDevice_EndStateBlock(This->WineD3DDevice,&wineD3DStateBlock);
-    wined3d_mutex_unlock();
-
-    if (hr!= D3D_OK)
+    if (wined3d_stateblock)
     {
-       WARN("IWineD3DDevice_EndStateBlock returned an error\n");
-       return hr;
+        stateblock->wineD3DStateBlock = wined3d_stateblock;
     }
-    /* allocate a new IDirectD3DStateBlock */
-    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl));
-    if (!object) return E_OUTOFMEMORY;
-    object->ref = 1;
-    object->lpVtbl = &Direct3DStateBlock9_Vtbl;
-    object->wineD3DStateBlock = wineD3DStateBlock;
-
-    IDirect3DDevice9Ex_AddRef(iface);
-    object->parentDevice = iface;
-    *ppSB=(IDirect3DStateBlock9*)object;
-    TRACE("(%p) Returning *ppSB %p, wineD3DStateBlock %p\n", This, *ppSB, wineD3DStateBlock);
+    else
+    {
+        wined3d_mutex_lock();
+        hr = IWineD3DDevice_CreateStateBlock(device->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)type,
+                &stateblock->wineD3DStateBlock, (IUnknown *)stateblock);
+        wined3d_mutex_unlock();
+        if (FAILED(hr))
+        {
+            WARN("Failed to create wined3d stateblock, hr %#x.\n", hr);
+            return hr;
+        }
+    }
+
+    stateblock->parentDevice = (IDirect3DDevice9Ex *)device;
+    IDirect3DDevice9Ex_AddRef(stateblock->parentDevice);
+
     return D3D_OK;
 }
index 2075045..c692371 100644 (file)
@@ -79,7 +79,7 @@ static ULONG WINAPI IDirect3DSwapChain9Impl_Release(LPDIRECT3DSWAPCHAIN9 iface)
 }
 
 /* IDirect3DSwapChain9 parts follow: */
-static HRESULT WINAPI IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) {
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) {
     IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
     HRESULT hr;
 
@@ -269,7 +269,7 @@ HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl
     return D3D_OK;
 }
 
-HRESULT  WINAPI IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) {
+HRESULT  WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     HRESULT hrc = D3D_OK;
     IWineD3DSwapChain *swapchain = NULL;
index a09c405..52fc950 100644 (file)
@@ -22,6 +22,7 @@
        <file>shader.c</file>
        <file>sprite.c</file>
        <file>surface.c</file>
+       <file>texture.c</file>
        <file>util.c</file>
        <file>version.rc</file>
 
index 08bb7f5..7924081 100644 (file)
@@ -11,7 +11,7 @@
 @ stub D3DXCleanMesh
 @ stdcall D3DXColorAdjustContrast(ptr ptr long)
 @ stdcall D3DXColorAdjustSaturation(ptr ptr long)
-@ stub D3DXCompileShader
+@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr)
 @ stub D3DXCompileShaderFromFileA
 @ stub D3DXCompileShaderFromFileW
 @ stub D3DXCompileShaderFromResourceA
@@ -92,7 +92,7 @@
 @ stub D3DXCreateTeapot
 @ stub D3DXCreateTextA
 @ stub D3DXCreateTextW
-@ stub D3DXCreateTexture
+@ stdcall D3DXCreateTexture(ptr long long long long long long ptr)
 @ stub D3DXCreateTextureFromFileA
 @ stub D3DXCreateTextureFromFileExA
 @ stub D3DXCreateTextureFromFileExW
 @ stub D3DXFillVolumeTexture
 @ stub D3DXFillVolumeTextureTX
 @ stub D3DXFilterTexture
-@ stub D3DXFindShaderComment
+@ stdcall D3DXFindShaderComment(ptr long ptr ptr)
 @ stub D3DXFloat16To32Array
 @ stub D3DXFloat32To16Array
 @ stub D3DXFrameAppendChild
 @ stdcall D3DXGetImageInfoFromResourceA(long str ptr)
 @ stdcall D3DXGetImageInfoFromResourceW(long wstr ptr)
 @ stdcall D3DXGetPixelShaderProfile(ptr)
-@ stub D3DXGetShaderConstantTable
-@ stub D3DXGetShaderConstantTableEx
+@ stdcall D3DXGetShaderConstantTable(ptr ptr)
+@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr)
 @ stub D3DXGetShaderInputSemantics
 @ stub D3DXGetShaderOutputSemantics
 @ stub D3DXGetShaderSamplers
index c05f7b7..e4de6b3 100644 (file)
@@ -23,6 +23,7 @@
 #include "windef.h"
 #include "wingdi.h"
 #include "d3dx9.h"
+#include "d3dx9shader.h"
 #include "d3dx9_36_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
@@ -134,6 +135,41 @@ LPCSTR WINAPI D3DXGetVertexShaderProfile(LPDIRECT3DDEVICE9 device)
     return NULL;
 }
 
+HRESULT WINAPI D3DXFindShaderComment(CONST DWORD* byte_code, DWORD fourcc, LPCVOID* data, UINT* size)
+{
+    CONST DWORD *ptr = byte_code;
+
+    TRACE("(%p, %x, %p, %p)", byte_code, fourcc, data, size);
+
+    if (!byte_code)
+        return D3DERR_INVALIDCALL;
+
+    while (*++ptr != D3DSIO_END)
+    {
+        /* Check if it is a comment */
+        if ((*ptr & D3DSI_OPCODE_MASK) == D3DSIO_COMMENT)
+        {
+            DWORD comment_size = (*ptr & D3DSI_COMMENTSIZE_MASK) >> D3DSI_COMMENTSIZE_SHIFT;
+
+            /* Check if this is the comment we are looking for */
+            if (*(ptr + 1) == fourcc)
+            {
+                UINT ctab_size = (comment_size - 1) * sizeof(DWORD);
+                LPCVOID ctab_data = ptr + 2;
+                if (size)
+                    *size = ctab_size;
+                if (data)
+                    *data = ctab_data;
+                TRACE("Returning comment data at %p with size %d\n", ctab_data, ctab_size);
+                return D3D_OK;
+            }
+            ptr += comment_size;
+        }
+    }
+
+    return S_FALSE;
+}
+
 HRESULT WINAPI D3DXAssembleShader(LPCSTR data,
                                   UINT data_len,
                                   CONST D3DXMACRO* defines,
@@ -142,7 +178,7 @@ HRESULT WINAPI D3DXAssembleShader(LPCSTR data,
                                   LPD3DXBUFFER* shader,
                                   LPD3DXBUFFER* error_messages)
 {
-    FIXME("stub\n");
+    FIXME("(%p, %d, %p, %p, %x, %p, %p): stub\n", data, data_len, defines, include, flags, shader, error_messages);
     return D3DERR_INVALIDCALL;
 }
 
@@ -177,7 +213,7 @@ HRESULT WINAPI D3DXAssembleShaderFromFileW(LPCWSTR filename,
                                            LPD3DXBUFFER* shader,
                                            LPD3DXBUFFER* error_messages)
 {
-    FIXME("stub\n");
+    FIXME("(%s, %p, %p, %x, %p, %p): stub\n", debugstr_w(filename), defines, include, flags, shader, error_messages);
     return D3DERR_INVALIDCALL;
 }
 
@@ -220,3 +256,382 @@ HRESULT WINAPI D3DXAssembleShaderFromResourceW(HMODULE module,
     return D3DXAssembleShader(buffer, len, defines, include, flags,
                               shader, error_messages);
 }
+
+HRESULT WINAPI D3DXCompileShader(LPCSTR pSrcData,
+                                 UINT srcDataLen,
+                                 CONST D3DXMACRO* pDefines,
+                                 LPD3DXINCLUDE pInclude,
+                                 LPCSTR pFunctionName,
+                                 LPCSTR pProfile,
+                                 DWORD Flags,
+                                 LPD3DXBUFFER* ppShader,
+                                 LPD3DXBUFFER* ppErrorMsgs,
+                                 LPD3DXCONSTANTTABLE * ppConstantTable)
+{
+    FIXME("(%p, %d, %p, %p, %p, %p, %d, %p, %p, %p): stub\n",
+          pSrcData, srcDataLen, pDefines, pInclude, pFunctionName,
+          pProfile, Flags, ppShader, ppErrorMsgs, ppConstantTable);
+    return D3DERR_INVALIDCALL;
+}
+
+static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl;
+
+typedef struct ID3DXConstantTableImpl {
+    const ID3DXConstantTableVtbl *lpVtbl;
+    LONG ref;
+    LPVOID ctab;
+    DWORD size;
+} ID3DXConstantTableImpl;
+
+/*** IUnknown methods ***/
+static HRESULT WINAPI ID3DXConstantTableImpl_QueryInterface(ID3DXConstantTable* iface, REFIID riid, void** ppvObject)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppvObject);
+
+    if (IsEqualGUID(riid, &IID_IUnknown) ||
+        IsEqualGUID(riid, &IID_ID3DXConstantTable))
+    {
+        ID3DXConstantTable_AddRef(iface);
+        *ppvObject = This;
+        return S_OK;
+    }
+
+    ERR("Interface %s not found\n", debugstr_guid(riid));
+
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ID3DXConstantTableImpl_AddRef(ID3DXConstantTable* iface)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    TRACE("(%p)->(): AddRef from %d\n", This, This->ref);
+
+    return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI ID3DXConstantTableImpl_Release(ID3DXConstantTable* iface)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p)->(): Release from %d\n", This, ref + 1);
+
+    if (!ref)
+    {
+        HeapFree(GetProcessHeap(), 0, This->ctab);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
+}
+
+/*** ID3DXBuffer methods ***/
+static LPVOID WINAPI ID3DXConstantTableImpl_GetBufferPointer(ID3DXConstantTable* iface)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    TRACE("(%p)->()\n", This);
+
+    return This->ctab;
+}
+
+static DWORD WINAPI ID3DXConstantTableImpl_GetBufferSize(ID3DXConstantTable* iface)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    TRACE("(%p)->()\n", This);
+
+    return This->size;
+}
+
+/*** ID3DXConstantTable methods ***/
+static HRESULT WINAPI ID3DXConstantTableImpl_GetDesc(ID3DXConstantTable* iface, D3DXCONSTANTTABLE_DESC *desc)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p): stub\n", This, desc);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_GetConstantDesc(ID3DXConstantTable* iface, D3DXHANDLE constant,
+                                                             D3DXCONSTANT_DESC *desc, UINT *count)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p): stub\n", This, constant, desc, count);
+
+    return E_NOTIMPL;
+}
+
+static D3DXHANDLE WINAPI ID3DXConstantTableImpl_GetConstant(ID3DXConstantTable* iface, D3DXHANDLE constant, UINT index)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %d): stub\n", This, constant, index);
+
+    return NULL;
+}
+
+static D3DXHANDLE WINAPI ID3DXConstantTableImpl_GetConstantByName(ID3DXConstantTable* iface, D3DXHANDLE constant, LPCSTR name)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %s): stub\n", This, constant, name);
+
+    return NULL;
+}
+
+static D3DXHANDLE WINAPI ID3DXConstantTableImpl_GetConstantByElement(ID3DXConstantTable* iface, D3DXHANDLE constant, UINT index)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %d): stub\n", This, constant, index);
+
+    return NULL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetDefaults(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p): stub\n", This, device);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetValue(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                      D3DXHANDLE constant, LPCVOID data, UINT bytes)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, data, bytes);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetBool(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                     D3DXHANDLE constant, BOOL b)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %d): stub\n", This, device, constant, b);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetBoolArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                          D3DXHANDLE constant, CONST BOOL* b, UINT count)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, b, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetInt(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, D3DXHANDLE constant, INT n)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %d): stub\n", This, device, constant, n);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetIntArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                         D3DXHANDLE constant, CONST INT* n, UINT count)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, n, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetFloat(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                      D3DXHANDLE constant, FLOAT f)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %f): stub\n", This, device, constant, f);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetFloatArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                           D3DXHANDLE constant, CONST FLOAT* f, UINT count)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, f, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetVector(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                       D3DXHANDLE constant, CONST D3DXVECTOR4* vector)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p): stub\n", This, device, constant, vector);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetVectorArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                            D3DXHANDLE constant, CONST D3DXVECTOR4* vector, UINT count)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, vector, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrix(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                       D3DXHANDLE constant, CONST D3DXMATRIX* matrix)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p): stub\n", This, device, constant, matrix);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                            D3DXHANDLE constant, CONST D3DXMATRIX* matrix, UINT count)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixPointerArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                                   D3DXHANDLE constant, CONST D3DXMATRIX** matrix, UINT count)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTranspose(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                                D3DXHANDLE constant, CONST D3DXMATRIX* matrix)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p): stub\n", This, device, constant, matrix);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTransposeArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                                     D3DXHANDLE constant, CONST D3DXMATRIX* matrix, UINT count)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTransposePointerArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
+                                                                            D3DXHANDLE constant, CONST D3DXMATRIX** matrix, UINT count)
+{
+    ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
+
+    FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count);
+
+    return E_NOTIMPL;
+}
+
+static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl =
+{
+    /*** IUnknown methods ***/
+    ID3DXConstantTableImpl_QueryInterface,
+    ID3DXConstantTableImpl_AddRef,
+    ID3DXConstantTableImpl_Release,
+    /*** ID3DXBuffer methods ***/
+    ID3DXConstantTableImpl_GetBufferPointer,
+    ID3DXConstantTableImpl_GetBufferSize,
+    /*** ID3DXConstantTable methods ***/
+    ID3DXConstantTableImpl_GetDesc,
+    ID3DXConstantTableImpl_GetConstantDesc,
+    ID3DXConstantTableImpl_GetConstant,
+    ID3DXConstantTableImpl_GetConstantByName,
+    ID3DXConstantTableImpl_GetConstantByElement,
+    ID3DXConstantTableImpl_SetDefaults,
+    ID3DXConstantTableImpl_SetValue,
+    ID3DXConstantTableImpl_SetBool,
+    ID3DXConstantTableImpl_SetBoolArray,
+    ID3DXConstantTableImpl_SetInt,
+    ID3DXConstantTableImpl_SetIntArray,
+    ID3DXConstantTableImpl_SetFloat,
+    ID3DXConstantTableImpl_SetFloatArray,
+    ID3DXConstantTableImpl_SetVector,
+    ID3DXConstantTableImpl_SetVectorArray,
+    ID3DXConstantTableImpl_SetMatrix,
+    ID3DXConstantTableImpl_SetMatrixArray,
+    ID3DXConstantTableImpl_SetMatrixPointerArray,
+    ID3DXConstantTableImpl_SetMatrixTranspose,
+    ID3DXConstantTableImpl_SetMatrixTransposeArray,
+    ID3DXConstantTableImpl_SetMatrixTransposePointerArray
+};
+
+HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD* pFunction,
+                                            DWORD flags,
+                                            LPD3DXCONSTANTTABLE* ppConstantTable)
+{
+    ID3DXConstantTableImpl* object;
+    HRESULT hr;
+    LPCVOID data;
+    UINT size;
+
+    FIXME("(%p, %x, %p): semi-stub\n", pFunction, flags, ppConstantTable);
+
+    if (!pFunction || !ppConstantTable)
+        return D3DERR_INVALIDCALL;
+
+    hr = D3DXFindShaderComment(pFunction, MAKEFOURCC('C','T','A','B'), &data, &size);
+    if (hr != D3D_OK)
+        return D3DXERR_INVALIDDATA;
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXConstantTableImpl));
+    if (!object)
+    {
+        ERR("Out of memory\n");
+        return E_OUTOFMEMORY;
+    }
+
+    object->lpVtbl = &ID3DXConstantTable_Vtbl;
+    object->ref = 1;
+
+    object->ctab = HeapAlloc(GetProcessHeap(), 0, size);
+    if (!object->ctab)
+    {
+        HeapFree(GetProcessHeap(), 0, object);
+        ERR("Out of memory\n");
+        return E_OUTOFMEMORY;
+    }
+    object->size = size;
+    memcpy(object->ctab, data, object->size);
+
+    *ppConstantTable = (LPD3DXCONSTANTTABLE)object;
+
+    return D3D_OK;
+}
+
+HRESULT WINAPI D3DXGetShaderConstantTable(CONST DWORD* pFunction,
+                                          LPD3DXCONSTANTTABLE* ppConstantTable)
+{
+    TRACE("(%p, %p): Forwarded to D3DXGetShaderConstantTableEx\n", pFunction, ppConstantTable);
+
+    return D3DXGetShaderConstantTableEx(pFunction, 0, ppConstantTable);
+}
index 4d8d1f6..6de6de7 100644 (file)
@@ -47,7 +47,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
  */
 HRESULT WINAPI D3DXGetImageInfoFromFileInMemory(LPCVOID data, UINT datasize, D3DXIMAGE_INFO *info)
 {
-    FIXME("stub\n");
+    FIXME("(%p, %d, %p): stub\n", data, datasize, info);
 
     if(data && datasize && !info) return D3D_OK;
     if( !data || !datasize ) return D3DERR_INVALIDCALL;
@@ -193,7 +193,9 @@ HRESULT WINAPI D3DXLoadSurfaceFromFileInMemory(LPDIRECT3DSURFACE9 pDestSurface,
                                                D3DCOLOR Colorkey,
                                                D3DXIMAGE_INFO *pSrcInfo)
 {
-    FIXME("stub\n");
+    FIXME("(%p, %p, %p, %p, %d, %p, %d, %x, %p): stub\n", pDestSurface, pDestPalette,
+        pDestRect, pSrcData, SrcDataSize, pSrcRect, dwFilter, Colorkey, pSrcInfo);
+
     if( !pDestSurface || !pSrcData | !SrcDataSize ) return D3DERR_INVALIDCALL;
     return E_NOTIMPL;
 }
diff --git a/reactos/dll/directx/wine/d3dx9_36/texture.c b/reactos/dll/directx/wine/d3dx9_36/texture.c
new file mode 100644 (file)
index 0000000..f47853a
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2010 Christian Costa
+ *
+ * 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 "wine/debug.h"
+#include "d3dx9_36_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+HRESULT WINAPI D3DXCreateTexture(LPDIRECT3DDEVICE9 pDevice,
+                                 UINT width,
+                                 UINT height,
+                                 UINT miplevels,
+                                 DWORD usage,
+                                 D3DFORMAT format,
+                                 D3DPOOL pool,
+                                 LPDIRECT3DTEXTURE9 *ppTexture)
+{
+    FIXME("(%p, %d, %d, %d, %x, %x, %x, %p): semi-stub\n", pDevice, width, height, miplevels, usage, format,
+        pool, ppTexture);
+
+    return IDirect3DDevice9_CreateTexture(pDevice, width, height, miplevels, usage, format, pool, ppTexture, NULL);
+}
index 67fc6f5..13ecfa1 100644 (file)
@@ -1705,13 +1705,13 @@ IDirect3DDeviceImpl_7_EndScene(IDirect3DDevice7 *iface)
     else return D3DERR_SCENE_NOT_IN_SCENE;
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 IDirect3DDeviceImpl_7_EndScene_FPUSetup(IDirect3DDevice7 *iface)
 {
     return IDirect3DDeviceImpl_7_EndScene(iface);
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface)
 {
     HRESULT hr;
@@ -1724,7 +1724,7 @@ IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface)
     return hr;
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface)
 {
     IDirect3DDeviceImpl *This = device_from_device3(iface);
@@ -1732,7 +1732,7 @@ Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface)
     return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This);
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface)
 {
     IDirect3DDeviceImpl *This = device_from_device2(iface);
@@ -1740,7 +1740,7 @@ Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface)
     return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This);
 }
 
-static HRESULT WINAPI
+static HRESULT WINAPI DECLSPEC_HOTPATCH
 Thunk_IDirect3DDeviceImpl_1_EndScene(IDirect3DDevice *iface)
 {
     IDirect3DDeviceImpl *This = device_from_device1(iface);
@@ -2580,7 +2580,8 @@ IDirect3DDeviceImpl_3_GetRenderState(IDirect3DDevice3 *iface,
                 }
 
                 if (!(colorop == WINED3DTOP_MODULATE && colorarg1 == WINED3DTA_TEXTURE && colorarg2 == WINED3DTA_CURRENT &&
-                      alphaop == WINED3DTOP_SELECTARG1 && alphaarg1 == (tex_alpha ? WINED3DTA_TEXTURE : WINED3DTA_CURRENT)))
+                      alphaop == (tex_alpha ? WINED3DTOP_SELECTARG1 : WINED3DTOP_SELECTARG2) &&
+                      alphaarg1 == WINED3DTA_TEXTURE && alphaarg2 == WINED3DTA_CURRENT))
                 {
                     ERR("Unexpected texture stage state setup, returning D3DTBLEND_MODULATE - likely erroneous\n");
                 }
@@ -2852,16 +2853,12 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface,
                         IWineD3DBaseTexture_Release(tex);
                     }
 
-                    IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1);
                     if (tex_alpha)
-                    {
-                        IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE);
-                    }
+                        IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1);
                     else
-                    {
-                        IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_CURRENT);
-                    }
-
+                        IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG2);
+                    IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE);
+                    IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG2, WINED3DTA_CURRENT);
                     IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLORARG1, WINED3DTA_TEXTURE);
                     IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLORARG2, WINED3DTA_CURRENT);
                     IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLOROP, WINED3DTOP_MODULATE);
@@ -4664,15 +4661,11 @@ IDirect3DDeviceImpl_3_SetTexture(IDirect3DDevice3 *iface,
             IWineD3DBaseTexture_Release(tex);
         }
 
-        /* alphaop is WINED3DTOP_SELECTARG1 if it's D3DTBLEND_MODULATE, so only modify alphaarg1 */
+        /* Arg 1/2 are already set to WINED3DTA_TEXTURE/WINED3DTA_CURRENT in case of D3DTBLEND_MODULATE */
         if (tex_alpha)
-        {
-            IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE);
-        }
+            IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1);
         else
-        {
-            IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_CURRENT);
-        }
+            IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG2);
     }
 
     LeaveCriticalSection(&ddraw_cs);
index 079800d..bc23987 100644 (file)
@@ -302,7 +302,7 @@ err_out:
  * Arguments, return values: See DDRAW_Create
  *
  ***********************************************************************/
-HRESULT WINAPI
+HRESULT WINAPI DECLSPEC_HOTPATCH
 DirectDrawCreate(GUID *GUID,
                  LPDIRECTDRAW *DD,
                  IUnknown *UnkOuter)
@@ -325,7 +325,7 @@ DirectDrawCreate(GUID *GUID,
  * Arguments, return values: See DDRAW_Create
  *
  ***********************************************************************/
-HRESULT WINAPI
+HRESULT WINAPI DECLSPEC_HOTPATCH
 DirectDrawCreateEx(GUID *GUID,
                    LPVOID *DD,
                    REFIID iid,
@@ -742,14 +742,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
  */
 HRESULT WINAPI DllCanUnloadNow(void)
 {
-    HRESULT hr;
-    FIXME("(void): stub\n");
-
-    EnterCriticalSection(&ddraw_cs);
-    hr = S_FALSE;
-    LeaveCriticalSection(&ddraw_cs);
-
-    return hr;
+    return S_FALSE;
 }
 
 /*******************************************************************************
index df7528b..f16cf12 100644 (file)
@@ -236,8 +236,17 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
     IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     WINED3DBUFFER_DESC Desc;
     HRESULT hr;
+    DWORD wined3d_flags = 0;
     TRACE("(%p)->(%08x,%p,%p)\n", This, Flags, Data, Size);
 
+    /* Writeonly: Pointless. Event: Unsupported by native according to the sdk
+     * nosyslock: Not applicable
+     */
+    if(!(Flags & DDLOCK_WAIT))          wined3d_flags |= WINED3DLOCK_DONOTWAIT;
+    if(Flags & DDLOCK_READONLY)         wined3d_flags |= WINED3DLOCK_READONLY;
+    if(Flags & DDLOCK_NOOVERWRITE)      wined3d_flags |= WINED3DLOCK_NOOVERWRITE;
+    if(Flags & DDLOCK_DISCARDCONTENTS)  wined3d_flags |= WINED3DLOCK_DISCARD;
+
     EnterCriticalSection(&ddraw_cs);
     if(Size)
     {
@@ -253,7 +262,7 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
     }
 
     hr = IWineD3DBuffer_Map(This->wineD3DVertexBuffer, 0 /* OffsetToLock */,
-            0 /* SizeToLock, 0 == Full lock */, (BYTE **)Data, Flags);
+            0 /* SizeToLock, 0 == Full lock */, (BYTE **)Data, wined3d_flags);
     LeaveCriticalSection(&ddraw_cs);
     return hr;
 }
index 9b06989..b637df1 100644 (file)
@@ -255,14 +255,25 @@ IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface,
     TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
 
     EnterCriticalSection(&ddraw_cs);
-    if (This->use_vp2 != 0) {
-        ERR("  Requesting to get a D3DVIEWPORT struct where a D3DVIEWPORT2 was set !\n");
-        LeaveCriticalSection(&ddraw_cs);
-        return DDERR_INVALIDPARAMS;
-    }
     dwSize = lpData->dwSize;
     memset(lpData, 0, dwSize);
-    memcpy(lpData, &(This->viewports.vp1), dwSize);
+    if (!This->use_vp2)
+        memcpy(lpData, &(This->viewports.vp1), dwSize);
+    else {
+        D3DVIEWPORT vp1;
+        vp1.dwSize = sizeof(vp1);
+        vp1.dwX = This->viewports.vp2.dwX;
+        vp1.dwY = This->viewports.vp2.dwY;
+        vp1.dwWidth = This->viewports.vp2.dwWidth;
+        vp1.dwHeight = This->viewports.vp2.dwHeight;
+        vp1.dvMaxX = 0.0;
+        vp1.dvMaxY = 0.0;
+        vp1.dvScaleX = 0.0;
+        vp1.dvScaleY = 0.0;
+        vp1.dvMinZ = This->viewports.vp2.dvMinZ;
+        vp1.dvMaxZ = This->viewports.vp2.dvMaxZ;
+        memcpy(lpData, &vp1, dwSize);
+    }
 
     if (TRACE_ON(d3d7)) {
         TRACE("  returning D3DVIEWPORT :\n");
@@ -908,14 +919,25 @@ IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface,
     TRACE("(%p)->(%p)\n", This, lpData);
 
     EnterCriticalSection(&ddraw_cs);
-    if (This->use_vp2 != 1) {
-        ERR("  Requesting to get a D3DVIEWPORT2 struct where a D3DVIEWPORT was set !\n");
-        LeaveCriticalSection(&ddraw_cs);
-        return DDERR_INVALIDPARAMS;
-    }
     dwSize = lpData->dwSize;
     memset(lpData, 0, dwSize);
-    memcpy(lpData, &(This->viewports.vp2), dwSize);
+    if (This->use_vp2)
+        memcpy(lpData, &(This->viewports.vp2), dwSize);
+    else {
+        D3DVIEWPORT2 vp2;
+        vp2.dwSize = sizeof(vp2);
+        vp2.dwX = This->viewports.vp1.dwX;
+        vp2.dwY = This->viewports.vp1.dwY;
+        vp2.dwWidth = This->viewports.vp1.dwWidth;
+        vp2.dwHeight = This->viewports.vp1.dwHeight;
+        vp2.dvClipX = 0.0;
+        vp2.dvClipY = 0.0;
+        vp2.dvClipWidth = 0.0;
+        vp2.dvClipHeight = 0.0;
+        vp2.dvMinZ = This->viewports.vp1.dvMinZ;
+        vp2.dvMaxZ = This->viewports.vp1.dvMaxZ;
+        memcpy(lpData, &vp2, dwSize);
+    }
 
     if (TRACE_ON(d3d7)) {
         TRACE("  returning D3DVIEWPORT2 :\n");
index 1fdae2a..cf76386 100644 (file)
@@ -41,6 +41,45 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d);
 
 #define GLINFO_LOCATION      (*gl_info)
 
+/* Extract a line. Note that this modifies the source string. */
+static char *get_line(char **ptr)
+{
+    char *p, *q;
+
+    p = *ptr;
+    if (!(q = strstr(p, "\n")))
+    {
+        if (!*p) return NULL;
+        *ptr += strlen(p);
+        return p;
+    }
+    *q = '\0';
+    *ptr = q + 1;
+
+    return p;
+}
+
+static void shader_arb_dump_program_source(const char *source)
+{
+    unsigned long source_size;
+    char *ptr, *line, *tmp;
+
+    source_size = strlen(source) + 1;
+    tmp = HeapAlloc(GetProcessHeap(), 0, source_size);
+    if (!tmp)
+    {
+        ERR("Failed to allocate %lu bytes for shader source.\n", source_size);
+        return;
+    }
+    memcpy(tmp, source, source_size);
+
+    ptr = tmp;
+    while ((line = get_line(&ptr))) FIXME("    %s\n", line);
+    FIXME("\n");
+
+    HeapFree(GetProcessHeap(), 0, tmp);
+}
+
 /* GL locking for state handlers is done by the caller. */
 static BOOL need_mova_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info)
 {
@@ -1122,10 +1161,10 @@ static void gen_color_correction(struct wined3d_shader_buffer *buffer, const cha
 {
     DWORD mask;
 
-    if (is_yuv_fixup(fixup))
+    if (is_complex_fixup(fixup))
     {
-        enum yuv_fixup yuv_fixup = get_yuv_fixup(fixup);
-        FIXME("YUV fixup (%#x) not supported\n", yuv_fixup);
+        enum complex_fixup complex_fixup = get_complex_fixup(fixup);
+        FIXME("Complex fixup (%#x) not supported\n", complex_fixup);
         return;
     }
 
@@ -1761,8 +1800,8 @@ static void pshader_hw_texkill(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_tex(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
     const struct wined3d_shader_dst_param *dst = &ins->dst[0];
     DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
             ins->ctx->reg_maps->shader_version.minor);
@@ -1856,8 +1895,8 @@ static void pshader_hw_texcoord(const struct wined3d_shader_instruction *ins)
 static void pshader_hw_texreg2ar(const struct wined3d_shader_instruction *ins)
 {
      struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
-     IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-     IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+     IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+     IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
      DWORD flags;
 
      DWORD reg1 = ins->dst[0].reg.idx;
@@ -1904,7 +1943,8 @@ static void pshader_hw_texreg2rgb(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
     const struct wined3d_shader_dst_param *dst = &ins->dst[0];
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     char reg_coord[40], dst_reg[50], src_reg[50];
@@ -1936,8 +1976,8 @@ static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins)
     /* with projective textures, texbem only divides the static texture coord, not the displacement,
      * so we can't let the GL handle this.
      */
-    if (((IWineD3DDeviceImpl*) This->baseShader.device)->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS]
-            & WINED3DTTFF_PROJECTED) {
+    if (device->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED)
+    {
         shader_addline(buffer, "RCP TB.w, %s.w;\n", reg_coord);
         shader_addline(buffer, "MUL TB.xy, %s, TB.w;\n", reg_coord);
         shader_addline(buffer, "ADD TA.xy, TA, TB;\n");
@@ -1975,8 +2015,8 @@ static void pshader_hw_texm3x2pad(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
     DWORD flags;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -1997,10 +2037,10 @@ static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     char src0_name[50], dst_name[50];
     struct wined3d_shader_register tmp_reg = ins->dst[0].reg;
     BOOL is_color;
@@ -2020,12 +2060,12 @@ static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     DWORD flags;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     char dst_str[50];
     char src0_name[50], dst_name[50];
     BOOL is_color;
@@ -2043,12 +2083,12 @@ static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins)
 
 static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     DWORD flags;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     char dst_str[50];
     char src0_name[50];
     char dst_reg[50];
@@ -2085,11 +2125,11 @@ static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins
 
 static void pshader_hw_texm3x3spec(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     DWORD flags;
     DWORD reg = ins->dst[0].reg.idx;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     char dst_str[50];
     char src0_name[50];
@@ -3046,8 +3086,9 @@ static GLuint create_arb_blt_vertex_program(const struct wined3d_gl_info *gl_inf
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     if (pos != -1)
     {
-        FIXME("Vertex program error at position %d: %s\n", pos,
+        FIXME("Vertex program error at position %d: %s\n\n", pos,
             debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(blt_vprogram);
     }
     else
     {
@@ -3108,8 +3149,9 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     if (pos != -1)
     {
-        FIXME("Fragment program error at position %d: %s\n", pos,
+        FIXME("Fragment program error at position %d: %s\n\n", pos,
             debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(blt_fprograms[tex_type]);
     }
     else
     {
@@ -3564,8 +3606,9 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
     if (errPos != -1)
     {
-        FIXME("HW PixelShader Error at position %d: %s\n",
+        FIXME("HW PixelShader Error at position %d: %s\n\n",
               errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer->buffer);
         retval = 0;
     }
     else
@@ -3974,8 +4017,9 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
     if (errPos != -1)
     {
-        FIXME("HW VertexShader Error at position %d: %s\n",
+        FIXME("HW VertexShader Error at position %d: %s\n\n",
               errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer->buffer);
         ret = -1;
     }
     else
@@ -4448,8 +4492,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
 
     if (shader_is_pshader_version(baseShader->baseShader.reg_maps.shader_version.type))
     {
-        IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *) iface;
-        struct arb_pshader_private *shader_data = This->baseShader.backend_data;
+        struct arb_pshader_private *shader_data = baseShader->baseShader.backend_data;
         UINT i;
 
         if(!shader_data) return; /* This can happen if a shader was never compiled */
@@ -4471,10 +4514,11 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
 
         HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
         HeapFree(GetProcessHeap(), 0, shader_data);
-        This->baseShader.backend_data = NULL;
-    } else {
-        IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *) iface;
-        struct arb_vshader_private *shader_data = This->baseShader.backend_data;
+        baseShader->baseShader.backend_data = NULL;
+    }
+    else
+    {
+        struct arb_vshader_private *shader_data = baseShader->baseShader.backend_data;
         UINT i;
 
         if(!shader_data) return; /* This can happen if a shader was never compiled */
@@ -4496,7 +4540,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
 
         HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
         HeapFree(GetProcessHeap(), 0, shader_data);
-        This->baseShader.backend_data = NULL;
+        baseShader->baseShader.backend_data = NULL;
     }
 }
 
@@ -4565,8 +4609,7 @@ static BOOL shader_arb_dirty_const(IWineD3DDevice *iface) {
     return TRUE;
 }
 
-static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info,
-        struct shader_caps *pCaps)
+static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
 {
     DWORD vs_consts = min(gl_info->limits.arb_vs_float_constants, gl_info->limits.arb_vs_native_constants);
     DWORD ps_consts = min(gl_info->limits.arb_ps_float_constants, gl_info->limits.arb_ps_native_constants);
@@ -4574,7 +4617,7 @@ static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_
     /* We don't have an ARB fixed function pipeline yet, so let the none backend set its caps,
      * then overwrite the shader specific ones
      */
-    none_shader_backend.shader_get_caps(devtype, gl_info, pCaps);
+    none_shader_backend.shader_get_caps(gl_info, pCaps);
 
     if (gl_info->supported[ARB_VERTEX_PROGRAM])
     {
@@ -4630,8 +4673,8 @@ static BOOL shader_arb_color_fixup_supported(struct color_fixup_desc fixup)
         dump_color_fixup_desc(fixup);
     }
 
-    /* We support everything except YUV conversions. */
-    if (!is_yuv_fixup(fixup))
+    /* We support everything except complex conversions. */
+    if (!is_complex_fixup(fixup))
     {
         TRACE("[OK]\n");
         return TRUE;
@@ -4678,6 +4721,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
     /* WINED3DSIH_CMP           */ pshader_hw_cmp,
     /* WINED3DSIH_CND           */ pshader_hw_cnd,
     /* WINED3DSIH_CRS           */ shader_hw_map2gl,
+    /* WINED3DSIH_CUT           */ NULL,
     /* WINED3DSIH_DCL           */ NULL,
     /* WINED3DSIH_DEF           */ NULL,
     /* WINED3DSIH_DEFB          */ NULL,
@@ -4689,20 +4733,24 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
     /* WINED3DSIH_DSX           */ shader_hw_map2gl,
     /* WINED3DSIH_DSY           */ shader_hw_dsy,
     /* WINED3DSIH_ELSE          */ shader_hw_else,
+    /* WINED3DSIH_EMIT          */ NULL,
     /* WINED3DSIH_ENDIF         */ shader_hw_endif,
     /* WINED3DSIH_ENDLOOP       */ shader_hw_endloop,
     /* WINED3DSIH_ENDREP        */ shader_hw_endrep,
     /* WINED3DSIH_EXP           */ shader_hw_scalar_op,
     /* WINED3DSIH_EXPP          */ shader_hw_scalar_op,
     /* WINED3DSIH_FRC           */ shader_hw_map2gl,
+    /* WINED3DSIH_IADD          */ NULL,
     /* WINED3DSIH_IF            */ NULL /* Hardcoded into the shader */,
     /* WINED3DSIH_IFC           */ shader_hw_ifc,
+    /* WINED3DSIH_IGE           */ NULL,
     /* WINED3DSIH_LABEL         */ shader_hw_label,
     /* WINED3DSIH_LIT           */ shader_hw_map2gl,
     /* WINED3DSIH_LOG           */ shader_hw_log_pow,
     /* WINED3DSIH_LOGP          */ shader_hw_log_pow,
     /* WINED3DSIH_LOOP          */ shader_hw_loop,
     /* WINED3DSIH_LRP           */ shader_hw_lrp,
+    /* WINED3DSIH_LT            */ NULL,
     /* WINED3DSIH_M3x2          */ shader_hw_mnxn,
     /* WINED3DSIH_M3x3          */ shader_hw_mnxn,
     /* WINED3DSIH_M3x4          */ shader_hw_mnxn,
@@ -5229,7 +5277,7 @@ static void arbfp_free(IWineD3DDevice *iface) {
     }
 }
 
-static void arbfp_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
+static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
 {
     caps->TextureOpCaps =  WINED3DTEXOPCAPS_DISABLE                     |
                            WINED3DTEXOPCAPS_SELECTARG1                  |
@@ -5858,8 +5906,9 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     if (pos != -1)
     {
-        FIXME("Fragment program error at position %d: %s\n", pos,
+        FIXME("Fragment program error at position %d: %s\n\n", pos,
               debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer.buffer);
     }
     else
     {
@@ -6180,6 +6229,7 @@ struct arbfp_blit_priv {
     GLenum yuy2_rect_shader, yuy2_2d_shader;
     GLenum uyvy_rect_shader, uyvy_2d_shader;
     GLenum yv12_rect_shader, yv12_2d_shader;
+    GLenum p8_rect_shader, p8_2d_shader;
 };
 
 static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) {
@@ -6204,20 +6254,22 @@ static void arbfp_blit_free(IWineD3DDevice *iface) {
     GL_EXTCALL(glDeleteProgramsARB(1, &priv->uyvy_2d_shader));
     GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_rect_shader));
     GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_2d_shader));
-    checkGLcall("Delete yuv programs");
+    GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_rect_shader));
+    GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_2d_shader));
+    checkGLcall("Delete yuv and p8 programs");
     LEAVE_GL();
 
     HeapFree(GetProcessHeap(), 0, device->blit_priv);
     device->blit_priv = NULL;
 }
 
-static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, enum yuv_fixup yuv_fixup,
+static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, enum complex_fixup fixup,
         GLenum textype, char *luminance)
 {
     char chroma;
     const char *tex, *texinstr;
 
-    if (yuv_fixup == YUV_FIXUP_UYVY) {
+    if (fixup == COMPLEX_FIXUP_UYVY) {
         chroma = 'x';
         *luminance = 'w';
     } else {
@@ -6445,8 +6497,74 @@ static BOOL gen_yv12_read(struct wined3d_shader_buffer *buffer, GLenum textype,
     return TRUE;
 }
 
+static GLuint gen_p8_shader(IWineD3DDeviceImpl *device, GLenum textype)
+{
+    GLenum shader;
+    struct wined3d_shader_buffer buffer;
+    struct arbfp_blit_priv *priv = device->blit_priv;
+    GLint pos;
+
+    /* Shader header */
+    if (!shader_buffer_init(&buffer))
+    {
+        ERR("Failed to initialize shader buffer.\n");
+        return 0;
+    }
+
+    ENTER_GL();
+    GL_EXTCALL(glGenProgramsARB(1, &shader));
+    GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shader));
+    LEAVE_GL();
+    if(!shader) {
+        shader_buffer_free(&buffer);
+        return 0;
+    }
+
+    shader_addline(&buffer, "!!ARBfp1.0\n");
+    shader_addline(&buffer, "TEMP index;\n");
+
+    /* { 255/256, 0.5/255*255/256, 0, 0 } */
+    shader_addline(&buffer, "PARAM constants = { 0.996, 0.00195, 0, 0 };\n");
+
+    /* The alpha-component contains the palette index */
+    if(textype == GL_TEXTURE_RECTANGLE_ARB)
+        shader_addline(&buffer, "TXP index, fragment.texcoord[0], texture[0], RECT;\n");
+    else
+        shader_addline(&buffer, "TEX index, fragment.texcoord[0], texture[0], 2D;\n");
+
+    /* Scale the index by 255/256 and add a bias of '0.5' in order to sample in the middle */
+    shader_addline(&buffer, "MAD index.a, index.a, constants.x, constants.y;\n");
+
+    /* Use the alpha-component as an index in the palette to get the final color */
+    shader_addline(&buffer, "TEX result.color, index.a, texture[1], 1D;\n");
+    shader_addline(&buffer, "END\n");
+
+    ENTER_GL();
+    GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
+            strlen(buffer.buffer), buffer.buffer));
+    checkGLcall("glProgramStringARB()");
+
+    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
+    if (pos != -1)
+    {
+        FIXME("Fragment program error at position %d: %s\n\n", pos,
+              debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer.buffer);
+    }
+
+    if (textype == GL_TEXTURE_RECTANGLE_ARB)
+        priv->p8_rect_shader = shader;
+    else
+        priv->p8_2d_shader = shader;
+
+    shader_buffer_free(&buffer);
+    LEAVE_GL();
+
+    return shader;
+}
+
 /* Context activation is done by the caller. */
-static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixup, GLenum textype)
+static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum complex_fixup yuv_fixup, GLenum textype)
 {
     GLenum shader;
     struct wined3d_shader_buffer buffer;
@@ -6519,8 +6637,8 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
 
     switch (yuv_fixup)
     {
-        case YUV_FIXUP_UYVY:
-        case YUV_FIXUP_YUY2:
+        case COMPLEX_FIXUP_UYVY:
+        case COMPLEX_FIXUP_YUY2:
             if (!gen_planar_yuv_read(&buffer, yuv_fixup, textype, &luminance_component))
             {
                 shader_buffer_free(&buffer);
@@ -6528,7 +6646,7 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
             }
             break;
 
-        case YUV_FIXUP_YV12:
+        case COMPLEX_FIXUP_YV12:
             if (!gen_yv12_read(&buffer, textype, &luminance_component))
             {
                 shader_buffer_free(&buffer);
@@ -6562,8 +6680,9 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
     glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     if (pos != -1)
     {
-        FIXME("Fragment program error at position %d: %s\n", pos,
+        FIXME("Fragment program error at position %d: %s\n\n", pos,
               debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
+        shader_arb_dump_program_source(buffer.buffer);
     }
     else
     {
@@ -6579,20 +6698,22 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu
 
     switch (yuv_fixup)
     {
-        case YUV_FIXUP_YUY2:
+        case COMPLEX_FIXUP_YUY2:
             if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->yuy2_rect_shader = shader;
             else priv->yuy2_2d_shader = shader;
             break;
 
-        case YUV_FIXUP_UYVY:
+        case COMPLEX_FIXUP_UYVY:
             if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->uyvy_rect_shader = shader;
             else priv->uyvy_2d_shader = shader;
             break;
 
-        case YUV_FIXUP_YV12:
+        case COMPLEX_FIXUP_YV12:
             if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->yv12_rect_shader = shader;
             else priv->yv12_2d_shader = shader;
             break;
+        default:
+            ERR("Unsupported complex fixup: %d\n", yuv_fixup);
     }
 
     return shader;
@@ -6606,9 +6727,9 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
     IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
     float size[4] = {width, height, 1, 1};
     struct arbfp_blit_priv *priv = device->blit_priv;
-    enum yuv_fixup yuv_fixup;
+    enum complex_fixup fixup;
 
-    if (!is_yuv_fixup(format_desc->color_fixup))
+    if (!is_complex_fixup(format_desc->color_fixup))
     {
         TRACE("Fixup:\n");
         dump_color_fixup_desc(format_desc->color_fixup);
@@ -6620,24 +6741,29 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
         return WINED3D_OK;
     }
 
-    yuv_fixup = get_yuv_fixup(format_desc->color_fixup);
+    fixup = get_complex_fixup(format_desc->color_fixup);
 
-    switch(yuv_fixup)
+    switch(fixup)
     {
-        case YUV_FIXUP_YUY2:
+        case COMPLEX_FIXUP_YUY2:
             shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->yuy2_rect_shader : priv->yuy2_2d_shader;
             break;
 
-        case YUV_FIXUP_UYVY:
+        case COMPLEX_FIXUP_UYVY:
             shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->uyvy_rect_shader : priv->uyvy_2d_shader;
             break;
 
-        case YUV_FIXUP_YV12:
+        case COMPLEX_FIXUP_YV12:
             shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->yv12_rect_shader : priv->yv12_2d_shader;
             break;
 
+        case COMPLEX_FIXUP_P8:
+            shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->p8_rect_shader : priv->p8_2d_shader;
+            if (!shader) shader = gen_p8_shader(device, textype);
+            break;
+
         default:
-            FIXME("Unsupported YUV fixup %#x, not setting a shader\n", yuv_fixup);
+            FIXME("Unsupported complex fixup %#x, not setting a shader\n", fixup);
             ENTER_GL();
             glEnable(textype);
             checkGLcall("glEnable(textype)");
@@ -6645,7 +6771,7 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
             return E_NOTIMPL;
     }
 
-    if (!shader) shader = gen_yuv_shader(device, yuv_fixup, textype);
+    if (!shader) shader = gen_yuv_shader(device, fixup, textype);
 
     ENTER_GL();
     glEnable(GL_FRAGMENT_PROGRAM_ARB);
@@ -6684,7 +6810,7 @@ static void arbfp_blit_unset(IWineD3DDevice *iface) {
 
 static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
 {
-    enum yuv_fixup yuv_fixup;
+    enum complex_fixup complex_fixup;
 
     if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
     {
@@ -6699,23 +6825,24 @@ static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
     }
 
     /* We only support YUV conversions. */
-    if (!is_yuv_fixup(fixup))
+    if (!is_complex_fixup(fixup))
     {
         TRACE("[FAILED]\n");
         return FALSE;
     }
 
-    yuv_fixup = get_yuv_fixup(fixup);
-    switch(yuv_fixup)
+    complex_fixup = get_complex_fixup(fixup);
+    switch(complex_fixup)
     {
-        case YUV_FIXUP_YUY2:
-        case YUV_FIXUP_UYVY:
-        case YUV_FIXUP_YV12:
+        case COMPLEX_FIXUP_YUY2:
+        case COMPLEX_FIXUP_UYVY:
+        case COMPLEX_FIXUP_YV12:
+        case COMPLEX_FIXUP_P8:
             TRACE("[OK]\n");
             return TRUE;
 
         default:
-            FIXME("Unsupported YUV fixup %#x\n", yuv_fixup);
+            FIXME("Unsupported YUV fixup %#x\n", complex_fixup);
             TRACE("[FAILED]\n");
             return FALSE;
     }
index becd447..0f911e9 100644 (file)
@@ -1061,7 +1061,7 @@ static void atifs_enable(IWineD3DDevice *iface, BOOL enable) {
     LEAVE_GL();
 }
 
-static void atifs_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
+static void atifs_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
 {
     caps->TextureOpCaps =  WINED3DTEXOPCAPS_DISABLE                     |
                            WINED3DTEXOPCAPS_SELECTARG1                  |
diff --git a/reactos/dll/directx/wine/wined3d/baseshader.c b/reactos/dll/directx/wine/wined3d/baseshader.c
deleted file mode 100644 (file)
index 14416c4..0000000
+++ /dev/null
@@ -1,1439 +0,0 @@
-/*
- * shaders implementation
- *
- * Copyright 2002-2003 Jason Edmeades
- * Copyright 2002-2003 Raphael Junqueira
- * Copyright 2004 Christian Costa
- * Copyright 2005 Oliver Stieber
- * Copyright 2006 Ivan Gyurdiev
- * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
- * Copyright 2009 Henri Verbeet 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 <string.h>
-#include <stdio.h>
-#include "wined3d_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
-WINE_DECLARE_DEBUG_CHANNEL(d3d);
-
-static const char *shader_opcode_names[] =
-{
-    /* WINED3DSIH_ABS           */ "abs",
-    /* WINED3DSIH_ADD           */ "add",
-    /* WINED3DSIH_BEM           */ "bem",
-    /* WINED3DSIH_BREAK         */ "break",
-    /* WINED3DSIH_BREAKC        */ "breakc",
-    /* WINED3DSIH_BREAKP        */ "breakp",
-    /* WINED3DSIH_CALL          */ "call",
-    /* WINED3DSIH_CALLNZ        */ "callnz",
-    /* WINED3DSIH_CMP           */ "cmp",
-    /* WINED3DSIH_CND           */ "cnd",
-    /* WINED3DSIH_CRS           */ "crs",
-    /* WINED3DSIH_DCL           */ "dcl",
-    /* WINED3DSIH_DEF           */ "def",
-    /* WINED3DSIH_DEFB          */ "defb",
-    /* WINED3DSIH_DEFI          */ "defi",
-    /* WINED3DSIH_DP2ADD        */ "dp2add",
-    /* WINED3DSIH_DP3           */ "dp3",
-    /* WINED3DSIH_DP4           */ "dp4",
-    /* WINED3DSIH_DST           */ "dst",
-    /* WINED3DSIH_DSX           */ "dsx",
-    /* WINED3DSIH_DSY           */ "dsy",
-    /* WINED3DSIH_ELSE          */ "else",
-    /* WINED3DSIH_ENDIF         */ "endif",
-    /* WINED3DSIH_ENDLOOP       */ "endloop",
-    /* WINED3DSIH_ENDREP        */ "endrep",
-    /* WINED3DSIH_EXP           */ "exp",
-    /* WINED3DSIH_EXPP          */ "expp",
-    /* WINED3DSIH_FRC           */ "frc",
-    /* WINED3DSIH_IF            */ "if",
-    /* WINED3DSIH_IFC           */ "ifc",
-    /* WINED3DSIH_LABEL         */ "label",
-    /* WINED3DSIH_LIT           */ "lit",
-    /* WINED3DSIH_LOG           */ "log",
-    /* WINED3DSIH_LOGP          */ "logp",
-    /* WINED3DSIH_LOOP          */ "loop",
-    /* WINED3DSIH_LRP           */ "lrp",
-    /* WINED3DSIH_M3x2          */ "m3x2",
-    /* WINED3DSIH_M3x3          */ "m3x3",
-    /* WINED3DSIH_M3x4          */ "m3x4",
-    /* WINED3DSIH_M4x3          */ "m4x3",
-    /* WINED3DSIH_M4x4          */ "m4x4",
-    /* WINED3DSIH_MAD           */ "mad",
-    /* WINED3DSIH_MAX           */ "max",
-    /* WINED3DSIH_MIN           */ "min",
-    /* WINED3DSIH_MOV           */ "mov",
-    /* WINED3DSIH_MOVA          */ "mova",
-    /* WINED3DSIH_MUL           */ "mul",
-    /* WINED3DSIH_NOP           */ "nop",
-    /* WINED3DSIH_NRM           */ "nrm",
-    /* WINED3DSIH_PHASE         */ "phase",
-    /* WINED3DSIH_POW           */ "pow",
-    /* WINED3DSIH_RCP           */ "rcp",
-    /* WINED3DSIH_REP           */ "rep",
-    /* WINED3DSIH_RET           */ "ret",
-    /* WINED3DSIH_RSQ           */ "rsq",
-    /* WINED3DSIH_SETP          */ "setp",
-    /* WINED3DSIH_SGE           */ "sge",
-    /* WINED3DSIH_SGN           */ "sgn",
-    /* WINED3DSIH_SINCOS        */ "sincos",
-    /* WINED3DSIH_SLT           */ "slt",
-    /* WINED3DSIH_SUB           */ "sub",
-    /* WINED3DSIH_TEX           */ "texld",
-    /* WINED3DSIH_TEXBEM        */ "texbem",
-    /* WINED3DSIH_TEXBEML       */ "texbeml",
-    /* WINED3DSIH_TEXCOORD      */ "texcrd",
-    /* WINED3DSIH_TEXDEPTH      */ "texdepth",
-    /* WINED3DSIH_TEXDP3        */ "texdp3",
-    /* WINED3DSIH_TEXDP3TEX     */ "texdp3tex",
-    /* WINED3DSIH_TEXKILL       */ "texkill",
-    /* WINED3DSIH_TEXLDD        */ "texldd",
-    /* WINED3DSIH_TEXLDL        */ "texldl",
-    /* WINED3DSIH_TEXM3x2DEPTH  */ "texm3x2depth",
-    /* WINED3DSIH_TEXM3x2PAD    */ "texm3x2pad",
-    /* WINED3DSIH_TEXM3x2TEX    */ "texm3x2tex",
-    /* WINED3DSIH_TEXM3x3       */ "texm3x3",
-    /* WINED3DSIH_TEXM3x3DIFF   */ "texm3x3diff",
-    /* WINED3DSIH_TEXM3x3PAD    */ "texm3x3pad",
-    /* WINED3DSIH_TEXM3x3SPEC   */ "texm3x3spec",
-    /* WINED3DSIH_TEXM3x3TEX    */ "texm3x3tex",
-    /* WINED3DSIH_TEXM3x3VSPEC  */ "texm3x3vspec",
-    /* WINED3DSIH_TEXREG2AR     */ "texreg2ar",
-    /* WINED3DSIH_TEXREG2GB     */ "texreg2gb",
-    /* WINED3DSIH_TEXREG2RGB    */ "texreg2rgb",
-};
-
-const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token)
-{
-    switch (version_token >> 16)
-    {
-        case WINED3D_SM1_VS:
-        case WINED3D_SM1_PS:
-            return &sm1_shader_frontend;
-
-        case WINED3D_SM4_PS:
-        case WINED3D_SM4_VS:
-        case WINED3D_SM4_GS:
-            return &sm4_shader_frontend;
-
-        default:
-            FIXME("Unrecognised version token %#x\n", version_token);
-            return NULL;
-    }
-}
-
-void shader_buffer_clear(struct wined3d_shader_buffer *buffer)
-{
-    buffer->buffer[0] = '\0';
-    buffer->bsize = 0;
-    buffer->lineNo = 0;
-    buffer->newline = TRUE;
-}
-
-BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer)
-{
-    buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE);
-    if (!buffer->buffer)
-    {
-        ERR("Failed to allocate shader buffer memory.\n");
-        return FALSE;
-    }
-
-    shader_buffer_clear(buffer);
-    return TRUE;
-}
-
-void shader_buffer_free(struct wined3d_shader_buffer *buffer)
-{
-    HeapFree(GetProcessHeap(), 0, buffer->buffer);
-}
-
-int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va_list args)
-{
-    char* base = buffer->buffer + buffer->bsize;
-    int rc;
-
-    rc = vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args);
-
-    if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->bsize /* C99 */)
-    {
-        ERR("The buffer allocated for the shader program string "
-            "is too small at %d bytes.\n", SHADER_PGMSIZE);
-        buffer->bsize = SHADER_PGMSIZE - 1;
-        return -1;
-    }
-
-    if (buffer->newline) {
-        TRACE("GL HW (%u, %u) : %s", buffer->lineNo + 1, buffer->bsize, base);
-        buffer->newline = FALSE;
-    } else {
-        TRACE("%s", base);
-    }
-
-    buffer->bsize += rc;
-    if (buffer->buffer[buffer->bsize-1] == '\n') {
-        buffer->lineNo++;
-        buffer->newline = TRUE;
-    }
-    return 0;
-}
-
-int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...)
-{
-    int ret;
-    va_list args;
-
-    va_start(args, format);
-    ret = shader_vaddline(buffer, format, args);
-    va_end(args);
-
-    return ret;
-}
-
-void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
-        IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
-{
-    shader->ref = 1;
-    shader->device = (IWineD3DDevice *)device;
-    shader->parent = parent;
-    shader->parent_ops = parent_ops;
-    list_init(&shader->linked_programs);
-    list_add_head(&device->shaders, &shader->shader_list_entry);
-}
-
-/* Convert floating point offset relative
- * to a register file to an absolute offset for float constants */
-static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx)
-{
-    switch (register_type)
-    {
-        case WINED3DSPR_CONST: return register_idx;
-        case WINED3DSPR_CONST2: return 2048 + register_idx;
-        case WINED3DSPR_CONST3: return 4096 + register_idx;
-        case WINED3DSPR_CONST4: return 6144 + register_idx;
-        default:
-            FIXME("Unsupported register type: %d\n", register_type);
-            return register_idx;
-    }
-}
-
-static void shader_delete_constant_list(struct list* clist) {
-
-    struct list *ptr;
-    struct local_constant* constant;
-
-    ptr = list_head(clist);
-    while (ptr) {
-        constant = LIST_ENTRY(ptr, struct local_constant, entry);
-        ptr = list_next(clist, ptr);
-        HeapFree(GetProcessHeap(), 0, constant);
-    }
-    list_init(clist);
-}
-
-static inline void set_bitmap_bit(DWORD *bitmap, DWORD bit)
-{
-    DWORD idx, shift;
-    idx = bit >> 5;
-    shift = bit & 0x1f;
-    bitmap[idx] |= (1 << shift);
-}
-
-static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct shader_reg_maps *reg_maps,
-        const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type)
-{
-    switch (reg->type)
-    {
-        case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
-            if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord |= 1 << reg->idx;
-            else reg_maps->address |= 1 << reg->idx;
-            break;
-
-        case WINED3DSPR_TEMP:
-            reg_maps->temporary |= 1 << reg->idx;
-            break;
-
-        case WINED3DSPR_INPUT:
-            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
-            {
-                if (reg->rel_addr)
-                {
-                    /* If relative addressing is used, we must assume that all registers
-                     * are used. Even if it is a construct like v3[aL], we can't assume
-                     * that v0, v1 and v2 aren't read because aL can be negative */
-                    unsigned int i;
-                    for (i = 0; i < MAX_REG_INPUT; ++i)
-                    {
-                        ((IWineD3DPixelShaderImpl *)This)->input_reg_used[i] = TRUE;
-                    }
-                }
-                else
-                {
-                    ((IWineD3DPixelShaderImpl *)This)->input_reg_used[reg->idx] = TRUE;
-                }
-            }
-            else reg_maps->input_registers |= 1 << reg->idx;
-            break;
-
-        case WINED3DSPR_RASTOUT:
-            if (reg->idx == 1) reg_maps->fog = 1;
-            break;
-
-        case WINED3DSPR_MISCTYPE:
-            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
-            {
-                if (reg->idx == 0) reg_maps->vpos = 1;
-                else if (reg->idx == 1) reg_maps->usesfacing = 1;
-            }
-            break;
-
-        case WINED3DSPR_CONST:
-            if (reg->rel_addr)
-            {
-                if (shader_type != WINED3D_SHADER_TYPE_PIXEL)
-                {
-                    if (reg->idx < ((IWineD3DVertexShaderImpl *)This)->min_rel_offset)
-                    {
-                        ((IWineD3DVertexShaderImpl *)This)->min_rel_offset = reg->idx;
-                    }
-                    if (reg->idx > ((IWineD3DVertexShaderImpl *)This)->max_rel_offset)
-                    {
-                        ((IWineD3DVertexShaderImpl *)This)->max_rel_offset = reg->idx;
-                    }
-                }
-                reg_maps->usesrelconstF = TRUE;
-            }
-            else
-            {
-                set_bitmap_bit(reg_maps->constf, reg->idx);
-            }
-            break;
-
-        case WINED3DSPR_CONSTINT:
-            reg_maps->integer_constants |= (1 << reg->idx);
-            break;
-
-        case WINED3DSPR_CONSTBOOL:
-            reg_maps->boolean_constants |= (1 << reg->idx);
-            break;
-
-        case WINED3DSPR_COLOROUT:
-            reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx);
-            break;
-
-        default:
-            TRACE("Not recording register of type %#x and idx %u\n", reg->type, reg->idx);
-            break;
-    }
-}
-
-static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param)
-{
-    switch(instr)
-    {
-        case WINED3DSIH_M4x4:
-        case WINED3DSIH_M3x4:
-            return param == 1 ? 3 : 0;
-
-        case WINED3DSIH_M4x3:
-        case WINED3DSIH_M3x3:
-            return param == 1 ? 2 : 0;
-
-        case WINED3DSIH_M3x2:
-            return param == 1 ? 1 : 0;
-
-        default:
-            return 0;
-    }
-}
-
-static const char *semantic_names[] =
-{
-    /* WINED3DDECLUSAGE_POSITION        */ "SV_POSITION",
-    /* WINED3DDECLUSAGE_BLENDWEIGHT     */ "BLENDWEIGHT",
-    /* WINED3DDECLUSAGE_BLENDINDICES    */ "BLENDINDICES",
-    /* WINED3DDECLUSAGE_NORMAL          */ "NORMAL",
-    /* WINED3DDECLUSAGE_PSIZE           */ "PSIZE",
-    /* WINED3DDECLUSAGE_TEXCOORD        */ "TEXCOORD",
-    /* WINED3DDECLUSAGE_TANGENT         */ "TANGENT",
-    /* WINED3DDECLUSAGE_BINORMAL        */ "BINORMAL",
-    /* WINED3DDECLUSAGE_TESSFACTOR      */ "TESSFACTOR",
-    /* WINED3DDECLUSAGE_POSITIONT       */ "POSITIONT",
-    /* WINED3DDECLUSAGE_COLOR           */ "COLOR",
-    /* WINED3DDECLUSAGE_FOG             */ "FOG",
-    /* WINED3DDECLUSAGE_DEPTH           */ "DEPTH",
-    /* WINED3DDECLUSAGE_SAMPLE          */ "SAMPLE",
-};
-
-static const char *shader_semantic_name_from_usage(WINED3DDECLUSAGE usage)
-{
-    if (usage >= sizeof(semantic_names) / sizeof(*semantic_names))
-    {
-        FIXME("Unrecognized usage %#x\n", usage);
-        return "UNRECOGNIZED";
-    }
-
-    return semantic_names[usage];
-}
-
-WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *name)
-{
-    unsigned int i;
-
-    for (i = 0; i < sizeof(semantic_names) / sizeof(*semantic_names); ++i)
-    {
-        if (!strcmp(name, semantic_names[i])) return i;
-    }
-
-    return ~0U;
-}
-
-BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage)
-{
-    return !strcmp(semantic_name, shader_semantic_name_from_usage(usage));
-}
-
-static void shader_signature_from_semantic(struct wined3d_shader_signature_element *e,
-        const struct wined3d_shader_semantic *s)
-{
-    e->semantic_name = shader_semantic_name_from_usage(s->usage);
-    e->semantic_idx = s->usage_idx;
-    e->sysval_semantic = 0;
-    e->component_type = 0;
-    e->register_idx = s->reg.reg.idx;
-    e->mask = s->reg.write_mask;
-}
-
-/* Note that this does not count the loop register
- * as an address register. */
-
-HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
-        struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature,
-        struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size)
-{
-    IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
-    void *fe_data = This->baseShader.frontend_data;
-    struct wined3d_shader_version shader_version;
-    unsigned int cur_loop_depth = 0, max_loop_depth = 0;
-    const DWORD* pToken = byte_code;
-
-    /* There are some minor differences between pixel and vertex shaders */
-
-    memset(reg_maps, 0, sizeof(*reg_maps));
-
-    /* get_registers_used is called on every compile on some 1.x shaders, which can result
-     * in stacking up a collection of local constants. Delete the old constants if existing
-     */
-    shader_delete_constant_list(&This->baseShader.constantsF);
-    shader_delete_constant_list(&This->baseShader.constantsB);
-    shader_delete_constant_list(&This->baseShader.constantsI);
-
-    fe->shader_read_header(fe_data, &pToken, &shader_version);
-    reg_maps->shader_version = shader_version;
-
-    reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-                                 sizeof(*reg_maps->constf) * ((constf_size + 31) / 32));
-    if(!reg_maps->constf) {
-        ERR("Out of memory\n");
-        return E_OUTOFMEMORY;
-    }
-
-    while (!fe->shader_is_end(fe_data, &pToken))
-    {
-        struct wined3d_shader_instruction ins;
-        const char *comment;
-        UINT param_size;
-
-        /* Skip comments */
-        fe->shader_read_comment(&pToken, &comment);
-        if (comment) continue;
-
-        /* Fetch opcode */
-        fe->shader_read_opcode(fe_data, &pToken, &ins, &param_size);
-
-        /* Unhandled opcode, and its parameters */
-        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
-        {
-            TRACE("Skipping unrecognized instruction.\n");
-            pToken += param_size;
-            continue;
-        }
-
-        /* Handle declarations */
-        if (ins.handler_idx == WINED3DSIH_DCL)
-        {
-            struct wined3d_shader_semantic semantic;
-
-            fe->shader_read_semantic(&pToken, &semantic);
-
-            switch (semantic.reg.reg.type)
-            {
-                /* Mark input registers used. */
-                case WINED3DSPR_INPUT:
-                    reg_maps->input_registers |= 1 << semantic.reg.reg.idx;
-                    shader_signature_from_semantic(&input_signature[semantic.reg.reg.idx], &semantic);
-                    break;
-
-                /* Vshader: mark 3.0 output registers used, save token */
-                case WINED3DSPR_OUTPUT:
-                    reg_maps->output_registers |= 1 << semantic.reg.reg.idx;
-                    shader_signature_from_semantic(&output_signature[semantic.reg.reg.idx], &semantic);
-                    if (semantic.usage == WINED3DDECLUSAGE_FOG) reg_maps->fog = 1;
-                    break;
-
-                /* Save sampler usage token */
-                case WINED3DSPR_SAMPLER:
-                    reg_maps->sampler_type[semantic.reg.reg.idx] = semantic.sampler_type;
-                    break;
-
-                default:
-                    TRACE("Not recording DCL register type %#x.\n", semantic.reg.reg.type);
-                    break;
-            }
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEF)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
-            if (!lconst) return E_OUTOFMEMORY;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-            lconst->idx = dst.reg.idx;
-
-            memcpy(lconst->value, pToken, 4 * sizeof(DWORD));
-            pToken += 4;
-
-            /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
-            if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
-            {
-                float *value = (float *) lconst->value;
-                if (value[0] < -1.0f) value[0] = -1.0f;
-                else if (value[0] > 1.0f) value[0] = 1.0f;
-                if (value[1] < -1.0f) value[1] = -1.0f;
-                else if (value[1] > 1.0f) value[1] = 1.0f;
-                if (value[2] < -1.0f) value[2] = -1.0f;
-                else if (value[2] > 1.0f) value[2] = 1.0f;
-                if (value[3] < -1.0f) value[3] = -1.0f;
-                else if (value[3] > 1.0f) value[3] = 1.0f;
-            }
-
-            list_add_head(&This->baseShader.constantsF, &lconst->entry);
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEFI)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
-            if (!lconst) return E_OUTOFMEMORY;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-            lconst->idx = dst.reg.idx;
-
-            memcpy(lconst->value, pToken, 4 * sizeof(DWORD));
-            pToken += 4;
-
-            list_add_head(&This->baseShader.constantsI, &lconst->entry);
-            reg_maps->local_int_consts |= (1 << dst.reg.idx);
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEFB)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
-            if (!lconst) return E_OUTOFMEMORY;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-            lconst->idx = dst.reg.idx;
-
-            memcpy(lconst->value, pToken, sizeof(DWORD));
-            ++pToken;
-
-            list_add_head(&This->baseShader.constantsB, &lconst->entry);
-            reg_maps->local_bool_consts |= (1 << dst.reg.idx);
-        }
-        /* If there's a loop in the shader */
-        else if (ins.handler_idx == WINED3DSIH_LOOP
-                || ins.handler_idx == WINED3DSIH_REP)
-        {
-            struct wined3d_shader_src_param src, rel_addr;
-
-            fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
-
-            /* Rep and Loop always use an integer constant for the control parameters */
-            if (ins.handler_idx == WINED3DSIH_REP)
-            {
-                reg_maps->integer_constants |= 1 << src.reg.idx;
-            }
-            else
-            {
-                fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
-                reg_maps->integer_constants |= 1 << src.reg.idx;
-            }
-
-            cur_loop_depth++;
-            if(cur_loop_depth > max_loop_depth)
-                max_loop_depth = cur_loop_depth;
-        }
-        else if (ins.handler_idx == WINED3DSIH_ENDLOOP
-                || ins.handler_idx == WINED3DSIH_ENDREP)
-        {
-            cur_loop_depth--;
-        }
-        /* For subroutine prototypes */
-        else if (ins.handler_idx == WINED3DSIH_LABEL)
-        {
-            struct wined3d_shader_src_param src, rel_addr;
-
-            fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr);
-            reg_maps->labels |= 1 << src.reg.idx;
-        }
-        /* Set texture, address, temporary registers */
-        else
-        {
-            int i, limit;
-            BOOL color0_mov = FALSE;
-
-            /* This will loop over all the registers and try to
-             * make a bitmask of the ones we're interested in.
-             *
-             * Relative addressing tokens are ignored, but that's
-             * okay, since we'll catch any address registers when
-             * they are initialized (required by spec) */
-
-            if (ins.dst_count)
-            {
-                struct wined3d_shader_dst_param dst_param;
-                struct wined3d_shader_src_param dst_rel_addr;
-
-                fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
-
-                shader_record_register_usage(This, reg_maps, &dst_param.reg, shader_version.type);
-
-                /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and
-                 * is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel
-                 * shaders because TECRDOUT isn't used in them, but future register types might cause issues */
-                if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3
-                        && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
-                {
-                    reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask;
-                }
-
-                if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
-                {
-                    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)This;
-
-                    if(dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0)
-                    {
-                    /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to
-                     * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
-                     * the mov and perform the sRGB write correction from the source register.
-                     *
-                     * However, if the mov is only partial, we can't do this, and if the write
-                     * comes from an instruction other than MOV it is hard to do as well. If
-                     * COLOROUT 0 is overwritten partially later, the marker is dropped again. */
-
-                        ps->color0_mov = FALSE;
-                        if (ins.handler_idx == WINED3DSIH_MOV)
-                        {
-                            /* Used later when the source register is read. */
-                            color0_mov = TRUE;
-                        }
-                    }
-                    /* Also drop the MOV marker if the source register is overwritten prior to the shader
-                     * end
-                     */
-                    else if(dst_param.reg.type == WINED3DSPR_TEMP && dst_param.reg.idx == ps->color0_reg)
-                    {
-                        ps->color0_mov = FALSE;
-                    }
-                }
-
-                /* Declare 1.X samplers implicitly, based on the destination reg. number */
-                if (shader_version.major == 1
-                        && (ins.handler_idx == WINED3DSIH_TEX
-                            || ins.handler_idx == WINED3DSIH_TEXBEM
-                            || ins.handler_idx == WINED3DSIH_TEXBEML
-                            || ins.handler_idx == WINED3DSIH_TEXDP3TEX
-                            || ins.handler_idx == WINED3DSIH_TEXM3x2TEX
-                            || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC
-                            || ins.handler_idx == WINED3DSIH_TEXM3x3TEX
-                            || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC
-                            || ins.handler_idx == WINED3DSIH_TEXREG2AR
-                            || ins.handler_idx == WINED3DSIH_TEXREG2GB
-                            || ins.handler_idx == WINED3DSIH_TEXREG2RGB))
-                {
-                    /* Fake sampler usage, only set reserved bit and ttype */
-                    DWORD sampler_code = dst_param.reg.idx;
-
-                    TRACE("Setting fake 2D sampler for 1.x pixelshader\n");
-                    reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D;
-
-                    /* texbem is only valid with < 1.4 pixel shaders */
-                    if (ins.handler_idx == WINED3DSIH_TEXBEM
-                            || ins.handler_idx == WINED3DSIH_TEXBEML)
-                    {
-                        reg_maps->bumpmat |= 1 << dst_param.reg.idx;
-                        if (ins.handler_idx == WINED3DSIH_TEXBEML)
-                        {
-                            reg_maps->luminanceparams |= 1 << dst_param.reg.idx;
-                        }
-                    }
-                }
-                else if (ins.handler_idx == WINED3DSIH_BEM)
-                {
-                    reg_maps->bumpmat |= 1 << dst_param.reg.idx;
-                }
-            }
-
-            if (ins.handler_idx == WINED3DSIH_NRM)
-            {
-                reg_maps->usesnrm = 1;
-            }
-            else if (ins.handler_idx == WINED3DSIH_DSY)
-            {
-                reg_maps->usesdsy = 1;
-            }
-            else if (ins.handler_idx == WINED3DSIH_DSX)
-            {
-                reg_maps->usesdsx = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_TEXLDD)
-            {
-                reg_maps->usestexldd = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_TEXLDL)
-            {
-                reg_maps->usestexldl = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_MOVA)
-            {
-                reg_maps->usesmova = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_IFC)
-            {
-                reg_maps->usesifc = 1;
-            }
-            else if(ins.handler_idx == WINED3DSIH_CALL)
-            {
-                reg_maps->usescall = 1;
-            }
-
-            limit = ins.src_count + (ins.predicate ? 1 : 0);
-            for (i = 0; i < limit; ++i)
-            {
-                struct wined3d_shader_src_param src_param, src_rel_addr;
-                unsigned int count;
-
-                fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr);
-                count = get_instr_extra_regcount(ins.handler_idx, i);
-
-                shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type);
-                while (count)
-                {
-                    ++src_param.reg.idx;
-                    shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type);
-                    --count;
-                }
-
-                if(color0_mov)
-                {
-                    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This;
-                    if(src_param.reg.type == WINED3DSPR_TEMP &&
-                       src_param.swizzle == WINED3DSP_NOSWIZZLE)
-                    {
-                        ps->color0_mov = TRUE;
-                        ps->color0_reg = src_param.reg.idx;
-                    }
-                }
-            }
-        }
-    }
-    reg_maps->loop_depth = max_loop_depth;
-
-    This->baseShader.functionLength = ((const char *)pToken - (const char *)byte_code);
-
-    return WINED3D_OK;
-}
-
-unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max)
-{
-    DWORD map = 1 << max;
-    map |= map - 1;
-    map &= reg_maps->shader_version.major < 3 ? ~reg_maps->texcoord : ~reg_maps->input_registers;
-
-    return wined3d_log2i(map);
-}
-
-static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semantic,
-        const struct wined3d_shader_version *shader_version)
-{
-    TRACE("dcl");
-
-    if (semantic->reg.reg.type == WINED3DSPR_SAMPLER)
-    {
-        switch (semantic->sampler_type)
-        {
-            case WINED3DSTT_2D: TRACE("_2d"); break;
-            case WINED3DSTT_CUBE: TRACE("_cube"); break;
-            case WINED3DSTT_VOLUME: TRACE("_volume"); break;
-            default: TRACE("_unknown_ttype(0x%08x)", semantic->sampler_type);
-        }
-    }
-    else
-    {
-        /* Pixel shaders 3.0 don't have usage semantics */
-        if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL)
-            return;
-        else
-            TRACE("_");
-
-        switch (semantic->usage)
-        {
-            case WINED3DDECLUSAGE_POSITION:
-                TRACE("position%d", semantic->usage_idx);
-                break;
-            case WINED3DDECLUSAGE_BLENDINDICES:
-                TRACE("blend");
-                break;
-            case WINED3DDECLUSAGE_BLENDWEIGHT:
-                TRACE("weight");
-                break;
-            case WINED3DDECLUSAGE_NORMAL:
-                TRACE("normal%d", semantic->usage_idx);
-                break;
-            case WINED3DDECLUSAGE_PSIZE:
-                TRACE("psize");
-                break;
-            case WINED3DDECLUSAGE_COLOR:
-                if (semantic->usage_idx == 0) TRACE("color");
-                else TRACE("specular%d", (semantic->usage_idx - 1));
-                break;
-            case WINED3DDECLUSAGE_TEXCOORD:
-                TRACE("texture%d", semantic->usage_idx);
-                break;
-            case WINED3DDECLUSAGE_TANGENT:
-                TRACE("tangent");
-                break;
-            case WINED3DDECLUSAGE_BINORMAL:
-                TRACE("binormal");
-                break;
-            case WINED3DDECLUSAGE_TESSFACTOR:
-                TRACE("tessfactor");
-                break;
-            case WINED3DDECLUSAGE_POSITIONT:
-                TRACE("positionT%d", semantic->usage_idx);
-                break;
-            case WINED3DDECLUSAGE_FOG:
-                TRACE("fog");
-                break;
-            case WINED3DDECLUSAGE_DEPTH:
-                TRACE("depth");
-                break;
-            case WINED3DDECLUSAGE_SAMPLE:
-                TRACE("sample");
-                break;
-            default:
-                FIXME("unknown_semantics(0x%08x)", semantic->usage);
-        }
-    }
-}
-
-static void shader_dump_register(const struct wined3d_shader_register *reg,
-        const struct wined3d_shader_version *shader_version)
-{
-    static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"};
-    static const char * const misctype_reg_names[] = {"vPos", "vFace"};
-    UINT offset = reg->idx;
-
-    switch (reg->type)
-    {
-        case WINED3DSPR_TEMP:
-            TRACE("r");
-            break;
-
-        case WINED3DSPR_INPUT:
-            TRACE("v");
-            break;
-
-        case WINED3DSPR_CONST:
-        case WINED3DSPR_CONST2:
-        case WINED3DSPR_CONST3:
-        case WINED3DSPR_CONST4:
-            TRACE("c");
-            offset = shader_get_float_offset(reg->type, reg->idx);
-            break;
-
-        case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */
-            TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a');
-            break;
-
-        case WINED3DSPR_RASTOUT:
-            TRACE("%s", rastout_reg_names[reg->idx]);
-            break;
-
-        case WINED3DSPR_COLOROUT:
-            TRACE("oC");
-            break;
-
-        case WINED3DSPR_DEPTHOUT:
-            TRACE("oDepth");
-            break;
-
-        case WINED3DSPR_ATTROUT:
-            TRACE("oD");
-            break;
-
-        case WINED3DSPR_TEXCRDOUT:
-            /* Vertex shaders >= 3.0 use general purpose output registers
-             * (WINED3DSPR_OUTPUT), which can include an address token */
-            if (shader_version->major >= 3) TRACE("o");
-            else TRACE("oT");
-            break;
-
-        case WINED3DSPR_CONSTINT:
-            TRACE("i");
-            break;
-
-        case WINED3DSPR_CONSTBOOL:
-            TRACE("b");
-            break;
-
-        case WINED3DSPR_LABEL:
-            TRACE("l");
-            break;
-
-        case WINED3DSPR_LOOP:
-            TRACE("aL");
-            break;
-
-        case WINED3DSPR_SAMPLER:
-            TRACE("s");
-            break;
-
-        case WINED3DSPR_MISCTYPE:
-            if (reg->idx > 1) FIXME("Unhandled misctype register %d\n", reg->idx);
-            else TRACE("%s", misctype_reg_names[reg->idx]);
-            break;
-
-        case WINED3DSPR_PREDICATE:
-            TRACE("p");
-            break;
-
-        case WINED3DSPR_IMMCONST:
-            TRACE("l");
-            break;
-
-        case WINED3DSPR_CONSTBUFFER:
-            TRACE("cb");
-            break;
-
-        default:
-            TRACE("unhandled_rtype(%#x)", reg->type);
-            break;
-    }
-
-    if (reg->type == WINED3DSPR_IMMCONST)
-    {
-        TRACE("(");
-        switch (reg->immconst_type)
-        {
-            case WINED3D_IMMCONST_FLOAT:
-                TRACE("%.8e", *(const float *)reg->immconst_data);
-                break;
-
-            case WINED3D_IMMCONST_FLOAT4:
-                TRACE("%.8e, %.8e, %.8e, %.8e",
-                        *(const float *)&reg->immconst_data[0], *(const float *)&reg->immconst_data[1],
-                        *(const float *)&reg->immconst_data[2], *(const float *)&reg->immconst_data[3]);
-                break;
-
-            default:
-                TRACE("<unhandled immconst_type %#x>", reg->immconst_type);
-                break;
-        }
-        TRACE(")");
-    }
-    else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE)
-    {
-        if (reg->array_idx != ~0U)
-        {
-            TRACE("%u[%u", offset, reg->array_idx);
-            if (reg->rel_addr)
-            {
-                TRACE(" + ");
-                shader_dump_src_param(reg->rel_addr, shader_version);
-            }
-            TRACE("]");
-        }
-        else
-        {
-            if (reg->rel_addr)
-            {
-                TRACE("[");
-                shader_dump_src_param(reg->rel_addr, shader_version);
-                TRACE(" + ");
-            }
-            TRACE("%u", offset);
-            if (reg->rel_addr) TRACE("]");
-        }
-    }
-}
-
-void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
-        const struct wined3d_shader_version *shader_version)
-{
-    DWORD write_mask = param->write_mask;
-
-    shader_dump_register(&param->reg, shader_version);
-
-    if (write_mask != WINED3DSP_WRITEMASK_ALL)
-    {
-        static const char *write_mask_chars = "xyzw";
-
-        TRACE(".");
-        if (write_mask & WINED3DSP_WRITEMASK_0) TRACE("%c", write_mask_chars[0]);
-        if (write_mask & WINED3DSP_WRITEMASK_1) TRACE("%c", write_mask_chars[1]);
-        if (write_mask & WINED3DSP_WRITEMASK_2) TRACE("%c", write_mask_chars[2]);
-        if (write_mask & WINED3DSP_WRITEMASK_3) TRACE("%c", write_mask_chars[3]);
-    }
-}
-
-void shader_dump_src_param(const struct wined3d_shader_src_param *param,
-        const struct wined3d_shader_version *shader_version)
-{
-    DWORD src_modifier = param->modifiers;
-    DWORD swizzle = param->swizzle;
-
-    if (src_modifier == WINED3DSPSM_NEG
-            || src_modifier == WINED3DSPSM_BIASNEG
-            || src_modifier == WINED3DSPSM_SIGNNEG
-            || src_modifier == WINED3DSPSM_X2NEG
-            || src_modifier == WINED3DSPSM_ABSNEG)
-        TRACE("-");
-    else if (src_modifier == WINED3DSPSM_COMP)
-        TRACE("1-");
-    else if (src_modifier == WINED3DSPSM_NOT)
-        TRACE("!");
-
-    if (src_modifier == WINED3DSPSM_ABS || src_modifier == WINED3DSPSM_ABSNEG)
-        TRACE("abs(");
-
-    shader_dump_register(&param->reg, shader_version);
-
-    if (src_modifier)
-    {
-        switch (src_modifier)
-        {
-            case WINED3DSPSM_NONE:    break;
-            case WINED3DSPSM_NEG:     break;
-            case WINED3DSPSM_NOT:     break;
-            case WINED3DSPSM_BIAS:    TRACE("_bias"); break;
-            case WINED3DSPSM_BIASNEG: TRACE("_bias"); break;
-            case WINED3DSPSM_SIGN:    TRACE("_bx2"); break;
-            case WINED3DSPSM_SIGNNEG: TRACE("_bx2"); break;
-            case WINED3DSPSM_COMP:    break;
-            case WINED3DSPSM_X2:      TRACE("_x2"); break;
-            case WINED3DSPSM_X2NEG:   TRACE("_x2"); break;
-            case WINED3DSPSM_DZ:      TRACE("_dz"); break;
-            case WINED3DSPSM_DW:      TRACE("_dw"); break;
-            case WINED3DSPSM_ABSNEG:  TRACE(")"); break;
-            case WINED3DSPSM_ABS:     TRACE(")"); break;
-            default:
-                                      TRACE("_unknown_modifier(%#x)", src_modifier);
-        }
-    }
-
-    if (swizzle != WINED3DSP_NOSWIZZLE)
-    {
-        static const char *swizzle_chars = "xyzw";
-        DWORD swizzle_x = swizzle & 0x03;
-        DWORD swizzle_y = (swizzle >> 2) & 0x03;
-        DWORD swizzle_z = (swizzle >> 4) & 0x03;
-        DWORD swizzle_w = (swizzle >> 6) & 0x03;
-
-        if (swizzle_x == swizzle_y
-                && swizzle_x == swizzle_z
-                && swizzle_x == swizzle_w)
-        {
-            TRACE(".%c", swizzle_chars[swizzle_x]);
-        }
-        else
-        {
-            TRACE(".%c%c%c%c", swizzle_chars[swizzle_x], swizzle_chars[swizzle_y],
-                    swizzle_chars[swizzle_z], swizzle_chars[swizzle_w]);
-        }
-    }
-}
-
-/* Shared code in order to generate the bulk of the shader string.
- * NOTE: A description of how to parse tokens can be found on msdn */
-void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
-        const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx)
-{
-    IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
-    IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; /* To access shader backend callbacks */
-    const struct wined3d_shader_frontend *fe = This->baseShader.frontend;
-    void *fe_data = This->baseShader.frontend_data;
-    struct wined3d_shader_src_param src_rel_addr[4];
-    struct wined3d_shader_src_param src_param[4];
-    struct wined3d_shader_version shader_version;
-    struct wined3d_shader_src_param dst_rel_addr;
-    struct wined3d_shader_dst_param dst_param;
-    struct wined3d_shader_instruction ins;
-    struct wined3d_shader_context ctx;
-    const DWORD *pToken = pFunction;
-    DWORD i;
-
-    /* Initialize current parsing state */
-    ctx.shader = iface;
-    ctx.reg_maps = reg_maps;
-    ctx.buffer = buffer;
-    ctx.backend_data = backend_ctx;
-
-    ins.ctx = &ctx;
-    ins.dst = &dst_param;
-    ins.src = src_param;
-    This->baseShader.parse_state.current_row = 0;
-
-    fe->shader_read_header(fe_data, &pToken, &shader_version);
-
-    while (!fe->shader_is_end(fe_data, &pToken))
-    {
-        const char *comment;
-        UINT param_size;
-
-        /* Skip comment tokens */
-        fe->shader_read_comment(&pToken, &comment);
-        if (comment) continue;
-
-        /* Read opcode */
-        fe->shader_read_opcode(fe_data, &pToken, &ins, &param_size);
-
-        /* Unknown opcode and its parameters */
-        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
-        {
-            TRACE("Skipping unrecognized instruction.\n");
-            pToken += param_size;
-            continue;
-        }
-
-        /* Nothing to do */
-        if (ins.handler_idx == WINED3DSIH_DCL
-                || ins.handler_idx == WINED3DSIH_NOP
-                || ins.handler_idx == WINED3DSIH_DEF
-                || ins.handler_idx == WINED3DSIH_DEFI
-                || ins.handler_idx == WINED3DSIH_DEFB
-                || ins.handler_idx == WINED3DSIH_PHASE)
-        {
-            pToken += param_size;
-            continue;
-        }
-
-        /* Destination token */
-        if (ins.dst_count) fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
-
-        /* Predication token */
-        if (ins.predicate) ins.predicate = *pToken++;
-
-        /* Other source tokens */
-        for (i = 0; i < ins.src_count; ++i)
-        {
-            fe->shader_read_src_param(fe_data, &pToken, &src_param[i], &src_rel_addr[i]);
-        }
-
-        /* Call appropriate function for output target */
-        device->shader_backend->shader_handle_instruction(&ins);
-    }
-}
-
-static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst)
-{
-    DWORD mmask = dst->modifiers;
-
-    switch (dst->shift)
-    {
-        case 0: break;
-        case 13: TRACE("_d8"); break;
-        case 14: TRACE("_d4"); break;
-        case 15: TRACE("_d2"); break;
-        case 1: TRACE("_x2"); break;
-        case 2: TRACE("_x4"); break;
-        case 3: TRACE("_x8"); break;
-        default: TRACE("_unhandled_shift(%d)", dst->shift); break;
-    }
-
-    if (mmask & WINED3DSPDM_SATURATE)         TRACE("_sat");
-    if (mmask & WINED3DSPDM_PARTIALPRECISION) TRACE("_pp");
-    if (mmask & WINED3DSPDM_MSAMPCENTROID)    TRACE("_centroid");
-
-    mmask &= ~(WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_MSAMPCENTROID);
-    if (mmask)
-        FIXME("_unrecognized_modifier(%#x)", mmask);
-}
-
-void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction)
-{
-    struct wined3d_shader_version shader_version;
-    const DWORD* pToken = pFunction;
-    const char *type_prefix;
-    DWORD i;
-
-    TRACE("Parsing %p\n", pFunction);
-
-    fe->shader_read_header(fe_data, &pToken, &shader_version);
-
-    switch (shader_version.type)
-    {
-        case WINED3D_SHADER_TYPE_VERTEX:
-            type_prefix = "vs";
-            break;
-
-        case WINED3D_SHADER_TYPE_GEOMETRY:
-            type_prefix = "gs";
-            break;
-
-        case WINED3D_SHADER_TYPE_PIXEL:
-            type_prefix = "ps";
-            break;
-
-        default:
-            FIXME("Unhandled shader type %#x.\n", shader_version.type);
-            type_prefix = "unknown";
-            break;
-    }
-
-    TRACE("%s_%u_%u\n", type_prefix, shader_version.major, shader_version.minor);
-
-    while (!fe->shader_is_end(fe_data, &pToken))
-    {
-        struct wined3d_shader_instruction ins;
-        const char *comment;
-        UINT param_size;
-
-        /* comment */
-        fe->shader_read_comment(&pToken, &comment);
-        if (comment)
-        {
-            TRACE("//%s\n", comment);
-            continue;
-        }
-
-        fe->shader_read_opcode(fe_data, &pToken, &ins, &param_size);
-        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
-        {
-            TRACE("Skipping unrecognized instruction.\n");
-            pToken += param_size;
-            continue;
-        }
-
-        if (ins.handler_idx == WINED3DSIH_DCL)
-        {
-            struct wined3d_shader_semantic semantic;
-
-            fe->shader_read_semantic(&pToken, &semantic);
-
-            shader_dump_decl_usage(&semantic, &shader_version);
-            shader_dump_ins_modifiers(&semantic.reg);
-            TRACE(" ");
-            shader_dump_dst_param(&semantic.reg, &shader_version);
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEF)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-
-            TRACE("def c%u = %f, %f, %f, %f", shader_get_float_offset(dst.reg.type, dst.reg.idx),
-                    *(const float *)(pToken),
-                    *(const float *)(pToken + 1),
-                    *(const float *)(pToken + 2),
-                    *(const float *)(pToken + 3));
-            pToken += 4;
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEFI)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-
-            TRACE("defi i%u = %d, %d, %d, %d", dst.reg.idx,
-                    *(pToken),
-                    *(pToken + 1),
-                    *(pToken + 2),
-                    *(pToken + 3));
-            pToken += 4;
-        }
-        else if (ins.handler_idx == WINED3DSIH_DEFB)
-        {
-            struct wined3d_shader_dst_param dst;
-            struct wined3d_shader_src_param rel_addr;
-
-            fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr);
-
-            TRACE("defb b%u = %s", dst.reg.idx, *pToken ? "true" : "false");
-            ++pToken;
-        }
-        else
-        {
-            struct wined3d_shader_src_param dst_rel_addr, src_rel_addr;
-            struct wined3d_shader_dst_param dst_param;
-            struct wined3d_shader_src_param src_param;
-
-            if (ins.dst_count)
-            {
-                fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
-            }
-
-            /* Print out predication source token first - it follows
-             * the destination token. */
-            if (ins.predicate)
-            {
-                fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr);
-                TRACE("(");
-                shader_dump_src_param(&src_param, &shader_version);
-                TRACE(") ");
-            }
-
-            /* PixWin marks instructions with the coissue flag with a '+' */
-            if (ins.coissue) TRACE("+");
-
-            TRACE("%s", shader_opcode_names[ins.handler_idx]);
-
-            if (ins.handler_idx == WINED3DSIH_IFC
-                    || ins.handler_idx == WINED3DSIH_BREAKC)
-            {
-                switch (ins.flags)
-                {
-                    case COMPARISON_GT: TRACE("_gt"); break;
-                    case COMPARISON_EQ: TRACE("_eq"); break;
-                    case COMPARISON_GE: TRACE("_ge"); break;
-                    case COMPARISON_LT: TRACE("_lt"); break;
-                    case COMPARISON_NE: TRACE("_ne"); break;
-                    case COMPARISON_LE: TRACE("_le"); break;
-                    default: TRACE("_(%u)", ins.flags);
-                }
-            }
-            else if (ins.handler_idx == WINED3DSIH_TEX
-                    && shader_version.major >= 2
-                    && (ins.flags & WINED3DSI_TEXLD_PROJECT))
-            {
-                TRACE("p");
-            }
-
-            /* We already read the destination token, print it. */
-            if (ins.dst_count)
-            {
-                shader_dump_ins_modifiers(&dst_param);
-                TRACE(" ");
-                shader_dump_dst_param(&dst_param, &shader_version);
-            }
-
-            /* Other source tokens */
-            for (i = ins.dst_count; i < (ins.dst_count + ins.src_count); ++i)
-            {
-                fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr);
-                TRACE(!i ? " " : ", ");
-                shader_dump_src_param(&src_param, &shader_version);
-            }
-        }
-        TRACE("\n");
-    }
-}
-
-void shader_cleanup(IWineD3DBaseShader *iface)
-{
-    IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)iface;
-
-    ((IWineD3DDeviceImpl *)This->baseShader.device)->shader_backend->shader_destroy(iface);
-    HeapFree(GetProcessHeap(), 0, This->baseShader.reg_maps.constf);
-    HeapFree(GetProcessHeap(), 0, This->baseShader.function);
-    shader_delete_constant_list(&This->baseShader.constantsF);
-    shader_delete_constant_list(&This->baseShader.constantsB);
-    shader_delete_constant_list(&This->baseShader.constantsI);
-    list_remove(&This->baseShader.shader_list_entry);
-
-    if (This->baseShader.frontend && This->baseShader.frontend_data)
-    {
-        This->baseShader.frontend->shader_free(This->baseShader.frontend_data);
-    }
-}
-
-static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins) {}
-static void shader_none_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS) {}
-static void shader_none_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {}
-static void shader_none_deselect_depth_blt(IWineD3DDevice *iface) {}
-static void shader_none_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
-static void shader_none_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
-static void shader_none_load_constants(const struct wined3d_context *context, char usePS, char useVS) {}
-static void shader_none_load_np2fixup_constants(IWineD3DDevice *iface, char usePS, char useVS) {}
-static void shader_none_destroy(IWineD3DBaseShader *iface) {}
-static HRESULT shader_none_alloc(IWineD3DDevice *iface) {return WINED3D_OK;}
-static void shader_none_free(IWineD3DDevice *iface) {}
-static BOOL shader_none_dirty_const(IWineD3DDevice *iface) {return FALSE;}
-
-static void shader_none_get_caps(WINED3DDEVTYPE devtype,
-        const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
-{
-    /* Set the shader caps to 0 for the none shader backend */
-    pCaps->VertexShaderVersion  = 0;
-    pCaps->PixelShaderVersion    = 0;
-    pCaps->PixelShader1xMaxValue = 0.0f;
-}
-
-static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
-{
-    if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
-    {
-        TRACE("Checking support for fixup:\n");
-        dump_color_fixup_desc(fixup);
-    }
-
-    /* Faked to make some apps happy. */
-    if (!is_yuv_fixup(fixup))
-    {
-        TRACE("[OK]\n");
-        return TRUE;
-    }
-
-    TRACE("[FAILED]\n");
-    return FALSE;
-}
-
-const shader_backend_t none_shader_backend = {
-    shader_none_handle_instruction,
-    shader_none_select,
-    shader_none_select_depth_blt,
-    shader_none_deselect_depth_blt,
-    shader_none_update_float_vertex_constants,
-    shader_none_update_float_pixel_constants,
-    shader_none_load_constants,
-    shader_none_load_np2fixup_constants,
-    shader_none_destroy,
-    shader_none_alloc,
-    shader_none_free,
-    shader_none_dirty_const,
-    shader_none_get_caps,
-    shader_none_color_fixup_supported,
-};
index 20201b1..e22d311 100644 (file)
@@ -3,7 +3,7 @@
  * Copyright 2002-2005 Raphael Junqueira
  * Copyright 2004 Christian Costa
  * Copyright 2005 Oliver Stieber
- * Copyright 2007 Stefan Dösinger for CodeWeavers
+ * Copyright 2007-2010 Stefan Dösinger for CodeWeavers
  * Copyright 2009 Henri Verbeet for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
@@ -56,7 +56,13 @@ static inline BOOL buffer_add_dirty_area(struct wined3d_buffer *This, UINT offse
         }
     }
 
-    if(!offset && !size)
+    if(offset > This->resource.size || offset + size > This->resource.size)
+    {
+        WARN("Invalid range dirtified, marking entire buffer dirty\n");
+        offset = 0;
+        size = This->resource.size;
+    }
+    else if(!offset && !size)
     {
         size = This->resource.size;
     }
@@ -145,11 +151,6 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
     {
         TRACE("Gl usage = GL_STREAM_DRAW_ARB\n");
         gl_usage = GL_STREAM_DRAW_ARB;
-    }
-    else
-    {
-        TRACE("Gl usage = GL_DYNAMIC_DRAW_ARB\n");
-        gl_usage = GL_DYNAMIC_DRAW_ARB;
 
         if(gl_info->supported[APPLE_FLUSH_BUFFER_RANGE])
         {
@@ -157,6 +158,12 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
             checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)");
             This->flags |= WINED3D_BUFFER_FLUSH;
         }
+        /* No setup is needed here for GL_ARB_map_buffer_range */
+    }
+    else
+    {
+        TRACE("Gl usage = GL_DYNAMIC_DRAW_ARB\n");
+        gl_usage = GL_DYNAMIC_DRAW_ARB;
     }
 
     /* Reserve memory for the buffer. The amount of data won't change
@@ -483,7 +490,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
          * FLOAT16s if not supported. Also, we can't iterate over the array, so use macros to generate code for all
          * the attributes that our current fixed function pipeline implementation cares for.
          */
-        BOOL support_d3dcolor = gl_info->supported[EXT_VERTEX_ARRAY_BGRA];
+        BOOL support_d3dcolor = gl_info->supported[ARB_VERTEX_ARRAY_BGRA];
         ret = buffer_check_attribute(This, si, WINED3D_FFP_POSITION,
                 TRUE, TRUE,  FALSE, &stride_this_run, &float16_used) || ret;
         ret = buffer_check_attribute(This, si, WINED3D_FFP_NORMAL,
@@ -1026,6 +1033,51 @@ static WINED3DRESOURCETYPE STDMETHODCALLTYPE buffer_GetType(IWineD3DBuffer *ifac
 
 /* IWineD3DBuffer methods */
 
+static DWORD buffer_sanitize_flags(DWORD flags)
+{
+    /* Not all flags make sense together, but Windows never returns an error. Catch the
+     * cases that could cause issues */
+    if(flags & WINED3DLOCK_READONLY)
+    {
+        if(flags & WINED3DLOCK_DISCARD)
+        {
+            WARN("WINED3DLOCK_READONLY combined with WINED3DLOCK_DISCARD, ignoring flags\n");
+            return 0;
+        }
+        if(flags & WINED3DLOCK_NOOVERWRITE)
+        {
+            WARN("WINED3DLOCK_READONLY combined with WINED3DLOCK_NOOVERWRITE, ignoring flags\n");
+            return 0;
+        }
+    }
+    else if((flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE)) == (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE))
+    {
+        WARN("WINED3DLOCK_DISCARD and WINED3DLOCK_NOOVERWRITE used together, ignoring\n");
+        return 0;
+    }
+
+    return flags;
+}
+
+static GLbitfield buffer_gl_map_flags(DWORD d3d_flags)
+{
+    GLbitfield ret = 0;
+
+    if (!(d3d_flags & WINED3DLOCK_READONLY)) ret = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
+
+    if (d3d_flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE))
+    {
+        if(d3d_flags & WINED3DLOCK_DISCARD) ret |= GL_MAP_INVALIDATE_BUFFER_BIT;
+        ret |= GL_MAP_UNSYNCHRONIZED_BIT;
+    }
+    else
+    {
+        ret |= GL_MAP_READ_BIT;
+    }
+
+    return ret;
+}
+
 static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset, UINT size, BYTE **data, DWORD flags)
 {
     struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
@@ -1033,7 +1085,11 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
 
     TRACE("iface %p, offset %u, size %u, data %p, flags %#x\n", iface, offset, size, data, flags);
 
-    if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY;
+    flags = buffer_sanitize_flags(flags);
+    if (!(flags & WINED3DLOCK_READONLY))
+    {
+        if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY;
+    }
 
     count = InterlockedIncrement(&This->lock_count);
 
@@ -1043,6 +1099,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
         {
             IWineD3DDeviceImpl *device = This->resource.device;
             struct wined3d_context *context;
+            const struct wined3d_gl_info *gl_info;
 
             if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
             {
@@ -1050,9 +1107,20 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
             }
 
             context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+            gl_info = context->gl_info;
             ENTER_GL();
             GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
-            This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
+
+            if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+            {
+                GLbitfield mapflags = buffer_gl_map_flags(flags);
+                This->resource.allocatedMemory = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
+                                                                             This->resource.size, mapflags));
+            }
+            else
+            {
+                This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
+            }
             LEAVE_GL();
             context_release(context);
         }
@@ -1093,6 +1161,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
     if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER) && This->buffer_object)
     {
         IWineD3DDeviceImpl *device = This->resource.device;
+        const struct wined3d_gl_info *gl_info;
         struct wined3d_context *context;
 
         if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
@@ -1101,10 +1170,21 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
         }
 
         context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+        gl_info = context->gl_info;
         ENTER_GL();
         GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
 
-        if(This->flags & WINED3D_BUFFER_FLUSH)
+        if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+        {
+            for(i = 0; i < This->modified_areas; i++)
+            {
+                GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint,
+                                                    This->maps[i].offset,
+                                                    This->maps[i].size));
+                checkGLcall("glFlushMappedBufferRange");
+            }
+        }
+        else if (This->flags & WINED3D_BUFFER_FLUSH)
         {
             for(i = 0; i < This->modified_areas; i++)
             {
@@ -1196,8 +1276,7 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device,
     TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage,
             debug_d3dformat(buffer->resource.format_desc->format), buffer->resource.allocatedMemory, buffer);
 
-    /* TODO: GL_ARB_map_buffer_range */
-    dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE];
+    dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] || gl_info->supported[ARB_MAP_BUFFER_RANGE];
 
     /* Observations show that drawStridedSlow is faster on dynamic VBs than converting +
      * drawStridedFast (half-life 2 and others).
index 2aec7d6..0878985 100644 (file)
@@ -114,7 +114,7 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo)
 }
 
 /* GL locking is done by the caller */
-static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOOL force_preload)
+static void context_apply_attachment_filter_states(IWineD3DSurface *surface)
 {
     const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
     IWineD3DDeviceImpl *device = surface_impl->resource.device;
@@ -148,7 +148,7 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO
         IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl);
     }
 
-    if (update_minfilter || update_magfilter || force_preload)
+    if (update_minfilter || update_magfilter)
     {
         GLenum target, bind_target;
         GLint old_binding;
@@ -166,8 +166,6 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO
             glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
         }
 
-        surface_internal_preload(surface, SRGB_RGB);
-
         glBindTexture(bind_target, surface_impl->texture_name);
         if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
         if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@@ -208,7 +206,8 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
         }
         else
         {
-            context_apply_attachment_filter_states(depth_stencil, TRUE);
+            surface_prepare_texture(depth_stencil_impl, FALSE);
+            context_apply_attachment_filter_states(depth_stencil);
 
             if (format_flags & WINED3DFMT_FLAG_DEPTH)
             {
@@ -253,14 +252,15 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
 void context_attach_surface_fbo(const struct wined3d_context *context,
         GLenum fbo_target, DWORD idx, IWineD3DSurface *surface)
 {
-    const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
+    IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
     const struct wined3d_gl_info *gl_info = context->gl_info;
 
     TRACE("Attach surface %p to %u\n", surface, idx);
 
     if (surface)
     {
-        context_apply_attachment_filter_states(surface, TRUE);
+        surface_prepare_texture(surface_impl, FALSE);
+        context_apply_attachment_filter_states(surface);
 
         gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface_impl->texture_target,
                 surface_impl->texture_name, surface_impl->texture_level);
@@ -431,10 +431,10 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_
         for (i = 0; i < gl_info->limits.buffers; ++i)
         {
             if (device->render_targets[i])
-                context_apply_attachment_filter_states(device->render_targets[i], FALSE);
+                context_apply_attachment_filter_states(device->render_targets[i]);
         }
         if (device->stencilBufferTarget)
-            context_apply_attachment_filter_states(device->stencilBufferTarget, FALSE);
+            context_apply_attachment_filter_states(device->stencilBufferTarget);
     }
 
     for (i = 0; i < gl_info->limits.buffers; ++i)
@@ -532,32 +532,38 @@ void context_alloc_event_query(struct wined3d_context *context, struct wined3d_e
 
     if (context->free_event_query_count)
     {
-        query->id = context->free_event_queries[--context->free_event_query_count];
+        query->object = context->free_event_queries[--context->free_event_query_count];
     }
     else
     {
-        if (gl_info->supported[APPLE_FENCE])
+        if (gl_info->supported[ARB_SYNC])
+        {
+            /* Using ARB_sync, not much to do here. */
+            query->object.sync = NULL;
+            TRACE("Allocated event query %p in context %p.\n", query->object.sync, context);
+        }
+        else if (gl_info->supported[APPLE_FENCE])
         {
             ENTER_GL();
-            GL_EXTCALL(glGenFencesAPPLE(1, &query->id));
+            GL_EXTCALL(glGenFencesAPPLE(1, &query->object.id));
             checkGLcall("glGenFencesAPPLE");
             LEAVE_GL();
 
-            TRACE("Allocated event query %u in context %p.\n", query->id, context);
+            TRACE("Allocated event query %u in context %p.\n", query->object.id, context);
         }
         else if(gl_info->supported[NV_FENCE])
         {
             ENTER_GL();
-            GL_EXTCALL(glGenFencesNV(1, &query->id));
+            GL_EXTCALL(glGenFencesNV(1, &query->object.id));
             checkGLcall("glGenFencesNV");
             LEAVE_GL();
 
-            TRACE("Allocated event query %u in context %p.\n", query->id, context);
+            TRACE("Allocated event query %u in context %p.\n", query->object.id, context);
         }
         else
         {
             WARN("Event queries not supported, not allocating query id.\n");
-            query->id = 0;
+            query->object.id = 0;
         }
     }
 
@@ -575,12 +581,12 @@ void context_free_event_query(struct wined3d_event_query *query)
     if (context->free_event_query_count >= context->free_event_query_size - 1)
     {
         UINT new_size = context->free_event_query_size << 1;
-        GLuint *new_data = HeapReAlloc(GetProcessHeap(), 0, context->free_event_queries,
+        union wined3d_gl_query_object *new_data = HeapReAlloc(GetProcessHeap(), 0, context->free_event_queries,
                 new_size * sizeof(*context->free_event_queries));
 
         if (!new_data)
         {
-            ERR("Failed to grow free list, leaking query %u in context %p.\n", query->id, context);
+            ERR("Failed to grow free list, leaking query %u in context %p.\n", query->object.id, context);
             return;
         }
 
@@ -588,7 +594,7 @@ void context_free_event_query(struct wined3d_event_query *query)
         context->free_event_queries = new_data;
     }
 
-    context->free_event_queries[context->free_event_query_count++] = query->id;
+    context->free_event_queries[context->free_event_query_count++] = query->object;
 }
 
 void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource, WINED3DRESOURCETYPE type)
@@ -661,6 +667,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
     struct fbo_entry *entry, *entry2;
     HGLRC restore_ctx;
     HDC restore_dc;
+    unsigned int i;
 
     restore_ctx = pwglGetCurrentContext();
     restore_dc = pwglGetCurrentDC();
@@ -682,8 +689,12 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
     {
         if (context->valid)
         {
-            if (gl_info->supported[APPLE_FENCE]) GL_EXTCALL(glDeleteFencesAPPLE(1, &event_query->id));
-            else if (gl_info->supported[NV_FENCE]) GL_EXTCALL(glDeleteFencesNV(1, &event_query->id));
+            if (gl_info->supported[ARB_SYNC])
+            {
+                if (event_query->object.sync) GL_EXTCALL(glDeleteSync(event_query->object.sync));
+            }
+            else if (gl_info->supported[APPLE_FENCE]) GL_EXTCALL(glDeleteFencesAPPLE(1, &event_query->object.id));
+            else if (gl_info->supported[NV_FENCE]) GL_EXTCALL(glDeleteFencesNV(1, &event_query->object.id));
         }
         event_query->context = NULL;
     }
@@ -720,10 +731,24 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
         if (gl_info->supported[ARB_OCCLUSION_QUERY])
             GL_EXTCALL(glDeleteQueriesARB(context->free_occlusion_query_count, context->free_occlusion_queries));
 
-        if (gl_info->supported[APPLE_FENCE])
-            GL_EXTCALL(glDeleteFencesAPPLE(context->free_event_query_count, context->free_event_queries));
+        if (gl_info->supported[ARB_SYNC])
+        {
+            if (event_query->object.sync) GL_EXTCALL(glDeleteSync(event_query->object.sync));
+        }
+        else if (gl_info->supported[APPLE_FENCE])
+        {
+            for (i = 0; i < context->free_event_query_count; ++i)
+            {
+                GL_EXTCALL(glDeleteFencesAPPLE(1, &context->free_event_queries[i].id));
+            }
+        }
         else if (gl_info->supported[NV_FENCE])
-            GL_EXTCALL(glDeleteFencesNV(context->free_event_query_count, context->free_event_queries));
+        {
+            for (i = 0; i < context->free_event_query_count; ++i)
+            {
+                GL_EXTCALL(glDeleteFencesNV(1, &context->free_event_queries[i].id));
+            }
+        }
 
         checkGLcall("context cleanup");
     }
@@ -2131,6 +2156,8 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI
                 if (context->render_offscreen)
                 {
                     FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n");
+                    surface_internal_preload(context->current_rt, SRGB_RGB);
+
                     ENTER_GL();
                     context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
                     context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, context->current_rt);
@@ -2189,6 +2216,9 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI
             }
 
             IWineD3DDeviceImpl_FindTexUnitMap(device);
+            device_preload_textures(device);
+            if (isStateDirty(context, STATE_VDECL))
+                device_update_stream_info(device, context->gl_info);
 
             ENTER_GL();
             for (i = 0; i < context->numDirtyEntries; ++i)
index 34495d3..6682aa4 100644 (file)
@@ -179,8 +179,6 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
 {
     /* We need to deal with frequency data! */
     IWineD3DVertexDeclarationImpl *declaration = (IWineD3DVertexDeclarationImpl *)This->stateBlock->vertexDecl;
-    UINT stream_count = This->stateBlock->streamIsUP ? 0 : declaration->num_streams;
-    const DWORD *streams = declaration->streams;
     unsigned int i;
 
     stream_info->use_map = 0;
@@ -298,7 +296,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
             stream_info->elements[idx].stream_idx = element->input_slot;
             stream_info->elements[idx].buffer_object = buffer_object;
 
-            if (!This->adapter->gl_info.supported[EXT_VERTEX_ARRAY_BGRA]
+            if (!This->adapter->gl_info.supported[ARB_VERTEX_ARRAY_BGRA]
                     && element->format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)
             {
                 stream_info->swizzle_map |= 1 << idx;
@@ -307,17 +305,29 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
         }
     }
 
-    /* Now call PreLoad on all the vertex buffers. In the very rare case
-     * that the buffers stopps converting PreLoad will dirtify the VDECL again.
-     * The vertex buffer can now use the strided structure in the device instead of finding its
-     * own again.
-     *
-     * NULL streams won't be recorded in the array, UP streams won't be either. A stream is only
-     * once in there. */
-    for (i = 0; i < stream_count; ++i)
+    if (!This->stateBlock->streamIsUP)
     {
-        IWineD3DBuffer *vb = This->stateBlock->streamSource[streams[i]];
-        if (vb) IWineD3DBuffer_PreLoad(vb);
+        WORD map = stream_info->use_map;
+
+        /* PreLoad all the vertex buffers. */
+        for (i = 0; map; map >>= 1, ++i)
+        {
+            struct wined3d_stream_info_element *element;
+            struct wined3d_buffer *buffer;
+
+            if (!(map & 1)) continue;
+
+            element = &stream_info->elements[i];
+            buffer = (struct wined3d_buffer *)This->stateBlock->streamSource[element->stream_idx];
+            IWineD3DBuffer_PreLoad((IWineD3DBuffer *)buffer);
+
+            /* If PreLoad dropped the buffer object, update the stream info. */
+            if (buffer->buffer_object != element->buffer_object)
+            {
+                element->buffer_object = 0;
+                element->data = buffer_get_sysmem(buffer) + (ptrdiff_t)element->data;
+            }
+        }
     }
 }
 
@@ -332,7 +342,7 @@ static void stream_info_element_from_strided(const struct wined3d_gl_info *gl_in
     e->buffer_object = 0;
 }
 
-void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
+static void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
         const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info)
 {
     unsigned int i;
@@ -361,7 +371,7 @@ void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
     {
         if (!stream_info->elements[i].format_desc) continue;
 
-        if (!gl_info->supported[EXT_VERTEX_ARRAY_BGRA]
+        if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA]
                 && stream_info->elements[i].format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)
         {
             stream_info->swizzle_map |= 1 << i;
@@ -370,6 +380,120 @@ void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
     }
 }
 
+static void device_trace_strided_stream_info(const struct wined3d_stream_info *stream_info)
+{
+    TRACE("Strided Data:\n");
+    TRACE_STRIDED(stream_info, WINED3D_FFP_POSITION);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_BLENDWEIGHT);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_BLENDINDICES);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_NORMAL);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_PSIZE);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_DIFFUSE);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_SPECULAR);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD0);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD1);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD2);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD3);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD4);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD5);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD6);
+    TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD7);
+}
+
+/* Context activation is done by the caller. */
+void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info)
+{
+    struct wined3d_stream_info *stream_info = &device->strided_streams;
+    IWineD3DStateBlockImpl *stateblock = device->stateBlock;
+    BOOL vs = stateblock->vertexShader && device->vs_selected_mode != SHADER_NONE;
+    BOOL fixup = FALSE;
+
+    if (device->up_strided)
+    {
+        /* Note: this is a ddraw fixed-function code path. */
+        TRACE("=============================== Strided Input ================================\n");
+        device_stream_info_from_strided(gl_info, device->up_strided, stream_info);
+        if (TRACE_ON(d3d)) device_trace_strided_stream_info(stream_info);
+    }
+    else
+    {
+        TRACE("============================= Vertex Declaration =============================\n");
+        device_stream_info_from_declaration(device, vs, stream_info, &fixup);
+    }
+
+    if (vs && !stream_info->position_transformed)
+    {
+        if (((IWineD3DVertexDeclarationImpl *)stateblock->vertexDecl)->half_float_conv_needed && !fixup)
+        {
+            TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion.\n");
+            device->useDrawStridedSlow = TRUE;
+        }
+        else
+        {
+            device->useDrawStridedSlow = FALSE;
+        }
+    }
+    else
+    {
+        WORD slow_mask = (1 << WINED3D_FFP_PSIZE);
+        slow_mask |= -!gl_info->supported[ARB_VERTEX_ARRAY_BGRA]
+                & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR));
+
+        if ((stream_info->position_transformed || (stream_info->use_map & slow_mask)) && !fixup)
+        {
+            device->useDrawStridedSlow = TRUE;
+        }
+        else
+        {
+            device->useDrawStridedSlow = FALSE;
+        }
+    }
+}
+
+static void device_preload_texture(IWineD3DStateBlockImpl *stateblock, unsigned int idx)
+{
+    IWineD3DBaseTextureImpl *texture;
+    enum WINED3DSRGB srgb;
+
+    if (!(texture = (IWineD3DBaseTextureImpl *)stateblock->textures[idx])) return;
+    srgb = stateblock->samplerState[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB;
+    texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb);
+}
+
+void device_preload_textures(IWineD3DDeviceImpl *device)
+{
+    IWineD3DStateBlockImpl *stateblock = device->stateBlock;
+    unsigned int i;
+
+    if (use_vs(stateblock))
+    {
+        for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i)
+        {
+            if (((IWineD3DBaseShaderImpl *)stateblock->vertexShader)->baseShader.reg_maps.sampler_type[i])
+                device_preload_texture(stateblock, MAX_FRAGMENT_SAMPLERS + i);
+        }
+    }
+
+    if (use_ps(stateblock))
+    {
+        for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i)
+        {
+            if (((IWineD3DBaseShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.sampler_type[i])
+                device_preload_texture(stateblock, i);
+        }
+    }
+    else
+    {
+        WORD ffu_map = device->fixed_function_usage_map;
+
+        for (i = 0; ffu_map; ffu_map >>= 1, ++i)
+        {
+            if (ffu_map & 1)
+                device_preload_texture(stateblock, i);
+        }
+    }
+}
+
 /**********************************************************
  * IUnknown parts follows
  **********************************************************/
@@ -596,7 +720,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UI
     IWineD3DSurfaceImpl *object;
     HRESULT hr;
 
-    TRACE("(%p) Create surface\n",This);
+    TRACE("iface %p, width %u, height %u, format %s (%#x), lockable %#x, discard %#x, level %u\n",
+            iface, Width, Height, debug_d3dformat(Format), Format, Lockable, Discard, Level);
+    TRACE("surface %p, usage %s (%#x), pool %s (%#x), multisample_type %#x, multisample_quality %u\n",
+            ppSurface, debug_d3dusage(Usage), Usage, debug_d3dpool(Pool), Pool, MultiSample, MultisampleQuality);
+    TRACE("surface_type %#x, parent %p, parent_ops %p.\n", Impl, parent, parent_ops);
 
     if (Impl == SURFACE_OPENGL && !This->adapter)
     {
@@ -784,104 +912,33 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface
     return WINED3D_OK;
 }
 
-static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, WINED3DQUERYTYPE Type, IWineD3DQuery **ppQuery, IUnknown* parent) {
+static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface,
+        WINED3DQUERYTYPE type, IWineD3DQuery **query, IUnknown *parent)
+{
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
-    const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
-    IWineD3DQueryImpl *object; /*NOTE: impl ref allowed since this is a create function */
-    HRESULT hr = WINED3DERR_NOTAVAILABLE;
-    const IWineD3DQueryVtbl *vtable;
-
-    /* Just a check to see if we support this type of query */
-    switch(Type) {
-    case WINED3DQUERYTYPE_OCCLUSION:
-        TRACE("(%p) occlusion query\n", This);
-        if (gl_info->supported[ARB_OCCLUSION_QUERY])
-            hr = WINED3D_OK;
-        else
-            WARN("Unsupported in local OpenGL implementation: ARB_OCCLUSION_QUERY/NV_OCCLUSION_QUERY\n");
-
-        vtable = &IWineD3DOcclusionQuery_Vtbl;
-        break;
-
-    case WINED3DQUERYTYPE_EVENT:
-        if (!gl_info->supported[NV_FENCE] && !gl_info->supported[APPLE_FENCE])
-        {
-            /* Half-Life 2 needs this query. It does not render the main menu correctly otherwise
-             * Pretend to support it, faking this query does not do much harm except potentially lowering performance
-             */
-            FIXME("(%p) Event query: Unimplemented, but pretending to be supported\n", This);
-        }
-        vtable = &IWineD3DEventQuery_Vtbl;
-        hr = WINED3D_OK;
-        break;
+    IWineD3DQueryImpl *object;
+    HRESULT hr;
 
-    case WINED3DQUERYTYPE_VCACHE:
-    case WINED3DQUERYTYPE_RESOURCEMANAGER:
-    case WINED3DQUERYTYPE_VERTEXSTATS:
-    case WINED3DQUERYTYPE_TIMESTAMP:
-    case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
-    case WINED3DQUERYTYPE_TIMESTAMPFREQ:
-    case WINED3DQUERYTYPE_PIPELINETIMINGS:
-    case WINED3DQUERYTYPE_INTERFACETIMINGS:
-    case WINED3DQUERYTYPE_VERTEXTIMINGS:
-    case WINED3DQUERYTYPE_PIXELTIMINGS:
-    case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
-    case WINED3DQUERYTYPE_CACHEUTILIZATION:
-    default:
-        /* Use the base Query vtable until we have a special one for each query */
-        vtable = &IWineD3DQuery_Vtbl;
-        FIXME("(%p) Unhandled query type %d\n", This, Type);
-    }
-    if(NULL == ppQuery || hr != WINED3D_OK) {
-        return hr;
-    }
+    TRACE("iface %p, type %#x, query %p, parent %p.\n", iface, type, query, parent);
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
-    if(!object)
+    if (!object)
     {
-        ERR("Out of memory\n");
-        *ppQuery = NULL;
-        return WINED3DERR_OUTOFVIDEOMEMORY;
+        ERR("Failed to allocate query memory.\n");
+        return E_OUTOFMEMORY;
     }
 
-    object->lpVtbl = vtable;
-    object->type = Type;
-    object->state = QUERY_CREATED;
-    object->device = This;
-    object->parent = parent;
-    object->ref = 1;
-
-    *ppQuery = (IWineD3DQuery *)object;
-
-    /* allocated the 'extended' data based on the type of query requested */
-    switch(Type){
-    case WINED3DQUERYTYPE_OCCLUSION:
-        object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query));
-        ((struct wined3d_occlusion_query *)object->extendedData)->context = NULL;
-        break;
+    hr = query_init(object, This, type, parent);
+    if (FAILED(hr))
+    {
+        WARN("Failed to initialize query, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
 
-    case WINED3DQUERYTYPE_EVENT:
-        object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_event_query));
-        ((struct wined3d_event_query *)object->extendedData)->context = NULL;
-        break;
+    TRACE("Created query %p.\n", object);
+    *query = (IWineD3DQuery *)object;
 
-    case WINED3DQUERYTYPE_VCACHE:
-    case WINED3DQUERYTYPE_RESOURCEMANAGER:
-    case WINED3DQUERYTYPE_VERTEXSTATS:
-    case WINED3DQUERYTYPE_TIMESTAMP:
-    case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
-    case WINED3DQUERYTYPE_TIMESTAMPFREQ:
-    case WINED3DQUERYTYPE_PIPELINETIMINGS:
-    case WINED3DQUERYTYPE_INTERFACETIMINGS:
-    case WINED3DQUERYTYPE_VERTEXTIMINGS:
-    case WINED3DQUERYTYPE_PIXELTIMINGS:
-    case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
-    case WINED3DQUERYTYPE_CACHEUTILIZATION:
-    default:
-        object->extendedData = 0;
-        FIXME("(%p) Unhandled query type %d\n",This , Type);
-    }
-    TRACE("(%p) : Created Query %p\n", This, object);
     return WINED3D_OK;
 }
 
@@ -1663,14 +1720,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
         }
     }
 
-    /* Delete the palette conversion shader if it is around */
-    if(This->paletteConversionShader) {
-        ENTER_GL();
-        GL_EXTCALL(glDeleteProgramsARB(1, &This->paletteConversionShader));
-        LEAVE_GL();
-        This->paletteConversionShader = 0;
-    }
-
     /* Delete the pbuffer context if there is any */
     if(This->pbufferContext) context_destroy(This, This->pbufferContext);
 
@@ -3054,15 +3103,17 @@ static void device_update_fixed_function_usage_map(IWineD3DDeviceImpl *This) {
     }
 }
 
-static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This) {
+static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info)
+{
     unsigned int i, tex;
     WORD ffu_map;
 
     device_update_fixed_function_usage_map(This);
     ffu_map = This->fixed_function_usage_map;
 
-    if (This->max_ffp_textures == This->max_ffp_texture_stages ||
-            This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures) {
+    if (This->max_ffp_textures == gl_info->limits.texture_stages
+            || This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures)
+    {
         for (i = 0; ffu_map; ffu_map >>= 1, ++i)
         {
             if (!(ffu_map & 1)) continue;
@@ -3092,7 +3143,8 @@ static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This) {
     }
 }
 
-static void device_map_psamplers(IWineD3DDeviceImpl *This) {
+static void device_map_psamplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info)
+{
     const WINED3DSAMPLER_TEXTURE_TYPE *sampler_type =
             ((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.reg_maps.sampler_type;
     unsigned int i;
@@ -3102,7 +3154,8 @@ static void device_map_psamplers(IWineD3DDeviceImpl *This) {
         {
             device_map_stage(This, i, i);
             IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SAMPLER(i));
-            if (i < MAX_TEXTURES) {
+            if (i < gl_info->limits.texture_stages)
+            {
                 markTextureStagesDirty(This, i);
             }
         }
@@ -3133,11 +3186,12 @@ static BOOL device_unit_free_for_vs(IWineD3DDeviceImpl *This, const DWORD *pshad
     return !vshader_sampler_tokens[current_mapping - MAX_FRAGMENT_SAMPLERS];
 }
 
-static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) {
+static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps, const struct wined3d_gl_info *gl_info)
+{
     const WINED3DSAMPLER_TEXTURE_TYPE *vshader_sampler_type =
             ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.reg_maps.sampler_type;
     const WINED3DSAMPLER_TEXTURE_TYPE *pshader_sampler_type = NULL;
-    int start = min(MAX_COMBINED_SAMPLERS, This->adapter->gl_info.limits.combined_samplers) - 1;
+    int start = min(MAX_COMBINED_SAMPLERS, gl_info->limits.combined_samplers) - 1;
     int i;
 
     if (ps) {
@@ -3174,7 +3228,9 @@ static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) {
     }
 }
 
-void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) {
+void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This)
+{
+    const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
     BOOL vs = use_vs(This->stateBlock);
     BOOL ps = use_ps(This->stateBlock);
     /*
@@ -3184,15 +3240,10 @@ void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) {
      * -> When the mapping of a stage is changed, sampler and ALL texture stage states have
      * to be reset. Because of that try to work with a 1:1 mapping as much as possible
      */
-    if (ps) {
-        device_map_psamplers(This);
-    } else {
-        device_map_fixed_function_samplers(This);
-    }
+    if (ps) device_map_psamplers(This, gl_info);
+    else device_map_fixed_function_samplers(This, gl_info);
 
-    if (vs) {
-        device_map_vsamplers(This, ps);
-    }
+    if (vs) device_map_vsamplers(This, ps, gl_info);
 }
 
 static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader *pShader) {
@@ -3806,11 +3857,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
 static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
     DWORD oldValue = This->updateStateBlock->textureState[Stage][Type];
+    const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
 
     TRACE("(%p) : Stage=%d, Type=%s(%d), Value=%d\n", This, Stage, debug_d3dtexturestate(Type), Type, Value);
 
-    if (Stage >= MAX_TEXTURES) {
-        WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring\n", Stage, MAX_TEXTURES - 1);
+    if (Stage >= gl_info->limits.texture_stages)
+    {
+        WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring.\n",
+                Stage, gl_info->limits.texture_stages - 1);
         return WINED3D_OK;
     }
 
@@ -3891,6 +3945,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
         DWORD stage, IWineD3DBaseTexture *texture)
 {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+    const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
     IWineD3DBaseTexture *prev;
 
     TRACE("iface %p, stage %u, texture %p.\n", iface, stage, texture);
@@ -3949,7 +4004,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
             IWineD3DDeviceImpl_MarkStateDirty(This, STATE_PIXELSHADER);
         }
 
-        if (!prev && stage < MAX_TEXTURES)
+        if (!prev && stage < gl_info->limits.texture_stages)
         {
             /* The source arguments for color and alpha ops have different
              * meanings when a NULL texture is bound, so the COLOROP and
@@ -3968,7 +4023,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
 
         IWineD3DBaseTexture_Release(prev);
 
-        if (!texture && stage < MAX_TEXTURES)
+        if (!texture && stage < gl_info->limits.texture_stages)
         {
             IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(stage, WINED3DTSS_COLOROP));
             IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(stage, WINED3DTSS_ALPHAOP));
@@ -4206,7 +4261,6 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This,  IWineD3DSurfa
     const WINED3DVIEWPORT *vp = &This->stateBlock->viewport;
     UINT drawable_width, drawable_height;
     IWineD3DSurfaceImpl *depth_stencil = (IWineD3DSurfaceImpl *) This->stencilBufferTarget;
-    IWineD3DSwapChainImpl *swapchain = NULL;
     struct wined3d_context *context;
 
     /* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the
@@ -4376,12 +4430,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This,  IWineD3DSurfa
 
     LEAVE_GL();
 
-    if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)target, &IID_IWineD3DSwapChain, (void **)&swapchain))) {
-        if (target == (IWineD3DSurfaceImpl*) swapchain->frontBuffer) {
-            wglFlush();
-        }
-        IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
-    }
+    wglFlush(); /* Flush to ensure ordering across contexts. */
 
     context_release(context);
 
@@ -5340,6 +5389,9 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
     struct wined3d_context *context;
 
+    if (rect) IWineD3DSurface_LoadLocation(surface, SFLAG_INDRAWABLE, NULL);
+    IWineD3DSurface_ModifyLocation(surface, SFLAG_INDRAWABLE, TRUE);
+
     if (!surface_is_offscreen(surface))
     {
         TRACE("Surface %p is onscreen\n", surface);
@@ -5386,6 +5438,9 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
     checkGLcall("glClear");
 
     LEAVE_GL();
+
+    wglFlush(); /* Flush to ensure ordering across contexts. */
+
     context_release(context);
 }
 
@@ -5685,6 +5740,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *ifa
         if(Swapchain->backBuffer[0]) {
             IWineD3DSurface_SetContainer(Swapchain->backBuffer[0], (IWineD3DBase *) Swapchain);
             ((IWineD3DSurfaceImpl *)Swapchain->backBuffer[0])->Flags |= SFLAG_SWAPCHAIN;
+            Swapchain->presentParms.BackBufferWidth = BackImpl->currentDesc.Width;
+            Swapchain->presentParms.BackBufferHeight = BackImpl->currentDesc.Height;
+            Swapchain->presentParms.BackBufferFormat = BackImpl->resource.format_desc->format;
         } else {
             HeapFree(GetProcessHeap(), 0, Swapchain->backBuffer);
             Swapchain->backBuffer = NULL;
@@ -5738,6 +5796,12 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
             break;
     }
 
+    /* Make sure the drawables are up-to-date. Note that loading the
+     * destination surface isn't strictly required if we overwrite the
+     * entire surface. */
+    IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL);
+    IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL);
+
     /* Attach src surface to src fbo */
     src_swapchain = get_swapchain(src_surface);
     dst_swapchain = get_swapchain(dst_surface);
@@ -5753,9 +5817,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
         GLenum buffer = surface_get_gl_buffer(src_surface);
 
         TRACE("Source surface %p is onscreen\n", src_surface);
-        /* Make sure the drawable is up to date. In the offscreen case
-         * attach_surface_fbo() implicitly takes care of this. */
-        IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL);
 
         if(buffer == GL_FRONT) {
             RECT windowsize;
@@ -5792,9 +5853,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
         GLenum buffer = surface_get_gl_buffer(dst_surface);
 
         TRACE("Destination surface %p is onscreen\n", dst_surface);
-        /* Make sure the drawable is up to date. In the offscreen case
-         * attach_surface_fbo() implicitly takes care of this. */
-        IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL);
 
         if(buffer == GL_FRONT) {
             RECT windowsize;
@@ -5839,6 +5897,9 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
     }
 
     LEAVE_GL();
+
+    wglFlush(); /* Flush to ensure ordering across contexts. */
+
     context_release(context);
 
     IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INDRAWABLE, TRUE);
@@ -6982,20 +7043,19 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
     for (i = 0; i < PATCHMAP_SIZE; ++i) list_init(&device->patches[i]);
 
     select_shader_mode(&adapter->gl_info, &device->ps_selected_mode, &device->vs_selected_mode);
-    device->shader_backend = select_shader_backend(adapter, device_type);
+    device->shader_backend = adapter->shader_backend;
 
     memset(&shader_caps, 0, sizeof(shader_caps));
-    device->shader_backend->shader_get_caps(device_type, &adapter->gl_info, &shader_caps);
+    device->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
     device->d3d_vshader_constantF = shader_caps.MaxVertexShaderConst;
     device->d3d_pshader_constantF = shader_caps.MaxPixelShaderConst;
     device->vs_clipping = shader_caps.VSClipping;
 
     memset(&ffp_caps, 0, sizeof(ffp_caps));
-    fragment_pipeline = select_fragment_implementation(adapter, device_type);
+    fragment_pipeline = adapter->fragment_pipe;
     device->frag_pipe = fragment_pipeline;
-    fragment_pipeline->get_caps(device_type, &adapter->gl_info, &ffp_caps);
+    fragment_pipeline->get_caps(&adapter->gl_info, &ffp_caps);
     device->max_ffp_textures = ffp_caps.MaxSimultaneousTextures;
-    device->max_ffp_texture_stages = ffp_caps.MaxTextureBlendStages;
 
     hr = compile_state_table(device->StateTable, device->multistate_funcs, &adapter->gl_info,
             ffp_vertexstate_template, fragment_pipeline, misc_state_template);
@@ -7006,7 +7066,7 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
         return hr;
     }
 
-    device->blitter = select_blit_implementation(adapter, device_type);
+    device->blitter = adapter->blitter;
 
     return WINED3D_OK;
 }
index 855f97f..812e5cc 100644 (file)
@@ -30,6 +30,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 WINE_DECLARE_DEBUG_CHANNEL(d3d_caps);
 
 #define GLINFO_LOCATION (*gl_info)
+#define WINE_DEFAULT_VIDMEM (64 * 1024 * 1024)
+#define MAKEDWORD_VERSION(maj, min)  ((maj & 0xffff) << 16) | (min & 0xffff)
 
 /* The d3d device ID */
 static const GUID IID_D3DDEVICE_D3DUID = { 0xaeb2cdd4, 0x6e41, 0x43ea, { 0x94,0x1c,0x83,0x61,0xcc,0x76,0x07,0x81 } };
@@ -43,17 +45,10 @@ static const struct {
     /* APPLE */
     {"GL_APPLE_client_storage",             APPLE_CLIENT_STORAGE,           0                           },
     {"GL_APPLE_fence",                      APPLE_FENCE,                    0                           },
-    {"GL_APPLE_flush_render",               APPLE_FLUSH_RENDER,             0                           },
-    {"GL_APPLE_ycbcr_422",                  APPLE_YCBCR_422,                0                           },
     {"GL_APPLE_float_pixels",               APPLE_FLOAT_PIXELS,             0                           },
     {"GL_APPLE_flush_buffer_range",         APPLE_FLUSH_BUFFER_RANGE,       0                           },
-
-    /* ATI */
-    {"GL_ATI_separate_stencil",             ATI_SEPARATE_STENCIL,           0                           },
-    {"GL_ATI_texture_env_combine3",         ATI_TEXTURE_ENV_COMBINE3,       0                           },
-    {"GL_ATI_texture_mirror_once",          ATI_TEXTURE_MIRROR_ONCE,        0                           },
-    {"GL_ATI_fragment_shader",              ATI_FRAGMENT_SHADER,            0                           },
-    {"GL_ATI_texture_compression_3dc",      ATI_TEXTURE_COMPRESSION_3DC,    0                           },
+    {"GL_APPLE_flush_render",               APPLE_FLUSH_RENDER,             0                           },
+    {"GL_APPLE_ycbcr_422",                  APPLE_YCBCR_422,                0                           },
 
     /* ARB */
     {"GL_ARB_color_buffer_float",           ARB_COLOR_BUFFER_FLOAT,         0                           },
@@ -66,7 +61,9 @@ static const struct {
     {"GL_ARB_framebuffer_object",           ARB_FRAMEBUFFER_OBJECT,         0                           },
     {"GL_ARB_geometry_shader4",             ARB_GEOMETRY_SHADER4,           0                           },
     {"GL_ARB_half_float_pixel",             ARB_HALF_FLOAT_PIXEL,           0                           },
+    {"GL_ARB_half_float_vertex",            ARB_HALF_FLOAT_VERTEX,          0                           },
     {"GL_ARB_imaging",                      ARB_IMAGING,                    0                           },
+    {"GL_ARB_map_buffer_range",             ARB_MAP_BUFFER_RANGE,           0                           },
     {"GL_ARB_multisample",                  ARB_MULTISAMPLE,                0                           }, /* needs GLX_ARB_MULTISAMPLE as well */
     {"GL_ARB_multitexture",                 ARB_MULTITEXTURE,               0                           },
     {"GL_ARB_occlusion_query",              ARB_OCCLUSION_QUERY,            0                           },
@@ -74,6 +71,10 @@ static const struct {
     {"GL_ARB_point_parameters",             ARB_POINT_PARAMETERS,           0                           },
     {"GL_ARB_point_sprite",                 ARB_POINT_SPRITE,               0                           },
     {"GL_ARB_provoking_vertex",             ARB_PROVOKING_VERTEX,           0                           },
+    {"GL_ARB_shader_objects",               ARB_SHADER_OBJECTS,             0                           },
+    {"GL_ARB_shader_texture_lod",           ARB_SHADER_TEXTURE_LOD,         0                           },
+    {"GL_ARB_shading_language_100",         ARB_SHADING_LANGUAGE_100,       0                           },
+    {"GL_ARB_sync",                         ARB_SYNC,                       0                           },
     {"GL_ARB_texture_border_clamp",         ARB_TEXTURE_BORDER_CLAMP,       0                           },
     {"GL_ARB_texture_compression",          ARB_TEXTURE_COMPRESSION,        0                           },
     {"GL_ARB_texture_cube_map",             ARB_TEXTURE_CUBE_MAP,           0                           },
@@ -85,23 +86,30 @@ static const struct {
     {"GL_ARB_texture_non_power_of_two",     ARB_TEXTURE_NON_POWER_OF_TWO,   MAKEDWORD_VERSION(2, 0)     },
     {"GL_ARB_texture_rectangle",            ARB_TEXTURE_RECTANGLE,          0                           },
     {"GL_ARB_texture_rg",                   ARB_TEXTURE_RG,                 0                           },
+    {"GL_ARB_vertex_array_bgra",            ARB_VERTEX_ARRAY_BGRA,          0                           },
     {"GL_ARB_vertex_blend",                 ARB_VERTEX_BLEND,               0                           },
     {"GL_ARB_vertex_buffer_object",         ARB_VERTEX_BUFFER_OBJECT,       0                           },
     {"GL_ARB_vertex_program",               ARB_VERTEX_PROGRAM,             0                           },
     {"GL_ARB_vertex_shader",                ARB_VERTEX_SHADER,              0                           },
-    {"GL_ARB_shader_objects",               ARB_SHADER_OBJECTS,             0                           },
-    {"GL_ARB_shader_texture_lod",           ARB_SHADER_TEXTURE_LOD,         0                           },
-    {"GL_ARB_half_float_vertex",            ARB_HALF_FLOAT_VERTEX,          0                           },
+
+    /* ATI */
+    {"GL_ATI_fragment_shader",              ATI_FRAGMENT_SHADER,            0                           },
+    {"GL_ATI_separate_stencil",             ATI_SEPARATE_STENCIL,           0                           },
+    {"GL_ATI_texture_compression_3dc",      ATI_TEXTURE_COMPRESSION_3DC,    0                           },
+    {"GL_ATI_texture_env_combine3",         ATI_TEXTURE_ENV_COMBINE3,       0                           },
+    {"GL_ATI_texture_mirror_once",          ATI_TEXTURE_MIRROR_ONCE,        0                           },
 
     /* EXT */
     {"GL_EXT_blend_color",                  EXT_BLEND_COLOR,                0                           },
-    {"GL_EXT_blend_minmax",                 EXT_BLEND_MINMAX,               0                           },
     {"GL_EXT_blend_equation_separate",      EXT_BLEND_EQUATION_SEPARATE,    0                           },
     {"GL_EXT_blend_func_separate",          EXT_BLEND_FUNC_SEPARATE,        0                           },
+    {"GL_EXT_blend_minmax",                 EXT_BLEND_MINMAX,               0                           },
     {"GL_EXT_fog_coord",                    EXT_FOG_COORD,                  0                           },
     {"GL_EXT_framebuffer_blit",             EXT_FRAMEBUFFER_BLIT,           0                           },
     {"GL_EXT_framebuffer_multisample",      EXT_FRAMEBUFFER_MULTISAMPLE,    0                           },
     {"GL_EXT_framebuffer_object",           EXT_FRAMEBUFFER_OBJECT,         0                           },
+    {"GL_EXT_gpu_program_parameters",       EXT_GPU_PROGRAM_PARAMETERS,     0                           },
+    {"GL_EXT_gpu_shader4",                  EXT_GPU_SHADER4,                0                           },
     {"GL_EXT_packed_depth_stencil",         EXT_PACKED_DEPTH_STENCIL,       0                           },
     {"GL_EXT_paletted_texture",             EXT_PALETTED_TEXTURE,           0                           },
     {"GL_EXT_point_parameters",             EXT_POINT_PARAMETERS,           0                           },
@@ -110,42 +118,36 @@ static const struct {
     {"GL_EXT_stencil_two_side",             EXT_STENCIL_TWO_SIDE,           0                           },
     {"GL_EXT_stencil_wrap",                 EXT_STENCIL_WRAP,               0                           },
     {"GL_EXT_texture3D",                    EXT_TEXTURE3D,                  MAKEDWORD_VERSION(1, 2)     },
-    {"GL_EXT_texture_compression_s3tc",     EXT_TEXTURE_COMPRESSION_S3TC,   0                           },
     {"GL_EXT_texture_compression_rgtc",     EXT_TEXTURE_COMPRESSION_RGTC,   0                           },
+    {"GL_EXT_texture_compression_s3tc",     EXT_TEXTURE_COMPRESSION_S3TC,   0                           },
     {"GL_EXT_texture_env_add",              EXT_TEXTURE_ENV_ADD,            0                           },
     {"GL_EXT_texture_env_combine",          EXT_TEXTURE_ENV_COMBINE,        0                           },
     {"GL_EXT_texture_env_dot3",             EXT_TEXTURE_ENV_DOT3,           0                           },
-    {"GL_EXT_texture_sRGB",                 EXT_TEXTURE_SRGB,               0                           },
-    {"GL_EXT_texture_swizzle",              EXT_TEXTURE_SWIZZLE,            0                           },
     {"GL_EXT_texture_filter_anisotropic",   EXT_TEXTURE_FILTER_ANISOTROPIC, 0                           },
-    {"GL_EXT_texture_lod",                  EXT_TEXTURE_LOD,                0                           },
     {"GL_EXT_texture_lod_bias",             EXT_TEXTURE_LOD_BIAS,           0                           },
+    {"GL_EXT_texture_sRGB",                 EXT_TEXTURE_SRGB,               0                           },
     {"GL_EXT_vertex_array_bgra",            EXT_VERTEX_ARRAY_BGRA,          0                           },
-    {"GL_EXT_vertex_shader",                EXT_VERTEX_SHADER,              0                           },
-    {"GL_EXT_gpu_program_parameters",       EXT_GPU_PROGRAM_PARAMETERS,     0                           },
 
     /* NV */
-    {"GL_NV_half_float",                    NV_HALF_FLOAT,                  0                           },
+    {"GL_NV_depth_clamp",                   NV_DEPTH_CLAMP,                 0                           },
     {"GL_NV_fence",                         NV_FENCE,                       0                           },
     {"GL_NV_fog_distance",                  NV_FOG_DISTANCE,                0                           },
     {"GL_NV_fragment_program",              NV_FRAGMENT_PROGRAM,            0                           },
     {"GL_NV_fragment_program2",             NV_FRAGMENT_PROGRAM2,           0                           },
+    {"GL_NV_fragment_program_option",       NV_FRAGMENT_PROGRAM_OPTION,     0                           },
+    {"GL_NV_half_float",                    NV_HALF_FLOAT,                  0                           },
+    {"GL_NV_light_max_exponent",            NV_LIGHT_MAX_EXPONENT,          0                           },
     {"GL_NV_register_combiners",            NV_REGISTER_COMBINERS,          0                           },
     {"GL_NV_register_combiners2",           NV_REGISTER_COMBINERS2,         0                           },
     {"GL_NV_texgen_reflection",             NV_TEXGEN_REFLECTION,           0                           },
     {"GL_NV_texture_env_combine4",          NV_TEXTURE_ENV_COMBINE4,        0                           },
     {"GL_NV_texture_shader",                NV_TEXTURE_SHADER,              0                           },
     {"GL_NV_texture_shader2",               NV_TEXTURE_SHADER2,             0                           },
-    {"GL_NV_texture_shader3",               NV_TEXTURE_SHADER3,             0                           },
-    {"GL_NV_occlusion_query",               NV_OCCLUSION_QUERY,             0                           },
     {"GL_NV_vertex_program",                NV_VERTEX_PROGRAM,              0                           },
     {"GL_NV_vertex_program1_1",             NV_VERTEX_PROGRAM1_1,           0                           },
     {"GL_NV_vertex_program2",               NV_VERTEX_PROGRAM2,             0                           },
     {"GL_NV_vertex_program2_option",        NV_VERTEX_PROGRAM2_OPTION,      0                           },
     {"GL_NV_vertex_program3",               NV_VERTEX_PROGRAM3,             0                           },
-    {"GL_NV_fragment_program_option",       NV_FRAGMENT_PROGRAM_OPTION,     0                           },
-    {"GL_NV_depth_clamp",                   NV_DEPTH_CLAMP,                 0                           },
-    {"GL_NV_light_max_exponent",            NV_LIGHT_MAX_EXPONENT,          0                           },
 
     /* SGI */
     {"GL_SGIS_generate_mipmap",             SGIS_GENERATE_MIPMAP,           0                           },
@@ -435,9 +437,9 @@ static DWORD ver_for_ext(GL_SupportedExt ext)
 }
 
 static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (vendor != VENDOR_ATI) return FALSE;
+    if (card_vendor != HW_VENDOR_ATI) return FALSE;
     if (device == CARD_ATI_RADEON_9500) return TRUE;
     if (device == CARD_ATI_RADEON_X700) return TRUE;
     if (device == CARD_ATI_RADEON_X1600) return TRUE;
@@ -445,9 +447,9 @@ static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const c
 }
 
 static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (vendor == VENDOR_NVIDIA)
+    if (card_vendor == HW_VENDOR_NVIDIA)
     {
         if (device == CARD_NVIDIA_GEFORCEFX_5800 || device == CARD_NVIDIA_GEFORCEFX_5600)
         {
@@ -458,7 +460,7 @@ static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl
 }
 
 static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
     /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
      * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
@@ -470,18 +472,15 @@ static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_re
      * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
      * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
      * the chance that other implementations support them is rather small since Win32 QuickTime uses
-     * DirectDraw, not OpenGL. */
-    if (gl_info->supported[APPLE_FENCE]
-            && gl_info->supported[APPLE_CLIENT_STORAGE]
-            && gl_info->supported[APPLE_FLUSH_RENDER]
-            && gl_info->supported[APPLE_YCBCR_422])
+     * DirectDraw, not OpenGL.
+     *
+     * This test has been moved into wined3d_guess_gl_vendor()
+     */
+    if (gl_vendor == GL_VENDOR_APPLE)
     {
         return TRUE;
     }
-    else
-    {
-        return FALSE;
-    }
+    return FALSE;
 }
 
 /* Context activation is done by the caller. */
@@ -554,31 +553,29 @@ static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
 }
 
 static BOOL match_apple_intel(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    return vendor == VENDOR_INTEL && match_apple(gl_info, gl_renderer, vendor, device);
+    return (card_vendor == HW_VENDOR_INTEL) && (gl_vendor == GL_VENDOR_APPLE);
 }
 
 static BOOL match_apple_nonr500ati(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (!match_apple(gl_info, gl_renderer, vendor, device)) return FALSE;
-    if (vendor != VENDOR_ATI) return FALSE;
+    if (gl_vendor != GL_VENDOR_APPLE) return FALSE;
+    if (card_vendor != HW_VENDOR_ATI) return FALSE;
     if (device == CARD_ATI_RADEON_X1600) return FALSE;
     return TRUE;
 }
 
 static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (vendor != VENDOR_ATI) return FALSE;
-    if (match_apple(gl_info, gl_renderer, vendor, device)) return FALSE;
-    if (strstr(gl_renderer, "DRI")) return FALSE; /* Filter out Mesa DRI drivers. */
-    return TRUE;
+    return (gl_vendor == GL_VENDOR_ATI);
+
 }
 
 static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
     /* DX9 cards support 40 single float varyings in hardware, most drivers report 32. ATI misreports
      * 44 varyings. So assume that if we have more than 44 varyings we have a dx10 card.
@@ -592,7 +589,7 @@ static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char
 
 /* A GL context is provided by the caller */
 static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
     GLenum error;
     DWORD data[16];
@@ -619,15 +616,15 @@ static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, const
 }
 
 static BOOL match_apple_nvts(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
-    if (!match_apple(gl_info, gl_renderer, vendor, device)) return FALSE;
+    if (!match_apple(gl_info, gl_renderer, gl_vendor, card_vendor, device)) return FALSE;
     return gl_info->supported[NV_TEXTURE_SHADER];
 }
 
 /* A GL context is provided by the caller */
 static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
 {
     GLuint prog;
     BOOL ret = FALSE;
@@ -793,7 +790,6 @@ static void quirk_apple_nvts(struct wined3d_gl_info *gl_info)
 {
     gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
     gl_info->supported[NV_TEXTURE_SHADER2] = FALSE;
-    gl_info->supported[NV_TEXTURE_SHADER3] = FALSE;
 }
 
 static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
@@ -804,7 +800,7 @@ static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
 struct driver_quirk
 {
     BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-            enum wined3d_pci_vendor vendor, enum wined3d_pci_device device);
+            enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device);
     void (*apply)(struct wined3d_gl_info *gl_info);
     const char *description;
 };
@@ -923,51 +919,51 @@ static const struct driver_version_information driver_version_table[] =
      * TNT/Geforce1/2 up to 71.x - driver uses numbering 7.1.8.6 for 71.86
      *
      * All version numbers used below are from the Linux nvidia drivers. */
-    {VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT,           "NVIDIA RIVA TNT",                  1,  8,  6      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT2,          "NVIDIA RIVA TNT2/TNT2 Pro",        1,  8,  6      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE,            "NVIDIA GeForce 256",               1,  8,  6      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2_MX,        "NVIDIA GeForce2 MX/MX 400",        6,  4,  3      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2,           "NVIDIA GeForce2 GTS/GeForce2 Pro", 1,  8,  6      },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE3,           "NVIDIA GeForce3",                  6,  10, 9371   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_MX,        "NVIDIA GeForce4 MX 460",           6,  10, 9371   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_TI4200,    "NVIDIA GeForce4 Ti 4200",          6,  10, 9371   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5200,     "NVIDIA GeForce FX 5200",           15, 11, 7516   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5600,     "NVIDIA GeForce FX 5600",           15, 11, 7516   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5800,     "NVIDIA GeForce FX 5800",           15, 11, 7516   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6200,       "NVIDIA GeForce 6200",              15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6600GT,     "NVIDIA GeForce 6600 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6800,       "NVIDIA GeForce 6800",              15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7300,       "NVIDIA GeForce Go 7300",           15, 11, 8585   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7400,       "NVIDIA GeForce Go 7400",           15, 11, 8585   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7600,       "NVIDIA GeForce 7600 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7800GT,     "NVIDIA GeForce 7800 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8300GS,     "NVIDIA GeForce 8300 GS",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600GT,     "NVIDIA GeForce 8600 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600MGT,    "NVIDIA GeForce 8600M GT",          15, 11, 8585   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8800GTS,    "NVIDIA GeForce 8800 GTS",          15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9200,       "NVIDIA GeForce 9200",              15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9400GT,     "NVIDIA GeForce 9400 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9500GT,     "NVIDIA GeForce 9500 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9600GT,     "NVIDIA GeForce 9600 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9800GT,     "NVIDIA GeForce 9800 GT",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX260,     "NVIDIA GeForce GTX 260",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX275,     "NVIDIA GeForce GTX 275",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX280,     "NVIDIA GeForce GTX 280",           15, 11, 8618   },
-    {VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GT240,      "NVIDIA GeForce GT 240",            15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT,           "NVIDIA RIVA TNT",                  1,  8,  6      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_RIVA_TNT2,          "NVIDIA RIVA TNT2/TNT2 Pro",        1,  8,  6      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE,            "NVIDIA GeForce 256",               1,  8,  6      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2_MX,        "NVIDIA GeForce2 MX/MX 400",        6,  4,  3      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE2,           "NVIDIA GeForce2 GTS/GeForce2 Pro", 1,  8,  6      },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE3,           "NVIDIA GeForce3",                  6,  10, 9371   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_MX,        "NVIDIA GeForce4 MX 460",           6,  10, 9371   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE4_TI4200,    "NVIDIA GeForce4 Ti 4200",          6,  10, 9371   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5200,     "NVIDIA GeForce FX 5200",           15, 11, 7516   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5600,     "NVIDIA GeForce FX 5600",           15, 11, 7516   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCEFX_5800,     "NVIDIA GeForce FX 5800",           15, 11, 7516   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6200,       "NVIDIA GeForce 6200",              15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6600GT,     "NVIDIA GeForce 6600 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_6800,       "NVIDIA GeForce 6800",              15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7300,       "NVIDIA GeForce Go 7300",           15, 11, 8585   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7400,       "NVIDIA GeForce Go 7400",           15, 11, 8585   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7600,       "NVIDIA GeForce 7600 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_7800GT,     "NVIDIA GeForce 7800 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8300GS,     "NVIDIA GeForce 8300 GS",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600GT,     "NVIDIA GeForce 8600 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8600MGT,    "NVIDIA GeForce 8600M GT",          15, 11, 8585   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_8800GTS,    "NVIDIA GeForce 8800 GTS",          15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9200,       "NVIDIA GeForce 9200",              15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9400GT,     "NVIDIA GeForce 9400 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9500GT,     "NVIDIA GeForce 9500 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9600GT,     "NVIDIA GeForce 9600 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_9800GT,     "NVIDIA GeForce 9800 GT",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX260,     "NVIDIA GeForce GTX 260",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX275,     "NVIDIA GeForce GTX 275",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GTX280,     "NVIDIA GeForce GTX 280",           15, 11, 8618   },
+    {HW_VENDOR_NVIDIA,     CARD_NVIDIA_GEFORCE_GT240,      "NVIDIA GeForce GT 240",            15, 11, 8618   },
 
     /* ATI cards. The driver versions are somewhat similar, but not quite the same. Let's hardcode. */
-    {VENDOR_ATI,        CARD_ATI_RADEON_9500,           "ATI Radeon 9500",                  14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_X700,           "ATI Radeon X700 SE",               14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_X1600,          "ATI Radeon X1600 Series",          14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD2300,         "ATI Mobility Radeon HD 2300",      14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD2600,         "ATI Mobility Radeon HD 2600",      14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD2900,         "ATI Radeon HD 2900 XT",            14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD4350,         "ATI Radeon HD 4350",               14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD4600,         "ATI Radeon HD 4600 Series",        14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD4700,         "ATI Radeon HD 4700 Series",        14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD4800,         "ATI Radeon HD 4800 Series",        14, 10, 6764    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD5700,         "ATI Radeon HD 5700 Series",        14, 10, 8681    },
-    {VENDOR_ATI,        CARD_ATI_RADEON_HD5800,         "ATI Radeon HD 5800 Series",        14, 10, 8681    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_9500,           "ATI Radeon 9500",                  14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_X700,           "ATI Radeon X700 SE",               14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_X1600,          "ATI Radeon X1600 Series",          14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD2300,         "ATI Mobility Radeon HD 2300",      14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD2600,         "ATI Mobility Radeon HD 2600",      14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD2900,         "ATI Radeon HD 2900 XT",            14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4350,         "ATI Radeon HD 4350",               14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4600,         "ATI Radeon HD 4600 Series",        14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4700,         "ATI Radeon HD 4700 Series",        14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD4800,         "ATI Radeon HD 4800 Series",        14, 10, 6764    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD5700,         "ATI Radeon HD 5700 Series",        14, 10, 8681    },
+    {HW_VENDOR_ATI,        CARD_ATI_RADEON_HD5800,         "ATI Radeon HD 5800 Series",        14, 10, 8681    },
 
     /* TODO: Add information about legacy ATI hardware, Intel and other cards. */
 };
@@ -995,14 +991,15 @@ static void init_driver_info(struct wined3d_driver_info *driver_info,
 
     switch (vendor)
     {
-        case VENDOR_ATI:
+        case HW_VENDOR_ATI:
             driver_info->name = "ati2dvag.dll";
             break;
 
-        case VENDOR_NVIDIA:
+        case HW_VENDOR_NVIDIA:
             driver_info->name = "nv4_disp.dll";
             break;
 
+        case HW_VENDOR_INTEL:
         default:
             FIXME_(d3d_caps)("Unhandled vendor %04x.\n", vendor);
             driver_info->name = "Display";
@@ -1053,91 +1050,817 @@ static void init_driver_info(struct wined3d_driver_info *driver_info,
         }
     }
 
-    driver_info->description = "Direct3D HAL";
-    driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, 15);
-    driver_info->version_low = MAKEDWORD_VERSION(8, 6); /* Nvidia RIVA TNT, arbitrary */
-
-    for (i = 0; i < (sizeof(driver_version_table) / sizeof(driver_version_table[0])); ++i)
+    driver_info->description = "Direct3D HAL";
+    driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, 15);
+    driver_info->version_low = MAKEDWORD_VERSION(8, 6); /* Nvidia RIVA TNT, arbitrary */
+
+    for (i = 0; i < (sizeof(driver_version_table) / sizeof(driver_version_table[0])); ++i)
+    {
+        if (vendor == driver_version_table[i].vendor && device == driver_version_table[i].card)
+        {
+            TRACE_(d3d_caps)("Found card %04x:%04x in driver DB.\n", vendor, device);
+
+            driver_info->description = driver_version_table[i].description;
+            driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, driver_version_table[i].d3d_level);
+            driver_info->version_low = MAKEDWORD_VERSION(driver_version_table[i].lopart_hi,
+                    driver_version_table[i].lopart_lo);
+            break;
+        }
+    }
+
+    TRACE_(d3d_caps)("Reporting (fake) driver version 0x%08x-0x%08x.\n",
+            driver_info->version_high, driver_info->version_low);
+}
+
+/* Context activation is done by the caller. */
+static void fixup_extensions(struct wined3d_gl_info *gl_info, const char *gl_renderer,
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
+{
+    unsigned int i;
+
+    for (i = 0; i < (sizeof(quirk_table) / sizeof(*quirk_table)); ++i)
+    {
+        if (!quirk_table[i].match(gl_info, gl_renderer, gl_vendor, card_vendor, device)) continue;
+        TRACE_(d3d_caps)("Applying driver quirk \"%s\".\n", quirk_table[i].description);
+        quirk_table[i].apply(gl_info);
+    }
+
+    /* Find out if PBOs work as they are supposed to. */
+    test_pbo_functionality(gl_info);
+}
+
+static DWORD wined3d_parse_gl_version(const char *gl_version)
+{
+    const char *ptr = gl_version;
+    int major, minor;
+
+    major = atoi(ptr);
+    if (major <= 0) ERR_(d3d_caps)("Invalid opengl major version: %d.\n", major);
+
+    while (isdigit(*ptr)) ++ptr;
+    if (*ptr++ != '.') ERR_(d3d_caps)("Invalid opengl version string: %s.\n", debugstr_a(gl_version));
+
+    minor = atoi(ptr);
+
+    TRACE_(d3d_caps)("Found OpenGL version: %d.%d.\n", major, minor);
+
+    return MAKEDWORD_VERSION(major, minor);
+}
+
+static enum wined3d_gl_vendor wined3d_guess_gl_vendor(struct wined3d_gl_info *gl_info, const char *gl_vendor_string, const char *gl_renderer)
+{
+
+    /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from
+     * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to
+     * detect the Apple OpenGL implementation to apply some extension fixups afterwards.
+     *
+     * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks
+     * aren't sufficient either because a Linux binary may display on a macos X server via remote X11.
+     * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions
+     * like client storage might be supported on other implementations too, but GL_APPLE_flush_render
+     * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So
+     * the chance that other implementations support them is rather small since Win32 QuickTime uses
+     * DirectDraw, not OpenGL. */
+    if (gl_info->supported[APPLE_FENCE]
+            && gl_info->supported[APPLE_CLIENT_STORAGE]
+            && gl_info->supported[APPLE_FLUSH_RENDER]
+            && gl_info->supported[APPLE_YCBCR_422])
+        return GL_VENDOR_APPLE;
+
+    if (strstr(gl_vendor_string, "NVIDIA"))
+        return GL_VENDOR_NVIDIA;
+
+    if (strstr(gl_vendor_string, "ATI"))
+        return GL_VENDOR_ATI;
+
+    if (strstr(gl_vendor_string, "Intel(R)")
+            || strstr(gl_renderer, "Intel(R)")
+            || strstr(gl_vendor_string, "Intel Inc."))
+        return GL_VENDOR_INTEL;
+
+    if (strstr(gl_vendor_string, "Mesa")
+            || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
+            || strstr(gl_vendor_string, "DRI R300 Project")
+            || strstr(gl_vendor_string, "X.Org R300 Project")
+            || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
+            || strstr(gl_vendor_string, "VMware, Inc.")
+            || strstr(gl_renderer, "Mesa")
+            || strstr(gl_renderer, "Gallium"))
+        return GL_VENDOR_MESA;
+
+    FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_WINE.\n", debugstr_a(gl_vendor_string));
+
+    return GL_VENDOR_WINE;
+}
+
+static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer)
+{
+    if (strstr(gl_vendor_string, "NVIDIA"))
+        return HW_VENDOR_NVIDIA;
+
+    if (strstr(gl_vendor_string, "ATI")
+            || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.")
+            || strstr(gl_vendor_string, "X.Org R300 Project")
+            || strstr(gl_vendor_string, "DRI R300 Project"))
+        return HW_VENDOR_ATI;
+
+    if (strstr(gl_vendor_string, "Intel(R)")
+            || strstr(gl_renderer, "Intel(R)")
+            || strstr(gl_vendor_string, "Intel Inc."))
+        return HW_VENDOR_INTEL;
+
+    if (strstr(gl_vendor_string, "Mesa")
+            || strstr(gl_vendor_string, "Tungsten Graphics, Inc")
+            || strstr(gl_vendor_string, "VMware, Inc."))
+        return HW_VENDOR_WINE;
+
+    FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning HW_VENDOR_NVIDIA.\n", debugstr_a(gl_vendor_string));
+
+    return HW_VENDOR_NVIDIA;
+}
+
+
+
+enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+            unsigned int *vidmem )
+{
+    /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more
+     * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx.
+     */
+    if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3])
+    {
+        /* Geforce 200 - highend */
+        if (strstr(gl_renderer, "GTX 280")
+                || strstr(gl_renderer, "GTX 285")
+                || strstr(gl_renderer, "GTX 295"))
+        {
+            *vidmem = 1024;
+            return CARD_NVIDIA_GEFORCE_GTX280;
+        }
+
+        /* Geforce 200 - midend high */
+        if (strstr(gl_renderer, "GTX 275"))
+        {
+            *vidmem = 896;
+            return CARD_NVIDIA_GEFORCE_GTX275;
+        }
+
+        /* Geforce 200 - midend */
+        if (strstr(gl_renderer, "GTX 260"))
+        {
+            *vidmem = 1024;
+            return CARD_NVIDIA_GEFORCE_GTX260;
+        }
+        /* Geforce 200 - midend */
+        if (strstr(gl_renderer, "GT 240"))
+        {
+           *vidmem = 512;
+           return CARD_NVIDIA_GEFORCE_GT240;
+        }
+
+        /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */
+        if (strstr(gl_renderer, "9800")
+                || strstr(gl_renderer, "GTS 150")
+                || strstr(gl_renderer, "GTS 250"))
+        {
+            *vidmem = 512;
+            return CARD_NVIDIA_GEFORCE_9800GT;
+        }
+
+        /* Geforce9 - midend */
+        if (strstr(gl_renderer, "9600"))
+        {
+            *vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */
+            return CARD_NVIDIA_GEFORCE_9600GT;
+        }
+
+        /* Geforce9 - midend low / Geforce 200 - low */
+        if (strstr(gl_renderer, "9500")
+                || strstr(gl_renderer, "GT 120")
+                || strstr(gl_renderer, "GT 130"))
+        {
+            *vidmem = 256; /* The 9500GT has 256-1024MB */
+            return CARD_NVIDIA_GEFORCE_9500GT;
+        }
+
+        /* Geforce9 - lowend */
+        if (strstr(gl_renderer, "9400"))
+        {
+            *vidmem = 256; /* The 9400GT has 256-1024MB */
+            return CARD_NVIDIA_GEFORCE_9400GT;
+        }
+
+        /* Geforce9 - lowend low */
+        if (strstr(gl_renderer, "9100")
+                || strstr(gl_renderer, "9200")
+                || strstr(gl_renderer, "9300")
+                || strstr(gl_renderer, "G 100"))
+        {
+            *vidmem = 256; /* The 9100-9300 cards have 256MB */
+            return CARD_NVIDIA_GEFORCE_9200;
+        }
+
+        /* Geforce8 - highend */
+        if (strstr(gl_renderer, "8800"))
+        {
+            *vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */
+            return CARD_NVIDIA_GEFORCE_8800GTS;
+        }
+
+        /* Geforce8 - midend mobile */
+        if (strstr(gl_renderer, "8600 M"))
+        {
+            *vidmem = 512;
+            return CARD_NVIDIA_GEFORCE_8600MGT;
+        }
+
+        /* Geforce8 - midend */
+        if (strstr(gl_renderer, "8600")
+                || strstr(gl_renderer, "8700"))
+        {
+            *vidmem = 256;
+            return CARD_NVIDIA_GEFORCE_8600GT;
+        }
+
+        /* Geforce8 - lowend */
+        if (strstr(gl_renderer, "8100")
+                || strstr(gl_renderer, "8200")
+                || strstr(gl_renderer, "8300")
+                || strstr(gl_renderer, "8400")
+                || strstr(gl_renderer, "8500"))
+        {
+            *vidmem = 128; /* 128-256MB for a 8300, 256-512MB for a 8400 */
+            return CARD_NVIDIA_GEFORCE_8300GS;
+        }
+
+        /* Geforce7 - highend */
+        if (strstr(gl_renderer, "7800")
+                || strstr(gl_renderer, "7900")
+                || strstr(gl_renderer, "7950")
+                || strstr(gl_renderer, "Quadro FX 4")
+                || strstr(gl_renderer, "Quadro FX 5"))
+        {
+            *vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */
+            return CARD_NVIDIA_GEFORCE_7800GT;
+        }
+
+        /* Geforce7 midend */
+        if (strstr(gl_renderer, "7600")
+                || strstr(gl_renderer, "7700"))
+        {
+            *vidmem = 256; /* The 7600 uses 256-512MB */
+            return CARD_NVIDIA_GEFORCE_7600;
+        }
+
+        /* Geforce7 lower medium */
+        if (strstr(gl_renderer, "7400"))
+        {
+            *vidmem = 256; /* The 7400 uses 256-512MB */
+            return CARD_NVIDIA_GEFORCE_7400;
+        }
+
+        /* Geforce7 lowend */
+        if (strstr(gl_renderer, "7300"))
+        {
+            *vidmem = 256; /* Mac Pros with this card have 256 MB */
+            return CARD_NVIDIA_GEFORCE_7300;
+        }
+
+        /* Geforce6 highend */
+        if (strstr(gl_renderer, "6800"))
+        {
+            *vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */
+            return CARD_NVIDIA_GEFORCE_6800;
+        }
+
+        /* Geforce6 - midend */
+        if (strstr(gl_renderer, "6600")
+                || strstr(gl_renderer, "6610")
+                || strstr(gl_renderer, "6700"))
+        {
+            *vidmem = 128; /* A 6600GT has 128-256MB */
+            return CARD_NVIDIA_GEFORCE_6600GT;
+        }
+
+        /* Geforce6/7 lowend */
+        *vidmem = 64; /* */
+        return CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */
+    }
+
+    if (WINE_D3D9_CAPABLE(gl_info))
+    {
+        /* GeforceFX - highend */
+        if (strstr(gl_renderer, "5800")
+                || strstr(gl_renderer, "5900")
+                || strstr(gl_renderer, "5950")
+                || strstr(gl_renderer, "Quadro FX"))
+        {
+            *vidmem = 256; /* 5800-5900 cards use 256MB */
+            return CARD_NVIDIA_GEFORCEFX_5800;
+        }
+
+        /* GeforceFX - midend */
+        if (strstr(gl_renderer, "5600")
+                || strstr(gl_renderer, "5650")
+                || strstr(gl_renderer, "5700")
+                || strstr(gl_renderer, "5750"))
+        {
+            *vidmem = 128; /* A 5600 uses 128-256MB */
+            return CARD_NVIDIA_GEFORCEFX_5600;
+        }
+
+        /* GeforceFX - lowend */
+        *vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */
+        return CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */
+    }
+
+    if (WINE_D3D8_CAPABLE(gl_info))
+    {
+        if (strstr(gl_renderer, "GeForce4 Ti") || strstr(gl_renderer, "Quadro4"))
+        {
+            *vidmem = 64; /* Geforce4 Ti cards have 64-128MB */
+            return CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */
+        }
+
+        *vidmem = 64; /* Geforce3 cards have 64-128MB */
+        return CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */
+    }
+
+    if (WINE_D3D7_CAPABLE(gl_info))
+    {
+        if (strstr(gl_renderer, "GeForce4 MX"))
+        {
+            /* Most Geforce4MX GPUs have at least 64MB of memory, some
+             * early models had 32MB but most have 64MB or even 128MB. */
+            *vidmem = 64;
+            return CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */
+        }
+
+        if (strstr(gl_renderer, "GeForce2 MX") || strstr(gl_renderer, "Quadro2 MXR"))
+        {
+            *vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */
+            return CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */
+        }
+
+        if (strstr(gl_renderer, "GeForce2") || strstr(gl_renderer, "Quadro2"))
+        {
+            *vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */
+            return CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */
+        }
+
+        /* Most Geforce1 cards have 32MB, there are also some rare 16
+         * and 64MB (Dell) models. */
+        *vidmem = 32;
+        return CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */
+    }
+
+    if (strstr(gl_renderer, "TNT2"))
+    {
+        *vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */
+        return CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */
+    }
+
+    *vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */
+    return CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */
+
+}
+
+enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+    unsigned int *vidmem )
+{
+    /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
+     *
+     * Beware: renderer string do not match exact card model,
+     * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
+    if (WINE_D3D9_CAPABLE(gl_info))
+    {
+        /* Radeon EG CYPRESS XT / PRO HD5800 - highend */
+        if (strstr(gl_renderer, "HD 5800")          /* Radeon EG CYPRESS HD58xx generic renderer string */
+                || strstr(gl_renderer, "HD 5850")   /* Radeon EG CYPRESS XT */
+                || strstr(gl_renderer, "HD 5870"))  /* Radeon EG CYPRESS PRO */
+        {
+            *vidmem = 1024; /* note: HD58xx cards use 1024MB  */
+            return CARD_ATI_RADEON_HD5800;
+        }
+
+        /* Radeon EG JUNIPER XT / LE HD5700 - midend */
+        if (strstr(gl_renderer, "HD 5700")          /* Radeon EG JUNIPER HD57xx generic renderer string */
+                || strstr(gl_renderer, "HD 5750")   /* Radeon EG JUNIPER LE */
+                || strstr(gl_renderer, "HD 5770"))  /* Radeon EG JUNIPER XT */
+        {
+            *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB  */
+            return CARD_ATI_RADEON_HD5700;
+        }
+
+        /* Radeon R7xx HD4800 - highend */
+        if (strstr(gl_renderer, "HD 4800")          /* Radeon RV7xx HD48xx generic renderer string */
+                || strstr(gl_renderer, "HD 4830")   /* Radeon RV770 */
+                || strstr(gl_renderer, "HD 4850")   /* Radeon RV770 */
+                || strstr(gl_renderer, "HD 4870")   /* Radeon RV770 */
+                || strstr(gl_renderer, "HD 4890"))  /* Radeon RV790 */
+        {
+            *vidmem = 512; /* note: HD4890 cards use 1024MB */
+            return CARD_ATI_RADEON_HD4800;
+        }
+
+        /* Radeon R740 HD4700 - midend */
+        if (strstr(gl_renderer, "HD 4700")          /* Radeon RV770 */
+                || strstr(gl_renderer, "HD 4770"))  /* Radeon RV740 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4700;
+        }
+
+        /* Radeon R730 HD4600 - midend */
+        if (strstr(gl_renderer, "HD 4600")          /* Radeon RV730 */
+                || strstr(gl_renderer, "HD 4650")   /* Radeon RV730 */
+                || strstr(gl_renderer, "HD 4670"))  /* Radeon RV730 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4600;
+        }
+
+        /* Radeon R710 HD4500/HD4350 - lowend */
+        if (strstr(gl_renderer, "HD 4350")          /* Radeon RV710 */
+                || strstr(gl_renderer, "HD 4550"))  /* Radeon RV710 */
+        {
+            *vidmem = 256;
+            return CARD_ATI_RADEON_HD4350;
+        }
+
+        /* Radeon R6xx HD2900/HD3800 - highend */
+        if (strstr(gl_renderer, "HD 2900")
+                || strstr(gl_renderer, "HD 3870")
+                || strstr(gl_renderer, "HD 3850"))
+        {
+            *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
+            return CARD_ATI_RADEON_HD2900;
+        }
+
+        /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
+        if (strstr(gl_renderer, "HD 2600")
+                || strstr(gl_renderer, "HD 3830")
+                || strstr(gl_renderer, "HD 3690")
+                || strstr(gl_renderer, "HD 3650"))
+        {
+            *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
+            return CARD_ATI_RADEON_HD2600;
+        }
+
+        /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+        if (strstr(gl_renderer, "HD 2300")
+                || strstr(gl_renderer, "HD 2400")
+                || strstr(gl_renderer, "HD 3470")
+                || strstr(gl_renderer, "HD 3450")
+                || strstr(gl_renderer, "HD 3430")
+                || strstr(gl_renderer, "HD 3400"))
+        {
+            *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
+            return CARD_ATI_RADEON_HD2300;
+        }
+
+        /* Radeon R6xx/R7xx integrated */
+        if (strstr(gl_renderer, "HD 3100")
+                || strstr(gl_renderer, "HD 3200")
+                || strstr(gl_renderer, "HD 3300"))
+        {
+            *vidmem = 128; /* 128MB */
+            return CARD_ATI_RADEON_HD3200;
+        }
+
+        /* Radeon R5xx */
+        if (strstr(gl_renderer, "X1600")
+                || strstr(gl_renderer, "X1650")
+                || strstr(gl_renderer, "X1800")
+                || strstr(gl_renderer, "X1900")
+                || strstr(gl_renderer, "X1950"))
+        {
+            *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
+            return CARD_ATI_RADEON_X1600;
+        }
+
+        /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
+        if (strstr(gl_renderer, "X700")
+                || strstr(gl_renderer, "X800")
+                || strstr(gl_renderer, "X850")
+                || strstr(gl_renderer, "X1300")
+                || strstr(gl_renderer, "X1400")
+                || strstr(gl_renderer, "X1450")
+                || strstr(gl_renderer, "X1550"))
+        {
+            *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
+            return CARD_ATI_RADEON_X700;
+        }
+
+        /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
+        if (strstr(gl_renderer, "Radeon Xpress"))
+        {
+            *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
+            return CARD_ATI_RADEON_XPRESS_200M;
+        }
+
+        /* Radeon R3xx */
+        *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
+        return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
+    }
+
+    if (WINE_D3D8_CAPABLE(gl_info))
+    {
+        *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
+        return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
+    }
+
+    if (WINE_D3D7_CAPABLE(gl_info))
+    {
+        *vidmem = 32; /* There are models with up to 64MB */
+        return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
+    }
+
+    *vidmem = 16; /* There are 16-32MB models */
+    return CARD_ATI_RAGE_128PRO;
+
+}
+
+enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+    unsigned int *vidmem )
+{
+    if (strstr(gl_renderer, "X3100"))
+    {
+        /* MacOS calls the card GMA X3100, Google findings also suggest the name GM965 */
+        *vidmem = 128;
+        return CARD_INTEL_X3100;
+    }
+
+    if (strstr(gl_renderer, "GMA 950") || strstr(gl_renderer, "945GM"))
+    {
+        /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */
+        *vidmem = 64;
+        return CARD_INTEL_I945GM;
+    }
+
+    if (strstr(gl_renderer, "915GM")) return CARD_INTEL_I915GM;
+    if (strstr(gl_renderer, "915G")) return CARD_INTEL_I915G;
+    if (strstr(gl_renderer, "865G")) return CARD_INTEL_I865G;
+    if (strstr(gl_renderer, "855G")) return CARD_INTEL_I855G;
+    if (strstr(gl_renderer, "830G")) return CARD_INTEL_I830G;
+    return CARD_INTEL_I915G;
+
+}
+
+enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+            unsigned int *vidmem )
+{
+    /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
+     *
+     * Beware: renderer string do not match exact card model,
+     * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
+    if (strstr(gl_renderer, "Gallium"))
+    {
+        /* Radeon R7xx HD4800 - highend */
+        if (strstr(gl_renderer, "R700")          /* Radeon R7xx HD48xx generic renderer string */
+                || strstr(gl_renderer, "RV770")  /* Radeon RV770 */
+                || strstr(gl_renderer, "RV790"))  /* Radeon RV790 */
+        {
+            *vidmem = 512; /* note: HD4890 cards use 1024MB */
+            return CARD_ATI_RADEON_HD4800;
+        }
+
+        /* Radeon R740 HD4700 - midend */
+        if (strstr(gl_renderer, "RV740"))          /* Radeon RV740 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4700;
+        }
+
+        /* Radeon R730 HD4600 - midend */
+        if (strstr(gl_renderer, "RV730"))        /* Radeon RV730 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4600;
+        }
+
+        /* Radeon R710 HD4500/HD4350 - lowend */
+        if (strstr(gl_renderer, "RV710"))          /* Radeon RV710 */
+        {
+            *vidmem = 256;
+            return CARD_ATI_RADEON_HD4350;
+        }
+
+        /* Radeon R6xx HD2900/HD3800 - highend */
+        if (strstr(gl_renderer, "R600")
+                || strstr(gl_renderer, "RV670")
+                || strstr(gl_renderer, "R680"))
+        {
+            *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
+            return CARD_ATI_RADEON_HD2900;
+        }
+
+        /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
+        if (strstr(gl_renderer, "RV630")
+                || strstr(gl_renderer, "RV635"))
+        {
+            *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
+            return CARD_ATI_RADEON_HD2600;
+        }
+
+        /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+        if (strstr(gl_renderer, "RV610")
+                || strstr(gl_renderer, "RV620"))
+        {
+            *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
+            return CARD_ATI_RADEON_HD2300;
+        }
+
+        /* Radeon R6xx/R7xx integrated */
+        if (strstr(gl_renderer, "RS780")
+                || strstr(gl_renderer, "RS880"))
+        {
+            *vidmem = 128; /* 128MB */
+            return CARD_ATI_RADEON_HD3200;
+        }
+
+        /* Radeon R5xx */
+        if (strstr(gl_renderer, "RV530")
+                || strstr(gl_renderer, "RV535")
+                || strstr(gl_renderer, "RV560")
+                || strstr(gl_renderer, "R520")
+                || strstr(gl_renderer, "RV570")
+                || strstr(gl_renderer, "R580"))
+        {
+            *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
+            return CARD_ATI_RADEON_X1600;
+        }
+
+        /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
+        if (strstr(gl_renderer, "R410")
+                || strstr(gl_renderer, "R420")
+                || strstr(gl_renderer, "R423")
+                || strstr(gl_renderer, "R430")
+                || strstr(gl_renderer, "R480")
+                || strstr(gl_renderer, "R481")
+                || strstr(gl_renderer, "RV410")
+                || strstr(gl_renderer, "RV515")
+                || strstr(gl_renderer, "RV516"))
+        {
+            *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
+            return CARD_ATI_RADEON_X700;
+        }
+
+        /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
+        if (strstr(gl_renderer, "RS400")
+                || strstr(gl_renderer, "RS480")
+                || strstr(gl_renderer, "RS482")
+                || strstr(gl_renderer, "RS485")
+                || strstr(gl_renderer, "RS600")
+                || strstr(gl_renderer, "RS690")
+                || strstr(gl_renderer, "RS740"))
+        {
+            *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
+            return CARD_ATI_RADEON_XPRESS_200M;
+        }
+
+        /* Radeon R3xx */
+        if (strstr(gl_renderer, "R300")
+                || strstr(gl_renderer, "RV350")
+                || strstr(gl_renderer, "RV351")
+                || strstr(gl_renderer, "RV360")
+                || strstr(gl_renderer, "RV370")
+                || strstr(gl_renderer, "R350")
+                || strstr(gl_renderer, "R360"))
+        {
+            *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
+            return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
+        }
+    }
+
+    if (WINE_D3D9_CAPABLE(gl_info))
     {
-        if (vendor == driver_version_table[i].vendor && device == driver_version_table[i].card)
+        /* Radeon R7xx HD4800 - highend */
+        if (strstr(gl_renderer, "(R700")          /* Radeon R7xx HD48xx generic renderer string */
+                || strstr(gl_renderer, "(RV770")  /* Radeon RV770 */
+                || strstr(gl_renderer, "(RV790"))  /* Radeon RV790 */
         {
-            TRACE_(d3d_caps)("Found card %04x:%04x in driver DB.\n", vendor, device);
+            *vidmem = 512; /* note: HD4890 cards use 1024MB */
+            return CARD_ATI_RADEON_HD4800;
+        }
 
-            driver_info->description = driver_version_table[i].description;
-            driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, driver_version_table[i].d3d_level);
-            driver_info->version_low = MAKEDWORD_VERSION(driver_version_table[i].lopart_hi,
-                    driver_version_table[i].lopart_lo);
-            break;
+        /* Radeon R740 HD4700 - midend */
+        if (strstr(gl_renderer, "(RV740"))          /* Radeon RV740 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4700;
         }
-    }
 
-    TRACE_(d3d_caps)("Reporting (fake) driver version 0x%08x-0x%08x.\n",
-            driver_info->version_high, driver_info->version_low);
-}
+        /* Radeon R730 HD4600 - midend */
+        if (strstr(gl_renderer, "(RV730"))        /* Radeon RV730 */
+        {
+            *vidmem = 512;
+            return CARD_ATI_RADEON_HD4600;
+        }
 
-/* Context activation is done by the caller. */
-static void fixup_extensions(struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
-{
-    unsigned int i;
+        /* Radeon R710 HD4500/HD4350 - lowend */
+        if (strstr(gl_renderer, "(RV710"))          /* Radeon RV710 */
+        {
+            *vidmem = 256;
+            return CARD_ATI_RADEON_HD4350;
+        }
 
-    for (i = 0; i < (sizeof(quirk_table) / sizeof(*quirk_table)); ++i)
-    {
-        if (!quirk_table[i].match(gl_info, gl_renderer, vendor, device)) continue;
-        TRACE_(d3d_caps)("Applying driver quirk \"%s\".\n", quirk_table[i].description);
-        quirk_table[i].apply(gl_info);
-    }
+        /* Radeon R6xx HD2900/HD3800 - highend */
+        if (strstr(gl_renderer, "(R600")
+                || strstr(gl_renderer, "(RV670")
+                || strstr(gl_renderer, "(R680"))
+        {
+            *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
+            return CARD_ATI_RADEON_HD2900;
+        }
 
-    /* Find out if PBOs work as they are supposed to. */
-    test_pbo_functionality(gl_info);
-}
+        /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
+        if (strstr(gl_renderer, "(RV630")
+                || strstr(gl_renderer, "(RV635"))
+        {
+            *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
+            return CARD_ATI_RADEON_HD2600;
+        }
 
-static DWORD wined3d_parse_gl_version(const char *gl_version)
-{
-    const char *ptr = gl_version;
-    int major, minor;
+        /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+        if (strstr(gl_renderer, "(RV610")
+                || strstr(gl_renderer, "(RV620"))
+        {
+            *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
+            return CARD_ATI_RADEON_HD2300;
+        }
 
-    major = atoi(ptr);
-    if (major <= 0) ERR_(d3d_caps)("Invalid opengl major version: %d.\n", major);
+        /* Radeon R6xx/R7xx integrated */
+        if (strstr(gl_renderer, "(RS780")
+                || strstr(gl_renderer, "(RS880"))
+        {
+            *vidmem = 128; /* 128MB */
+            return CARD_ATI_RADEON_HD3200;
+        }
+    }
 
-    while (isdigit(*ptr)) ++ptr;
-    if (*ptr++ != '.') ERR_(d3d_caps)("Invalid opengl version string: %s.\n", debugstr_a(gl_version));
+    if (WINE_D3D8_CAPABLE(gl_info))
+    {
+        *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
+        return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
+    }
 
-    minor = atoi(ptr);
+    if (WINE_D3D7_CAPABLE(gl_info))
+    {
+        *vidmem = 32; /* There are models with up to 64MB */
+        return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
+    }
 
-    TRACE_(d3d_caps)("Found OpenGL version: %d.%d.\n", major, minor);
+    *vidmem = 16; /* There are 16-32MB models */
+    return CARD_ATI_RAGE_128PRO;
 
-    return MAKEDWORD_VERSION(major, minor);
 }
 
-static enum wined3d_pci_vendor wined3d_guess_vendor(const char *gl_vendor, const char *gl_renderer)
+enum wined3d_pci_device (select_card_nvidia_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+    unsigned int *vidmem )
 {
-    if (strstr(gl_vendor, "NVIDIA"))
-        return VENDOR_NVIDIA;
+    FIXME_(d3d_caps)("Card selection not handled for Mesa Nouveau driver\n");
+    if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
+    if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
+    if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
+    if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT;
+    return CARD_NVIDIA_RIVA_128;
+}
 
-    if (strstr(gl_vendor, "ATI"))
-        return VENDOR_ATI;
+enum wined3d_pci_device (select_card_intel_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+    unsigned int *vidmem )
+{
+    FIXME_(d3d_caps)("Card selection not handled for Mesa Intel driver\n");
+    return CARD_INTEL_I915G;
+}
 
-    if (strstr(gl_vendor, "Intel(R)")
-            || strstr(gl_renderer, "Intel(R)")
-            || strstr(gl_vendor, "Intel Inc."))
-        return VENDOR_INTEL;
 
-    if (strstr(gl_vendor, "Mesa")
-            || strstr(gl_vendor, "DRI R300 Project")
-            || strstr(gl_vendor, "Tungsten Graphics, Inc")
-            || strstr(gl_vendor, "VMware, Inc."))
-        return VENDOR_MESA;
+struct vendor_card_selection
+{
+    enum wined3d_gl_vendor gl_vendor;
+    enum wined3d_pci_vendor card_vendor;
+    const char *description;        /* Description of the card selector i.e. Apple OS/X Intel */
+    enum wined3d_pci_device (*select_card)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+            unsigned int *vidmem );
+};
 
-    FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning VENDOR_WINE.\n", debugstr_a(gl_vendor));
+static const struct vendor_card_selection vendor_card_select_table[] =
+{
+    {GL_VENDOR_NVIDIA, HW_VENDOR_NVIDIA,  "Nvidia binary driver",     select_card_nvidia_binary},
+    {GL_VENDOR_APPLE,  HW_VENDOR_NVIDIA,  "Apple OSX NVidia binary driver",   select_card_nvidia_binary},
+    {GL_VENDOR_APPLE,  HW_VENDOR_ATI,     "Apple OSX AMD/ATI binary driver",  select_card_ati_binary},
+    {GL_VENDOR_APPLE,  HW_VENDOR_INTEL,   "Apple OSX Intel binary driver",    select_card_intel_binary},
+    {GL_VENDOR_ATI,    HW_VENDOR_ATI,     "AMD/ATI binary driver",    select_card_ati_binary},
+    {GL_VENDOR_MESA,   HW_VENDOR_ATI,     "Mesa AMD/ATI driver",      select_card_ati_mesa},
+    {GL_VENDOR_MESA,   HW_VENDOR_NVIDIA,  "Mesa Nouveau driver",      select_card_nvidia_mesa},
+    {GL_VENDOR_MESA,   HW_VENDOR_INTEL,   "Mesa Intel driver",        select_card_intel_mesa}
+};
 
-    return VENDOR_WINE;
-}
 
 static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
-        enum wined3d_pci_vendor *vendor, unsigned int *vidmem)
+        enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor, unsigned int *vidmem)
 {
-    /* Below is a list of Nvidia and ATI GPUs. Both vendors have dozens of
+    /* Above is a list of Nvidia and ATI GPUs. Both vendors have dozens of
      * different GPUs with roughly the same features. In most cases GPUs from a
      * certain family differ in clockspeeds, the amount of video memory and the
      * number of shader pipelines.
@@ -1192,451 +1915,84 @@ static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *
      * memory behind our backs if really needed. Note that the amount of video
      * memory can be overruled using a registry setting. */
 
-    switch (*vendor)
-    {
-        case VENDOR_NVIDIA:
-            /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more
-             * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx.
-             */
-            if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3])
-            {
-                /* Geforce 200 - highend */
-                if (strstr(gl_renderer, "GTX 280")
-                        || strstr(gl_renderer, "GTX 285")
-                        || strstr(gl_renderer, "GTX 295"))
-                {
-                    *vidmem = 1024;
-                    return CARD_NVIDIA_GEFORCE_GTX280;
-                }
-
-                /* Geforce 200 - midend high */
-                if (strstr(gl_renderer, "GTX 275"))
-                {
-                    *vidmem = 896;
-                    return CARD_NVIDIA_GEFORCE_GTX275;
-                }
-
-                /* Geforce 200 - midend */
-                if (strstr(gl_renderer, "GTX 260"))
-                {
-                    *vidmem = 1024;
-                    return CARD_NVIDIA_GEFORCE_GTX260;
-                }
-                /* Geforce 200 - midend */
-                if (strstr(gl_renderer, "GT 240"))
-                {
-                   *vidmem = 512;
-                   return CARD_NVIDIA_GEFORCE_GT240;
-                }
-
-                /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */
-                if (strstr(gl_renderer, "9800")
-                        || strstr(gl_renderer, "GTS 150")
-                        || strstr(gl_renderer, "GTS 250"))
-                {
-                    *vidmem = 512;
-                    return CARD_NVIDIA_GEFORCE_9800GT;
-                }
-
-                /* Geforce9 - midend */
-                if (strstr(gl_renderer, "9600"))
-                {
-                    *vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */
-                    return CARD_NVIDIA_GEFORCE_9600GT;
-                }
-
-                /* Geforce9 - midend low / Geforce 200 - low */
-                if (strstr(gl_renderer, "9500")
-                        || strstr(gl_renderer, "GT 120")
-                        || strstr(gl_renderer, "GT 130"))
-                {
-                    *vidmem = 256; /* The 9500GT has 256-1024MB */
-                    return CARD_NVIDIA_GEFORCE_9500GT;
-                }
-
-                /* Geforce9 - lowend */
-                if (strstr(gl_renderer, "9400"))
-                {
-                    *vidmem = 256; /* The 9400GT has 256-1024MB */
-                    return CARD_NVIDIA_GEFORCE_9400GT;
-                }
-
-                /* Geforce9 - lowend low */
-                if (strstr(gl_renderer, "9100")
-                        || strstr(gl_renderer, "9200")
-                        || strstr(gl_renderer, "9300")
-                        || strstr(gl_renderer, "G 100"))
-                {
-                    *vidmem = 256; /* The 9100-9300 cards have 256MB */
-                    return CARD_NVIDIA_GEFORCE_9200;
-                }
-
-                /* Geforce8 - highend */
-                if (strstr(gl_renderer, "8800"))
-                {
-                    *vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */
-                    return CARD_NVIDIA_GEFORCE_8800GTS;
-                }
-
-                /* Geforce8 - midend mobile */
-                if (strstr(gl_renderer, "8600 M"))
-                {
-                    *vidmem = 512;
-                    return CARD_NVIDIA_GEFORCE_8600MGT;
-                }
-
-                /* Geforce8 - midend */
-                if (strstr(gl_renderer, "8600")
-                        || strstr(gl_renderer, "8700"))
-                {
-                    *vidmem = 256;
-                    return CARD_NVIDIA_GEFORCE_8600GT;
-                }
-
-                /* Geforce8 - lowend */
-                if (strstr(gl_renderer, "8100")
-                        || strstr(gl_renderer, "8200")
-                        || strstr(gl_renderer, "8300")
-                        || strstr(gl_renderer, "8400")
-                        || strstr(gl_renderer, "8500"))
-                {
-                    *vidmem = 128; /* 128-256MB for a 8300, 256-512MB for a 8400 */
-                    return CARD_NVIDIA_GEFORCE_8300GS;
-                }
-
-                /* Geforce7 - highend */
-                if (strstr(gl_renderer, "7800")
-                        || strstr(gl_renderer, "7900")
-                        || strstr(gl_renderer, "7950")
-                        || strstr(gl_renderer, "Quadro FX 4")
-                        || strstr(gl_renderer, "Quadro FX 5"))
-                {
-                    *vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */
-                    return CARD_NVIDIA_GEFORCE_7800GT;
-                }
-
-                /* Geforce7 midend */
-                if (strstr(gl_renderer, "7600")
-                        || strstr(gl_renderer, "7700"))
-                {
-                    *vidmem = 256; /* The 7600 uses 256-512MB */
-                    return CARD_NVIDIA_GEFORCE_7600;
-                }
-
-                /* Geforce7 lower medium */
-                if (strstr(gl_renderer, "7400"))
-                {
-                    *vidmem = 256; /* The 7400 uses 256-512MB */
-                    return CARD_NVIDIA_GEFORCE_7400;
-                }
-
-                /* Geforce7 lowend */
-                if (strstr(gl_renderer, "7300"))
-                {
-                    *vidmem = 256; /* Mac Pros with this card have 256 MB */
-                    return CARD_NVIDIA_GEFORCE_7300;
-                }
-
-                /* Geforce6 highend */
-                if (strstr(gl_renderer, "6800"))
-                {
-                    *vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */
-                    return CARD_NVIDIA_GEFORCE_6800;
-                }
-
-                /* Geforce6 - midend */
-                if (strstr(gl_renderer, "6600")
-                        || strstr(gl_renderer, "6610")
-                        || strstr(gl_renderer, "6700"))
-                {
-                    *vidmem = 128; /* A 6600GT has 128-256MB */
-                    return CARD_NVIDIA_GEFORCE_6600GT;
-                }
-
-                /* Geforce6/7 lowend */
-                *vidmem = 64; /* */
-                return CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */
-            }
-
-            if (WINE_D3D9_CAPABLE(gl_info))
-            {
-                /* GeforceFX - highend */
-                if (strstr(gl_renderer, "5800")
-                        || strstr(gl_renderer, "5900")
-                        || strstr(gl_renderer, "5950")
-                        || strstr(gl_renderer, "Quadro FX"))
-                {
-                    *vidmem = 256; /* 5800-5900 cards use 256MB */
-                    return CARD_NVIDIA_GEFORCEFX_5800;
-                }
-
-                /* GeforceFX - midend */
-                if (strstr(gl_renderer, "5600")
-                        || strstr(gl_renderer, "5650")
-                        || strstr(gl_renderer, "5700")
-                        || strstr(gl_renderer, "5750"))
-                {
-                    *vidmem = 128; /* A 5600 uses 128-256MB */
-                    return CARD_NVIDIA_GEFORCEFX_5600;
-                }
-
-                /* GeforceFX - lowend */
-                *vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */
-                return CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */
-            }
-
-            if (WINE_D3D8_CAPABLE(gl_info))
-            {
-                if (strstr(gl_renderer, "GeForce4 Ti") || strstr(gl_renderer, "Quadro4"))
-                {
-                    *vidmem = 64; /* Geforce4 Ti cards have 64-128MB */
-                    return CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */
-                }
-
-                *vidmem = 64; /* Geforce3 cards have 64-128MB */
-                return CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */
-            }
-
-            if (WINE_D3D7_CAPABLE(gl_info))
-            {
-                if (strstr(gl_renderer, "GeForce4 MX"))
-                {
-                    /* Most Geforce4MX GPUs have at least 64MB of memory, some
-                     * early models had 32MB but most have 64MB or even 128MB. */
-                    *vidmem = 64;
-                    return CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */
-                }
-
-                if (strstr(gl_renderer, "GeForce2 MX") || strstr(gl_renderer, "Quadro2 MXR"))
-                {
-                    *vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */
-                    return CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */
-                }
-
-                if (strstr(gl_renderer, "GeForce2") || strstr(gl_renderer, "Quadro2"))
-                {
-                    *vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */
-                    return CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */
-                }
-
-                /* Most Geforce1 cards have 32MB, there are also some rare 16
-                 * and 64MB (Dell) models. */
-                *vidmem = 32;
-                return CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */
-            }
-
-            if (strstr(gl_renderer, "TNT2"))
-            {
-                *vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */
-                return CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */
-            }
-
-            *vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */
-            return CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */
-
-        case VENDOR_ATI:
-            /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
-             *
-             * Beware: renderer string do not match exact card model,
-             * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
-            if (WINE_D3D9_CAPABLE(gl_info))
-            {
-                /* Radeon EG CYPRESS XT / PRO HD5800 - highend */
-                if (strstr(gl_renderer, "HD 5800")          /* Radeon EG CYPRESS HD58xx generic renderer string */
-                        || strstr(gl_renderer, "HD 5850")   /* Radeon EG CYPRESS XT */
-                        || strstr(gl_renderer, "HD 5870"))  /* Radeon EG CYPRESS PRO */
-                {
-                    *vidmem = 1024; /* note: HD58xx cards use 1024MB  */
-                    return CARD_ATI_RADEON_HD5800;
-                }
-
-                /* Radeon EG JUNIPER XT / LE HD5700 - midend */
-                if (strstr(gl_renderer, "HD 5700")          /* Radeon EG JUNIPER HD57xx generic renderer string */
-                        || strstr(gl_renderer, "HD 5750")   /* Radeon EG JUNIPER LE */
-                        || strstr(gl_renderer, "HD 5770"))  /* Radeon EG JUNIPER XT */
-                {
-                    *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB  */
-                    return CARD_ATI_RADEON_HD5700;
-                }
-
-                /* Radeon R7xx HD4800 - highend */
-                if (strstr(gl_renderer, "HD 4800")          /* Radeon RV7xx HD48xx generic renderer string */
-                        || strstr(gl_renderer, "HD 4830")   /* Radeon RV770 */
-                        || strstr(gl_renderer, "HD 4850")   /* Radeon RV770 */
-                        || strstr(gl_renderer, "HD 4870")   /* Radeon RV770 */
-                        || strstr(gl_renderer, "HD 4890"))  /* Radeon RV790 */
-                {
-                    *vidmem = 512; /* note: HD4890 cards use 1024MB */
-                    return CARD_ATI_RADEON_HD4800;
-                }
-
-                /* Radeon R740 HD4700 - midend */
-                if (strstr(gl_renderer, "HD 4700")          /* Radeon RV770 */
-                        || strstr(gl_renderer, "HD 4770"))  /* Radeon RV740 */
-                {
-                    *vidmem = 512;
-                    return CARD_ATI_RADEON_HD4700;
-                }
-
-                /* Radeon R730 HD4600 - midend */
-                if (strstr(gl_renderer, "HD 4600")          /* Radeon RV730 */
-                        || strstr(gl_renderer, "HD 4650")   /* Radeon RV730 */
-                        || strstr(gl_renderer, "HD 4670"))  /* Radeon RV730 */
-                {
-                    *vidmem = 512;
-                    return CARD_ATI_RADEON_HD4600;
-                }
-
-                /* Radeon R710 HD4500/HD4350 - lowend */
-                if (strstr(gl_renderer, "HD 4350")          /* Radeon RV710 */
-                        || strstr(gl_renderer, "HD 4550"))  /* Radeon RV710 */
-                {
-                    *vidmem = 256;
-                    return CARD_ATI_RADEON_HD4350;
-                }
-
-                /* Radeon R6xx HD2900/HD3800 - highend */
-                if (strstr(gl_renderer, "HD 2900")
-                        || strstr(gl_renderer, "HD 3870")
-                        || strstr(gl_renderer, "HD 3850"))
-                {
-                    *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */
-                    return CARD_ATI_RADEON_HD2900;
-                }
-
-                /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
-                if (strstr(gl_renderer, "HD 2600")
-                        || strstr(gl_renderer, "HD 3830")
-                        || strstr(gl_renderer, "HD 3690")
-                        || strstr(gl_renderer, "HD 3650"))
-                {
-                    *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */
-                    return CARD_ATI_RADEON_HD2600;
-                }
-
-                /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
-                if (strstr(gl_renderer, "HD 2300")
-                        || strstr(gl_renderer, "HD 2400")
-                        || strstr(gl_renderer, "HD 3470")
-                        || strstr(gl_renderer, "HD 3450")
-                        || strstr(gl_renderer, "HD 3430")
-                        || strstr(gl_renderer, "HD 3400"))
-                {
-                    *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
-                    return CARD_ATI_RADEON_HD2300;
-                }
-
-                /* Radeon R6xx/R7xx integrated */
-                if (strstr(gl_renderer, "HD 3100")
-                        || strstr(gl_renderer, "HD 3200")
-                        || strstr(gl_renderer, "HD 3300"))
-                {
-                    *vidmem = 128; /* 128MB */
-                    return CARD_ATI_RADEON_HD3200;
-                }
-
-                /* Radeon R5xx */
-                if (strstr(gl_renderer, "X1600")
-                        || strstr(gl_renderer, "X1650")
-                        || strstr(gl_renderer, "X1800")
-                        || strstr(gl_renderer, "X1900")
-                        || strstr(gl_renderer, "X1950"))
-                {
-                    *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */
-                    return CARD_ATI_RADEON_X1600;
-                }
-
-                /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
-                if (strstr(gl_renderer, "X700")
-                        || strstr(gl_renderer, "X800")
-                        || strstr(gl_renderer, "X850")
-                        || strstr(gl_renderer, "X1300")
-                        || strstr(gl_renderer, "X1400")
-                        || strstr(gl_renderer, "X1450")
-                        || strstr(gl_renderer, "X1550"))
-                {
-                    *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
-                    return CARD_ATI_RADEON_X700;
-                }
-
-                /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
-                if (strstr(gl_renderer, "Radeon Xpress"))
-                {
-                    *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */
-                    return CARD_ATI_RADEON_XPRESS_200M;
-                }
-
-                /* Radeon R3xx */
-                *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */
-                return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
-            }
+    int i;
 
-            if (WINE_D3D8_CAPABLE(gl_info))
-            {
-                *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */
-                return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */
-            }
-
-            if (WINE_D3D7_CAPABLE(gl_info))
-            {
-                *vidmem = 32; /* There are models with up to 64MB */
-                return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */
-            }
+    for (i = 0; i < (sizeof(vendor_card_select_table) / sizeof(*vendor_card_select_table)); ++i)
+    {
+        if ((vendor_card_select_table[i].gl_vendor != *gl_vendor)
+            || (vendor_card_select_table[i].card_vendor != *card_vendor))
+                continue;
+        TRACE_(d3d_caps)("Applying card_selector \"%s\".\n", vendor_card_select_table[i].description);
+        return vendor_card_select_table[i].select_card(gl_info, gl_renderer, vidmem);
+    }
+
+    FIXME_(d3d_caps)("No card selector available for GL vendor %d and card vendor %04x.\n",
+                     *gl_vendor, *card_vendor);
+
+    /* Default to generic Nvidia hardware based on the supported OpenGL extensions. The choice
+     * for Nvidia was because the hardware and drivers they make are of good quality. This makes
+     * them a good generic choice. */
+    *card_vendor = HW_VENDOR_NVIDIA;
+    if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
+    if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
+    if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
+    if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT;
+    return CARD_NVIDIA_RIVA_128;
+}
 
-            *vidmem = 16; /* There are 16-32MB models */
-            return CARD_ATI_RAGE_128PRO;
+static const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter)
+{
+    const struct wined3d_gl_info *gl_info = &adapter->gl_info;
+    int vs_selected_mode, ps_selected_mode;
+
+    select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
+    if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
+            && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_fragment_pipeline;
+    else if (ps_selected_mode == SHADER_ATI) return &atifs_fragment_pipeline;
+    else if (gl_info->supported[NV_REGISTER_COMBINERS]
+            && gl_info->supported[NV_TEXTURE_SHADER2]) return &nvts_fragment_pipeline;
+    else if (gl_info->supported[NV_REGISTER_COMBINERS]) return &nvrc_fragment_pipeline;
+    else return &ffp_fragment_pipeline;
+}
 
-        case VENDOR_INTEL:
-            if (strstr(gl_renderer, "X3100"))
-            {
-                /* MacOS calls the card GMA X3100, Google findings also suggest the name GM965 */
-                *vidmem = 128;
-                return CARD_INTEL_X3100;
-            }
+static const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter)
+{
+    int vs_selected_mode, ps_selected_mode;
 
-            if (strstr(gl_renderer, "GMA 950") || strstr(gl_renderer, "945GM"))
-            {
-                /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */
-                *vidmem = 64;
-                return CARD_INTEL_I945GM;
-            }
+    select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
+    if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend;
+    if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend;
+    return &none_shader_backend;
+}
 
-            if (strstr(gl_renderer, "915GM")) return CARD_INTEL_I915GM;
-            if (strstr(gl_renderer, "915G")) return CARD_INTEL_I915G;
-            if (strstr(gl_renderer, "865G")) return CARD_INTEL_I865G;
-            if (strstr(gl_renderer, "855G")) return CARD_INTEL_I855G;
-            if (strstr(gl_renderer, "830G")) return CARD_INTEL_I830G;
-            return CARD_INTEL_I915G;
+static const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter)
+{
+    const struct wined3d_gl_info *gl_info = &adapter->gl_info;
+    int vs_selected_mode, ps_selected_mode;
 
-        case VENDOR_MESA:
-        case VENDOR_WINE:
-        default:
-            /* Default to generic Nvidia hardware based on the supported OpenGL extensions. The choice
-             * for Nvidia was because the hardware and drivers they make are of good quality. This makes
-             * them a good generic choice. */
-            *vendor = VENDOR_NVIDIA;
-            if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
-            if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
-            if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
-            if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT;
-            return CARD_NVIDIA_RIVA_128;
-    }
+    select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
+    if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
+            && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_blit;
+    else return &ffp_blit;
 }
 
 /* Context activation is done by the caller. */
-static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, struct wined3d_gl_info *gl_info)
+static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
 {
+    struct wined3d_driver_info *driver_info = &adapter->driver_info;
+    struct wined3d_gl_info *gl_info = &adapter->gl_info;
     const char *GL_Extensions    = NULL;
     const char *WGL_Extensions   = NULL;
-    const char *gl_string        = NULL;
-    enum wined3d_pci_vendor vendor;
+    const char *gl_vendor_str, *gl_renderer_str, *gl_version_str;
+    struct fragment_caps fragment_caps;
+    enum wined3d_gl_vendor gl_vendor;
+    enum wined3d_pci_vendor card_vendor;
     enum wined3d_pci_device device;
     GLint       gl_max;
     GLfloat     gl_floatv[2];
     unsigned    i;
     HDC         hdc;
     unsigned int vidmem=0;
-    char *gl_renderer;
     DWORD gl_version;
     size_t len;
 
@@ -1644,48 +2000,34 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
 
     ENTER_GL();
 
-    gl_string = (const char *)glGetString(GL_RENDERER);
-    TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_string));
-    if (!gl_string)
+    gl_renderer_str = (const char *)glGetString(GL_RENDERER);
+    TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_renderer_str));
+    if (!gl_renderer_str)
     {
         LEAVE_GL();
         ERR_(d3d_caps)("Received a NULL GL_RENDERER.\n");
         return FALSE;
     }
 
-    len = strlen(gl_string) + 1;
-    gl_renderer = HeapAlloc(GetProcessHeap(), 0, len);
-    if (!gl_renderer)
-    {
-        LEAVE_GL();
-        ERR_(d3d_caps)("Failed to allocate gl_renderer memory.\n");
-        return FALSE;
-    }
-    memcpy(gl_renderer, gl_string, len);
-
-    gl_string = (const char *)glGetString(GL_VENDOR);
-    TRACE_(d3d_caps)("GL_VENDOR: %s.\n", debugstr_a(gl_string));
-    if (!gl_string)
+    gl_vendor_str = (const char *)glGetString(GL_VENDOR);
+    TRACE_(d3d_caps)("GL_VENDOR: %s.\n", debugstr_a(gl_vendor_str));
+    if (!gl_vendor_str)
     {
         LEAVE_GL();
         ERR_(d3d_caps)("Received a NULL GL_VENDOR.\n");
-        HeapFree(GetProcessHeap(), 0, gl_renderer);
         return FALSE;
     }
-    vendor = wined3d_guess_vendor(gl_string, gl_renderer);
-    TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x)\n", debugstr_a(gl_string), vendor);
 
     /* Parse the GL_VERSION field into major and minor information */
-    gl_string = (const char *)glGetString(GL_VERSION);
-    TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_string));
-    if (!gl_string)
+    gl_version_str = (const char *)glGetString(GL_VERSION);
+    TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_version_str));
+    if (!gl_version_str)
     {
         LEAVE_GL();
         ERR_(d3d_caps)("Received a NULL GL_VERSION.\n");
-        HeapFree(GetProcessHeap(), 0, gl_renderer);
         return FALSE;
     }
-    gl_version = wined3d_parse_gl_version(gl_string);
+    gl_version = wined3d_parse_gl_version(gl_version_str);
 
     /*
      * Initialize openGL extension related variables
@@ -1694,7 +2036,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
     memset(gl_info->supported, 0, sizeof(gl_info->supported));
     gl_info->limits.buffers = 1;
     gl_info->limits.textures = 1;
-    gl_info->limits.texture_stages = 1;
     gl_info->limits.fragment_samplers = 1;
     gl_info->limits.vertex_samplers = 0;
     gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers + gl_info->limits.vertex_samplers;
@@ -1734,7 +2075,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
     {
         LEAVE_GL();
         ERR_(d3d_caps)("Received a NULL GL_EXTENSIONS.\n");
-        HeapFree(GetProcessHeap(), 0, gl_renderer);
         return FALSE;
     }
 
@@ -1831,6 +2171,12 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
             gl_info->supported[ARB_HALF_FLOAT_PIXEL] = TRUE;
         }
     }
+    if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+    {
+        /* GL_ARB_map_buffer_range and GL_APPLE_flush_buffer_range provide the same
+         * functionality. Prefer the ARB extension */
+        gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] = FALSE;
+    }
     if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
     {
         TRACE_(d3d_caps)(" IMPLIED: NVIDIA (NV) Texture Gen Reflection support.\n");
@@ -1841,6 +2187,11 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         TRACE_(d3d_caps)(" IMPLIED: ARB_depth_clamp support (by NV_depth_clamp).\n");
         gl_info->supported[ARB_DEPTH_CLAMP] = TRUE;
     }
+    if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] && gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+    {
+        TRACE_(d3d_caps)(" IMPLIED: ARB_vertex_array_bgra support (by EXT_vertex_array_bgra).\n");
+        gl_info->supported[ARB_VERTEX_ARRAY_BGRA] = TRUE;
+    }
     if (gl_info->supported[NV_TEXTURE_SHADER2])
     {
         if (gl_info->supported[NV_REGISTER_COMBINERS])
@@ -1851,6 +2202,13 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
             gl_info->supported[ATI_FRAGMENT_SHADER] = FALSE;
         }
     }
+
+    if (gl_info->supported[NV_REGISTER_COMBINERS])
+    {
+        glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &gl_max);
+        gl_info->limits.general_combiners = gl_max;
+        TRACE_(d3d_caps)("Max general combiners: %d.\n", gl_max);
+    }
     if (gl_info->supported[ARB_DRAW_BUFFERS])
     {
         glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max);
@@ -1863,18 +2221,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         gl_info->limits.textures = min(MAX_TEXTURES, gl_max);
         TRACE_(d3d_caps)("Max textures: %d.\n", gl_info->limits.textures);
 
-        if (gl_info->supported[NV_REGISTER_COMBINERS])
-        {
-            GLint tmp;
-            glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &tmp);
-            gl_info->limits.texture_stages = min(MAX_TEXTURES, tmp);
-        }
-        else
-        {
-            gl_info->limits.texture_stages = min(MAX_TEXTURES, gl_max);
-        }
-        TRACE_(d3d_caps)("Max texture stages: %d.\n", gl_info->limits.texture_stages);
-
         if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
         {
             GLint tmp;
@@ -1998,6 +2344,11 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         gl_info->limits.glsl_varyings = gl_max;
         TRACE_(d3d_caps)("Max GLSL varyings: %u (%u 4 component varyings).\n", gl_max, gl_max / 4);
     }
+    if (gl_info->supported[ARB_SHADING_LANGUAGE_100])
+    {
+        const char *str = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION_ARB);
+        TRACE_(d3d_caps)("GLSL version string: %s.\n", debugstr_a(str));
+    }
     if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
     {
         glGetFloatv(GL_MAX_SHININESS_NV, &gl_info->limits.shininess);
@@ -2024,7 +2375,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         gl_info->supported[NV_REGISTER_COMBINERS2] = FALSE;
         gl_info->supported[NV_TEXTURE_SHADER] = FALSE;
         gl_info->supported[NV_TEXTURE_SHADER2] = FALSE;
-        gl_info->supported[NV_TEXTURE_SHADER3] = FALSE;
     }
     if (gl_info->supported[NV_HALF_FLOAT])
     {
@@ -2043,6 +2393,14 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
 
     LEAVE_GL();
 
+    adapter->fragment_pipe = select_fragment_implementation(adapter);
+    adapter->shader_backend = select_shader_backend(adapter);
+    adapter->blitter = select_blit_implementation(adapter);
+
+    adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
+    gl_info->limits.texture_stages = fragment_caps.MaxTextureBlendStages;
+    TRACE_(d3d_caps)("Max texture stages: %u.\n", gl_info->limits.texture_stages);
+
     /* In some cases the number of texture stages can be larger than the number
      * of samplers. The GF4 for example can use only 2 samplers (no fragment
      * shaders), but 8 texture stages (register combiners). */
@@ -2113,8 +2471,12 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         gl_info->limits.buffers = 1;
     }
 
-    device = wined3d_guess_card(gl_info, gl_renderer, &vendor, &vidmem);
-    TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", vendor, device);
+    gl_vendor = wined3d_guess_gl_vendor(gl_info, gl_vendor_str, gl_renderer_str);
+    card_vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str);
+    TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x/0x%04x)\n", debugstr_a(gl_vendor_str), gl_vendor, card_vendor);
+
+    device = wined3d_guess_card(gl_info, gl_renderer_str, &gl_vendor, &card_vendor, &vidmem);
+    TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", card_vendor, device);
 
     /* If we have an estimate use it, else default to 64MB;  */
     if(vidmem)
@@ -2176,11 +2538,10 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str
         }
     }
 
-    fixup_extensions(gl_info, gl_renderervendor, device);
-    init_driver_info(driver_info, vendor, device);
+    fixup_extensions(gl_info, gl_renderer_str, gl_vendor, card_vendor, device);
+    init_driver_info(driver_info, card_vendor, device);
     add_gl_compat_wrappers(gl_info);
 
-    HeapFree(GetProcessHeap(), 0, gl_renderer);
     return TRUE;
 }
 
@@ -2644,7 +3005,10 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U
                 continue;
             if(cfgs[i].blueSize != blueSize)
                 continue;
-            if(cfgs[i].alphaSize != alphaSize)
+            /* Not all drivers report alpha-less formats since they use 32-bit anyway, so accept alpha even if we didn't ask for it. */
+            if(alphaSize && cfgs[i].alphaSize != alphaSize)
+                continue;
+            if(cfgs[i].colorSize != (glDesc->byte_count << 3))
                 continue;
 
             TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat));
@@ -2748,8 +3112,6 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter
 static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter,
         WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
 {
-    const struct fragment_pipeline *fp;
-
     switch(format_desc->format)
     {
         case WINED3DFMT_R8G8_SNORM:
@@ -2760,8 +3122,7 @@ static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter,
             /* Ask the fixed function pipeline implementation if it can deal
              * with the conversion. If we've got a GL extension giving native
              * support this will be an identity conversion. */
-            fp = select_fragment_implementation(adapter, DeviceType);
-            if (fp->color_fixup_supported(format_desc->color_fixup))
+            if (adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
             {
                 TRACE_(d3d_caps)("[OK]\n");
                 return TRUE;
@@ -2951,8 +3312,6 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
         WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
 {
     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-    const shader_backend_t *shader_backend;
-    const struct fragment_pipeline *fp;
 
     switch (format_desc->format)
     {
@@ -3030,8 +3389,7 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
             /* Ask the shader backend if it can deal with the conversion. If
              * we've got a GL extension giving native support this will be an
              * identity conversion. */
-            shader_backend = select_shader_backend(adapter, DeviceType);
-            if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup))
+            if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup))
             {
                 TRACE_(d3d_caps)("[OK]\n");
                 return TRUE;
@@ -3147,10 +3505,8 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
             if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC]
                     || gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC])
             {
-                shader_backend = select_shader_backend(adapter, DeviceType);
-                fp = select_fragment_implementation(adapter, DeviceType);
-                if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup)
-                        && fp->color_fixup_supported(format_desc->color_fixup))
+                if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup)
+                        && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
                 {
                     TRACE_(d3d_caps)("[OK]\n");
                     return TRUE;
@@ -3186,8 +3542,6 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
 static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *adapter_format_desc,
         WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *check_format_desc, WINED3DSURFTYPE SurfaceType)
 {
-    const struct blit_shader *blitter;
-
     if(SurfaceType == SURFACE_GDI) {
         switch(check_format_desc->format)
         {
@@ -3223,8 +3577,7 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct
     if (CheckDepthStencilCapability(adapter, adapter_format_desc, check_format_desc)) return TRUE;
 
     /* If opengl can't process the format natively, the blitter may be able to convert it */
-    blitter = select_blit_implementation(adapter, DeviceType);
-    if (blitter->color_fixup_supported(check_format_desc->color_fixup))
+    if (adapter->blitter->color_fixup_supported(check_format_desc->color_fixup))
     {
         TRACE_(d3d_caps)("[OK]\n");
         return TRUE;
@@ -3789,8 +4142,6 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
     int ps_selected_mode;
     struct shader_caps shader_caps;
     struct fragment_caps fragment_caps;
-    const shader_backend_t *shader_backend;
-    const struct fragment_pipeline *frag_pipeline = NULL;
     DWORD ckey_caps, blit_caps, fx_caps;
 
     TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps);
@@ -4167,12 +4518,10 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
     pCaps->VertexTextureFilterCaps           = 0;
 
     memset(&shader_caps, 0, sizeof(shader_caps));
-    shader_backend = select_shader_backend(adapter, DeviceType);
-    shader_backend->shader_get_caps(DeviceType, &adapter->gl_info, &shader_caps);
+    adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
 
     memset(&fragment_caps, 0, sizeof(fragment_caps));
-    frag_pipeline = select_fragment_implementation(adapter, DeviceType);
-    frag_pipeline->get_caps(DeviceType, &adapter->gl_info, &fragment_caps);
+    adapter->fragment_pipe->get_caps(&adapter->gl_info, &fragment_caps);
 
     /* Add shader misc caps. Only some of them belong to the shader parts of the pipeline */
     pCaps->PrimitiveMiscCaps |= fragment_caps.PrimitiveMiscCaps;
@@ -4697,7 +5046,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
             goto nogl_adapter;
         }
 
-        ret = IWineD3DImpl_FillGLCaps(&adapter->driver_info, &adapter->gl_info);
+        ret = IWineD3DImpl_FillGLCaps(adapter);
         if(!ret) {
             ERR("Failed to initialize gl caps for default adapter\n");
             WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
@@ -4729,8 +5078,8 @@ BOOL InitAdapters(IWineD3DImpl *This)
         if (gl_info->supported[WGL_ARB_PIXEL_FORMAT])
         {
             int attribute;
-            int attribs[10];
-            int values[10];
+            int attribs[11];
+            int values[11];
             int nAttribs = 0;
 
             attribute = WGL_NUMBER_PIXEL_FORMATS_ARB;
@@ -4742,6 +5091,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
             attribs[nAttribs++] = WGL_GREEN_BITS_ARB;
             attribs[nAttribs++] = WGL_BLUE_BITS_ARB;
             attribs[nAttribs++] = WGL_ALPHA_BITS_ARB;
+            attribs[nAttribs++] = WGL_COLOR_BITS_ARB;
             attribs[nAttribs++] = WGL_DEPTH_BITS_ARB;
             attribs[nAttribs++] = WGL_STENCIL_BITS_ARB;
             attribs[nAttribs++] = WGL_DRAW_TO_WINDOW_ARB;
@@ -4762,12 +5112,13 @@ BOOL InitAdapters(IWineD3DImpl *This)
                 cfgs->greenSize = values[1];
                 cfgs->blueSize = values[2];
                 cfgs->alphaSize = values[3];
-                cfgs->depthSize = values[4];
-                cfgs->stencilSize = values[5];
-                cfgs->windowDrawable = values[6];
-                cfgs->iPixelType = values[7];
-                cfgs->doubleBuffer = values[8];
-                cfgs->auxBuffers = values[9];
+                cfgs->colorSize = values[4];
+                cfgs->depthSize = values[5];
+                cfgs->stencilSize = values[6];
+                cfgs->windowDrawable = values[7];
+                cfgs->iPixelType = values[8];
+                cfgs->doubleBuffer = values[9];
+                cfgs->auxBuffers = values[10];
 
                 cfgs->pbufferDrawable = FALSE;
                 /* Check for pbuffer support when it is around as
@@ -4794,7 +5145,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
                     }
                 }
 
-                TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable, cfgs->pbufferDrawable);
+                TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, samples=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable, cfgs->pbufferDrawable);
                 cfgs++;
             }
         }
@@ -4828,6 +5179,7 @@ BOOL InitAdapters(IWineD3DImpl *This)
                 cfgs->greenSize = ppfd.cGreenBits;
                 cfgs->blueSize = ppfd.cBlueBits;
                 cfgs->alphaSize = ppfd.cAlphaBits;
+                cfgs->colorSize = ppfd.cColorBits;
                 cfgs->depthSize = ppfd.cDepthBits;
                 cfgs->stencilSize = ppfd.cStencilBits;
                 cfgs->pbufferDrawable = 0;
index dbeb799..b29d012 100644 (file)
@@ -334,7 +334,7 @@ static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format
             GL_EXTCALL(glVertexAttrib4ubvARB(index, ptr));
             break;
         case WINED3DFMT_B8G8R8A8_UNORM:
-            if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+            if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
             {
                 const DWORD *src = ptr;
                 DWORD c = *src & 0xff00ff00;
@@ -690,6 +690,9 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
 
     /* Finished updating the screen, restore lock */
     LEAVE_GL();
+
+    wglFlush(); /* Flush to ensure ordering across contexts. */
+
     context_release(context);
 
     TRACE("Done all gl drawing\n");
@@ -1100,7 +1103,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
     if(patch->has_texcoords) {
         vtxStride += 4 * sizeof(float);
     }
-    memset(&patch->strided, 0, sizeof(&patch->strided));
+    memset(&patch->strided, 0, sizeof(patch->strided));
     patch->strided.position.format = WINED3DFMT_R32G32B32_FLOAT;
     patch->strided.position.lpData = (BYTE *) patch->mem;
     patch->strided.position.dwStride = vtxStride;
index 90b5092..cb23ee6 100644 (file)
@@ -156,6 +156,20 @@ struct glsl_vshader_private
     UINT                            num_gl_shaders, shader_array_size;
 };
 
+static const char *debug_gl_shader_type(GLenum type)
+{
+    switch (type)
+    {
+#define WINED3D_TO_STR(u) case u: return #u
+        WINED3D_TO_STR(GL_VERTEX_SHADER_ARB);
+        WINED3D_TO_STR(GL_GEOMETRY_SHADER_ARB);
+        WINED3D_TO_STR(GL_FRAGMENT_SHADER_ARB);
+#undef WINED3D_TO_STR
+        default:
+            return wine_dbg_sprintf("UNKNOWN(%#x)", type);
+    }
+}
+
 /* Extract a line from the info log.
  * Note that this modifies the source string. */
 static char *get_info_log_line(char **ptr)
@@ -238,6 +252,81 @@ static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleA
     }
 }
 
+/* GL locking is done by the caller. */
+static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_info, GLhandleARB program)
+{
+    GLint i, object_count, source_size;
+    GLhandleARB *objects;
+    char *source = NULL;
+
+    GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_ATTACHED_OBJECTS_ARB, &object_count));
+    objects = HeapAlloc(GetProcessHeap(), 0, object_count * sizeof(*objects));
+    if (!objects)
+    {
+        ERR("Failed to allocate object array memory.\n");
+        return;
+    }
+
+    GL_EXTCALL(glGetAttachedObjectsARB(program, object_count, NULL, objects));
+    for (i = 0; i < object_count; ++i)
+    {
+        char *ptr, *line;
+        GLint tmp;
+
+        GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &tmp));
+
+        if (!source || source_size < tmp)
+        {
+            HeapFree(GetProcessHeap(), 0, source);
+
+            source = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, tmp);
+            if (!source)
+            {
+                ERR("Failed to allocate %d bytes for shader source.\n", tmp);
+                HeapFree(GetProcessHeap(), 0, objects);
+                return;
+            }
+            source_size = tmp;
+        }
+
+        FIXME("Object %u:\n", objects[i]);
+        GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SUBTYPE_ARB, &tmp));
+        FIXME("    GL_OBJECT_SUBTYPE_ARB: %s.\n", debug_gl_shader_type(tmp));
+        GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_COMPILE_STATUS_ARB, &tmp));
+        FIXME("    GL_OBJECT_COMPILE_STATUS_ARB: %d.\n", tmp);
+        FIXME("\n");
+
+        ptr = source;
+        GL_EXTCALL(glGetShaderSourceARB(objects[i], source_size, NULL, source));
+        while ((line = get_info_log_line(&ptr))) FIXME("    %s\n", line);
+        FIXME("\n");
+    }
+
+    HeapFree(GetProcessHeap(), 0, source);
+    HeapFree(GetProcessHeap(), 0, objects);
+}
+
+/* GL locking is done by the caller. */
+static void shader_glsl_validate_link(const struct wined3d_gl_info *gl_info, GLhandleARB program)
+{
+    GLint tmp;
+
+    if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return;
+
+    GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_TYPE_ARB, &tmp));
+    if (tmp == GL_PROGRAM_OBJECT_ARB)
+    {
+        GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_LINK_STATUS_ARB, &tmp));
+        if (!tmp)
+        {
+            FIXME("Program %u link status invalid.\n", program);
+            shader_glsl_dump_program_source(gl_info, program);
+        }
+    }
+
+    print_glsl_info_log(gl_info, program);
+}
+
 /**
  * Loads (pixel shader) samplers
  */
@@ -1083,6 +1172,8 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
         }
     }
 
+    shader_addline(buffer, "const float FLT_MAX = 1e38;\n");
+
     /* Start the main program */
     shader_addline(buffer, "void main() {\n");
     if(pshader && reg_maps->vpos) {
@@ -1194,8 +1285,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
     static const char * const hwrastout_reg_names[] = { "gl_Position", "gl_FogFragCoord", "gl_PointSize" };
 
     IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
-    const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     char pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type);
 
     *is_color = FALSE;
@@ -1552,7 +1642,8 @@ static inline const char *shader_get_comp_op(DWORD op)
     }
 }
 
-static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, glsl_sample_function_t *sample_function)
+static void shader_glsl_get_sample_function(const struct wined3d_gl_info *gl_info,
+        DWORD sampler_type, DWORD flags, glsl_sample_function_t *sample_function)
 {
     BOOL projected = flags & WINED3D_GLSL_SAMPLE_PROJECTED;
     BOOL texrect = flags & WINED3D_GLSL_SAMPLE_RECT;
@@ -1564,9 +1655,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
         case WINED3DSTT_1D:
             if(lod) {
                 sample_function->name = projected ? "texture1DProjLod" : "texture1DLod";
-            } else  if(grad) {
-                sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB";
-            } else {
+            }
+            else  if (grad)
+            {
+                if (gl_info->supported[EXT_GPU_SHADER4])
+                    sample_function->name = projected ? "texture1DProjGrad" : "texture1DGrad";
+                else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                    sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB";
+                else
+                {
+                    FIXME("Unsupported 1D grad function.\n");
+                    sample_function->name = "unsupported1DGrad";
+                }
+            }
+            else
+            {
                 sample_function->name = projected ? "texture1DProj" : "texture1D";
             }
             sample_function->coord_mask = WINED3DSP_WRITEMASK_0;
@@ -1575,20 +1678,41 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
             if(texrect) {
                 if(lod) {
                     sample_function->name = projected ? "texture2DRectProjLod" : "texture2DRectLod";
-                } else  if(grad) {
-                    /* What good are texrect grad functions? I don't know, but GL_EXT_gpu_shader4 defines them.
-                    * There is no GL_ARB_shader_texture_lod spec yet, so I don't know if they're defined there
-                     */
-                    sample_function->name = projected ? "shadow2DRectProjGradARB" : "shadow2DRectGradARB";
-                } else {
+                }
+                else  if (grad)
+                {
+                    if (gl_info->supported[EXT_GPU_SHADER4])
+                        sample_function->name = projected ? "texture2DRectProjGrad" : "texture2DRectGrad";
+                    else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                        sample_function->name = projected ? "texture2DRectProjGradARB" : "texture2DRectGradARB";
+                    else
+                    {
+                        FIXME("Unsupported RECT grad function.\n");
+                        sample_function->name = "unsupported2DRectGrad";
+                    }
+                }
+                else
+                {
                     sample_function->name = projected ? "texture2DRectProj" : "texture2DRect";
                 }
             } else {
                 if(lod) {
                     sample_function->name = projected ? "texture2DProjLod" : "texture2DLod";
-                } else  if(grad) {
-                    sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB";
-                } else {
+                }
+                else  if (grad)
+                {
+                    if (gl_info->supported[EXT_GPU_SHADER4])
+                        sample_function->name = projected ? "texture2DProjGrad" : "texture2DGrad";
+                    else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                        sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB";
+                    else
+                    {
+                        FIXME("Unsupported 2D grad function.\n");
+                        sample_function->name = "unsupported2DGrad";
+                    }
+                }
+                else
+                {
                     sample_function->name = projected ? "texture2DProj" : "texture2D";
                 }
             }
@@ -1597,9 +1721,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
         case WINED3DSTT_CUBE:
             if(lod) {
                 sample_function->name = "textureCubeLod";
-            } else if(grad) {
-                sample_function->name = "textureCubeGradARB";
-            } else {
+            }
+            else if (grad)
+            {
+                if (gl_info->supported[EXT_GPU_SHADER4])
+                    sample_function->name = "textureCubeGrad";
+                else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                    sample_function->name = "textureCubeGradARB";
+                else
+                {
+                    FIXME("Unsupported Cube grad function.\n");
+                    sample_function->name = "unsupportedCubeGrad";
+                }
+            }
+            else
+            {
                 sample_function->name = "textureCube";
             }
             sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
@@ -1607,9 +1743,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls
         case WINED3DSTT_VOLUME:
             if(lod) {
                 sample_function->name = projected ? "texture3DProjLod" : "texture3DLod";
-            } else  if(grad) {
-                sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB";
-            } else {
+            }
+            else  if (grad)
+            {
+                if (gl_info->supported[EXT_GPU_SHADER4])
+                    sample_function->name = projected ? "texture3DProjGrad" : "texture3DGrad";
+                else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+                    sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB";
+                else
+                {
+                    FIXME("Unsupported 3D grad function.\n");
+                    sample_function->name = "unsupported3DGrad";
+                }
+            }
+            else
+            {
                 sample_function->name = projected ? "texture3DProj" : "texture3D";
             }
             sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
@@ -1681,10 +1829,10 @@ static void shader_glsl_color_correction(const struct wined3d_shader_instruction
 
     if (!mask) return; /* Nothing to do */
 
-    if (is_yuv_fixup(fixup))
+    if (is_complex_fixup(fixup))
     {
-        enum yuv_fixup yuv_fixup = get_yuv_fixup(fixup);
-        FIXME("YUV fixup (%#x) not supported\n", yuv_fixup);
+        enum complex_fixup complex_fixup = get_complex_fixup(fixup);
+        FIXME("Complex fixup (%#x) not supported\n",complex_fixup);
         return;
     }
 
@@ -1822,6 +1970,7 @@ static void shader_glsl_arith(const struct wined3d_shader_instruction *ins)
 /* Process the WINED3DSIO_MOV opcode using GLSL (dst = src) */
 static void shader_glsl_mov(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     glsl_src_param_t src0_param;
     DWORD write_mask;
@@ -1847,12 +1996,26 @@ static void shader_glsl_mov(const struct wined3d_shader_instruction *ins)
     {
         /* We need to *round* to the nearest int here. */
         unsigned int mask_size = shader_glsl_get_write_mask_size(write_mask);
-        if (mask_size > 1) {
-            shader_addline(buffer, "ivec%d(floor(abs(%s) + vec%d(0.5)) * sign(%s)));\n", mask_size, src0_param.param_str, mask_size, src0_param.param_str);
-        } else {
-            shader_addline(buffer, "int(floor(abs(%s) + 0.5) * sign(%s)));\n", src0_param.param_str, src0_param.param_str);
+
+        if (gl_info->supported[EXT_GPU_SHADER4])
+        {
+            if (mask_size > 1)
+                shader_addline(buffer, "ivec%d(round(%s)));\n", mask_size, src0_param.param_str);
+            else
+                shader_addline(buffer, "int(round(%s)));\n", src0_param.param_str);
         }
-    } else {
+        else
+        {
+            if (mask_size > 1)
+                shader_addline(buffer, "ivec%d(floor(abs(%s) + vec%d(0.5)) * sign(%s)));\n",
+                        mask_size, src0_param.param_str, mask_size, src0_param.param_str);
+            else
+                shader_addline(buffer, "int(floor(abs(%s) + 0.5) * sign(%s)));\n",
+                        src0_param.param_str, src0_param.param_str);
+        }
+    }
+    else
+    {
         shader_addline(buffer, "%s);\n", src0_param.param_str);
     }
 }
@@ -1942,10 +2105,15 @@ static void shader_glsl_log(const struct wined3d_shader_instruction *ins)
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_0, &src0_param);
 
-    if (dst_size > 1) {
-        shader_addline(buffer, "vec%d(log2(abs(%s))));\n", dst_size, src0_param.param_str);
-    } else {
-        shader_addline(buffer, "log2(abs(%s)));\n", src0_param.param_str);
+    if (dst_size > 1)
+    {
+        shader_addline(buffer, "vec%d(%s == 0.0 ? -FLT_MAX : log2(abs(%s))));\n",
+                dst_size, src0_param.param_str, src0_param.param_str);
+    }
+    else
+    {
+        shader_addline(buffer, "%s == 0.0 ? -FLT_MAX : log2(abs(%s)));\n",
+                src0_param.param_str, src0_param.param_str);
     }
 }
 
@@ -1966,7 +2134,6 @@ static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins)
         case WINED3DSIH_MAX: instruction = "max"; break;
         case WINED3DSIH_ABS: instruction = "abs"; break;
         case WINED3DSIH_FRC: instruction = "fract"; break;
-        case WINED3DSIH_NRM: instruction = "normalize"; break;
         case WINED3DSIH_EXP: instruction = "exp2"; break;
         case WINED3DSIH_DSX: instruction = "dFdx"; break;
         case WINED3DSIH_DSY: instruction = "ycorrection.y * dFdy"; break;
@@ -1993,6 +2160,22 @@ static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins)
     shader_addline(buffer, "));\n");
 }
 
+static void shader_glsl_nrm(const struct wined3d_shader_instruction *ins)
+{
+    struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+    glsl_src_param_t src_param;
+    DWORD write_mask;
+    char dst_mask[6];
+
+    write_mask = shader_glsl_get_write_mask(ins->dst, dst_mask);
+    shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param);
+
+    shader_addline(buffer, "tmp0.x = length(%s);\n", src_param.param_str);
+    shader_glsl_append_dst(buffer, ins);
+    shader_addline(buffer, "tmp0.x == 0.0 ? (%s * FLT_MAX) : (%s / tmp0.x));",
+            src_param.param_str, src_param.param_str);
+}
+
 /** Process the WINED3DSIO_EXPP instruction in GLSL:
  * For shader model 1.x, do the following (and honor the writemask, so use a temporary variable):
  *   dst.x = 2^(floor(src))
@@ -2046,10 +2229,15 @@ static void shader_glsl_rcp(const struct wined3d_shader_instruction *ins)
     mask_size = shader_glsl_get_write_mask_size(write_mask);
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &src_param);
 
-    if (mask_size > 1) {
-        shader_addline(ins->ctx->buffer, "vec%d(1.0 / %s));\n", mask_size, src_param.param_str);
-    } else {
-        shader_addline(ins->ctx->buffer, "1.0 / %s);\n", src_param.param_str);
+    if (mask_size > 1)
+    {
+        shader_addline(ins->ctx->buffer, "vec%d(%s == 0.0 ? FLT_MAX : 1.0 / %s));\n",
+                mask_size, src_param.param_str, src_param.param_str);
+    }
+    else
+    {
+        shader_addline(ins->ctx->buffer, "%s == 0.0 ? FLT_MAX : 1.0 / %s);\n",
+                src_param.param_str, src_param.param_str);
     }
 }
 
@@ -2065,10 +2253,15 @@ static void shader_glsl_rsq(const struct wined3d_shader_instruction *ins)
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &src_param);
 
-    if (mask_size > 1) {
-        shader_addline(buffer, "vec%d(inversesqrt(%s)));\n", mask_size, src_param.param_str);
-    } else {
-        shader_addline(buffer, "inversesqrt(%s));\n", src_param.param_str);
+    if (mask_size > 1)
+    {
+        shader_addline(buffer, "vec%d(%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s))));\n",
+                mask_size, src_param.param_str, src_param.param_str);
+    }
+    else
+    {
+        shader_addline(buffer, "%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s)));\n",
+                src_param.param_str, src_param.param_str);
     }
 }
 
@@ -2671,10 +2864,11 @@ static void shader_glsl_ret(const struct wined3d_shader_instruction *ins)
  ********************************************/
 static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
     DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
             ins->ctx->reg_maps->shader_version.minor);
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
     DWORD sample_flags = 0;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type;
@@ -2728,7 +2922,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
         sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
     }
 
-    shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
     mask |= sample_function.coord_mask;
 
     if (shader_version < WINED3D_SHADER_VERSION(2,0)) swizzle = WINED3DSP_NOSWIZZLE;
@@ -2762,7 +2956,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
 {
     IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
     IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
-    const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
     glsl_src_param_t coord_param, dx_param, dy_param;
     DWORD sample_flags = WINED3D_GLSL_SAMPLE_GRAD;
@@ -2770,7 +2964,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
     DWORD sampler_idx;
     DWORD swizzle = ins->src[1].swizzle;
 
-    if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+    if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4])
     {
         FIXME("texldd used, but not supported by hardware. Falling back to regular tex\n");
         return shader_glsl_tex(ins);
@@ -2783,7 +2977,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
         sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
     }
 
-    shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
     shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param);
     shader_glsl_add_src_param(ins, &ins->src[2], sample_function.coord_mask, &dx_param);
     shader_glsl_add_src_param(ins, &ins->src[3], sample_function.coord_mask, &dy_param);
@@ -2796,7 +2990,7 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
 {
     IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
     IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
-    const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
     glsl_src_param_t coord_param, lod_param;
     DWORD sample_flags = WINED3D_GLSL_SAMPLE_LOD;
@@ -2810,12 +3004,12 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
        IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) {
         sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
     }
-    shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
     shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param);
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &lod_param);
 
-    if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD]
+    if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4]
             && shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
     {
         /* The GLSL spec claims the Lod sampling functions are only supported in vertex shaders.
@@ -2877,6 +3071,7 @@ static void shader_glsl_texcoord(const struct wined3d_shader_instruction *ins)
  * then perform a 1D texture lookup from stage dstregnum, place into dst. */
 static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     glsl_sample_function_t sample_function;
     DWORD sampler_idx = ins->dst[0].reg.idx;
@@ -2891,7 +3086,7 @@ static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
      *
      * It is a dependent read - not valid with conditional NP2 textures
      */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     mask_size = shader_glsl_get_write_mask_size(sample_function.coord_mask);
 
     switch(mask_size)
@@ -2990,7 +3185,7 @@ static void shader_glsl_texm3x2pad(const struct wined3d_shader_instruction *ins)
  * Calculate the 1st or 2nd row of a 3-row matrix multiplication. */
 static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
     DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -3004,6 +3199,7 @@ static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins)
 
 static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -3014,7 +3210,7 @@ static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
     shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
     shader_addline(buffer, "tmp0.y = dot(T%u.xyz, %s);\n", reg, src0_param.param_str);
 
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
 
     /* Sample the texture using the calculated coordinates */
     shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xy");
@@ -3025,10 +3221,11 @@ static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
 static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
 {
     DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     DWORD reg = ins->dst[0].reg.idx;
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
     glsl_sample_function_t sample_function;
 
@@ -3036,7 +3233,7 @@ static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
     shader_addline(ins->ctx->buffer, "tmp0.z = dot(T%u.xyz, %s);\n", reg, src0_param.param_str);
 
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
 
     /* Sample the texture using the calculated coordinates */
     shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3049,11 +3246,11 @@ static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
 static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
 {
     DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
     glsl_src_param_t src0_param;
     char dst_mask[6];
     DWORD reg = ins->dst[0].reg.idx;
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state;
 
     shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
 
@@ -3068,7 +3265,8 @@ static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
  * Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */
 static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     DWORD reg = ins->dst[0].reg.idx;
     glsl_src_param_t src0_param;
     glsl_src_param_t src1_param;
@@ -3087,7 +3285,7 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins
     shader_addline(buffer, "tmp0.xyz = -reflect((%s), normalize(tmp0.xyz));\n", src1_param.param_str);
 
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(stype, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, stype, 0, &sample_function);
 
     /* Sample the texture */
     shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3099,7 +3297,8 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins
  * Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */
 static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     DWORD reg = ins->dst[0].reg.idx;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
@@ -3119,7 +3318,7 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in
     shader_addline(buffer, "tmp0.xyz = -reflect(tmp1.xyz, normalize(tmp0.xyz));\n");
 
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
 
     /* Sample the texture using the calculated coordinates */
     shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3133,8 +3332,9 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in
  */
 static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
 {
-    IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader;
-    IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
+    IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
     glsl_src_param_t coord_param;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type;
@@ -3148,7 +3348,7 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
 
     sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     mask = sample_function.coord_mask;
 
     shader_glsl_write_mask_to_str(mask, coord_mask);
@@ -3207,6 +3407,7 @@ static void shader_glsl_bem(const struct wined3d_shader_instruction *ins)
  * Sample 2D texture at dst using the alpha & red (wx) components of src as texture coordinates */
 static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     DWORD sampler_idx = ins->dst[0].reg.idx;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
@@ -3214,7 +3415,7 @@ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
 
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
             "%s.wx", src0_param.reg_name);
 }
@@ -3223,6 +3424,7 @@ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
  * Sample 2D texture at dst using the green & blue (yz) components of src as texture coordinates */
 static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     DWORD sampler_idx = ins->dst[0].reg.idx;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
@@ -3230,7 +3432,7 @@ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
 
     shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
 
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
             "%s.yz", src0_param.reg_name);
 }
@@ -3239,13 +3441,14 @@ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
  * Sample texture at dst using the rgb (xyz) components of src as texture coordinates */
 static void shader_glsl_texreg2rgb(const struct wined3d_shader_instruction *ins)
 {
+    const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_src_param_t src0_param;
     DWORD sampler_idx = ins->dst[0].reg.idx;
     WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
     glsl_sample_function_t sample_function;
 
     /* Dependent read, not valid with conditional NP2 */
-    shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
+    shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
     shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &src0_param);
 
     shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
@@ -3759,6 +3962,10 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
          */
         shader_addline(buffer, "#extension GL_ARB_texture_rectangle : enable\n");
     }
+    if (gl_info->supported[EXT_GPU_SHADER4])
+    {
+        shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n");
+    }
 
     /* Base Declarations */
     shader_generate_glsl_declarations(context, buffer, (IWineD3DBaseShader *)This, reg_maps, &priv_ctx);
@@ -3846,6 +4053,11 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context
 
     shader_addline(buffer, "#version 120\n");
 
+    if (gl_info->supported[EXT_GPU_SHADER4])
+    {
+        shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n");
+    }
+
     memset(&priv_ctx, 0, sizeof(priv_ctx));
     priv_ctx.cur_vs_args = args;
 
@@ -4149,7 +4361,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
     /* Link the program */
     TRACE("Linking GLSL shader program %u\n", programId);
     GL_EXTCALL(glLinkProgramARB(programId));
-    print_glsl_info_log(gl_info, programId);
+    shader_glsl_validate_link(gl_info, programId);
 
     entry->vuniformF_locations = HeapAlloc(GetProcessHeap(), 0,
             sizeof(GLhandleARB) * gl_info->limits.glsl_vs_float_constants);
@@ -4230,10 +4442,12 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
      * load them now to have them hardcoded in the GLSL program. This saves some CPU cycles
      * later
      */
-    if(pshader && !((IWineD3DPixelShaderImpl*)pshader)->baseShader.load_local_constsF) {
+    if (pshader && !((IWineD3DBaseShaderImpl *)pshader)->baseShader.load_local_constsF)
+    {
         hardcode_local_constants((IWineD3DBaseShaderImpl *) pshader, gl_info, programId, 'P');
     }
-    if(vshader && !((IWineD3DVertexShaderImpl*)vshader)->baseShader.load_local_constsF) {
+    if (vshader && !((IWineD3DBaseShaderImpl *)vshader)->baseShader.load_local_constsF)
+    {
         hardcode_local_constants((IWineD3DBaseShaderImpl *) vshader, gl_info, programId, 'V');
     }
 }
@@ -4303,7 +4517,7 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
     GL_EXTCALL(glAttachObjectARB(program_id, pshader_id));
     GL_EXTCALL(glLinkProgramARB(program_id));
 
-    print_glsl_info_log(gl_info, program_id);
+    shader_glsl_validate_link(gl_info, program_id);
 
     /* Once linked we can mark the shaders for deletion. They will be deleted once the program
      * is destroyed
@@ -4394,8 +4608,6 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
     IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
     struct shader_glsl_priv *priv = device->shader_priv;
     const struct wined3d_gl_info *gl_info;
-    IWineD3DPixelShaderImpl *ps = NULL;
-    IWineD3DVertexShaderImpl *vs = NULL;
     struct wined3d_context *context;
 
     /* Note: Do not use QueryInterface here to find out which shader type this is because this code
@@ -4405,12 +4617,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
 
     if(pshader) {
         struct glsl_pshader_private *shader_data;
-        ps = (IWineD3DPixelShaderImpl *) This;
-        shader_data = ps->baseShader.backend_data;
+        shader_data = This->baseShader.backend_data;
         if(!shader_data || shader_data->num_gl_shaders == 0)
         {
             HeapFree(GetProcessHeap(), 0, shader_data);
-            ps->baseShader.backend_data = NULL;
+            This->baseShader.backend_data = NULL;
             return;
         }
 
@@ -4425,12 +4636,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
         }
     } else {
         struct glsl_vshader_private *shader_data;
-        vs = (IWineD3DVertexShaderImpl *) This;
-        shader_data = vs->baseShader.backend_data;
+        shader_data = This->baseShader.backend_data;
         if(!shader_data || shader_data->num_gl_shaders == 0)
         {
             HeapFree(GetProcessHeap(), 0, shader_data);
-            vs->baseShader.backend_data = NULL;
+            This->baseShader.backend_data = NULL;
             return;
         }
 
@@ -4466,7 +4676,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
 
     if(pshader) {
         UINT i;
-        struct glsl_pshader_private *shader_data = ps->baseShader.backend_data;
+        struct glsl_pshader_private *shader_data = This->baseShader.backend_data;
 
         ENTER_GL();
         for(i = 0; i < shader_data->num_gl_shaders; i++) {
@@ -4476,11 +4686,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
         }
         LEAVE_GL();
         HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
-        HeapFree(GetProcessHeap(), 0, shader_data);
-        ps->baseShader.backend_data = NULL;
-    } else {
+    }
+    else
+    {
         UINT i;
-        struct glsl_vshader_private *shader_data = vs->baseShader.backend_data;
+        struct glsl_vshader_private *shader_data = This->baseShader.backend_data;
 
         ENTER_GL();
         for(i = 0; i < shader_data->num_gl_shaders; i++) {
@@ -4490,10 +4700,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
         }
         LEAVE_GL();
         HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
-        HeapFree(GetProcessHeap(), 0, shader_data);
-        vs->baseShader.backend_data = NULL;
     }
 
+    HeapFree(GetProcessHeap(), 0, This->baseShader.backend_data);
+    This->baseShader.backend_data = NULL;
+
     context_release(context);
 }
 
@@ -4632,8 +4843,7 @@ static BOOL shader_glsl_dirty_const(IWineD3DDevice *iface) {
     return FALSE;
 }
 
-static void shader_glsl_get_caps(WINED3DDEVTYPE devtype,
-        const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
+static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
 {
     /* Nvidia Geforce6/7 or Ati R4xx/R5xx cards with GLSL support, support VS 3.0 but older Nvidia/Ati
      * models with GLSL support only support 2.0. In case of nvidia we can detect VS 2.0 support based
@@ -4697,7 +4907,7 @@ static BOOL shader_glsl_color_fixup_supported(struct color_fixup_desc fixup)
     }
 
     /* We support everything except YUV conversions. */
-    if (!is_yuv_fixup(fixup))
+    if (!is_complex_fixup(fixup))
     {
         TRACE("[OK]\n");
         return TRUE;
@@ -4720,6 +4930,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
     /* WINED3DSIH_CMP           */ shader_glsl_cmp,
     /* WINED3DSIH_CND           */ shader_glsl_cnd,
     /* WINED3DSIH_CRS           */ shader_glsl_cross,
+    /* WINED3DSIH_CUT           */ NULL,
     /* WINED3DSIH_DCL           */ NULL,
     /* WINED3DSIH_DEF           */ NULL,
     /* WINED3DSIH_DEFB          */ NULL,
@@ -4731,20 +4942,24 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
     /* WINED3DSIH_DSX           */ shader_glsl_map2gl,
     /* WINED3DSIH_DSY           */ shader_glsl_map2gl,
     /* WINED3DSIH_ELSE          */ shader_glsl_else,
+    /* WINED3DSIH_EMIT          */ NULL,
     /* WINED3DSIH_ENDIF         */ shader_glsl_end,
     /* WINED3DSIH_ENDLOOP       */ shader_glsl_end,
     /* WINED3DSIH_ENDREP        */ shader_glsl_end,
     /* WINED3DSIH_EXP           */ shader_glsl_map2gl,
     /* WINED3DSIH_EXPP          */ shader_glsl_expp,
     /* WINED3DSIH_FRC           */ shader_glsl_map2gl,
+    /* WINED3DSIH_IADD          */ NULL,
     /* WINED3DSIH_IF            */ shader_glsl_if,
     /* WINED3DSIH_IFC           */ shader_glsl_ifc,
+    /* WINED3DSIH_IGE           */ NULL,
     /* WINED3DSIH_LABEL         */ shader_glsl_label,
     /* WINED3DSIH_LIT           */ shader_glsl_lit,
     /* WINED3DSIH_LOG           */ shader_glsl_log,
     /* WINED3DSIH_LOGP          */ shader_glsl_log,
     /* WINED3DSIH_LOOP          */ shader_glsl_loop,
     /* WINED3DSIH_LRP           */ shader_glsl_lrp,
+    /* WINED3DSIH_LT            */ NULL,
     /* WINED3DSIH_M3x2          */ shader_glsl_mnxn,
     /* WINED3DSIH_M3x3          */ shader_glsl_mnxn,
     /* WINED3DSIH_M3x4          */ shader_glsl_mnxn,
@@ -4757,7 +4972,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
     /* WINED3DSIH_MOVA          */ shader_glsl_mov,
     /* WINED3DSIH_MUL           */ shader_glsl_arith,
     /* WINED3DSIH_NOP           */ NULL,
-    /* WINED3DSIH_NRM           */ shader_glsl_map2gl,
+    /* WINED3DSIH_NRM           */ shader_glsl_nrm,
     /* WINED3DSIH_PHASE         */ NULL,
     /* WINED3DSIH_POW           */ shader_glsl_pow,
     /* WINED3DSIH_RCP           */ shader_glsl_rcp,
index 82a71da..64bb883 100644 (file)
@@ -627,8 +627,7 @@ static void nvts_enable(IWineD3DDevice *iface, BOOL enable) {
     LEAVE_GL();
 }
 
-static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype,
-        const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
+static void nvrc_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
 {
     pCaps->TextureOpCaps =  WINED3DTEXOPCAPS_ADD                        |
                             WINED3DTEXOPCAPS_ADDSIGNED                  |
@@ -671,7 +670,7 @@ static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype,
             WINED3DTEXOPCAPS_PREMODULATE */
 #endif
 
-    pCaps->MaxTextureBlendStages = gl_info->limits.texture_stages;
+    pCaps->MaxTextureBlendStages = min(MAX_TEXTURES, gl_info->limits.general_combiners);
     pCaps->MaxSimultaneousTextures = gl_info->limits.textures;
 
     pCaps->PrimitiveMiscCaps |=  WINED3DPMISCCAPS_TSSARGTEMP;
index 1280a3b..3860e2c 100644 (file)
 #include "config.h"
 #include "wined3d_private.h"
 
+WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+#define GLINFO_LOCATION (*gl_info)
+
+static HRESULT wined3d_event_query_init(const struct wined3d_gl_info *gl_info, struct wined3d_event_query **query)
+{
+    struct wined3d_event_query *ret;
+    *query = NULL;
+    if (!gl_info->supported[ARB_SYNC] && !gl_info->supported[NV_FENCE]
+        && !gl_info->supported[APPLE_FENCE]) return E_NOTIMPL;
+
+    ret = HeapAlloc(GetProcessHeap(), 0, sizeof(*ret));
+    if (!ret)
+    {
+        ERR("Failed to allocate a wined3d event query structure.\n");
+        return E_OUTOFMEMORY;
+    }
+    ret->context = NULL;
+    *query = ret;
+    return WINED3D_OK;
+}
+
+static void wined3d_event_query_destroy(struct wined3d_event_query *query)
+{
+    if (query->context) context_free_event_query(query);
+    HeapFree(GetProcessHeap(), 0, query);
+}
+
+static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+{
+    struct wined3d_context *context;
+    const struct wined3d_gl_info *gl_info;
+    enum wined3d_event_query_result ret;
+    BOOL fence_result;
+
+    TRACE("(%p) : device %p\n", query, device);
+
+    if (query->context == NULL)
+    {
+        TRACE("Query not started\n");
+        return WINED3D_EVENT_QUERY_NOT_STARTED;
+    }
+
+    if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
+    {
+        WARN("Event query tested from wrong thread\n");
+        return WINED3D_EVENT_QUERY_WRONG_THREAD;
+    }
+
+    context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+    gl_info = context->gl_info;
+
+    ENTER_GL();
+
+    if (gl_info->supported[ARB_SYNC])
+    {
+        GLenum gl_ret = GL_EXTCALL(glClientWaitSync(query->object.sync, 0, 0));
+        checkGLcall("glClientWaitSync");
+
+        switch (gl_ret)
+        {
+            case GL_ALREADY_SIGNALED:
+            case GL_CONDITION_SATISFIED:
+                ret = WINED3D_EVENT_QUERY_OK;
+                break;
+
+            case GL_TIMEOUT_EXPIRED:
+                ret = WINED3D_EVENT_QUERY_WAITING;
+                break;
+
+            case GL_WAIT_FAILED:
+            default:
+                ERR("glClientWaitSync returned %#x.\n", gl_ret);
+                ret = WINED3D_EVENT_QUERY_ERROR;
+        }
+    }
+    else if (gl_info->supported[APPLE_FENCE])
+    {
+        fence_result = GL_EXTCALL(glTestFenceAPPLE(query->object.id));
+        checkGLcall("glTestFenceAPPLE");
+        if (fence_result) ret = WINED3D_EVENT_QUERY_OK;
+        else ret = WINED3D_EVENT_QUERY_WAITING;
+    }
+    else if (gl_info->supported[NV_FENCE])
+    {
+        fence_result = GL_EXTCALL(glTestFenceNV(query->object.id));
+        checkGLcall("glTestFenceNV");
+        if (fence_result) ret = WINED3D_EVENT_QUERY_OK;
+        else ret = WINED3D_EVENT_QUERY_WAITING;
+    }
+    else
+    {
+        ERR("Event query created despite lack of GL support\n");
+        ret = WINED3D_EVENT_QUERY_ERROR;
+    }
+
+    LEAVE_GL();
+
+    context_release(context);
+    return ret;
+}
+
+static void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+{
+    const struct wined3d_gl_info *gl_info;
+    struct wined3d_context *context;
+
+    if (query->context)
+    {
+        if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
+        {
+            context_free_event_query(query);
+            context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+            context_alloc_event_query(context, query);
+        }
+        else
+        {
+            context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+        }
+    }
+    else
+    {
+        context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+        context_alloc_event_query(context, query);
+    }
+
+    gl_info = context->gl_info;
+
+    ENTER_GL();
+
+    if (gl_info->supported[ARB_SYNC])
+    {
+        if (query->object.sync) GL_EXTCALL(glDeleteSync(query->object.sync));
+        checkGLcall("glDeleteSync");
+        query->object.sync = GL_EXTCALL(glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0));
+        checkGLcall("glFenceSync");
+    }
+    else if (gl_info->supported[APPLE_FENCE])
+    {
+        GL_EXTCALL(glSetFenceAPPLE(query->object.id));
+        checkGLcall("glSetFenceAPPLE");
+    }
+    else if (gl_info->supported[NV_FENCE])
+    {
+        GL_EXTCALL(glSetFenceNV(query->object.id, GL_ALL_COMPLETED_NV));
+        checkGLcall("glSetFenceNV");
+    }
+
+    LEAVE_GL();
+
+    context_release(context);
+}
+
 /*
  * Occlusion Queries:
  * http://www.gris.uni-tuebingen.de/~bartz/Publications/paper/hww98.pdf
  * http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
  */
 
-WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->device->adapter->gl_info
-
 /* *******************************************
    IWineD3DQuery IUnknown parts follow
    ******************************************* */
@@ -70,17 +219,16 @@ static ULONG  WINAPI IWineD3DQueryImpl_Release(IWineD3DQuery *iface) {
         if (This->type == WINED3DQUERYTYPE_EVENT)
         {
             struct wined3d_event_query *query = This->extendedData;
-
-            if (query->context) context_free_event_query(query);
+            if (query) wined3d_event_query_destroy(query);
         }
         else if (This->type == WINED3DQUERYTYPE_OCCLUSION)
         {
             struct wined3d_occlusion_query *query = This->extendedData;
 
             if (query->context) context_free_occlusion_query(query);
+            HeapFree(GetProcessHeap(), 0, This->extendedData);
         }
 
-        HeapFree(GetProcessHeap(), 0, This->extendedData);
         HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;
@@ -101,168 +249,6 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetParent(IWineD3DQuery *iface, IUnknown
     return WINED3D_OK;
 }
 
-static HRESULT  WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags){
-    IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
-    HRESULT res = S_OK;
-
-    TRACE("(%p) : type %#x, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, This->type, pData, dwSize, dwGetDataFlags);
-
-    switch (This->type){
-
-    case WINED3DQUERYTYPE_VCACHE:
-    {
-
-        WINED3DDEVINFO_VCACHE *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VCACHE\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        data->Pattern     = WINEMAKEFOURCC('C','A','C','H');
-        data->OptMethod   = 0; /*0 get longest strips, 1 optimize vertex cache*/
-        data->CacheSize   = 0; /*cache size, only required if OptMethod == 1*/
-        data->MagicNumber = 0; /*only required if OptMethod == 1 (used internally)*/
-
-    }
-    break;
-    case WINED3DQUERYTYPE_RESOURCEMANAGER:
-    {
-        WINED3DDEVINFO_RESOURCEMANAGER *data = pData;
-        int i;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_RESOURCEMANAGER\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        for(i = 0; i < WINED3DRTYPECOUNT; i++){
-            /*I'm setting the default values to 1 so as to reduce the risk of a div/0 in the caller*/
-            /*  isTextureResident could be used to get some of this information  */
-            data->stats[i].bThrashing            = FALSE;
-            data->stats[i].ApproxBytesDownloaded = 1;
-            data->stats[i].NumEvicts             = 1;
-            data->stats[i].NumVidCreates         = 1;
-            data->stats[i].LastPri               = 1;
-            data->stats[i].NumUsed               = 1;
-            data->stats[i].NumUsedInVidMem       = 1;
-            data->stats[i].WorkingSet            = 1;
-            data->stats[i].WorkingSetBytes       = 1;
-            data->stats[i].TotalManaged          = 1;
-            data->stats[i].TotalBytes            = 1;
-        }
-
-    }
-    break;
-    case WINED3DQUERYTYPE_VERTEXSTATS:
-    {
-        WINED3DDEVINFO_VERTEXSTATS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXSTATS\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        data->NumRenderedTriangles      = 1;
-        data->NumExtraClippingTriangles = 1;
-
-    }
-    break;
-    case WINED3DQUERYTYPE_TIMESTAMP:
-    {
-        UINT64* data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMP\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        *data = 1; /*Don't know what this is supposed to be*/
-    }
-    break;
-    case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
-    {
-        BOOL* data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMPDISJOINT\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        *data = FALSE; /*Don't know what this is supposed to be*/
-    }
-    break;
-    case WINED3DQUERYTYPE_TIMESTAMPFREQ:
-    {
-        UINT64* data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMPFREQ\n", This);
-        if(pData == NULL || dwSize == 0) break;
-        *data = 1; /*Don't know what this is supposed to be*/
-    }
-    break;
-    case WINED3DQUERYTYPE_PIPELINETIMINGS:
-    {
-        WINED3DDEVINFO_PIPELINETIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIPELINETIMINGS\n", This);
-        if(pData == NULL || dwSize == 0) break;
-
-        data->VertexProcessingTimePercent    =   1.0f;
-        data->PixelProcessingTimePercent     =   1.0f;
-        data->OtherGPUProcessingTimePercent  =  97.0f;
-        data->GPUIdleTimePercent             =   1.0f;
-    }
-    break;
-    case WINED3DQUERYTYPE_INTERFACETIMINGS:
-    {
-        WINED3DDEVINFO_INTERFACETIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_INTERFACETIMINGS\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->WaitingForGPUToUseApplicationResourceTimePercent =   1.0f;
-        data->WaitingForGPUToAcceptMoreCommandsTimePercent     =   1.0f;
-        data->WaitingForGPUToStayWithinLatencyTimePercent      =   1.0f;
-        data->WaitingForGPUExclusiveResourceTimePercent        =   1.0f;
-        data->WaitingForGPUOtherTimePercent                    =  96.0f;
-    }
-
-    break;
-    case WINED3DQUERYTYPE_VERTEXTIMINGS:
-    {
-        WINED3DDEVINFO_STAGETIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXTIMINGS\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->MemoryProcessingPercent      = 50.0f;
-        data->ComputationProcessingPercent = 50.0f;
-
-    }
-    break;
-    case WINED3DQUERYTYPE_PIXELTIMINGS:
-    {
-        WINED3DDEVINFO_STAGETIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIXELTIMINGS\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->MemoryProcessingPercent      = 50.0f;
-        data->ComputationProcessingPercent = 50.0f;
-    }
-    break;
-    case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
-    {
-        WINED3DDEVINFO_BANDWIDTHTIMINGS *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_BANDWIDTHTIMINGS\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->MaxBandwidthUtilized                =  1.0f;
-        data->FrontEndUploadMemoryUtilizedPercent =  1.0f;
-        data->VertexRateUtilizedPercent           =  1.0f;
-        data->TriangleSetupRateUtilizedPercent    =  1.0f;
-        data->FillRateUtilizedPercent             = 97.0f;
-    }
-    break;
-    case WINED3DQUERYTYPE_CACHEUTILIZATION:
-    {
-        WINED3DDEVINFO_CACHEUTILIZATION *data = pData;
-        FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_CACHEUTILIZATION\n", This);
-
-        if(pData == NULL || dwSize == 0) break;
-        data->TextureCacheHitRate             = 1.0f;
-        data->PostTransformVertexCacheHitRate = 1.0f;
-    }
-
-
-    break;
-    default:
-        FIXME("(%p) Unhandled query type %d\n",This , This->type);
-
-    };
-
-    /*dwGetDataFlags = 0 || D3DGETDATA_FLUSH
-    D3DGETDATA_FLUSH may return WINED3DERR_DEVICELOST if the device is lost
-    */
-    return res; /* S_OK if the query data is available*/
-}
-
 static HRESULT  WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) {
     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface;
     struct wined3d_occlusion_query *query = This->extendedData;
@@ -341,108 +327,44 @@ static HRESULT  WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface,
 static HRESULT  WINAPI IWineD3DEventQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) {
     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface;
     struct wined3d_event_query *query = This->extendedData;
-    struct wined3d_context *context;
     BOOL *data = pData;
+    enum wined3d_event_query_result ret;
 
     TRACE("(%p) : type D3DQUERY_EVENT, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, pData, dwSize, dwGetDataFlags);
 
     if (!pData || !dwSize) return S_OK;
-
-    if (!query->context)
+    if (!query)
     {
-        TRACE("Query not started, returning TRUE.\n");
+        WARN("(%p): Event query not supported by GL, reporting GPU idle\n", This);
         *data = TRUE;
-
         return S_OK;
     }
 
-    if (query->context->tid != GetCurrentThreadId())
+    ret = wined3d_event_query_test(query, This->device);
+    switch(ret)
     {
-        /* See comment in IWineD3DQuery::Issue, event query codeblock */
-        FIXME("Wrong thread, reporting GPU idle.\n");
-        *data = TRUE;
-
-        return S_OK;
-    }
+        case WINED3D_EVENT_QUERY_OK:
+        case WINED3D_EVENT_QUERY_NOT_STARTED:
+            *data = TRUE;
+            break;
 
-    context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+        case WINED3D_EVENT_QUERY_WAITING:
+            *data = FALSE;
+            break;
 
-    ENTER_GL();
+        case WINED3D_EVENT_QUERY_WRONG_THREAD:
+            FIXME("(%p) Wrong thread, reporting GPU idle.\n", This);
+            *data = TRUE;
+            break;
 
-    if (context->gl_info->supported[APPLE_FENCE])
-    {
-        *data = GL_EXTCALL(glTestFenceAPPLE(query->id));
-        checkGLcall("glTestFenceAPPLE");
+        case WINED3D_EVENT_QUERY_ERROR:
+            ERR("The GL event query failed, returning D3DERR_INVALIDCALL\n");
+            return WINED3DERR_INVALIDCALL;
     }
-    else if (context->gl_info->supported[NV_FENCE])
-    {
-        *data = GL_EXTCALL(glTestFenceNV(query->id));
-        checkGLcall("glTestFenceNV");
-    }
-    else
-    {
-        WARN("(%p): reporting GPU idle\n", This);
-        *data = TRUE;
-    }
-
-    LEAVE_GL();
-
-    context_release(context);
 
     return S_OK;
 }
 
-static DWORD  WINAPI IWineD3DQueryImpl_GetDataSize(IWineD3DQuery* iface){
-    IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
-    int dataSize = 0;
-    TRACE("(%p) : type %#x\n", This, This->type);
-    switch(This->type){
-    case WINED3DQUERYTYPE_VCACHE:
-        dataSize = sizeof(WINED3DDEVINFO_VCACHE);
-        break;
-    case WINED3DQUERYTYPE_RESOURCEMANAGER:
-        dataSize = sizeof(WINED3DDEVINFO_RESOURCEMANAGER);
-        break;
-    case WINED3DQUERYTYPE_VERTEXSTATS:
-        dataSize = sizeof(WINED3DDEVINFO_VERTEXSTATS);
-        break;
-    case WINED3DQUERYTYPE_EVENT:
-        dataSize = sizeof(BOOL);
-        break;
-    case WINED3DQUERYTYPE_TIMESTAMP:
-        dataSize = sizeof(UINT64);
-        break;
-    case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
-        dataSize = sizeof(BOOL);
-        break;
-    case WINED3DQUERYTYPE_TIMESTAMPFREQ:
-        dataSize = sizeof(UINT64);
-        break;
-    case WINED3DQUERYTYPE_PIPELINETIMINGS:
-        dataSize = sizeof(WINED3DDEVINFO_PIPELINETIMINGS);
-        break;
-    case WINED3DQUERYTYPE_INTERFACETIMINGS:
-        dataSize = sizeof(WINED3DDEVINFO_INTERFACETIMINGS);
-        break;
-    case WINED3DQUERYTYPE_VERTEXTIMINGS:
-        dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS);
-        break;
-    case WINED3DQUERYTYPE_PIXELTIMINGS:
-        dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS);
-        break;
-    case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
-        dataSize = sizeof(WINED3DQUERYTYPE_BANDWIDTHTIMINGS);
-        break;
-    case WINED3DQUERYTYPE_CACHEUTILIZATION:
-        dataSize = sizeof(WINED3DDEVINFO_CACHEUTILIZATION);
-        break;
-    default:
-       FIXME("(%p) Unhandled query type %d\n",This , This->type);
-       dataSize = 0;
-    }
-    return dataSize;
-}
-
 static DWORD  WINAPI IWineD3DEventQueryImpl_GetDataSize(IWineD3DQuery* iface){
     TRACE("(%p) : type D3DQUERY_EVENT\n", iface);
 
@@ -460,7 +382,6 @@ static WINED3DQUERYTYPE  WINAPI IWineD3DQueryImpl_GetType(IWineD3DQuery* iface){
     return This->type;
 }
 
-
 static HRESULT  WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface,  DWORD dwIssueFlags) {
     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
 
@@ -468,43 +389,11 @@ static HRESULT  WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface,  DWORD
     if (dwIssueFlags & WINED3DISSUE_END)
     {
         struct wined3d_event_query *query = This->extendedData;
-        struct wined3d_context *context;
 
-        if (query->context)
-        {
-            if (query->context->tid != GetCurrentThreadId())
-            {
-                context_free_event_query(query);
-                context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
-                context_alloc_event_query(context, query);
-            }
-            else
-            {
-                context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
-            }
-        }
-        else
-        {
-            context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
-            context_alloc_event_query(context, query);
-        }
-
-        ENTER_GL();
+        /* Faked event query support */
+        if (!query) return WINED3D_OK;
 
-        if (context->gl_info->supported[APPLE_FENCE])
-        {
-            GL_EXTCALL(glSetFenceAPPLE(query->id));
-            checkGLcall("glSetFenceAPPLE");
-        }
-        else if (context->gl_info->supported[NV_FENCE])
-        {
-            GL_EXTCALL(glSetFenceNV(query->id, GL_ALL_COMPLETED_NV));
-            checkGLcall("glSetFenceNV");
-        }
-
-        LEAVE_GL();
-
-        context_release(context);
+        wined3d_event_query_issue(query, This->device);
     }
     else if(dwIssueFlags & WINED3DISSUE_BEGIN)
     {
@@ -604,43 +493,7 @@ static HRESULT  WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface,  D
     return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL.    */
 }
 
-static HRESULT  WINAPI IWineD3DQueryImpl_Issue(IWineD3DQuery* iface,  DWORD dwIssueFlags){
-    IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
-
-    TRACE("(%p) : dwIssueFlags %#x, type %#x\n", This, dwIssueFlags, This->type);
-
-    /* The fixme is printed when the app asks for the resulting data */
-    WARN("(%p) : Unhandled query type %#x\n", This, This->type);
-
-    if(dwIssueFlags & WINED3DISSUE_BEGIN) {
-        This->state = QUERY_BUILDING;
-    } else {
-        This->state = QUERY_SIGNALLED;
-    }
-
-    return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL.    */
-}
-
-
-/**********************************************************
- * IWineD3DQuery VTbl follows
- **********************************************************/
-
-const IWineD3DQueryVtbl IWineD3DQuery_Vtbl =
-{
-    /*** IUnknown methods ***/
-    IWineD3DQueryImpl_QueryInterface,
-    IWineD3DQueryImpl_AddRef,
-    IWineD3DQueryImpl_Release,
-     /*** IWineD3Dquery methods ***/
-    IWineD3DQueryImpl_GetParent,
-    IWineD3DQueryImpl_GetData,
-    IWineD3DQueryImpl_GetDataSize,
-    IWineD3DQueryImpl_GetType,
-    IWineD3DQueryImpl_Issue
-};
-
-const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl =
+static const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl =
 {
     /*** IUnknown methods ***/
     IWineD3DQueryImpl_QueryInterface,
@@ -654,7 +507,7 @@ const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl =
     IWineD3DEventQueryImpl_Issue
 };
 
-const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
+static const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
 {
     /*** IUnknown methods ***/
     IWineD3DQueryImpl_QueryInterface,
@@ -667,3 +520,72 @@ const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl =
     IWineD3DQueryImpl_GetType,
     IWineD3DOcclusionQueryImpl_Issue
 };
+
+HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
+        WINED3DQUERYTYPE type, IUnknown *parent)
+{
+    const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+    HRESULT hr;
+
+    switch (type)
+    {
+        case WINED3DQUERYTYPE_OCCLUSION:
+            TRACE("Occlusion query.\n");
+            if (!gl_info->supported[ARB_OCCLUSION_QUERY])
+            {
+                WARN("Unsupported in local OpenGL implementation: ARB_OCCLUSION_QUERY.\n");
+                return WINED3DERR_NOTAVAILABLE;
+            }
+            query->lpVtbl = &IWineD3DOcclusionQuery_Vtbl;
+            query->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query));
+            if (!query->extendedData)
+            {
+                ERR("Failed to allocate occlusion query extended data.\n");
+                return E_OUTOFMEMORY;
+            }
+            ((struct wined3d_occlusion_query *)query->extendedData)->context = NULL;
+            break;
+
+        case WINED3DQUERYTYPE_EVENT:
+            TRACE("Event query.\n");
+            query->lpVtbl = &IWineD3DEventQuery_Vtbl;
+            hr = wined3d_event_query_init(gl_info, (struct wined3d_event_query **) &query->extendedData);
+            if (hr == E_NOTIMPL)
+            {
+                /* Half-Life 2 needs this query. It does not render the main
+                 * menu correctly otherwise. Pretend to support it, faking
+                 * this query does not do much harm except potentially
+                 * lowering performance. */
+                FIXME("Event query: Unimplemented, but pretending to be supported.\n");
+            }
+            else if(FAILED(hr))
+            {
+                return hr;
+            }
+            break;
+
+        case WINED3DQUERYTYPE_VCACHE:
+        case WINED3DQUERYTYPE_RESOURCEMANAGER:
+        case WINED3DQUERYTYPE_VERTEXSTATS:
+        case WINED3DQUERYTYPE_TIMESTAMP:
+        case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
+        case WINED3DQUERYTYPE_TIMESTAMPFREQ:
+        case WINED3DQUERYTYPE_PIPELINETIMINGS:
+        case WINED3DQUERYTYPE_INTERFACETIMINGS:
+        case WINED3DQUERYTYPE_VERTEXTIMINGS:
+        case WINED3DQUERYTYPE_PIXELTIMINGS:
+        case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
+        case WINED3DQUERYTYPE_CACHEUTILIZATION:
+        default:
+            FIXME("Unhandled query type %#x.\n", type);
+            return WINED3DERR_NOTAVAILABLE;
+    }
+
+    query->type = type;
+    query->state = QUERY_CREATED;
+    query->device = device;
+    query->parent = parent;
+    query->ref = 1;
+
+    return WINED3D_OK;
+}
index 398ea64..307cadf 100644 (file)
 
 #include <math.h>
 #include <stdio.h>
+#include <string.h>
 
 #include "wined3d_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
+WINE_DECLARE_DEBUG_CHANNEL(d3d);
+
+static const char *shader_opcode_names[] =
+{
+    /* WINED3DSIH_ABS           */ "abs",
+    /* WINED3DSIH_ADD           */ "add",
+    /* WINED3DSIH_BEM           */ "bem",
+    /* WINED3DSIH_BREAK         */ "break",
+    /* WINED3DSIH_BREAKC        */ "breakc",
+    /* WINED3DSIH_BREAKP        */ "breakp",
+    /* WINED3DSIH_CALL          */ "call",
+    /* WINED3DSIH_CALLNZ        */ "callnz",
+    /* WINED3DSIH_CMP           */ "cmp",
+    /* WINED3DSIH_CND           */ "cnd",
+    /* WINED3DSIH_CRS           */ "crs",
+    /* WINED3DSIH_CUT           */ "cut",
+    /* WINED3DSIH_DCL           */ "dcl",
+    /* WINED3DSIH_DEF           */ "def",
+    /* WINED3DSIH_DEFB          */ "defb",
+    /* WINED3DSIH_DEFI          */ "defi",
+    /* WINED3DSIH_DP2ADD        */ "dp2add",
+    /* WINED3DSIH_DP3           */ "dp3",
+    /* WINED3DSIH_DP4           */ "dp4",
+    /* WINED3DSIH_DST           */ "dst",
+    /* WINED3DSIH_DSX           */ "dsx",
+    /* WINED3DSIH_DSY           */ "dsy",
+    /* WINED3DSIH_ELSE          */ "else",
+    /* WINED3DSIH_EMIT          */ "emit",
+    /* WINED3DSIH_ENDIF         */ "endif",
+    /* WINED3DSIH_ENDLOOP       */ "endloop",
+    /* WINED3DSIH_ENDREP        */ "endrep",
+    /* WINED3DSIH_EXP           */ "exp",
+    /* WINED3DSIH_EXPP          */ "expp",
+    /* WINED3DSIH_FRC           */ "frc",
+    /* WINED3DSIH_IADD          */ "iadd",
+    /* WINED3DSIH_IF            */ "if",
+    /* WINED3DSIH_IFC           */ "ifc",
+    /* WINED3DSIH_IGE           */ "ige",
+    /* WINED3DSIH_LABEL         */ "label",
+    /* WINED3DSIH_LIT           */ "lit",
+    /* WINED3DSIH_LOG           */ "log",
+    /* WINED3DSIH_LOGP          */ "logp",
+    /* WINED3DSIH_LOOP          */ "loop",
+    /* WINED3DSIH_LRP           */ "lrp",
+    /* WINED3DSIH_LT            */ "lt",
+    /* WINED3DSIH_M3x2          */ "m3x2",
+    /* WINED3DSIH_M3x3          */ "m3x3",
+    /* WINED3DSIH_M3x4          */ "m3x4",
+    /* WINED3DSIH_M4x3          */ "m4x3",
+    /* WINED3DSIH_M4x4          */ "m4x4",
+    /* WINED3DSIH_MAD           */ "mad",
+    /* WINED3DSIH_MAX           */ "max",
+    /* WINED3DSIH_MIN           */ "min",
+    /* WINED3DSIH_MOV           */ "mov",
+    /* WINED3DSIH_MOVA          */ "mova",
+    /* WINED3DSIH_MUL           */ "mul",
+    /* WINED3DSIH_NOP           */ "nop",
+    /* WINED3DSIH_NRM           */ "nrm",
+    /* WINED3DSIH_PHASE         */ "phase",
+    /* WINED3DSIH_POW           */ "pow",
+    /* WINED3DSIH_RCP           */ "rcp",
+    /* WINED3DSIH_REP           */ "rep",
+    /* WINED3DSIH_RET           */ "ret",
+    /* WINED3DSIH_RSQ           */ "rsq",
+    /* WINED3DSIH_SETP          */ "setp",
+    /* WINED3DSIH_SGE           */ "sge",
+    /* WINED3DSIH_SGN           */ "sgn",
+    /* WINED3DSIH_SINCOS        */ "sincos",
+    /* WINED3DSIH_SLT           */ "slt",
+    /* WINED3DSIH_SUB           */ "sub",
+    /* WINED3DSIH_TEX           */ "texld",
+    /* WINED3DSIH_TEXBEM        */ "texbem",
+    /* WINED3DSIH_TEXBEML       */ "texbeml",
+    /* WINED3DSIH_TEXCOORD      */ "texcrd",
+    /* WINED3DSIH_TEXDEPTH      */ "texdepth",
+    /* WINED3DSIH_TEXDP3        */ "texdp3",
+    /* WINED3DSIH_TEXDP3TEX     */ "texdp3tex",
+    /* WINED3DSIH_TEXKILL       */ "texkill",
+    /* WINED3DSIH_TEXLDD        */ "texldd",
+    /* WINED3DSIH_TEXLDL        */ "texldl",
+    /* WINED3DSIH_TEXM3x2DEPTH  */ "texm3x2depth",
+    /* WINED3DSIH_TEXM3x2PAD    */ "texm3x2pad",
+    /* WINED3DSIH_TEXM3x2TEX    */ "texm3x2tex",
+    /* WINED3DSIH_TEXM3x3       */ "texm3x3",
+    /* WINED3DSIH_TEXM3x3DIFF   */ "texm3x3diff",
+    /* WINED3DSIH_TEXM3x3PAD    */ "texm3x3pad",
+    /* WINED3DSIH_TEXM3x3SPEC   */ "texm3x3spec",
+    /* WINED3DSIH_TEXM3x3TEX    */ "texm3x3tex",
+    /* WINED3DSIH_TEXM3x3VSPEC  */ "texm3x3vspec",
+    /* WINED3DSIH_TEXREG2AR     */ "texreg2ar",
+    /* WINED3DSIH_TEXREG2GB     */ "texreg2gb",
+    /* WINED3DSIH_TEXREG2RGB    */ "texreg2rgb",
+};
+
+static const char *semantic_names[] =
+{
+    /* WINED3DDECLUSAGE_POSITION        */ "SV_POSITION",
+    /* WINED3DDECLUSAGE_BLENDWEIGHT     */ "BLENDWEIGHT",
+    /* WINED3DDECLUSAGE_BLENDINDICES    */ "BLENDINDICES",
+    /* WINED3DDECLUSAGE_NORMAL          */ "NORMAL",
+    /* WINED3DDECLUSAGE_PSIZE           */ "PSIZE",
+    /* WINED3DDECLUSAGE_TEXCOORD        */ "TEXCOORD",
+    /* WINED3DDECLUSAGE_TANGENT         */ "TANGENT",
+    /* WINED3DDECLUSAGE_BINORMAL        */ "BINORMAL",
+    /* WINED3DDECLUSAGE_TESSFACTOR      */ "TESSFACTOR",
+    /* WINED3DDECLUSAGE_POSITIONT       */ "POSITIONT",
+    /* WINED3DDECLUSAGE_COLOR           */ "COLOR",
+    /* WINED3DDECLUSAGE_FOG             */ "FOG",
+    /* WINED3DDECLUSAGE_DEPTH           */ "DEPTH",
+    /* WINED3DDECLUSAGE_SAMPLE          */ "SAMPLE",
+};
+
+static const char *shader_semantic_name_from_usage(WINED3DDECLUSAGE usage)
+{
+    if (usage >= sizeof(semantic_names) / sizeof(*semantic_names))
+    {
+        FIXME("Unrecognized usage %#x.\n", usage);
+        return "UNRECOGNIZED";
+    }
+
+    return semantic_names[usage];
+}
+
+static WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *name)
+{
+    unsigned int i;
+
+    for (i = 0; i < sizeof(semantic_names) / sizeof(*semantic_names); ++i)
+    {
+        if (!strcmp(name, semantic_names[i])) return i;
+    }
+
+    return ~0U;
+}
+
+BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage)
+{
+    return !strcmp(semantic_name, shader_semantic_name_from_usage(usage));
+}
+
+static void shader_signature_from_semantic(struct wined3d_shader_signature_element *e,
+        const struct wined3d_shader_semantic *s)
+{
+    e->semantic_name = shader_semantic_name_from_usage(s->usage);
+    e->semantic_idx = s->usage_idx;
+    e->sysval_semantic = 0;
+    e->component_type = 0;
+    e->register_idx = s->reg.reg.idx;
+    e->mask = s->reg.write_mask;
+}
+
+static const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token)
+{
+    switch (version_token >> 16)
+    {
+        case WINED3D_SM1_VS:
+        case WINED3D_SM1_PS:
+            return &sm1_shader_frontend;
+
+        case WINED3D_SM4_PS:
+        case WINED3D_SM4_VS:
+        case WINED3D_SM4_GS:
+            return &sm4_shader_frontend;
+
+        default:
+            FIXME("Unrecognised version token %#x\n", version_token);
+            return NULL;
+    }
+}
+
+void shader_buffer_clear(struct wined3d_shader_buffer *buffer)
+{
+    buffer->buffer[0] = '\0';
+    buffer->bsize = 0;
+    buffer->lineNo = 0;
+    buffer->newline = TRUE;
+}
+
+BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer)
+{
+    buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE);
+    if (!buffer->buffer)
+    {
+        ERR("Failed to allocate shader buffer memory.\n");
+        return FALSE;
+    }
+
+    shader_buffer_clear(buffer);
+    return TRUE;
+}
+
+void shader_buffer_free(struct wined3d_shader_buffer *buffer)
+{
+    HeapFree(GetProcessHeap(), 0, buffer->buffer);
+}
+
+int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va_list args)
+{
+    char *base = buffer->buffer + buffer->bsize;
+    int rc;
+
+    rc = vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args);
+
+    if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->bsize /* C99 */)
+    {
+        ERR("The buffer allocated for the shader program string "
+            "is too small at %d bytes.\n", SHADER_PGMSIZE);
+        buffer->bsize = SHADER_PGMSIZE - 1;
+        return -1;
+    }
+
+    if (buffer->newline)
+    {
+        TRACE("GL HW (%u, %u) : %s", buffer->lineNo + 1, buffer->bsize, base);
+        buffer->newline = FALSE;
+    }
+    else
+    {
+        TRACE("%s", base);
+    }
+
+    buffer->bsize += rc;
+    if (buffer->buffer[buffer->bsize-1] == '\n')
+    {
+        ++buffer->lineNo;
+        buffer->newline = TRUE;
+    }
+
+    return 0;
+}
+
+int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...)
+{
+    va_list args;
+    int ret;
+
+    va_start(args, format);
+    ret = shader_vaddline(buffer, format, args);
+    va_end(args);
+
+    return ret;
+}
+
+static void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
+        IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
+{
+    shader->ref = 1;
+    shader->device = (IWineD3DDevice *)device;
+    shader->parent = parent;
+    shader->parent_ops = parent_ops;
+    list_init(&shader->linked_programs);
+    list_add_head(&device->shaders, &shader->shader_list_entry);
+}
+
+/* Convert floating point offset relative to a register file to an absolute
+ * offset for float constants. */
+static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx)
+{
+    switch (register_type)
+    {
+        case WINED3DSPR_CONST: return register_idx;
+        case WINED3DSPR_CONST2: return 2048 + register_idx;
+        case WINED3DSPR_CONST3: return 4096 + register_idx;
+        case WINED3DSPR_CONST4: return 6144 + register_idx;
+        default:
+            FIXME("Unsupported register type: %u.\n", register_type);
+            return register_idx;
+    }
+}
+
+static void shader_delete_constant_list(struct list *clist)
+{
+    struct local_constant *constant;
+    struct list *ptr;
+
+    ptr = list_head(clist);
+    while (ptr)
+    {
+        constant = LIST_ENTRY(ptr, struct local_constant, entry);
+        ptr = list_next(clist, ptr);
+        HeapFree(GetProcessHeap(), 0, constant);
+    }
+    list_init(clist);
+}
+
+static inline void set_bitmap_bit(DWORD *bitmap, DWORD bit)
+{
+    DWORD idx, shift;
+    idx = bit >> 5;
+    shift = bit & 0x1f;
+    bitmap[idx] |= (1 << shift);
+}
+
+static void shader_record_register_usage(IWineD3DBaseShaderImpl *shader, struct shader_reg_maps *reg_maps,
+        const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type)
+{
+    switch (reg->type)
+    {
+        case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
+            if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord |= 1 << reg->idx;
+            else reg_maps->address |= 1 << reg->idx;
+            break;
+
+        case WINED3DSPR_TEMP:
+            reg_maps->temporary |= 1 << reg->idx;
+            break;
+
+        case WINED3DSPR_INPUT:
+            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
+            {
+                if (reg->rel_addr)
+                {
+                    /* If relative addressing is used, we must assume that all registers
+                     * are used. Even if it is a construct like v3[aL], we can't assume
+                     * that v0, v1 and v2 aren't read because aL can be negative */
+                    unsigned int i;
+                    for (i = 0; i < MAX_REG_INPUT; ++i)
+                    {
+                        ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[i] = TRUE;
+                    }
+                }
+                else
+                {
+                    ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[reg->idx] = TRUE;
+                }
+            }
+            else reg_maps->input_registers |= 1 << reg->idx;
+            break;
+
+        case WINED3DSPR_RASTOUT:
+            if (reg->idx == 1) reg_maps->fog = 1;
+            break;
+
+        case WINED3DSPR_MISCTYPE:
+            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
+            {
+                if (reg->idx == 0) reg_maps->vpos = 1;
+                else if (reg->idx == 1) reg_maps->usesfacing = 1;
+            }
+            break;
+
+        case WINED3DSPR_CONST:
+            if (reg->rel_addr)
+            {
+                if (shader_type != WINED3D_SHADER_TYPE_PIXEL)
+                {
+                    if (reg->idx < ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset)
+                    {
+                        ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset = reg->idx;
+                    }
+                    if (reg->idx > ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset)
+                    {
+                        ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset = reg->idx;
+                    }
+                }
+                reg_maps->usesrelconstF = TRUE;
+            }
+            else
+            {
+                set_bitmap_bit(reg_maps->constf, reg->idx);
+            }
+            break;
+
+        case WINED3DSPR_CONSTINT:
+            reg_maps->integer_constants |= (1 << reg->idx);
+            break;
+
+        case WINED3DSPR_CONSTBOOL:
+            reg_maps->boolean_constants |= (1 << reg->idx);
+            break;
+
+        case WINED3DSPR_COLOROUT:
+            reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx);
+            break;
+
+        default:
+            TRACE("Not recording register of type %#x and idx %u\n", reg->type, reg->idx);
+            break;
+    }
+}
+
+static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param)
+{
+    switch (instr)
+    {
+        case WINED3DSIH_M4x4:
+        case WINED3DSIH_M3x4:
+            return param == 1 ? 3 : 0;
+
+        case WINED3DSIH_M4x3:
+        case WINED3DSIH_M3x3:
+            return param == 1 ? 2 : 0;
+
+        case WINED3DSIH_M3x2:
+            return param == 1 ? 1 : 0;
+
+        default:
+            return 0;
+    }
+}
+
+/* Note that this does not count the loop register as an address register. */
+static HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
+        struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature,
+        struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size)
+{
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
+    unsigned int cur_loop_depth = 0, max_loop_depth = 0;
+    void *fe_data = shader->baseShader.frontend_data;
+    struct wined3d_shader_version shader_version;
+    const DWORD *ptr = byte_code;
+
+    memset(reg_maps, 0, sizeof(*reg_maps));
+
+    /* get_registers_used() is called on every compile on some 1.x shaders,
+     * which can result in stacking up a collection of local constants.
+     * Delete the old constants if existing. */
+    shader_delete_constant_list(&shader->baseShader.constantsF);
+    shader_delete_constant_list(&shader->baseShader.constantsB);
+    shader_delete_constant_list(&shader->baseShader.constantsI);
+
+    fe->shader_read_header(fe_data, &ptr, &shader_version);
+    reg_maps->shader_version = shader_version;
+
+    reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+            sizeof(*reg_maps->constf) * ((constf_size + 31) / 32));
+    if (!reg_maps->constf)
+    {
+        ERR("Failed to allocate constant map memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    while (!fe->shader_is_end(fe_data, &ptr))
+    {
+        struct wined3d_shader_instruction ins;
+        const char *comment;
+        UINT comment_size;
+        UINT param_size;
+
+        /* Skip comments. */
+        fe->shader_read_comment(&ptr, &comment, &comment_size);
+        if (comment) continue;
+
+        /* Fetch opcode. */
+        fe->shader_read_opcode(fe_data, &ptr, &ins, &param_size);
+
+        /* Unhandled opcode, and its parameters. */
+        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
+        {
+            TRACE("Skipping unrecognized instruction.\n");
+            ptr += param_size;
+            continue;
+        }
+
+        /* Handle declarations. */
+        if (ins.handler_idx == WINED3DSIH_DCL)
+        {
+            struct wined3d_shader_semantic semantic;
+
+            fe->shader_read_semantic(&ptr, &semantic);
+
+            switch (semantic.reg.reg.type)
+            {
+                /* Mark input registers used. */
+                case WINED3DSPR_INPUT:
+                    reg_maps->input_registers |= 1 << semantic.reg.reg.idx;
+                    shader_signature_from_semantic(&input_signature[semantic.reg.reg.idx], &semantic);
+                    break;
+
+                /* Vertex shader: mark 3.0 output registers used, save token. */
+                case WINED3DSPR_OUTPUT:
+                    reg_maps->output_registers |= 1 << semantic.reg.reg.idx;
+                    shader_signature_from_semantic(&output_signature[semantic.reg.reg.idx], &semantic);
+                    if (semantic.usage == WINED3DDECLUSAGE_FOG) reg_maps->fog = 1;
+                    break;
+
+                /* Save sampler usage token. */
+                case WINED3DSPR_SAMPLER:
+                    reg_maps->sampler_type[semantic.reg.reg.idx] = semantic.sampler_type;
+                    break;
+
+                default:
+                    TRACE("Not recording DCL register type %#x.\n", semantic.reg.reg.type);
+                    break;
+            }
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEF)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+            if (!lconst) return E_OUTOFMEMORY;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+            lconst->idx = dst.reg.idx;
+
+            memcpy(lconst->value, ptr, 4 * sizeof(DWORD));
+            ptr += 4;
+
+            /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
+            if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
+            {
+                float *value = (float *)lconst->value;
+                if (value[0] < -1.0f) value[0] = -1.0f;
+                else if (value[0] > 1.0f) value[0] = 1.0f;
+                if (value[1] < -1.0f) value[1] = -1.0f;
+                else if (value[1] > 1.0f) value[1] = 1.0f;
+                if (value[2] < -1.0f) value[2] = -1.0f;
+                else if (value[2] > 1.0f) value[2] = 1.0f;
+                if (value[3] < -1.0f) value[3] = -1.0f;
+                else if (value[3] > 1.0f) value[3] = 1.0f;
+            }
+
+            list_add_head(&shader->baseShader.constantsF, &lconst->entry);
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEFI)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+            if (!lconst) return E_OUTOFMEMORY;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+            lconst->idx = dst.reg.idx;
+
+            memcpy(lconst->value, ptr, 4 * sizeof(DWORD));
+            ptr += 4;
+
+            list_add_head(&shader->baseShader.constantsI, &lconst->entry);
+            reg_maps->local_int_consts |= (1 << dst.reg.idx);
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEFB)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+            if (!lconst) return E_OUTOFMEMORY;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+            lconst->idx = dst.reg.idx;
+
+            memcpy(lconst->value, ptr, sizeof(DWORD));
+            ++ptr;
+
+            list_add_head(&shader->baseShader.constantsB, &lconst->entry);
+            reg_maps->local_bool_consts |= (1 << dst.reg.idx);
+        }
+        /* If there's a loop in the shader. */
+        else if (ins.handler_idx == WINED3DSIH_LOOP
+                || ins.handler_idx == WINED3DSIH_REP)
+        {
+            struct wined3d_shader_src_param src, rel_addr;
+
+            fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr);
+
+            /* Rep and Loop always use an integer constant for the control parameters. */
+            if (ins.handler_idx == WINED3DSIH_REP)
+            {
+                reg_maps->integer_constants |= 1 << src.reg.idx;
+            }
+            else
+            {
+                fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr);
+                reg_maps->integer_constants |= 1 << src.reg.idx;
+            }
+
+            cur_loop_depth++;
+            if (cur_loop_depth > max_loop_depth) max_loop_depth = cur_loop_depth;
+        }
+        else if (ins.handler_idx == WINED3DSIH_ENDLOOP
+                || ins.handler_idx == WINED3DSIH_ENDREP)
+        {
+            cur_loop_depth--;
+        }
+        /* For subroutine prototypes. */
+        else if (ins.handler_idx == WINED3DSIH_LABEL)
+        {
+            struct wined3d_shader_src_param src, rel_addr;
+
+            fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr);
+            reg_maps->labels |= 1 << src.reg.idx;
+        }
+        /* Set texture, address, temporary registers. */
+        else
+        {
+            BOOL color0_mov = FALSE;
+            int i, limit;
+
+            /* This will loop over all the registers and try to
+             * make a bitmask of the ones we're interested in.
+             *
+             * Relative addressing tokens are ignored, but that's
+             * okay, since we'll catch any address registers when
+             * they are initialized (required by spec). */
+            if (ins.dst_count)
+            {
+                struct wined3d_shader_src_param dst_rel_addr;
+                struct wined3d_shader_dst_param dst_param;
+
+                fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
+
+                shader_record_register_usage(shader, reg_maps, &dst_param.reg, shader_version.type);
+
+                /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and
+                 * is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel
+                 * shaders because TECRDOUT isn't used in them, but future register types might cause issues */
+                if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3
+                        && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
+                {
+                    reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask;
+                }
+
+                if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
+                {
+                    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader;
+
+                    if (dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0)
+                    {
+                    /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to
+                     * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
+                     * the mov and perform the sRGB write correction from the source register.
+                     *
+                     * However, if the mov is only partial, we can't do this, and if the write
+                     * comes from an instruction other than MOV it is hard to do as well. If
+                     * COLOROUT 0 is overwritten partially later, the marker is dropped again. */
+
+                        ps->color0_mov = FALSE;
+                        if (ins.handler_idx == WINED3DSIH_MOV)
+                        {
+                            /* Used later when the source register is read. */
+                            color0_mov = TRUE;
+                        }
+                    }
+                    /* Also drop the MOV marker if the source register is overwritten prior to the shader
+                     * end
+                     */
+                    else if (dst_param.reg.type == WINED3DSPR_TEMP && dst_param.reg.idx == ps->color0_reg)
+                    {
+                        ps->color0_mov = FALSE;
+                    }
+                }
+
+                /* Declare 1.x samplers implicitly, based on the destination reg. number. */
+                if (shader_version.major == 1
+                        && (ins.handler_idx == WINED3DSIH_TEX
+                            || ins.handler_idx == WINED3DSIH_TEXBEM
+                            || ins.handler_idx == WINED3DSIH_TEXBEML
+                            || ins.handler_idx == WINED3DSIH_TEXDP3TEX
+                            || ins.handler_idx == WINED3DSIH_TEXM3x2TEX
+                            || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC
+                            || ins.handler_idx == WINED3DSIH_TEXM3x3TEX
+                            || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC
+                            || ins.handler_idx == WINED3DSIH_TEXREG2AR
+                            || ins.handler_idx == WINED3DSIH_TEXREG2GB
+                            || ins.handler_idx == WINED3DSIH_TEXREG2RGB))
+                {
+                    /* Fake sampler usage, only set reserved bit and type. */
+                    DWORD sampler_code = dst_param.reg.idx;
+
+                    TRACE("Setting fake 2D sampler for 1.x pixelshader.\n");
+                    reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D;
+
+                    /* texbem is only valid with < 1.4 pixel shaders */
+                    if (ins.handler_idx == WINED3DSIH_TEXBEM
+                            || ins.handler_idx == WINED3DSIH_TEXBEML)
+                    {
+                        reg_maps->bumpmat |= 1 << dst_param.reg.idx;
+                        if (ins.handler_idx == WINED3DSIH_TEXBEML)
+                        {
+                            reg_maps->luminanceparams |= 1 << dst_param.reg.idx;
+                        }
+                    }
+                }
+                else if (ins.handler_idx == WINED3DSIH_BEM)
+                {
+                    reg_maps->bumpmat |= 1 << dst_param.reg.idx;
+                }
+            }
+
+            if (ins.handler_idx == WINED3DSIH_NRM) reg_maps->usesnrm = 1;
+            else if (ins.handler_idx == WINED3DSIH_DSY) reg_maps->usesdsy = 1;
+            else if (ins.handler_idx == WINED3DSIH_DSX) reg_maps->usesdsx = 1;
+            else if (ins.handler_idx == WINED3DSIH_TEXLDD) reg_maps->usestexldd = 1;
+            else if (ins.handler_idx == WINED3DSIH_TEXLDL) reg_maps->usestexldl = 1;
+            else if (ins.handler_idx == WINED3DSIH_MOVA) reg_maps->usesmova = 1;
+            else if (ins.handler_idx == WINED3DSIH_IFC) reg_maps->usesifc = 1;
+            else if (ins.handler_idx == WINED3DSIH_CALL) reg_maps->usescall = 1;
+
+            limit = ins.src_count + (ins.predicate ? 1 : 0);
+            for (i = 0; i < limit; ++i)
+            {
+                struct wined3d_shader_src_param src_param, src_rel_addr;
+                unsigned int count;
+
+                fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr);
+                count = get_instr_extra_regcount(ins.handler_idx, i);
+
+                shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
+                while (count)
+                {
+                    ++src_param.reg.idx;
+                    shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type);
+                    --count;
+                }
+
+                if (color0_mov)
+                {
+                    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader;
+                    if (src_param.reg.type == WINED3DSPR_TEMP
+                            && src_param.swizzle == WINED3DSP_NOSWIZZLE)
+                    {
+                        ps->color0_mov = TRUE;
+                        ps->color0_reg = src_param.reg.idx;
+                    }
+                }
+            }
+        }
+    }
+    reg_maps->loop_depth = max_loop_depth;
+
+    shader->baseShader.functionLength = ((const char *)ptr - (const char *)byte_code);
+
+    return WINED3D_OK;
+}
+
+unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max)
+{
+    DWORD map = 1 << max;
+    map |= map - 1;
+    map &= reg_maps->shader_version.major < 3 ? ~reg_maps->texcoord : ~reg_maps->input_registers;
+
+    return wined3d_log2i(map);
+}
+
+static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semantic,
+        const struct wined3d_shader_version *shader_version)
+{
+    TRACE("dcl");
+
+    if (semantic->reg.reg.type == WINED3DSPR_SAMPLER)
+    {
+        switch (semantic->sampler_type)
+        {
+            case WINED3DSTT_2D: TRACE("_2d"); break;
+            case WINED3DSTT_CUBE: TRACE("_cube"); break;
+            case WINED3DSTT_VOLUME: TRACE("_volume"); break;
+            default: TRACE("_unknown_ttype(0x%08x)", semantic->sampler_type);
+        }
+    }
+    else
+    {
+        /* Pixel shaders 3.0 don't have usage semantics. */
+        if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL) return;
+        else TRACE("_");
+
+        switch (semantic->usage)
+        {
+            case WINED3DDECLUSAGE_POSITION:
+                TRACE("position%u", semantic->usage_idx);
+                break;
+
+            case WINED3DDECLUSAGE_BLENDINDICES:
+                TRACE("blend");
+                break;
+
+            case WINED3DDECLUSAGE_BLENDWEIGHT:
+                TRACE("weight");
+                break;
+
+            case WINED3DDECLUSAGE_NORMAL:
+                TRACE("normal%u", semantic->usage_idx);
+                break;
+
+            case WINED3DDECLUSAGE_PSIZE:
+                TRACE("psize");
+                break;
+
+            case WINED3DDECLUSAGE_COLOR:
+                if (semantic->usage_idx == 0) TRACE("color");
+                else TRACE("specular%u", (semantic->usage_idx - 1));
+                break;
+
+            case WINED3DDECLUSAGE_TEXCOORD:
+                TRACE("texture%u", semantic->usage_idx);
+                break;
+
+            case WINED3DDECLUSAGE_TANGENT:
+                TRACE("tangent");
+                break;
+
+            case WINED3DDECLUSAGE_BINORMAL:
+                TRACE("binormal");
+                break;
+
+            case WINED3DDECLUSAGE_TESSFACTOR:
+                TRACE("tessfactor");
+                break;
+
+            case WINED3DDECLUSAGE_POSITIONT:
+                TRACE("positionT%u", semantic->usage_idx);
+                break;
+
+            case WINED3DDECLUSAGE_FOG:
+                TRACE("fog");
+                break;
+
+            case WINED3DDECLUSAGE_DEPTH:
+                TRACE("depth");
+                break;
+
+            case WINED3DDECLUSAGE_SAMPLE:
+                TRACE("sample");
+                break;
+
+            default:
+                FIXME("unknown_semantics(0x%08x)", semantic->usage);
+        }
+    }
+}
+
+static void shader_dump_register(const struct wined3d_shader_register *reg,
+        const struct wined3d_shader_version *shader_version)
+{
+    static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"};
+    static const char * const misctype_reg_names[] = {"vPos", "vFace"};
+    UINT offset = reg->idx;
+
+    switch (reg->type)
+    {
+        case WINED3DSPR_TEMP:
+            TRACE("r");
+            break;
+
+        case WINED3DSPR_INPUT:
+            TRACE("v");
+            break;
+
+        case WINED3DSPR_CONST:
+        case WINED3DSPR_CONST2:
+        case WINED3DSPR_CONST3:
+        case WINED3DSPR_CONST4:
+            TRACE("c");
+            offset = shader_get_float_offset(reg->type, reg->idx);
+            break;
+
+        case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */
+            TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a');
+            break;
+
+        case WINED3DSPR_RASTOUT:
+            TRACE("%s", rastout_reg_names[reg->idx]);
+            break;
+
+        case WINED3DSPR_COLOROUT:
+            TRACE("oC");
+            break;
+
+        case WINED3DSPR_DEPTHOUT:
+            TRACE("oDepth");
+            break;
+
+        case WINED3DSPR_ATTROUT:
+            TRACE("oD");
+            break;
+
+        case WINED3DSPR_TEXCRDOUT:
+            /* Vertex shaders >= 3.0 use general purpose output registers
+             * (WINED3DSPR_OUTPUT), which can include an address token. */
+            if (shader_version->major >= 3) TRACE("o");
+            else TRACE("oT");
+            break;
+
+        case WINED3DSPR_CONSTINT:
+            TRACE("i");
+            break;
+
+        case WINED3DSPR_CONSTBOOL:
+            TRACE("b");
+            break;
+
+        case WINED3DSPR_LABEL:
+            TRACE("l");
+            break;
+
+        case WINED3DSPR_LOOP:
+            TRACE("aL");
+            break;
+
+        case WINED3DSPR_SAMPLER:
+            TRACE("s");
+            break;
+
+        case WINED3DSPR_MISCTYPE:
+            if (reg->idx > 1) FIXME("Unhandled misctype register %u.\n", reg->idx);
+            else TRACE("%s", misctype_reg_names[reg->idx]);
+            break;
+
+        case WINED3DSPR_PREDICATE:
+            TRACE("p");
+            break;
+
+        case WINED3DSPR_IMMCONST:
+            TRACE("l");
+            break;
+
+        case WINED3DSPR_CONSTBUFFER:
+            TRACE("cb");
+            break;
+
+        default:
+            TRACE("unhandled_rtype(%#x)", reg->type);
+            break;
+    }
+
+    if (reg->type == WINED3DSPR_IMMCONST)
+    {
+        TRACE("(");
+        switch (reg->immconst_type)
+        {
+            case WINED3D_IMMCONST_FLOAT:
+                TRACE("%.8e", *(const float *)reg->immconst_data);
+                break;
+
+            case WINED3D_IMMCONST_FLOAT4:
+                TRACE("%.8e, %.8e, %.8e, %.8e",
+                        *(const float *)&reg->immconst_data[0], *(const float *)&reg->immconst_data[1],
+                        *(const float *)&reg->immconst_data[2], *(const float *)&reg->immconst_data[3]);
+                break;
+
+            default:
+                TRACE("<unhandled immconst_type %#x>", reg->immconst_type);
+                break;
+        }
+        TRACE(")");
+    }
+    else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE)
+    {
+        if (reg->array_idx != ~0U)
+        {
+            TRACE("%u[%u", offset, reg->array_idx);
+            if (reg->rel_addr)
+            {
+                TRACE(" + ");
+                shader_dump_src_param(reg->rel_addr, shader_version);
+            }
+            TRACE("]");
+        }
+        else
+        {
+            if (reg->rel_addr)
+            {
+                TRACE("[");
+                shader_dump_src_param(reg->rel_addr, shader_version);
+                TRACE(" + ");
+            }
+            TRACE("%u", offset);
+            if (reg->rel_addr) TRACE("]");
+        }
+    }
+}
+
+void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
+        const struct wined3d_shader_version *shader_version)
+{
+    DWORD write_mask = param->write_mask;
+
+    shader_dump_register(&param->reg, shader_version);
+
+    if (write_mask != WINED3DSP_WRITEMASK_ALL)
+    {
+        static const char *write_mask_chars = "xyzw";
+
+        TRACE(".");
+        if (write_mask & WINED3DSP_WRITEMASK_0) TRACE("%c", write_mask_chars[0]);
+        if (write_mask & WINED3DSP_WRITEMASK_1) TRACE("%c", write_mask_chars[1]);
+        if (write_mask & WINED3DSP_WRITEMASK_2) TRACE("%c", write_mask_chars[2]);
+        if (write_mask & WINED3DSP_WRITEMASK_3) TRACE("%c", write_mask_chars[3]);
+    }
+}
+
+void shader_dump_src_param(const struct wined3d_shader_src_param *param,
+        const struct wined3d_shader_version *shader_version)
+{
+    DWORD src_modifier = param->modifiers;
+    DWORD swizzle = param->swizzle;
+
+    if (src_modifier == WINED3DSPSM_NEG
+            || src_modifier == WINED3DSPSM_BIASNEG
+            || src_modifier == WINED3DSPSM_SIGNNEG
+            || src_modifier == WINED3DSPSM_X2NEG
+            || src_modifier == WINED3DSPSM_ABSNEG)
+        TRACE("-");
+    else if (src_modifier == WINED3DSPSM_COMP)
+        TRACE("1-");
+    else if (src_modifier == WINED3DSPSM_NOT)
+        TRACE("!");
+
+    if (src_modifier == WINED3DSPSM_ABS || src_modifier == WINED3DSPSM_ABSNEG)
+        TRACE("abs(");
+
+    shader_dump_register(&param->reg, shader_version);
+
+    if (src_modifier)
+    {
+        switch (src_modifier)
+        {
+            case WINED3DSPSM_NONE:    break;
+            case WINED3DSPSM_NEG:     break;
+            case WINED3DSPSM_NOT:     break;
+            case WINED3DSPSM_BIAS:    TRACE("_bias"); break;
+            case WINED3DSPSM_BIASNEG: TRACE("_bias"); break;
+            case WINED3DSPSM_SIGN:    TRACE("_bx2"); break;
+            case WINED3DSPSM_SIGNNEG: TRACE("_bx2"); break;
+            case WINED3DSPSM_COMP:    break;
+            case WINED3DSPSM_X2:      TRACE("_x2"); break;
+            case WINED3DSPSM_X2NEG:   TRACE("_x2"); break;
+            case WINED3DSPSM_DZ:      TRACE("_dz"); break;
+            case WINED3DSPSM_DW:      TRACE("_dw"); break;
+            case WINED3DSPSM_ABSNEG:  TRACE(")"); break;
+            case WINED3DSPSM_ABS:     TRACE(")"); break;
+            default:                  TRACE("_unknown_modifier(%#x)", src_modifier);
+        }
+    }
+
+    if (swizzle != WINED3DSP_NOSWIZZLE)
+    {
+        static const char *swizzle_chars = "xyzw";
+        DWORD swizzle_x = swizzle & 0x03;
+        DWORD swizzle_y = (swizzle >> 2) & 0x03;
+        DWORD swizzle_z = (swizzle >> 4) & 0x03;
+        DWORD swizzle_w = (swizzle >> 6) & 0x03;
+
+        if (swizzle_x == swizzle_y
+                && swizzle_x == swizzle_z
+                && swizzle_x == swizzle_w)
+        {
+            TRACE(".%c", swizzle_chars[swizzle_x]);
+        }
+        else
+        {
+            TRACE(".%c%c%c%c", swizzle_chars[swizzle_x], swizzle_chars[swizzle_y],
+                    swizzle_chars[swizzle_z], swizzle_chars[swizzle_w]);
+        }
+    }
+}
+
+/* Shared code in order to generate the bulk of the shader string.
+ * NOTE: A description of how to parse tokens can be found on MSDN. */
+void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
+        const shader_reg_maps *reg_maps, const DWORD *byte_code, void *backend_ctx)
+{
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
+    IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
+    const struct wined3d_shader_frontend *fe = shader->baseShader.frontend;
+    void *fe_data = shader->baseShader.frontend_data;
+    struct wined3d_shader_src_param src_rel_addr[4];
+    struct wined3d_shader_src_param src_param[4];
+    struct wined3d_shader_version shader_version;
+    struct wined3d_shader_src_param dst_rel_addr;
+    struct wined3d_shader_dst_param dst_param;
+    struct wined3d_shader_instruction ins;
+    struct wined3d_shader_context ctx;
+    const DWORD *ptr = byte_code;
+    DWORD i;
+
+    /* Initialize current parsing state. */
+    ctx.shader = iface;
+    ctx.gl_info = &device->adapter->gl_info;
+    ctx.reg_maps = reg_maps;
+    ctx.buffer = buffer;
+    ctx.backend_data = backend_ctx;
+
+    ins.ctx = &ctx;
+    ins.dst = &dst_param;
+    ins.src = src_param;
+    shader->baseShader.parse_state.current_row = 0;
+
+    fe->shader_read_header(fe_data, &ptr, &shader_version);
+
+    while (!fe->shader_is_end(fe_data, &ptr))
+    {
+        const char *comment;
+        UINT comment_size;
+        UINT param_size;
+
+        /* Skip comment tokens. */
+        fe->shader_read_comment(&ptr, &comment, &comment_size);
+        if (comment) continue;
+
+        /* Read opcode. */
+        fe->shader_read_opcode(fe_data, &ptr, &ins, &param_size);
+
+        /* Unknown opcode and its parameters. */
+        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
+        {
+            TRACE("Skipping unrecognized instruction.\n");
+            ptr += param_size;
+            continue;
+        }
+
+        /* Nothing to do. */
+        if (ins.handler_idx == WINED3DSIH_DCL
+                || ins.handler_idx == WINED3DSIH_NOP
+                || ins.handler_idx == WINED3DSIH_DEF
+                || ins.handler_idx == WINED3DSIH_DEFI
+                || ins.handler_idx == WINED3DSIH_DEFB
+                || ins.handler_idx == WINED3DSIH_PHASE)
+        {
+            ptr += param_size;
+            continue;
+        }
+
+        /* Destination token */
+        if (ins.dst_count) fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
+
+        /* Predication token */
+        if (ins.predicate) ins.predicate = *ptr++;
+
+        /* Other source tokens */
+        for (i = 0; i < ins.src_count; ++i)
+        {
+            fe->shader_read_src_param(fe_data, &ptr, &src_param[i], &src_rel_addr[i]);
+        }
+
+        /* Call appropriate function for output target */
+        device->shader_backend->shader_handle_instruction(&ins);
+    }
+}
+
+static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst)
+{
+    DWORD mmask = dst->modifiers;
+
+    switch (dst->shift)
+    {
+        case 0: break;
+        case 13: TRACE("_d8"); break;
+        case 14: TRACE("_d4"); break;
+        case 15: TRACE("_d2"); break;
+        case 1: TRACE("_x2"); break;
+        case 2: TRACE("_x4"); break;
+        case 3: TRACE("_x8"); break;
+        default: TRACE("_unhandled_shift(%d)", dst->shift); break;
+    }
+
+    if (mmask & WINED3DSPDM_SATURATE)         TRACE("_sat");
+    if (mmask & WINED3DSPDM_PARTIALPRECISION) TRACE("_pp");
+    if (mmask & WINED3DSPDM_MSAMPCENTROID)    TRACE("_centroid");
+
+    mmask &= ~(WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_MSAMPCENTROID);
+    if (mmask) FIXME("_unrecognized_modifier(%#x)", mmask);
+}
+
+static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *byte_code)
+{
+    struct wined3d_shader_version shader_version;
+    const DWORD *ptr = byte_code;
+    const char *type_prefix;
+    DWORD i;
+
+    TRACE("Parsing %p.\n", byte_code);
+
+    fe->shader_read_header(fe_data, &ptr, &shader_version);
+
+    switch (shader_version.type)
+    {
+        case WINED3D_SHADER_TYPE_VERTEX:
+            type_prefix = "vs";
+            break;
+
+        case WINED3D_SHADER_TYPE_GEOMETRY:
+            type_prefix = "gs";
+            break;
+
+        case WINED3D_SHADER_TYPE_PIXEL:
+            type_prefix = "ps";
+            break;
+
+        default:
+            FIXME("Unhandled shader type %#x.\n", shader_version.type);
+            type_prefix = "unknown";
+            break;
+    }
+
+    TRACE("%s_%u_%u\n", type_prefix, shader_version.major, shader_version.minor);
+
+    while (!fe->shader_is_end(fe_data, &ptr))
+    {
+        struct wined3d_shader_instruction ins;
+        const char *comment;
+        UINT comment_size;
+        UINT param_size;
+
+        /* comment */
+        fe->shader_read_comment(&ptr, &comment, &comment_size);
+        if (comment)
+        {
+            if (comment_size > 4 && *(const DWORD *)comment == WINEMAKEFOURCC('T', 'E', 'X', 'T'))
+            {
+                const char *end = comment + comment_size;
+                const char *ptr = comment + 4;
+                const char *line = ptr;
+
+                TRACE("// TEXT\n");
+                while (ptr != end)
+                {
+                    if (*ptr == '\n')
+                    {
+                        UINT len = ptr - line;
+                        if (len && *(ptr - 1) == '\r') --len;
+                        TRACE("// %s\n", debugstr_an(line, len));
+                        line = ++ptr;
+                    }
+                    else ++ptr;
+                }
+                if (line != ptr) TRACE("// %s\n", debugstr_an(line, ptr - line));
+            }
+            else TRACE("// %s\n", debugstr_an(comment, comment_size));
+            continue;
+        }
+
+        fe->shader_read_opcode(fe_data, &ptr, &ins, &param_size);
+        if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
+        {
+            TRACE("Skipping unrecognized instruction.\n");
+            ptr += param_size;
+            continue;
+        }
+
+        if (ins.handler_idx == WINED3DSIH_DCL)
+        {
+            struct wined3d_shader_semantic semantic;
+
+            fe->shader_read_semantic(&ptr, &semantic);
+
+            shader_dump_decl_usage(&semantic, &shader_version);
+            shader_dump_ins_modifiers(&semantic.reg);
+            TRACE(" ");
+            shader_dump_dst_param(&semantic.reg, &shader_version);
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEF)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+
+            TRACE("def c%u = %f, %f, %f, %f", shader_get_float_offset(dst.reg.type, dst.reg.idx),
+                    *(const float *)(ptr),
+                    *(const float *)(ptr + 1),
+                    *(const float *)(ptr + 2),
+                    *(const float *)(ptr + 3));
+            ptr += 4;
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEFI)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+
+            TRACE("defi i%u = %d, %d, %d, %d", dst.reg.idx,
+                    *(ptr),
+                    *(ptr + 1),
+                    *(ptr + 2),
+                    *(ptr + 3));
+            ptr += 4;
+        }
+        else if (ins.handler_idx == WINED3DSIH_DEFB)
+        {
+            struct wined3d_shader_src_param rel_addr;
+            struct wined3d_shader_dst_param dst;
+
+            fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr);
+
+            TRACE("defb b%u = %s", dst.reg.idx, *ptr ? "true" : "false");
+            ++ptr;
+        }
+        else
+        {
+            struct wined3d_shader_src_param dst_rel_addr, src_rel_addr;
+            struct wined3d_shader_dst_param dst_param;
+            struct wined3d_shader_src_param src_param;
+
+            if (ins.dst_count)
+            {
+                fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
+            }
+
+            /* Print out predication source token first - it follows
+             * the destination token. */
+            if (ins.predicate)
+            {
+                fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr);
+                TRACE("(");
+                shader_dump_src_param(&src_param, &shader_version);
+                TRACE(") ");
+            }
+
+            /* PixWin marks instructions with the coissue flag with a '+' */
+            if (ins.coissue) TRACE("+");
+
+            TRACE("%s", shader_opcode_names[ins.handler_idx]);
+
+            if (ins.handler_idx == WINED3DSIH_IFC
+                    || ins.handler_idx == WINED3DSIH_BREAKC)
+            {
+                switch (ins.flags)
+                {
+                    case COMPARISON_GT: TRACE("_gt"); break;
+                    case COMPARISON_EQ: TRACE("_eq"); break;
+                    case COMPARISON_GE: TRACE("_ge"); break;
+                    case COMPARISON_LT: TRACE("_lt"); break;
+                    case COMPARISON_NE: TRACE("_ne"); break;
+                    case COMPARISON_LE: TRACE("_le"); break;
+                    default: TRACE("_(%u)", ins.flags);
+                }
+            }
+            else if (ins.handler_idx == WINED3DSIH_TEX
+                    && shader_version.major >= 2
+                    && (ins.flags & WINED3DSI_TEXLD_PROJECT))
+            {
+                TRACE("p");
+            }
+
+            /* We already read the destination token, print it. */
+            if (ins.dst_count)
+            {
+                shader_dump_ins_modifiers(&dst_param);
+                TRACE(" ");
+                shader_dump_dst_param(&dst_param, &shader_version);
+            }
+
+            /* Other source tokens */
+            for (i = ins.dst_count; i < (ins.dst_count + ins.src_count); ++i)
+            {
+                fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr);
+                TRACE(!i ? " " : ", ");
+                shader_dump_src_param(&src_param, &shader_version);
+            }
+        }
+        TRACE("\n");
+    }
+}
+
+static void shader_cleanup(IWineD3DBaseShader *iface)
+{
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
+
+    ((IWineD3DDeviceImpl *)shader->baseShader.device)->shader_backend->shader_destroy(iface);
+    HeapFree(GetProcessHeap(), 0, shader->baseShader.reg_maps.constf);
+    HeapFree(GetProcessHeap(), 0, shader->baseShader.function);
+    shader_delete_constant_list(&shader->baseShader.constantsF);
+    shader_delete_constant_list(&shader->baseShader.constantsB);
+    shader_delete_constant_list(&shader->baseShader.constantsI);
+    list_remove(&shader->baseShader.shader_list_entry);
+
+    if (shader->baseShader.frontend && shader->baseShader.frontend_data)
+    {
+        shader->baseShader.frontend->shader_free(shader->baseShader.frontend_data);
+    }
+}
+
+static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins) {}
+static void shader_none_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS) {}
+static void shader_none_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {}
+static void shader_none_deselect_depth_blt(IWineD3DDevice *iface) {}
+static void shader_none_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
+static void shader_none_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
+static void shader_none_load_constants(const struct wined3d_context *context, char usePS, char useVS) {}
+static void shader_none_load_np2fixup_constants(IWineD3DDevice *iface, char usePS, char useVS) {}
+static void shader_none_destroy(IWineD3DBaseShader *iface) {}
+static HRESULT shader_none_alloc(IWineD3DDevice *iface) {return WINED3D_OK;}
+static void shader_none_free(IWineD3DDevice *iface) {}
+static BOOL shader_none_dirty_const(IWineD3DDevice *iface) {return FALSE;}
+
+static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *caps)
+{
+    /* Set the shader caps to 0 for the none shader backend */
+    caps->VertexShaderVersion = 0;
+    caps->PixelShaderVersion = 0;
+    caps->PixelShader1xMaxValue = 0.0f;
+}
+
+static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
+{
+    if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
+    {
+        TRACE("Checking support for fixup:\n");
+        dump_color_fixup_desc(fixup);
+    }
+
+    /* Faked to make some apps happy. */
+    if (!is_complex_fixup(fixup))
+    {
+        TRACE("[OK]\n");
+        return TRUE;
+    }
+
+    TRACE("[FAILED]\n");
+    return FALSE;
+}
+
+const shader_backend_t none_shader_backend = {
+    shader_none_handle_instruction,
+    shader_none_select,
+    shader_none_select_depth_blt,
+    shader_none_deselect_depth_blt,
+    shader_none_update_float_vertex_constants,
+    shader_none_update_float_pixel_constants,
+    shader_none_load_constants,
+    shader_none_load_np2fixup_constants,
+    shader_none_destroy,
+    shader_none_alloc,
+    shader_none_free,
+    shader_none_dirty_const,
+    shader_none_get_caps,
+    shader_none_color_fixup_supported,
+};
 
 static void shader_get_parent(IWineD3DBaseShaderImpl *shader, IUnknown **parent)
 {
index 64876b3..aa1da56 100644 (file)
@@ -641,9 +641,10 @@ static void shader_sm1_read_semantic(const DWORD **ptr, struct wined3d_shader_se
     shader_parse_dst_param(dst_token, NULL, &semantic->reg);
 }
 
-static void shader_sm1_read_comment(const DWORD **ptr, const char **comment)
+static void shader_sm1_read_comment(const DWORD **ptr, const char **comment, UINT *comment_size)
 {
     DWORD token = **ptr;
+    UINT size;
 
     if ((token & WINED3DSI_OPCODE_MASK) != WINED3D_SM1_OP_COMMENT)
     {
@@ -651,8 +652,10 @@ static void shader_sm1_read_comment(const DWORD **ptr, const char **comment)
         return;
     }
 
+    size = (token & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT;
     *comment = (const char *)++(*ptr);
-    *ptr += (token & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT;
+    *comment_size = size * sizeof(DWORD);
+    *ptr += size;
 }
 
 static BOOL shader_sm1_is_end(void *data, const DWORD **ptr)
index 91aa882..b463790 100644 (file)
@@ -49,10 +49,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
 enum wined3d_sm4_opcode
 {
     WINED3D_SM4_OP_ADD      = 0x00,
+    WINED3D_SM4_OP_BREAK    = 0x02,
+    WINED3D_SM4_OP_BREAKC   = 0x03,
+    WINED3D_SM4_OP_CUT      = 0x09,
     WINED3D_SM4_OP_DP3      = 0x10,
     WINED3D_SM4_OP_DP4      = 0x11,
+    WINED3D_SM4_OP_EMIT     = 0x13,
+    WINED3D_SM4_OP_ENDIF    = 0x15,
+    WINED3D_SM4_OP_ENDLOOP  = 0x16,
     WINED3D_SM4_OP_EXP      = 0x19,
+    WINED3D_SM4_OP_IADD     = 0x1e,
+    WINED3D_SM4_OP_IF       = 0x1f,
+    WINED3D_SM4_OP_IGE      = 0x21,
     WINED3D_SM4_OP_LOG      = 0x2f,
+    WINED3D_SM4_OP_LT       = 0x31,
     WINED3D_SM4_OP_MIN      = 0x33,
     WINED3D_SM4_OP_MAX      = 0x34,
     WINED3D_SM4_OP_MOV      = 0x36,
@@ -102,10 +112,20 @@ struct sysval_map
 static const struct wined3d_sm4_opcode_info opcode_table[] =
 {
     {WINED3D_SM4_OP_ADD,    WINED3DSIH_ADD,         1,  2},
+    {WINED3D_SM4_OP_BREAK,  WINED3DSIH_BREAK,       0,  0},
+    {WINED3D_SM4_OP_BREAKC, WINED3DSIH_BREAKP,      0,  1},
+    {WINED3D_SM4_OP_CUT,    WINED3DSIH_CUT,         0,  0},
     {WINED3D_SM4_OP_DP3,    WINED3DSIH_DP3,         1,  2},
     {WINED3D_SM4_OP_DP4,    WINED3DSIH_DP4,         1,  2},
+    {WINED3D_SM4_OP_EMIT,   WINED3DSIH_EMIT,        0,  0},
+    {WINED3D_SM4_OP_ENDIF,  WINED3DSIH_ENDIF,       0,  0},
+    {WINED3D_SM4_OP_ENDLOOP,WINED3DSIH_ENDLOOP,     0,  0},
     {WINED3D_SM4_OP_EXP,    WINED3DSIH_EXP,         1,  1},
+    {WINED3D_SM4_OP_IADD,   WINED3DSIH_IADD,        1,  2},
+    {WINED3D_SM4_OP_IF,     WINED3DSIH_IF,          0,  1},
+    {WINED3D_SM4_OP_IGE,    WINED3DSIH_IGE,         1,  2},
     {WINED3D_SM4_OP_LOG,    WINED3DSIH_LOG,         1,  1},
+    {WINED3D_SM4_OP_LT,     WINED3DSIH_LT,          1,  2},
     {WINED3D_SM4_OP_MIN,    WINED3DSIH_MIN,         1,  2},
     {WINED3D_SM4_OP_MAX,    WINED3DSIH_MAX,         1,  2},
     {WINED3D_SM4_OP_MOV,    WINED3DSIH_MOV,         1,  1},
@@ -386,9 +406,9 @@ static void shader_sm4_read_semantic(const DWORD **ptr, struct wined3d_shader_se
     FIXME("ptr %p, semantic %p stub!\n", ptr, semantic);
 }
 
-static void shader_sm4_read_comment(const DWORD **ptr, const char **comment)
+static void shader_sm4_read_comment(const DWORD **ptr, const char **comment, UINT *comment_size)
 {
-    FIXME("ptr %p, comment %p stub!\n", ptr, comment);
+    FIXME("ptr %p, comment %p, comment_size %p stub!\n", ptr, comment, comment_size);
     *comment = NULL;
 }
 
index adb426b..5efe069 100644 (file)
@@ -584,6 +584,10 @@ static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, stru
             glEnable(GL_DEPTH_CLAMP);
             checkGLcall("glEnable(GL_DEPTH_CLAMP)");
         }
+        else
+        {
+            FIXME("Clipping disabled, but ARB_depth_clamp isn't supported.\n");
+        }
     }
 
     if (enable & WINED3DCLIPPLANE0)  { glEnable(GL_CLIP_PLANE0);  checkGLcall("glEnable(clip plane 0)"); }
@@ -3523,7 +3527,6 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine
     if(stateblock->textures[sampler]) {
         BOOL srgb = stateblock->samplerState[sampler][WINED3DSAMP_SRGBTEXTURE];
         IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) stateblock->textures[sampler];
-        tex_impl->baseTexture.internal_preload(stateblock->textures[sampler], srgb ? SRGB_SRGB : SRGB_RGB);
         IWineD3DBaseTexture_BindTexture(stateblock->textures[sampler], srgb);
         basetexture_apply_state_changes(stateblock->textures[sampler],
                 stateblock->textureState[sampler], stateblock->samplerState[sampler], gl_info);
@@ -3597,9 +3600,9 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w
         }
     } else {
         /* Disabled the pixel shader - color ops weren't applied
-         * while it was enabled, so re-apply them.
-         */
-        for(i=0; i < MAX_TEXTURES; i++) {
+         * while it was enabled, so re-apply them. */
+        for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
+        {
             if(!isStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP))) {
                 device->StateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)].apply
                         (STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock, context);
@@ -3880,62 +3883,18 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
     glLoadIdentity();
     checkGLcall("glLoadIdentity");
 
-    if(context->last_was_rhw) {
-        double X, Y, height, width, minZ, maxZ;
-
-        X      = stateblock->viewport.X;
-        Y      = stateblock->viewport.Y;
-        height = stateblock->viewport.Height;
-        width  = stateblock->viewport.Width;
-        minZ   = stateblock->viewport.MinZ;
-        maxZ   = stateblock->viewport.MaxZ;
+    if (context->last_was_rhw)
+    {
+        double x = stateblock->viewport.X;
+        double y = stateblock->viewport.Y;
+        double w = stateblock->viewport.Width;
+        double h = stateblock->viewport.Height;
 
-        if (!stateblock->device->untransformed)
-        {
-            /* Transformed vertices are supposed to bypass the whole transform pipeline including
-             * frustum clipping. This can't be done in opengl, so this code adjusts the Z range to
-             * suppress depth clipping. This can be done because it is an orthogonal projection and
-             * the Z coordinate does not affect the size of the primitives. Half Life 1 and Prince of
-             * Persia 3D need this.
-             *
-             * Note that using minZ and maxZ here doesn't entirely fix the problem, since view frustum
-             * clipping is still enabled, but it seems to fix it for all apps tested so far. A minor
-             * problem can be witnessed in half-life 1 engine based games, the weapon is clipped close
-             * to the viewer.
-             *
-             * Also note that this breaks z comparison against z values filled in with clear,
-             * but no app depending on that and disabled clipping has been found yet. Comparing
-             * primitives against themselves works, so the Z buffer is still intact for normal hidden
-             * surface removal.
-             *
-             * We could disable clipping entirely by setting the near to infinity and far to -infinity,
-             * but this would break Z buffer operation. Raising the range to something less than
-             * infinity would help a bit at the cost of Z precision, but it wouldn't eliminate the
-             * problem either.
-             */
-            TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
-            if (context->render_offscreen)
-            {
-                glOrtho(X, X + width, -Y, -Y - height, -minZ, -maxZ);
-            } else {
-                glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
-            }
-        } else {
-            /* If the app mixes transformed and untransformed primitives we can't use the coordinate system
-             * trick above because this would mess up transformed and untransformed Z order. Pass the z position
-             * unmodified to opengl.
-             *
-             * If the app depends on mixed types and disabled clipping we're out of luck without a pipeline
-             * replacement shader.
-             */
-            TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, 1.0, -1.0);
-            if (context->render_offscreen)
-            {
-                glOrtho(X, X + width, -Y, -Y - height, 0.0, -1.0);
-            } else {
-                glOrtho(X, X + width, Y + height, Y, 0.0, -1.0);
-            }
-        }
+        TRACE("Calling glOrtho with x %.8e, y %.8e, w %.8e, h %.8e.\n", x, y, w, h);
+        if (context->render_offscreen)
+            glOrtho(x, x + w, -y, -y - h, 0.0, -1.0);
+        else
+            glOrtho(x, x + w, y + h, y, 0.0, -1.0);
         checkGLcall("glOrtho");
 
         /* Window Coord 0 is the middle of the first pixel, so translate by 1/2 pixels */
@@ -4167,7 +4126,7 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock,
                     GL_EXTCALL(glVertexAttrib4NubvARB(i, ptr));
                     break;
                 case WINED3DFMT_B8G8R8A8_UNORM:
-                    if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+                    if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
                     {
                         const DWORD *src = (const DWORD *)ptr;
                         DWORD c = *src & 0xff00ff00;
@@ -4479,87 +4438,11 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
     loadTexCoords(context, stateblock, si, &curVBO);
 }
 
-static inline void drawPrimitiveTraceDataLocations(const struct wined3d_stream_info *dataLocations)
-{
-    /* Dump out what parts we have supplied */
-    TRACE("Strided Data:\n");
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_POSITION);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_BLENDWEIGHT);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_BLENDINDICES);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_NORMAL);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_PSIZE);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_DIFFUSE);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_SPECULAR);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD0);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD1);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD2);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD3);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD4);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD5);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD6);
-    TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD7);
-}
-
 static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
 {
-    const struct wined3d_gl_info *gl_info = context->gl_info;
     IWineD3DDeviceImpl *device = stateblock->device;
-    BOOL fixup = FALSE;
-    struct wined3d_stream_info *dataLocations = &device->strided_streams;
-    BOOL useVertexShaderFunction;
-    BOOL load_numbered = FALSE;
-    BOOL load_named = FALSE;
-
-    useVertexShaderFunction = (device->vs_selected_mode != SHADER_NONE && stateblock->vertexShader) ? TRUE : FALSE;
-
-    if(device->up_strided) {
-        /* Note: this is a ddraw fixed-function code path */
-        TRACE("================ Strided Input ===================\n");
-        device_stream_info_from_strided(gl_info, device->up_strided, dataLocations);
-
-        if(TRACE_ON(d3d)) {
-            drawPrimitiveTraceDataLocations(dataLocations);
-        }
-    } else {
-        /* Note: This is a fixed function or shader codepath.
-         * This means it must handle both types of strided data.
-         * Shaders must go through here to zero the strided data, even if they
-         * don't set any declaration at all
-         */
-        TRACE("================ Vertex Declaration  ===================\n");
-        device_stream_info_from_declaration(device, useVertexShaderFunction, dataLocations, &fixup);
-    }
-
-    if (dataLocations->position_transformed) useVertexShaderFunction = FALSE;
-
-    if(useVertexShaderFunction) {
-        if(((IWineD3DVertexDeclarationImpl *) stateblock->vertexDecl)->half_float_conv_needed && !fixup) {
-            TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion\n");
-            device->useDrawStridedSlow = TRUE;
-        } else {
-            load_numbered = TRUE;
-            device->useDrawStridedSlow = FALSE;
-        }
-    }
-    else
-    {
-        WORD slow_mask = (1 << WINED3D_FFP_PSIZE);
-        slow_mask |= -!gl_info->supported[EXT_VERTEX_ARRAY_BGRA]
-                & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR));
-
-        if (fixup || (!dataLocations->position_transformed
-                && !(dataLocations->use_map & slow_mask)))
-        {
-            /* Load the vertex data using named arrays */
-            load_named = TRUE;
-            device->useDrawStridedSlow = FALSE;
-        }
-        else
-        {
-            TRACE("Not loading vertex data\n");
-            device->useDrawStridedSlow = TRUE;
-        }
-    }
+    BOOL load_numbered = use_vs(stateblock) && !device->useDrawStridedSlow;
+    BOOL load_named = !use_vs(stateblock) && !device->useDrawStridedSlow;
 
     if (context->numberedArraysLoaded && !load_numbered)
     {
@@ -4576,13 +4459,13 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi
     if (load_numbered)
     {
         TRACE("Loading numbered arrays\n");
-        loadNumberedArrays(stateblock, dataLocations, context);
+        loadNumberedArrays(stateblock, &device->strided_streams, context);
         context->numberedArraysLoaded = TRUE;
     }
     else if (load_named)
     {
         TRACE("Loading vertex data\n");
-        loadVertexData(context, stateblock, dataLocations);
+        loadVertexData(context, stateblock, &device->strided_streams);
         context->namedArraysLoaded = TRUE;
     }
 }
@@ -5634,8 +5517,7 @@ static const struct StateEntryTemplate ffp_fragmentstate_template[] = {
 /* Context activation is done by the caller. */
 static void ffp_enable(IWineD3DDevice *iface, BOOL enable) { }
 
-static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype,
-        const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
+static void ffp_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
 {
     pCaps->TextureOpCaps =  WINED3DTEXOPCAPS_ADD         |
                             WINED3DTEXOPCAPS_ADDSIGNED   |
@@ -5670,7 +5552,7 @@ static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype,
     if (gl_info->supported[ARB_TEXTURE_ENV_DOT3])
         pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_DOTPRODUCT3;
 
-    pCaps->MaxTextureBlendStages = gl_info->limits.texture_stages;
+    pCaps->MaxTextureBlendStages = gl_info->limits.textures;
     pCaps->MaxSimultaneousTextures = gl_info->limits.textures;
 }
 
@@ -5725,6 +5607,43 @@ static void multistate_apply_3(DWORD state, IWineD3DStateBlockImpl *stateblock,
     stateblock->device->multistate_funcs[state][2](state, stateblock, context);
 }
 
+static void prune_invalid_states(struct StateEntry *state_table, const struct wined3d_gl_info *gl_info)
+{
+    unsigned int start, last, i;
+
+    start = STATE_TEXTURESTAGE(gl_info->limits.texture_stages, 0);
+    last = STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE);
+    for (i = start; i <= last; ++i)
+    {
+        state_table[i].representative = 0;
+        state_table[i].apply = state_undefined;
+    }
+
+    start = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + gl_info->limits.texture_stages);
+    last = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + MAX_TEXTURES - 1);
+    for (i = start; i <= last; ++i)
+    {
+        state_table[i].representative = 0;
+        state_table[i].apply = state_undefined;
+    }
+}
+
+static void validate_state_table(struct StateEntry *state_table)
+{
+    unsigned int i;
+
+    for (i = 0; i < STATE_HIGHEST + 1; ++i)
+    {
+        DWORD rep = state_table[i].representative;
+        if (rep && !state_table[rep].representative)
+        {
+            ERR("State %s (%#x) has invalid representative %s (%#x).\n",
+                    debug_d3dstate(i), i, debug_d3dstate(rep), rep);
+            state_table[i].representative = 0;
+        }
+    }
+}
+
 HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_multistate_funcs,
         const struct wined3d_gl_info *gl_info, const struct StateEntryTemplate *vertex,
         const struct fragment_pipeline *fragment, const struct StateEntryTemplate *misc)
@@ -5824,6 +5743,9 @@ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_
         }
     }
 
+    prune_invalid_states(StateTable, gl_info);
+    validate_state_table(StateTable);
+
     return WINED3D_OK;
 
 out_of_mem:
index 8dcc691..d17d35c 100644 (file)
@@ -1253,6 +1253,37 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
     TRACE("Updated target %d\n", This->texture_target);
 }
 
+/* Context activation is done by the caller. */
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb)
+{
+    DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
+    GLenum format, internal, type;
+    GLsizei width, height;
+    CONVERT_TYPES convert;
+    int bpp;
+
+    if (surface->Flags & alloc_flag) return;
+
+    d3dfmt_get_conv(surface, TRUE, TRUE, &format, &internal, &type, &convert, &bpp, srgb);
+    if(convert != NO_CONVERSION) surface->Flags |= SFLAG_CONVERTED;
+    else surface->Flags &= ~SFLAG_CONVERTED;
+
+    if ((surface->Flags & SFLAG_NONPOW2) && !(surface->Flags & SFLAG_OVERSIZE))
+    {
+        width = surface->pow2Width;
+        height = surface->pow2Height;
+    }
+    else
+    {
+        width = surface->glRect.right - surface->glRect.left;
+        height = surface->glRect.bottom - surface->glRect.top;
+    }
+
+    surface_bind_and_dirtify(surface, srgb);
+    surface_allocate_surface(surface, internal, width, height, format, type);
+    surface->Flags |= alloc_flag;
+}
+
 static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
 {
     IWineD3DDeviceImpl *device = This->resource.device;
@@ -1822,7 +1853,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
              * in which the main render target uses p8. Some games like GTA Vice City use P8 for texturing which
              * conflicts with this.
              */
-            if (!(gl_info->supported[EXT_PALETTED_TEXTURE] || (gl_info->supported[ARB_FRAGMENT_PROGRAM]
+            if (!(gl_info->supported[EXT_PALETTED_TEXTURE] || (device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)
                     && device->render_targets && This == (IWineD3DSurfaceImpl*)device->render_targets[0]))
                     || colorkey_active || !use_texturing)
             {
@@ -1836,7 +1867,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
                     *convert = CONVERT_PALETTED;
                 }
             }
-            else if (!gl_info->supported[EXT_PALETTED_TEXTURE] && gl_info->supported[ARB_FRAGMENT_PROGRAM])
+            else if (!gl_info->supported[EXT_PALETTED_TEXTURE] && device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup))
             {
                 *format = GL_ALPHA;
                 *type = GL_UNSIGNED_BYTE;
@@ -2553,34 +2584,10 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve
          * The 8bit pixel data will be used as an index in this palette texture to retrieve the final color. */
         TRACE("Using fragment shaders for emulating 8-bit paletted texture support\n");
 
-        ENTER_GL();
-
-        /* Create the fragment program if we don't have it */
-        if(!device->paletteConversionShader)
-        {
-            const char *fragment_palette_conversion =
-                "!!ARBfp1.0\n"
-                "TEMP index;\n"
-                /* { 255/256, 0.5/255*255/256, 0, 0 } */
-                "PARAM constants = { 0.996, 0.00195, 0, 0 };\n"
-                /* The alpha-component contains the palette index */
-                "TEX index, fragment.texcoord[0], texture[0], 2D;\n"
-                /* Scale the index by 255/256 and add a bias of '0.5' in order to sample in the middle */
-                "MAD index.a, index.a, constants.x, constants.y;\n"
-                /* Use the alpha-component as an index in the palette to get the final color */
-                "TEX result.color, index.a, texture[1], 1D;\n"
-                "END";
-
-            glEnable(GL_FRAGMENT_PROGRAM_ARB);
-            GL_EXTCALL(glGenProgramsARB(1, &device->paletteConversionShader));
-            GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, device->paletteConversionShader));
-            GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(fragment_palette_conversion), fragment_palette_conversion));
-            glDisable(GL_FRAGMENT_PROGRAM_ARB);
-        }
-
-        glEnable(GL_FRAGMENT_PROGRAM_ARB);
-        GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, device->paletteConversionShader));
+        device->blitter->set_shader((IWineD3DDevice *) device, This->resource.format_desc,
+                This->texture_target, This->pow2Width, This->pow2Height);
 
+        ENTER_GL();
         GL_EXTCALL(glActiveTextureARB(GL_TEXTURE1));
         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
 
@@ -2594,7 +2601,6 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve
 
         /* Rebind the texture because it isn't bound anymore */
         glBindTexture(This->texture_target, This->texture_name);
-
         LEAVE_GL();
     }
 }
@@ -2700,7 +2706,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO
 static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) {
     /* TODO: check for locks */
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
-    IWineD3DDeviceImpl *device = This->resource.device;
     IWineD3DBaseTexture *baseTexture = NULL;
 
     TRACE("(%p)Checking to see if the container is a base texture\n", This);
@@ -2711,13 +2716,11 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL
     }
     else
     {
-        struct wined3d_context *context = NULL;
         GLuint *name;
 
         TRACE("(%p) : Binding surface\n", This);
 
         name = srgb ? &This->texture_name_srgb : &This->texture_name;
-        if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
 
         ENTER_GL();
 
@@ -2751,8 +2754,6 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL
         checkGLcall("glBindTexture");
 
         LEAVE_GL();
-
-        if (context) context_release(context);
     }
 }
 
@@ -3447,6 +3448,9 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
     }
 
     LEAVE_GL();
+
+    wglFlush(); /* Flush to ensure ordering across contexts. */
+
     context_release(context);
 
     /* The texture is now most up to date - If the surface is a render target and has a drawable, this
@@ -3921,9 +3925,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
         /* Leave the opengl state valid for blitting */
         myDevice->blitter->unset_shader((IWineD3DDevice *) myDevice);
 
-        /* Flush in case the drawable is used by multiple GL contexts */
-        if(dstSwapchain && (This == (IWineD3DSurfaceImpl *) dstSwapchain->frontBuffer || dstSwapchain->num_contexts >= 2))
-            wglFlush();
+        wglFlush(); /* Flush to ensure ordering across contexts. */
 
         context_release(context);
 
@@ -4552,7 +4554,11 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co
             else context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
 
             LEAVE_GL();
-        } else {
+
+            wglFlush(); /* Flush to ensure ordering across contexts. */
+        }
+        else
+        {
             FIXME("No up to date depth stencil location\n");
         }
     } else if (location == SFLAG_DS_ONSCREEN) {
@@ -4569,7 +4575,11 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co
             if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
 
             LEAVE_GL();
-        } else {
+
+            wglFlush(); /* Flush to ensure ordering across contexts. */
+        }
+        else
+        {
             FIXME("No up to date depth stencil location\n");
         }
     } else {
@@ -4656,11 +4666,10 @@ static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float
 static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT *rect_in)
 {
     IWineD3DDeviceImpl *device = This->resource.device;
+    IWineD3DBaseTextureImpl *texture;
     struct wined3d_context *context;
     struct coords coords[4];
     RECT rect;
-    IWineD3DSwapChain *swapchain;
-    IWineD3DBaseTexture *texture;
     GLenum bind_target;
     struct float_rect f;
 
@@ -4802,25 +4811,16 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT
 
     LEAVE_GL();
 
-    if(SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DSwapChain, (void **) &swapchain)))
-    {
-        /* Make sure to flush the buffers. This is needed in apps like Red Alert II and Tiberian SUN that use multiple WGL contexts. */
-        if(((IWineD3DSwapChainImpl*)swapchain)->frontBuffer == (IWineD3DSurface*)This ||
-           ((IWineD3DSwapChainImpl*)swapchain)->num_contexts >= 2)
-            wglFlush();
+    wglFlush(); /* Flush to ensure ordering across contexts. */
 
-        IWineD3DSwapChain_Release(swapchain);
-    } else {
-        /* We changed the filtering settings on the texture. Inform the container about this to get the filters
-         * reset properly next draw
-         */
-        if(SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DBaseTexture, (void **) &texture)))
-        {
-            ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
-            ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
-            ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
-            IWineD3DBaseTexture_Release(texture);
-        }
+    /* We changed the filtering settings on the texture. Inform the
+     * container about this to get the filters reset properly next draw. */
+    if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)This, &IID_IWineD3DBaseTexture, (void **)&texture)))
+    {
+        texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
+        texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
+        texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
+        IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture);
     }
 
     context_release(context);
@@ -4977,7 +4977,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
         {
             /* Upload from system memory */
             BOOL srgb = flag == SFLAG_INSRGBTEX;
-            DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
             struct wined3d_context *context = NULL;
 
             d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */,
@@ -5004,6 +5003,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
             }
 
             if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+
+            surface_prepare_texture(This, srgb);
             surface_bind_and_dirtify(This, srgb);
 
             if(This->CKeyFlags & WINEDDSD_CKSRCBLT) {
@@ -5037,17 +5038,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
                     return WINED3DERR_OUTOFVIDEOMEMORY;
                 }
                 d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This);
-
-                This->Flags |= SFLAG_CONVERTED;
             }
             else if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
-                    && (gl_info->supported[EXT_PALETTED_TEXTURE] || gl_info->supported[ARB_FRAGMENT_PROGRAM]))
+                    && (gl_info->supported[EXT_PALETTED_TEXTURE] || device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)))
             {
                 d3dfmt_p8_upload_palette(iface, convert);
-                This->Flags &= ~SFLAG_CONVERTED;
                 mem = This->resource.allocatedMemory;
             } else {
-                This->Flags &= ~SFLAG_CONVERTED;
                 mem = This->resource.allocatedMemory;
             }
 
@@ -5058,10 +5055,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
 
             if ((This->Flags & SFLAG_NONPOW2) && !(This->Flags & SFLAG_OVERSIZE)) {
                 TRACE("non power of two support\n");
-                if(!(This->Flags & alloc_flag)) {
-                    surface_allocate_surface(This, internal, This->pow2Width, This->pow2Height, format, type);
-                    This->Flags |= alloc_flag;
-                }
                 if (mem || (This->Flags & SFLAG_PBO)) {
                     surface_upload_data(This, internal, This->currentDesc.Width, This->currentDesc.Height, format, type, mem);
                 }
@@ -5069,10 +5062,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
                 /* When making the realloc conditional, keep in mind that GL_APPLE_client_storage may be in use, and This->resource.allocatedMemory
                  * changed. So also keep track of memory changes. In this case the texture has to be reallocated
                  */
-                if(!(This->Flags & alloc_flag)) {
-                    surface_allocate_surface(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type);
-                    This->Flags |= alloc_flag;
-                }
                 if (mem || (This->Flags & SFLAG_PBO)) {
                     surface_upload_data(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type, mem);
                 }
index 6493704..cbdb961 100644 (file)
@@ -217,6 +217,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
     unsigned int sync;
     int retval;
 
+    IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride);
+
     context = context_acquire(This->device, This->backBuffer[0], CTXUSAGE_RESOURCELOAD);
 
     /* Render the cursor onto the back buffer, using our nifty directdraw blitting code :-) */
@@ -272,12 +274,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
         IWineD3DSurface_BltFast(This->backBuffer[0], 0, 0, This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY);
     }
 
-    TRACE("presetting HDC %p\n", This->context[0]->hdc);
-
-    /* Don't call checkGLcall, as glGetError is not applicable here */
-    if (hDestWindowOverride && This->win_handle != hDestWindowOverride) {
-        IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride);
-    }
+    TRACE("Presenting HDC %p.\n", context->hdc);
 
     render_to_fbo = This->render_to_fbo;
 
@@ -343,7 +340,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
         swapchain_blit(This, context, &src_rect, &dst_rect);
     }
 
-    SwapBuffers(This->context[0]->hdc); /* TODO: cycle through the swapchain buffers */
+    if (This->num_contexts > 1) wglFinish();
+    SwapBuffers(context->hdc); /* TODO: cycle through the swapchain buffers */
 
     TRACE("SwapBuffers called, Starting new frame\n");
     /* FPS support */
@@ -521,7 +519,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapCh
     WINED3DLOCKED_RECT r;
     BYTE *mem;
 
-    if(window == This->win_handle) return WINED3D_OK;
+    if (!window || window == This->win_handle) return WINED3D_OK;
 
     TRACE("Performing dest override of swapchain %p from window %p to %p\n", This, This->win_handle, window);
     if (This->context[0] == This->device->contexts[0])
@@ -913,10 +911,15 @@ err:
         HeapFree(GetProcessHeap(), 0, swapchain->backBuffer);
     }
 
-    if (swapchain->context && swapchain->context[0])
+    if (swapchain->context)
     {
-        context_release(swapchain->context[0]);
-        context_destroy(device, swapchain->context[0]);
+        if (swapchain->context[0])
+        {
+            context_release(swapchain->context[0]);
+            context_destroy(device, swapchain->context[0]);
+            swapchain->num_contexts = 0;
+        }
+        HeapFree(GetProcessHeap(), 0, swapchain->context);
     }
 
     if (swapchain->frontBuffer) IWineD3DSurface_Release(swapchain->frontBuffer);
index c1e921d..2ff1675 100644 (file)
@@ -387,7 +387,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
             GL_RGBA,                    GL_UNSIGNED_INT_8_8_8_8_REV,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
-    {WINED3DFMT_R16G16_UNORM,           GL_RGB16_EXT,                     GL_RGB16_EXT,               GL_RGBA16_EXT,
+    {WINED3DFMT_R16G16_UNORM,           GL_RGB16,                         GL_RGB16,                       GL_RGBA16,
             GL_RGB,                     GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
@@ -395,7 +395,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
             GL_BGRA,                    GL_UNSIGNED_INT_2_10_10_10_REV,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
-    {WINED3DFMT_R16G16B16A16_UNORM,     GL_RGBA16_EXT,                    GL_RGBA16_EXT,                          0,
+    {WINED3DFMT_R16G16B16A16_UNORM,     GL_RGBA16,                        GL_RGBA16,                              0,
             GL_RGBA,                    GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
             WINED3D_GL_EXT_NONE},
@@ -445,7 +445,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
             GL_RGBA,                    GL_BYTE,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             NV_TEXTURE_SHADER},
-    {WINED3DFMT_R16G16_SNORM,           GL_RGB16_EXT,                     GL_RGB16_EXT,                           0,
+    {WINED3DFMT_R16G16_SNORM,           GL_RGB16,                         GL_RGB16,                               0,
             GL_BGR,                     GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
@@ -506,7 +506,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
             GL_DEPTH_COMPONENT,         GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
             ARB_DEPTH_TEXTURE},
-    {WINED3DFMT_L16_UNORM,              GL_LUMINANCE16_EXT,               GL_LUMINANCE16_EXT,                     0,
+    {WINED3DFMT_L16_UNORM,              GL_LUMINANCE16,                   GL_LUMINANCE16,                         0,
             GL_LUMINANCE,               GL_UNSIGNED_SHORT,
             WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_EXT_NONE},
@@ -950,7 +950,7 @@ static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3
     if(wined3d_settings.offscreen_rendering_mode != ORM_FBO)
     {
         WARN("No FBO support, or no FBO ORM, guessing filter info from GL caps\n");
-        if (vendor == VENDOR_NVIDIA && gl_info->supported[ARB_TEXTURE_FLOAT])
+        if (vendor == HW_VENDOR_NVIDIA && gl_info->supported[ARB_TEXTURE_FLOAT])
         {
             TRACE("Nvidia card with texture_float support: Assuming float16 blending\n");
             filtered = TRUE;
@@ -1088,17 +1088,20 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info)
     if (!gl_info->supported[APPLE_YCBCR_422])
     {
         idx = getFmtIdx(WINED3DFMT_YUY2);
-        gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YUY2);
+        gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YUY2);
 
         idx = getFmtIdx(WINED3DFMT_UYVY);
-        gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_UYVY);
+        gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_UYVY);
     }
 
     idx = getFmtIdx(WINED3DFMT_YV12);
     gl_info->gl_formats[idx].heightscale = 1.5f;
-    gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YV12);
+    gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12);
 
-    if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA])
+    idx = getFmtIdx(WINED3DFMT_P8_UINT);
+    gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8);
+
+    if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
     {
         idx = getFmtIdx(WINED3DFMT_B8G8R8A8_UNORM);
         gl_info->gl_formats[idx].gl_vtx_format = GL_BGRA;
@@ -1786,6 +1789,51 @@ const char* debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) {
     }
 }
 
+const char *debug_d3dstate(DWORD state)
+{
+    if (STATE_IS_RENDER(state))
+        return wine_dbg_sprintf("STATE_RENDER(%s)", debug_d3drenderstate(state - STATE_RENDER(0)));
+    if (STATE_IS_TEXTURESTAGE(state))
+    {
+        DWORD texture_stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
+        DWORD texture_state = state - STATE_TEXTURESTAGE(texture_stage, 0);
+        return wine_dbg_sprintf("STATE_TEXTURESTAGE(%#x, %s)",
+                texture_stage, debug_d3dtexturestate(texture_state));
+    }
+    if (STATE_IS_SAMPLER(state))
+        return wine_dbg_sprintf("STATE_SAMPLER(%#x)", state - STATE_SAMPLER(0));
+    if (STATE_IS_PIXELSHADER(state))
+        return "STATE_PIXELSHADER";
+    if (STATE_IS_TRANSFORM(state))
+        return wine_dbg_sprintf("STATE_TRANSFORM(%s)", debug_d3dtstype(state - STATE_TRANSFORM(0)));
+    if (STATE_IS_STREAMSRC(state))
+        return "STATE_STREAMSRC";
+    if (STATE_IS_INDEXBUFFER(state))
+        return "STATE_INDEXBUFFER";
+    if (STATE_IS_VDECL(state))
+        return "STATE_VDECL";
+    if (STATE_IS_VSHADER(state))
+        return "STATE_VSHADER";
+    if (STATE_IS_VIEWPORT(state))
+        return "STATE_VIEWPORT";
+    if (STATE_IS_VERTEXSHADERCONSTANT(state))
+        return "STATE_VERTEXSHADERCONSTANT";
+    if (STATE_IS_PIXELSHADERCONSTANT(state))
+        return "STATE_PIXELSHADERCONSTANT";
+    if (STATE_IS_ACTIVELIGHT(state))
+        return wine_dbg_sprintf("STATE_ACTIVELIGHT(%#x)", state - STATE_ACTIVELIGHT(0));
+    if (STATE_IS_SCISSORRECT(state))
+        return "STATE_SCISSORRECT";
+    if (STATE_IS_CLIPPLANE(state))
+        return wine_dbg_sprintf("STATE_CLIPPLANE(%#x)", state - STATE_CLIPPLANE(0));
+    if (STATE_IS_MATERIAL(state))
+        return "STATE_MATERIAL";
+    if (STATE_IS_FRONTFACE(state))
+        return "STATE_FRONTFACE";
+
+    return wine_dbg_sprintf("UNKNOWN_STATE(%#x)", state);
+}
+
 const char* debug_d3dpool(WINED3DPOOL Pool) {
   switch (Pool) {
 #define POOL_TO_STR(p) case p: return #p
@@ -1868,8 +1916,8 @@ static const char *debug_fixup_channel_source(enum fixup_channel_source source)
         WINED3D_TO_STR(CHANNEL_SOURCE_Y);
         WINED3D_TO_STR(CHANNEL_SOURCE_Z);
         WINED3D_TO_STR(CHANNEL_SOURCE_W);
-        WINED3D_TO_STR(CHANNEL_SOURCE_YUV0);
-        WINED3D_TO_STR(CHANNEL_SOURCE_YUV1);
+        WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX0);
+        WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX1);
 #undef WINED3D_TO_STR
         default:
             FIXME("Unrecognized fixup_channel_source %#x\n", source);
@@ -1877,26 +1925,27 @@ static const char *debug_fixup_channel_source(enum fixup_channel_source source)
     }
 }
 
-static const char *debug_yuv_fixup(enum yuv_fixup yuv_fixup)
+static const char *debug_complex_fixup(enum complex_fixup fixup)
 {
-    switch(yuv_fixup)
+    switch(fixup)
     {
 #define WINED3D_TO_STR(x) case x: return #x
-        WINED3D_TO_STR(YUV_FIXUP_YUY2);
-        WINED3D_TO_STR(YUV_FIXUP_UYVY);
-        WINED3D_TO_STR(YUV_FIXUP_YV12);
+        WINED3D_TO_STR(COMPLEX_FIXUP_YUY2);
+        WINED3D_TO_STR(COMPLEX_FIXUP_UYVY);
+        WINED3D_TO_STR(COMPLEX_FIXUP_YV12);
+        WINED3D_TO_STR(COMPLEX_FIXUP_P8);
 #undef WINED3D_TO_STR
         default:
-            FIXME("Unrecognized YUV fixup %#x\n", yuv_fixup);
+            FIXME("Unrecognized complex fixup %#x\n", fixup);
             return "unrecognized";
     }
 }
 
 void dump_color_fixup_desc(struct color_fixup_desc fixup)
 {
-    if (is_yuv_fixup(fixup))
+    if (is_complex_fixup(fixup))
     {
-        TRACE("\tYUV: %s\n", debug_yuv_fixup(get_yuv_fixup(fixup)));
+        TRACE("\tComplex: %s\n", debug_complex_fixup(get_complex_fixup(fixup)));
         return;
     }
 
@@ -2795,40 +2844,3 @@ void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected,
     else if (gl_info->supported[ATI_FRAGMENT_SHADER]) *ps_selected = SHADER_ATI;
     else *ps_selected = SHADER_NONE;
 }
-
-const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type)
-{
-    int vs_selected_mode, ps_selected_mode;
-
-    select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
-    if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend;
-    if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend;
-    return &none_shader_backend;
-}
-
-const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter,
-        WINED3DDEVTYPE device_type)
-{
-    const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-    int vs_selected_mode, ps_selected_mode;
-
-    select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
-    if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
-            && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_fragment_pipeline;
-    else if (ps_selected_mode == SHADER_ATI) return &atifs_fragment_pipeline;
-    else if (gl_info->supported[NV_REGISTER_COMBINERS]
-            && gl_info->supported[NV_TEXTURE_SHADER2]) return &nvts_fragment_pipeline;
-    else if (gl_info->supported[NV_REGISTER_COMBINERS]) return &nvrc_fragment_pipeline;
-    else return &ffp_fragment_pipeline;
-}
-
-const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type)
-{
-    const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-    int vs_selected_mode, ps_selected_mode;
-
-    select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
-    if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL)
-            && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_blit;
-    else return &ffp_blit;
-}
index 7262e66..5a42ff6 100644 (file)
@@ -16,7 +16,6 @@
 
        <file>ati_fragment_shader.c</file>
        <file>arb_program_shader.c</file>
-       <file>baseshader.c</file>
        <file>basetexture.c</file>
        <file>buffer.c</file>
        <file>clipper.c</file>
index d6d9794..f8097d6 100644 (file)
@@ -75,6 +75,9 @@ typedef double          GLclampd;
 typedef void            GLvoid;
 typedef ptrdiff_t       GLintptr;
 typedef ptrdiff_t       GLsizeiptr;
+typedef INT64           GLint64;
+typedef UINT64          GLuint64;
+typedef struct __GLsync *GLsync;
 
 /* Booleans */
 #define GL_FALSE                                0x0
@@ -804,6 +807,197 @@ typedef ptrdiff_t       GLsizeiptr;
 #define GL_SAMPLE_COVERAGE_INVERT         0x80AB
 #define GL_MULTISAMPLE_BIT                0x20000000
 
+/* GL_VERSION_2_0 */
+#ifndef GL_VERSION_2_0
+#define GL_VERSION_2_0 1
+#define GL_BLEND_EQUATION_RGB                               GL_BLEND_EQUATION
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED                      0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE                         0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE                       0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE                         0x8625
+#define GL_CURRENT_VERTEX_ATTRIB                            0x8626
+#define GL_VERTEX_PROGRAM_POINT_SIZE                        0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE                          0x8643
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER                      0x8645
+#define GL_STENCIL_BACK_FUNC                                0x8800
+#define GL_STENCIL_BACK_FAIL                                0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL                     0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS                     0x8803
+#define GL_MAX_DRAW_BUFFERS                                 0x8824
+#define GL_DRAW_BUFFER0                                     0x8825
+#define GL_DRAW_BUFFER1                                     0x8826
+#define GL_DRAW_BUFFER2                                     0x8827
+#define GL_DRAW_BUFFER3                                     0x8828
+#define GL_DRAW_BUFFER4                                     0x8829
+#define GL_DRAW_BUFFER5                                     0x882a
+#define GL_DRAW_BUFFER6                                     0x882b
+#define GL_DRAW_BUFFER7                                     0x882c
+#define GL_DRAW_BUFFER8                                     0x882d
+#define GL_DRAW_BUFFER9                                     0x882e
+#define GL_DRAW_BUFFER10                                    0x882f
+#define GL_DRAW_BUFFER11                                    0x8830
+#define GL_DRAW_BUFFER12                                    0x8831
+#define GL_DRAW_BUFFER13                                    0x8832
+#define GL_DRAW_BUFFER14                                    0x8833
+#define GL_DRAW_BUFFER15                                    0x8834
+#define GL_BLEND_EQUATION_ALPHA                             0x883d
+#define GL_POINT_SPRITE                                     0x8861
+#define GL_COORD_REPLACE                                    0x8862
+#define GL_MAX_VERTEX_ATTRIBS                               0x8869
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED                   0x886a
+#define GL_MAX_TEXTURE_COORDS                               0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS                          0x8872
+#define GL_FRAGMENT_SHADER                                  0x8b30
+#define GL_VERTEX_SHADER                                    0x8b31
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS                  0x8b49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS                    0x8b4a
+#define GL_MAX_VARYING_FLOATS                               0x8b4b
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS                   0x8b4c
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS                 0x8b4d
+#define GL_SHADER_TYPE                                      0x8b4f
+#define GL_FLOAT_VEC2                                       0x8b50
+#define GL_FLOAT_VEC3                                       0x8b51
+#define GL_FLOAT_VEC4                                       0x8b52
+#define GL_INT_VEC2                                         0x8b53
+#define GL_INT_VEC3                                         0x8b54
+#define GL_INT_VEC4                                         0x8b55
+#define GL_BOOL                                             0x8b56
+#define GL_BOOL_VEC2                                        0x8b57
+#define GL_BOOL_VEC3                                        0x8b58
+#define GL_BOOL_VEC4                                        0x8b59
+#define GL_FLOAT_MAT2                                       0x8b5a
+#define GL_FLOAT_MAT3                                       0x8b5b
+#define GL_FLOAT_MAT4                                       0x8b5c
+#define GL_SAMPLER_1D                                       0x8b5d
+#define GL_SAMPLER_2D                                       0x8b5e
+#define GL_SAMPLER_3D                                       0x8b5f
+#define GL_SAMPLER_CUBE                                     0x8b60
+#define GL_SAMPLER_1D_SHADOW                                0x8b61
+#define GL_SAMPLER_2D_SHADOW                                0x8b62
+#define GL_DELETE_STATUS                                    0x8b80
+#define GL_COMPILE_STATUS                                   0x8b81
+#define GL_LINK_STATUS                                      0x8b82
+#define GL_VALIDATE_STATUS                                  0x8b83
+#define GL_INFO_LOG_LENGTH                                  0x8b84
+#define GL_ATTACHED_SHADERS                                 0x8b85
+#define GL_ACTIVE_UNIFORMS                                  0x8b86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH                        0x8b87
+#define GL_SHADER_SOURCE_LENGTH                             0x8b88
+#define GL_ACTIVE_ATTRIBUTES                                0x8b89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH                      0x8b8a
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT                  0x8b8b
+#define GL_SHADING_LANGUAGE_VERSION                         0x8b8c
+#define GL_CURRENT_PROGRAM                                  0x8b8d
+#define GL_POINT_SPRITE_COORD_ORIGIN                        0x8ca0
+#define GL_LOWER_LEFT                                       0x8ca1
+#define GL_UPPER_LEFT                                       0x8ca2
+#define GL_STENCIL_BACK_REF                                 0x8ca3
+#define GL_STENCIL_BACK_VALUE_MASK                          0x8ca4
+#define GL_STENCIL_BACK_WRITEMASK                           0x8ca5
+typedef char GLchar;
+#endif
+typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSPROC)(GLsizei n, const GLenum *bufs);
+typedef void (WINE_GLAPI *PGLFNSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (WINE_GLAPI *PGLFNSTENCILFUNCSEPARATEPROC)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+typedef void (WINE_GLAPI *PGLFNSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask);
+typedef void (WINE_GLAPI *PGLFNATTACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (WINE_GLAPI *PGLFNBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar *name);
+typedef void (WINE_GLAPI *PGLFNCOMPILESHADERPROC)(GLuint shader);
+typedef GLuint (WINE_GLAPI *PGLFNCREATEPROGRAMPROC)(void);
+typedef GLuint (WINE_GLAPI *PGLFNCREATESHADERPROC)(GLenum type);
+typedef void (WINE_GLAPI *PGLFNDELETEPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNDELETESHADERPROC)(GLuint shader);
+typedef void (WINE_GLAPI *PGLFNDETACHSHADERPROC)(GLuint program, GLuint shader);
+typedef void (WINE_GLAPI *PGLFNDISABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNENABLEVERTEXATTRIBARRAYPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNGETACTIVEATTRIBPROC)(GLuint program,
+        GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETACTIVEUNIFORMPROC)(GLuint program,
+        GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+typedef GLint (WINE_GLAPI *PGLFNGETATTRIBLOCATIONPROC)(GLuint program, const GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMINFOLOGPROC)(GLuint program,
+        GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (WINE_GLAPI *PGLFNGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (WINE_GLAPI *PGLFNGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef GLint (WINE_GLAPI *PGLFNGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar *name);
+typedef void (WINE_GLAPI *PGLFNGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETUNIFORMIVPROC)(GLuint program, GLint location, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, GLvoid* *pointer);
+typedef GLboolean (WINE_GLAPI *PGLFNISPROGRAMPROC)(GLuint program);
+typedef GLboolean (WINE_GLAPI *PGLFNISSHADERPROC)(GLuint shader);
+typedef void (WINE_GLAPI *PGLFNLINKPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNSHADERSOURCEPROC)(GLuint shader,
+        GLsizei count, const GLchar* *string, const GLint *length);
+typedef void (WINE_GLAPI *PGLFNUSEPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1FPROC)(GLint location, GLfloat v0);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1IPROC)(GLint location, GLint v0);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2IPROC)(GLint location, GLint v0, GLint v1);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX2FVPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX3FVPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX4FVPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *PGLFNVALIDATEPROGRAMPROC)(GLuint program);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DPROC)(GLuint index, GLdouble x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FPROC)(GLuint index, GLfloat x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SPROC)(GLuint index, GLshort x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NIVPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4IVPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SVPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4USVPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBPOINTERPROC)(GLuint index,
+        GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+
 void (WINE_GLAPI *glAccum)(GLenum op, GLfloat value) DECLSPEC_HIDDEN;
 void (WINE_GLAPI *glAlphaFunc)(GLenum func, GLclampf ref) DECLSPEC_HIDDEN;
 GLboolean (WINE_GLAPI *glAreTexturesResident)(GLsizei n, const GLuint *textures, GLboolean *residences) DECLSPEC_HIDDEN;
@@ -1524,68 +1718,273 @@ BOOL (WINAPI *pwglShareLists)(HGLRC, HGLRC) DECLSPEC_HIDDEN;
     USE_WGL_FUNC(wglMakeCurrent) \
     USE_WGL_FUNC(wglShareLists)
 
+/* OpenGL extensions. */
+typedef enum wined3d_gl_extension
+{
+    WINED3D_GL_EXT_NONE,
 
-/****************************************************
- * OpenGL Extensions (EXT and ARB)
- *     #defines and functions pointer
- ****************************************************/
+    /* APPLE */
+    APPLE_CLIENT_STORAGE,
+    APPLE_FENCE,
+    APPLE_FLOAT_PIXELS,
+    APPLE_FLUSH_BUFFER_RANGE,
+    APPLE_FLUSH_RENDER,
+    APPLE_YCBCR_422,
+    /* ARB */
+    ARB_COLOR_BUFFER_FLOAT,
+    ARB_DEPTH_BUFFER_FLOAT,
+    ARB_DEPTH_CLAMP,
+    ARB_DEPTH_TEXTURE,
+    ARB_DRAW_BUFFERS,
+    ARB_FRAGMENT_PROGRAM,
+    ARB_FRAGMENT_SHADER,
+    ARB_FRAMEBUFFER_OBJECT,
+    ARB_GEOMETRY_SHADER4,
+    ARB_HALF_FLOAT_PIXEL,
+    ARB_HALF_FLOAT_VERTEX,
+    ARB_IMAGING,
+    ARB_MAP_BUFFER_RANGE,
+    ARB_MULTISAMPLE,
+    ARB_MULTITEXTURE,
+    ARB_OCCLUSION_QUERY,
+    ARB_PIXEL_BUFFER_OBJECT,
+    ARB_POINT_PARAMETERS,
+    ARB_POINT_SPRITE,
+    ARB_PROVOKING_VERTEX,
+    ARB_SHADER_OBJECTS,
+    ARB_SHADER_TEXTURE_LOD,
+    ARB_SHADING_LANGUAGE_100,
+    ARB_SYNC,
+    ARB_TEXTURE_BORDER_CLAMP,
+    ARB_TEXTURE_COMPRESSION,
+    ARB_TEXTURE_CUBE_MAP,
+    ARB_TEXTURE_ENV_ADD,
+    ARB_TEXTURE_ENV_COMBINE,
+    ARB_TEXTURE_ENV_DOT3,
+    ARB_TEXTURE_FLOAT,
+    ARB_TEXTURE_MIRRORED_REPEAT,
+    ARB_TEXTURE_NON_POWER_OF_TWO,
+    ARB_TEXTURE_RECTANGLE,
+    ARB_TEXTURE_RG,
+    ARB_VERTEX_ARRAY_BGRA,
+    ARB_VERTEX_BLEND,
+    ARB_VERTEX_BUFFER_OBJECT,
+    ARB_VERTEX_PROGRAM,
+    ARB_VERTEX_SHADER,
+    /* ATI */
+    ATI_FRAGMENT_SHADER,
+    ATI_SEPARATE_STENCIL,
+    ATI_TEXTURE_COMPRESSION_3DC,
+    ATI_TEXTURE_ENV_COMBINE3,
+    ATI_TEXTURE_MIRROR_ONCE,
+    /* EXT */
+    EXT_BLEND_COLOR,
+    EXT_BLEND_EQUATION_SEPARATE,
+    EXT_BLEND_FUNC_SEPARATE,
+    EXT_BLEND_MINMAX,
+    EXT_FOG_COORD,
+    EXT_FRAMEBUFFER_BLIT,
+    EXT_FRAMEBUFFER_MULTISAMPLE,
+    EXT_FRAMEBUFFER_OBJECT,
+    EXT_GPU_PROGRAM_PARAMETERS,
+    EXT_GPU_SHADER4,
+    EXT_PACKED_DEPTH_STENCIL,
+    EXT_PALETTED_TEXTURE,
+    EXT_POINT_PARAMETERS,
+    EXT_PROVOKING_VERTEX,
+    EXT_SECONDARY_COLOR,
+    EXT_STENCIL_TWO_SIDE,
+    EXT_STENCIL_WRAP,
+    EXT_TEXTURE3D,
+    EXT_TEXTURE_COMPRESSION_RGTC,
+    EXT_TEXTURE_COMPRESSION_S3TC,
+    EXT_TEXTURE_ENV_ADD,
+    EXT_TEXTURE_ENV_COMBINE,
+    EXT_TEXTURE_ENV_DOT3,
+    EXT_TEXTURE_FILTER_ANISOTROPIC,
+    EXT_TEXTURE_LOD_BIAS,
+    EXT_TEXTURE_SRGB,
+    EXT_VERTEX_ARRAY_BGRA,
+    /* NVIDIA */
+    NV_DEPTH_CLAMP,
+    NV_FENCE,
+    NV_FOG_DISTANCE,
+    NV_FRAGMENT_PROGRAM,
+    NV_FRAGMENT_PROGRAM2,
+    NV_FRAGMENT_PROGRAM_OPTION,
+    NV_HALF_FLOAT,
+    NV_LIGHT_MAX_EXPONENT,
+    NV_REGISTER_COMBINERS,
+    NV_REGISTER_COMBINERS2,
+    NV_TEXGEN_REFLECTION,
+    NV_TEXTURE_ENV_COMBINE4,
+    NV_TEXTURE_SHADER,
+    NV_TEXTURE_SHADER2,
+    NV_VERTEX_PROGRAM,
+    NV_VERTEX_PROGRAM1_1,
+    NV_VERTEX_PROGRAM2,
+    NV_VERTEX_PROGRAM2_OPTION,
+    NV_VERTEX_PROGRAM3,
+    /* SGI */
+    SGIS_GENERATE_MIPMAP,
+    SGI_VIDEO_SYNC,
+    /* WGL extensions */
+    WGL_ARB_PBUFFER,
+    WGL_ARB_PIXEL_FORMAT,
+    WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
+    /* Internally used */
+    WINE_NORMALIZED_TEXRECT,
+
+    WINED3D_GL_EXT_COUNT,
+} GL_SupportedExt;
+
+/* GL_APPLE_client_storage */
+#ifndef GL_APPLE_client_storage
+#define GL_APPLE_client_storage 1
+#define GL_UNPACK_CLIENT_STORAGE_APPLE                      0x85b2
+#endif
+
+/* GL_APPLE_fence */
+#ifndef GL_APPLE_fence
+#define GL_APPLE_fence 1
+#define GL_DRAW_PIXELS_APPLE                                0x8a0a
+#define GL_FENCE_APPLE                                      0x8a0b
+#endif
+typedef void (WINE_GLAPI *PGLFNGENFENCESAPPLEPROC)(GLsizei, GLuint *);
+typedef void (WINE_GLAPI *PGLFNDELETEFENCESAPPLEPROC)(GLuint, const GLuint *);
+typedef void (WINE_GLAPI *PGLFNSETFENCEAPPLEPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNTESTFENCEAPPLEPROC)(GLuint);
+typedef void (WINE_GLAPI *PGLFNFINISHFENCEAPPLEPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNISFENCEAPPLEPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNTESTOBJECTAPPLEPROC)(GLenum, GLuint);
+typedef void (WINE_GLAPI *PGLFNFINISHOBJECTAPPLEPROC)(GLenum, GLuint);
+
+/* GL_APPLE_float_pixels */
+#ifndef GL_APPLE_float_pixels
+#define GL_APPLE_float_pixels 1
+#define GL_HALF_APPLE                                       0x140b
+#define GL_COLOR_FLOAT_APPLE                                0x8a0f
+#define GL_RGBA_FLOAT32_APPLE                               0x8814
+#define GL_RGB_FLOAT32_APPLE                                0x8815
+#define GL_ALPHA_FLOAT32_APPLE                              0x8816
+#define GL_INTENSITY_FLOAT32_APPLE                          0x8817
+#define GL_LUMINANCE_FLOAT32_APPLE                          0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE                    0x8819
+#define GL_RGBA_FLOAT16_APPLE                               0x881a
+#define GL_RGB_FLOAT16_APPLE                                0x881b
+#define GL_ALPHA_FLOAT16_APPLE                              0x881c
+#define GL_INTENSITY_FLOAT16_APPLE                          0x881d
+#define GL_LUMINANCE_FLOAT16_APPLE                          0x881e
+#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE                    0x881f
+#endif
+
+/* GL_APPLE_flush_buffer_range */
+#ifndef GL_APPLE_flush_buffer_range
+#define GL_APPLE_flush_buffer_range 1
+#define GL_BUFFER_SERIALIZED_MODIFY_APPLE                   0x8a12
+#define GL_BUFFER_FLUSHING_UNMAP_APPLE                      0x8a13
+typedef void (WINE_GLAPI *PGLFNBUFFERPARAMETERIAPPLE)(GLenum target, GLenum pname, GLint param);
+typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE)(GLenum target, GLintptr offset, GLsizeiptr size);
+#endif
+
+/* GL_APPLE_flush_render */
+typedef void (WINE_GLAPI *PGLFNFLUSHRENDERAPPLEPROC)(void);
+typedef void (WINE_GLAPI *PGLFNFINISHRENDERAPPLEPROC)(void);
+
+/* GL_APPLE_ycbcr_422 */
+#ifndef GL_APPLE_ycbcr_422
+#define GL_APPLE_ycbcr_422 1
+#define GL_YCBCR_422_APPLE                                  0x85b9
+#define UNSIGNED_SHORT_8_8_APPLE                            0x85ba
+#define UNSIGNED_SHORT_8_8_REV_APPLE                        0x85bb
+#endif
 
 /* GL_ARB_color_buffer_float */
 #ifndef GL_ARB_color_buffer_float
-#define GL_RGBA_FLOAT_MODE_ARB            0x8820
-#define GL_CLAMP_VERTEX_COLOR_ARB         0x891A
-#define GL_CLAMP_FRAGMENT_COLOR_ARB       0x891B
-#define GL_CLAMP_READ_COLOR_ARB           0x891C
-#define GL_FIXED_ONLY_ARB                 0x891D
+#define GL_ARB_color_buffer_float 1
+#define GL_RGBA_FLOAT_MODE_ARB                              0x8820
+#define GL_CLAMP_VERTEX_COLOR_ARB                           0x891a
+#define GL_CLAMP_FRAGMENT_COLOR_ARB                         0x891b
+#define GL_CLAMP_READ_COLOR_ARB                             0x891c
+#define GL_FIXED_ONLY_ARB                                   0x891d
 #endif
-typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);
+typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC)(GLenum target, GLenum clamp);
 
 /* GL_ARB_depth_buffer_float */
 #ifndef GL_ARB_depth_buffer_float
 #define GL_ARB_depth_buffer_float 1
-#define GL_DEPTH_COMPONENT32F             0x8cac
-#define GL_DEPTH32F_STENCIL8              0x8cad
-#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8dad
+#define GL_DEPTH_COMPONENT32F                               0x8cac
+#define GL_DEPTH32F_STENCIL8                                0x8cad
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV                   0x8dad
 #endif
 
 /* GL_ARB_depth_clamp */
 #ifndef GL_ARB_depth_clamp
 #define GL_ARB_depth_clamp 1
-#define GL_DEPTH_CLAMP                    0x864f
+#define GL_DEPTH_CLAMP                                      0x864f
 #endif
 
 /* GL_ARB_depth_texture */
 #ifndef GL_ARB_depth_texture
 #define GL_ARB_depth_texture 1
-#define GL_DEPTH_COMPONENT16_ARB          0x81A5
-#define GL_DEPTH_COMPONENT24_ARB          0x81A6
-#define GL_DEPTH_COMPONENT32_ARB          0x81A7
-#define GL_TEXTURE_DEPTH_SIZE_ARB         0x884A
-#define GL_DEPTH_TEXTURE_MODE_ARB         0x884B
+#define GL_DEPTH_COMPONENT16_ARB                            0x81a5
+#define GL_DEPTH_COMPONENT24_ARB                            0x81a6
+#define GL_DEPTH_COMPONENT32_ARB                            0x81a7
+#define GL_TEXTURE_DEPTH_SIZE_ARB                           0x884a
+#define GL_DEPTH_TEXTURE_MODE_ARB                           0x884b
 #endif
 
 /* GL_ARB_draw_buffers */
 #ifndef GL_ARB_draw_buffers
 #define GL_ARB_draw_buffers 1
-#define GL_MAX_DRAW_BUFFERS_ARB           0x8824
-#define GL_DRAW_BUFFER0_ARB               0x8825
-#define GL_DRAW_BUFFER1_ARB               0x8826
-#define GL_DRAW_BUFFER2_ARB               0x8827
-#define GL_DRAW_BUFFER3_ARB               0x8828
-#define GL_DRAW_BUFFER4_ARB               0x8829
-#define GL_DRAW_BUFFER5_ARB               0x882A
-#define GL_DRAW_BUFFER6_ARB               0x882B
-#define GL_DRAW_BUFFER7_ARB               0x882C
-#define GL_DRAW_BUFFER8_ARB               0x882D
-#define GL_DRAW_BUFFER9_ARB               0x882E
-#define GL_DRAW_BUFFER10_ARB              0x882F
-#define GL_DRAW_BUFFER11_ARB              0x8830
-#define GL_DRAW_BUFFER12_ARB              0x8831
-#define GL_DRAW_BUFFER13_ARB              0x8832
-#define GL_DRAW_BUFFER14_ARB              0x8833
-#define GL_DRAW_BUFFER15_ARB              0x8834
+#define GL_MAX_DRAW_BUFFERS_ARB                             0x8824
+#define GL_DRAW_BUFFER0_ARB                                 0x8825
+#define GL_DRAW_BUFFER1_ARB                                 0x8826
+#define GL_DRAW_BUFFER2_ARB                                 0x8827
+#define GL_DRAW_BUFFER3_ARB                                 0x8828
+#define GL_DRAW_BUFFER4_ARB                                 0x8829
+#define GL_DRAW_BUFFER5_ARB                                 0x882a
+#define GL_DRAW_BUFFER6_ARB                                 0x882b
+#define GL_DRAW_BUFFER7_ARB                                 0x882c
+#define GL_DRAW_BUFFER8_ARB                                 0x882d
+#define GL_DRAW_BUFFER9_ARB                                 0x882e
+#define GL_DRAW_BUFFER10_ARB                                0x882f
+#define GL_DRAW_BUFFER11_ARB                                0x8830
+#define GL_DRAW_BUFFER12_ARB                                0x8831
+#define GL_DRAW_BUFFER13_ARB                                0x8832
+#define GL_DRAW_BUFFER14_ARB                                0x8833
+#define GL_DRAW_BUFFER15_ARB                                0x8834
+#endif
+typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC)(GLsizei n, const GLenum *bufs);
+
+/* GL_ARB_fragment_program */
+#ifndef GL_ARB_fragment_program
+#define GL_ARB_fragment_program 1
+#define GL_FRAGMENT_PROGRAM_ARB                             0x8804
+#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB                     0x8805
+#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB                     0x8806
+#define GL_PROGRAM_TEX_INDIRECTIONS_ARB                     0x8807
+#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB              0x8808
+#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB              0x8809
+#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB              0x880a
+#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB                 0x880b
+#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB                 0x880c
+#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB                 0x880d
+#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB          0x880e
+#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB          0x880f
+#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB          0x8810
+#define GL_MAX_TEXTURE_COORDS_ARB                           0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB                      0x8872
+/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */
+#endif
+
+/* GL_ARB_fragment_shader */
+#ifndef GL_ARB_fragment_shader
+#define GL_ARB_fragment_shader 1
+#define GL_FRAGMENT_SHADER_ARB                              0x8b30
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB              0x8b49
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB              0x8b8b
 #endif
-typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs);
 
 /* GL_ARB_framebuffer_object */
 #ifndef GL_ARB_framebuffer_object
@@ -1665,58 +2064,59 @@ typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *buf
 #define GL_DEPTH24_STENCIL8                                 0x88f0
 #define GL_TEXTURE_STENCIL_SIZE                             0x88f1
 #endif
-typedef GLboolean (WINE_GLAPI * PGLFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat,
+typedef GLboolean (WINE_GLAPI *PGLFNGLISRENDERBUFFERPROC)(GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat,
         GLsizei width, GLsizei height);
-typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples,
+typedef void (WINE_GLAPI *PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples,
         GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (WINE_GLAPI * PGLFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params);
-typedef GLboolean (WINE_GLAPI * PGLFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers);
-typedef GLenum (WINE_GLAPI * PGLFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params);
+typedef GLboolean (WINE_GLAPI *PGLFNGLISFRAMEBUFFERPROC)(GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers);
+typedef GLenum (WINE_GLAPI *PGLFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment,
         GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment,
         GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment,
         GLenum textarget, GLuint texture, GLint level, GLint layer);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment,
         GLuint texture, GLint level, GLint layer);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment,
         GLenum renderbuffertarget, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment,
+typedef void (WINE_GLAPI *PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment,
         GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+typedef void (WINE_GLAPI *PGLFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
         GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-typedef void (WINE_GLAPI * PGLFNGLGENERATEMIPMAPPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLGENERATEMIPMAPPROC)(GLenum target);
 
 /* GL_ARB_geometry_shader4 */
 #ifndef GL_ARB_geometry_shader4
-#define GL_GEOMETRY_SHADER_ARB                      0x8dd9
-#define GL_GEOMETRY_VERTICES_OUT_ARB                0x8dda
-#define GL_GEOMETRY_INPUT_TYPE_ARB                  0x8ddb
-#define GL_GEOMETRY_OUTPUT_TYPE_ARB                 0x8ddc
-#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB     0x8c29
-#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB      0x8ddd
-#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB        0x8dde
-#define GL_MAX_VARYING_COMPONENTS_ARB               0x8b4b
-#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB      0x8ddf
-#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB         0x8de0
-#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8de1
-#define GL_LINES_ADJACENCY_ARB                      0x000a
-#define GL_LINE_STRIP_ADJACENCY_ARB                 0x000b
-#define GL_TRIANGLES_ADJACENCY_ARB                  0x000c
-#define GL_TRIANGLE_STRIP_ADJACENCY_ARB             0x000d
-#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8da8
-#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB   0x8da9
-#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB       0x8da7
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER     0x8cd4
-#define GL_PROGRAM_POINT_SIZE_ARB                   0x8642
+#define GL_ARB_geometry_shader4 1
+#define GL_GEOMETRY_SHADER_ARB                              0x8dd9
+#define GL_GEOMETRY_VERTICES_OUT_ARB                        0x8dda
+#define GL_GEOMETRY_INPUT_TYPE_ARB                          0x8ddb
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB                         0x8ddc
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB             0x8c29
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB              0x8ddd
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB                0x8dde
+#define GL_MAX_VARYING_COMPONENTS_ARB                       0x8b4b
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB              0x8ddf
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB                 0x8de0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB         0x8de1
+#define GL_LINES_ADJACENCY_ARB                              0x000a
+#define GL_LINE_STRIP_ADJACENCY_ARB                         0x000b
+#define GL_TRIANGLES_ADJACENCY_ARB                          0x000c
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB                     0x000d
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB         0x8da8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB           0x8da9
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB               0x8da7
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER             0x8cd4
+#define GL_PROGRAM_POINT_SIZE_ARB                           0x8642
 #endif
 typedef void (WINE_GLAPI *PGLFNPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value);
 typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment,
@@ -1726,380 +2126,1067 @@ typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GL
 typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment,
         GLuint texture, GLint level, GLenum face);
 
+/* GL_ARB_half_float_pixel */
+#ifndef GL_ARB_half_float_pixel
+#define GL_ARB_half_float_pixel 1
+#define GL_HALF_FLOAT_ARB                                   0x140b
+#endif
+
+/* GL_ARB_half_float_vertex */
+#ifndef GL_ARB_half_float_vertex
+#define GL_ARB_half_float_vertex 1
+/* No _ARB, see extension spec */
+#define GL_HALF_FLOAT                                       0x140b
+#endif
+
 /* GL_ARB_imaging */
 #ifndef GL_ARB_imaging
 #define GL_ARB_imaging 1
-#define GL_CONSTANT_COLOR                 0x8001
-#define GL_ONE_MINUS_CONSTANT_COLOR       0x8002
-#define GL_CONSTANT_ALPHA                 0x8003
-#define GL_ONE_MINUS_CONSTANT_ALPHA       0x8004
-#define GL_BLEND_COLOR                    0x8005
-#define GL_FUNC_ADD                       0x8006
-#define GL_MIN                            0x8007
-#define GL_MAX                            0x8008
-#define GL_BLEND_EQUATION                 0x8009
-#define GL_FUNC_SUBTRACT                  0x800A
-#define GL_FUNC_REVERSE_SUBTRACT          0x800B
-#define GL_CONVOLUTION_1D                 0x8010
-#define GL_CONVOLUTION_2D                 0x8011
-#define GL_SEPARABLE_2D                   0x8012
-#define GL_CONVOLUTION_BORDER_MODE        0x8013
-#define GL_CONVOLUTION_FILTER_SCALE       0x8014
-#define GL_CONVOLUTION_FILTER_BIAS        0x8015
-#define GL_REDUCE                         0x8016
-#define GL_CONVOLUTION_FORMAT             0x8017
-#define GL_CONVOLUTION_WIDTH              0x8018
-#define GL_CONVOLUTION_HEIGHT             0x8019
-#define GL_MAX_CONVOLUTION_WIDTH          0x801A
-#define GL_MAX_CONVOLUTION_HEIGHT         0x801B
-#define GL_POST_CONVOLUTION_RED_SCALE     0x801C
-#define GL_POST_CONVOLUTION_GREEN_SCALE   0x801D
-#define GL_POST_CONVOLUTION_BLUE_SCALE    0x801E
-#define GL_POST_CONVOLUTION_ALPHA_SCALE   0x801F
-#define GL_POST_CONVOLUTION_RED_BIAS      0x8020
-#define GL_POST_CONVOLUTION_GREEN_BIAS    0x8021
-#define GL_POST_CONVOLUTION_BLUE_BIAS     0x8022
-#define GL_POST_CONVOLUTION_ALPHA_BIAS    0x8023
-#define GL_HISTOGRAM                      0x8024
-#define GL_PROXY_HISTOGRAM                0x8025
-#define GL_HISTOGRAM_WIDTH                0x8026
-#define GL_HISTOGRAM_FORMAT               0x8027
-#define GL_HISTOGRAM_RED_SIZE             0x8028
-#define GL_HISTOGRAM_GREEN_SIZE           0x8029
-#define GL_HISTOGRAM_BLUE_SIZE            0x802A
-#define GL_HISTOGRAM_ALPHA_SIZE           0x802B
-#define GL_HISTOGRAM_LUMINANCE_SIZE       0x802C
-#define GL_HISTOGRAM_SINK                 0x802D
-#define GL_MINMAX                         0x802E
-#define GL_MINMAX_FORMAT                  0x802F
-#define GL_MINMAX_SINK                    0x8030
-#define GL_TABLE_TOO_LARGE                0x8031
-#define GL_COLOR_MATRIX                   0x80B1
-#define GL_COLOR_MATRIX_STACK_DEPTH       0x80B2
-#define GL_MAX_COLOR_MATRIX_STACK_DEPTH   0x80B3
-#define GL_POST_COLOR_MATRIX_RED_SCALE    0x80B4
-#define GL_POST_COLOR_MATRIX_GREEN_SCALE  0x80B5
-#define GL_POST_COLOR_MATRIX_BLUE_SCALE   0x80B6
-#define GL_POST_COLOR_MATRIX_ALPHA_SCALE  0x80B7
-#define GL_POST_COLOR_MATRIX_RED_BIAS     0x80B8
-#define GL_POST_COLOR_MATRIX_GREEN_BIAS   0x80B9
-#define GL_POST_COLOR_MATRIX_BLUE_BIAS    0x80BA
-#define GL_POST_COLOR_MATRIX_ALPHA_BIAS   0x80BB
-#define GL_COLOR_TABLE                    0x80D0
-#define GL_POST_CONVOLUTION_COLOR_TABLE   0x80D1
-#define GL_POST_COLOR_MATRIX_COLOR_TABLE  0x80D2
-#define GL_PROXY_COLOR_TABLE              0x80D3
-#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
-#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
-#define GL_COLOR_TABLE_SCALE              0x80D6
-#define GL_COLOR_TABLE_BIAS               0x80D7
-#define GL_COLOR_TABLE_FORMAT             0x80D8
-#define GL_COLOR_TABLE_WIDTH              0x80D9
-#define GL_COLOR_TABLE_RED_SIZE           0x80DA
-#define GL_COLOR_TABLE_GREEN_SIZE         0x80DB
-#define GL_COLOR_TABLE_BLUE_SIZE          0x80DC
-#define GL_COLOR_TABLE_ALPHA_SIZE         0x80DD
-#define GL_COLOR_TABLE_LUMINANCE_SIZE     0x80DE
-#define GL_COLOR_TABLE_INTENSITY_SIZE     0x80DF
-#define GL_CONSTANT_BORDER                0x8151
-#define GL_REPLICATE_BORDER               0x8153
-#define GL_CONVOLUTION_BORDER_COLOR       0x8154
+#define GL_CONSTANT_COLOR                                   0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR                         0x8002
+#define GL_CONSTANT_ALPHA                                   0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA                         0x8004
+#define GL_BLEND_COLOR                                      0x8005
+#define GL_FUNC_ADD                                         0x8006
+#define GL_MIN                                              0x8007
+#define GL_MAX                                              0x8008
+#define GL_BLEND_EQUATION                                   0x8009
+#define GL_FUNC_SUBTRACT                                    0x800a
+#define GL_FUNC_REVERSE_SUBTRACT                            0x800b
+#define GL_CONVOLUTION_1D                                   0x8010
+#define GL_CONVOLUTION_2D                                   0x8011
+#define GL_SEPARABLE_2D                                     0x8012
+#define GL_CONVOLUTION_BORDER_MODE                          0x8013
+#define GL_CONVOLUTION_FILTER_SCALE                         0x8014
+#define GL_CONVOLUTION_FILTER_BIAS                          0x8015
+#define GL_REDUCE                                           0x8016
+#define GL_CONVOLUTION_FORMAT                               0x8017
+#define GL_CONVOLUTION_WIDTH                                0x8018
+#define GL_CONVOLUTION_HEIGHT                               0x8019
+#define GL_MAX_CONVOLUTION_WIDTH                            0x801a
+#define GL_MAX_CONVOLUTION_HEIGHT                           0x801b
+#define GL_POST_CONVOLUTION_RED_SCALE                       0x801d
+#define GL_POST_CONVOLUTION_GREEN_SCALE                     0x801f
+#define GL_POST_CONVOLUTION_BLUE_SCALE                      0x801e
+#define GL_POST_CONVOLUTION_ALPHA_SCALE                     0x801f
+#define GL_POST_CONVOLUTION_RED_BIAS                        0x8020
+#define GL_POST_CONVOLUTION_GREEN_BIAS                      0x8021
+#define GL_POST_CONVOLUTION_BLUE_BIAS                       0x8022
+#define GL_POST_CONVOLUTION_ALPHA_BIAS                      0x8023
+#define GL_HISTOGRAM                                        0x8024
+#define GL_PROXY_HISTOGRAM                                  0x8025
+#define GL_HISTOGRAM_WIDTH                                  0x8026
+#define GL_HISTOGRAM_FORMAT                                 0x8027
+#define GL_HISTOGRAM_RED_SIZE                               0x8028
+#define GL_HISTOGRAM_GREEN_SIZE                             0x8029
+#define GL_HISTOGRAM_BLUE_SIZE                              0x802a
+#define GL_HISTOGRAM_ALPHA_SIZE                             0x802b
+#define GL_HISTOGRAM_LUMINANCE_SIZE                         0x802c
+#define GL_HISTOGRAM_SINK                                   0x802d
+#define GL_MINMAX                                           0x802e
+#define GL_MINMAX_FORMAT                                    0x802f
+#define GL_MINMAX_SINK                                      0x8030
+#define GL_TABLE_TOO_LARGE                                  0x8031
+#define GL_COLOR_MATRIX                                     0x80b1
+#define GL_COLOR_MATRIX_STACK_DEPTH                         0x80b2
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH                     0x80b3
+#define GL_POST_COLOR_MATRIX_RED_SCALE                      0x80b4
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE                    0x80b5
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE                     0x80b6
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE                    0x80b7
+#define GL_POST_COLOR_MATRIX_RED_BIAS                       0x80b8
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS                     0x80b9
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS                      0x80ba
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS                     0x80bb
+#define GL_COLOR_TABLE                                      0x80d0
+#define GL_POST_CONVOLUTION_COLOR_TABLE                     0x80d1
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE                    0x80d2
+#define GL_PROXY_COLOR_TABLE                                0x80d3
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE               0x80d4
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE              0x80d5
+#define GL_COLOR_TABLE_SCALE                                0x80d6
+#define GL_COLOR_TABLE_BIAS                                 0x80d7
+#define GL_COLOR_TABLE_FORMAT                               0x80d8
+#define GL_COLOR_TABLE_WIDTH                                0x80d9
+#define GL_COLOR_TABLE_RED_SIZE                             0x80da
+#define GL_COLOR_TABLE_GREEN_SIZE                           0x80db
+#define GL_COLOR_TABLE_BLUE_SIZE                            0x80dc
+#define GL_COLOR_TABLE_ALPHA_SIZE                           0x80dd
+#define GL_COLOR_TABLE_LUMINANCE_SIZE                       0x80de
+#define GL_COLOR_TABLE_INTENSITY_SIZE                       0x80df
+#define GL_CONSTANT_BORDER                                  0x8151
+#define GL_REPLICATE_BORDER                                 0x8153
+#define GL_CONVOLUTION_BORDER_COLOR                         0x8154
+#endif
+typedef void (WINE_GLAPI *PGLFNBLENDCOLORPROC)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONPROC)(GLenum mode);
+
+/* GL_ARB_map_buffer_range */
+#ifndef GL_ARB_map_buffer_range
+#define GL_ARB_map_buffer_range 1
+#define GL_MAP_READ_BIT                                     0x0001
+#define GL_MAP_WRITE_BIT                                    0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT                         0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT                        0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT                           0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT                           0x0020
 #endif
-typedef void (WINE_GLAPI *PGLFNBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONPROC) (GLenum mode);
+typedef GLvoid *(WINE_GLAPI *PGLFNMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length);
+
+/* GL_ARB_multisample */
+#ifndef GL_ARB_multisample
+#define GL_ARB_multisample 1
+#define GL_MULTISAMPLE_ARB                                  0x809d
+#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB                     0x809e
+#define GL_SAMPLE_ALPHA_TO_ONE_ARB                          0x809f
+#define GL_SAMPLE_COVERAGE_ARB                              0x80a0
+#define GL_SAMPLE_BUFFERS_ARB                               0x80a8
+#define GL_SAMPLES_ARB                                      0x80a9
+#define GL_SAMPLE_COVERAGE_VALUE_ARB                        0x80aa
+#define GL_SAMPLE_COVERAGE_INVERT_ARB                       0x80ab
+#define GL_MULTISAMPLE_BIT_ARB                              0x20000000
+#endif
+typedef void (WINE_GLAPI *WINED3D_PFNGLSAMPLECOVERAGEARBPROC)(GLclampf value, GLboolean invert);
+
 /* GL_ARB_multitexture */
 #ifndef GL_ARB_multitexture
 #define GL_ARB_multitexture 1
-#define GL_TEXTURE0_ARB                   0x84C0
-#define GL_TEXTURE1_ARB                   0x84C1
-#define GL_TEXTURE2_ARB                   0x84C2
-#define GL_TEXTURE3_ARB                   0x84C3
-#define GL_TEXTURE4_ARB                   0x84C4
-#define GL_TEXTURE5_ARB                   0x84C5
-#define GL_TEXTURE6_ARB                   0x84C6
-#define GL_TEXTURE7_ARB                   0x84C7
-#define GL_TEXTURE8_ARB                   0x84C8
-#define GL_TEXTURE9_ARB                   0x84C9
-#define GL_TEXTURE10_ARB                  0x84CA
-#define GL_TEXTURE11_ARB                  0x84CB
-#define GL_TEXTURE12_ARB                  0x84CC
-#define GL_TEXTURE13_ARB                  0x84CD
-#define GL_TEXTURE14_ARB                  0x84CE
-#define GL_TEXTURE15_ARB                  0x84CF
-#define GL_TEXTURE16_ARB                  0x84D0
-#define GL_TEXTURE17_ARB                  0x84D1
-#define GL_TEXTURE18_ARB                  0x84D2
-#define GL_TEXTURE19_ARB                  0x84D3
-#define GL_TEXTURE20_ARB                  0x84D4
-#define GL_TEXTURE21_ARB                  0x84D5
-#define GL_TEXTURE22_ARB                  0x84D6
-#define GL_TEXTURE23_ARB                  0x84D7
-#define GL_TEXTURE24_ARB                  0x84D8
-#define GL_TEXTURE25_ARB                  0x84D9
-#define GL_TEXTURE26_ARB                  0x84DA
-#define GL_TEXTURE27_ARB                  0x84DB
-#define GL_TEXTURE28_ARB                  0x84DC
-#define GL_TEXTURE29_ARB                  0x84DD
-#define GL_TEXTURE30_ARB                  0x84DE
-#define GL_TEXTURE31_ARB                  0x84DF
-#define GL_ACTIVE_TEXTURE_ARB             0x84E0
-#define GL_CLIENT_ACTIVE_TEXTURE_ARB      0x84E1
-#define GL_MAX_TEXTURE_UNITS_ARB          0x84E2
+#define GL_TEXTURE0_ARB                                     0x84c0
+#define GL_TEXTURE1_ARB                                     0x84c1
+#define GL_TEXTURE2_ARB                                     0x84c2
+#define GL_TEXTURE3_ARB                                     0x84c3
+#define GL_TEXTURE4_ARB                                     0x84c4
+#define GL_TEXTURE5_ARB                                     0x84c5
+#define GL_TEXTURE6_ARB                                     0x84c6
+#define GL_TEXTURE7_ARB                                     0x84c7
+#define GL_TEXTURE8_ARB                                     0x84c8
+#define GL_TEXTURE9_ARB                                     0x84c9
+#define GL_TEXTURE10_ARB                                    0x84ca
+#define GL_TEXTURE11_ARB                                    0x84cb
+#define GL_TEXTURE12_ARB                                    0x84cc
+#define GL_TEXTURE13_ARB                                    0x84cd
+#define GL_TEXTURE14_ARB                                    0x84ce
+#define GL_TEXTURE15_ARB                                    0x84cf
+#define GL_TEXTURE16_ARB                                    0x84d0
+#define GL_TEXTURE17_ARB                                    0x84d1
+#define GL_TEXTURE18_ARB                                    0x84d2
+#define GL_TEXTURE19_ARB                                    0x84d3
+#define GL_TEXTURE20_ARB                                    0x84d4
+#define GL_TEXTURE21_ARB                                    0x84d5
+#define GL_TEXTURE22_ARB                                    0x84d6
+#define GL_TEXTURE23_ARB                                    0x84d7
+#define GL_TEXTURE24_ARB                                    0x84d8
+#define GL_TEXTURE25_ARB                                    0x84d9
+#define GL_TEXTURE26_ARB                                    0x84da
+#define GL_TEXTURE27_ARB                                    0x84db
+#define GL_TEXTURE28_ARB                                    0x84dc
+#define GL_TEXTURE29_ARB                                    0x84dd
+#define GL_TEXTURE30_ARB                                    0x84de
+#define GL_TEXTURE31_ARB                                    0x84df
+#define GL_ACTIVE_TEXTURE_ARB                               0x84e0
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB                        0x84e1
+#define GL_MAX_TEXTURE_UNITS_ARB                            0x84e2
 #endif
-typedef void (WINE_GLAPI *WINED3D_PFNGLACTIVETEXTUREARBPROC) (GLenum texture);
-typedef void (WINE_GLAPI *WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);
-typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (WINE_GLAPI *WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FARBPROC)(GLenum target,
+        GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort *v);
+typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort *v);
 
-/* GL_ARB_texture_cube_map */
-#ifndef GL_ARB_texture_cube_map
-#define GL_ARB_texture_cube_map 1
-#define GL_NORMAL_MAP_ARB                   0x8511
-#define GL_REFLECTION_MAP_ARB               0x8512
-#define GL_TEXTURE_CUBE_MAP_ARB             0x8513
-#define GL_TEXTURE_BINDING_CUBE_MAP_ARB     0x8514
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB  0x8515
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB  0x8516
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB  0x8517
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB  0x8518
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB  0x8519
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB  0x851A
-#define GL_PROXY_TEXTURE_CUBE_MAP_ARB       0x851B
-#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB    0x851C
+/* GL_ARB_occlusion_query */
+#ifndef GL_ARB_occlusion_query
+#define GL_ARB_occlusion_query 1
+#define GL_SAMPLES_PASSED_ARB                               0x8914
+#define GL_QUERY_COUNTER_BITS_ARB                           0x8864
+#define GL_CURRENT_QUERY_ARB                                0x8865
+#define GL_QUERY_RESULT_ARB                                 0x8866
+#define GL_QUERY_RESULT_AVAILABLE_ARB                       0x8867
+#endif
+typedef void (WINE_GLAPI *PGLFNGENQUERIESARBPROC)(GLsizei n, GLuint *queries);
+typedef void (WINE_GLAPI *PGLFNDELETEQUERIESARBPROC)(GLsizei n, const GLuint *queries);
+typedef GLboolean (WINE_GLAPI *PGLFNISQUERYARBPROC)(GLuint query);
+typedef void (WINE_GLAPI *PGLFNBEGINQUERYARBPROC)(GLenum target, GLuint query);
+typedef void (WINE_GLAPI *PGLFNENDQUERYARBPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGETQUERYIVARBPROC)(GLenum target, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETQUERYOBJECTIVARBPROC)(GLuint query, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETQUERYOBJECTUIVARBPROC)(GLuint query, GLenum pname, GLuint *params);
+
+/* GL_ARB_pixel_buffer_object */
+#ifndef GL_ARB_pixel_buffer_object
+#define GL_ARB_pixel_buffer_object 1
+#define GL_PIXEL_PACK_BUFFER_ARB                            0x88eb
+#define GL_PIXEL_UNPACK_BUFFER_ARB                          0x88ec
+#define GL_PIXEL_PACK_BUFFER_BINDING_ARB                    0x88ed
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB                  0x88ef
 #endif
 
 /* GL_ARB_point_parameters */
 #ifndef GL_ARB_point_parameters
 #define GL_ARB_point_parameters 1
-#define GL_POINT_SIZE_MIN_ARB             0x8126
-#define GL_POINT_SIZE_MAX_ARB             0x8127
-#define GL_POINT_FADE_THRESHOLD_SIZE_ARB  0x8128
-#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
+#define GL_POINT_SIZE_MIN_ARB                               0x8126
+#define GL_POINT_SIZE_MAX_ARB                               0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_ARB                    0x8128
+#define GL_POINT_DISTANCE_ATTENUATION_ARB                   0x8129
+#endif
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFARBPROC)(GLenum pname, GLfloat param);
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFVARBPROC)(GLenum pname, const GLfloat *params);
+
+/* GL_ARB_point_sprite */
+#ifndef GL_ARB_point_sprite
+#define GL_ARB_point_sprite 1
+#define GL_POINT_SPRITE_ARB                                 0x8861
+#define GL_COORD_REPLACE_ARB                                0x8862
 #endif
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params);
 
 /* GL_ARB_provoking_vertex */
 #ifndef GL_ARB_provoking_vertex
 #define GL_ARB_provoking_vertex 1
-#define GL_FIRST_VERTEX_CONVENTION                      0x8e4d
-#define GL_LAST_VERTEX_CONVENTION                       0x8e4e
-#define GL_PROVOKING_VERTEX                             0x8e4f
-#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION     0x8e4c
+#define GL_FIRST_VERTEX_CONVENTION                          0x8e4d
+#define GL_LAST_VERTEX_CONVENTION                           0x8e4e
+#define GL_PROVOKING_VERTEX                                 0x8e4f
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION         0x8e4c
+#endif
+typedef void (WINE_GLAPI *PGLFNGLPROVOKINGVERTEXPROC)(GLenum mode);
+
+/* GL_ARB_shader_objects */
+#ifndef GL_ARB_shader_objects
+#define GL_ARB_shader_objects 1
+typedef char GLcharARB;
+typedef unsigned int GLhandleARB;
+#define GL_PROGRAM_OBJECT_ARB                               0x8b40
+#define GL_OBJECT_TYPE_ARB                                  0x8b4e
+#define GL_OBJECT_SUBTYPE_ARB                               0x8b4f
+#define GL_OBJECT_DELETE_STATUS_ARB                         0x8b80
+#define GL_OBJECT_COMPILE_STATUS_ARB                        0x8b81
+#define GL_OBJECT_LINK_STATUS_ARB                           0x8b82
+#define GL_OBJECT_VALIDATE_STATUS_ARB                       0x8b83
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB                       0x8b84
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB                      0x8b85
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB                       0x8b86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB             0x8b87
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB                  0x8b88
+#define GL_SHADER_OBJECT_ARB                                0x8b48
+#define GL_FLOAT_VEC2_ARB                                   0x8b50
+#define GL_FLOAT_VEC3_ARB                                   0x8b51
+#define GL_FLOAT_VEC4_ARB                                   0x8b52
+#define GL_INT_VEC2_ARB                                     0x8b53
+#define GL_INT_VEC3_ARB                                     0x8b54
+#define GL_INT_VEC4_ARB                                     0x8b55
+#define GL_BOOL_ARB                                         0x8b56
+#define GL_BOOL_VEC2_ARB                                    0x8b57
+#define GL_BOOL_VEC3_ARB                                    0x8b58
+#define GL_BOOL_VEC4_ARB                                    0x8b59
+#define GL_FLOAT_MAT2_ARB                                   0x8b5a
+#define GL_FLOAT_MAT3_ARB                                   0x8b5b
+#define GL_FLOAT_MAT4_ARB                                   0x8b5c
+#define GL_SAMPLER_1D_ARB                                   0x8b5d
+#define GL_SAMPLER_2D_ARB                                   0x8b5e
+#define GL_SAMPLER_3D_ARB                                   0x8b5f
+#define GL_SAMPLER_CUBE_ARB                                 0x8b60
+#define GL_SAMPLER_1D_SHADOW_ARB                            0x8b61
+#define GL_SAMPLER_2D_SHADOW_ARB                            0x8b62
+#define GL_SAMPLER_2D_RECT_ARB                              0x8b63
+#define GL_SAMPELR_2D_RECT_SHADOW_ARB                       0x8b64
+#endif
+
+/* GL_ARB_shading_language_100 */
+#ifndef GL_ARB_shading_language_100
+#define GL_ARB_shading_language_100 1
+#define GL_SHADING_LANGUAGE_VERSION_ARB                     0x8b8c
+#endif
+
+/* GL_ARB_sync */
+#ifndef GL_ARB_sync
+#define GL_ARB_sync 1
+#define GL_MAX_SERVER_WAIT_TIMEOUT              0x9111
+#define GL_OBJECT_TYPE                          0x9112
+#define GL_SYNC_CONDITION                       0x9113
+#define GL_SYNC_STATUS                          0x9114
+#define GL_SYNC_FLAGS                           0x9115
+#define GL_SYNC_FENCE                           0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE           0x9117
+#define GL_UNSIGNALED                           0x9118
+#define GL_SIGNALED                             0x9119
+#define GL_SYNC_FLUSH_COMMANDS_BIT              0x00000001
+#define GL_TIMEOUT_IGNORED                      0xffffffffffffffffULL
+#define GL_ALREADY_SIGNALED                     0x911a
+#define GL_TIMEOUT_EXPIRED                      0x911b
+#define GL_CONDITION_SATISFIED                  0x911c
+#define GL_WAIT_FAILED                          0x911d
+#endif
+typedef GLsync (WINE_GLAPI *PGLFNFENCESYNCPROC)(GLenum condition, GLbitfield flags);
+typedef GLboolean (WINE_GLAPI *PGLFNISSYNCPROC)(GLsync sync);
+typedef GLvoid (WINE_GLAPI *PGLFNDELETESYNCPROC)(GLsync sync);
+typedef GLenum (WINE_GLAPI *PGLFNCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef GLvoid (WINE_GLAPI *PGLFNWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef GLvoid (WINE_GLAPI *PGLFNGETINTEGER64VPROC)(GLenum pname, GLint64 *params);
+typedef GLvoid (WINE_GLAPI *PGLFNGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei bufsize,
+        GLsizei *length, GLint *values);
+
+/* GL_ARB_texture_border_clamp */
+#ifndef GL_ARB_texture_border_clamp
+#define GL_ARB_texture_border_clamp 1
+#define GL_CLAMP_TO_BORDER_ARB                              0x812d
+#endif
+
+/* GL_ARB_texture_cube_map */
+#ifndef GL_ARB_texture_cube_map
+#define GL_ARB_texture_cube_map 1
+#define GL_NORMAL_MAP_ARB                                   0x8511
+#define GL_REFLECTION_MAP_ARB                               0x8512
+#define GL_TEXTURE_CUBE_MAP_ARB                             0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARB                     0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB                  0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB                  0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB                  0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB                  0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB                  0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB                  0x851a
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARB                       0x851b
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB                    0x851c
+#endif
+
+/* GL_ARB_texture_env_dot3 */
+#ifndef GL_ARB_texture_env_dot3
+#define GL_ARB_texture_env_dot3 1
+#define GL_DOT3_RGB_ARB                                     0x86ae
+#define GL_DOT3_RGBA_ARB                                    0x86af
+#endif
+
+/* GL_ARB_texture_float */
+#ifndef GL_ARB_texture_float
+#define GL_ARB_texture_float 1
+#define GL_RGBA32F_ARB                                      0x8814
+#define GL_RGB32F_ARB                                       0x8815
+#define GL_RGBA16F_ARB                                      0x881a
+#define GL_RGB16F_ARB                                       0x881b
+#endif
+
+/* GL_ARB_texture_mirrored_repeat */
+#ifndef GL_ARB_texture_mirrored_repeat
+#define GL_ARB_texture_mirrored_repeat 1
+#define GL_MIRRORED_REPEAT_ARB                              0x8370
+#endif
+
+/* GL_ARB_texture_rectangle */
+#ifndef GL_ARB_texture_rectangle
+#define GL_ARB_texture_rectangle 1
+#define GL_TEXTURE_RECTANGLE_ARB                            0x84f5
+#define GL_TEXTURE_BINDING_RECTANGLE_ARB                    0x84f6
+#define GL_PROXY_TEXTURE_RECTANGLE_ARB                      0x84f7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB                   0x84f8
+#define GL_SAMPLER_2D_RECT_ARB                              0x8b63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB                       0x8b64
+#endif
+
+/* GL_ARB_texture_rg */
+#ifndef GL_ARB_texture_rg
+#define GL_ARB_texture_rg 1
+#define GL_RG                                               0x8227
+#define GL_RG_INTEGER                                       0x8228
+#define GL_R8                                               0x8229
+#define GL_R16                                              0x822a
+#define GL_RG8                                              0x822b
+#define GL_RG16                                             0x822c
+#define GL_R16F                                             0x822d
+#define GL_R32F                                             0x822e
+#define GL_RG16F                                            0x822f
+#define GL_RG32F                                            0x8230
+#define GL_R8I                                              0x8231
+#define GL_R8UI                                             0x8232
+#define GL_R16I                                             0x8233
+#define GL_R16UI                                            0x8234
+#define GL_R32I                                             0x8235
+#define GL_R32UI                                            0x8236
+#define GL_RG8I                                             0x8237
+#define GL_RG8UI                                            0x8238
+#define GL_RG16I                                            0x8239
+#define GL_RG16UI                                           0x823a
+#define GL_RG32I                                            0x823b
+#define GL_RG32UI                                           0x823c
 #endif
-typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXPROC)(GLenum mode);
 
 /* GL_ARB_vertex_blend */
 #ifndef GL_ARB_vertex_blend
 #define GL_ARB_vertex_blend 1
-#define GL_MAX_VERTEX_UNITS_ARB           0x86A4
-#define GL_ACTIVE_VERTEX_UNITS_ARB        0x86A5
-#define GL_WEIGHT_SUM_UNITY_ARB           0x86A6
-#define GL_VERTEX_BLEND_ARB               0x86A7
-#define GL_CURRENT_WEIGHT_ARB             0x86A8
-#define GL_WEIGHT_ARRAY_TYPE_ARB          0x86A9
-#define GL_WEIGHT_ARRAY_STRIDE_ARB        0x86AA
-#define GL_WEIGHT_ARRAY_SIZE_ARB          0x86AB
-#define GL_WEIGHT_ARRAY_POINTER_ARB       0x86AC
-#define GL_WEIGHT_ARRAY_ARB               0x86AD
-#define GL_MODELVIEW0_ARB                 0x1700
-#define GL_MODELVIEW1_ARB                 0x850A
-#define GL_MODELVIEW2_ARB                 0x8722
-#define GL_MODELVIEW3_ARB                 0x8723
-#define GL_MODELVIEW4_ARB                 0x8724
-#define GL_MODELVIEW5_ARB                 0x8725
-#define GL_MODELVIEW6_ARB                 0x8726
-#define GL_MODELVIEW7_ARB                 0x8727
-#define GL_MODELVIEW8_ARB                 0x8728
-#define GL_MODELVIEW9_ARB                 0x8729
-#define GL_MODELVIEW10_ARB                0x872A
-#define GL_MODELVIEW11_ARB                0x872B
-#define GL_MODELVIEW12_ARB                0x872C
-#define GL_MODELVIEW13_ARB                0x872D
-#define GL_MODELVIEW14_ARB                0x872E
-#define GL_MODELVIEW15_ARB                0x872F
-#define GL_MODELVIEW16_ARB                0x8730
-#define GL_MODELVIEW17_ARB                0x8731
-#define GL_MODELVIEW18_ARB                0x8732
-#define GL_MODELVIEW19_ARB                0x8733
-#define GL_MODELVIEW20_ARB                0x8734
-#define GL_MODELVIEW21_ARB                0x8735
-#define GL_MODELVIEW22_ARB                0x8736
-#define GL_MODELVIEW23_ARB                0x8737
-#define GL_MODELVIEW24_ARB                0x8738
-#define GL_MODELVIEW25_ARB                0x8739
-#define GL_MODELVIEW26_ARB                0x873A
-#define GL_MODELVIEW27_ARB                0x873B
-#define GL_MODELVIEW28_ARB                0x873C
-#define GL_MODELVIEW29_ARB                0x873D
-#define GL_MODELVIEW30_ARB                0x873E
-#define GL_MODELVIEW31_ARB                0x873F
+#define GL_MAX_VERTEX_UNITS_ARB                             0x86a4
+#define GL_ACTIVE_VERTEX_UNITS_ARB                          0x86a5
+#define GL_WEIGHT_SUM_UNITY_ARB                             0x86a6
+#define GL_VERTEX_BLEND_ARB                                 0x86a7
+#define GL_CURRENT_WEIGHT_ARB                               0x86a8
+#define GL_WEIGHT_ARRAY_TYPE_ARB                            0x86a9
+#define GL_WEIGHT_ARRAY_STRIDE_ARB                          0x86aa
+#define GL_WEIGHT_ARRAY_SIZE_ARB                            0x86ab
+#define GL_WEIGHT_ARRAY_POINTER_ARB                         0x86ac
+#define GL_WEIGHT_ARRAY_ARB                                 0x86ad
+#define GL_MODELVIEW0_ARB                                   0x1700
+#define GL_MODELVIEW1_ARB                                   0x850a
+#define GL_MODELVIEW2_ARB                                   0x8722
+#define GL_MODELVIEW3_ARB                                   0x8723
+#define GL_MODELVIEW4_ARB                                   0x8724
+#define GL_MODELVIEW5_ARB                                   0x8725
+#define GL_MODELVIEW6_ARB                                   0x8726
+#define GL_MODELVIEW7_ARB                                   0x8727
+#define GL_MODELVIEW8_ARB                                   0x8728
+#define GL_MODELVIEW9_ARB                                   0x8729
+#define GL_MODELVIEW10_ARB                                  0x872a
+#define GL_MODELVIEW11_ARB                                  0x872b
+#define GL_MODELVIEW12_ARB                                  0x872c
+#define GL_MODELVIEW13_ARB                                  0x872d
+#define GL_MODELVIEW14_ARB                                  0x872e
+#define GL_MODELVIEW15_ARB                                  0x872f
+#define GL_MODELVIEW16_ARB                                  0x8730
+#define GL_MODELVIEW17_ARB                                  0x8731
+#define GL_MODELVIEW18_ARB                                  0x8732
+#define GL_MODELVIEW19_ARB                                  0x8733
+#define GL_MODELVIEW20_ARB                                  0x8734
+#define GL_MODELVIEW21_ARB                                  0x8735
+#define GL_MODELVIEW22_ARB                                  0x8736
+#define GL_MODELVIEW23_ARB                                  0x8737
+#define GL_MODELVIEW24_ARB                                  0x8738
+#define GL_MODELVIEW25_ARB                                  0x8739
+#define GL_MODELVIEW26_ARB                                  0x873a
+#define GL_MODELVIEW27_ARB                                  0x873b
+#define GL_MODELVIEW28_ARB                                  0x873c
+#define GL_MODELVIEW29_ARB                                  0x873d
+#define GL_MODELVIEW30_ARB                                  0x873e
+#define GL_MODELVIEW31_ARB                                  0x873f
 #endif
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTPOINTERARB) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTBV) (GLint size, const GLbyte *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTSV) (GLint size, const GLshort *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTIV) (GLint size, const GLint *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTFV) (GLint size, const GLfloat *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTDV) (GLint size, const GLdouble *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTUBV) (GLint size, const GLubyte *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTUSV) (GLint size, const GLushort *weights);
-typedef void (WINE_GLAPI * PGLFNGLWEIGHTUIV) (GLint size, const GLuint *weights);
-typedef void (WINE_GLAPI * PGLFNGLVERTEXBLENDARB) (GLint count);
-/* GL_ARB_pixel_buffer_object */
-#ifndef GL_ARB_pixel_buffer_object
-#define GL_ARB_pixel_buffer_object 1
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTPOINTERARB)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTBV)(GLint size, const GLbyte *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTSV)(GLint size, const GLshort *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTIV)(GLint size, const GLint *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTFV)(GLint size, const GLfloat *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTDV)(GLint size, const GLdouble *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTUBV)(GLint size, const GLubyte *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTUSV)(GLint size, const GLushort *weights);
+typedef void (WINE_GLAPI *PGLFNGLWEIGHTUIV)(GLint size, const GLuint *weights);
+typedef void (WINE_GLAPI *PGLFNGLVERTEXBLENDARB)(GLint count);
+
+/* GL_ARB_vertex_buffer_object */
+#ifndef GL_ARB_vertex_buffer_object
+#define GL_ARB_vertex_buffer_object 1
+#define GL_BUFFER_SIZE_ARB                                  0x8764
+#define GL_BUFFER_USAGE_ARB                                 0x8765
+#define GL_ARRAY_BUFFER_ARB                                 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER_ARB                         0x8893
+#define GL_ARRAY_BUFFER_BINDING_ARB                         0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB                 0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB                  0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB                  0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB                   0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB                   0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB           0x889a
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB               0x889b
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB         0x889c
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB          0x889d
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB                  0x889e
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB           0x889f
+#define GL_READ_ONLY_ARB                                    0x88b8
+#define GL_WRITE_ONLY_ARB                                   0x88b9
+#define GL_READ_WRITE_ARB                                   0x88ba
+#define GL_BUFFER_ACCESS_ARB                                0x88bb
+#define GL_BUFFER_MAPPED_ARB                                0x88bc
+#define GL_BUFFER_MAP_POINTER_ARB                           0x88bd
+#define GL_STREAM_DRAW_ARB                                  0x88e0
+#define GL_STREAM_READ_ARB                                  0x88e1
+#define GL_STREAM_COPY_ARB                                  0x88e2
+#define GL_STATIC_DRAW_ARB                                  0x88e4
+#define GL_STATIC_READ_ARB                                  0x88e5
+#define GL_STATIC_COPY_ARB                                  0x88e6
+#define GL_DYNAMIC_DRAW_ARB                                 0x88e8
+#define GL_DYNAMIC_READ_ARB                                 0x88e9
+#define GL_DYNAMIC_COPY_ARB                                 0x88ea
+#endif
+typedef void (WINE_GLAPI *PGLFNBINDBUFFERARBPROC)(GLenum target, GLuint buffer);
+typedef void (WINE_GLAPI *PGLFNDELETEBUFFERSARBPROC)(GLsizei n, const GLuint *buffers);
+typedef void (WINE_GLAPI *PGLFNGENBUFFERSARBPROC)(GLsizei n, GLuint *buffers);
+typedef GLboolean (WINE_GLAPI *PGLFNISBUFFERARBPROC)(GLuint buffer);
+typedef void (WINE_GLAPI *PGLFNBUFFERDATAARBPROC)(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+typedef void (WINE_GLAPI *PGLFNBUFFERSUBDATAARBPROC)(GLenum target,
+        GLintptr offset, GLsizeiptr size, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+typedef GLvoid* (WINE_GLAPI *PGLFNMAPBUFFERARBPROC)(GLenum  target, GLenum access);
+typedef GLboolean (WINE_GLAPI *PGLFNUNMAPBUFFERARBPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, GLvoid* *params);
+
+/* GL_ARB_vertex_program */
+#ifndef GL_ARB_vertex_program
+#define GL_ARB_vertex_program 1
+#define GL_VERTEX_PROGRAM_ARB                               0x8620
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB                    0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB                      0x8643
+#define GL_COLOR_SUM_ARB                                    0x8458
+#define GL_PROGRAM_FORMAT_ASCII_ARB                         0x8875
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB                  0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB                     0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB                   0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB                     0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB               0x886a
+#define GL_CURRENT_VERTEX_ATTRIB_ARB                        0x8626
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB                  0x8645
+#define GL_PROGRAM_LENGTH_ARB                               0x8627
+#define GL_PROGRAM_FORMAT_ARB                               0x8876
+#define GL_PROGRAM_BINDING_ARB                              0x8677
+#define GL_PROGRAM_INSTRUCTIONS_ARB                         0x88a0
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB                     0x88a1
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB                  0x88a2
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB              0x88a3
+#define GL_PROGRAM_TEMPORARIES_ARB                          0x88a4
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB                      0x88a5
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB                   0x88a6
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB               0x88a7
+#define GL_PROGRAM_PARAMETERS_ARB                           0x88a8
+#define GL_MAX_PROGRAM_PARAMETERS_ARB                       0x88a9
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB                    0x88aa
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB                0x88ab
+#define GL_PROGRAM_ATTRIBS_ARB                              0x88ac
+#define GL_MAX_PROGRAM_ATTRIBS_ARB                          0x88ad
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB                       0x88ae
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB                   0x88af
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB                    0x88b0
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB                0x88b1
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB             0x88b2
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB         0x88b3
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB                 0x88b4
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB                   0x88b5
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB                  0x88b6
+#define GL_PROGRAM_STRING_ARB                               0x8628
+#define GL_PROGRAM_ERROR_POSITION_ARB                       0x864b
+#define GL_CURRENT_MATRIX_ARB                               0x8641
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB                     0x88b7
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB                   0x8640
+#define GL_MAX_VERTEX_ATTRIBS_ARB                           0x8869
+#define GL_MAX_PROGRAM_MATRICES_ARB                         0x862f
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB               0x862e
+#define GL_PROGRAM_ERROR_STRING_ARB                         0x8874
+#define GL_MATRIX0_ARB                                      0x88c0
+#define GL_MATRIX1_ARB                                      0x88c1
+#define GL_MATRIX2_ARB                                      0x88c2
+#define GL_MATRIX3_ARB                                      0x88c3
+#define GL_MATRIX4_ARB                                      0x88c4
+#define GL_MATRIX5_ARB                                      0x88c5
+#define GL_MATRIX6_ARB                                      0x88c6
+#define GL_MATRIX7_ARB                                      0x88c7
+#define GL_MATRIX8_ARB                                      0x88c8
+#define GL_MATRIX9_ARB                                      0x88c9
+#define GL_MATRIX10_ARB                                     0x88ca
+#define GL_MATRIX11_ARB                                     0x88cb
+#define GL_MATRIX12_ARB                                     0x88cc
+#define GL_MATRIX13_ARB                                     0x88cd
+#define GL_MATRIX14_ARB                                     0x88ce
+#define GL_MATRIX15_ARB                                     0x88cf
+#define GL_MATRIX16_ARB                                     0x88d0
+#define GL_MATRIX17_ARB                                     0x88d1
+#define GL_MATRIX18_ARB                                     0x88d2
+#define GL_MATRIX19_ARB                                     0x88d3
+#define GL_MATRIX20_ARB                                     0x88d4
+#define GL_MATRIX21_ARB                                     0x88d5
+#define GL_MATRIX22_ARB                                     0x88d6
+#define GL_MATRIX23_ARB                                     0x88d7
+#define GL_MATRIX24_ARB                                     0x88d8
+#define GL_MATRIX25_ARB                                     0x88d9
+#define GL_MATRIX26_ARB                                     0x88da
+#define GL_MATRIX27_ARB                                     0x88db
+#define GL_MATRIX28_ARB                                     0x88dc
+#define GL_MATRIX29_ARB                                     0x88dd
+#define GL_MATRIX30_ARB                                     0x88de
+#define GL_MATRIX31_ARB                                     0x88df
+#endif
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size,
+        GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+typedef void (WINE_GLAPI *PGLFNENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index);
+typedef void (WINE_GLAPI *PGLFNPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const GLvoid *string);
+typedef void (WINE_GLAPI *PGLFNBINDPROGRAMARBPROC)(GLenum target, GLuint program);
+typedef void (WINE_GLAPI *PGLFNDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint *programs);
+typedef void (WINE_GLAPI *PGLFNGENPROGRAMSARBPROC)(GLsizei n, GLuint *programs);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4DARBPROC)(GLenum target,
+        GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4FARBPROC)(GLenum target,
+        GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target,
+        GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target,
+        GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, GLvoid *string);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, GLvoid* *pointer);
+typedef GLboolean (WINE_GLAPI *PGLFNISPROGRAMARBPROC)(GLuint program);
+
+/* GL_ARB_vertex_shader */
+#ifndef GL_ARB_vertex_shader
+#define GL_ARB_vertex_shader 1
+#define GL_VERTEX_SHADER_ARB                                0x8b31
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB                0x8b4a
+#define GL_MAX_VARYING_FLOATS_ARB                           0x8b4b
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB               0x8b4c
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB             0x8b4d
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB                     0x8b89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB           0x8b8a
+#endif
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat *params);
+typedef GLint (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB *name);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index,
+        GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4FARBPROC)(GLint location,
+        GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location,
+        GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat *params);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint *params);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETINFOLOGARBPROC)(GLhandleARB obj,
+        GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
+typedef void (WINE_GLAPI *WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj);
+typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType);
+typedef void (WINE_GLAPI *WINED3D_PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj,
+        GLsizei count, const GLcharARB* *string, const GLint *length);
+typedef void (WINE_GLAPI *WINED3D_PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj);
+typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC)(void);
+typedef void (WINE_GLAPI *WINED3D_PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj,
+        GLsizei maxCount, GLsizei *count, GLhandleARB *obj);
+typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLGETHANDLEARBPROC)(GLenum pname);
+typedef void (WINE_GLAPI *WINED3D_PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj,
+        GLsizei maxLength, GLsizei *length, GLcharARB *source);
+typedef void (WINE_GLAPI *WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj,
+        GLuint index, const GLcharARB *name);
+typedef GLint (WINE_GLAPI *WINED3D_PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB *name);
+
+/* GL_ATI_fragment_shader */
+#ifndef GL_ATI_fragment_shader
+#define GL_ATI_fragment_shader 1
+#define GL_FRAGMENT_SHADER_ATI                              0x8920
+#define GL_REG_0_ATI                                        0x8921
+#define GL_REG_1_ATI                                        0x8922
+#define GL_REG_2_ATI                                        0x8923
+#define GL_REG_3_ATI                                        0x8924
+#define GL_REG_4_ATI                                        0x8925
+#define GL_REG_5_ATI                                        0x8926
+#define GL_CON_0_ATI                                        0x8941
+#define GL_CON_1_ATI                                        0x8942
+#define GL_CON_2_ATI                                        0x8943
+#define GL_CON_3_ATI                                        0x8944
+#define GL_CON_4_ATI                                        0x8945
+#define GL_CON_5_ATI                                        0x8946
+#define GL_CON_6_ATI                                        0x8947
+#define GL_CON_7_ATI                                        0x8948
+#define GL_MOV_ATI                                          0x8961
+#define GL_ADD_ATI                                          0x8963
+#define GL_MUL_ATI                                          0x8964
+#define GL_SUB_ATI                                          0x8965
+#define GL_DOT3_ATI                                         0x8966
+#define GL_DOT4_ATI                                         0x8967
+#define GL_MAD_ATI                                          0x8968
+#define GL_LERP_ATI                                         0x8969
+#define GL_CND_ATI                                          0x896a
+#define GL_CND0_ATI                                         0x896b
+#define GL_DOT2_ADD_ATI                                     0x896c
+#define GL_SECONDARY_INTERPOLATOR_ATI                       0x896d
+#define GL_SWIZZLE_STR_ATI                                  0x8976
+#define GL_SWIZZLE_STQ_ATI                                  0x8977
+#define GL_SWIZZLE_STR_DR_ATI                               0x8978
+#define GL_SWIZZLE_STQ_DQ_ATI                               0x8979
+#define GL_RED_BIT_ATI                                      0x00000001
+#define GL_GREEN_BIT_ATI                                    0x00000002
+#define GL_BLUE_BIT_ATI                                     0x00000004
+#define GL_2X_BIT_ATI                                       0x00000001
+#define GL_4X_BIT_ATI                                       0x00000002
+#define GL_8X_BIT_ATI                                       0x00000004
+#define GL_HALF_BIT_ATI                                     0x00000008
+#define GL_QUARTER_BIT_ATI                                  0x00000010
+#define GL_EIGHTH_BIT_ATI                                   0x00000020
+#define GL_SATURATE_BIT_ATI                                 0x00000040
+#define GL_COMP_BIT_ATI                                     0x00000002
+#define GL_NEGATE_BIT_ATI                                   0x00000004
+#define GL_BIAS_BIT_ATI                                     0x00000008
+#endif
+typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI)(GLuint range);
+typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI)(GLuint id);
+typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI)(GLuint id);
+typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI)(void);
+typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI)(void);
+typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI)(GLuint dst, GLuint coord, GLenum swizzle);
+typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI)(GLuint dst, GLuint interp, GLenum swizzle);
+typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI)(GLenum op, GLuint dst, GLuint dstMask,
+        GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP2ATI)(GLenum op, GLuint dst, GLuint dstMask,
+        GLuint dstMod, GLuint arg1, GLuint arg1Rep,
+        GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
+        GLuint arg2Mod);
+typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP3ATI)(GLenum op, GLuint dst, GLuint dstMask,
+        GLuint dstMod, GLuint arg1, GLuint arg1Rep,
+        GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
+        GLuint arg2Mod, GLuint arg3, GLuint arg3Rep,
+        GLuint arg3Mod);
+typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP1ATI)(GLenum op, GLuint dst, GLuint dstMod,
+        GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP2ATI)(GLenum op, GLuint dst, GLuint dstMod,
+        GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
+        GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP3ATI)(GLenum op, GLuint dst, GLuint dstMod,
+        GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
+        GLuint arg2, GLuint arg2Rep, GLuint arg2Mod,
+        GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
+typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI)(GLuint dst, const GLfloat *value);
+
+/* GL_ATI_separate_stencil */
+#ifndef GL_ATI_separate_stencil
+#define GL_ATI_separate_stencil 1
+#define GL_STENCIL_BACK_FUNC_ATI                            0x8800
+#define GL_STENCIL_BACK_FAIL_ATI                            0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI                 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI                 0x8803
+#endif
+typedef void (WINE_GLAPI *PGLFNSTENCILOPSEPARATEATIPROC)(GLenum, GLenum, GLenum, GLenum);
+typedef void (WINE_GLAPI *PGLFNSTENCILFUNCSEPARATEATIPROC)(GLenum, GLenum, GLint, GLuint);
+
+/* GL_ATI_texture_compression_3dc */
+#ifndef GL_ATI_texture_compression_3dc
+#define GL_ATI_texture_compression_3dc 1
+#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI               0x8837
+#endif
+
+/* GL_ATI_texture_env_combine3 */
+#ifndef GL_ATI_texture_env_combine3
+#define GL_ATI_texture_env_combine3 1
+#define GL_MODULATE_ADD_ATI                                 0x8744
+#define GL_MODULATE_SIGNED_ADD_ATI                          0x8745
+#define GL_MODULATE_SUBTRACT_ATI                            0x8746
+/* #define ONE */
+/* #define ZERO */
 #endif
-#define GL_PIXEL_PACK_BUFFER_ARB               0x88EB
-#define GL_PIXEL_UNPACK_BUFFER_ARB             0x88EC
-#define GL_PIXEL_PACK_BUFFER_BINDING_ARB       0x88ED
-#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB     0x88EF
-/* GL_EXT_framebuffer_object */
-#ifndef GL_EXT_framebuffer_object
-#define GL_EXT_framebuffer_object 1
-#define GL_FRAMEBUFFER_EXT                     0x8D40
-#define GL_RENDERBUFFER_EXT                    0x8D41
-#define GL_STENCIL_INDEX1_EXT                  0x8D46
-#define GL_STENCIL_INDEX4_EXT                  0x8D47
-#define GL_STENCIL_INDEX8_EXT                  0x8D48
-#define GL_STENCIL_INDEX16_EXT                 0x8D49
-#define GL_RENDERBUFFER_WIDTH_EXT              0x8D42
-#define GL_RENDERBUFFER_HEIGHT_EXT             0x8D43
-#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT    0x8D44
-#define GL_RENDERBUFFER_RED_SIZE_EXT           0x8D50
-#define GL_RENDERBUFFER_GREEN_SIZE_EXT         0x8D51
-#define GL_RENDERBUFFER_BLUE_SIZE_EXT          0x8D52
-#define GL_RENDERBUFFER_ALPHA_SIZE_EXT         0x8D53
-#define GL_RENDERBUFFER_DEPTH_SIZE_EXT         0x8D54
-#define GL_RENDERBUFFER_STENCIL_SIZE_EXT       0x8D55
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT            0x8CD0
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT            0x8CD1
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT          0x8CD2
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT  0x8CD3
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT     0x8CD4
-#define GL_COLOR_ATTACHMENT0_EXT                0x8CE0
-#define GL_COLOR_ATTACHMENT1_EXT                0x8CE1
-#define GL_COLOR_ATTACHMENT2_EXT                0x8CE2
-#define GL_COLOR_ATTACHMENT3_EXT                0x8CE3
-#define GL_COLOR_ATTACHMENT4_EXT                0x8CE4
-#define GL_COLOR_ATTACHMENT5_EXT                0x8CE5
-#define GL_COLOR_ATTACHMENT6_EXT                0x8CE6
-#define GL_COLOR_ATTACHMENT7_EXT                0x8CE7
-#define GL_COLOR_ATTACHMENT8_EXT                0x8CE8
-#define GL_COLOR_ATTACHMENT9_EXT                0x8CE9
-#define GL_COLOR_ATTACHMENT10_EXT               0x8CEA
-#define GL_COLOR_ATTACHMENT11_EXT               0x8CEB
-#define GL_COLOR_ATTACHMENT12_EXT               0x8CEC
-#define GL_COLOR_ATTACHMENT13_EXT               0x8CED
-#define GL_COLOR_ATTACHMENT14_EXT               0x8CEE
-#define GL_COLOR_ATTACHMENT15_EXT               0x8CEF
-#define GL_DEPTH_ATTACHMENT_EXT                 0x8D00
-#define GL_STENCIL_ATTACHMENT_EXT               0x8D20
-#define GL_FRAMEBUFFER_COMPLETE_EXT                          0x8CD5
-#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT             0x8CD6
-#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT     0x8CD7
-#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT             0x8CD9
-#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT                0x8CDA
-#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT            0x8CDB
-#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT            0x8CDC
-#define GL_FRAMEBUFFER_UNSUPPORTED_EXT                       0x8CDD
-#define GL_FRAMEBUFFER_BINDING_EXT             0x8CA6
-#define GL_RENDERBUFFER_BINDING_EXT            0x8CA7
-#define GL_MAX_COLOR_ATTACHMENTS_EXT           0x8CDF
-#define GL_MAX_RENDERBUFFER_SIZE_EXT           0x84E8
-#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT   0x0506
 
+/* GL_ATI_texture_mirror_once */
+#ifndef GL_ATI_texture_mirror_once
+#define GL_ATI_texture_mirror_once 1
+#define GL_MIRROR_CLAMP_ATI                                 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_ATI                         0x8743
+#endif
+
+/* GL_EXT_blend_equation_separate */
+typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha);
+
+/* GL_EXT_blend_func_separate */
+#ifndef GL_EXT_blend_func_separate
+#define GL_EXT_blend_func_separate 1
+#define GL_BLEND_DST_RGB_EXT                                0x80c8
+#define GL_BLEND_SRC_RGB_EXT                                0x80c9
+#define GL_BLEND_DST_ALPHA_EXT                              0x80ca
+#define GL_BLEND_SRC_ALPHA_EXT                              0x80cb
+#endif
+typedef void (WINE_GLAPI *PGLFNBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB,
+        GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+/* GL_EXT_fog_coord */
+#ifndef GL_EXT_fog_coord
+#define GL_EXT_fog_coord 1
+#define GL_FOG_COORDINATE_SOURCE_EXT                        0x8450
+#define GL_FOG_COORDINATE_EXT                               0x8451
+#define GL_FRAGMENT_DEPTH_EXT                               0x8452
+#define GL_CURRENT_FOG_COORDINATE_EXT                       0x8453
+#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT                    0x8454
+#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT                  0x8455
+#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT                 0x8456
+#define GL_FOG_COORDINATE_ARRAY_EXT                         0x8457
 #endif
-typedef GLboolean (WINE_GLAPI * PGLFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint *renderbuffers);
-typedef void (WINE_GLAPI * PGLFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (WINE_GLAPI * PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint *params);
-typedef GLboolean (WINE_GLAPI * PGLFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
-typedef void (WINE_GLAPI * PGLFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint *framebuffers);
-typedef void (WINE_GLAPI * PGLFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint *framebuffers);
-typedef GLenum (WINE_GLAPI * PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
-typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-typedef void (WINE_GLAPI * PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDFEXTPROC)(GLfloat coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDFVEXTPROC)(const GLfloat *coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDDEXTPROC)(GLdouble coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDDVEXTPROC)(const GLdouble *coord);
+typedef void (WINE_GLAPI *PGLFNGLFOGCOORDPOINTEREXTPROC)(GLenum type, GLsizei stride, GLvoid *data);
+
 /* GL_EXT_framebuffer_blit */
 #ifndef GL_EXT_framebuffer_blit
 #define GL_EXT_framebuffer_blit 1
-#define GL_READ_FRAMEBUFFER_EXT                0x8CA8
-#define GL_DRAW_FRAMEBUFFER_EXT                0x8CA9
-#define GL_DRAW_FRAMEBUFFER_BINDING_EXT        0x8CA6
-#define GL_READ_FRAMEBUFFER_BINDING_EXT        0x8CAA
+#define GL_READ_FRAMEBUFFER_EXT                             0x8ca8
+#define GL_DRAW_FRAMEBUFFER_EXT                             0x8ca9
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT                     0x8ca6
+#define GL_READ_FRAMEBUFFER_BINDING_EXT                     0x8caa
 #endif
-typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (WINE_GLAPI *PGLFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+        GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
 
 /* GL_EXT_framebuffer_multisample */
 #ifndef GL_EXT_framebuffer_multisample
 #define GL_EXT_framebuffer_multisample 1
-#define GL_RENDERBUFFER_SAMPLES_EXT                 0x8cab
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT   0x8d56
-#define GL_MAX_SAMPLES_EXT                          0x8d57
+#define GL_RENDERBUFFER_SAMPLES_EXT                         0x8cab
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT           0x8d56
+#define GL_MAX_SAMPLES_EXT                                  0x8d57
+#endif
+typedef void (WINE_GLAPI *PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples,
+        GLenum internalformat, GLsizei width, GLsizei height);
+
+/* GL_EXT_framebuffer_object */
+#ifndef GL_EXT_framebuffer_object
+#define GL_EXT_framebuffer_object 1
+#define GL_FRAMEBUFFER_EXT                                  0x8d40
+#define GL_RENDERBUFFER_EXT                                 0x8d41
+#define GL_STENCIL_INDEX1_EXT                               0x8d46
+#define GL_STENCIL_INDEX4_EXT                               0x8d47
+#define GL_STENCIL_INDEX8_EXT                               0x8d48
+#define GL_STENCIL_INDEX16_EXT                              0x8d49
+#define GL_RENDERBUFFER_WIDTH_EXT                           0x8d42
+#define GL_RENDERBUFFER_HEIGHT_EXT                          0x8d43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT                 0x8d44
+#define GL_RENDERBUFFER_RED_SIZE_EXT                        0x8d50
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT                      0x8d51
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT                       0x8d52
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT                      0x8d53
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT                      0x8d54
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT                    0x8d55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT           0x8cd0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT           0x8cd1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT         0x8cd2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8cd3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT    0x8cd4
+#define GL_COLOR_ATTACHMENT0_EXT                            0x8ce0
+#define GL_COLOR_ATTACHMENT1_EXT                            0x8ce1
+#define GL_COLOR_ATTACHMENT2_EXT                            0x8ce2
+#define GL_COLOR_ATTACHMENT3_EXT                            0x8ce3
+#define GL_COLOR_ATTACHMENT4_EXT                            0x8ce4
+#define GL_COLOR_ATTACHMENT5_EXT                            0x8ce5
+#define GL_COLOR_ATTACHMENT6_EXT                            0x8ce6
+#define GL_COLOR_ATTACHMENT7_EXT                            0x8ce7
+#define GL_COLOR_ATTACHMENT8_EXT                            0x8ce8
+#define GL_COLOR_ATTACHMENT9_EXT                            0x8ce9
+#define GL_COLOR_ATTACHMENT10_EXT                           0x8cea
+#define GL_COLOR_ATTACHMENT11_EXT                           0x8ceb
+#define GL_COLOR_ATTACHMENT12_EXT                           0x8cec
+#define GL_COLOR_ATTACHMENT13_EXT                           0x8ced
+#define GL_COLOR_ATTACHMENT14_EXT                           0x8cee
+#define GL_COLOR_ATTACHMENT15_EXT                           0x8cef
+#define GL_DEPTH_ATTACHMENT_EXT                             0x8d00
+#define GL_STENCIL_ATTACHMENT_EXT                           0x8d20
+#define GL_FRAMEBUFFER_COMPLETE_EXT                         0x8cd5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT            0x8cd6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT    0x8cd7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT            0x8cd9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT               0x8cda
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT           0x8cdb
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT           0x8cdc
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT                      0x8cdd
+#define GL_FRAMEBUFFER_BINDING_EXT                          0x8ca6
+#define GL_RENDERBUFFER_BINDING_EXT                         0x8ca7
+#define GL_MAX_COLOR_ATTACHMENTS_EXT                        0x8cdF
+#define GL_MAX_RENDERBUFFER_SIZE_EXT                        0x84e8
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT                0x0506
+#endif
+typedef GLboolean (WINE_GLAPI *PGLFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint *renderbuffers);
+typedef void (WINE_GLAPI *PGLFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target,
+        GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (WINE_GLAPI *PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint *params);
+typedef GLboolean (WINE_GLAPI *PGLFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer);
+typedef void (WINE_GLAPI *PGLFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint *framebuffers);
+typedef void (WINE_GLAPI *PGLFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint *framebuffers);
+typedef GLenum (WINE_GLAPI *PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment,
+        GLenum textarget, GLuint texture, GLint level);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment,
+        GLenum textarget, GLuint texture, GLint level);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment,
+        GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment,
+        GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (WINE_GLAPI *PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target,
+        GLenum attachment, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGLGENERATEMIPMAPEXTPROC)(GLenum target);
+
+/* GL_EXT_gpu_program_parameters */
+#ifndef GL_EXT_gpu_program_parameters
+#define GL_EXT_gpu_program_parameters 1
+typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETERS4FVEXTPROC)(GLenum target,
+        GLuint index, GLsizei count, const float *params);
+typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC)(GLenum target,
+        GLuint index, GLsizei count, const float *params);
+#endif
+
+/* GL_EXT_gpu_shader4 */
+#ifndef GL_EXT_gpu_shader4
+#define GL_EXT_gpu_shader4 1
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT                  0x88fd
+#define GL_SAMPLER_1D_ARRAY_EXT                             0x8dc0
+#define GL_SAMPLER_2D_ARRAY_EXT                             0x8dc1
+#define GL_SAMPLER_BUFFER_EXT                               0x8dc2
+#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT                      0x8dc3
+#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT                      0x8dc4
+#define GL_SAMPLER_CUBE_SHADOW_EXT                          0x8dc5
+#define GL_UNSIGNED_INT_VEC2_EXT                            0x8dc6
+#define GL_UNSIGNED_INT_VEC3_EXT                            0x8dc7
+#define GL_UNSIGNED_INT_VEC4_EXT                            0x8dc8
+#define GL_INT_SAMPLER_1D_EXT                               0x8dc9
+#define GL_INT_SAMPLER_2D_EXT                               0x8dca
+#define GL_INT_SAMPLER_3D_EXT                               0x8dcb
+#define GL_INT_SAMPLER_CUBE_EXT                             0x8dcc
+#define GL_INT_SAMPLER_2D_RECT_EXT                          0x8dcd
+#define GL_INT_SAMPLER_1D_ARRAY_EXT                         0x8dce
+#define GL_INT_SAMPLER_2D_ARRAY_EXT                         0x8dcf
+#define GL_INT_SAMPLER_BUFFER_EXT                           0x8dd0
+#define GL_UNSIGNED_INT_SAMPLER_1D_EXT                      0x8dd1
+#define GL_UNSIGNED_INT_SAMPLER_2D_EXT                      0x8dd2
+#define GL_UNSIGNED_INT_SAMPLER_3D_EXT                      0x8dd3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT                    0x8dd4
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT                 0x8dd5
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT                0x8dd6
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT                0x8dd7
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT                  0x8dd8
+#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT                     0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT                     0x8905
 #endif
-typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1IEXTPROC)(GLuint index, GLint x);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2IEXTPROC)(GLuint index, GLint x, GLint y);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3IEXTPROC)(GLuint index, GLint x, GLint y, GLint z);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4IEXTPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1UIEXTPROC)(GLuint index, GLuint x);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2UIEXTPROC)(GLuint index, GLuint x, GLuint y);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4IVEXTPROC)(GLuint index, const GLint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UIVEXTPROC)(GLuint index, const GLuint *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4BVEXTPROC)(GLuint index, const GLbyte *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4SVEXTPROC)(GLuint index, const GLshort *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UBVEXTPROC)(GLuint index, const GLubyte *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4USVEXTPROC)(GLuint index, const GLushort *v);
+typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBIPOINTEREXTPROC)(GLuint index, GLint size, GLenum type,
+        GLsizei stride, const GLvoid *pointer);
+typedef GLvoid (WINE_GLAPI *PGLFNGETVERTEXATTRIBIIVEXTPROC)(GLuint index, GLenum pname, GLint *params);
+typedef GLvoid (WINE_GLAPI *PGLFNGETVERTEXATTRIBIUIVEXTPROC)(GLuint index, GLenum pname, GLuint *params);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM1UIEXTPROC)(GLint location, GLuint v0);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM2UIEXTPROC)(GLint location, GLuint v0, GLuint v1);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM3UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM4UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM1UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM2UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM3UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM4UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNGETUNIFORMUIVEXTPROC)(GLuint program, GLint location, const GLuint *params);
+typedef GLvoid (WINE_GLAPI *PGLFNBINDFRAGDATALOCATIONEXTPROC)(GLuint program, GLuint color_number, const GLchar *name);
+typedef GLint (WINE_GLAPI *PGLFNGETFRAGDATALOCATIONEXTPROC)(GLuint program, const GLchar *name);
 
 /* GL_EXT_packed_depth_stencil */
 #ifndef GL_EXT_packed_depth_stencil
 #define GL_EXT_packed_depth_stencil 1
-#define GL_DEPTH_STENCIL_EXT                0x84f9
-#define GL_UNSIGNED_INT_24_8_EXT            0x84fa
-#define GL_DEPTH24_STENCIL8_EXT             0x88f0
-#define GL_TEXTURE_STENCIL_SIZE_EXT         0x88f1
+#define GL_DEPTH_STENCIL_EXT                                0x84f9
+#define GL_UNSIGNED_INT_24_8_EXT                            0x84fa
+#define GL_DEPTH24_STENCIL8_EXT                             0x88f0
+#define GL_TEXTURE_STENCIL_SIZE_EXT                         0x88f1
 #endif
 
-/* GL_EXT_secondary_color */
-#ifndef GL_EXT_secondary_color
-#define GL_EXT_secondary_color 1
-#define GL_COLOR_SUM_EXT                     0x8458
-#define GL_CURRENT_SECONDARY_COLOR_EXT       0x8459
-#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT    0x845A
-#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT    0x845B
-#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT  0x845C
-#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D
-#define GL_SECONDARY_COLOR_ARRAY_EXT         0x845E
-#endif
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
 /* GL_EXT_paletted_texture */
 #ifndef GL_EXT_paletted_texture
 #define GL_EXT_paletted_texture 1
-#define GL_COLOR_INDEX1_EXT               0x80E2
-#define GL_COLOR_INDEX2_EXT               0x80E3
-#define GL_COLOR_INDEX4_EXT               0x80E4
-#define GL_COLOR_INDEX8_EXT               0x80E5
-#define GL_COLOR_INDEX12_EXT              0x80E6
-#define GL_COLOR_INDEX16_EXT              0x80E7
-#define GL_TEXTURE_INDEX_SIZE_EXT         0x80ED
+#define GL_COLOR_INDEX1_EXT                                 0x80e2
+#define GL_COLOR_INDEX2_EXT                                 0x80e3
+#define GL_COLOR_INDEX4_EXT                                 0x80e4
+#define GL_COLOR_INDEX8_EXT                                 0x80e5
+#define GL_COLOR_INDEX12_EXT                                0x80e6
+#define GL_COLOR_INDEX16_EXT                                0x80e7
+#define GL_TEXTURE_INDEX_SIZE_EXT                           0x80ed
 #endif
-typedef void (WINE_GLAPI * PGLFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+typedef void (WINE_GLAPI *PGLFNGLCOLORTABLEEXTPROC)(GLenum target, GLenum internalFormat,
+        GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+
 /* GL_EXT_point_parameters */
 #ifndef GL_EXT_point_parameters
 #define GL_EXT_point_parameters 1
-#define GL_POINT_SIZE_MIN_EXT             0x8126
-#define GL_POINT_SIZE_MAX_EXT             0x8127
-#define GL_POINT_FADE_THRESHOLD_SIZE_EXT  0x8128
-#define GL_DISTANCE_ATTENUATION_EXT       0x8129
+#define GL_POINT_SIZE_MIN_EXT                               0x8126
+#define GL_POINT_SIZE_MAX_EXT                               0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_EXT                    0x8128
+#define GL_DISTANCE_ATTENUATION_EXT                         0x8129
 #endif
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
-typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFEXTPROC)(GLenum pname, GLfloat param);
+typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFVEXTPROC)(GLenum pname, const GLfloat *params);
 
 /* GL_EXT_provoking_vertex */
 #ifndef GL_EXT_provoking_vertex
@@ -2109,2025 +3196,1304 @@ typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const
 #define GL_PROVOKING_VERTEX_EXT                             0x8e4f
 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT     0x8e4c
 #endif
-typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode);
+typedef void (WINE_GLAPI *PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode);
+
+/* GL_EXT_secondary_color */
+#ifndef GL_EXT_secondary_color
+#define GL_EXT_secondary_color 1
+#define GL_COLOR_SUM_EXT                                    0x8458
+#define GL_CURRENT_SECONDARY_COLOR_EXT                      0x8459
+#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT                   0x845a
+#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT                   0x845b
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT                 0x845c
+#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT                0x845d
+#define GL_SECONDARY_COLOR_ARRAY_EXT                        0x845e
+#endif
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3FEXTPROC)(GLfloat red, GLfloat green, GLfloat blue);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3FVEXTPROC)(const GLfloat *v);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3UBEXTPROC)(GLubyte red, GLubyte green, GLubyte blue);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3UBVEXTPROC)(const GLubyte *v);
+typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLORPOINTEREXTPROC)(GLint size, GLenum type,
+        GLsizei stride, const GLvoid *pointer);
+
+/* GL_EXT_stencil_two_side */
+#ifndef GL_EXT_stencil_two_side
+#define GL_EXT_stencil_two_side 1
+#define GL_STENCIL_TEST_TWO_SIDE_EXT                        0x8910
+#define GL_ACTIVE_STENCIL_FACE_EXT                          0x8911
+#endif
+typedef void (WINE_GLAPI *PGLFNACTIVESTENCILFACEEXTPROC)(GLenum face);
+
+/* GL_EXT_stencil_wrap */
+#ifndef GL_EXT_stencil_wrap
+#define GL_EXT_stencil_wrap 1
+#define GL_INCR_WRAP_EXT                                    0x8507
+#define GL_DECR_WRAP_EXT                                    0x8508
+#endif
 
 /* GL_EXT_texture3D */
 #ifndef GL_EXT_texture3D
 #define GL_EXT_texture3D 1
-#define GL_PACK_SKIP_IMAGES_EXT           0x806B
-#define GL_PACK_IMAGE_HEIGHT_EXT          0x806C
-#define GL_UNPACK_SKIP_IMAGES_EXT         0x806D
-#define GL_UNPACK_IMAGE_HEIGHT_EXT        0x806E
-#define GL_TEXTURE_3D_EXT                 0x806F
-#define GL_PROXY_TEXTURE_3D_EXT           0x8070
-#define GL_TEXTURE_DEPTH_EXT              0x8071
-#define GL_TEXTURE_WRAP_R_EXT             0x8072
-#define GL_MAX_3D_TEXTURE_SIZE_EXT        0x8073
+#define GL_PACK_SKIP_IMAGES_EXT                             0x806b
+#define GL_PACK_IMAGE_HEIGHT_EXT                            0x806c
+#define GL_UNPACK_SKIP_IMAGES_EXT                           0x806d
+#define GL_UNPACK_IMAGE_HEIGHT_EXT                          0x806e
+#define GL_TEXTURE_3D_EXT                                   0x806f
+#define GL_PROXY_TEXTURE_3D_EXT                             0x8070
+#define GL_TEXTURE_DEPTH_EXT                                0x8071
+#define GL_TEXTURE_WRAP_R_EXT                               0x8072
+#define GL_MAX_3D_TEXTURE_SIZE_EXT                          0x8073
+#endif
+typedef void (WINE_GLAPI *PGLFNGLTEXIMAGE3DEXTPROC)(GLenum target, GLint level, GLenum internalformat,
+        GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (WINE_GLAPI *PGLFNGLTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+        GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+
+/* GL_EXT_texture_compression_rgtc */
+#ifndef GL_EXT_texture_compression_rgtc
+#define GL_EXT_texture_compression_rgtc 1
+#define GL_COMPRESSED_RED_RGTC1_EXT                         0x8dbb
+#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT                  0x8dbc
+#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT                   0x8dbd
+#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT            0x8dbe
 #endif
-typedef void (WINE_GLAPI * PGLFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-typedef void (WINE_GLAPI * PGLFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+
+/* GL_EXT_texture_compression_s3tc */
+#ifndef GL_EXT_texture_compression_s3tc
+#define GL_EXT_texture_compression_s3tc 1
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT                     0x83f0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT                    0x83f1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT                    0x83f2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT                    0x83f3
+#endif
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat,
+        GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat,
+        GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat,
+        GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level,
+        GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
+        GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+        GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset,
+        GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (WINE_GLAPI *PGLFNGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void *img);
+
 /* GL_EXT_texture_env_combine */
 #ifndef GL_EXT_texture_env_combine
 #define GL_EXT_texture_env_combine 1
-#define GL_COMBINE_EXT                    0x8570
-#define GL_COMBINE_RGB_EXT                0x8571
-#define GL_COMBINE_ALPHA_EXT              0x8572
-#define GL_RGB_SCALE_EXT                  0x8573
-#define GL_ADD_SIGNED_EXT                 0x8574
-#define GL_INTERPOLATE_EXT                0x8575
-#define GL_SUBTRACT_EXT                   0x84E7
-#define GL_CONSTANT_EXT                   0x8576
-#define GL_PRIMARY_COLOR_EXT              0x8577
-#define GL_PREVIOUS_EXT                   0x8578
-#define GL_SOURCE0_RGB_EXT                0x8580
-#define GL_SOURCE1_RGB_EXT                0x8581
-#define GL_SOURCE2_RGB_EXT                0x8582
-#define GL_SOURCE3_RGB_EXT                0x8583
-#define GL_SOURCE4_RGB_EXT                0x8584
-#define GL_SOURCE5_RGB_EXT                0x8585
-#define GL_SOURCE6_RGB_EXT                0x8586
-#define GL_SOURCE7_RGB_EXT                0x8587
-#define GL_SOURCE0_ALPHA_EXT              0x8588
-#define GL_SOURCE1_ALPHA_EXT              0x8589
-#define GL_SOURCE2_ALPHA_EXT              0x858A
-#define GL_SOURCE3_ALPHA_EXT              0x858B
-#define GL_SOURCE4_ALPHA_EXT              0x858C
-#define GL_SOURCE5_ALPHA_EXT              0x858D
-#define GL_SOURCE6_ALPHA_EXT              0x858E
-#define GL_SOURCE7_ALPHA_EXT              0x858F
-#define GL_OPERAND0_RGB_EXT               0x8590
-#define GL_OPERAND1_RGB_EXT               0x8591
-#define GL_OPERAND2_RGB_EXT               0x8592
-#define GL_OPERAND3_RGB_EXT               0x8593
-#define GL_OPERAND4_RGB_EXT               0x8594
-#define GL_OPERAND5_RGB_EXT               0x8595
-#define GL_OPERAND6_RGB_EXT               0x8596
-#define GL_OPERAND7_RGB_EXT               0x8597
-#define GL_OPERAND0_ALPHA_EXT             0x8598
-#define GL_OPERAND1_ALPHA_EXT             0x8599
-#define GL_OPERAND2_ALPHA_EXT             0x859A
-#define GL_OPERAND3_ALPHA_EXT             0x859B
-#define GL_OPERAND4_ALPHA_EXT             0x859C
-#define GL_OPERAND5_ALPHA_EXT             0x859D
-#define GL_OPERAND6_ALPHA_EXT             0x859E
-#define GL_OPERAND7_ALPHA_EXT             0x859F
+#define GL_COMBINE_EXT                                      0x8570
+#define GL_COMBINE_RGB_EXT                                  0x8571
+#define GL_COMBINE_ALPHA_EXT                                0x8572
+#define GL_RGB_SCALE_EXT                                    0x8573
+#define GL_ADD_SIGNED_EXT                                   0x8574
+#define GL_INTERPOLATE_EXT                                  0x8575
+#define GL_SUBTRACT_EXT                                     0x84e7
+#define GL_CONSTANT_EXT                                     0x8576
+#define GL_PRIMARY_COLOR_EXT                                0x8577
+#define GL_PREVIOUS_EXT                                     0x8578
+#define GL_SOURCE0_RGB_EXT                                  0x8580
+#define GL_SOURCE1_RGB_EXT                                  0x8581
+#define GL_SOURCE2_RGB_EXT                                  0x8582
+#define GL_SOURCE3_RGB_EXT                                  0x8583
+#define GL_SOURCE4_RGB_EXT                                  0x8584
+#define GL_SOURCE5_RGB_EXT                                  0x8585
+#define GL_SOURCE6_RGB_EXT                                  0x8586
+#define GL_SOURCE7_RGB_EXT                                  0x8587
+#define GL_SOURCE0_ALPHA_EXT                                0x8588
+#define GL_SOURCE1_ALPHA_EXT                                0x8589
+#define GL_SOURCE2_ALPHA_EXT                                0x858a
+#define GL_SOURCE3_ALPHA_EXT                                0x858b
+#define GL_SOURCE4_ALPHA_EXT                                0x858c
+#define GL_SOURCE5_ALPHA_EXT                                0x858d
+#define GL_SOURCE6_ALPHA_EXT                                0x858e
+#define GL_SOURCE7_ALPHA_EXT                                0x858f
+#define GL_OPERAND0_RGB_EXT                                 0x8590
+#define GL_OPERAND1_RGB_EXT                                 0x8591
+#define GL_OPERAND2_RGB_EXT                                 0x8592
+#define GL_OPERAND3_RGB_EXT                                 0x8593
+#define GL_OPERAND4_RGB_EXT                                 0x8594
+#define GL_OPERAND5_RGB_EXT                                 0x8595
+#define GL_OPERAND6_RGB_EXT                                 0x8596
+#define GL_OPERAND7_RGB_EXT                                 0x8597
+#define GL_OPERAND0_ALPHA_EXT                               0x8598
+#define GL_OPERAND1_ALPHA_EXT                               0x8599
+#define GL_OPERAND2_ALPHA_EXT                               0x859a
+#define GL_OPERAND3_ALPHA_EXT                               0x859b
+#define GL_OPERAND4_ALPHA_EXT                               0x859c
+#define GL_OPERAND5_ALPHA_EXT                               0x859d
+#define GL_OPERAND6_ALPHA_EXT                               0x859e
+#define GL_OPERAND7_ALPHA_EXT                               0x859f
 #endif
+
 /* GL_EXT_texture_env_dot3 */
 #ifndef GL_EXT_texture_env_dot3
 #define GL_EXT_texture_env_dot3 1
-#define GL_DOT3_RGB_EXT                   0x8740
-#define GL_DOT3_RGBA_EXT                  0x8741
-#endif
-/* GL_EXT_texture_lod_bias */
-#ifndef GL_EXT_texture_lod_bias
-#define GL_EXT_texture_lod_bias 1
-#define GL_MAX_TEXTURE_LOD_BIAS_EXT       0x84FD
-#define GL_TEXTURE_FILTER_CONTROL_EXT     0x8500
-#define GL_TEXTURE_LOD_BIAS_EXT           0x8501
-#endif
-/* GL_ARB_texture_border_clamp */
-#ifndef GL_ARB_texture_border_clamp
-#define GL_ARB_texture_border_clamp 1
-#define GL_CLAMP_TO_BORDER_ARB            0x812D
+#define GL_DOT3_RGB_EXT                                     0x8740
+#define GL_DOT3_RGBA_EXT                                    0x8741
 #endif
+
 /* GL_EXT_texture_filter_anisotropic */
 #ifndef GL_EXT_texture_filter_anisotropic
 #define GL_EXT_texture_filter_anisotropic 1
-#define GL_TEXTURE_MAX_ANISOTROPY_EXT     0x84FE
-#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
-#endif
-/* GL_ARB_texture_mirrored_repeat (full support GL1.4) */
-#ifndef GL_ARB_texture_mirrored_repeat
-#define GL_ARB_texture_mirrored_repeat 1
-#define GL_MIRRORED_REPEAT_ARB            0x8370
-#endif
-/* GL_ATI_texture_mirror_once */
-#ifndef GL_ATI_texture_mirror_once
-#define GL_ATI_texture_mirror_once 1
-#define GL_MIRROR_CLAMP_ATI               0x8742
-#define GL_MIRROR_CLAMP_TO_EDGE_ATI       0x8743
-#endif
-/* GL_ARB_texture_env_dot3 */
-#ifndef GL_ARB_texture_env_dot3
-#define GL_ARB_texture_env_dot3 1
-#define GL_DOT3_RGB_ARB                   0x86AE
-#define GL_DOT3_RGBA_ARB                  0x86AF
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT                       0x84fe
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT                   0x84ff
 #endif
-/* GL_EXT_texture_env_dot3 */
-#ifndef GL_EXT_texture_env_dot3
-#define GL_EXT_texture_env_dot3 1
-#define GL_DOT3_RGB_EXT                   0x8740
-#define GL_DOT3_RGBA_EXT                  0x8741
+
+/* GL_EXT_texture_lod_bias */
+#ifndef GL_EXT_texture_lod_bias
+#define GL_EXT_texture_lod_bias 1
+#define GL_MAX_TEXTURE_LOD_BIAS_EXT                         0x84fd
+#define GL_TEXTURE_FILTER_CONTROL_EXT                       0x8500
+#define GL_TEXTURE_LOD_BIAS_EXT                             0x8501
 #endif
+
 /* GL_EXT_texture_sRGB */
 #ifndef GL_EXT_texture_sRGB
 #define GL_EXT_texture_sRGB 1
-#define GL_SRGB_EXT                            0x8C40
-#define GL_SRGB8_EXT                           0x8C41
-#define GL_SRGB_ALPHA_EXT                      0x8C42
-#define GL_SRGB8_ALPHA8_EXT                    0x8C43
-#define GL_SLUMINANCE_ALPHA_EXT                0x8C44
-#define GL_SLUMINANCE8_ALPHA8_EXT              0x8C45
-#define GL_SLUMINANCE_EXT                      0x8C46
-#define GL_SLUMINANCE8_EXT                     0x8C47
-#define GL_COMPRESSED_SRGB_EXT                 0x8C48
-#define GL_COMPRESSED_SRGB_ALPHA_EXT           0x8C49
-#define GL_COMPRESSED_SLUMINANCE_EXT           0x8C4A
-#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT     0x8C4B
-#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT       0x8C4C
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
-#endif
-/* GL_ARB_texture_float */
-#ifndef GL_ARB_texture_float
-#define GL_ARB_texture_float 1
-#define GL_RGBA32F_ARB                    0x8814
-#define GL_RGB32F_ARB                     0x8815
-#define GL_RGBA16F_ARB                    0x881A
-#define GL_RGB16F_ARB                     0x881B
-#endif
-/* GL_ARB_texture_rg */
-#ifndef GL_ARB_texture_rg
-#define GL_RG                             0x8227
-#define GL_RG_INTEGER                     0x8228
-#define GL_R8                             0x8229
-#define GL_R16                            0x822A
-#define GL_RG8                            0x822B
-#define GL_RG16                           0x822C
-#define GL_R16F                           0x822D
-#define GL_R32F                           0x822E
-#define GL_RG16F                          0x822F
-#define GL_RG32F                          0x8230
-#define GL_R8I                            0x8231
-#define GL_R8UI                           0x8232
-#define GL_R16I                           0x8233
-#define GL_R16UI                          0x8234
-#define GL_R32I                           0x8235
-#define GL_R32UI                          0x8236
-#define GL_RG8I                           0x8237
-#define GL_RG8UI                          0x8238
-#define GL_RG16I                          0x8239
-#define GL_RG16UI                         0x823A
-#define GL_RG32I                          0x823B
-#define GL_RG32UI                         0x823C
-#endif
-/* GL_EXT_texture_swizzle */
-#ifndef GL_EXT_texture_swizzle
-#define GL_TEXTURE_SWIZZLE_R_EXT          0x8E42
-#define GL_TEXTURE_SWIZZLE_G_EXT          0x8E43
-#define GL_TEXTURE_SWIZZLE_B_EXT          0x8E44
-#define GL_TEXTURE_SWIZZLE_A_EXT          0x8E45
-#define GL_TEXTURE_SWIZZLE_RGBA_EXT       0x8E46
-#endif
-/* GL_ARB_half_float_pixel */
-#ifndef GL_ARB_half_float_pixel
-#define GL_ARB_half_float_pixel
-#define GL_HALF_FLOAT_ARB                 0x140B
-#endif
-/* GL_ARB_vertex_program */
-#ifndef GL_ARB_vertex_program
-#define GL_ARB_vertex_program 1
-#define GL_VERTEX_PROGRAM_ARB             0x8620
-#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB  0x8642
-#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB    0x8643
-#define GL_COLOR_SUM_ARB                  0x8458
-#define GL_PROGRAM_FORMAT_ASCII_ARB       0x8875
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB   0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB   0x8625
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
-#define GL_CURRENT_VERTEX_ATTRIB_ARB      0x8626
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
-#define GL_PROGRAM_LENGTH_ARB             0x8627
-#define GL_PROGRAM_FORMAT_ARB             0x8876
-#define GL_PROGRAM_BINDING_ARB            0x8677
-#define GL_PROGRAM_INSTRUCTIONS_ARB       0x88A0
-#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB   0x88A1
-#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
-#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
-#define GL_PROGRAM_TEMPORARIES_ARB        0x88A4
-#define GL_MAX_PROGRAM_TEMPORARIES_ARB    0x88A5
-#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
-#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
-#define GL_PROGRAM_PARAMETERS_ARB         0x88A8
-#define GL_MAX_PROGRAM_PARAMETERS_ARB     0x88A9
-#define GL_PROGRAM_NATIVE_PARAMETERS_ARB  0x88AA
-#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
-#define GL_PROGRAM_ATTRIBS_ARB            0x88AC
-#define GL_MAX_PROGRAM_ATTRIBS_ARB        0x88AD
-#define GL_PROGRAM_NATIVE_ATTRIBS_ARB     0x88AE
-#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
-#define GL_PROGRAM_ADDRESS_REGISTERS_ARB  0x88B0
-#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
-#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
-#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
-#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
-#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
-#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
-#define GL_PROGRAM_STRING_ARB             0x8628
-#define GL_PROGRAM_ERROR_POSITION_ARB     0x864B
-#define GL_CURRENT_MATRIX_ARB             0x8641
-#define GL_TRANSPOSE_CURRENT_MATRIX_ARB   0x88B7
-#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
-#define GL_MAX_VERTEX_ATTRIBS_ARB         0x8869
-#define GL_MAX_PROGRAM_MATRICES_ARB       0x862F
-#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
-#define GL_PROGRAM_ERROR_STRING_ARB       0x8874
-#define GL_MATRIX0_ARB                    0x88C0
-#define GL_MATRIX1_ARB                    0x88C1
-#define GL_MATRIX2_ARB                    0x88C2
-#define GL_MATRIX3_ARB                    0x88C3
-#define GL_MATRIX4_ARB                    0x88C4
-#define GL_MATRIX5_ARB                    0x88C5
-#define GL_MATRIX6_ARB                    0x88C6
-#define GL_MATRIX7_ARB                    0x88C7
-#define GL_MATRIX8_ARB                    0x88C8
-#define GL_MATRIX9_ARB                    0x88C9
-#define GL_MATRIX10_ARB                   0x88CA
-#define GL_MATRIX11_ARB                   0x88CB
-#define GL_MATRIX12_ARB                   0x88CC
-#define GL_MATRIX13_ARB                   0x88CD
-#define GL_MATRIX14_ARB                   0x88CE
-#define GL_MATRIX15_ARB                   0x88CF
-#define GL_MATRIX16_ARB                   0x88D0
-#define GL_MATRIX17_ARB                   0x88D1
-#define GL_MATRIX18_ARB                   0x88D2
-#define GL_MATRIX19_ARB                   0x88D3
-#define GL_MATRIX20_ARB                   0x88D4
-#define GL_MATRIX21_ARB                   0x88D5
-#define GL_MATRIX22_ARB                   0x88D6
-#define GL_MATRIX23_ARB                   0x88D7
-#define GL_MATRIX24_ARB                   0x88D8
-#define GL_MATRIX25_ARB                   0x88D9
-#define GL_MATRIX26_ARB                   0x88DA
-#define GL_MATRIX27_ARB                   0x88DB
-#define GL_MATRIX28_ARB                   0x88DC
-#define GL_MATRIX29_ARB                   0x88DD
-#define GL_MATRIX30_ARB                   0x88DE
-#define GL_MATRIX31_ARB                   0x88DF
-#endif
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
-typedef void (WINE_GLAPI * PGLFNENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string);
-typedef void (WINE_GLAPI * PGLFNBINDPROGRAMARBPROC) (GLenum target, GLuint program);
-typedef void (WINE_GLAPI * PGLFNDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs);
-typedef void (WINE_GLAPI * PGLFNGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer);
-typedef GLboolean (WINE_GLAPI * PGLFNISPROGRAMARBPROC) (GLuint program);
-#ifndef GL_ARB_fragment_program
-#define GL_ARB_fragment_program 1
-#define GL_FRAGMENT_PROGRAM_ARB           0x8804
-#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB   0x8805
-#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB   0x8806
-#define GL_PROGRAM_TEX_INDIRECTIONS_ARB   0x8807
-#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808
-#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809
-#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A
-#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B
-#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C
-#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D
-#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E
-#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F
-#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810
-#define GL_MAX_TEXTURE_COORDS_ARB         0x8871
-#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB    0x8872
-/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */
-#endif
-/* GL_ARB_multisample */
-#ifndef GL_ARB_multisample
-#define GL_ARB_multisample 1
-#define GL_MULTISAMPLE_ARB                0x809D
-#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB   0x809E
-#define GL_SAMPLE_ALPHA_TO_ONE_ARB        0x809F
-#define GL_SAMPLE_COVERAGE_ARB            0x80A0
-#define GL_SAMPLE_BUFFERS_ARB             0x80A8
-#define GL_SAMPLES_ARB                    0x80A9
-#define GL_SAMPLE_COVERAGE_VALUE_ARB      0x80AA
-#define GL_SAMPLE_COVERAGE_INVERT_ARB     0x80AB
-#define GL_MULTISAMPLE_BIT_ARB            0x20000000
-#endif
-typedef void (WINE_GLAPI * WINED3D_PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert);
-/* GL_ARB_vertex_buffer_object */
-#ifndef GL_ARB_vertex_buffer_object
-#define GL_ARB_vertex_buffer_object 1
-#define GL_BUFFER_SIZE_ARB                0x8764
-#define GL_BUFFER_USAGE_ARB               0x8765
-#define GL_ARRAY_BUFFER_ARB               0x8892
-#define GL_ELEMENT_ARRAY_BUFFER_ARB       0x8893
-#define GL_ARRAY_BUFFER_BINDING_ARB       0x8894
-#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
-#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB  0x8896
-#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB  0x8897
-#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB   0x8898
-#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB   0x8899
-#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB   0x889A
-#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB       0x889B
-#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
-#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB  0x889D
-#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB          0x889E
-#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB   0x889F
-#define GL_READ_ONLY_ARB                  0x88B8
-#define GL_WRITE_ONLY_ARB                 0x88B9
-#define GL_READ_WRITE_ARB                 0x88BA
-#define GL_BUFFER_ACCESS_ARB              0x88BB
-#define GL_BUFFER_MAPPED_ARB              0x88BC
-#define GL_BUFFER_MAP_POINTER_ARB         0x88BD
-#define GL_STREAM_DRAW_ARB                0x88E0
-#define GL_STREAM_READ_ARB                0x88E1
-#define GL_STREAM_COPY_ARB                0x88E2
-#define GL_STATIC_DRAW_ARB                0x88E4
-#define GL_STATIC_READ_ARB                0x88E5
-#define GL_STATIC_COPY_ARB                0x88E6
-#define GL_DYNAMIC_DRAW_ARB               0x88E8
-#define GL_DYNAMIC_READ_ARB               0x88E9
-#define GL_DYNAMIC_COPY_ARB               0x88EA
-#endif
-typedef void (WINE_GLAPI * PGLFNBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
-typedef void (WINE_GLAPI * PGLFNDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
-typedef void (WINE_GLAPI * PGLFNGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
-typedef GLboolean (WINE_GLAPI * PGLFNISBUFFERARBPROC) (GLuint buffer);
-typedef void (WINE_GLAPI * PGLFNBUFFERDATAARBPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
-typedef void (WINE_GLAPI * PGLFNBUFFERSUBDATAARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
-typedef GLvoid* (WINE_GLAPI * PGLFNMAPBUFFERARBPROC) (GLenum target, GLenum access);
-typedef GLboolean (WINE_GLAPI * PGLFNUNMAPBUFFERARBPROC) (GLenum target);
-typedef void (WINE_GLAPI * PGLFNGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params);
-/* GL_EXT_blend_equation_separate */
-typedef void (WINE_GLAPI * PGLFNBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-/* GL_EXT_blend_func_separate */
-#ifndef GL_EXT_blend_func_separate
-#define GL_BLEND_DST_RGB_EXT              0x80C8
-#define GL_BLEND_SRC_RGB_EXT              0x80C9
-#define GL_BLEND_DST_ALPHA_EXT            0x80CA
-#define GL_BLEND_SRC_ALPHA_EXT            0x80CB
-#endif
-typedef void (WINE_GLAPI * PGLFNBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);
-/* GL_EXT_fog_coord */
-#ifndef GL_EXT_fog_coord
-#define GL_EXT_fog_coord 1
-#define GL_FOG_COORDINATE_SOURCE_EXT            0x8450
-#define GL_FOG_COORDINATE_EXT                   0x8451
-#define GL_FRAGMENT_DEPTH_EXT                   0x8452
-#define GL_CURRENT_FOG_COORDINATE_EXT           0x8453
-#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT        0x8454
-#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT      0x8455
-#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT     0x8456
-#define GL_FOG_COORDINATE_ARRAY_EXT             0x8457
-#endif /* GL_EXT_fog_coord */
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDFEXTPROC) (GLfloat coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDDEXTPROC) (GLdouble coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
-typedef void (WINE_GLAPI * PGLFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, GLvoid *data);
-/* GL_ARB_shader_objects (GLSL) */
-#ifndef GL_ARB_shader_objects
-#define GL_ARB_shader_objects 1
-typedef char GLcharARB;
-typedef unsigned int GLhandleARB;
-#define GL_PROGRAM_OBJECT_ARB                   0x8B40
-#define GL_OBJECT_TYPE_ARB                      0x8B4E
-#define GL_OBJECT_SUBTYPE_ARB                   0x8B4F
-#define GL_OBJECT_DELETE_STATUS_ARB             0x8B80
-#define GL_OBJECT_COMPILE_STATUS_ARB            0x8B81
-#define GL_OBJECT_LINK_STATUS_ARB               0x8B82
-#define GL_OBJECT_VALIDATE_STATUS_ARB           0x8B83
-#define GL_OBJECT_INFO_LOG_LENGTH_ARB           0x8B84
-#define GL_OBJECT_ATTACHED_OBJECTS_ARB          0x8B85
-#define GL_OBJECT_ACTIVE_UNIFORMS_ARB           0x8B86
-#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
-#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB      0x8B88
-#define GL_SHADER_OBJECT_ARB                    0x8B48
-#define GL_FLOAT_VEC2_ARB                       0x8B50
-#define GL_FLOAT_VEC3_ARB                       0x8B51
-#define GL_FLOAT_VEC4_ARB                       0x8B52
-#define GL_INT_VEC2_ARB                         0x8B53
-#define GL_INT_VEC3_ARB                         0x8B54
-#define GL_INT_VEC4_ARB                         0x8B55
-#define GL_BOOL_ARB                             0x8B56
-#define GL_BOOL_VEC2_ARB                        0x8B57
-#define GL_BOOL_VEC3_ARB                        0x8B58
-#define GL_BOOL_VEC4_ARB                        0x8B59
-#define GL_FLOAT_MAT2_ARB                       0x8B5A
-#define GL_FLOAT_MAT3_ARB                       0x8B5B
-#define GL_FLOAT_MAT4_ARB                       0x8B5C
-#define GL_SAMPLER_1D_ARB                       0x8B5D
-#define GL_SAMPLER_2D_ARB                       0x8B5E
-#define GL_SAMPLER_3D_ARB                       0x8B5F
-#define GL_SAMPLER_CUBE_ARB                     0x8B60
-#define GL_SAMPLER_1D_SHADOW_ARB                0x8B61
-#define GL_SAMPLER_2D_SHADOW_ARB                0x8B62
-#define GL_SAMPLER_2D_RECT_ARB                  0x8B63
-#define GL_SAMPELR_2D_RECT_SHADOW_ARB           0x8B64
-#endif
-#ifndef GL_ARB_shading_language_100
-#define GL_ARB_shading_language_100         1
-#define GL_SHADING_LANGUAGE_VERSION_ARB     0x8B8C
-#endif
-#ifndef GL_ARB_fragment_shader
-#define GL_ARB_fragment_shader 1
-#define GL_FRAGMENT_SHADER_ARB                  0x8B30
-#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB  0x8B49
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB  0x8B8B
-#endif
-#ifndef GL_ARB_vertex_shader
-#define GL_ARB_vertex_shader 1
-#define GL_VERTEX_SHADER_ARB                        0x8B31
-#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB        0x8B4A
-#define GL_MAX_VARYING_FLOATS_ARB                   0x8B4B
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB       0x8B4C
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB     0x8B4D
-#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB             0x8B89
-#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB   0x8B8A
-#endif
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params);
-typedef GLint (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
-typedef void (WINE_GLAPI * WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);
-typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);
-typedef void (WINE_GLAPI * WINED3D_PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length);
-typedef void (WINE_GLAPI * WINED3D_PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);
-typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC) (void);
-typedef void (WINE_GLAPI * WINED3D_PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj);
-typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLGETHANDLEARBPROC) (GLenum pname);
-typedef void (WINE_GLAPI * WINED3D_PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source);
-typedef void (WINE_GLAPI * WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name);
-typedef GLint (WINE_GLAPI * WINED3D_PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);
-/* GL_ARB_pixel_buffer_object */
-#ifndef GL_ARB_pixel_buffer_object
-#define GL_PIXEL_PACK_BUFFER_ARB          0x88EB
-#define GL_PIXEL_UNPACK_BUFFER_ARB        0x88EC
-#define GL_PIXEL_PACK_BUFFER_BINDING_ARB  0x88ED
-#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF
-#endif
-/* GL_EXT_texture */
-#ifndef GL_EXT_texture
-#define GL_EXT_texture 1
-#define GL_ALPHA4_EXT                     0x803B
-#define GL_ALPHA8_EXT                     0x803C
-#define GL_ALPHA12_EXT                    0x803D
-#define GL_ALPHA16_EXT                    0x803E
-#define GL_LUMINANCE4_EXT                 0x803F
-#define GL_LUMINANCE8_EXT                 0x8040
-#define GL_LUMINANCE12_EXT                0x8041
-#define GL_LUMINANCE16_EXT                0x8042
-#define GL_LUMINANCE4_ALPHA4_EXT          0x8043
-#define GL_LUMINANCE6_ALPHA2_EXT          0x8044
-#define GL_LUMINANCE8_ALPHA8_EXT          0x8045
-#define GL_LUMINANCE12_ALPHA4_EXT         0x8046
-#define GL_LUMINANCE12_ALPHA12_EXT        0x8047
-#define GL_LUMINANCE16_ALPHA16_EXT        0x8048
-#define GL_INTENSITY_EXT                  0x8049
-#define GL_INTENSITY4_EXT                 0x804A
-#define GL_INTENSITY8_EXT                 0x804B
-#define GL_INTENSITY12_EXT                0x804C
-#define GL_INTENSITY16_EXT                0x804D
-#define GL_RGB2_EXT                       0x804E
-#define GL_RGB4_EXT                       0x804F
-#define GL_RGB5_EXT                       0x8050
-#define GL_RGB8_EXT                       0x8051
-#define GL_RGB10_EXT                      0x8052
-#define GL_RGB12_EXT                      0x8053
-#define GL_RGB16_EXT                      0x8054
-#define GL_RGBA2_EXT                      0x8055
-#define GL_RGBA4_EXT                      0x8056
-#define GL_RGB5_A1_EXT                    0x8057
-#define GL_RGBA8_EXT                      0x8058
-#define GL_RGB10_A2_EXT                   0x8059
-#define GL_RGBA12_EXT                     0x805A
-#define GL_RGBA16_EXT                     0x805B
-#define GL_TEXTURE_RED_SIZE_EXT           0x805C
-#define GL_TEXTURE_GREEN_SIZE_EXT         0x805D
-#define GL_TEXTURE_BLUE_SIZE_EXT          0x805E
-#define GL_TEXTURE_ALPHA_SIZE_EXT         0x805F
-#define GL_TEXTURE_LUMINANCE_SIZE_EXT     0x8060
-#define GL_TEXTURE_INTENSITY_SIZE_EXT     0x8061
-#define GL_REPLACE_EXT                    0x8062
-#define GL_PROXY_TEXTURE_1D_EXT           0x8063
-#define GL_PROXY_TEXTURE_2D_EXT           0x8064
-#define GL_TEXTURE_TOO_LARGE_EXT          0x8065
-#endif
-/* GL_EXT_texture_compression_s3tc */
-#ifndef GL_EXT_texture_compression_s3tc
-#define GL_EXT_texture_compression_s3tc 1
-#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT   0x83F0
-#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT  0x83F1
-#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT  0x83F2
-#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT  0x83F3
-#endif
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
-typedef void (WINE_GLAPI * PGLFNGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img);
-/* GL_EXT_stencil_wrap */
-#ifndef GL_EXT_stencil_wrap
-#define GL_EXT_stencil_wrap 1
-#define GL_INCR_WRAP_EXT                  0x8507
-#define GL_DECR_WRAP_EXT                  0x8508
+#define GL_SRGB_EXT                                         0x8c40
+#define GL_SRGB8_EXT                                        0x8c41
+#define GL_SRGB_ALPHA_EXT                                   0x8c42
+#define GL_SRGB8_ALPHA8_EXT                                 0x8c43
+#define GL_SLUMINANCE_ALPHA_EXT                             0x8c44
+#define GL_SLUMINANCE8_ALPHA8_EXT                           0x8c45
+#define GL_SLUMINANCE_EXT                                   0x8c46
+#define GL_SLUMINANCE8_EXT                                  0x8c47
+#define GL_COMPRESSED_SRGB_EXT                              0x8c48
+#define GL_COMPRESSED_SRGB_ALPHA_EXT                        0x8c49
+#define GL_COMPRESSED_SLUMINANCE_EXT                        0x8c4a
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT                  0x8c4b
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT                    0x8c4c
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT              0x8c4d
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT              0x8c4e
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT              0x8c4f
 #endif
 
-/* GL_ARB_half_float_vertex */
-#ifndef GL_ARB_half_float_vertex
-#define GL_ARB_half_float_vertex
-/* No _ARB, see extension spec */
-#define GL_HALF_FLOAT                     0x140B
+/* GL_NV_depth_clamp */
+#ifndef GL_NV_depth_clamp
+#define GL_NV_depth_clamp 1
+#define GL_DEPTH_CLAMP_NV                                   0x864f
 #endif
-/* GL_NV_half_float */
-#ifndef GL_NV_half_float
-#define GL_NV_half_float 1
-typedef unsigned short GLhalfNV;
-#define GL_HALF_FLOAT_NV                  0x140B
+
+/* GL_NV_fence */
+#ifndef GL_NV_fence
+#define GL_NV_fence 1
+#define GL_ALL_COMPLETED_NV                                 0x84f2
+#define GL_FENCE_STATUS_NV                                  0x84f3
+#define GL_FENCE_CONDITION_NV                               0x84f4
 #endif
-typedef void (WINE_GLAPI * PGLFNVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y);
-typedef void (WINE_GLAPI * PGLFNVERTEX2HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z);
-typedef void (WINE_GLAPI * PGLFNVERTEX3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
-typedef void (WINE_GLAPI * PGLFNVERTEX4HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);
-typedef void (WINE_GLAPI * PGLFNNORMAL3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
-typedef void (WINE_GLAPI * PGLFNCOLOR3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);
-typedef void (WINE_GLAPI * PGLFNCOLOR4HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD1HNVPROC) (GLhalfNV s);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD1HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD2HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
-typedef void (WINE_GLAPI * PGLFNTEXCOORD4HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
-typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNFOGCOORDHNVPROC) (GLhalfNV fog);
-typedef void (WINE_GLAPI * PGLFNFOGCOORDHVNVPROC) (const GLhalfNV *fog);
-typedef void (WINE_GLAPI * PGLFNSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
-typedef void (WINE_GLAPI * PGLFNSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXWEIGHTHNVPROC) (GLhalfNV weight);
-typedef void (WINE_GLAPI * PGLFNVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNGENFENCESNVPROC)(GLsizei, GLuint *);
+typedef void (WINE_GLAPI *PGLFNDELETEFENCESNVPROC)(GLuint, const GLuint *);
+typedef void (WINE_GLAPI *PGLFNSETFENCENVPROC)(GLuint, GLenum);
+typedef GLboolean (WINE_GLAPI *PGLFNTESTFENCENVPROC)(GLuint);
+typedef void (WINE_GLAPI *PGLFNFINISHFENCENVPROC)(GLuint);
+typedef GLboolean (WINE_GLAPI *PGLFNISFENCENVPROC)(GLuint);
+typedef void (WINE_GLAPI *PGLFNGETFENCEIVNVPROC)(GLuint, GLenum, GLint *);
 
 /* GL_NV_fog_distance */
 #ifndef GL_NV_fog_distance
 #define GL_NV_fog_distance 1
-#define GL_FOG_DISTANCE_MODE_NV           0x855A
-#define GL_EYE_RADIAL_NV                  0x855B
-#define GL_EYE_PLANE_ABSOLUTE_NV          0x855C
+#define GL_FOG_DISTANCE_MODE_NV                             0x855a
+#define GL_EYE_RADIAL_NV                                    0x855b
+#define GL_EYE_PLANE_ABSOLUTE_NV                            0x855c
 /* reuse GL_EYE_PLANE */
 #endif
-/* GL_NV_texgen_reflection */
-#ifndef GL_NV_texgen_reflection
-#define GL_NV_texgen_reflection 1
-#define GL_NORMAL_MAP_NV                  0x8511
-#define GL_REFLECTION_MAP_NV              0x8512
+
+/* GL_NV_half_float */
+#ifndef GL_NV_half_float
+#define GL_NV_half_float 1
+typedef unsigned short GLhalfNV;
+#define GL_HALF_FLOAT_NV                                    0x140b
 #endif
-/* GL_NV_texture_env_combine4 */
-#ifndef GL_NV_texture_env_combine4
-#define GL_NV_texture_env_combine4 1
-#define GL_COMBINE4_NV                    0x8503
-#define GL_SOURCE3_RGB_NV                 0x8583
-#define GL_SOURCE3_ALPHA_NV               0x858B
-#define GL_OPERAND3_RGB_NV                0x8593
-#define GL_OPERAND3_ALPHA_NV              0x859B
+typedef void (WINE_GLAPI *PGLFNVERTEX2HNVPROC)(GLhalfNV x, GLhalfNV y);
+typedef void (WINE_GLAPI *PGLFNVERTEX2HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEX3HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z);
+typedef void (WINE_GLAPI *PGLFNVERTEX3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEX4HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+typedef void (WINE_GLAPI *PGLFNVERTEX4HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNNORMAL3HNVPROC)(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);
+typedef void (WINE_GLAPI *PGLFNNORMAL3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+typedef void (WINE_GLAPI *PGLFNCOLOR3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNCOLOR4HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);
+typedef void (WINE_GLAPI *PGLFNCOLOR4HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD1HNVPROC)(GLhalfNV s);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD1HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD2HNVPROC)(GLhalfNV s, GLhalfNV t);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD2HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD3HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD4HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+typedef void (WINE_GLAPI *PGLFNTEXCOORD4HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD1HNVPROC)(GLenum target, GLhalfNV s);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD1HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD2HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD2HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD3HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD3HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD4HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD4HVNVPROC)(GLenum target, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNFOGCOORDHNVPROC)(GLhalfNV fog);
+typedef void (WINE_GLAPI *PGLFNFOGCOORDHVNVPROC)(const GLhalfNV *fog);
+typedef void (WINE_GLAPI *PGLFNSECONDARYCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+typedef void (WINE_GLAPI *PGLFNSECONDARYCOLOR3HVNVPROC)(const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXWEIGHTHNVPROC)(GLhalfNV weight);
+typedef void (WINE_GLAPI *PGLFNVERTEXWEIGHTHVNVPROC)(const GLhalfNV *weight);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1HNVPROC)(GLuint index, GLhalfNV x);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4HVNVPROC)(GLuint index, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS1HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS2HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS3HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS4HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v);
+
+/* GL_NV_light_max_exponent */
+#ifndef GL_NV_light_max_exponent
+#define GL_NV_light_max_exponent 1
+#define GL_MAX_SHININESS_NV                                 0x8504
+#define GL_MAX_SPOT_EXPONENT_NV                             0x8505
 #endif
+
 /* GL_NV_register_combiners */
 #ifndef GL_NV_register_combiners
 #define GL_NV_register_combiners 1
-#define GL_REGISTER_COMBINERS_NV          0x8522
-#define GL_VARIABLE_A_NV                  0x8523
-#define GL_VARIABLE_B_NV                  0x8524
-#define GL_VARIABLE_C_NV                  0x8525
-#define GL_VARIABLE_D_NV                  0x8526
-#define GL_VARIABLE_E_NV                  0x8527
-#define GL_VARIABLE_F_NV                  0x8528
-#define GL_VARIABLE_G_NV                  0x8529
-#define GL_CONSTANT_COLOR0_NV             0x852A
-#define GL_CONSTANT_COLOR1_NV             0x852B
-#define GL_PRIMARY_COLOR_NV               0x852C
-#define GL_SECONDARY_COLOR_NV             0x852D
-#define GL_SPARE0_NV                      0x852E
-#define GL_SPARE1_NV                      0x852F
-#define GL_DISCARD_NV                     0x8530
-#define GL_E_TIMES_F_NV                   0x8531
-#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532
-#define GL_UNSIGNED_IDENTITY_NV           0x8536
-#define GL_UNSIGNED_INVERT_NV             0x8537
-#define GL_EXPAND_NORMAL_NV               0x8538
-#define GL_EXPAND_NEGATE_NV               0x8539
-#define GL_HALF_BIAS_NORMAL_NV            0x853A
-#define GL_HALF_BIAS_NEGATE_NV            0x853B
-#define GL_SIGNED_IDENTITY_NV             0x853C
-#define GL_SIGNED_NEGATE_NV               0x853D
-#define GL_SCALE_BY_TWO_NV                0x853E
-#define GL_SCALE_BY_FOUR_NV               0x853F
-#define GL_SCALE_BY_ONE_HALF_NV           0x8540
-#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV   0x8541
-#define GL_COMBINER_INPUT_NV              0x8542
-#define GL_COMBINER_MAPPING_NV            0x8543
-#define GL_COMBINER_COMPONENT_USAGE_NV    0x8544
-#define GL_COMBINER_AB_DOT_PRODUCT_NV     0x8545
-#define GL_COMBINER_CD_DOT_PRODUCT_NV     0x8546
-#define GL_COMBINER_MUX_SUM_NV            0x8547
-#define GL_COMBINER_SCALE_NV              0x8548
-#define GL_COMBINER_BIAS_NV               0x8549
-#define GL_COMBINER_AB_OUTPUT_NV          0x854A
-#define GL_COMBINER_CD_OUTPUT_NV          0x854B
-#define GL_COMBINER_SUM_OUTPUT_NV         0x854C
-#define GL_MAX_GENERAL_COMBINERS_NV       0x854D
-#define GL_NUM_GENERAL_COMBINERS_NV       0x854E
-#define GL_COLOR_SUM_CLAMP_NV             0x854F
-#define GL_COMBINER0_NV                   0x8550
-#define GL_COMBINER1_NV                   0x8551
-#define GL_COMBINER2_NV                   0x8552
-#define GL_COMBINER3_NV                   0x8553
-#define GL_COMBINER4_NV                   0x8554
-#define GL_COMBINER5_NV                   0x8555
-#define GL_COMBINER6_NV                   0x8556
-#define GL_COMBINER7_NV                   0x8557
+#define GL_REGISTER_COMBINERS_NV                            0x8522
+#define GL_VARIABLE_A_NV                                    0x8523
+#define GL_VARIABLE_B_NV                                    0x8524
+#define GL_VARIABLE_C_NV                                    0x8525
+#define GL_VARIABLE_D_NV                                    0x8526
+#define GL_VARIABLE_E_NV                                    0x8527
+#define GL_VARIABLE_F_NV                                    0x8528
+#define GL_VARIABLE_G_NV                                    0x8529
+#define GL_CONSTANT_COLOR0_NV                               0x852a
+#define GL_CONSTANT_COLOR1_NV                               0x852b
+#define GL_PRIMARY_COLOR_NV                                 0x852c
+#define GL_SECONDARY_COLOR_NV                               0x852d
+#define GL_SPARE0_NV                                        0x852e
+#define GL_SPARE1_NV                                        0x852f
+#define GL_DISCARD_NV                                       0x8530
+#define GL_E_TIMES_F_NV                                     0x8531
+#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV                   0x8532
+#define GL_UNSIGNED_IDENTITY_NV                             0x8536
+#define GL_UNSIGNED_INVERT_NV                               0x8537
+#define GL_EXPAND_NORMAL_NV                                 0x8538
+#define GL_EXPAND_NEGATE_NV                                 0x8539
+#define GL_HALF_BIAS_NORMAL_NV                              0x853a
+#define GL_HALF_BIAS_NEGATE_NV                              0x853b
+#define GL_SIGNED_IDENTITY_NV                               0x853c
+#define GL_SIGNED_NEGATE_NV                                 0x853d
+#define GL_SCALE_BY_TWO_NV                                  0x853e
+#define GL_SCALE_BY_FOUR_NV                                 0x853f
+#define GL_SCALE_BY_ONE_HALF_NV                             0x8540
+#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV                     0x8541
+#define GL_COMBINER_INPUT_NV                                0x8542
+#define GL_COMBINER_MAPPING_NV                              0x8543
+#define GL_COMBINER_COMPONENT_USAGE_NV                      0x8544
+#define GL_COMBINER_AB_DOT_PRODUCT_NV                       0x8545
+#define GL_COMBINER_CD_DOT_PRODUCT_NV                       0x8546
+#define GL_COMBINER_MUX_SUM_NV                              0x8547
+#define GL_COMBINER_SCALE_NV                                0x8548
+#define GL_COMBINER_BIAS_NV                                 0x8549
+#define GL_COMBINER_AB_OUTPUT_NV                            0x854a
+#define GL_COMBINER_CD_OUTPUT_NV                            0x854b
+#define GL_COMBINER_SUM_OUTPUT_NV                           0x854c
+#define GL_MAX_GENERAL_COMBINERS_NV                         0x854d
+#define GL_NUM_GENERAL_COMBINERS_NV                         0x854e
+#define GL_COLOR_SUM_CLAMP_NV                               0x854f
+#define GL_COMBINER0_NV                                     0x8550
+#define GL_COMBINER1_NV                                     0x8551
+#define GL_COMBINER2_NV                                     0x8552
+#define GL_COMBINER3_NV                                     0x8553
+#define GL_COMBINER4_NV                                     0x8554
+#define GL_COMBINER5_NV                                     0x8555
+#define GL_COMBINER6_NV                                     0x8556
+#define GL_COMBINER7_NV                                     0x8557
 /* reuse GL_TEXTURE0_ARB */
 /* reuse GL_TEXTURE1_ARB */
 /* reuse GL_ZERO */
 /* reuse GL_NONE */
 /* reuse GL_FOG */
 #endif
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params);
-typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);
-typedef void (WINE_GLAPI * PGLFNCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
-typedef void (WINE_GLAPI * PGLFNCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
-typedef void (WINE_GLAPI * PGLFNFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERFVNVPROC)(GLenum pname, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERFNVPROC)(GLenum pname, GLfloat param);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERIVNVPROC)(GLenum pname, const GLint *params);
+typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERINVPROC)(GLenum pname, GLint param);
+typedef void (WINE_GLAPI *PGLFNCOMBINERINPUTNVPROC)(GLenum stage, GLenum portion,
+        GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+typedef void (WINE_GLAPI *PGLFNCOMBINEROUTPUTNVPROC)(GLenum stage, GLenum portion,
+        GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias,
+        GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
+typedef void (WINE_GLAPI *PGLFNFINALCOMBINERINPUTNVPROC)(GLenum variable, GLenum input,
+        GLenum mapping, GLenum componentUsage);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINERINPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion,
+        GLenum variable, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINERINPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion,
+        GLenum variable, GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINEROUTPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion,
+        GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINEROUTPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion,
+        GLenum pname, GLint *params);
+typedef void (WINE_GLAPI *PGLFNGETFINALCOMBINERINPUTPARAMETERFVNVPROC)(GLenum variable, GLenum pname, GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETFINALCOMBINERINPUTPARAMETERIVNVPROC)(GLenum variable, GLenum pname, GLint *params);
+
 /* GL_NV_register_combiners2 */
 #ifndef GL_NV_register_combiners2
 #define GL_NV_register_combiners2 1
-#define GL_PER_STAGE_CONSTANTS_NV         0x8535
+#define GL_PER_STAGE_CONSTANTS_NV                           0x8535
+#endif
+typedef void (WINE_GLAPI *PGLFNCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, const GLfloat *params);
+typedef void (WINE_GLAPI *PGLFNGETCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, GLfloat *params);
+
+/* GL_NV_texgen_reflection */
+#ifndef GL_NV_texgen_reflection
+#define GL_NV_texgen_reflection 1
+#define GL_NORMAL_MAP_NV                                    0x8511
+#define GL_REFLECTION_MAP_NV                                0x8512
 #endif
-typedef void (WINE_GLAPI * PGLFNCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params);
+
+/* GL_NV_texture_env_combine4 */
+#ifndef GL_NV_texture_env_combine4
+#define GL_NV_texture_env_combine4 1
+#define GL_COMBINE4_NV                                      0x8503
+#define GL_SOURCE3_RGB_NV                                   0x8583
+#define GL_SOURCE3_ALPHA_NV                                 0x858b
+#define GL_OPERAND3_RGB_NV                                  0x8593
+#define GL_OPERAND3_ALPHA_NV                                0x859b
+#endif
+
 /* GL_NV_texture_shader */
 #ifndef GL_NV_texture_shader
 #define GL_NV_texture_shader 1
-#define GL_OFFSET_TEXTURE_RECTANGLE_NV    0x864C
-#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D
-#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E
-#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9
-#define GL_UNSIGNED_INT_S8_S8_8_8_NV      0x86DA
-#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV  0x86DB
-#define GL_DSDT_MAG_INTENSITY_NV          0x86DC
-#define GL_SHADER_CONSISTENT_NV           0x86DD
-#define GL_TEXTURE_SHADER_NV              0x86DE
-#define GL_SHADER_OPERATION_NV            0x86DF
-#define GL_CULL_MODES_NV                  0x86E0
-#define GL_OFFSET_TEXTURE_MATRIX_NV       0x86E1
-#define GL_OFFSET_TEXTURE_SCALE_NV        0x86E2
-#define GL_OFFSET_TEXTURE_BIAS_NV         0x86E3
-#define GL_OFFSET_TEXTURE_2D_MATRIX_NV    GL_OFFSET_TEXTURE_MATRIX_NV
-#define GL_OFFSET_TEXTURE_2D_SCALE_NV     GL_OFFSET_TEXTURE_SCALE_NV
-#define GL_OFFSET_TEXTURE_2D_BIAS_NV      GL_OFFSET_TEXTURE_BIAS_NV
-#define GL_PREVIOUS_TEXTURE_INPUT_NV      0x86E4
-#define GL_CONST_EYE_NV                   0x86E5
-#define GL_PASS_THROUGH_NV                0x86E6
-#define GL_CULL_FRAGMENT_NV               0x86E7
-#define GL_OFFSET_TEXTURE_2D_NV           0x86E8
-#define GL_DEPENDENT_AR_TEXTURE_2D_NV     0x86E9
-#define GL_DEPENDENT_GB_TEXTURE_2D_NV     0x86EA
-#define GL_DOT_PRODUCT_NV                 0x86EC
-#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV   0x86ED
-#define GL_DOT_PRODUCT_TEXTURE_2D_NV      0x86EE
-#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0
-#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1
-#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2
-#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3
-#define GL_HILO_NV                        0x86F4
-#define GL_DSDT_NV                        0x86F5
-#define GL_DSDT_MAG_NV                    0x86F6
-#define GL_DSDT_MAG_VIB_NV                0x86F7
-#define GL_HILO16_NV                      0x86F8
-#define GL_SIGNED_HILO_NV                 0x86F9
-#define GL_SIGNED_HILO16_NV               0x86FA
-#define GL_SIGNED_RGBA_NV                 0x86FB
-#define GL_SIGNED_RGBA8_NV                0x86FC
-#define GL_SIGNED_RGB_NV                  0x86FE
-#define GL_SIGNED_RGB8_NV                 0x86FF
-#define GL_SIGNED_LUMINANCE_NV            0x8701
-#define GL_SIGNED_LUMINANCE8_NV           0x8702
-#define GL_SIGNED_LUMINANCE_ALPHA_NV      0x8703
-#define GL_SIGNED_LUMINANCE8_ALPHA8_NV    0x8704
-#define GL_SIGNED_ALPHA_NV                0x8705
-#define GL_SIGNED_ALPHA8_NV               0x8706
-#define GL_SIGNED_INTENSITY_NV            0x8707
-#define GL_SIGNED_INTENSITY8_NV           0x8708
-#define GL_DSDT8_NV                       0x8709
-#define GL_DSDT8_MAG8_NV                  0x870A
-#define GL_DSDT8_MAG8_INTENSITY8_NV       0x870B
-#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV   0x870C
-#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
-#define GL_HI_SCALE_NV                    0x870E
-#define GL_LO_SCALE_NV                    0x870F
-#define GL_DS_SCALE_NV                    0x8710
-#define GL_DT_SCALE_NV                    0x8711
-#define GL_MAGNITUDE_SCALE_NV             0x8712
-#define GL_VIBRANCE_SCALE_NV              0x8713
-#define GL_HI_BIAS_NV                     0x8714
-#define GL_LO_BIAS_NV                     0x8715
-#define GL_DS_BIAS_NV                     0x8716
-#define GL_DT_BIAS_NV                     0x8717
-#define GL_MAGNITUDE_BIAS_NV              0x8718
-#define GL_VIBRANCE_BIAS_NV               0x8719
-#define GL_TEXTURE_BORDER_VALUES_NV       0x871A
-#define GL_TEXTURE_HI_SIZE_NV             0x871B
-#define GL_TEXTURE_LO_SIZE_NV             0x871C
-#define GL_TEXTURE_DS_SIZE_NV             0x871D
-#define GL_TEXTURE_DT_SIZE_NV             0x871E
-#define GL_TEXTURE_MAG_SIZE_NV            0x871F
+#define GL_OFFSET_TEXTURE_RECTANGLE_NV                      0x864c
+#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV                0x864d
+#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV                 0x864e
+#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV             0x86d9
+#define GL_UNSIGNED_INT_S8_S8_8_8_NV                        0x86da
+#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV                    0x86db
+#define GL_DSDT_MAG_INTENSITY_NV                            0x86dc
+#define GL_SHADER_CONSISTENT_NV                             0x86dd
+#define GL_TEXTURE_SHADER_NV                                0x86de
+#define GL_SHADER_OPERATION_NV                              0x86df
+#define GL_CULL_MODES_NV                                    0x86e0
+#define GL_OFFSET_TEXTURE_MATRIX_NV                         0x86e1
+#define GL_OFFSET_TEXTURE_SCALE_NV                          0x86e2
+#define GL_OFFSET_TEXTURE_BIAS_NV                           0x86e3
+#define GL_OFFSET_TEXTURE_2D_MATRIX_NV                      GL_OFFSET_TEXTURE_MATRIX_NV
+#define GL_OFFSET_TEXTURE_2D_SCALE_NV                       GL_OFFSET_TEXTURE_SCALE_NV
+#define GL_OFFSET_TEXTURE_2D_BIAS_NV                        GL_OFFSET_TEXTURE_BIAS_NV
+#define GL_PREVIOUS_TEXTURE_INPUT_NV                        0x86e4
+#define GL_CONST_EYE_NV                                     0x86e5
+#define GL_PASS_THROUGH_NV                                  0x86e6
+#define GL_CULL_FRAGMENT_NV                                 0x86e7
+#define GL_OFFSET_TEXTURE_2D_NV                             0x86e8
+#define GL_DEPENDENT_AR_TEXTURE_2D_NV                       0x86e9
+#define GL_DEPENDENT_GB_TEXTURE_2D_NV                       0x86ea
+#define GL_DOT_PRODUCT_NV                                   0x86ec
+#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV                     0x86ed
+#define GL_DOT_PRODUCT_TEXTURE_2D_NV                        0x86ee
+#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV                  0x86f0
+#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV                  0x86f1
+#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV                  0x86f2
+#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV        0x86f3
+#define GL_HILO_NV                                          0x86f4
+#define GL_DSDT_NV                                          0x86f5
+#define GL_DSDT_MAG_NV                                      0x86f6
+#define GL_DSDT_MAG_VIB_NV                                  0x86f7
+#define GL_HILO16_NV                                        0x86f8
+#define GL_SIGNED_HILO_NV                                   0x86f9
+#define GL_SIGNED_HILO16_NV                                 0x86fa
+#define GL_SIGNED_RGBA_NV                                   0x86fb
+#define GL_SIGNED_RGBA8_NV                                  0x86fc
+#define GL_SIGNED_RGB_NV                                    0x86fe
+#define GL_SIGNED_RGB8_NV                                   0x86ff
+#define GL_SIGNED_LUMINANCE_NV                              0x8701
+#define GL_SIGNED_LUMINANCE8_NV                             0x8702
+#define GL_SIGNED_LUMINANCE_ALPHA_NV                        0x8703
+#define GL_SIGNED_LUMINANCE8_ALPHA8_NV                      0x8704
+#define GL_SIGNED_ALPHA_NV                                  0x8705
+#define GL_SIGNED_ALPHA8_NV                                 0x8706
+#define GL_SIGNED_INTENSITY_NV                              0x8707
+#define GL_SIGNED_INTENSITY8_NV                             0x8708
+#define GL_DSDT8_NV                                         0x8709
+#define GL_DSDT8_MAG8_NV                                    0x870a
+#define GL_DSDT8_MAG8_INTENSITY8_NV                         0x870b
+#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV                     0x870c
+#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV                   0x870d
+#define GL_HI_SCALE_NV                                      0x870e
+#define GL_LO_SCALE_NV                                      0x870f
+#define GL_DS_SCALE_NV                                      0x8710
+#define GL_DT_SCALE_NV                                      0x8711
+#define GL_MAGNITUDE_SCALE_NV                               0x8712
+#define GL_VIBRANCE_SCALE_NV                                0x8713
+#define GL_HI_BIAS_NV                                       0x8714
+#define GL_LO_BIAS_NV                                       0x8715
+#define GL_DS_BIAS_NV                                       0x8716
+#define GL_DT_BIAS_NV                                       0x8717
+#define GL_MAGNITUDE_BIAS_NV                                0x8718
+#define GL_VIBRANCE_BIAS_NV                                 0x8719
+#define GL_TEXTURE_BORDER_VALUES_NV                         0x871a
+#define GL_TEXTURE_HI_SIZE_NV                               0x871b
+#define GL_TEXTURE_LO_SIZE_NV                               0x871c
+#define GL_TEXTURE_DS_SIZE_NV                               0x871d
+#define GL_TEXTURE_DT_SIZE_NV                               0x871e
+#define GL_TEXTURE_MAG_SIZE_NV                              0x871f
 #endif
+
 /* GL_NV_texture_shader2 */
 #ifndef GL_NV_texture_shader2
 #define GL_NV_texture_shader2 1
-#define GL_DOT_PRODUCT_TEXTURE_3D_NV      0x86EF
-#endif
-/* GL_NV_texture_shader3 */
-#ifndef GL_NV_texture_shader3
-#define GL_NV_texture_shader3 1
-#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850
-#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851
-#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852
-#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853
-#define GL_OFFSET_HILO_TEXTURE_2D_NV      0x8854
-#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855
-#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856
-#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857
-#define GL_DEPENDENT_HILO_TEXTURE_2D_NV   0x8858
-#define GL_DEPENDENT_RGB_TEXTURE_3D_NV    0x8859
-#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A
-#define GL_DOT_PRODUCT_PASS_THROUGH_NV    0x885B
-#define GL_DOT_PRODUCT_TEXTURE_1D_NV      0x885C
-#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D
-#define GL_HILO8_NV                       0x885E
-#define GL_SIGNED_HILO8_NV                0x885F
-#define GL_FORCE_BLUE_TO_ONE_NV           0x8860
+#define GL_DOT_PRODUCT_TEXTURE_3D_NV                        0x86ef
 #endif
-/* GL_ATI_texture_env_combine3 */
-#ifndef GL_ATI_texture_env_combine3
-#define GL_ATI_texture_env_combine3 1
-#define GL_MODULATE_ADD_ATI               0x8744
-#define GL_MODULATE_SIGNED_ADD_ATI        0x8745
-#define GL_MODULATE_SUBTRACT_ATI          0x8746
-/* #define ONE */
-/* #define ZERO */
-#endif
-
-/**
- * Point sprites
- */
-/* GL_ARB_point_sprite */
-#ifndef GL_ARB_point_sprite
-#define GL_ARB_point_sprite 1
-#define GL_POINT_SPRITE_ARB               0x8861
-#define GL_COORD_REPLACE_ARB              0x8862
-#endif
-/**
- * @TODO: GL_NV_point_sprite
- */
 
-/**
- * Occlusion Queries
- */
-/* GL_ARB_occlusion_query */
-#ifndef GL_ARB_occlusion_query
-#define GL_ARB_occlusion_query 1
-#define GL_SAMPLES_PASSED_ARB                             0x8914
-#define GL_QUERY_COUNTER_BITS_ARB                         0x8864
-#define GL_CURRENT_QUERY_ARB                              0x8865
-#define GL_QUERY_RESULT_ARB                               0x8866
-#define GL_QUERY_RESULT_AVAILABLE_ARB                     0x8867
-#endif
-typedef void (WINE_GLAPI * PGLFNGENQUERIESARBPROC) (GLsizei n, GLuint *queries);
-typedef void (WINE_GLAPI * PGLFNDELETEQUERIESARBPROC) (GLsizei n, const GLuint *queries);
-typedef GLboolean (WINE_GLAPI * PGLFNISQUERYARBPROC) (GLuint query);
-typedef void (WINE_GLAPI * PGLFNBEGINQUERYARBPROC) (GLenum target, GLuint query);
-typedef void (WINE_GLAPI * PGLFNENDQUERYARBPROC) (GLenum target);
-typedef void (WINE_GLAPI * PGLFNGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETQUERYOBJECTIVARBPROC) (GLuint query, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETQUERYOBJECTUIVARBPROC) (GLuint query, GLenum pname, GLuint *params);
-/* GL_HP_occlusion_test isn't complete, but it's constants are used by GL_NV_occlusion_query */
-#ifndef GL_HP_occlusion_test
-#define GL_HP_occlusion_test 1
-#define GL_OCCLUSION_TEST_HP                 0x8165
-#define GL_OCCLUSION_TEST_RESULT_HP          0x8165
-#endif
-/*  GL_NV_occlusion_query */
-#ifndef GL_NV_occlusion_query
-#define GL_NV_occlusion_query 1
-#define GL_PIXEL_COUNTER_BITS_NV          0x8864
-#define GL_CURRENT_OCCLUSION_QUERY_ID_NV  0x8865
-#define GL_PIXEL_COUNT_NV                 0x8866
-#define GL_PIXEL_COUNT_AVAILABLE_NV       0x8867
-#endif
-typedef void (WINE_GLAPI * PGLFNGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids);
-typedef void (WINE_GLAPI * PGLFNDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids);
-typedef GLboolean (WINE_GLAPI * PGLFNISOCCLUSIONQUERYNVPROC) (GLuint id);
-typedef void (WINE_GLAPI * PGLFNBEGINOCCLUSIONQUERYNVPROC) (GLuint id);
-typedef void (WINE_GLAPI * PGLFNENDOCCLUSIONQUERYNVPROC) (void);
-typedef void (WINE_GLAPI * PGLFNGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params);
-/* GL_EXT_stencil_two_side */
-#ifndef GL_EXT_stencil_two_side
-#define GL_EXT_stencil_two_side 1
-#define GL_STENCIL_TEST_TWO_SIDE_EXT      0x8910
-#define GL_ACTIVE_STENCIL_FACE_EXT        0x8911
-#endif
-typedef void (WINE_GLAPI * PGLFNACTIVESTENCILFACEEXTPROC) (GLenum face);
-/* GL_ATI_separate_stencil */
-#ifndef GL_ATI_separate_stencil
-#define GL_ATI_separate_stencil 1
-#define GL_STENCIL_BACK_FUNC_ATI          0x8800
-#define GL_STENCIL_BACK_FAIL_ATI          0x8801
-#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802
-#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803
-#endif
-typedef void (WINE_GLAPI * PGLFNSTENCILOPSEPARATEATIPROC) (GLenum, GLenum, GLenum, GLenum);
-typedef void (WINE_GLAPI * PGLFNSTENCILFUNCSEPARATEATIPROC) (GLenum, GLenum, GLint, GLuint);
-/* GL_NV_fence */
-#ifndef GL_NV_fence
-#define GL_NV_fence 1
-#define GL_ALL_COMPLETED_NV                 0x84F2
-#define GL_FENCE_STATUS_NV                  0x84F3
-#define GL_FENCE_CONDITION_NV               0x84F4
-#endif
-typedef void (WINE_GLAPI * PGLFNGENFENCESNVPROC) (GLsizei, GLuint *);
-typedef void (WINE_GLAPI * PGLFNDELETEFENCESNVPROC) (GLuint, const GLuint *);
-typedef void (WINE_GLAPI * PGLFNSETFENCENVPROC) (GLuint, GLenum);
-typedef GLboolean (WINE_GLAPI * PGLFNTESTFENCENVPROC) (GLuint);
-typedef void (WINE_GLAPI * PGLFNFINISHFENCENVPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNISFENCENVPROC) (GLuint);
-typedef void (WINE_GLAPI * PGLFNGETFENCEIVNVPROC) (GLuint, GLenum, GLint *);
-/* GL_APPLE_fence */
-#ifndef GL_APPLE_fence
-#define GL_APPLE_fence 1
-#define GL_DRAW_PIXELS_APPLE                0x8A0A
-#define GL_FENCE_APPLE                      0x8A0B
-#endif
-typedef void (WINE_GLAPI * PGLFNGENFENCESAPPLEPROC) (GLsizei, GLuint *);
-typedef void (WINE_GLAPI * PGLFNDELETEFENCESAPPLEPROC) (GLuint, const GLuint *);
-typedef void (WINE_GLAPI * PGLFNSETFENCEAPPLEPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNTESTFENCEAPPLEPROC) (GLuint);
-typedef void (WINE_GLAPI * PGLFNFINISHFENCEAPPLEPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNISFENCEAPPLEPROC) (GLuint);
-typedef GLboolean (WINE_GLAPI * PGLFNTESTOBJECTAPPLEPROC) (GLenum, GLuint);
-typedef void (WINE_GLAPI * PGLFNFINISHOBJECTAPPLEPROC) (GLenum, GLuint);
-/* GL_APPLE_client_storage */
-#ifndef GL_APPLE_client_storage
-#define GL_APPLE_client_storage 1
-#define GL_UNPACK_CLIENT_STORAGE_APPLE      0x85B2
+/* GL_NV_vertex_program2_option */
+#ifndef GL_NV_vertex_program2_option
+#define GL_NV_vertex_program2_option 1
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV                 0x88f4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV                        0x88f5
 #endif
-/* GLX_SGI_video_sync */
-typedef int (WINE_GLAPI * PGLXFNGETVIDEOSYNCSGIPROC) (unsigned int *);
-typedef int (WINE_GLAPI * PGLXFNWAITVIDEOSYNCSGIPROC) (int, int, unsigned int *);
 
 /* GL_SGIS_generate_mipmap */
 #ifndef GLX_SGIS_generate_mipmap
-#define GL_GENERATE_MIPMAP_SGIS             0x8191
-#define GL_GENERATE_MIPMAP_HINT_SGIS        0x8192
-#define GLX_SGIS_generate_mipmap
-#endif
-
-/* GL_NV_depth_clamp */
-#ifndef GL_NV_depth_clamp
-#define GL_DEPTH_CLAMP_NV                   0x864F
+#define GLX_SGIS_generate_mipmap 1
+#define GL_GENERATE_MIPMAP_SGIS                             0x8191
+#define GL_GENERATE_MIPMAP_HINT_SGIS                        0x8192
 #endif
 
-/* GL_APPLE_flush_render */
-typedef void (WINE_GLAPI * PGLFNFLUSHRENDERAPPLEPROC) (void);
-typedef void (WINE_GLAPI * PGLFNFINISHRENDERAPPLEPROC) (void);
-
-/* GL_APPLE_ycbcr_422 */
-#ifndef GL_APPLE_ycbcr_422
-#define GL_APPLE_ycbcr_422
-#define GL_YCBCR_422_APPLE                  0x85B9
-#define UNSIGNED_SHORT_8_8_APPLE            0x85BA
-#define UNSIGNED_SHORT_8_8_REV_APPLE        0x85BB
-#endif
-
-/* GL_ARB_texture_rectangle */
-#ifndef GL_ARB_texture_rectangle
-#define GL_ARB_texture_rectangle
-#define GL_TEXTURE_RECTANGLE_ARB            0x84F5
-#define GL_TEXTURE_BINDING_RECTANGLE_ARB    0x84F6
-#define GL_PROXY_TEXTURE_RECTANGLE_ARB      0x84F7
-#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB   0x84F8
-#define GL_SAMPLER_2D_RECT_ARB              0x8B63
-#define GL_SAMPLER_2D_RECT_SHADOW_ARB       0x8B64
-#endif
-
-/* GL_APPLE_float_pixels */
-#ifndef GL_APPLE_float_pixels
-#define GL_APPLE_float_pixels
-#define GL_HALF_APPLE                       0x140B
-#define GL_COLOR_FLOAT_APPLE                0x8A0F
-#define GL_RGBA_FLOAT32_APPLE               0x8814
-#define GL_RGB_FLOAT32_APPLE                0x8815
-#define GL_ALPHA_FLOAT32_APPLE              0x8816
-#define GL_INTENSITY_FLOAT32_APPLE          0x8817
-#define GL_LUMINANCE_FLOAT32_APPLE          0x8818
-#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE    0x8819
-#define GL_RGBA_FLOAT16_APPLE               0x881A
-#define GL_RGB_FLOAT16_APPLE                0x881B
-#define GL_ALPHA_FLOAT16_APPLE              0x881C
-#define GL_INTENSITY_FLOAT16_APPLE          0x881D
-#define GL_LUMINANCE_FLOAT16_APPLE          0x881E
-#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE    0x881F
-#endif
-
-/* GL_EXT_gpu_program_parameters */
-#ifndef GL_EXT_gpu_program_parameters
-#define GL_EXT_gpu_program_parameters
-typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params);
-typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params);
-#endif
-
-/* GL_NV_light_max_exponent */
-#ifndef GL_NV_light_max_exponent
-#define GL_NV_light_max_exponent
-#define GL_MAX_SHININESS_NV                 0x8504
-#define GL_MAX_SPOT_EXPONENT_NV             0x8505
-#endif
+/* GLX_SGI_video_sync */
+typedef int (WINE_GLAPI *PGLXFNGETVIDEOSYNCSGIPROC)(unsigned int *);
+typedef int (WINE_GLAPI *PGLXFNWAITVIDEOSYNCSGIPROC)(int, int, unsigned int *);
 
-/* GL_ATI_fragment_shader */
-#ifndef GL_ATI_fragment_shader
-#define GL_ATI_fragment_shader
-typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI) (GLuint range);
-typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI) (GLuint id);
-typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI) (GLuint id);
-typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI) (void);
-typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI) (void);
-typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI) (GLuint dst, GLuint coord, GLenum swizzle);
-typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI) (GLuint dst, GLuint interp, GLenum swizzle);
-typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMask,
-                                                     GLuint dstMod, GLuint arg1, GLuint arg1Rep,
-                                                     GLuint arg1Mod);
-typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMask,
-                                                     GLuint dstMod, GLuint arg1, GLuint arg1Rep,
-                                                     GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
-                                                     GLuint arg2Mod);
-typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP3ATI) (GLenum op, GLuint dst, GLuint dstMask,
-                                                     GLuint dstMod, GLuint arg1, GLuint arg1Rep,
-                                                     GLuint arg1Mod, GLuint arg2, GLuint arg2Rep,
-                                                     GLuint arg2Mod, GLuint arg3, GLuint arg3Rep,
-                                                     GLuint arg3Mod);
-typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMod,
-                                                     GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
-typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMod,
-                                                     GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
-                                                     GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
-typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP3ATI) (GLenum op, GLuint dst, GLuint dstMod,
-                                                     GLuint arg1, GLuint arg1Rep, GLuint arg1Mod,
-                                                     GLuint arg2, GLuint arg2Rep, GLuint arg2Mod,
-                                                     GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
-typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI) (GLuint dst, const GLfloat *value);
-#define GL_FRAGMENT_SHADER_ATI              0x8920
-#define GL_REG_0_ATI                        0x8921
-#define GL_REG_1_ATI                        0x8922
-#define GL_REG_2_ATI                        0x8923
-#define GL_REG_3_ATI                        0x8924
-#define GL_REG_4_ATI                        0x8925
-#define GL_REG_5_ATI                        0x8926
-#define GL_CON_0_ATI                        0x8941
-#define GL_CON_1_ATI                        0x8942
-#define GL_CON_2_ATI                        0x8943
-#define GL_CON_3_ATI                        0x8944
-#define GL_CON_4_ATI                        0x8945
-#define GL_CON_5_ATI                        0x8946
-#define GL_CON_6_ATI                        0x8947
-#define GL_CON_7_ATI                        0x8948
-#define GL_MOV_ATI                          0x8961
-#define GL_ADD_ATI                          0x8963
-#define GL_MUL_ATI                          0x8964
-#define GL_SUB_ATI                          0x8965
-#define GL_DOT3_ATI                         0x8966
-#define GL_DOT4_ATI                         0x8967
-#define GL_MAD_ATI                          0x8968
-#define GL_LERP_ATI                         0x8969
-#define GL_CND_ATI                          0x896A
-#define GL_CND0_ATI                         0x896B
-#define GL_DOT2_ADD_ATI                     0x896C
-#define GL_SECONDARY_INTERPOLATOR_ATI       0x896D
-#define GL_SWIZZLE_STR_ATI                  0x8976
-#define GL_SWIZZLE_STQ_ATI                  0x8977
-#define GL_SWIZZLE_STR_DR_ATI               0x8978
-#define GL_SWIZZLE_STQ_DQ_ATI               0x8979
-#define GL_RED_BIT_ATI                      0x00000001
-#define GL_GREEN_BIT_ATI                    0x00000002
-#define GL_BLUE_BIT_ATI                     0x00000004
-#define GL_2X_BIT_ATI                       0x00000001
-#define GL_4X_BIT_ATI                       0x00000002
-#define GL_8X_BIT_ATI                       0x00000004
-#define GL_HALF_BIT_ATI                     0x00000008
-#define GL_QUARTER_BIT_ATI                  0x00000010
-#define GL_EIGHTH_BIT_ATI                   0x00000020
-#define GL_SATURATE_BIT_ATI                 0x00000040
-#define GL_2X_BIT_ATI                       0x00000001
-#define GL_COMP_BIT_ATI                     0x00000002
-#define GL_NEGATE_BIT_ATI                   0x00000004
-#define GL_BIAS_BIT_ATI                     0x00000008
-#endif
-/* GL_ATI_texture_compression_3dc */
-#ifndef GL_ATI_texture_compression_3dc
-#define GL_ATI_texture_compression_3dc
-#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837
-#endif
-/* GL_EXT_texture_compression_rgtc */
-#ifndef GL_EXT_texture_compression_rgtc
-#define GL_EXT_texture_compression_rgtc
-#define GL_COMPRESSED_RED_RGTC1_EXT                       0x8DBB
-#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT                0x8DBC
-#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT                 0x8DBD
-#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT          0x8DBE
-#endif
+/* WGL_ARB_extensions_string */
+typedef const char *(WINAPI *WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
 
-/* GL_NV_vertex_program2_option */
-#ifndef GL_NV_vertex_program2_option
-#define GL_NV_vertex_program2_option
-#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV               0x88F4
-#define GL_MAX_PROGRAM_CALL_DEPTH_NV                      0x88F5
+/* WGL_ARB_multisample */
+#ifndef WGL_ARB_multisample
+#define WGL_ARB_multisample 1
+#define WGL_SAMPLE_BUFFERS_ARB                              0x2041
+#define WGL_SAMPLES_ARB                                     0x2042
 #endif
 
-/* GL_APPLE_flush_buffer_range */
-#ifndef GL_APPLE_flush_buffer_range
-#define GL_APPLE_flush_buffer_range
-#define GL_BUFFER_SERIALIZED_MODIFY_APPLE                 0x8A12
-#define GL_BUFFER_FLUSHING_UNMAP_APPLE                    0x8A13
-typedef void (WINE_GLAPI *PGLFNBUFFERPARAMETERIAPPLE) (GLenum target, GLenum pname, GLint param);
-typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE) (GLenum target, GLintptr offset, GLsizeiptr size);
+/* WGL_ARB_pbuffer */
+#ifndef WGL_ARB_pbuffer
+#define WGL_ARB_pbuffer 1
+#define WGL_DRAW_TO_PBUFFER_ARB                             0x202d
+#define WGL_MAX_PBUFFER_PIXELS_ARB                          0x202e
+#define WGL_MAX_PBUFFER_WIDTH_ARB                           0x202f
+#define WGL_MAX_PBUFFER_HEIGHT_ARB                          0x2030
+#define WGL_PBUFFER_LARGEST_ARB                             0x2033
+#define WGL_PBUFFER_WIDTH_ARB                               0x2034
+#define WGL_PBUFFER_HEIGHT_ARB                              0x2035
+#define WGL_PBUFFER_LOST_ARB                                0x2036
 #endif
+DECLARE_HANDLE(HPBUFFERARB);
+typedef HPBUFFERARB (WINAPI *WINED3D_PFNWGLCREATEPBUFFERARBPROC)(HDC hDC, int iPixelFormat,
+        int iWidth, int iHeight, const int *piAttribList);
+typedef HDC (WINAPI *WINED3D_PFNWGLGETPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer);
+typedef int (WINAPI *WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer, HDC hDC);
+typedef BOOL (WINAPI *WINED3D_PFNWGLDESTROYPBUFFERARBPROC)(HPBUFFERARB hPbuffer);
+typedef BOOL (WINAPI *WINED3D_PFNWGLQUERYPBUFFERARBPROC)(HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
 
-/* GL_VERSION_2_0 */
-#ifndef GL_VERSION_2_0
-#define GL_VERSION_2_0 1
-#define GL_BLEND_EQUATION_RGB             GL_BLEND_EQUATION
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED    0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE       0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE     0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE       0x8625
-#define GL_CURRENT_VERTEX_ATTRIB          0x8626
-#define GL_VERTEX_PROGRAM_POINT_SIZE      0x8642
-#define GL_VERTEX_PROGRAM_TWO_SIDE        0x8643
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER    0x8645
-#define GL_STENCIL_BACK_FUNC              0x8800
-#define GL_STENCIL_BACK_FAIL              0x8801
-#define GL_STENCIL_BACK_PASS_DEPTH_FAIL   0x8802
-#define GL_STENCIL_BACK_PASS_DEPTH_PASS   0x8803
-#define GL_MAX_DRAW_BUFFERS               0x8824
-#define GL_DRAW_BUFFER0                   0x8825
-#define GL_DRAW_BUFFER1                   0x8826
-#define GL_DRAW_BUFFER2                   0x8827
-#define GL_DRAW_BUFFER3                   0x8828
-#define GL_DRAW_BUFFER4                   0x8829
-#define GL_DRAW_BUFFER5                   0x882A
-#define GL_DRAW_BUFFER6                   0x882B
-#define GL_DRAW_BUFFER7                   0x882C
-#define GL_DRAW_BUFFER8                   0x882D
-#define GL_DRAW_BUFFER9                   0x882E
-#define GL_DRAW_BUFFER10                  0x882F
-#define GL_DRAW_BUFFER11                  0x8830
-#define GL_DRAW_BUFFER12                  0x8831
-#define GL_DRAW_BUFFER13                  0x8832
-#define GL_DRAW_BUFFER14                  0x8833
-#define GL_DRAW_BUFFER15                  0x8834
-#define GL_BLEND_EQUATION_ALPHA           0x883D
-#define GL_POINT_SPRITE                   0x8861
-#define GL_COORD_REPLACE                  0x8862
-#define GL_MAX_VERTEX_ATTRIBS             0x8869
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
-#define GL_MAX_TEXTURE_COORDS             0x8871
-#define GL_MAX_TEXTURE_IMAGE_UNITS        0x8872
-#define GL_FRAGMENT_SHADER                0x8B30
-#define GL_VERTEX_SHADER                  0x8B31
-#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
-#define GL_MAX_VERTEX_UNIFORM_COMPONENTS  0x8B4A
-#define GL_MAX_VARYING_FLOATS             0x8B4B
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
-#define GL_SHADER_TYPE                    0x8B4F
-#define GL_FLOAT_VEC2                     0x8B50
-#define GL_FLOAT_VEC3                     0x8B51
-#define GL_FLOAT_VEC4                     0x8B52
-#define GL_INT_VEC2                       0x8B53
-#define GL_INT_VEC3                       0x8B54
-#define GL_INT_VEC4                       0x8B55
-#define GL_BOOL                           0x8B56
-#define GL_BOOL_VEC2                      0x8B57
-#define GL_BOOL_VEC3                      0x8B58
-#define GL_BOOL_VEC4                      0x8B59
-#define GL_FLOAT_MAT2                     0x8B5A
-#define GL_FLOAT_MAT3                     0x8B5B
-#define GL_FLOAT_MAT4                     0x8B5C
-#define GL_SAMPLER_1D                     0x8B5D
-#define GL_SAMPLER_2D                     0x8B5E
-#define GL_SAMPLER_3D                     0x8B5F
-#define GL_SAMPLER_CUBE                   0x8B60
-#define GL_SAMPLER_1D_SHADOW              0x8B61
-#define GL_SAMPLER_2D_SHADOW              0x8B62
-#define GL_DELETE_STATUS                  0x8B80
-#define GL_COMPILE_STATUS                 0x8B81
-#define GL_LINK_STATUS                    0x8B82
-#define GL_VALIDATE_STATUS                0x8B83
-#define GL_INFO_LOG_LENGTH                0x8B84
-#define GL_ATTACHED_SHADERS               0x8B85
-#define GL_ACTIVE_UNIFORMS                0x8B86
-#define GL_ACTIVE_UNIFORM_MAX_LENGTH      0x8B87
-#define GL_SHADER_SOURCE_LENGTH           0x8B88
-#define GL_ACTIVE_ATTRIBUTES              0x8B89
-#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH    0x8B8A
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
-#define GL_SHADING_LANGUAGE_VERSION       0x8B8C
-#define GL_CURRENT_PROGRAM                0x8B8D
-#define GL_POINT_SPRITE_COORD_ORIGIN      0x8CA0
-#define GL_LOWER_LEFT                     0x8CA1
-#define GL_UPPER_LEFT                     0x8CA2
-#define GL_STENCIL_BACK_REF               0x8CA3
-#define GL_STENCIL_BACK_VALUE_MASK        0x8CA4
-#define GL_STENCIL_BACK_WRITEMASK         0x8CA5
-typedef char GLchar;
+/* WGL_ARB_pixel_format */
+#ifndef WGL_ARB_pixel_format
+#define WGL_ARB_pixel_format 1
+#define WGL_NUMBER_PIXEL_FORMATS_ARB                        0x2000
+#define WGL_DRAW_TO_WINDOW_ARB                              0x2001
+#define WGL_DRAW_TO_BITMAP_ARB                              0x2002
+#define WGL_ACCELERATION_ARB                                0x2003
+#define WGL_NEED_PALETTE_ARB                                0x2004
+#define WGL_NEED_SYSTEM_PALETTE_ARB                         0x2005
+#define WGL_SWAP_LAYER_BUFFERS_ARB                          0x2006
+#define WGL_SWAP_METHOD_ARB                                 0x2007
+#define WGL_NUMBER_OVERLAYS_ARB                             0x2008
+#define WGL_NUMBER_UNDERLAYS_ARB                            0x2009
+#define WGL_TRANSPARENT_ARB                                 0x200a
+#define WGL_TRANSPARENT_RED_VALUE_ARB                       0x2037
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB                     0x2038
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB                      0x2039
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB                     0x203a
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB                     0x203b
+#define WGL_SHARE_DEPTH_ARB                                 0x200c
+#define WGL_SHARE_STENCIL_ARB                               0x200d
+#define WGL_SHARE_ACCUM_ARB                                 0x200e
+#define WGL_SUPPORT_GDI_ARB                                 0x200f
+#define WGL_SUPPORT_OPENGL_ARB                              0x2010
+#define WGL_DOUBLE_BUFFER_ARB                               0x2011
+#define WGL_STEREO_ARB                                      0x2012
+#define WGL_PIXEL_TYPE_ARB                                  0x2013
+#define WGL_COLOR_BITS_ARB                                  0x2014
+#define WGL_RED_BITS_ARB                                    0x2015
+#define WGL_RED_SHIFT_ARB                                   0x2016
+#define WGL_GREEN_BITS_ARB                                  0x2017
+#define WGL_GREEN_SHIFT_ARB                                 0x2018
+#define WGL_BLUE_BITS_ARB                                   0x2019
+#define WGL_BLUE_SHIFT_ARB                                  0x201a
+#define WGL_ALPHA_BITS_ARB                                  0x201b
+#define WGL_ALPHA_SHIFT_ARB                                 0x201c
+#define WGL_ACCUM_BITS_ARB                                  0x201d
+#define WGL_ACCUM_RED_BITS_ARB                              0x201e
+#define WGL_ACCUM_GREEN_BITS_ARB                            0x201f
+#define WGL_ACCUM_BLUE_BITS_ARB                             0x2020
+#define WGL_ACCUM_ALPHA_BITS_ARB                            0x2021
+#define WGL_DEPTH_BITS_ARB                                  0x2022
+#define WGL_STENCIL_BITS_ARB                                0x2023
+#define WGL_AUX_BUFFERS_ARB                                 0x2024
+#define WGL_NO_ACCELERATION_ARB                             0x2025
+#define WGL_GENERIC_ACCELERATION_ARB                        0x2026
+#define WGL_FULL_ACCELERATION_ARB                           0x2027
+#define WGL_SWAP_EXCHANGE_ARB                               0x2028
+#define WGL_SWAP_COPY_ARB                                   0x2029
+#define WGL_SWAP_UNDEFINED_ARB                              0x202a
+#define WGL_TYPE_RGBA_ARB                                   0x202b
+#define WGL_TYPE_COLORINDEX_ARB                             0x202c
 #endif
-typedef void (WINE_GLAPI * PGLFNBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
-typedef void (WINE_GLAPI * PGLFNDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
-typedef void (WINE_GLAPI * PGLFNSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
-typedef void (WINE_GLAPI * PGLFNSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
-typedef void (WINE_GLAPI * PGLFNSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
-typedef void (WINE_GLAPI * PGLFNATTACHSHADERPROC) (GLuint program, GLuint shader);
-typedef void (WINE_GLAPI * PGLFNBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
-typedef void (WINE_GLAPI * PGLFNCOMPILESHADERPROC) (GLuint shader);
-typedef GLuint (WINE_GLAPI * PGLFNCREATEPROGRAMPROC) (void);
-typedef GLuint (WINE_GLAPI * PGLFNCREATESHADERPROC) (GLenum type);
-typedef void (WINE_GLAPI * PGLFNDELETEPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNDELETESHADERPROC) (GLuint shader);
-typedef void (WINE_GLAPI * PGLFNDETACHSHADERPROC) (GLuint program, GLuint shader);
-typedef void (WINE_GLAPI * PGLFNDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
-typedef void (WINE_GLAPI * PGLFNGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
-typedef GLint (WINE_GLAPI * PGLFNGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef void (WINE_GLAPI * PGLFNGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef void (WINE_GLAPI * PGLFNGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
-typedef GLint (WINE_GLAPI * PGLFNGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
-typedef void (WINE_GLAPI * PGLFNGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
-typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer);
-typedef GLboolean (WINE_GLAPI * PGLFNISPROGRAMPROC) (GLuint program);
-typedef GLboolean (WINE_GLAPI * PGLFNISSHADERPROC) (GLuint shader);
-typedef void (WINE_GLAPI * PGLFNLINKPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length);
-typedef void (WINE_GLAPI * PGLFNUSEPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1FPROC) (GLint location, GLfloat v0);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1IPROC) (GLint location, GLint v0);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (WINE_GLAPI * PGLFNVALIDATEPROGRAMPROC) (GLuint program);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SPROC) (GLuint index, GLshort x);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v);
-typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+typedef BOOL (WINAPI *WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC hdc, int iPixelFormat,
+        int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
+typedef BOOL (WINAPI *WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC)(HDC hdc, int iPixelFormat,
+        int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
+typedef BOOL (WINAPI *WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC hdc, const int *piAttribIList,
+        const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
 
-
-/****************************************************
- * OpenGL Official Version
- *  defines
- ****************************************************/
-/* GL_VERSION_1_3 */
-#if !defined(GL_DOT3_RGBA)
-# define GL_DOT3_RGBA                     0x8741
-#endif
-#if !defined(GL_SUBTRACT)
-# define GL_SUBTRACT                      0x84E7
+/* WGL_ARB_pixel_format_float */
+#ifndef WGL_ARB_pixel_format_float
+#define WGL_ARB_pixel_format_float 1
+#define WGL_TYPE_RGBA_FLOAT_ARB                             0x21a0
 #endif
 
+/* WGL_WINE_pixel_format_passthrough */
+typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelFormat,
+        const PIXELFORMATDESCRIPTOR *ppfd);
 
-/****************************************************
- * Enumerated types
- ****************************************************/
-#define WINE_DEFAULT_VIDMEM 64*1024*1024
-
-#define MAKEDWORD_VERSION(maj, min)  ((maj & 0x0000FFFF) << 16) | (min & 0x0000FFFF)
-
-/* OpenGL Supported Extensions (ARB and EXT) */
-typedef enum _GL_SupportedExt {
-  WINED3D_GL_EXT_NONE,
-  /* ARB */
-  ARB_COLOR_BUFFER_FLOAT,
-  ARB_DEPTH_BUFFER_FLOAT,
-  ARB_DEPTH_CLAMP,
-  ARB_DEPTH_TEXTURE,
-  ARB_DRAW_BUFFERS,
-  ARB_FRAGMENT_PROGRAM,
-  ARB_FRAGMENT_SHADER,
-  ARB_FRAMEBUFFER_OBJECT,
-  ARB_GEOMETRY_SHADER4,
-  ARB_IMAGING,
-  ARB_MULTISAMPLE,
-  ARB_MULTITEXTURE,
-  ARB_OCCLUSION_QUERY,
-  ARB_POINT_PARAMETERS,
-  ARB_PROVOKING_VERTEX,
-  ARB_PIXEL_BUFFER_OBJECT,
-  ARB_POINT_SPRITE,
-  ARB_TEXTURE_COMPRESSION,
-  ARB_TEXTURE_CUBE_MAP,
-  ARB_TEXTURE_ENV_ADD,
-  ARB_TEXTURE_ENV_COMBINE,
-  ARB_TEXTURE_ENV_DOT3,
-  ARB_TEXTURE_FLOAT,
-  ARB_HALF_FLOAT_PIXEL,
-  ARB_TEXTURE_BORDER_CLAMP,
-  ARB_TEXTURE_MIRRORED_REPEAT,
-  ARB_TEXTURE_NON_POWER_OF_TWO,
-  ARB_TEXTURE_RECTANGLE,
-  ARB_TEXTURE_RG,
-  ARB_VERTEX_PROGRAM,
-  ARB_VERTEX_BLEND,
-  ARB_VERTEX_BUFFER_OBJECT,
-  ARB_VERTEX_SHADER,
-  ARB_SHADER_OBJECTS,
-  ARB_SHADER_TEXTURE_LOD,
-  ARB_HALF_FLOAT_VERTEX,
-  /* EXT */
-  EXT_BLEND_COLOR,
-  EXT_BLEND_MINMAX,
-  EXT_BLEND_EQUATION_SEPARATE,
-  EXT_BLEND_FUNC_SEPARATE,
-  EXT_FOG_COORD,
-  EXT_FRAMEBUFFER_OBJECT,
-  EXT_FRAMEBUFFER_BLIT,
-  EXT_FRAMEBUFFER_MULTISAMPLE,
-  EXT_PACKED_DEPTH_STENCIL,
-  EXT_PALETTED_TEXTURE,
-  EXT_PIXEL_BUFFER_OBJECT,
-  EXT_POINT_PARAMETERS,
-  EXT_PROVOKING_VERTEX,
-  EXT_SECONDARY_COLOR,
-  EXT_STENCIL_TWO_SIDE,
-  EXT_STENCIL_WRAP,
-  EXT_TEXTURE3D,
-  EXT_TEXTURE_COMPRESSION_S3TC,
-  EXT_TEXTURE_COMPRESSION_RGTC,
-  EXT_TEXTURE_FILTER_ANISOTROPIC,
-  EXT_TEXTURE_LOD,
-  EXT_TEXTURE_LOD_BIAS,
-  EXT_TEXTURE_ENV_ADD,
-  EXT_TEXTURE_ENV_COMBINE,
-  EXT_TEXTURE_ENV_DOT3,
-  EXT_TEXTURE_SRGB,
-  EXT_TEXTURE_SWIZZLE,
-  EXT_GPU_PROGRAM_PARAMETERS,
-  EXT_VERTEX_ARRAY_BGRA,
-  /* NVIDIA */
-  NV_HALF_FLOAT,
-  NV_FOG_DISTANCE,
-  NV_FRAGMENT_PROGRAM,
-  NV_FRAGMENT_PROGRAM2,
-  NV_OCCLUSION_QUERY,
-  NV_REGISTER_COMBINERS,
-  NV_REGISTER_COMBINERS2,
-  NV_TEXGEN_REFLECTION,
-  NV_TEXTURE_ENV_COMBINE4,
-  NV_TEXTURE_SHADER,
-  NV_TEXTURE_SHADER2,
-  NV_TEXTURE_SHADER3,
-  NV_VERTEX_PROGRAM,
-  NV_VERTEX_PROGRAM1_1,
-  NV_VERTEX_PROGRAM2,
-  NV_VERTEX_PROGRAM2_OPTION,
-  NV_VERTEX_PROGRAM3,
-  NV_FRAGMENT_PROGRAM_OPTION,
-  NV_FENCE,
-  NV_DEPTH_CLAMP,
-  NV_LIGHT_MAX_EXPONENT,
-  /* ATI */
-  ATI_SEPARATE_STENCIL,
-  ATI_TEXTURE_ENV_COMBINE3,
-  ATI_TEXTURE_MIRROR_ONCE,
-  EXT_VERTEX_SHADER,
-  ATI_FRAGMENT_SHADER,
-  ATI_TEXTURE_COMPRESSION_3DC,
-  /* APPLE */
-  APPLE_FENCE,
-  APPLE_CLIENT_STORAGE,
-  APPLE_FLUSH_RENDER,
-  APPLE_YCBCR_422,
-  APPLE_FLOAT_PIXELS,
-  APPLE_FLUSH_BUFFER_RANGE,
-  /* SGI */
-  SGI_VIDEO_SYNC,
-  SGIS_GENERATE_MIPMAP,
-
-  /* Internally used */
-  WINE_NORMALIZED_TEXRECT,
-
-  /* WGL extensions */
-  WGL_ARB_PBUFFER,
-  WGL_ARB_PIXEL_FORMAT,
-  WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
-
-  WINED3D_GL_EXT_COUNT,
-} GL_SupportedExt;
-
-
-/****************************************************
- * #Defines
- ****************************************************/
 #define GL_EXT_FUNCS_GEN \
-    /** ARB Extensions **/ \
+    /* GL_APPLE_fence */ \
+    USE_GL_FUNC(PGLFNGENFENCESAPPLEPROC, \
+            glGenFencesAPPLE,                           APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNDELETEFENCESAPPLEPROC, \
+            glDeleteFencesAPPLE,                        APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNSETFENCEAPPLEPROC, \
+            glSetFenceAPPLE,                            APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNTESTFENCEAPPLEPROC, \
+            glTestFenceAPPLE,                           APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNFINISHFENCEAPPLEPROC, \
+            glFinishFenceAPPLE,                         APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNISFENCEAPPLEPROC, \
+            glIsFenceAPPLE,                             APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNTESTOBJECTAPPLEPROC, \
+            glTestObjectAPPLE,                          APPLE_FENCE,                    NULL) \
+    USE_GL_FUNC(PGLFNFINISHOBJECTAPPLEPROC, \
+            glFinishObjectAPPLE,                        APPLE_FENCE,                    NULL) \
+    /* GL_APPLE_flush_buffer_range */ \
+    USE_GL_FUNC(PGLFNBUFFERPARAMETERIAPPLE, \
+            glBufferParameteriAPPLE,                    APPLE_FLUSH_BUFFER_RANGE,       NULL) \
+    USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE, \
+            glFlushMappedBufferRangeAPPLE,              APPLE_FLUSH_BUFFER_RANGE,       NULL) \
+    /* GL_APPLE_flush_render */ \
+    USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC, \
+            glFlushRenderAPPLE,                         APPLE_FLUSH_RENDER,             NULL) \
+    USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, \
+            glFinishRenderAPPLE,                        APPLE_FLUSH_RENDER,             NULL) \
     /* GL_ARB_color_buffer_float */ \
-    USE_GL_FUNC(PGLFNCLAMPCOLORARBPROC,                             glClampColorARB,                            ARB_COLOR_BUFFER_FLOAT, NULL )\
+    USE_GL_FUNC(PGLFNCLAMPCOLORARBPROC, \
+            glClampColorARB,                            ARB_COLOR_BUFFER_FLOAT,         NULL) \
     /* GL_ARB_draw_buffers */ \
-    USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC,                            glDrawBuffersARB,                           ARB_DRAW_BUFFERS,       NULL )\
+    USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC, \
+            glDrawBuffersARB,                           ARB_DRAW_BUFFERS,               NULL) \
     /* GL_ARB_framebuffer_object */ \
-    USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC,                          glIsRenderbuffer,                           ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBINDRENDERBUFFERPROC,                        glBindRenderbuffer,                         ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSPROC,                     glDeleteRenderbuffers,                      ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSPROC,                        glGenRenderbuffers,                         ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEPROC,                     glRenderbufferStorage,                      ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC,            glRenderbufferStorageMultisample,           ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVPROC,              glGetRenderbufferParameteriv,               ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLISFRAMEBUFFERPROC,                           glIsFramebuffer,                            ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFERPROC,                         glBindFramebuffer,                          ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSPROC,                      glDeleteFramebuffers,                       ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSPROC,                         glGenFramebuffers,                          ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSPROC,                  glCheckFramebufferStatus,                   ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DPROC,                    glFramebufferTexture1D,                     ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DPROC,                    glFramebufferTexture2D,                     ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DPROC,                    glFramebufferTexture3D,                     ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURELAYERPROC,                 glFramebufferTextureLayer,                  ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFERPROC,                 glFramebufferRenderbuffer,                  ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC,     glGetFramebufferAttachmentParameteriv,      ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFERPROC,                         glBlitFramebuffer,                          ARB_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENERATEMIPMAPPROC,                          glGenerateMipmap,                           ARB_FRAMEBUFFER_OBJECT, NULL )\
+    USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC, \
+            glIsRenderbuffer,                           ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBINDRENDERBUFFERPROC, \
+            glBindRenderbuffer,                         ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSPROC, \
+            glDeleteRenderbuffers,                      ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSPROC, \
+            glGenRenderbuffers,                         ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEPROC, \
+            glRenderbufferStorage,                      ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC, \
+            glRenderbufferStorageMultisample,           ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVPROC, \
+            glGetRenderbufferParameteriv,               ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLISFRAMEBUFFERPROC, \
+            glIsFramebuffer,                            ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFERPROC, \
+            glBindFramebuffer,                          ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSPROC, \
+            glDeleteFramebuffers,                       ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSPROC, \
+            glGenFramebuffers,                          ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSPROC, \
+            glCheckFramebufferStatus,                   ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DPROC, \
+            glFramebufferTexture1D,                     ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DPROC, \
+            glFramebufferTexture2D,                     ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DPROC, \
+            glFramebufferTexture3D,                     ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURELAYERPROC,     \
+            glFramebufferTextureLayer,                  ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFERPROC, \
+            glFramebufferRenderbuffer,                  ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, \
+            glGetFramebufferAttachmentParameteriv,      ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFERPROC, \
+            glBlitFramebuffer,                          ARB_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENERATEMIPMAPPROC, \
+            glGenerateMipmap,                           ARB_FRAMEBUFFER_OBJECT,         NULL) \
     /* GL_ARB_geometry_shader4 */ \
-    USE_GL_FUNC(PGLFNPROGRAMPARAMETERIARBPROC,                      glProgramParameteriARB,                     ARB_GEOMETRY_SHADER4,   NULL ) \
-    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREARBPROC,                     glFramebufferTextureARB,                    ARB_GEOMETRY_SHADER4,   NULL ) \
-    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTURELAYERARBPROC,                glFramebufferTextureLayerARB,               ARB_GEOMETRY_SHADER4,   NULL ) \
-    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREFACEARBPROC,                 glFramebufferTextureFaceARB,                ARB_GEOMETRY_SHADER4,   NULL ) \
+    USE_GL_FUNC(PGLFNPROGRAMPARAMETERIARBPROC, \
+            glProgramParameteriARB,                     ARB_GEOMETRY_SHADER4,           NULL) \
+    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREARBPROC, \
+            glFramebufferTextureARB,                    ARB_GEOMETRY_SHADER4,           NULL) \
+    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTURELAYERARBPROC, \
+            glFramebufferTextureLayerARB,               ARB_GEOMETRY_SHADER4,           NULL) \
+    USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREFACEARBPROC, \
+            glFramebufferTextureFaceARB,                ARB_GEOMETRY_SHADER4,           NULL) \
     /* GL_ARB_imaging, GL_EXT_blend_minmax */ \
-    USE_GL_FUNC(PGLFNBLENDCOLORPROC,                                glBlendColorEXT,                            EXT_BLEND_COLOR,        NULL )\
-    USE_GL_FUNC(PGLFNBLENDEQUATIONPROC,                             glBlendEquationEXT,                         EXT_BLEND_MINMAX,       NULL )\
+    USE_GL_FUNC(PGLFNBLENDCOLORPROC, \
+            glBlendColorEXT,                            EXT_BLEND_COLOR,                NULL) \
+    USE_GL_FUNC(PGLFNBLENDEQUATIONPROC, \
+            glBlendEquationEXT,                         EXT_BLEND_MINMAX,               NULL) \
+    /* GL_ARB_map_buffer_range */ \
+    USE_GL_FUNC(PGLFNMAPBUFFERRANGEPROC, \
+            glMapBufferRange,                           ARB_MAP_BUFFER_RANGE,           NULL) \
+    USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEPROC, \
+            glFlushMappedBufferRange,                   ARB_MAP_BUFFER_RANGE,           NULL) \
     /* GL_ARB_multisample */ \
-    USE_GL_FUNC(WINED3D_PFNGLSAMPLECOVERAGEARBPROC,                 glSampleCoverageARB,                        ARB_MULTISAMPLE,        NULL )\
+    USE_GL_FUNC(WINED3D_PFNGLSAMPLECOVERAGEARBPROC, \
+            glSampleCoverageARB,                        ARB_MULTISAMPLE,                NULL) \
     /* GL_ARB_multitexture */ \
-    USE_GL_FUNC(WINED3D_PFNGLACTIVETEXTUREARBPROC,                  glActiveTextureARB,                         ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC,            glClientActiveTextureARB,                   ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FARBPROC,                glMultiTexCoord1fARB,                       ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FVARBPROC,               glMultiTexCoord1fvARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FARBPROC,                glMultiTexCoord2fARB,                       ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FVARBPROC,               glMultiTexCoord2fvARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FARBPROC,                glMultiTexCoord3fARB,                       ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FVARBPROC,               glMultiTexCoord3fvARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FARBPROC,                glMultiTexCoord4fARB,                       ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FVARBPROC,               glMultiTexCoord4fvARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2SVARBPROC,               glMultiTexCoord2svARB,                      ARB_MULTITEXTURE,       NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4SVARBPROC,               glMultiTexCoord4svARB,                      ARB_MULTITEXTURE,       NULL )\
+    USE_GL_FUNC(WINED3D_PFNGLACTIVETEXTUREARBPROC, \
+            glActiveTextureARB,                         ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC, \
+            glClientActiveTextureARB,                   ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FARBPROC, \
+            glMultiTexCoord1fARB,                       ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FVARBPROC, \
+            glMultiTexCoord1fvARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FARBPROC, \
+            glMultiTexCoord2fARB,                       ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FVARBPROC, \
+            glMultiTexCoord2fvARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FARBPROC, \
+            glMultiTexCoord3fARB,                       ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FVARBPROC, \
+            glMultiTexCoord3fvARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FARBPROC, \
+            glMultiTexCoord4fARB,                       ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FVARBPROC, \
+            glMultiTexCoord4fvARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2SVARBPROC, \
+            glMultiTexCoord2svARB,                      ARB_MULTITEXTURE,               NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4SVARBPROC, \
+            glMultiTexCoord4svARB,                      ARB_MULTITEXTURE,               NULL) \
     /* GL_ARB_occlusion_query */ \
-    USE_GL_FUNC(PGLFNGENQUERIESARBPROC,                             glGenQueriesARB,                            ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNDELETEQUERIESARBPROC,                          glDeleteQueriesARB,                         ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNBEGINQUERYARBPROC,                             glBeginQueryARB,                            ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNENDQUERYARBPROC,                               glEndQueryARB,                              ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNGETQUERYOBJECTIVARBPROC,                       glGetQueryObjectivARB,                      ARB_OCCLUSION_QUERY,    NULL )\
-    USE_GL_FUNC(PGLFNGETQUERYOBJECTUIVARBPROC,                      glGetQueryObjectuivARB,                     ARB_OCCLUSION_QUERY,    NULL )\
+    USE_GL_FUNC(PGLFNGENQUERIESARBPROC, \
+            glGenQueriesARB,                            ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNDELETEQUERIESARBPROC, \
+            glDeleteQueriesARB,                         ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNBEGINQUERYARBPROC, \
+            glBeginQueryARB,                            ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNENDQUERYARBPROC, \
+            glEndQueryARB,                              ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNGETQUERYOBJECTIVARBPROC, \
+            glGetQueryObjectivARB,                      ARB_OCCLUSION_QUERY,            NULL) \
+    USE_GL_FUNC(PGLFNGETQUERYOBJECTUIVARBPROC, \
+            glGetQueryObjectuivARB,                     ARB_OCCLUSION_QUERY,            NULL) \
     /* GL_ARB_point_parameters */ \
-    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFARBPROC,                      glPointParameterfARB,                       ARB_POINT_PARAMETERS,   NULL )\
-    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVARBPROC,                     glPointParameterfvARB,                      ARB_POINT_PARAMETERS,   NULL )\
+    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFARBPROC, \
+            glPointParameterfARB,                       ARB_POINT_PARAMETERS,           NULL) \
+    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVARBPROC, \
+            glPointParameterfvARB,                      ARB_POINT_PARAMETERS,           NULL) \
     /* GL_ARB_provoking_vertex */ \
-    USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXPROC,                         glProvokingVertex,                          ARB_PROVOKING_VERTEX,   NULL)\
+    USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXPROC, \
+            glProvokingVertex,                          ARB_PROVOKING_VERTEX,           NULL) \
+    /* GL_ARB_shader_objects */ \
+    USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC, \
+            glGetObjectParameterivARB,                  ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC, \
+            glGetObjectParameterfvARB,                  ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC, \
+            glGetUniformLocationARB,                    ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETACTIVEUNIFORMARBPROC, \
+            glGetActiveUniformARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \
+            glUniform1iARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IARBPROC, \
+            glUniform2iARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IARBPROC, \
+            glUniform3iARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC, \
+            glUniform4iARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \
+            glUniform1fARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC, \
+            glUniform2fARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FARBPROC, \
+            glUniform3fARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FARBPROC, \
+            glUniform4fARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FVARBPROC, \
+            glUniform1fvARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FVARBPROC, \
+            glUniform2fvARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FVARBPROC, \
+            glUniform3fvARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FVARBPROC, \
+            glUniform4fvARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IVARBPROC, \
+            glUniform1ivARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IVARBPROC, \
+            glUniform2ivARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IVARBPROC, \
+            glUniform3ivARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IVARBPROC, \
+            glUniform4ivARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC, \
+            glUniformMatrix2fvARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC, \
+            glUniformMatrix3fvARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC, \
+            glUniformMatrix4fvARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMFVARBPROC, \
+            glGetUniformfvARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMIVARBPROC, \
+            glGetUniformivARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETINFOLOGARBPROC, \
+            glGetInfoLogARB,                            ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC, \
+            glUseProgramObjectARB,                      ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLCREATESHADEROBJECTARBPROC, \
+            glCreateShaderObjectARB,                    ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLSHADERSOURCEARBPROC, \
+            glShaderSourceARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLCOMPILESHADERARBPROC, \
+            glCompileShaderARB,                         ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC, \
+            glCreateProgramObjectARB,                   ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLATTACHOBJECTARBPROC, \
+            glAttachObjectARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLLINKPROGRAMARBPROC, \
+            glLinkProgramARB,                           ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLDETACHOBJECTARBPROC, \
+            glDetachObjectARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLDELETEOBJECTARBPROC, \
+            glDeleteObjectARB,                          ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLVALIDATEPROGRAMARBPROC, \
+            glValidateProgramARB,                       ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC, \
+            glGetAttachedObjectsARB,                    ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETHANDLEARBPROC, \
+            glGetHandleARB,                             ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETSHADERSOURCEARBPROC, \
+            glGetShaderSourceARB,                       ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC, \
+            glBindAttribLocationARB,                    ARB_SHADER_OBJECTS,             NULL) \
+    USE_GL_FUNC(WINED3D_PFNGLGETATTRIBLOCATIONARBPROC, \
+            glGetAttribLocationARB,                     ARB_SHADER_OBJECTS,             NULL) \
+    /* GL_ARB_sync */ \
+    USE_GL_FUNC(PGLFNFENCESYNCPROC, \
+            glFenceSync,                                ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNISSYNCPROC, \
+            glIsSync,                                   ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNDELETESYNCPROC, \
+            glDeleteSync,                               ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNCLIENTWAITSYNCPROC, \
+            glClientWaitSync,                           ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNWAITSYNCPROC, \
+            glWaitSync,                                 ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNGETINTEGER64VPROC, \
+            glGetInteger64v,                            ARB_SYNC,                       NULL) \
+    USE_GL_FUNC(PGLFNGETSYNCIVPROC, \
+            glGetSynciv,                                ARB_SYNC,                       NULL) \
     /* GL_ARB_texture_compression */ \
-    USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC,                      glCompressedTexImage2DARB,                  ARB_TEXTURE_COMPRESSION,NULL )\
-    USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC,                      glCompressedTexImage3DARB,                  ARB_TEXTURE_COMPRESSION,NULL )\
-    USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC,                   glCompressedTexSubImage2DARB,               ARB_TEXTURE_COMPRESSION,NULL )\
-    USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC,                   glCompressedTexSubImage3DARB,               ARB_TEXTURE_COMPRESSION,NULL )\
-    USE_GL_FUNC(PGLFNGETCOMPRESSEDTEXIMAGEPROC,                     glGetCompressedTexImageARB,                 ARB_TEXTURE_COMPRESSION,NULL )\
+    USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC, \
+            glCompressedTexImage2DARB,                  ARB_TEXTURE_COMPRESSION,        NULL) \
+    USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC, \
+            glCompressedTexImage3DARB,                  ARB_TEXTURE_COMPRESSION,        NULL) \
+    USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC, \
+            glCompressedTexSubImage2DARB,               ARB_TEXTURE_COMPRESSION,        NULL) \
+    USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC, \
+            glCompressedTexSubImage3DARB,               ARB_TEXTURE_COMPRESSION,        NULL) \
+    USE_GL_FUNC(PGLFNGETCOMPRESSEDTEXIMAGEPROC, \
+            glGetCompressedTexImageARB,                 ARB_TEXTURE_COMPRESSION,        NULL) \
     /* GL_ARB_vertex_blend */ \
-    USE_GL_FUNC(PGLFNGLWEIGHTPOINTERARB,                            glWeightPointerARB,                         ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTBV,                                    glWeightbvARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTSV,                                    glWeightsvARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTIV,                                    glWeightivARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTFV,                                    glWeightfvARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTDV,                                    glWeightdvARB,                              ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTUBV,                                   glWeightubvARB,                             ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTUSV,                                   glWeightusvARB,                             ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLWEIGHTUIV,                                   glWeightuivARB,                             ARB_VERTEX_BLEND,       NULL )\
-    USE_GL_FUNC(PGLFNGLVERTEXBLENDARB,                              glVertexBlendARB,                           ARB_VERTEX_BLEND,       NULL )\
+    USE_GL_FUNC(PGLFNGLWEIGHTPOINTERARB, \
+            glWeightPointerARB,                         ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTBV, \
+            glWeightbvARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTSV, \
+            glWeightsvARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTIV, \
+            glWeightivARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTFV, \
+            glWeightfvARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTDV, \
+            glWeightdvARB,                              ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTUBV, \
+            glWeightubvARB,                             ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTUSV, \
+            glWeightusvARB,                             ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLWEIGHTUIV, \
+            glWeightuivARB,                             ARB_VERTEX_BLEND,               NULL) \
+    USE_GL_FUNC(PGLFNGLVERTEXBLENDARB, \
+            glVertexBlendARB,                           ARB_VERTEX_BLEND,               NULL) \
     /* GL_ARB_vertex_buffer_object */ \
-    USE_GL_FUNC(PGLFNBINDBUFFERARBPROC,                             glBindBufferARB,                            ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNDELETEBUFFERSARBPROC,                          glDeleteBuffersARB,                         ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNGENBUFFERSARBPROC,                             glGenBuffersARB,                            ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNISBUFFERARBPROC,                               glIsBufferARB,                              ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNBUFFERDATAARBPROC,                             glBufferDataARB,                            ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNBUFFERSUBDATAARBPROC,                          glBufferSubDataARB,                         ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNGETBUFFERSUBDATAARBPROC,                       glGetBufferSubDataARB,                      ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNMAPBUFFERARBPROC,                              glMapBufferARB,                             ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNUNMAPBUFFERARBPROC,                            glUnmapBufferARB,                           ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNGETBUFFERPARAMETERIVARBPROC,                   glGetBufferParameterivARB,                  ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    USE_GL_FUNC(PGLFNGETBUFFERPOINTERVARBPROC,                      glGetBufferPointervARB,                     ARB_VERTEX_BUFFER_OBJECT,NULL)\
-    /** EXT Extensions **/ \
+    USE_GL_FUNC(PGLFNBINDBUFFERARBPROC, \
+            glBindBufferARB,                            ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNDELETEBUFFERSARBPROC, \
+            glDeleteBuffersARB,                         ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNGENBUFFERSARBPROC, \
+            glGenBuffersARB,                            ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNISBUFFERARBPROC, \
+            glIsBufferARB,                              ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNBUFFERDATAARBPROC, \
+            glBufferDataARB,                            ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNBUFFERSUBDATAARBPROC, \
+            glBufferSubDataARB,                         ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNGETBUFFERSUBDATAARBPROC, \
+            glGetBufferSubDataARB,                      ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNMAPBUFFERARBPROC, \
+            glMapBufferARB,                             ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNUNMAPBUFFERARBPROC, \
+            glUnmapBufferARB,                           ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNGETBUFFERPARAMETERIVARBPROC, \
+            glGetBufferParameterivARB,                  ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    USE_GL_FUNC(PGLFNGETBUFFERPOINTERVARBPROC, \
+            glGetBufferPointervARB,                     ARB_VERTEX_BUFFER_OBJECT,       NULL) \
+    /* GL_ARB_vertex_program */ \
+    USE_GL_FUNC(PGLFNGENPROGRAMSARBPROC, \
+            glGenProgramsARB,                           ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNBINDPROGRAMARBPROC, \
+            glBindProgramARB,                           ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC, \
+            glProgramStringARB,                         ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC, \
+            glDeleteProgramsARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC, \
+            glProgramEnvParameter4fvARB,                ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETER4FVARBPROC, \
+            glProgramLocalParameter4fvARB,              ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC, \
+            glVertexAttribPointerARB,                   ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC, \
+            glEnableVertexAttribArrayARB,               ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC, \
+            glDisableVertexAttribArrayARB,              ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1DARBPROC, \
+            glVertexAttrib1dARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1DVARBPROC, \
+            glVertexAttrib1dvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1FARBPROC, \
+            glVertexAttrib1fARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1FVARBPROC, \
+            glVertexAttrib1fvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1SARBPROC, \
+            glVertexAttrib1sARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1SVARBPROC, \
+            glVertexAttrib1svARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2DARBPROC, \
+            glVertexAttrib2dARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2DVARBPROC, \
+            glVertexAttrib2dvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2FARBPROC, \
+            glVertexAttrib2fARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2FVARBPROC, \
+            glVertexAttrib2fvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2SARBPROC, \
+            glVertexAttrib2sARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2SVARBPROC, \
+            glVertexAttrib2svARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3DARBPROC, \
+            glVertexAttrib3dARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3DVARBPROC, \
+            glVertexAttrib3dvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3FARBPROC, \
+            glVertexAttrib3fARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3FVARBPROC, \
+            glVertexAttrib3fvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3SARBPROC, \
+            glVertexAttrib3sARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3SVARBPROC, \
+            glVertexAttrib3svARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NBVARBPROC, \
+            glVertexAttrib4NbvARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NIVARBPROC, \
+            glVertexAttrib4NivARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NSVARBPROC, \
+            glVertexAttrib4NsvARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBARBPROC, \
+            glVertexAttrib4NubARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBVARBPROC, \
+            glVertexAttrib4NubvARB,                     ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUIVARBPROC, \
+            glVertexAttrib4NuivARB,                     ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUSVARBPROC, \
+            glVertexAttrib4NusvARB,                     ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4BVARBPROC, \
+            glVertexAttrib4bvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4DARBPROC, \
+            glVertexAttrib4dARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4DVARBPROC, \
+            glVertexAttrib4dvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4FARBPROC, \
+            glVertexAttrib4fARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4FVARBPROC, \
+            glVertexAttrib4fvARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4IVARBPROC, \
+            glVertexAttrib4ivARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4SARBPROC, \
+            glVertexAttrib4sARB,                        ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4SVARBPROC, \
+            glVertexAttrib4svARB,                       ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4UBVARBPROC, \
+            glVertexAttrib4ubvARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4UIVARBPROC, \
+            glVertexAttrib4uivARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4USVARBPROC, \
+            glVertexAttrib4usvARB,                      ARB_VERTEX_PROGRAM,             NULL) \
+    USE_GL_FUNC(PGLFNGETPROGRAMIVARBPROC, \
+            glGetProgramivARB,                          ARB_VERTEX_PROGRAM,             NULL) \
+    /* GL_ATI_fragment_shader */ \
+    USE_GL_FUNC(PGLFNGENFRAGMENTSHADERSATI, \
+            glGenFragmentShadersATI,                    ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNBINDFRAGMENTSHADERATI, \
+            glBindFragmentShaderATI,                    ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNDELETEFRAGMENTSHADERATI, \
+            glDeleteFragmentShaderATI,                  ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNBEGINFRAGMENTSHADERATI, \
+            glBeginFragmentShaderATI,                   ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNENDFRAGMENTSHADERATI, \
+            glEndFragmentShaderATI,                     ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNPASSTEXCOORDATI, \
+            glPassTexCoordATI,                          ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNSAMPLEMAPATI, \
+            glSampleMapATI,                             ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP1ATI, \
+            glColorFragmentOp1ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP2ATI, \
+            glColorFragmentOp2ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP3ATI, \
+            glColorFragmentOp3ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP1ATI, \
+            glAlphaFragmentOp1ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP2ATI, \
+            glAlphaFragmentOp2ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP3ATI, \
+            glAlphaFragmentOp3ATI,                      ATI_FRAGMENT_SHADER,            NULL) \
+    USE_GL_FUNC(PGLFNSETFRAGMENTSHADERCONSTANTATI, \
+            glSetFragmentShaderConstantATI,             ATI_FRAGMENT_SHADER,            NULL) \
+    /* GL_ATI_separate_stencil */ \
+    USE_GL_FUNC(PGLFNSTENCILOPSEPARATEATIPROC, \
+            glStencilOpSeparateATI,                     ATI_SEPARATE_STENCIL,           NULL) \
+    USE_GL_FUNC(PGLFNSTENCILFUNCSEPARATEATIPROC, \
+            glStencilFuncSeparateATI,                   ATI_SEPARATE_STENCIL,           NULL) \
     /* GL_EXT_blend_equation_separate */ \
-    USE_GL_FUNC(PGLFNBLENDFUNCSEPARATEEXTPROC,                      glBlendFuncSeparateEXT,                     EXT_BLEND_FUNC_SEPARATE, NULL)\
+    USE_GL_FUNC(PGLFNBLENDFUNCSEPARATEEXTPROC, \
+            glBlendFuncSeparateEXT,                     EXT_BLEND_FUNC_SEPARATE,        NULL) \
     /* GL_EXT_blend_func_separate */ \
-    USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC,                  glBlendEquationSeparateEXT,                 EXT_BLEND_EQUATION_SEPARATE, NULL)\
+    USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC, \
+            glBlendEquationSeparateEXT,                 EXT_BLEND_EQUATION_SEPARATE,    NULL) \
     /* GL_EXT_fog_coord */ \
-    USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC,                            glFogCoordfEXT,                             EXT_FOG_COORD,          NULL )\
-    USE_GL_FUNC(PGLFNGLFOGCOORDFVEXTPROC,                           glFogCoordfvEXT,                            EXT_FOG_COORD,          NULL )\
-    USE_GL_FUNC(PGLFNGLFOGCOORDDEXTPROC,                            glFogCoorddEXT,                             EXT_FOG_COORD,          NULL )\
-    USE_GL_FUNC(PGLFNGLFOGCOORDDVEXTPROC,                           glFogCoorddvEXT,                            EXT_FOG_COORD,          NULL )\
-    USE_GL_FUNC(PGLFNGLFOGCOORDPOINTEREXTPROC,                      glFogCoordPointerEXT,                       EXT_FOG_COORD,          NULL )\
-    /* GL_EXT_framebuffer_object */ \
-    USE_GL_FUNC(PGLFNGLISRENDERBUFFEREXTPROC,                       glIsRenderbufferEXT,                        EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBINDRENDERBUFFEREXTPROC,                     glBindRenderbufferEXT,                      EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSEXTPROC,                  glDeleteRenderbuffersEXT,                   EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSEXTPROC,                     glGenRenderbuffersEXT,                      EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEEXTPROC,                  glRenderbufferStorageEXT,                   EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLISFRAMEBUFFEREXTPROC,                        glIsFramebufferEXT,                         EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFEREXTPROC,                      glBindFramebufferEXT,                       EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSEXTPROC,                   glDeleteFramebuffersEXT,                    EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSEXTPROC,                      glGenFramebuffersEXT,                       EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC,               glCheckFramebufferStatusEXT,                EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC,                 glFramebufferTexture1DEXT,                  EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC,                 glFramebufferTexture2DEXT,                  EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC,                 glFramebufferTexture3DEXT,                  EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC,              glFramebufferRenderbufferEXT,               EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGENERATEMIPMAPEXTPROC,                       glGenerateMipmapEXT,                        EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC,           glGetRenderbufferParameterivEXT,            EXT_FRAMEBUFFER_OBJECT, NULL )\
-    USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC,  glGetFramebufferAttachmentParameterivEXT,   EXT_FRAMEBUFFER_OBJECT, NULL )\
+    USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC, \
+            glFogCoordfEXT,                             EXT_FOG_COORD,                  NULL) \
+    USE_GL_FUNC(PGLFNGLFOGCOORDFVEXTPROC, \
+            glFogCoordfvEXT,                            EXT_FOG_COORD,                  NULL) \
+    USE_GL_FUNC(PGLFNGLFOGCOORDDEXTPROC, \
+            glFogCoorddEXT,                             EXT_FOG_COORD,                  NULL) \
+    USE_GL_FUNC(PGLFNGLFOGCOORDDVEXTPROC, \
+            glFogCoorddvEXT,                            EXT_FOG_COORD,                  NULL) \
+    USE_GL_FUNC(PGLFNGLFOGCOORDPOINTEREXTPROC, \
+            glFogCoordPointerEXT,                       EXT_FOG_COORD,                  NULL) \
     /* GL_EXT_framebuffer_blit */ \
-    USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFEREXTPROC,                      glBlitFramebufferEXT,                       EXT_FRAMEBUFFER_BLIT,   NULL )\
+    USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFEREXTPROC, \
+            glBlitFramebufferEXT,                       EXT_FRAMEBUFFER_BLIT,           NULL) \
     /* GL_EXT_framebuffer_multisample */ \
-    USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC,         glRenderbufferStorageMultisampleEXT,        EXT_FRAMEBUFFER_MULTISAMPLE, NULL )\
+    USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, \
+            glRenderbufferStorageMultisampleEXT,        EXT_FRAMEBUFFER_MULTISAMPLE,    NULL) \
+    /* GL_EXT_framebuffer_object */ \
+    USE_GL_FUNC(PGLFNGLISRENDERBUFFEREXTPROC, \
+            glIsRenderbufferEXT,                        EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBINDRENDERBUFFEREXTPROC, \
+            glBindRenderbufferEXT,                      EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSEXTPROC, \
+            glDeleteRenderbuffersEXT,                   EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSEXTPROC, \
+            glGenRenderbuffersEXT,                      EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEEXTPROC, \
+            glRenderbufferStorageEXT,                   EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLISFRAMEBUFFEREXTPROC, \
+            glIsFramebufferEXT,                         EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFEREXTPROC, \
+            glBindFramebufferEXT,                       EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSEXTPROC, \
+            glDeleteFramebuffersEXT,                    EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSEXTPROC, \
+            glGenFramebuffersEXT,                       EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, \
+            glCheckFramebufferStatusEXT,                EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC, \
+            glFramebufferTexture1DEXT,                  EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC, \
+            glFramebufferTexture2DEXT,                  EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC, \
+            glFramebufferTexture3DEXT,                  EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, \
+            glFramebufferRenderbufferEXT,               EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGENERATEMIPMAPEXTPROC, \
+            glGenerateMipmapEXT,                        EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC, \
+            glGetRenderbufferParameterivEXT,            EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC, \
+            glGetFramebufferAttachmentParameterivEXT,   EXT_FRAMEBUFFER_OBJECT,         NULL) \
+    /* GL_EXT_gpu_program_parameters */ \
+    USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC, \
+            glProgramEnvParameters4fvEXT,               EXT_GPU_PROGRAM_PARAMETERS,     NULL) \
+    USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC, \
+            glProgramLocalParameters4fvEXT,             EXT_GPU_PROGRAM_PARAMETERS,     NULL) \
+    /* GL_EXT_gpu_shader4 */\
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI1IEXTPROC, \
+            glVertexAttribI1iEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI2IEXTPROC, \
+            glVertexAttribI2iEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI3IEXTPROC, \
+            glVertexAttribI3iEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4IEXTPROC, \
+            glVertexAttribI4iEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI1UIEXTPROC, \
+            glVertexAttribI1uiEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI2UIEXTPROC, \
+            glVertexAttribI2uiEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI3UIEXTPROC, \
+            glVertexAttribI3uiEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4UIEXTPROC, \
+            glVertexAttribI4uiEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI1IVEXTPROC, \
+            glVertexAttribI1ivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI2IVEXTPROC, \
+            glVertexAttribI2ivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI3IVEXTPROC, \
+            glVertexAttribI3ivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4IVEXTPROC, \
+            glVertexAttribI4ivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI1UIVEXTPROC, \
+            glVertexAttribI1uivEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI2UIVEXTPROC, \
+            glVertexAttribI2uivEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI3UIVEXTPROC, \
+            glVertexAttribI3uivEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4UIVEXTPROC, \
+            glVertexAttribI4uivEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4BVEXTPROC, \
+            glVertexAttribI4bvEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4SVEXTPROC, \
+            glVertexAttribI4svEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4UBVEXTPROC, \
+            glVertexAttribI4ubvEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBI4USVEXTPROC, \
+            glVertexAttribI4usvEXT,                     EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBIPOINTEREXTPROC, \
+            glVertexAttribIPointerEXT,                  EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNGETVERTEXATTRIBIIVEXTPROC, \
+            glVertexAttribIivEXT,                       EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNGETVERTEXATTRIBIUIVEXTPROC, \
+            glVertexAttribIuivEXT,                      EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM1UIEXTPROC, \
+            glUniform1uiEXT,                            EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM2UIEXTPROC, \
+            glUniform2uiEXT,                            EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM3UIEXTPROC, \
+            glUniform3uiEXT,                            EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM4UIEXTPROC, \
+            glUniform4uiEXT,                            EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM1UIVEXTPROC, \
+            glUniform1uivEXT,                           EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM2UIVEXTPROC, \
+            glUniform2uivEXT,                           EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM3UIVEXTPROC, \
+            glUniform3uivEXT,                           EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNUNIFORM4UIVEXTPROC, \
+            glUniform4uivEXT,                           EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNGETUNIFORMUIVEXTPROC, \
+            glGetUniformuivEXT,                         EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNBINDFRAGDATALOCATIONEXTPROC, \
+            glBindFragDataLocationEXT,                  EXT_GPU_SHADER4,                NULL) \
+    USE_GL_FUNC(PGLFNGETFRAGDATALOCATIONEXTPROC, \
+            glGetFragDataLocationEXT,                   EXT_GPU_SHADER4,                NULL) \
     /* GL_EXT_paletted_texture */ \
-    USE_GL_FUNC(PGLFNGLCOLORTABLEEXTPROC,                           glColorTableEXT,                            EXT_PALETTED_TEXTURE,   NULL )\
+    USE_GL_FUNC(PGLFNGLCOLORTABLEEXTPROC, \
+            glColorTableEXT,                            EXT_PALETTED_TEXTURE,           NULL) \
     /* GL_EXT_point_parameters */ \
-    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFEXTPROC,                      glPointParameterfEXT,                       EXT_POINT_PARAMETERS,   NULL )\
-    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVEXTPROC,                     glPointParameterfvEXT,                      EXT_POINT_PARAMETERS,   NULL )\
+    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFEXTPROC, \
+            glPointParameterfEXT,                       EXT_POINT_PARAMETERS,           NULL) \
+    USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVEXTPROC, \
+            glPointParameterfvEXT,                      EXT_POINT_PARAMETERS,           NULL) \
     /* GL_EXT_provoking_vertex */ \
-    USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXEXTPROC,                      glProvokingVertexEXT,                       EXT_PROVOKING_VERTEX,   NULL)\
+    USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXEXTPROC, \
+            glProvokingVertexEXT,                       EXT_PROVOKING_VERTEX,           NULL) \
     /* GL_EXT_secondary_color */ \
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBEXTPROC,                    glSecondaryColor3ubEXT,                     EXT_SECONDARY_COLOR,    NULL )\
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBVEXTPROC,                   glSecondaryColor3ubvEXT,                    EXT_SECONDARY_COLOR,    NULL )\
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FEXTPROC,                     glSecondaryColor3fEXT,                      EXT_SECONDARY_COLOR,    NULL )\
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FVEXTPROC,                    glSecondaryColor3fvEXT,                     EXT_SECONDARY_COLOR,    NULL )\
-    USE_GL_FUNC(PGLFNGLSECONDARYCOLORPOINTEREXTPROC,                glSecondaryColorPointerEXT,                 EXT_SECONDARY_COLOR,    NULL )\
-    /* GL_EXT_texture3D */ \
-    USE_GL_FUNC(PGLFNGLTEXIMAGE3DEXTPROC,                           glTexImage3DEXT,                            EXT_TEXTURE3D,          glTexImage3D)\
-    USE_GL_FUNC(PGLFNGLTEXSUBIMAGE3DEXTPROC,                        glTexSubImage3DEXT,                         EXT_TEXTURE3D,          glTexSubImage3D)\
-    /* GL_ARB_vertex_program */ \
-    USE_GL_FUNC(PGLFNGENPROGRAMSARBPROC,                            glGenProgramsARB,                           ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNBINDPROGRAMARBPROC,                            glBindProgramARB,                           ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC,                          glProgramStringARB,                         ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC,                         glDeleteProgramsARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC,                 glProgramEnvParameter4fvARB,                ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETER4FVARBPROC,               glProgramLocalParameter4fvARB,                ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC,                    glVertexAttribPointerARB,                   ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC,                glEnableVertexAttribArrayARB,               ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC,               glDisableVertexAttribArrayARB,              ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1DARBPROC,                         glVertexAttrib1dARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1DVARBPROC,                        glVertexAttrib1dvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1FARBPROC,                         glVertexAttrib1fARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1FVARBPROC,                        glVertexAttrib1fvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1SARBPROC,                         glVertexAttrib1sARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1SVARBPROC,                        glVertexAttrib1svARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2DARBPROC,                         glVertexAttrib2dARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2DVARBPROC,                        glVertexAttrib2dvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2FARBPROC,                         glVertexAttrib2fARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2FVARBPROC,                        glVertexAttrib2fvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2SARBPROC,                         glVertexAttrib2sARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2SVARBPROC,                        glVertexAttrib2svARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3DARBPROC,                         glVertexAttrib3dARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3DVARBPROC,                        glVertexAttrib3dvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3FARBPROC,                         glVertexAttrib3fARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3FVARBPROC,                        glVertexAttrib3fvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3SARBPROC,                         glVertexAttrib3sARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3SVARBPROC,                        glVertexAttrib3svARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NBVARBPROC,                       glVertexAttrib4NbvARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NIVARBPROC,                       glVertexAttrib4NivARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NSVARBPROC,                       glVertexAttrib4NsvARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBARBPROC,                       glVertexAttrib4NubARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBVARBPROC,                      glVertexAttrib4NubvARB,                     ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUIVARBPROC,                      glVertexAttrib4NuivARB,                     ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4NUSVARBPROC,                      glVertexAttrib4NusvARB,                     ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4BVARBPROC,                        glVertexAttrib4bvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4DARBPROC,                         glVertexAttrib4dARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4DVARBPROC,                        glVertexAttrib4dvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4FARBPROC,                         glVertexAttrib4fARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4FVARBPROC,                        glVertexAttrib4fvARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4IVARBPROC,                        glVertexAttrib4ivARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4SARBPROC,                         glVertexAttrib4sARB,                        ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4SVARBPROC,                        glVertexAttrib4svARB,                       ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4UBVARBPROC,                       glVertexAttrib4ubvARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4UIVARBPROC,                       glVertexAttrib4uivARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4USVARBPROC,                       glVertexAttrib4usvARB,                      ARB_VERTEX_PROGRAM,     NULL )\
-    USE_GL_FUNC(PGLFNGETPROGRAMIVARBPROC,                           glGetProgramivARB,                          ARB_VERTEX_PROGRAM,     NULL )\
-    /* GL_ARB_shader_objects */ \
-    USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC,           glGetObjectParameterivARB,                  ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC,           glGetObjectParameterfvARB,                  ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC,             glGetUniformLocationARB,                    ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETACTIVEUNIFORMARBPROC,               glGetActiveUniformARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC,                      glUniform1iARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IARBPROC,                      glUniform2iARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IARBPROC,                      glUniform3iARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC,                      glUniform4iARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC,                      glUniform1fARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC,                      glUniform2fARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FARBPROC,                      glUniform3fARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FARBPROC,                      glUniform4fARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FVARBPROC,                     glUniform1fvARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FVARBPROC,                     glUniform2fvARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FVARBPROC,                     glUniform3fvARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FVARBPROC,                     glUniform4fvARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IVARBPROC,                     glUniform1ivARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IVARBPROC,                     glUniform2ivARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IVARBPROC,                     glUniform3ivARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IVARBPROC,                     glUniform4ivARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC,               glUniformMatrix2fvARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC,               glUniformMatrix3fvARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC,               glUniformMatrix4fvARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMFVARBPROC,                   glGetUniformfvARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMIVARBPROC,                   glGetUniformivARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETINFOLOGARBPROC,                     glGetInfoLogARB,                            ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC,               glUseProgramObjectARB,                      ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLCREATESHADEROBJECTARBPROC,             glCreateShaderObjectARB,                    ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLSHADERSOURCEARBPROC,                   glShaderSourceARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLCOMPILESHADERARBPROC,                  glCompileShaderARB,                         ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC,            glCreateProgramObjectARB,                   ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLATTACHOBJECTARBPROC,                   glAttachObjectARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLLINKPROGRAMARBPROC,                    glLinkProgramARB,                           ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLDETACHOBJECTARBPROC,                   glDetachObjectARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLDELETEOBJECTARBPROC,                   glDeleteObjectARB,                          ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLVALIDATEPROGRAMARBPROC,                glValidateProgramARB,                       ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC,             glGetAttachedObjectsARB,                    ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETHANDLEARBPROC,                      glGetHandleARB,                             ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETSHADERSOURCEARBPROC,                glGetShaderSourceARB,                       ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC,             glBindAttribLocationARB,                    ARB_SHADER_OBJECTS,     NULL )\
-    USE_GL_FUNC(WINED3D_PFNGLGETATTRIBLOCATIONARBPROC,              glGetAttribLocationARB,                     ARB_SHADER_OBJECTS,     NULL )\
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBEXTPROC, \
+            glSecondaryColor3ubEXT,                     EXT_SECONDARY_COLOR,            NULL) \
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBVEXTPROC, \
+            glSecondaryColor3ubvEXT,                    EXT_SECONDARY_COLOR,            NULL) \
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FEXTPROC, \
+            glSecondaryColor3fEXT,                      EXT_SECONDARY_COLOR,            NULL) \
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FVEXTPROC, \
+            glSecondaryColor3fvEXT,                     EXT_SECONDARY_COLOR,            NULL) \
+    USE_GL_FUNC(PGLFNGLSECONDARYCOLORPOINTEREXTPROC, \
+            glSecondaryColorPointerEXT,                 EXT_SECONDARY_COLOR,            NULL) \
     /* GL_EXT_stencil_two_side */ \
-    USE_GL_FUNC(PGLFNACTIVESTENCILFACEEXTPROC,                      glActiveStencilFaceEXT,                     EXT_STENCIL_TWO_SIDE,   NULL )\
-    /* GL_ATI_separate_stencil */ \
-    USE_GL_FUNC(PGLFNSTENCILOPSEPARATEATIPROC,                      glStencilOpSeparateATI,                     ATI_SEPARATE_STENCIL,   NULL )\
-    USE_GL_FUNC(PGLFNSTENCILFUNCSEPARATEATIPROC,                    glStencilFuncSeparateATI,                   ATI_SEPARATE_STENCIL,   NULL )\
+    USE_GL_FUNC(PGLFNACTIVESTENCILFACEEXTPROC, \
+            glActiveStencilFaceEXT,                     EXT_STENCIL_TWO_SIDE,           NULL) \
+    /* GL_EXT_texture3D */ \
+    USE_GL_FUNC(PGLFNGLTEXIMAGE3DEXTPROC, \
+            glTexImage3DEXT,                            EXT_TEXTURE3D,                  glTexImage3D) \
+    USE_GL_FUNC(PGLFNGLTEXSUBIMAGE3DEXTPROC, \
+            glTexSubImage3DEXT,                         EXT_TEXTURE3D,                  glTexSubImage3D) \
+    /* GL_NV_fence */ \
+    USE_GL_FUNC(PGLFNGENFENCESNVPROC, \
+            glGenFencesNV,                              NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNDELETEFENCESNVPROC, \
+            glDeleteFencesNV,                           NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNSETFENCENVPROC,    \
+            glSetFenceNV,                               NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNTESTFENCENVPROC, \
+            glTestFenceNV,                              NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNFINISHFENCENVPROC, \
+            glFinishFenceNV,                            NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNISFENCENVPROC, \
+            glIsFenceNV,                                NV_FENCE,                       NULL) \
+    USE_GL_FUNC(PGLFNGETFENCEIVNVPROC, \
+            glGetFenceivNV,                             NV_FENCE,                       NULL) \
     /* GL_NV_half_float */ \
-    USE_GL_FUNC(PGLFNVERTEX2HNVPROC,                                glVertex2hNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX2HVNVPROC,                               glVertex2hvNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX3HNVPROC,                                glVertex3hNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX3HVNVPROC,                               glVertex3hvNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX4HNVPROC,                                glVertex4hNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEX4HVNVPROC,                               glVertex4hvNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNNORMAL3HNVPROC,                                glNormal3hNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNNORMAL3HVNVPROC,                               glNormal3hvNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNCOLOR3HNVPROC,                                 glColor3hNV,                                NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNCOLOR3HVNVPROC,                                glColor3hvNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNCOLOR4HNVPROC,                                 glColor4hNV,                                NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNCOLOR4HVNVPROC,                                glColor4hvNV,                               NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD1HNVPROC,                              glTexCoord1hNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD1HVNVPROC,                             glTexCoord1hvNV,                            NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD2HNVPROC,                              glTexCoord2hNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD2HVNVPROC,                             glTexCoord2hvNV,                            NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD3HNVPROC,                              glTexCoord3hNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD3HVNVPROC,                             glTexCoord3hvNV,                            NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD4HNVPROC,                              glTexCoord4hNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNTEXCOORD4HVNVPROC,                             glTexCoord4hvNV,                            NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD1HNVPROC,                         glMultiTexCoord1hNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD1HVNVPROC,                        glMultiTexCoord1hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD2HNVPROC,                         glMultiTexCoord2hNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD2HVNVPROC,                        glMultiTexCoord2hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD3HNVPROC,                         glMultiTexCoord3hNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD3HVNVPROC,                        glMultiTexCoord3hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD4HNVPROC,                         glMultiTexCoord4hNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNMULTITEXCOORD4HVNVPROC,                        glMultiTexCoord4hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNFOGCOORDHNVPROC,                               glFogCoordhNV,                              NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNFOGCOORDHVNVPROC,                              glFogCoordhvNV,                             NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNSECONDARYCOLOR3HNVPROC,                        glSecondaryColor3hNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNSECONDARYCOLOR3HVNVPROC,                       glSecondaryColor3hvNV,                      NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXWEIGHTHNVPROC,                           glVertexWeighthNV,                          NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXWEIGHTHVNVPROC,                          glVertexWeighthvNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1HNVPROC,                          glVertexAttrib1hNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB1HVNVPROC,                         glVertexAttrib1hvNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2HNVPROC,                          glVertexAttrib2hNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB2HVNVPROC,                         glVertexAttrib2hvNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3HNVPROC,                          glVertexAttrib3hNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB3HVNVPROC,                         glVertexAttrib3hvNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4HNVPROC,                          glVertexAttrib4hNV,                         NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIB4HVNVPROC,                         glVertexAttrib4hvNV,                        NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBS1HVNVPROC,                        glVertexAttribs1hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBS2HVNVPROC,                        glVertexAttribs2hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBS3HVNVPROC,                        glVertexAttribs3hvNV,                       NV_HALF_FLOAT,          NULL )\
-    USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC,                        glVertexAttribs4hvNV,                       NV_HALF_FLOAT,          NULL )\
+    USE_GL_FUNC(PGLFNVERTEX2HNVPROC, \
+            glVertex2hNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX2HVNVPROC, \
+            glVertex2hvNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX3HNVPROC, \
+            glVertex3hNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX3HVNVPROC, \
+            glVertex3hvNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX4HNVPROC, \
+            glVertex4hNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEX4HVNVPROC, \
+            glVertex4hvNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNNORMAL3HNVPROC, \
+            glNormal3hNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNNORMAL3HVNVPROC, \
+            glNormal3hvNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNCOLOR3HNVPROC, \
+            glColor3hNV,                                NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNCOLOR3HVNVPROC, \
+            glColor3hvNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNCOLOR4HNVPROC, \
+            glColor4hNV,                                NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNCOLOR4HVNVPROC, \
+            glColor4hvNV,                               NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD1HNVPROC, \
+            glTexCoord1hNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD1HVNVPROC, \
+            glTexCoord1hvNV,                            NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD2HNVPROC, \
+            glTexCoord2hNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD2HVNVPROC, \
+            glTexCoord2hvNV,                            NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD3HNVPROC, \
+            glTexCoord3hNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD3HVNVPROC, \
+            glTexCoord3hvNV,                            NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD4HNVPROC, \
+            glTexCoord4hNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNTEXCOORD4HVNVPROC, \
+            glTexCoord4hvNV,                            NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD1HNVPROC, \
+            glMultiTexCoord1hNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD1HVNVPROC, \
+            glMultiTexCoord1hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD2HNVPROC, \
+            glMultiTexCoord2hNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD2HVNVPROC, \
+            glMultiTexCoord2hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD3HNVPROC, \
+            glMultiTexCoord3hNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD3HVNVPROC, \
+            glMultiTexCoord3hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD4HNVPROC, \
+            glMultiTexCoord4hNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNMULTITEXCOORD4HVNVPROC, \
+            glMultiTexCoord4hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNFOGCOORDHNVPROC, \
+            glFogCoordhNV,                              NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNFOGCOORDHVNVPROC, \
+            glFogCoordhvNV,                             NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNSECONDARYCOLOR3HNVPROC, \
+            glSecondaryColor3hNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNSECONDARYCOLOR3HVNVPROC, \
+            glSecondaryColor3hvNV,                      NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXWEIGHTHNVPROC, \
+            glVertexWeighthNV,                          NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXWEIGHTHVNVPROC, \
+            glVertexWeighthvNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1HNVPROC, \
+            glVertexAttrib1hNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB1HVNVPROC, \
+            glVertexAttrib1hvNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2HNVPROC, \
+            glVertexAttrib2hNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB2HVNVPROC, \
+            glVertexAttrib2hvNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3HNVPROC, \
+            glVertexAttrib3hNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB3HVNVPROC, \
+            glVertexAttrib3hvNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4HNVPROC, \
+            glVertexAttrib4hNV,                         NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIB4HVNVPROC, \
+            glVertexAttrib4hvNV,                        NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBS1HVNVPROC, \
+            glVertexAttribs1hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBS2HVNVPROC, \
+            glVertexAttribs2hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBS3HVNVPROC, \
+            glVertexAttribs3hvNV,                       NV_HALF_FLOAT,                  NULL) \
+    USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC, \
+            glVertexAttribs4hvNV,                       NV_HALF_FLOAT,                  NULL) \
     /* GL_NV_register_combiners */ \
-    USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC,                           glCombinerInputNV,                          NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINEROUTPUTNVPROC,                          glCombinerOutputNV,                         NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINERPARAMETERFNVPROC,                      glCombinerParameterfNV,                     NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINERPARAMETERFVNVPROC,                     glCombinerParameterfvNV,                    NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINERPARAMETERINVPROC,                      glCombinerParameteriNV,                     NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNCOMBINERPARAMETERIVNVPROC,                     glCombinerParameterivNV,                    NV_REGISTER_COMBINERS,  NULL )\
-    USE_GL_FUNC(PGLFNFINALCOMBINERINPUTNVPROC,                      glFinalCombinerInputNV,                     NV_REGISTER_COMBINERS,  NULL )\
-    /* GL_NV_fence */ \
-    USE_GL_FUNC(PGLFNGENFENCESNVPROC,                               glGenFencesNV,                              NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNDELETEFENCESNVPROC,                            glDeleteFencesNV,                           NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNSETFENCENVPROC,                                glSetFenceNV,                               NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNTESTFENCENVPROC,                               glTestFenceNV,                              NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNFINISHFENCENVPROC,                             glFinishFenceNV,                            NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNISFENCENVPROC,                                 glIsFenceNV,                                NV_FENCE,               NULL )\
-    USE_GL_FUNC(PGLFNGETFENCEIVNVPROC,                              glGetFenceivNV,                             NV_FENCE,               NULL )\
-    /* GL_APPLE_fence */ \
-    USE_GL_FUNC(PGLFNGENFENCESAPPLEPROC,                            glGenFencesAPPLE,                           APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNDELETEFENCESAPPLEPROC,                         glDeleteFencesAPPLE,                        APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNSETFENCEAPPLEPROC,                             glSetFenceAPPLE,                            APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNTESTFENCEAPPLEPROC,                            glTestFenceAPPLE,                           APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNFINISHFENCEAPPLEPROC,                          glFinishFenceAPPLE,                         APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNISFENCEAPPLEPROC,                              glIsFenceAPPLE,                             APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNTESTOBJECTAPPLEPROC,                           glTestObjectAPPLE,                          APPLE_FENCE,            NULL )\
-    USE_GL_FUNC(PGLFNFINISHOBJECTAPPLEPROC,                         glFinishObjectAPPLE,                        APPLE_FENCE,            NULL )\
+    USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC, \
+            glCombinerInputNV,                          NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINEROUTPUTNVPROC, \
+            glCombinerOutputNV,                         NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINERPARAMETERFNVPROC, \
+            glCombinerParameterfNV,                     NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINERPARAMETERFVNVPROC, \
+            glCombinerParameterfvNV,                    NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINERPARAMETERINVPROC, \
+            glCombinerParameteriNV,                     NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNCOMBINERPARAMETERIVNVPROC, \
+            glCombinerParameterivNV,                    NV_REGISTER_COMBINERS,          NULL) \
+    USE_GL_FUNC(PGLFNFINALCOMBINERINPUTNVPROC, \
+            glFinalCombinerInputNV,                     NV_REGISTER_COMBINERS,          NULL) \
     /* GLX_SGI_video_sync */ \
-    USE_GL_FUNC(PGLXFNGETVIDEOSYNCSGIPROC,                          glXGetVideoSyncSGI,                         SGI_VIDEO_SYNC,         NULL )\
-    USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC,                         glXWaitVideoSyncSGI,                        SGI_VIDEO_SYNC,         NULL )\
-    /* GL_APPLE_flush_render */ \
-    USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC,                          glFlushRenderAPPLE,                         APPLE_FLUSH_RENDER,     NULL )\
-    USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC,                         glFinishRenderAPPLE,                        APPLE_FLUSH_RENDER,     NULL )\
-    /* GL_EXT_gpu_program_parameters */ \
-    USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC,                glProgramEnvParameters4fvEXT,            EXT_GPU_PROGRAM_PARAMETERS,NULL )\
-    USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC,              glProgramLocalParameters4fvEXT,          EXT_GPU_PROGRAM_PARAMETERS,NULL )\
-    /* GL_ATI_fragment_shader */ \
-    USE_GL_FUNC(PGLFNGENFRAGMENTSHADERSATI,                         glGenFragmentShadersATI,                    ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNBINDFRAGMENTSHADERATI,                         glBindFragmentShaderATI,                    ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNDELETEFRAGMENTSHADERATI,                       glDeleteFragmentShaderATI,                  ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNBEGINFRAGMENTSHADERATI,                        glBeginFragmentShaderATI,                   ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNENDFRAGMENTSHADERATI,                          glEndFragmentShaderATI,                     ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNPASSTEXCOORDATI,                               glPassTexCoordATI,                          ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNSAMPLEMAPATI,                                  glSampleMapATI,                             ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP1ATI,                           glColorFragmentOp1ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP2ATI,                           glColorFragmentOp2ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNCOLORFRAGMENTOP3ATI,                           glColorFragmentOp3ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP1ATI,                           glAlphaFragmentOp1ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP2ATI,                           glAlphaFragmentOp2ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNALPHAFRAGMENTOP3ATI,                           glAlphaFragmentOp3ATI,                      ATI_FRAGMENT_SHADER,    NULL )\
-    USE_GL_FUNC(PGLFNSETFRAGMENTSHADERCONSTANTATI,                  glSetFragmentShaderConstantATI,             ATI_FRAGMENT_SHADER,    NULL )\
-    /* GL_APPLE_flush_buffer_range */ \
-    USE_GL_FUNC(PGLFNBUFFERPARAMETERIAPPLE,                         glBufferParameteriAPPLE,                    APPLE_FLUSH_BUFFER_RANGE,NULL)\
-    USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE,                   glFlushMappedBufferRangeAPPLE,              APPLE_FLUSH_BUFFER_RANGE,NULL)
-
-
-/****************************************************
- * OpenGL WGL defines and functions pointer
- ****************************************************/
-
-/* WGL_ARB_extensions_string */
-typedef const char * (WINAPI * WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
-/* WGL_ARB_multisample */
-#ifndef WGL_ARB_multisample
-#define WGL_SAMPLE_BUFFERS_ARB         0x2041
-#define WGL_SAMPLES_ARB                0x2042
-#endif
-/* WGL_ARB_pixel_format */
-#ifndef WGL_ARB_pixel_format
-#define WGL_ARB_pixel_format 1
-#define WGL_NUMBER_PIXEL_FORMATS_ARB   0x2000
-#define WGL_DRAW_TO_WINDOW_ARB         0x2001
-#define WGL_DRAW_TO_BITMAP_ARB         0x2002
-#define WGL_ACCELERATION_ARB           0x2003
-#define WGL_NEED_PALETTE_ARB           0x2004
-#define WGL_NEED_SYSTEM_PALETTE_ARB    0x2005
-#define WGL_SWAP_LAYER_BUFFERS_ARB     0x2006
-#define WGL_SWAP_METHOD_ARB            0x2007
-#define WGL_NUMBER_OVERLAYS_ARB        0x2008
-#define WGL_NUMBER_UNDERLAYS_ARB       0x2009
-#define WGL_TRANSPARENT_ARB            0x200A
-#define WGL_TRANSPARENT_RED_VALUE_ARB  0x2037
-#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
-#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
-#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
-#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
-#define WGL_SHARE_DEPTH_ARB            0x200C
-#define WGL_SHARE_STENCIL_ARB          0x200D
-#define WGL_SHARE_ACCUM_ARB            0x200E
-#define WGL_SUPPORT_GDI_ARB            0x200F
-#define WGL_SUPPORT_OPENGL_ARB         0x2010
-#define WGL_DOUBLE_BUFFER_ARB          0x2011
-#define WGL_STEREO_ARB                 0x2012
-#define WGL_PIXEL_TYPE_ARB             0x2013
-#define WGL_COLOR_BITS_ARB             0x2014
-#define WGL_RED_BITS_ARB               0x2015
-#define WGL_RED_SHIFT_ARB              0x2016
-#define WGL_GREEN_BITS_ARB             0x2017
-#define WGL_GREEN_SHIFT_ARB            0x2018
-#define WGL_BLUE_BITS_ARB              0x2019
-#define WGL_BLUE_SHIFT_ARB             0x201A
-#define WGL_ALPHA_BITS_ARB             0x201B
-#define WGL_ALPHA_SHIFT_ARB            0x201C
-#define WGL_ACCUM_BITS_ARB             0x201D
-#define WGL_ACCUM_RED_BITS_ARB         0x201E
-#define WGL_ACCUM_GREEN_BITS_ARB       0x201F
-#define WGL_ACCUM_BLUE_BITS_ARB        0x2020
-#define WGL_ACCUM_ALPHA_BITS_ARB       0x2021
-#define WGL_DEPTH_BITS_ARB             0x2022
-#define WGL_STENCIL_BITS_ARB           0x2023
-#define WGL_AUX_BUFFERS_ARB            0x2024
-#define WGL_NO_ACCELERATION_ARB        0x2025
-#define WGL_GENERIC_ACCELERATION_ARB   0x2026
-#define WGL_FULL_ACCELERATION_ARB      0x2027
-#define WGL_SWAP_EXCHANGE_ARB          0x2028
-#define WGL_SWAP_COPY_ARB              0x2029
-#define WGL_SWAP_UNDEFINED_ARB         0x202A
-#define WGL_TYPE_RGBA_ARB              0x202B
-#define WGL_TYPE_COLORINDEX_ARB        0x202C
-#endif
-typedef BOOL (WINAPI * WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
-typedef BOOL (WINAPI * WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
-typedef BOOL (WINAPI * WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
-/* WGL_ARB_make_current_read */
-typedef BOOL (WINAPI * WINED3D_PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
-typedef HDC (WINAPI * WINED3D_PFNWGLGETCURRENTREADDCARBPROC) (void);
-/* WGL_ARB_pbuffer */
-#ifndef WGL_ARB_pbuffer
-#define WGL_ARB_pbuffer 1
-#define WGL_DRAW_TO_PBUFFER_ARB        0x202D
-#define WGL_MAX_PBUFFER_PIXELS_ARB     0x202E
-#define WGL_MAX_PBUFFER_WIDTH_ARB      0x202F
-#define WGL_MAX_PBUFFER_HEIGHT_ARB     0x2030
-#define WGL_PBUFFER_LARGEST_ARB        0x2033
-#define WGL_PBUFFER_WIDTH_ARB          0x2034
-#define WGL_PBUFFER_HEIGHT_ARB         0x2035
-#define WGL_PBUFFER_LOST_ARB           0x2036
-#endif
-DECLARE_HANDLE(HPBUFFERARB);
-typedef HPBUFFERARB (WINAPI * WINED3D_PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
-typedef HDC (WINAPI * WINED3D_PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
-typedef int (WINAPI * WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);
-typedef BOOL (WINAPI * WINED3D_PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
-typedef BOOL (WINAPI * WINED3D_PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
-#ifndef WGL_ARB_pixel_format_float
-#define WGL_ARB_pixel_format_float 1
-#define WGL_TYPE_RGBA_FLOAT_ARB        0x21A0
-#endif
-/* WGL_WINE_pixel_format_passthrough */
-typedef BOOL (WINAPI * WINED3D_PFNWGLSETPIXELFORMATWINE) (HDC hdc, int iPixelFormat, const PIXELFORMATDESCRIPTOR* ppfd);
+    USE_GL_FUNC(PGLXFNGETVIDEOSYNCSGIPROC, \
+            glXGetVideoSyncSGI,                         SGI_VIDEO_SYNC,                 NULL) \
+    USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC, \
+            glXWaitVideoSyncSGI,                        SGI_VIDEO_SYNC,                 NULL)
 
 #define WGL_EXT_FUNCS_GEN \
-    USE_GL_FUNC(WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC, wglGetExtensionsStringARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC, wglGetPixelFormatAttribivARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC, wglGetPixelFormatAttribfvARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLMAKECONTEXTCURRENTARBPROC, wglMakeContextCurrentARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLGETCURRENTREADDCARBPROC, wglGetCurrentReadDCARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC, wglCreatePbufferARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC, wglGetPbufferDCARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC, wglReleasePbufferDCARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC, wglDestroyPbufferARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC, wglQueryPbufferARB, 0, NULL) \
-    USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL)
-
-
-/****************************************************
- * Structures
- ****************************************************/
-
-struct wined3d_fbo_ops
-{
-    PGLFNGLISRENDERBUFFERPROC                       glIsRenderbuffer;
-    PGLFNGLBINDRENDERBUFFERPROC                     glBindRenderbuffer;
-    PGLFNGLDELETERENDERBUFFERSPROC                  glDeleteRenderbuffers;
-    PGLFNGLGENRENDERBUFFERSPROC                     glGenRenderbuffers;
-    PGLFNGLRENDERBUFFERSTORAGEPROC                  glRenderbufferStorage;
-    PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC         glRenderbufferStorageMultisample;
-    PGLFNGLGETRENDERBUFFERPARAMETERIVPROC           glGetRenderbufferParameteriv;
-    PGLFNGLISFRAMEBUFFERPROC                        glIsFramebuffer;
-    PGLFNGLBINDFRAMEBUFFERPROC                      glBindFramebuffer;
-    PGLFNGLDELETEFRAMEBUFFERSPROC                   glDeleteFramebuffers;
-    PGLFNGLGENFRAMEBUFFERSPROC                      glGenFramebuffers;
-    PGLFNGLCHECKFRAMEBUFFERSTATUSPROC               glCheckFramebufferStatus;
-    PGLFNGLFRAMEBUFFERTEXTURE1DPROC                 glFramebufferTexture1D;
-    PGLFNGLFRAMEBUFFERTEXTURE2DPROC                 glFramebufferTexture2D;
-    PGLFNGLFRAMEBUFFERTEXTURE3DPROC                 glFramebufferTexture3D;
-    PGLFNGLFRAMEBUFFERRENDERBUFFERPROC              glFramebufferRenderbuffer;
-    PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC  glGetFramebufferAttachmentParameteriv;
-    PGLFNGLBLITFRAMEBUFFERPROC                      glBlitFramebuffer;
-    PGLFNGLGENERATEMIPMAPPROC                       glGenerateMipmap;
-};
-
-struct wined3d_gl_limits
-{
-    UINT buffers;
-    UINT lights;
-    UINT textures;
-    UINT texture_stages;
-    UINT fragment_samplers;
-    UINT vertex_samplers;
-    UINT combined_samplers;
-    UINT sampler_stages;
-    UINT clipplanes;
-    UINT texture_size;
-    UINT texture3d_size;
-    float pointsize_max;
-    float pointsize_min;
-    UINT point_sprite_units;
-    UINT blends;
-    UINT anisotropy;
-    float shininess;
-
-    UINT glsl_varyings;
-    UINT glsl_vs_float_constants;
-    UINT glsl_ps_float_constants;
-
-    UINT arb_vs_float_constants;
-    UINT arb_vs_native_constants;
-    UINT arb_vs_instructions;
-    UINT arb_vs_temps;
-    UINT arb_ps_float_constants;
-    UINT arb_ps_local_constants;
-    UINT arb_ps_native_constants;
-    UINT arb_ps_instructions;
-    UINT arb_ps_temps;
-};
-
-#define USE_GL_FUNC(type, pfn, ext, replace) type pfn;
-
-struct wined3d_gl_info
-{
-    UINT vidmem;
-    struct wined3d_gl_limits limits;
-    DWORD reserved_glsl_constants;
-    DWORD quirks;
-    BOOL supported[WINED3D_GL_EXT_COUNT];
-    GLint wrap_lookup[WINED3DTADDRESS_MIRRORONCE - WINED3DTADDRESS_WRAP + 1];
-
-    struct wined3d_fbo_ops fbo_ops;
-    /* GL function pointers */
-    GL_EXT_FUNCS_GEN
-    /* WGL function pointers */
-    WGL_EXT_FUNCS_GEN
-
-    struct GlPixelFormatDesc *gl_formats;
-};
-
-#undef USE_GL_FUNC
+    USE_GL_FUNC(WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC,       wglGetExtensionsStringARB,      0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC,    wglGetPixelFormatAttribivARB,   0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC,    wglGetPixelFormatAttribfvARB,   0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC,         wglChoosePixelFormatARB,        0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC,             wglCreatePbufferARB,            0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC,              wglGetPbufferDCARB,             0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC,          wglReleasePbufferDCARB,         0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC,            wglDestroyPbufferARB,           0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC,              wglQueryPbufferARB,             0, NULL) \
+    USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE,               wglSetPixelFormatWINE,          0, NULL)
 
 #endif /* __WINE_WINED3D_GL */
index de0bcdc..1d5cd97 100644 (file)
@@ -61,15 +61,16 @@ enum fixup_channel_source
     CHANNEL_SOURCE_Y = 3,
     CHANNEL_SOURCE_Z = 4,
     CHANNEL_SOURCE_W = 5,
-    CHANNEL_SOURCE_YUV0 = 6,
-    CHANNEL_SOURCE_YUV1 = 7,
+    CHANNEL_SOURCE_COMPLEX0 = 6,
+    CHANNEL_SOURCE_COMPLEX1 = 7,
 };
 
-enum yuv_fixup
+enum complex_fixup
 {
-    YUV_FIXUP_YUY2 = 0,
-    YUV_FIXUP_UYVY = 1,
-    YUV_FIXUP_YV12 = 2,
+    COMPLEX_FIXUP_YUY2 = 0,
+    COMPLEX_FIXUP_UYVY = 1,
+    COMPLEX_FIXUP_YV12 = 2,
+    COMPLEX_FIXUP_P8   = 3,
 };
 
 #include <pshpack2.h>
@@ -103,14 +104,14 @@ static inline struct color_fixup_desc create_color_fixup_desc(
     return fixup;
 }
 
-static inline struct color_fixup_desc create_yuv_fixup_desc(enum yuv_fixup yuv_fixup)
+static inline struct color_fixup_desc create_complex_fixup_desc(enum complex_fixup complex_fixup)
 {
     struct color_fixup_desc fixup =
     {
-        0, yuv_fixup & (1 << 0) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
-        0, yuv_fixup & (1 << 1) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
-        0, yuv_fixup & (1 << 2) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
-        0, yuv_fixup & (1 << 3) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0,
+        0, complex_fixup & (1 << 0) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
+        0, complex_fixup & (1 << 1) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
+        0, complex_fixup & (1 << 2) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
+        0, complex_fixup & (1 << 3) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0,
     };
     return fixup;
 }
@@ -120,19 +121,19 @@ static inline BOOL is_identity_fixup(struct color_fixup_desc fixup)
     return !memcmp(&fixup, &COLOR_FIXUP_IDENTITY, sizeof(fixup));
 }
 
-static inline BOOL is_yuv_fixup(struct color_fixup_desc fixup)
+static inline BOOL is_complex_fixup(struct color_fixup_desc fixup)
 {
-    return fixup.x_source == CHANNEL_SOURCE_YUV0 || fixup.x_source == CHANNEL_SOURCE_YUV1;
+    return fixup.x_source == CHANNEL_SOURCE_COMPLEX0 || fixup.x_source == CHANNEL_SOURCE_COMPLEX1;
 }
 
-static inline enum yuv_fixup get_yuv_fixup(struct color_fixup_desc fixup)
+static inline enum complex_fixup get_complex_fixup(struct color_fixup_desc fixup)
 {
-    enum yuv_fixup yuv_fixup = 0;
-    if (fixup.x_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 0);
-    if (fixup.y_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 1);
-    if (fixup.z_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 2);
-    if (fixup.w_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 3);
-    return yuv_fixup;
+    enum complex_fixup complex_fixup = 0;
+    if (fixup.x_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 0);
+    if (fixup.y_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 1);
+    if (fixup.z_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 2);
+    if (fixup.w_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 3);
+    return complex_fixup;
 }
 
 void *wined3d_rb_alloc(size_t size) DECLSPEC_HIDDEN;
@@ -410,6 +411,7 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER
     WINED3DSIH_CMP,
     WINED3DSIH_CND,
     WINED3DSIH_CRS,
+    WINED3DSIH_CUT,
     WINED3DSIH_DCL,
     WINED3DSIH_DEF,
     WINED3DSIH_DEFB,
@@ -421,20 +423,24 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER
     WINED3DSIH_DSX,
     WINED3DSIH_DSY,
     WINED3DSIH_ELSE,
+    WINED3DSIH_EMIT,
     WINED3DSIH_ENDIF,
     WINED3DSIH_ENDLOOP,
     WINED3DSIH_ENDREP,
     WINED3DSIH_EXP,
     WINED3DSIH_EXPP,
     WINED3DSIH_FRC,
+    WINED3DSIH_IADD,
     WINED3DSIH_IF,
     WINED3DSIH_IFC,
+    WINED3DSIH_IGE,
     WINED3DSIH_LABEL,
     WINED3DSIH_LIT,
     WINED3DSIH_LOG,
     WINED3DSIH_LOGP,
     WINED3DSIH_LOOP,
     WINED3DSIH_LRP,
+    WINED3DSIH_LT,
     WINED3DSIH_M3x2,
     WINED3DSIH_M3x3,
     WINED3DSIH_M3x4,
@@ -544,6 +550,7 @@ typedef struct shader_reg_maps
 struct wined3d_shader_context
 {
     IWineD3DBaseShader *shader;
+    const struct wined3d_gl_info *gl_info;
     const struct shader_reg_maps *reg_maps;
     struct wined3d_shader_buffer *buffer;
     void *backend_data;
@@ -619,7 +626,7 @@ struct wined3d_shader_frontend
     void (*shader_read_dst_param)(void *data, const DWORD **ptr, struct wined3d_shader_dst_param *dst_param,
             struct wined3d_shader_src_param *dst_rel_addr);
     void (*shader_read_semantic)(const DWORD **ptr, struct wined3d_shader_semantic *semantic);
-    void (*shader_read_comment)(const DWORD **ptr, const char **comment);
+    void (*shader_read_comment)(const DWORD **ptr, const char **comment, UINT *comment_size);
     BOOL (*shader_is_end)(void *data, const DWORD **ptr);
 };
 
@@ -714,7 +721,7 @@ typedef struct {
     HRESULT (*shader_alloc_private)(IWineD3DDevice *iface);
     void (*shader_free_private)(IWineD3DDevice *iface);
     BOOL (*shader_dirtifyable_constants)(IWineD3DDevice *iface);
-    void (*shader_get_caps)(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct shader_caps *caps);
+    void (*shader_get_caps)(const struct wined3d_gl_info *gl_info, struct shader_caps *caps);
     BOOL (*shader_color_fixup_supported)(struct color_fixup_desc fixup);
     void (*shader_add_instruction_modifiers)(const struct wined3d_shader_instruction *ins);
 } shader_backend_t;
@@ -988,8 +995,10 @@ extern glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC
 #define STATE_IS_CLIPPLANE(a) ((a) >= STATE_CLIPPLANE(0) && (a) <= STATE_CLIPPLANE(MAX_CLIPPLANES - 1))
 
 #define STATE_MATERIAL (STATE_CLIPPLANE(MAX_CLIPPLANES))
+#define STATE_IS_MATERIAL(a) ((a) == STATE_MATERIAL)
 
 #define STATE_FRONTFACE (STATE_MATERIAL + 1)
+#define STATE_IS_FRONTFACE(a) ((a) == STATE_FRONTFACE)
 
 #define STATE_HIGHEST (STATE_FRONTFACE)
 
@@ -1008,13 +1017,28 @@ struct wined3d_occlusion_query
     struct wined3d_context *context;
 };
 
+union wined3d_gl_query_object
+{
+    GLuint id;
+    GLsync sync;
+};
+
 struct wined3d_event_query
 {
     struct list entry;
-    GLuint id;
+    union wined3d_gl_query_object object;
     struct wined3d_context *context;
 };
 
+enum wined3d_event_query_result
+{
+    WINED3D_EVENT_QUERY_OK,
+    WINED3D_EVENT_QUERY_WAITING,
+    WINED3D_EVENT_QUERY_NOT_STARTED,
+    WINED3D_EVENT_QUERY_WRONG_THREAD,
+    WINED3D_EVENT_QUERY_ERROR
+};
+
 struct wined3d_context
 {
     const struct wined3d_gl_info *gl_info;
@@ -1084,7 +1108,7 @@ struct wined3d_context
     UINT free_occlusion_query_count;
     struct list occlusion_queries;
 
-    GLuint *free_event_queries;
+    union wined3d_gl_query_object *free_event_queries;
     UINT free_event_query_size;
     UINT free_event_query_count;
     struct list event_queries;
@@ -1122,7 +1146,7 @@ struct fragment_caps
 struct fragment_pipeline
 {
     void (*enable_extension)(IWineD3DDevice *iface, BOOL enable);
-    void (*get_caps)(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps);
+    void (*get_caps)(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps);
     HRESULT (*alloc_private)(IWineD3DDevice *iface);
     void (*free_private)(IWineD3DDevice *iface);
     BOOL (*color_fixup_supported)(struct color_fixup_desc fixup);
@@ -1224,7 +1248,7 @@ typedef struct WineD3D_PixelFormat
 {
     int iPixelFormat; /* WGL pixel format */
     int iPixelType; /* WGL pixel type e.g. WGL_TYPE_RGBA_ARB, WGL_TYPE_RGBA_FLOAT_ARB or WGL_TYPE_COLORINDEX_ARB */
-    int redSize, greenSize, blueSize, alphaSize;
+    int redSize, greenSize, blueSize, alphaSize, colorSize;
     int depthSize, stencilSize;
     BOOL windowDrawable;
     BOOL pbufferDrawable;
@@ -1233,13 +1257,23 @@ typedef struct WineD3D_PixelFormat
     int numSamples;
 } WineD3D_PixelFormat;
 
+enum wined3d_gl_vendor
+{
+    GL_VENDOR_WINE,
+    GL_VENDOR_APPLE,
+    GL_VENDOR_ATI,
+    GL_VENDOR_INTEL,
+    GL_VENDOR_MESA,
+    GL_VENDOR_NVIDIA,
+};
+
+
 enum wined3d_pci_vendor
 {
-    VENDOR_WINE                     = 0x0000,
-    VENDOR_MESA                     = 0x0001,
-    VENDOR_ATI                      = 0x1002,
-    VENDOR_NVIDIA                   = 0x10de,
-    VENDOR_INTEL                    = 0x8086,
+    HW_VENDOR_WINE                     = 0x0000,
+    HW_VENDOR_ATI                      = 0x1002,
+    HW_VENDOR_NVIDIA                   = 0x10de,
+    HW_VENDOR_INTEL                    = 0x8086,
 };
 
 enum wined3d_pci_device
@@ -1323,6 +1357,85 @@ enum wined3d_pci_device
     CARD_INTEL_X3100                = 0x2a02, /* Found in Macs. Same as GMA 965? */
 };
 
+struct wined3d_fbo_ops
+{
+    PGLFNGLISRENDERBUFFERPROC                       glIsRenderbuffer;
+    PGLFNGLBINDRENDERBUFFERPROC                     glBindRenderbuffer;
+    PGLFNGLDELETERENDERBUFFERSPROC                  glDeleteRenderbuffers;
+    PGLFNGLGENRENDERBUFFERSPROC                     glGenRenderbuffers;
+    PGLFNGLRENDERBUFFERSTORAGEPROC                  glRenderbufferStorage;
+    PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC         glRenderbufferStorageMultisample;
+    PGLFNGLGETRENDERBUFFERPARAMETERIVPROC           glGetRenderbufferParameteriv;
+    PGLFNGLISFRAMEBUFFERPROC                        glIsFramebuffer;
+    PGLFNGLBINDFRAMEBUFFERPROC                      glBindFramebuffer;
+    PGLFNGLDELETEFRAMEBUFFERSPROC                   glDeleteFramebuffers;
+    PGLFNGLGENFRAMEBUFFERSPROC                      glGenFramebuffers;
+    PGLFNGLCHECKFRAMEBUFFERSTATUSPROC               glCheckFramebufferStatus;
+    PGLFNGLFRAMEBUFFERTEXTURE1DPROC                 glFramebufferTexture1D;
+    PGLFNGLFRAMEBUFFERTEXTURE2DPROC                 glFramebufferTexture2D;
+    PGLFNGLFRAMEBUFFERTEXTURE3DPROC                 glFramebufferTexture3D;
+    PGLFNGLFRAMEBUFFERRENDERBUFFERPROC              glFramebufferRenderbuffer;
+    PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC  glGetFramebufferAttachmentParameteriv;
+    PGLFNGLBLITFRAMEBUFFERPROC                      glBlitFramebuffer;
+    PGLFNGLGENERATEMIPMAPPROC                       glGenerateMipmap;
+};
+
+struct wined3d_gl_limits
+{
+    UINT buffers;
+    UINT lights;
+    UINT textures;
+    UINT texture_stages;
+    UINT fragment_samplers;
+    UINT vertex_samplers;
+    UINT combined_samplers;
+    UINT general_combiners;
+    UINT sampler_stages;
+    UINT clipplanes;
+    UINT texture_size;
+    UINT texture3d_size;
+    float pointsize_max;
+    float pointsize_min;
+    UINT point_sprite_units;
+    UINT blends;
+    UINT anisotropy;
+    float shininess;
+
+    UINT glsl_varyings;
+    UINT glsl_vs_float_constants;
+    UINT glsl_ps_float_constants;
+
+    UINT arb_vs_float_constants;
+    UINT arb_vs_native_constants;
+    UINT arb_vs_instructions;
+    UINT arb_vs_temps;
+    UINT arb_ps_float_constants;
+    UINT arb_ps_local_constants;
+    UINT arb_ps_native_constants;
+    UINT arb_ps_instructions;
+    UINT arb_ps_temps;
+};
+
+struct wined3d_gl_info
+{
+    UINT vidmem;
+    struct wined3d_gl_limits limits;
+    DWORD reserved_glsl_constants;
+    DWORD quirks;
+    BOOL supported[WINED3D_GL_EXT_COUNT];
+    GLint wrap_lookup[WINED3DTADDRESS_MIRRORONCE - WINED3DTADDRESS_WRAP + 1];
+
+    struct wined3d_fbo_ops fbo_ops;
+#define USE_GL_FUNC(type, pfn, ext, replace) type pfn;
+    /* GL function pointers */
+    GL_EXT_FUNCS_GEN
+    /* WGL function pointers */
+    WGL_EXT_FUNCS_GEN
+#undef USE_GL_FUNC
+
+    struct GlPixelFormatDesc *gl_formats;
+};
+
 struct wined3d_driver_info
 {
     enum wined3d_pci_vendor vendor;
@@ -1348,6 +1461,10 @@ struct wined3d_adapter
     unsigned int            TextureRam; /* Amount of texture memory both video ram + AGP/TurboCache/HyperMemory/.. */
     unsigned int            UsedTextureRam;
     LUID luid;
+
+    const struct fragment_pipeline *fragment_pipe;
+    const shader_backend_t *shader_backend;
+    const struct blit_shader *blitter;
 };
 
 BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor) DECLSPEC_HIDDEN;
@@ -1497,7 +1614,7 @@ struct IWineD3DDeviceImpl
     const struct fragment_pipeline *frag_pipe;
     const struct blit_shader *blitter;
 
-    unsigned int max_ffp_textures, max_ffp_texture_stages;
+    unsigned int max_ffp_textures;
     DWORD d3d_vshader_constantF, d3d_pshader_constantF; /* Advertised d3d caps, not GL ones */
     DWORD vs_clipping;
 
@@ -1547,7 +1664,6 @@ struct IWineD3DDeviceImpl
     UINT                    NumberOfPalettes;
     PALETTEENTRY            **palettes;
     UINT                    currentPalette;
-    UINT                    paletteConversionShader;
 
     /* For rendering to a texture using glCopyTexImage */
     GLenum                  *draw_buffers;
@@ -1602,14 +1718,14 @@ struct IWineD3DDeviceImpl
 HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
         UINT adapter_idx, WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags,
         IUnknown *parent, IWineD3DDeviceParent *device_parent) DECLSPEC_HIDDEN;
+void device_preload_textures(IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
 LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window,
         UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN;
 void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
 void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
 void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
         BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup) DECLSPEC_HIDDEN;
-void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info,
-        const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info) DECLSPEC_HIDDEN;
+void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
 HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count,
         const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) DECLSPEC_HIDDEN;
 void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) DECLSPEC_HIDDEN;
@@ -1745,6 +1861,7 @@ typedef struct IWineD3DBaseTextureClass
 void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN;
 BOOL surface_init_sysmem(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
 BOOL surface_is_offscreen(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb) DECLSPEC_HIDDEN;
 
 typedef struct IWineD3DBaseTextureImpl
 {
@@ -2342,9 +2459,8 @@ typedef struct IWineD3DQueryImpl
     void                     *extendedData;
 } IWineD3DQueryImpl;
 
-extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl DECLSPEC_HIDDEN;
-extern const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl DECLSPEC_HIDDEN;
-extern const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl DECLSPEC_HIDDEN;
+HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
+        WINED3DQUERYTYPE type, IUnknown *parent) DECLSPEC_HIDDEN;
 
 /* IWineD3DBuffer */
 
@@ -2495,6 +2611,7 @@ const char *debug_d3ddeclusage(BYTE usage) DECLSPEC_HIDDEN;
 const char *debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) DECLSPEC_HIDDEN;
 const char *debug_d3drenderstate(DWORD state) DECLSPEC_HIDDEN;
 const char *debug_d3dsamplerstate(DWORD state) DECLSPEC_HIDDEN;
+const char *debug_d3dstate(DWORD state) DECLSPEC_HIDDEN;
 const char *debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN;
 const char *debug_d3dtexturestate(DWORD state) DECLSPEC_HIDDEN;
 const char *debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) DECLSPEC_HIDDEN;
@@ -2552,12 +2669,6 @@ void multiply_matrix(WINED3DMATRIX *dest, const WINED3DMATRIX *src1, const WINED
 UINT wined3d_log2i(UINT32 x) DECLSPEC_HIDDEN;
 unsigned int count_bits(unsigned int mask) DECLSPEC_HIDDEN;
 
-const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter,
-        WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
-const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter,
-        WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
-const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter,
-        WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
 void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, int *vs_selected) DECLSPEC_HIDDEN;
 
 typedef struct local_constant {
@@ -2601,8 +2712,6 @@ int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_li
 extern BOOL vshader_get_input(IWineD3DVertexShader *iface,
         BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) DECLSPEC_HIDDEN;
 
-extern HRESULT allocate_shader_constants(IWineD3DStateBlockImpl* object) DECLSPEC_HIDDEN;
-
 /*****************************************************************************
  * IDirect3DBaseShader implementation structure
  */
@@ -2651,7 +2760,6 @@ typedef struct IWineD3DBaseShaderImpl {
 void shader_buffer_clear(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN;
 BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN;
 void shader_buffer_free(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN;
-void shader_cleanup(IWineD3DBaseShader *iface) DECLSPEC_HIDDEN;
 void shader_dump_src_param(const struct wined3d_shader_src_param *param,
         const struct wined3d_shader_version *shader_version) DECLSPEC_HIDDEN;
 void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
@@ -2659,16 +2767,7 @@ void shader_dump_dst_param(const struct wined3d_shader_dst_param *param,
 unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max) DECLSPEC_HIDDEN;
 void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
         const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx) DECLSPEC_HIDDEN;
-HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe,
-        struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature,
-        struct wined3d_shader_signature_element *output_signature,
-        const DWORD *byte_code, DWORD constf_size) DECLSPEC_HIDDEN;
-void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device,
-        IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
 BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage) DECLSPEC_HIDDEN;
-const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token) DECLSPEC_HIDDEN;
-void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction) DECLSPEC_HIDDEN;
-WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *semantic_name) DECLSPEC_HIDDEN;
 
 static inline BOOL shader_is_pshader_version(enum wined3d_shader_type type)
 {
index 988e654..47d3958 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<group>
 <module name="normaliz_redist_data" type="staticlibrary">
        <include base="icu4ros">icu/source/common</include>
        <directory name="data"><file>icudt38.c</file></directory>
@@ -16,3 +17,4 @@
        <importlibrary definition="normaliz.def" />
        <file>normaliz.cpp</file>
 </module>
+</group>
index 10b6ee5..ea208ce 100644 (file)
@@ -1601,6 +1601,9 @@ LdrpProcessImportDirectoryEntry(PLDR_DATA_TABLE_ENTRY Module,
        IATSize++;
      }
 
+   /* No need to fixup anything if IAT is empty */
+   if (IATSize == 0) return STATUS_SUCCESS;
+
    /* Unprotect the region we are about to write into. */
    IATBase = (PVOID)ImportAddressList;
    IATSize *= sizeof(PVOID*);
index 2de98b3..11ab46a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __DESKADP__H
-#define __DESKADP__H
+#pragma once
 
 typedef struct _DESKDISPLAYADAPTER
 {
@@ -59,5 +58,3 @@ IDeskDisplayAdapter_ReplacePage(PDESKDISPLAYADAPTER This,
 static const GUID CLSID_IDeskDisplayAdapter = {0x42071712,0x76d4,0x11d1,{0x8b,0x24,0x00,0xa0,0xc9,0x06,0x8f,0xf3}};
 
 ULONG __cdecl DbgPrint(PCCH Format,...);
-
-#endif /* __DESKADP__H */
index 0ccade0..a788142 100644 (file)
@@ -8,7 +8,7 @@ BEGIN
   GROUPBOX "Adaptertyp", -1, 7, 3, 237, 50
   LTEXT "", IDC_ADAPTERNAME, 40, 17, 190, 20
   PUSHBUTTON "&Einstellungen", IDC_ADAPTERPROPERTIES, 177, 33, 59, 14
-  GROUPBOX "Adapter Information", -1, 7, 56, 237, 75
+  GROUPBOX "Adapter-Informationen", -1, 7, 56, 237, 75
   LTEXT "Chiptyp:", -1, 13, 68, 58, 8
   LTEXT "", IDC_CHIPTYPE, 71, 68, 160, 8, SS_NOPREFIX
   LTEXT "DAC Typ:", -1, 13, 80, 58, 8
@@ -17,7 +17,7 @@ BEGIN
   LTEXT "", IDC_MEMORYSIZE, 71, 92, 160, 8, SS_NOPREFIX
   LTEXT "Zeichenfolge:", -1, 13, 104, 58, 8
   LTEXT "", IDC_ADAPTERSTRING, 71, 104, 160, 8, SS_NOPREFIX
-  LTEXT "BIOS Informationen:", -1, 13, 116, 58, 8
+  LTEXT "BIOS-Informationen:", -1, 13, 116, 58, 8
   LTEXT "", IDC_BIOSINFORMATION, 71, 116, 160, 8, SS_NOPREFIX
   PUSHBUTTON "Alle Modi auf&listen...", IDC_LISTALLMODES, 7, 139, 75, 14
 END
index 6268f48..ab3d1fa 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __RESOURCE__H
-#define __RESOURCE__H
+#pragma once
 
 #define IDD_DISPLAYADAPTER  100
 #define IDD_LISTALLMODES 101
@@ -24,5 +23,3 @@
 #define IDS_16BPP 107
 #define IDS_24BPP 108
 #define IDS_32BPP 109
-
-#endif /* __RESOURCE__H */
index 3615700..d2d381a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __DESKMON__H
-#define __DESKMON__H
+#pragma once
 
 typedef struct _DESKMONINFO
 {
@@ -79,5 +78,3 @@ IDeskMonitor_ReplacePage(PDESKMONITOR This,
 static const GUID CLSID_IDeskMonitor = {0x42071713,0x76d4,0x11d1,{0x8b,0x24,0x00,0xa0,0xc9,0x06,0x8f,0xf3}};
 
 ULONG __cdecl DbgPrint(PCCH Format,...);
-
-#endif /* __DESKMON__H */
index dc394c8..e6d7bd8 100644 (file)
@@ -17,6 +17,6 @@ END
 
 STRINGTABLE
 BEGIN
-  IDS_USEDEFFRQUENCY "Verwende Hardware Standardeinstellung."
+  IDS_USEDEFFRQUENCY "Verwende Hardware-Standardeinstellung."
   IDS_FREQFMT "%u Hertz"
 END
index 17c564a..dd3573b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __RESOURCE__H
-#define __RESOURCE__H
+#pragma once
 
 #define IDD_MONITOR  100
 
@@ -13,5 +12,3 @@
 
 #define IDS_USEDEFFRQUENCY 101
 #define IDS_FREQFMT 102
-
-#endif /* __RESOURCE__H */
index 21cd62d..c62ce1c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __FONTEXT__H
-#define __FONTEXT__H
+#pragma once
 
 #define COBJMACROS
 #include <windows.h>
@@ -8,5 +7,3 @@
 #include <shlobj.h>
 
 #include <debug.h>
-
-#endif /* __FONTEXT__H */
index 3c2afa7..2fdfda0 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef __RESOURCE__H
-#define __RESOURCE__H
+#pragma once
 
 #define IDS_REACTOS_FONTS_FOLDER 151
-
-#endif /* __RESOURCE__H */
index fc06870..95598f5 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
 <group xmlns:xi="http://www.w3.org/2001/XInclude">
        <directory name="deskadp">
                <xi:include href="deskadp/deskadp.rbuild" />
index a0f23b4..f331216 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __SLAYER_RESOURCE_H
-#define __SLAYER_RESOURCE_H
+#pragma once
 
 #define IDD_SLAYERSHEET 100
 #define IDD_EDITCOMPATIBILITYMODES 101
@@ -19,6 +18,4 @@
 #define IDS_SLAYER 100
 #define IDS_DESCRIPTION 101
 
-#endif /* __SLAYER_RESOURCE_H */
-
 /* EOF */
index f48538e..6cad312 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __SLAYER_H
-#define __SLAYER_H
+#pragma once
 
 extern HINSTANCE hInstance;
 
@@ -120,7 +119,4 @@ HRESULT STDMETHODCALLTYPE ICompatibilityPage_fnCreateInstance(LPCOMPATIBILITYPAG
 HRESULT STDMETHODCALLTYPE ICompatibilityPage_fnLockServer(LPCOMPATIBILITYPAGE this,
                                                           BOOL fLock);
 
-
-#endif /* __SLAYER_H */
-
 /* EOF */
index 324ad16..45addc6 100644 (file)
@@ -393,7 +393,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject,
     DeviceExtension = DeviceObject->DeviceExtension;
     DeviceExtension->ReferenceCount = 0;
     DeviceExtension->TimerActive = FALSE;
-    IoInitializeDpcRequest(DeviceObject, BeepDPC);
+    IoInitializeDpcRequest(DeviceObject, (PIO_DPC_ROUTINE)BeepDPC);
     KeInitializeTimer(&DeviceExtension->Timer);
     ExInitializeFastMutex(&DeviceExtension->Mutex);
 
index f6dce1c..3d0ae50 100644 (file)
@@ -394,6 +394,7 @@ VidInitialize(IN BOOLEAN SetMode)
         {
             /* Translate the VGA Memory Address */
             VgaAddress.LowPart = 0xA0000;
+            VgaAddress.HighPart = 0;
             AddressSpace = 0;
             Result = HalFindBusAddressTranslation(VgaAddress,
                                                   &AddressSpace,
index b74cf0d..c7d55e9 100644 (file)
@@ -1,4 +1,5 @@
 #include "ntddk.h"
+#include "ntifs.h"
 #include "arc/arc.h"
 #include "halfuncs.h"
 #include "drivers/bootvid/bootvid.h"
index f81bcc6..3d7ed1c 100644 (file)
@@ -12,6 +12,7 @@
 
 #define NOEXTAPI
 #include <ntddk.h>
+#include <ntifs.h>
 #define NDEBUG
 #include <halfuncs.h>
 #include <stdio.h>
index b7cc9af..d6b6430 100644 (file)
@@ -6,8 +6,7 @@
  * PROGRAMMER:      Timo Kreuzer (timo.kreuzer@ewactos.org)
  */
 
-#ifndef _KDCOM_H_
-#define _KDCOM_H_
+#pragma once
 
 #define COM_DAT 0x00
 #define COM_IEN 0x01 /* interrupt enable register */
@@ -53,5 +52,3 @@
 #define MSR_DSR  0x20 /* (complemented) state of data set ready (DSR). */
 #define MSR_RI   0x40 /* (complemented) state of ring indicator (RI). */
 #define MSR_DCD  0x80 /* (complemented) state of data carrier detect (DCD). */
-
-#endif /* !_KDCOM_H_ */
index 81a20c5..7633092 100644 (file)
@@ -6,8 +6,7 @@
  * PROGRAMMER:      Timo Kreuzer (timo.kreuzer@ewactos.org)
  */
 
-#ifndef _KDDLL_H_
-#define _KDDLL_H_
+#pragma once
 
 #define NOEXTAPI
 #include <ntddk.h>
@@ -80,6 +79,3 @@ NTAPI
 KdDebuggerInitialize0(
     IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL);
 #endif
-
-
-#endif /* !_KDDLL_H_ */
index 3fca485..6e01f2f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
-
+<group>
 <module name="kdlib" type="staticlibrary">
        <include base="kdlib">.</include>
        <library>ntoskrnl</library>
@@ -22,3 +22,4 @@
        <library>kdserial</library>
        <file>kdcom.c</file>
 </module>
+</group>
diff --git a/reactos/drivers/battery/battc/battc.c b/reactos/drivers/battery/battc/battc.c
new file mode 100644 (file)
index 0000000..6a0b722
--- /dev/null
@@ -0,0 +1,356 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            drivers/battery/battc/battc.c
+ * PURPOSE:         Battery Class Driver
+ * PROGRAMMERS:     Cameron Gutman (cameron.gutman@reactos.org)
+ */
+
+#include <battc.h>
+
+#define NDEBUG
+#include <debug.h>
+
+NTSTATUS
+NTAPI
+DriverEntry(PDRIVER_OBJECT DriverObject,
+            PUNICODE_STRING RegistryPath)
+{
+  DPRINT("Battery class driver initialized\n");
+
+  return STATUS_SUCCESS;
+}
+
+BCLASSAPI
+NTSTATUS
+DDKAPI
+BatteryClassUnload(PVOID ClassData)
+{
+  PBATTERY_CLASS_DATA BattClass = ClassData;
+
+  DPRINT("Battery 0x%x is being unloaded\n");
+
+  if (BattClass->InterfaceName.Length != 0)
+  {
+      IoSetDeviceInterfaceState(&BattClass->InterfaceName, FALSE);
+      RtlFreeUnicodeString(&BattClass->InterfaceName);
+  }
+
+  ExFreePoolWithTag(BattClass,
+                    BATTERY_CLASS_DATA_TAG);
+
+  return STATUS_SUCCESS;
+}
+
+BCLASSAPI
+NTSTATUS
+DDKAPI
+BatteryClassSystemControl(PVOID ClassData,
+                          PVOID WmiLibContext,
+                          PDEVICE_OBJECT DeviceObject,
+                          PIRP Irp,
+                          PVOID Disposition)
+{
+  UNIMPLEMENTED
+
+  return STATUS_WMI_GUID_NOT_FOUND;
+}
+
+BCLASSAPI
+NTSTATUS
+DDKAPI
+BatteryClassQueryWmiDataBlock(PVOID ClassData,
+                              PDEVICE_OBJECT DeviceObject,
+                              PIRP Irp,
+                              ULONG GuidIndex,
+                              PULONG InstanceLengthArray,
+                              ULONG OutBufferSize,
+                              PUCHAR Buffer)
+{
+  UNIMPLEMENTED
+
+  return STATUS_WMI_GUID_NOT_FOUND;
+}
+
+BCLASSAPI
+NTSTATUS
+DDKAPI
+BatteryClassStatusNotify(PVOID ClassData)
+{
+  PBATTERY_CLASS_DATA BattClass = ClassData;
+  PBATTERY_WAIT_STATUS BattWait = BattClass->EventTriggerContext;
+  BATTERY_STATUS BattStatus;
+  NTSTATUS Status;
+
+  DPRINT("Received battery status notification from 0x%x\n", ClassData);
+
+  ExAcquireFastMutex(&BattClass->Mutex);
+  if (!BattClass->Waiting)
+  {
+      ExReleaseFastMutex(&BattClass->Mutex);
+      return STATUS_SUCCESS;
+  }
+
+  switch (BattClass->EventTrigger)
+  {
+     case EVENT_BATTERY_TAG:
+       ExReleaseFastMutex(&BattClass->Mutex);
+       DPRINT1("Waiting for battery is UNIMPLEMENTED!\n");
+       break;
+
+     case EVENT_BATTERY_STATUS:
+       ExReleaseFastMutex(&BattClass->Mutex);
+       Status = BattClass->MiniportInfo.QueryStatus(BattClass->MiniportInfo.Context,
+                                                    BattWait->BatteryTag,
+                                                    &BattStatus);
+       if (!NT_SUCCESS(Status))
+           return Status;
+
+       ExAcquireFastMutex(&BattClass->Mutex);
+
+       if (!(BattWait->PowerState & BattStatus.PowerState) ||
+           (BattWait->HighCapacity > BattStatus.Capacity) ||
+           (BattWait->LowCapacity < BattStatus.Capacity))
+       {
+           KeSetEvent(&BattClass->WaitEvent, IO_NO_INCREMENT, FALSE);
+       }
+
+       ExReleaseFastMutex(&BattClass->Mutex);
+       break;
+
+     default:
+       ExReleaseFastMutex(&BattClass->Mutex);
+       ASSERT(FALSE);
+       break;
+  }
+
+  return STATUS_SUCCESS;
+}
+
+BCLASSAPI
+NTSTATUS
+DDKAPI
+BatteryClassInitializeDevice(PBATTERY_MINIPORT_INFO MiniportInfo,
+                             PVOID *ClassData)
+{
+  NTSTATUS Status;
+  PBATTERY_CLASS_DATA BattClass = ExAllocatePoolWithTag(NonPagedPool,
+                                                        sizeof(BATTERY_CLASS_DATA),
+                                                        BATTERY_CLASS_DATA_TAG);
+
+  if (!BattClass)
+      return STATUS_INSUFFICIENT_RESOURCES;
+
+  RtlZeroMemory(BattClass, sizeof(BATTERY_CLASS_DATA));
+
+  RtlCopyMemory(&BattClass->MiniportInfo,
+                MiniportInfo,
+                sizeof(BattClass->MiniportInfo));
+
+  KeInitializeEvent(&BattClass->WaitEvent, SynchronizationEvent, FALSE);
+
+  ExInitializeFastMutex(&BattClass->Mutex);
+
+  Status = IoRegisterDeviceInterface(MiniportInfo->Pdo,
+                                     &GUID_DEVICE_BATTERY,
+                                     NULL,
+                                     &BattClass->InterfaceName);
+  if (NT_SUCCESS(Status))
+  {
+      DPRINT("Initialized battery interface: %wZ\n", &BattClass->InterfaceName);
+      IoSetDeviceInterfaceState(&BattClass->InterfaceName, TRUE);
+  }
+  else
+  {
+      DPRINT1("IoRegisterDeviceInterface failed (0x%x)\n", Status);
+  }
+
+  *ClassData = BattClass;
+
+  return STATUS_SUCCESS;
+}
+
+BCLASSAPI
+NTSTATUS
+DDKAPI
+BatteryClassIoctl(PVOID ClassData,
+                  PIRP Irp)
+{
+  PBATTERY_CLASS_DATA BattClass = ClassData;
+  PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
+  NTSTATUS Status;
+  ULONG WaitTime;
+  PBATTERY_WAIT_STATUS BattWait;
+  PBATTERY_QUERY_INFORMATION BattQueryInfo;
+  PBATTERY_SET_INFORMATION BattSetInfo;
+  LARGE_INTEGER Timeout;
+  PBATTERY_STATUS BattStatus;
+  BATTERY_NOTIFY BattNotify;
+
+  Irp->IoStatus.Information = 0;
+
+  DPRINT("Received IOCTL %x for 0x%x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode,
+         ClassData);
+
+  switch (IrpSp->Parameters.DeviceIoControl.IoControlCode)
+  {
+    case IOCTL_BATTERY_QUERY_TAG:
+      if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(ULONG) ||
+          IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG))
+      {
+          Status = STATUS_BUFFER_TOO_SMALL;
+          break;
+      }
+
+      WaitTime = *(PULONG)Irp->AssociatedIrp.SystemBuffer;
+
+      Timeout.QuadPart = Int32x32To64(WaitTime, -1000);
+
+      Status = BattClass->MiniportInfo.QueryTag(BattClass->MiniportInfo.Context,
+                                                (PULONG)Irp->AssociatedIrp.SystemBuffer);
+      if (!NT_SUCCESS(Status))
+      {
+          ExAcquireFastMutex(&BattClass->Mutex);
+          BattClass->EventTrigger = EVENT_BATTERY_TAG;
+          BattClass->Waiting = TRUE;
+          ExReleaseFastMutex(&BattClass->Mutex);
+
+          Status = KeWaitForSingleObject(&BattClass->WaitEvent,
+                                         Executive,
+                                         KernelMode,
+                                         FALSE,
+                                         WaitTime != -1 ? &Timeout : NULL);
+
+          ExAcquireFastMutex(&BattClass->Mutex);
+          BattClass->Waiting = FALSE;
+          ExReleaseFastMutex(&BattClass->Mutex);
+
+          if (Status == STATUS_SUCCESS)
+          {
+              Status = BattClass->MiniportInfo.QueryTag(BattClass->MiniportInfo.Context,
+                                                        (PULONG)Irp->AssociatedIrp.SystemBuffer);
+              if (NT_SUCCESS(Status))
+                  Irp->IoStatus.Information = sizeof(ULONG);
+          }
+          else
+          {
+              Status = STATUS_NO_SUCH_DEVICE;
+          }
+      }
+      else
+          Irp->IoStatus.Information = sizeof(ULONG);
+      break;
+
+    case IOCTL_BATTERY_QUERY_STATUS:
+      if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(*BattWait) ||
+          IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(BATTERY_STATUS))
+      {
+          Status = STATUS_BUFFER_TOO_SMALL;
+          break;
+      }
+
+      BattWait = Irp->AssociatedIrp.SystemBuffer;
+
+      Timeout.QuadPart = Int32x32To64(BattWait->Timeout, -1000);
+
+      Status = BattClass->MiniportInfo.QueryStatus(BattClass->MiniportInfo.Context,
+                                                   BattWait->BatteryTag,
+                                                   (PBATTERY_STATUS)Irp->AssociatedIrp.SystemBuffer);
+
+      BattStatus = Irp->AssociatedIrp.SystemBuffer;
+
+      if (!NT_SUCCESS(Status) ||
+          ((BattWait->PowerState & BattStatus->PowerState) &&
+           (BattWait->HighCapacity <= BattStatus->Capacity) &&
+           (BattWait->LowCapacity >= BattStatus->Capacity)))
+      {
+          BattNotify.PowerState = BattWait->PowerState;
+          BattNotify.HighCapacity = BattWait->HighCapacity;
+          BattNotify.LowCapacity = BattWait->LowCapacity;
+
+          BattClass->MiniportInfo.SetStatusNotify(BattClass->MiniportInfo.Context,
+                                                  BattWait->BatteryTag,
+                                                  &BattNotify);
+
+          ExAcquireFastMutex(&BattClass->Mutex);
+          BattClass->EventTrigger = EVENT_BATTERY_STATUS;
+          BattClass->EventTriggerContext = BattWait;
+          BattClass->Waiting = TRUE;
+          ExReleaseFastMutex(&BattClass->Mutex);
+
+          Status = KeWaitForSingleObject(&BattClass->WaitEvent,
+                                         Executive,
+                                         KernelMode,
+                                         FALSE,
+                                         BattWait->Timeout != -1 ? &Timeout : NULL);
+
+          ExAcquireFastMutex(&BattClass->Mutex);
+          BattClass->Waiting = FALSE;
+          ExReleaseFastMutex(&BattClass->Mutex);
+
+          BattClass->MiniportInfo.DisableStatusNotify(BattClass->MiniportInfo.Context);
+
+          if (Status == STATUS_SUCCESS)
+          {
+              Status = BattClass->MiniportInfo.QueryStatus(BattClass->MiniportInfo.Context,
+                                                           BattWait->BatteryTag,
+                                                           (PBATTERY_STATUS)Irp->AssociatedIrp.SystemBuffer);
+              if (NT_SUCCESS(Status))
+                  Irp->IoStatus.Information = sizeof(ULONG);
+          }
+          else
+          {
+              Status = STATUS_NO_SUCH_DEVICE;
+          }
+      }
+      else
+          Irp->IoStatus.Information = sizeof(BATTERY_STATUS);
+      break;
+
+    case IOCTL_BATTERY_QUERY_INFORMATION:
+      if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(*BattQueryInfo))
+      {
+          Status = STATUS_BUFFER_TOO_SMALL;
+          break;
+      }
+
+      BattQueryInfo = Irp->AssociatedIrp.SystemBuffer;
+
+      Status = BattClass->MiniportInfo.QueryInformation(BattClass->MiniportInfo.Context,
+                                                        BattQueryInfo->BatteryTag,
+                                                        BattQueryInfo->InformationLevel,
+                                                        BattQueryInfo->AtRate,
+                                                        Irp->AssociatedIrp.SystemBuffer,
+                                                        IrpSp->Parameters.DeviceIoControl.OutputBufferLength,
+                                                        &Irp->IoStatus.Information);
+      if (!NT_SUCCESS(Status))
+          DPRINT1("QueryInformation failed (0x%x)\n", Status);
+      break;
+    case IOCTL_BATTERY_SET_INFORMATION:
+      if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(*BattSetInfo))
+      {
+          Status = STATUS_BUFFER_TOO_SMALL;
+          break;
+      }
+
+      BattSetInfo = Irp->AssociatedIrp.SystemBuffer;
+
+      Status = BattClass->MiniportInfo.SetInformation(BattClass->MiniportInfo.Context,
+                                                      BattSetInfo->BatteryTag,
+                                                      BattSetInfo->InformationLevel,
+                                                      BattSetInfo->Buffer);
+      if (!NT_SUCCESS(Status))
+          DPRINT1("SetInformation failed (0x%x)\n", Status);
+      break;
+
+    default:
+      DPRINT1("Received unsupported IRP %x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode);
+      /* Do NOT complete the irp */
+      return STATUS_NOT_SUPPORTED;
+  }
+
+  Irp->IoStatus.Status = Status;
+  IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+  return Status;
+}
diff --git a/reactos/drivers/battery/battc/battc.h b/reactos/drivers/battery/battc/battc.h
new file mode 100644 (file)
index 0000000..0839cea
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+* PROJECT:         ReactOS Kernel
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            drivers/battery/battc/battc.h
+* PURPOSE:         Battery Class Driver
+* PROGRAMMERS:     Cameron Gutman (cameron.gutman@reactos.org)
+*/
+
+#pragma once
+
+#include <ntddk.h>
+#include <wmlib.h>
+#include <initguid.h>
+#include <batclass.h>
+
+typedef struct _BATTERY_CLASS_DATA {
+  BATTERY_MINIPORT_INFO MiniportInfo;
+  KEVENT WaitEvent;
+  BOOLEAN Waiting;
+  FAST_MUTEX Mutex;
+  UCHAR EventTrigger;
+  PVOID EventTriggerContext;
+  UNICODE_STRING InterfaceName;
+} BATTERY_CLASS_DATA, *PBATTERY_CLASS_DATA;
+
+/* Memory tags */
+#define BATTERY_CLASS_DATA_TAG 'CtaB'
+
+/* Event triggers */
+#define EVENT_BATTERY_TAG    0x01
+#define EVENT_BATTERY_STATUS 0x02
diff --git a/reactos/drivers/battery/battc/battc.rbuild b/reactos/drivers/battery/battc/battc.rbuild
new file mode 100644 (file)
index 0000000..c026134
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<module name="battc" type="kernelmodedriver" installbase="system32/drivers" installname="battc.sys">
+       <library>ntoskrnl</library>
+       <library>hal</library>
+       <importlibrary definition="battc.spec"/>
+       <include base="battc">.</include>
+       <file>battc.c</file>
+       <file>battc.rc</file>
+</module>
diff --git a/reactos/drivers/battery/battc/battc.rc b/reactos/drivers/battery/battc/battc.rc
new file mode 100644 (file)
index 0000000..2230092
--- /dev/null
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION   "Battery Class Driver\0"
+#define REACTOS_STR_INTERNAL_NAME      "battc\0"
+#define REACTOS_STR_ORIGINAL_FILENAME  "battc.sys\0"
+#include <reactos/version.rc>
diff --git a/reactos/drivers/battery/battc/battc.spec b/reactos/drivers/battery/battc/battc.spec
new file mode 100644 (file)
index 0000000..c2d21b7
--- /dev/null
@@ -0,0 +1,6 @@
+@ stdcall BatteryClassInitializeDevice(ptr ptr)
+@ stdcall BatteryClassIoctl(ptr ptr)
+@ stdcall BatteryClassQueryWmiDataBlock(ptr ptr ptr long ptr long ptr)
+@ stdcall BatteryClassStatusNotify(ptr)
+@ stdcall BatteryClassSystemControl(ptr ptr ptr ptr ptr)
+@ stdcall BatteryClassUnload(ptr)
diff --git a/reactos/drivers/battery/cmbatt/cmbatt.c b/reactos/drivers/battery/cmbatt/cmbatt.c
new file mode 100644 (file)
index 0000000..b85f3eb
--- /dev/null
@@ -0,0 +1,188 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            drivers/battery/cmbatt/cmbatt.c
+ * PURPOSE:         Control Method Battery Miniclass Driver
+ * PROGRAMMERS:     Cameron Gutman (cameron.gutman@reactos.org)
+ */
+
+#include <cmbatt.h>
+
+#define NDEBUG
+#include <debug.h>
+
+LIST_ENTRY BatteryList;
+KSPIN_LOCK BatteryListLock;
+
+VOID
+NTAPI
+CmBattUnload(PDRIVER_OBJECT DriverObject)
+{
+  DPRINT("Control method battery miniclass driver unloaded\n");
+}
+
+NTSTATUS
+NTAPI
+CmBattDeviceControl(PDEVICE_OBJECT DeviceObject,
+                    PIRP Irp)
+{
+  PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
+  NTSTATUS Status;
+
+  Status = BatteryClassIoctl(DeviceExtension->BattClassHandle,
+                             Irp);
+
+  if (Status == STATUS_NOT_SUPPORTED)
+  {
+      Irp->IoStatus.Status = Status;
+      Irp->IoStatus.Information = 0;
+
+      IoCompleteRequest(Irp, IO_NO_INCREMENT);
+  }
+
+  return Status;
+}
+
+NTSTATUS
+NTAPI
+CmBattPnP(PDEVICE_OBJECT DeviceObject,
+          PIRP Irp)
+{
+  PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
+
+  UNIMPLEMENTED
+
+  IoSkipCurrentIrpStackLocation(Irp);
+
+  return IoCallDriver(DeviceExtension->Ldo, Irp);
+}
+
+NTSTATUS
+NTAPI
+CmBattSystemControl(PDEVICE_OBJECT DeviceObject,
+                    PIRP Irp)
+{
+  UNIMPLEMENTED
+
+  Irp->IoStatus.Status = STATUS_WMI_GUID_NOT_FOUND;
+  Irp->IoStatus.Information = 0;
+
+  IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+  return STATUS_WMI_GUID_NOT_FOUND;
+}
+
+NTSTATUS
+NTAPI
+CmBattPower(PDEVICE_OBJECT DeviceObject,
+            PIRP Irp)
+{
+  PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
+
+  UNIMPLEMENTED
+
+  IoSkipCurrentIrpStackLocation(Irp);
+
+  PoStartNextPowerIrp(Irp);
+
+  return PoCallDriver(DeviceExtension->Ldo, Irp);
+}
+
+NTSTATUS
+NTAPI
+CmBattCreateClose(PDEVICE_OBJECT DeviceObject,
+                  PIRP Irp)
+{
+  Irp->IoStatus.Status = STATUS_SUCCESS;
+  Irp->IoStatus.Information = 0;
+
+  IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+  return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+CmBattAddDevice(PDRIVER_OBJECT DriverObject,
+                PDEVICE_OBJECT PhysicalDeviceObject)
+{
+  NTSTATUS Status;
+  PDEVICE_OBJECT DeviceObject;
+  PCMBATT_DEVICE_EXTENSION DeviceExtension;
+  BATTERY_MINIPORT_INFO BattInfo;
+
+  Status = IoCreateDevice(DriverObject,
+                          sizeof(CMBATT_DEVICE_EXTENSION),
+                          NULL,
+                          FILE_DEVICE_BATTERY,
+                          0,
+                          FALSE,
+                          &DeviceObject);
+  if (!NT_SUCCESS(Status))
+      return Status;
+
+  DeviceExtension = DeviceObject->DeviceExtension;
+
+  DeviceExtension->Pdo = PhysicalDeviceObject;
+  DeviceExtension->Fdo = DeviceObject;
+  DeviceExtension->Ldo = IoAttachDeviceToDeviceStack(DeviceObject,
+                                                     PhysicalDeviceObject);
+
+  DeviceObject->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
+
+  /* We require an extra stack entry */
+  DeviceObject->StackSize = PhysicalDeviceObject->StackSize + 2;
+
+  BattInfo.MajorVersion = BATTERY_CLASS_MAJOR_VERSION;
+  BattInfo.MinorVersion = BATTERY_CLASS_MINOR_VERSION;
+  BattInfo.Context = DeviceExtension;
+  BattInfo.QueryTag = CmBattQueryTag;
+  BattInfo.QueryInformation = CmBattQueryInformation;
+  BattInfo.SetInformation = CmBattSetInformation;
+  BattInfo.QueryStatus = CmBattQueryStatus;
+  BattInfo.SetStatusNotify = CmBattSetStatusNotify;
+  BattInfo.DisableStatusNotify = CmBattDisableStatusNotify;
+  BattInfo.Pdo = PhysicalDeviceObject;
+  BattInfo.DeviceName = NULL;
+
+  Status = BatteryClassInitializeDevice(&BattInfo,
+                                        &DeviceExtension->BattClassHandle);
+  if (!NT_SUCCESS(Status))
+  {
+     IoDetachDevice(DeviceExtension->Ldo);
+     IoDeleteDevice(DeviceObject);
+     return Status;
+  }
+
+  ExInterlockedInsertTailList(&BatteryList,
+                              &DeviceExtension->ListEntry,
+                              &BatteryListLock);
+
+  DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
+
+  DPRINT("Successfully registered battery with battc (0x%x)\n", DeviceExtension->BattClassHandle);
+
+  return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+DriverEntry(PDRIVER_OBJECT DriverObject,
+            PUNICODE_STRING RegistryPath)
+{
+  DPRINT("Control method battery miniclass driver initialized\n");
+
+  DriverObject->DriverUnload = CmBattUnload;
+  DriverObject->DriverExtension->AddDevice = CmBattAddDevice;
+  DriverObject->MajorFunction[IRP_MJ_POWER] = CmBattPower;
+  DriverObject->MajorFunction[IRP_MJ_PNP] = CmBattPnP;
+  DriverObject->MajorFunction[IRP_MJ_CREATE] = CmBattCreateClose;
+  DriverObject->MajorFunction[IRP_MJ_CLOSE] = CmBattCreateClose;
+  DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CmBattDeviceControl;
+  DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = CmBattSystemControl;
+
+  KeInitializeSpinLock(&BatteryListLock);
+  InitializeListHead(&BatteryList);
+
+  return STATUS_SUCCESS;
+}
diff --git a/reactos/drivers/battery/cmbatt/cmbatt.h b/reactos/drivers/battery/cmbatt/cmbatt.h
new file mode 100644 (file)
index 0000000..e70b561
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+* PROJECT:         ReactOS Kernel
+* LICENSE:         GPL - See COPYING in the top level directory
+* FILE:            drivers/battery/cmbatt/cmbatt.h
+* PURPOSE:         Control Method Battery Miniclass Driver
+* PROGRAMMERS:     Cameron Gutman (cameron.gutman@reactos.org)
+*/
+
+#pragma once
+
+#include <ntddk.h>
+#include <batclass.h>
+
+typedef struct _CMBATT_DEVICE_EXTENSION {
+  PDEVICE_OBJECT Pdo;
+  PDEVICE_OBJECT Ldo;
+  PDEVICE_OBJECT Fdo;
+  PVOID BattClassHandle;
+  LIST_ENTRY ListEntry;
+} CMBATT_DEVICE_EXTENSION, *PCMBATT_DEVICE_EXTENSION;
+
+NTSTATUS
+NTAPI
+CmBattQueryTag(PVOID Context,
+               PULONG BatteryTag);
+
+NTSTATUS
+NTAPI
+CmBattDisableStatusNotify(PVOID Context);
+
+NTSTATUS
+NTAPI
+CmBattSetStatusNotify(PVOID Context,
+                      ULONG BatteryTag,
+                      PBATTERY_NOTIFY BatteryNotify);
+
+NTSTATUS
+NTAPI
+CmBattQueryInformation(PVOID Context,
+                       ULONG BatteryTag,
+                       BATTERY_QUERY_INFORMATION_LEVEL Level,
+                       OPTIONAL LONG AtRate,
+                       PVOID Buffer,
+                       ULONG BufferLength,
+                       PULONG ReturnedLength);
+
+NTSTATUS
+NTAPI
+CmBattQueryStatus(PVOID Context,
+                  ULONG BatteryTag,
+                  PBATTERY_STATUS BatteryStatus);
+
+NTSTATUS
+NTAPI
+CmBattSetInformation(PVOID Context,
+                     ULONG BatteryTag,
+                     BATTERY_SET_INFORMATION_LEVEL Level,
+                     OPTIONAL PVOID Buffer);
diff --git a/reactos/drivers/battery/cmbatt/cmbatt.rbuild b/reactos/drivers/battery/cmbatt/cmbatt.rbuild
new file mode 100644 (file)
index 0000000..c41a072
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<module name="cmbatt" type="kernelmodedriver" installbase="system32/drivers" installname="cmbatt.sys">
+       <library>ntoskrnl</library>
+       <library>hal</library>
+       <library>battc</library>
+       <include base="cmbatt">.</include>
+       <file>cmbatt.c</file>
+       <file>miniclass.c</file>
+       <file>cmbatt.rc</file>
+</module>
diff --git a/reactos/drivers/battery/cmbatt/cmbatt.rc b/reactos/drivers/battery/cmbatt/cmbatt.rc
new file mode 100644 (file)
index 0000000..2fd6bc7
--- /dev/null
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION   "Control Method Battery Miniclass Driver\0"
+#define REACTOS_STR_INTERNAL_NAME      "cmbatt\0"
+#define REACTOS_STR_ORIGINAL_FILENAME  "cmbatt.sys\0"
+#include <reactos/version.rc>
diff --git a/reactos/drivers/battery/cmbatt/miniclass.c b/reactos/drivers/battery/cmbatt/miniclass.c
new file mode 100644 (file)
index 0000000..bb75d9a
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            drivers/battery/cmbatt/miniclass.c
+ * PURPOSE:         Control Method Battery Miniclass Driver
+ * PROGRAMMERS:     Cameron Gutman (cameron.gutman@reactos.org)
+ */
+
+#include <cmbatt.h>
+
+#define NDEBUG
+#include <debug.h>
+
+NTSTATUS
+NTAPI
+CmBattQueryTag(PVOID Context,
+               PULONG BatteryTag)
+{
+  UNIMPLEMENTED
+
+  *BatteryTag = 0;
+
+  return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+CmBattDisableStatusNotify(PVOID Context)
+{
+  UNIMPLEMENTED
+
+  return STATUS_NOT_SUPPORTED;
+}
+
+NTSTATUS
+NTAPI
+CmBattSetStatusNotify(PVOID Context,
+                      ULONG BatteryTag,
+                      PBATTERY_NOTIFY BatteryNotify)
+{
+  UNIMPLEMENTED
+
+  return STATUS_NOT_SUPPORTED;
+}
+
+NTSTATUS
+NTAPI
+CmBattQueryInformation(PVOID Context,
+                       ULONG BatteryTag,
+                       BATTERY_QUERY_INFORMATION_LEVEL Level,
+                       OPTIONAL LONG AtRate,
+                       PVOID Buffer,
+                       ULONG BufferLength,
+                       PULONG ReturnedLength)
+{
+  UNIMPLEMENTED
+
+  return STATUS_NOT_SUPPORTED;
+}
+
+NTSTATUS
+NTAPI
+CmBattQueryStatus(PVOID Context,
+                  ULONG BatteryTag,
+                  PBATTERY_STATUS BatteryStatus)
+{
+  UNIMPLEMENTED
+
+  return STATUS_NOT_SUPPORTED;
+}
+
+NTSTATUS
+NTAPI
+CmBattSetInformation(PVOID Context,
+                     ULONG BatteryTag,
+                     BATTERY_SET_INFORMATION_LEVEL Level,
+                     OPTIONAL PVOID Buffer)
+{
+  UNIMPLEMENTED
+
+  return STATUS_NOT_SUPPORTED;
+}
diff --git a/reactos/drivers/battery/directory.rbuild b/reactos/drivers/battery/directory.rbuild
new file mode 100644 (file)
index 0000000..2da9fe0
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
+<group xmlns:xi="http://www.w3.org/2001/XInclude">
+<directory name="battc">
+       <xi:include href="battc/battc.rbuild" />
+</directory>
+<directory name="cmbatt">
+       <xi:include href="cmbatt/cmbatt.rbuild" />
+</directory>
+</group>
diff --git a/reactos/drivers/bus/acpi/acpi.rbuild b/reactos/drivers/bus/acpi/acpi.rbuild
deleted file mode 100644 (file)
index 94b960a..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
-<module name="acpi" type="kernelmodedriver" installbase="system32/drivers" installname="acpi.sys">
-       <bootstrap installbase="$(CDOUTPUT)" />
-       <include base="acpi">include</include>
-       <include base="acpi">ospm/include</include>
-       <library>ntoskrnl</library>
-       <library>hal</library>
-       <directory name="dispatcher">
-               <file>dsfield.c</file>
-               <file>dsmethod.c</file>
-               <file>dsmthdat.c</file>
-               <file>dsobject.c</file>
-               <file>dsopcode.c</file>
-               <file>dsutils.c</file>
-               <file>dswexec.c</file>
-               <file>dswload.c</file>
-               <file>dswscope.c</file>
-               <file>dswstate.c</file>
-       </directory>
-       <directory name="events">
-               <file>evevent.c</file>
-               <file>evmisc.c</file>
-               <file>evregion.c</file>
-               <file>evrgnini.c</file>
-               <file>evsci.c</file>
-               <file>evxface.c</file>
-               <file>evxfevnt.c</file>
-               <file>evxfregn.c</file>
-       </directory>
-       <directory name="executer">
-               <file>amconfig.c</file>
-               <file>amconvrt.c</file>
-               <file>amcreate.c</file>
-               <file>amdump.c</file>
-               <file>amdyadic.c</file>
-               <file>amfield.c</file>
-               <file>amfldio.c</file>
-               <file>ammisc.c</file>
-               <file>ammonad.c</file>
-               <file>ammutex.c</file>
-               <file>amnames.c</file>
-               <file>amprep.c</file>
-               <file>amregion.c</file>
-               <file>amresnte.c</file>
-               <file>amresolv.c</file>
-               <file>amresop.c</file>
-               <file>amstore.c</file>
-               <file>amstoren.c</file>
-               <file>amstorob.c</file>
-               <file>amsystem.c</file>
-               <file>amutils.c</file>
-               <file>amxface.c</file>
-       </directory>
-       <directory name="hardware">
-               <file>hwacpi.c</file>
-               <file>hwgpe.c</file>
-               <file>hwregs.c</file>
-               <file>hwsleep.c</file>
-               <file>hwtimer.c</file>
-       </directory>
-       <directory name="namespace">
-               <file>nsaccess.c</file>
-               <file>nsalloc.c</file>
-               <file>nseval.c</file>
-               <file>nsinit.c</file>
-               <file>nsload.c</file>
-               <file>nsnames.c</file>
-               <file>nsobject.c</file>
-               <file>nssearch.c</file>
-               <file>nsutils.c</file>
-               <file>nswalk.c</file>
-               <file>nsxfname.c</file>
-               <file>nsxfobj.c</file>
-       </directory>
-       <directory name="ospm">
-               <directory name="busmgr">
-                       <file>bm.c</file>
-                       <file>bmnotify.c</file>
-                       <file>bmpm.c</file>
-                       <file>bmpower.c</file>
-                       <file>bmrequest.c</file>
-                       <file>bmsearch.c</file>
-                       <file>bmutils.c</file>
-                       <file>bmxface.c</file>
-               </directory>
-               <file>acpienum.c</file>
-               <file>acpisys.c</file>
-               <file>bn.c</file>
-               <file>fdo.c</file>
-               <file>osl.c</file>
-               <file>pdo.c</file>
-       </directory>
-       <directory name="parser">
-               <file>psargs.c</file>
-               <file>psopcode.c</file>
-               <file>psparse.c</file>
-               <file>psscope.c</file>
-               <file>pstree.c</file>
-               <file>psutils.c</file>
-               <file>pswalk.c</file>
-               <file>psxface.c</file>
-       </directory>
-       <directory name="resource">
-               <file>rsaddr.c</file>
-               <file>rscalc.c</file>
-               <file>rscreate.c</file>
-               <file>rsdump.c</file>
-               <file>rsio.c</file>
-               <file>rsirq.c</file>
-               <file>rslist.c</file>
-               <file>rsmemory.c</file>
-               <file>rsmisc.c</file>
-               <file>rsutils.c</file>
-               <file>rsxface.c</file>
-       </directory>
-       <directory name="tables">
-               <file>tbconvrt.c</file>
-               <file>tbget.c</file>
-               <file>tbinstal.c</file>
-               <file>tbutils.c</file>
-               <file>tbxface.c</file>
-               <file>tbxfroot.c</file>
-       </directory>
-       <directory name="utils">
-               <file>cmalloc.c</file>
-               <file>cmclib.c</file>
-               <file>cmcopy.c</file>
-               <file>cmdebug.c</file>
-               <file>cmdelete.c</file>
-               <file>cmeval.c</file>
-               <file>cmglobal.c</file>
-               <file>cminit.c</file>
-               <file>cmobject.c</file>
-               <file>cmutils.c</file>
-               <file>cmxface.c</file>
-       </directory>
-       <file>acpi.rc</file>
-       <directory name="include">
-               <pch>acpi.h</pch>
-       </directory>
-</module>
diff --git a/reactos/drivers/bus/acpi/acpi.rc b/reactos/drivers/bus/acpi/acpi.rc
deleted file mode 100644 (file)
index 41b0006..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/* $Id$ */
-
-#define REACTOS_VERSION_DLL
-#define REACTOS_STR_FILE_DESCRIPTION   "ReactOS ACPI Driver\0"
-#define REACTOS_STR_INTERNAL_NAME      "acpi\0"
-#define REACTOS_STR_ORIGINAL_FILENAME  "acpi.sys\0"
-#include <reactos/version.rc>
diff --git a/reactos/drivers/bus/acpi/changed.txt b/reactos/drivers/bus/acpi/changed.txt
deleted file mode 100644 (file)
index 5717751..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-Changes to ACPI CA
-------------------
-
-+ = Added
-- = Removed
-* = Altered
-
-+ include/platform/acwin.h
-+ include/platform/types.h
-- ospm/ac_adapter/*
-- ospm/battery/*
-- ospm/button/*
-- ospm/ec/*
-- ospm/include/* (except bm.h)
-- ospm/processor/*
-- ospm/system/*
-- ospm/thermal/*
-- ospm/busmgr/bm_module.c
-- ospm/busmgr/bm_proc.c
-- ospm/busmgr/bm_symbols.c
-- ospm/busmgr/Makefile
diff --git a/reactos/drivers/bus/acpi/dispatcher/dsfield.c b/reactos/drivers/bus/acpi/dispatcher/dsfield.c
deleted file mode 100644 (file)
index 191a9e9..0000000
+++ /dev/null
@@ -1,418 +0,0 @@
-/******************************************************************************
- *
- * Module Name: dsfield - Dispatcher field routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dsfield")
-
-
-/*
- * Field flags: Bits 00 - 03 : Access_type (Any_acc, Byte_acc, etc.)
- *                   04      : Lock_rule (1 == Lock)
- *                   05 - 06 : Update_rule
- */
-
-#define FIELD_ACCESS_TYPE_MASK      0x0F
-#define FIELD_LOCK_RULE_MASK        0x10
-#define FIELD_UPDATE_RULE_MASK      0x60
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_create_field
- *
- * PARAMETERS:  Op              - Op containing the Field definition and args
- *              Region_node - Object for the containing Operation Region
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new field in the specified operation region
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_create_field (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_NAMESPACE_NODE     *region_node,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_AML_ERROR;
-       ACPI_PARSE_OBJECT       *arg;
-       ACPI_NAMESPACE_NODE     *node;
-       u8                      field_flags;
-       u8                      access_attribute = 0;
-       u32                     field_bit_position = 0;
-
-
-       /* First arg is the name of the parent Op_region */
-
-       arg = op->value.arg;
-       if (!region_node) {
-               status = acpi_ns_lookup (walk_state->scope_info, arg->value.name,
-                                ACPI_TYPE_REGION, IMODE_EXECUTE,
-                                NS_SEARCH_PARENT, walk_state,
-                                &region_node);
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       /* Second arg is the field flags */
-
-       arg = arg->next;
-       field_flags = (u8) arg->value.integer;
-
-       /* Each remaining arg is a Named Field */
-
-       arg = arg->next;
-       while (arg) {
-               switch (arg->opcode) {
-               case AML_RESERVEDFIELD_OP:
-
-                       field_bit_position += arg->value.size;
-                       break;
-
-
-               case AML_ACCESSFIELD_OP:
-
-                       /*
-                        * Get a new Access_type and Access_attribute for all
-                        * entries (until end or another Access_as keyword)
-                        */
-
-                       access_attribute = (u8) arg->value.integer;
-                       field_flags     = (u8)
-                                         ((field_flags & FIELD_ACCESS_TYPE_MASK) ||
-                                         ((u8) (arg->value.integer >> 8)));
-                       break;
-
-
-               case AML_NAMEDFIELD_OP:
-
-                       status = acpi_ns_lookup (walk_state->scope_info,
-                                         (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)arg)->name,
-                                         INTERNAL_TYPE_DEF_FIELD,
-                                         IMODE_LOAD_PASS1,
-                                         NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
-                                         NULL, &node);
-
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       /*
-                        * Initialize an object for the new Node that is on
-                        * the object stack
-                        */
-
-                       status = acpi_aml_prep_def_field_value (node, region_node, field_flags,
-                                         access_attribute, field_bit_position, arg->value.size);
-
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       /* Keep track of bit position for *next* field */
-
-                       field_bit_position += arg->value.size;
-                       break;
-               }
-
-               arg = arg->next;
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_create_bank_field
- *
- * PARAMETERS:  Op              - Op containing the Field definition and args
- *              Region_node - Object for the containing Operation Region
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new bank field in the specified operation region
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_create_bank_field (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_NAMESPACE_NODE     *region_node,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_AML_ERROR;
-       ACPI_PARSE_OBJECT       *arg;
-       ACPI_NAMESPACE_NODE     *register_node;
-       ACPI_NAMESPACE_NODE     *node;
-       u32                     bank_value;
-       u8                      field_flags;
-       u8                      access_attribute = 0;
-       u32                     field_bit_position = 0;
-
-
-       /* First arg is the name of the parent Op_region */
-
-       arg = op->value.arg;
-       if (!region_node) {
-               status = acpi_ns_lookup (walk_state->scope_info, arg->value.name,
-                                ACPI_TYPE_REGION, IMODE_EXECUTE,
-                                NS_SEARCH_PARENT, walk_state,
-                                &region_node);
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       /* Second arg is the Bank Register */
-
-       arg = arg->next;
-
-       status = acpi_ns_lookup (walk_state->scope_info, arg->value.string,
-                        INTERNAL_TYPE_BANK_FIELD_DEFN,
-                        IMODE_LOAD_PASS1,
-                        NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
-                        NULL, &register_node);
-
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Third arg is the Bank_value */
-
-       arg = arg->next;
-       bank_value = arg->value.integer;
-
-
-       /* Next arg is the field flags */
-
-       arg = arg->next;
-       field_flags = (u8) arg->value.integer;
-
-       /* Each remaining arg is a Named Field */
-
-       arg = arg->next;
-       while (arg) {
-               switch (arg->opcode) {
-               case AML_RESERVEDFIELD_OP:
-
-                       field_bit_position += arg->value.size;
-                       break;
-
-
-               case AML_ACCESSFIELD_OP:
-
-                       /*
-                        * Get a new Access_type and Access_attribute for
-                        * all entries (until end or another Access_as keyword)
-                        */
-
-                       access_attribute = (u8) arg->value.integer;
-                       field_flags     = (u8)
-                                         ((field_flags & FIELD_ACCESS_TYPE_MASK) ||
-                                         ((u8) (arg->value.integer >> 8)));
-                       break;
-
-
-               case AML_NAMEDFIELD_OP:
-
-                       status = acpi_ns_lookup (walk_state->scope_info,
-                                         (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)arg)->name,
-                                         INTERNAL_TYPE_DEF_FIELD,
-                                         IMODE_LOAD_PASS1,
-                                         NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
-                                         NULL, &node);
-
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       /*
-                        * Initialize an object for the new Node that is on
-                        * the object stack
-                        */
-
-                       status = acpi_aml_prep_bank_field_value (node, region_node, register_node,
-                                         bank_value, field_flags, access_attribute,
-                                         field_bit_position, arg->value.size);
-
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       /* Keep track of bit position for the *next* field */
-
-                       field_bit_position += arg->value.size;
-                       break;
-
-               }
-
-               arg = arg->next;
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_create_index_field
- *
- * PARAMETERS:  Op              - Op containing the Field definition and args
- *              Region_node - Object for the containing Operation Region
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new index field in the specified operation region
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_create_index_field (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_HANDLE             region_node,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_PARSE_OBJECT       *arg;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_NAMESPACE_NODE     *index_register_node;
-       ACPI_NAMESPACE_NODE     *data_register_node;
-       u8                      field_flags;
-       u8                      access_attribute = 0;
-       u32                     field_bit_position = 0;
-
-
-       arg = op->value.arg;
-
-       /* First arg is the name of the Index register */
-
-       status = acpi_ns_lookup (walk_state->scope_info, arg->value.string,
-                        ACPI_TYPE_ANY, IMODE_LOAD_PASS1,
-                        NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
-                        NULL, &index_register_node);
-
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Second arg is the data register */
-
-       arg = arg->next;
-
-       status = acpi_ns_lookup (walk_state->scope_info, arg->value.string,
-                        INTERNAL_TYPE_INDEX_FIELD_DEFN,
-                        IMODE_LOAD_PASS1,
-                        NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
-                        NULL, &data_register_node);
-
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /* Next arg is the field flags */
-
-       arg = arg->next;
-       field_flags = (u8) arg->value.integer;
-
-
-       /* Each remaining arg is a Named Field */
-
-       arg = arg->next;
-       while (arg) {
-               switch (arg->opcode) {
-               case AML_RESERVEDFIELD_OP:
-
-                       field_bit_position += arg->value.size;
-                       break;
-
-
-               case AML_ACCESSFIELD_OP:
-
-                       /*
-                        * Get a new Access_type and Access_attribute for all
-                        * entries (until end or another Access_as keyword)
-                        */
-
-                       access_attribute = (u8) arg->value.integer;
-                       field_flags     = (u8)
-                                          ((field_flags & FIELD_ACCESS_TYPE_MASK) ||
-                                          ((u8) (arg->value.integer >> 8)));
-                       break;
-
-
-               case AML_NAMEDFIELD_OP:
-
-                       status = acpi_ns_lookup (walk_state->scope_info,
-                                        (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)arg)->name,
-                                        INTERNAL_TYPE_INDEX_FIELD,
-                                        IMODE_LOAD_PASS1,
-                                        NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
-                                        NULL, &node);
-
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       /*
-                        * Initialize an object for the new Node that is on
-                        * the object stack
-                        */
-
-                       status = acpi_aml_prep_index_field_value (node, index_register_node, data_register_node,
-                                         field_flags, access_attribute,
-                                         field_bit_position, arg->value.size);
-
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       /* Keep track of bit position for the *next* field */
-
-                       field_bit_position += arg->value.size;
-                       break;
-
-
-               default:
-
-                       status = AE_AML_ERROR;
-                       break;
-               }
-
-               arg = arg->next;
-       }
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/dispatcher/dsmethod.c b/reactos/drivers/bus/acpi/dispatcher/dsmethod.c
deleted file mode 100644 (file)
index 70b2349..0000000
+++ /dev/null
@@ -1,489 +0,0 @@
-/******************************************************************************
- *
- * Module Name: dsmethod - Parser/Interpreter interface - control method parsing
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dsmethod")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_parse_method
- *
- * PARAMETERS:  Obj_handle      - Node of the method
- *              Level           - Current nesting level
- *              Context         - Points to a method counter
- *              Return_value    - Not used
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Call the parser and parse the AML that is
- *              associated with the method.
- *
- * MUTEX:       Assumes parser is locked
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_parse_method (
-       ACPI_HANDLE             obj_handle)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_PARSE_OBJECT       *op;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_OWNER_ID           owner_id;
-
-
-       /* Parameter Validation */
-
-       if (!obj_handle) {
-               return (AE_NULL_ENTRY);
-       }
-
-
-       /* Extract the method object from the method Node */
-
-       node = (ACPI_NAMESPACE_NODE *) obj_handle;
-       obj_desc = node->object;
-       if (!obj_desc) {
-               return (AE_NULL_OBJECT);
-       }
-
-        /* Create a mutex for the method if there is a concurrency limit */
-
-       if ((obj_desc->method.concurrency != INFINITE_CONCURRENCY) &&
-               (!obj_desc->method.semaphore)) {
-               status = acpi_os_create_semaphore (obj_desc->method.concurrency,
-                                  obj_desc->method.concurrency,
-                                  &obj_desc->method.semaphore);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       /*
-        * Allocate a new parser op to be the root of the parsed
-        * method tree
-        */
-       op = acpi_ps_alloc_op (AML_METHOD_OP);
-       if (!op) {
-               return (AE_NO_MEMORY);
-       }
-
-       /* Init new op with the method name and pointer back to the Node */
-
-       acpi_ps_set_name (op, node->name);
-       op->node = node;
-
-
-       /*
-        * Parse the method, first pass
-        *
-        * The first pass load is
-        * where newly declared named objects are
-        * added into the namespace.  Actual evaluation of
-        * the named objects (what would be called a "second
-        * pass") happens during the actual execution of the
-        * method so that operands to the named objects can
-        * take on dynamic run-time values.
-        */
-       status = acpi_ps_parse_aml (op, obj_desc->method.pcode,
-                          obj_desc->method.pcode_length,
-                          ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE,
-                          node, NULL, NULL,
-                          acpi_ds_load1_begin_op, acpi_ds_load1_end_op);
-
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Get a new Owner_id for objects created by this method */
-
-       owner_id = acpi_cm_allocate_owner_id (OWNER_TYPE_METHOD);
-       obj_desc->method.owning_id = owner_id;
-
-       /* Install the parsed tree in the method object */
-       /* TBD: [Restructure] Obsolete field? */
-
-       acpi_ps_delete_parse_tree (op);
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_begin_method_execution
- *
- * PARAMETERS:  Method_node         - Node of the method
- *              Obj_desc            - The method object
- *              Calling_method_node - Caller of this method (if non-null)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Prepare a method for execution.  Parses the method if necessary,
- *              increments the thread count, and waits at the method semaphore
- *              for clearance to execute.
- *
- * MUTEX:       Locks/unlocks parser.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_begin_method_execution (
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_NAMESPACE_NODE     *calling_method_node)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (!method_node) {
-               return (AE_NULL_ENTRY);
-       }
-
-
-       /*
-        * If there is a concurrency limit on this method, we need to
-        * obtain a unit from the method semaphore.
-        */
-       if (obj_desc->method.semaphore) {
-               /*
-                * Allow recursive method calls, up to the reentrancy/concurrency
-                * limit imposed by the SERIALIZED rule and the Sync_level method
-                * parameter.
-                *
-                * The point of this code is to avoid permanently blocking a
-                * thread that is making recursive method calls.
-                */
-               if (method_node == calling_method_node) {
-                       if (obj_desc->method.thread_count >= obj_desc->method.concurrency) {
-                               return (AE_AML_METHOD_LIMIT);
-                       }
-               }
-
-               /*
-                * Get a unit from the method semaphore. This releases the
-                * interpreter if we block
-                */
-               status = acpi_aml_system_wait_semaphore (obj_desc->method.semaphore,
-                                WAIT_FOREVER);
-       }
-
-
-       /*
-        * Increment the method parse tree thread count since it has been
-        * reentered one more time (even if it is the same thread)
-        */
-       obj_desc->method.thread_count++;
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_call_control_method
- *
- * PARAMETERS:  Walk_state          - Current state of the walk
- *              Op                  - Current Op to be walked
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Transfer execution to a called control method
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_call_control_method (
-       ACPI_WALK_LIST          *walk_list,
-       ACPI_WALK_STATE         *this_walk_state,
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *method_node;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_WALK_STATE         *next_walk_state;
-       ACPI_PARSE_STATE        *parser_state;
-       u32                     i;
-
-
-       /*
-        * Get the namespace entry for the control method we are about to call
-        */
-       method_node = this_walk_state->method_call_node;
-       if (!method_node) {
-               return (AE_NULL_ENTRY);
-       }
-
-       obj_desc = acpi_ns_get_attached_object (method_node);
-       if (!obj_desc) {
-               return (AE_NULL_OBJECT);
-       }
-
-
-       /* Init for new method, wait on concurrency semaphore */
-
-       status = acpi_ds_begin_method_execution (method_node, obj_desc,
-                         this_walk_state->method_node);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Create and initialize a new parser state */
-
-       parser_state = acpi_ps_create_state (obj_desc->method.pcode,
-                          obj_desc->method.pcode_length);
-       if (!parser_state) {
-               return (AE_NO_MEMORY);
-       }
-
-       acpi_ps_init_scope (parser_state, NULL);
-       parser_state->start_node = method_node;
-
-
-       /* Create a new state for the preempting walk */
-
-       next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id,
-                         NULL, obj_desc, walk_list);
-       if (!next_walk_state) {
-               /* TBD: delete parser state */
-
-               return (AE_NO_MEMORY);
-       }
-
-       next_walk_state->walk_type          = WALK_METHOD;
-       next_walk_state->method_node        = method_node;
-       next_walk_state->parser_state       = parser_state;
-       next_walk_state->parse_flags        = this_walk_state->parse_flags;
-       next_walk_state->descending_callback = this_walk_state->descending_callback;
-       next_walk_state->ascending_callback = this_walk_state->ascending_callback;
-
-       /* The Next_op of the Next_walk will be the beginning of the method */
-       /* TBD: [Restructure] -- obsolete? */
-
-       next_walk_state->next_op = NULL;
-
-       /* Open a new scope */
-
-       status = acpi_ds_scope_stack_push (method_node,
-                          ACPI_TYPE_METHOD, next_walk_state);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-
-       /*
-        * Initialize the arguments for the method.  The resolved
-        * arguments were put on the previous walk state's operand
-        * stack.  Operands on the previous walk state stack always
-        * start at index 0.
-        */
-       status = acpi_ds_method_data_init_args (&this_walk_state->operands[0],
-                        this_walk_state->num_operands,
-                        next_walk_state);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-
-       /* Create and init a Root Node */
-
-       op = acpi_ps_alloc_op (AML_SCOPE_OP);
-       if (!op) {
-               return (AE_NO_MEMORY);
-       }
-
-       status = acpi_ps_parse_aml (op, obj_desc->method.pcode,
-                         obj_desc->method.pcode_length,
-                         ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE,
-                         method_node, NULL, NULL,
-                         acpi_ds_load1_begin_op, acpi_ds_load1_end_op);
-       acpi_ps_delete_parse_tree (op);
-
-
-       /*
-        * Delete the operands on the previous walkstate operand stack
-        * (they were copied to new objects)
-        */
-       for (i = 0; i < obj_desc->method.param_count; i++) {
-               acpi_cm_remove_reference (this_walk_state->operands [i]);
-               this_walk_state->operands [i] = NULL;
-       }
-
-       /* Clear the operand stack */
-
-       this_walk_state->num_operands = 0;
-
-
-       return (AE_OK);
-
-
-       /* On error, we must delete the new walk state */
-
-cleanup:
-       acpi_ds_terminate_control_method (next_walk_state);
-       acpi_ds_delete_walk_state (next_walk_state);
-       return (status);
-
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_restart_control_method
- *
- * PARAMETERS:  Walk_state          - State of the method when it was preempted
- *              Op                  - Pointer to new current op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Restart a method that was preempted
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_restart_control_method (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     *return_desc)
-{
-       ACPI_STATUS             status;
-
-
-       if (return_desc) {
-               if (walk_state->return_used) {
-                       /*
-                        * Get the return value (if any) from the previous method.
-                        * NULL if no return value
-                        */
-                       status = acpi_ds_result_push (return_desc, walk_state);
-                       if (ACPI_FAILURE (status)) {
-                               acpi_cm_remove_reference (return_desc);
-                               return (status);
-                       }
-               }
-
-               else {
-                       /*
-                        * Delete the return value if it will not be used by the
-                        * calling method
-                        */
-                       acpi_cm_remove_reference (return_desc);
-               }
-
-       }
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_terminate_control_method
- *
- * PARAMETERS:  Walk_state          - State of the method
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Terminate a control method.  Delete everything that the method
- *              created, delete all locals and arguments, and delete the parse
- *              tree if requested.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_terminate_control_method (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_NAMESPACE_NODE     *method_node;
-
-
-       /* The method object should be stored in the walk state */
-
-       obj_desc = walk_state->method_desc;
-       if (!obj_desc) {
-               return (AE_OK);
-       }
-
-       /* Delete all arguments and locals */
-
-       acpi_ds_method_data_delete_all (walk_state);
-
-       /*
-        * Lock the parser while we terminate this method.
-        * If this is the last thread executing the method,
-        * we have additional cleanup to perform
-        */
-       acpi_cm_acquire_mutex (ACPI_MTX_PARSER);
-
-
-       /* Signal completion of the execution of this method if necessary */
-
-       if (walk_state->method_desc->method.semaphore) {
-               status = acpi_os_signal_semaphore (
-                                walk_state->method_desc->method.semaphore, 1);
-       }
-
-       /* Decrement the thread count on the method parse tree */
-
-       walk_state->method_desc->method.thread_count--;
-       if (!walk_state->method_desc->method.thread_count) {
-               /*
-                * There are no more threads executing this method.  Perform
-                * additional cleanup.
-                *
-                * The method Node is stored in the walk state
-                */
-               method_node = walk_state->method_node;
-
-               /*
-                * Delete any namespace entries created immediately underneath
-                * the method
-                */
-               acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-               if (method_node->child) {
-                       acpi_ns_delete_namespace_subtree (method_node);
-               }
-
-               /*
-                * Delete any namespace entries created anywhere else within
-                * the namespace
-                */
-               acpi_ns_delete_namespace_by_owner (walk_state->method_desc->method.owning_id);
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       }
-
-       acpi_cm_release_mutex (ACPI_MTX_PARSER);
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/dispatcher/dsmthdat.c b/reactos/drivers/bus/acpi/dispatcher/dsmthdat.c
deleted file mode 100644 (file)
index f513040..0000000
+++ /dev/null
@@ -1,687 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: dsmthdat - control method arguments and local variables
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dsmthdat")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_method_data_init
- *
- * PARAMETERS:  Walk_state          - Current walk state object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initialize the data structures that hold the method's arguments
- *              and locals.  The data struct is an array of NTEs for each.
- *              This allows Ref_of and De_ref_of to work properly for these
- *              special data types.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_method_data_init (
-       ACPI_WALK_STATE         *walk_state)
-{
-       u32                     i;
-
-
-       /*
-        * Walk_state fields are initialized to zero by the
-        * Acpi_cm_callocate().
-        *
-        * An Node is assigned to each argument and local so
-        * that Ref_of() can return a pointer to the Node.
-        */
-
-       /* Init the method arguments */
-
-       for (i = 0; i < MTH_NUM_ARGS; i++) {
-               MOVE_UNALIGNED32_TO_32 (&walk_state->arguments[i].name,
-                                NAMEOF_ARG_NTE);
-               walk_state->arguments[i].name      |= (i << 24);
-               walk_state->arguments[i].data_type  = ACPI_DESC_TYPE_NAMED;
-               walk_state->arguments[i].type       = ACPI_TYPE_ANY;
-               walk_state->arguments[i].flags      = ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_ARG;
-       }
-
-       /* Init the method locals */
-
-       for (i = 0; i < MTH_NUM_LOCALS; i++) {
-               MOVE_UNALIGNED32_TO_32 (&walk_state->local_variables[i].name,
-                                NAMEOF_LOCAL_NTE);
-
-               walk_state->local_variables[i].name  |= (i << 24);
-               walk_state->local_variables[i].data_type = ACPI_DESC_TYPE_NAMED;
-               walk_state->local_variables[i].type   = ACPI_TYPE_ANY;
-               walk_state->local_variables[i].flags  = ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_LOCAL;
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_method_data_delete_all
- *
- * PARAMETERS:  Walk_state          - Current walk state object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Delete method locals and arguments.  Arguments are only
- *              deleted if this method was called from another method.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_method_data_delete_all (
-       ACPI_WALK_STATE         *walk_state)
-{
-       u32                     index;
-       ACPI_OPERAND_OBJECT     *object;
-
-
-       /* Delete the locals */
-
-       for (index = 0; index < MTH_NUM_LOCALS; index++) {
-               object = walk_state->local_variables[index].object;
-               if (object) {
-                       /* Remove first */
-
-                       walk_state->local_variables[index].object = NULL;
-
-                       /* Was given a ref when stored */
-
-                       acpi_cm_remove_reference (object);
-          }
-       }
-
-
-       /* Delete the arguments */
-
-       for (index = 0; index < MTH_NUM_ARGS; index++) {
-               object = walk_state->arguments[index].object;
-               if (object) {
-                       /* Remove first */
-
-                       walk_state->arguments[index].object = NULL;
-
-                        /* Was given a ref when stored */
-
-                       acpi_cm_remove_reference (object);
-               }
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_method_data_init_args
- *
- * PARAMETERS:  *Params         - Pointer to a parameter list for the method
- *              Max_param_count - The arg count for this method
- *              Walk_state      - Current walk state object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initialize arguments for a method
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_method_data_init_args (
-       ACPI_OPERAND_OBJECT     **params,
-       u32                     max_param_count,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       u32                     mindex;
-       u32                     pindex;
-
-
-       if (!params) {
-               return (AE_OK);
-       }
-
-       /* Copy passed parameters into the new method stack frame  */
-
-       for (pindex = mindex = 0;
-               (mindex < MTH_NUM_ARGS) && (pindex < max_param_count);
-               mindex++) {
-               if (params[pindex]) {
-                       /*
-                        * A valid parameter.
-                        * Set the current method argument to the
-                        * Params[Pindex++] argument object descriptor
-                        */
-                       status = acpi_ds_store_object_to_local (AML_ARG_OP, mindex,
-                                        params[pindex], walk_state);
-                       if (ACPI_FAILURE (status)) {
-                               break;
-                       }
-
-                       pindex++;
-               }
-
-               else {
-                       break;
-               }
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_method_data_get_entry
- *
- * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP
- *              Index               - Which local_var or argument to get
- *              Entry               - Pointer to where a pointer to the stack
- *                                    entry is returned.
- *              Walk_state          - Current walk state object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get the address of the object entry given by Opcode:Index
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_method_data_get_entry (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     ***entry)
-{
-
-
-       /*
-        * Get the requested object.
-        * The stack "Opcode" is either a Local_variable or an Argument
-        */
-
-       switch (opcode) {
-
-       case AML_LOCAL_OP:
-
-               if (index > MTH_MAX_LOCAL) {
-                       return (AE_BAD_PARAMETER);
-               }
-
-               *entry = (ACPI_OPERAND_OBJECT  **)
-                                &walk_state->local_variables[index].object;
-               break;
-
-
-       case AML_ARG_OP:
-
-               if (index > MTH_MAX_ARG) {
-                       return (AE_BAD_PARAMETER);
-               }
-
-               *entry = (ACPI_OPERAND_OBJECT  **)
-                                &walk_state->arguments[index].object;
-               break;
-
-
-       default:
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_method_data_set_entry
- *
- * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP
- *              Index               - Which local_var or argument to get
- *              Object              - Object to be inserted into the stack entry
- *              Walk_state          - Current walk state object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Insert an object onto the method stack at entry Opcode:Index.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_method_data_set_entry (
-       u16                     opcode,
-       u32                     index,
-       ACPI_OPERAND_OBJECT     *object,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     **entry;
-
-
-       /* Get a pointer to the stack entry to set */
-
-       status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Increment ref count so object can't be deleted while installed */
-
-       acpi_cm_add_reference (object);
-
-       /* Install the object into the stack entry */
-
-       *entry = object;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_method_data_get_type
- *
- * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP
- *              Index               - Which local_var or argument whose type
- *                                      to get
- *              Walk_state          - Current walk state object
- *
- * RETURN:      Data type of selected Arg or Local
- *              Used only in Exec_monadic2()/Type_op.
- *
- ******************************************************************************/
-
-OBJECT_TYPE_INTERNAL
-acpi_ds_method_data_get_type (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     **entry;
-       ACPI_OPERAND_OBJECT     *object;
-
-
-       /* Get a pointer to the requested stack entry */
-
-       status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry);
-       if (ACPI_FAILURE (status)) {
-               return ((ACPI_TYPE_NOT_FOUND));
-       }
-
-       /* Get the object from the method stack */
-
-       object = *entry;
-
-       /* Get the object type */
-
-       if (!object) {
-               /* Any == 0 => "uninitialized" -- see spec 15.2.3.5.2.28 */
-               return (ACPI_TYPE_ANY);
-       }
-
-       return (object->common.type);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_method_data_get_node
- *
- * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP
- *              Index               - Which local_var or argument whose type
- *                                      to get
- *              Walk_state          - Current walk state object
- *
- * RETURN:      Get the Node associated with a local or arg.
- *
- ******************************************************************************/
-
-ACPI_NAMESPACE_NODE *
-acpi_ds_method_data_get_node (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_NAMESPACE_NODE     *node = NULL;
-
-
-       switch (opcode) {
-
-       case AML_LOCAL_OP:
-
-               if (index > MTH_MAX_LOCAL) {
-                       return (node);
-               }
-
-               node =  &walk_state->local_variables[index];
-               break;
-
-
-       case AML_ARG_OP:
-
-               if (index > MTH_MAX_ARG) {
-                       return (node);
-               }
-
-               node = &walk_state->arguments[index];
-               break;
-
-
-       default:
-               break;
-       }
-
-
-       return (node);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_method_data_get_value
- *
- * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP
- *              Index               - Which local_var or argument to get
- *              Walk_state          - Current walk state object
- *              *Dest_desc          - Ptr to Descriptor into which selected Arg
- *                                    or Local value should be copied
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Retrieve value of selected Arg or Local from the method frame
- *              at the current top of the method stack.
- *              Used only in Acpi_aml_resolve_to_value().
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_method_data_get_value (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **dest_desc)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     **entry;
-       ACPI_OPERAND_OBJECT     *object;
-
-
-       /* Validate the object descriptor */
-
-       if (!dest_desc) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Get a pointer to the requested method stack entry */
-
-       status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Get the object from the method stack */
-
-       object = *entry;
-
-
-       /* Examine the returned object, it must be valid. */
-
-       if (!object) {
-               /*
-                * Index points to uninitialized object stack value.
-                * This means that either 1) The expected argument was
-                * not passed to the method, or 2) A local variable
-                * was referenced by the method (via the ASL)
-                * before it was initialized.  Either case is an error.
-                */
-
-               switch (opcode) {
-               case AML_ARG_OP:
-
-                       return (AE_AML_UNINITIALIZED_ARG);
-                       break;
-
-               case AML_LOCAL_OP:
-
-                       return (AE_AML_UNINITIALIZED_LOCAL);
-                       break;
-               }
-       }
-
-
-       /*
-        * Index points to initialized and valid object stack value.
-        * Return an additional reference to the object
-        */
-
-       *dest_desc = object;
-       acpi_cm_add_reference (object);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_method_data_delete_value
- *
- * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP
- *              Index               - Which local_var or argument to delete
- *              Walk_state          - Current walk state object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Delete the entry at Opcode:Index on the method stack.  Inserts
- *              a null into the stack slot after the object is deleted.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_method_data_delete_value (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     **entry;
-       ACPI_OPERAND_OBJECT     *object;
-
-
-       /* Get a pointer to the requested entry */
-
-       status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Get the current entry in this slot k */
-
-       object = *entry;
-
-       /*
-        * Undefine the Arg or Local by setting its descriptor
-        * pointer to NULL. Locals/Args can contain both
-        * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs
-        */
-       *entry = NULL;
-
-
-       if ((object) &&
-               (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_INTERNAL))) {
-               /*
-                * There is a valid object in this slot
-                * Decrement the reference count by one to balance the
-                * increment when the object was stored in the slot.
-                */
-               acpi_cm_remove_reference (object);
-       }
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_store_object_to_local
- *
- * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP
- *              Index               - Which local_var or argument to set
- *              Src_desc            - Value to be stored
- *              Walk_state          - Current walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Store a value in an Arg or Local.  The Src_desc is installed
- *              as the new value for the Arg or Local and the reference count
- *              for Src_desc is incremented.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_store_object_to_local (
-       u16                     opcode,
-       u32                     index,
-       ACPI_OPERAND_OBJECT     *src_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     **entry;
-
-
-       /* Parameter validation */
-
-       if (!src_desc) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Get a pointer to the requested method stack entry */
-
-       status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       if (*entry == src_desc) {
-               goto cleanup;
-       }
-
-
-       /*
-        * If there is an object already in this slot, we either
-        * have to delete it, or if this is an argument and there
-        * is an object reference stored there, we have to do
-        * an indirect store!
-        */
-
-       if (*entry) {
-               /*
-                * Check for an indirect store if an argument
-                * contains an object reference (stored as an Node).
-                * We don't allow this automatic dereferencing for
-                * locals, since a store to a local should overwrite
-                * anything there, including an object reference.
-                *
-                * If both Arg0 and Local0 contain Ref_of (Local4):
-                *
-                * Store (1, Arg0)             - Causes indirect store to local4
-                * Store (1, Local0)           - Stores 1 in local0, overwriting
-                *                                  the reference to local4
-                * Store (1, De_refof (Local0)) - Causes indirect store to local4
-                *
-                * Weird, but true.
-                */
-
-               if ((opcode == AML_ARG_OP) &&
-                       (VALID_DESCRIPTOR_TYPE (*entry, ACPI_DESC_TYPE_NAMED))) {
-                       /* Detach an existing object from the Node */
-
-                       acpi_ns_detach_object ((ACPI_NAMESPACE_NODE *) *entry);
-
-                       /*
-                        * Store this object into the Node
-                        * (do the indirect store)
-                        */
-                       status = acpi_ns_attach_object ((ACPI_NAMESPACE_NODE *) *entry, src_desc,
-                                          src_desc->common.type);
-                       return (status);
-               }
-
-
-#ifdef ACPI_ENABLE_IMPLICIT_CONVERSION
-               /*
-                * Perform "Implicit conversion" of the new object to the type of the
-                * existing object
-                */
-               status = acpi_aml_convert_to_target_type ((*entry)->common.type, &src_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-#endif
-
-               /*
-                * Delete the existing object
-                * before storing the new one
-                */
-               acpi_ds_method_data_delete_value (opcode, index, walk_state);
-       }
-
-
-       /*
-        * Install the Obj_stack descriptor (*Src_desc) into
-        * the descriptor for the Arg or Local.
-        * Install the new object in the stack entry
-        * (increments the object reference count by one)
-        */
-       status = acpi_ds_method_data_set_entry (opcode, index, src_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       /* Normal exit */
-
-       return (AE_OK);
-
-
-       /* Error exit */
-
-cleanup:
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/dispatcher/dsobject.c b/reactos/drivers/bus/acpi/dispatcher/dsobject.c
deleted file mode 100644 (file)
index 29f18fa..0000000
+++ /dev/null
@@ -1,636 +0,0 @@
-/******************************************************************************
- *
- * Module Name: dsobject - Dispatcher object management routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dsobject")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_init_one_object
- *
- * PARAMETERS:  Obj_handle      - Node
- *              Level           - Current nesting level
- *              Context         - Points to a init info struct
- *              Return_value    - Not used
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Callback from Acpi_walk_namespace. Invoked for every object
- *              within the  namespace.
- *
- *              Currently, the only objects that require initialization are:
- *              1) Methods
- *              2) Op Regions
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_init_one_object (
-       ACPI_HANDLE             obj_handle,
-       u32                     level,
-       void                    *context,
-       void                    **return_value)
-{
-       OBJECT_TYPE_INTERNAL    type;
-       ACPI_STATUS             status;
-       ACPI_INIT_WALK_INFO     *info = (ACPI_INIT_WALK_INFO *) context;
-       u8                      table_revision;
-
-
-       info->object_count++;
-       table_revision = info->table_desc->pointer->revision;
-
-       /*
-        * We are only interested in objects owned by the table that
-        * was just loaded
-        */
-
-       if (((ACPI_NAMESPACE_NODE *) obj_handle)->owner_id !=
-                       info->table_desc->table_id) {
-               return (AE_OK);
-       }
-
-
-       /* And even then, we are only interested in a few object types */
-
-       type = acpi_ns_get_type (obj_handle);
-
-       switch (type) {
-
-       case ACPI_TYPE_REGION:
-
-               acpi_ds_initialize_region (obj_handle);
-
-               info->op_region_count++;
-               break;
-
-
-       case ACPI_TYPE_METHOD:
-
-               info->method_count++;
-
-
-               /*
-                * Set the execution data width (32 or 64) based upon the
-                * revision number of the parent ACPI table.
-                */
-
-               if (table_revision == 1) {
-                       ((ACPI_NAMESPACE_NODE *)obj_handle)->flags |= ANOBJ_DATA_WIDTH_32;
-               }
-
-               /*
-                * Always parse methods to detect errors, we may delete
-                * the parse tree below
-                */
-
-               status = acpi_ds_parse_method (obj_handle);
-
-               /* TBD: [Errors] what do we do with an error? */
-
-               if (ACPI_FAILURE (status)) {
-                       break;
-               }
-
-               /*
-                * Delete the parse tree.  We simple re-parse the method
-                * for every execution since there isn't much overhead
-                */
-               acpi_ns_delete_namespace_subtree (obj_handle);
-               break;
-
-       default:
-               break;
-       }
-
-       /*
-        * We ignore errors from above, and always return OK, since
-        * we don't want to abort the walk on a single error.
-        */
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_initialize_objects
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Walk the entire namespace and perform any necessary
- *              initialization on the objects found therein
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_initialize_objects (
-       ACPI_TABLE_DESC         *table_desc,
-       ACPI_NAMESPACE_NODE     *start_node)
-{
-       ACPI_STATUS             status;
-       ACPI_INIT_WALK_INFO     info;
-
-
-       info.method_count   = 0;
-       info.op_region_count = 0;
-       info.object_count   = 0;
-       info.table_desc     = table_desc;
-
-
-       /* Walk entire namespace from the supplied root */
-
-       status = acpi_walk_namespace (ACPI_TYPE_ANY, start_node,
-                         ACPI_UINT32_MAX, acpi_ds_init_one_object,
-                         &info, NULL);
-
-       return (AE_OK);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_init_object_from_op
- *
- * PARAMETERS:  Op              - Parser op used to init the internal object
- *              Opcode          - AML opcode associated with the object
- *              Obj_desc        - Namespace object to be initialized
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initialize a namespace object from a parser Op and its
- *              associated arguments.  The namespace object is a more compact
- *              representation of the Op and its arguments.
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_init_object_from_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       u16                     opcode,
-       ACPI_OPERAND_OBJECT     **obj_desc)
-{
-       ACPI_STATUS             status;
-       ACPI_PARSE_OBJECT       *arg;
-       ACPI_PARSE2_OBJECT      *byte_list;
-       ACPI_OPERAND_OBJECT     *arg_desc;
-       ACPI_OPCODE_INFO        *op_info;
-
-
-       op_info = acpi_ps_get_opcode_info (opcode);
-       if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) {
-               /* Unknown opcode */
-
-               return (AE_TYPE);
-       }
-
-
-       /* Get and prepare the first argument */
-
-       switch ((*obj_desc)->common.type) {
-       case ACPI_TYPE_BUFFER:
-
-               /* First arg is a number */
-
-               acpi_ds_create_operand (walk_state, op->value.arg, 0);
-               arg_desc = walk_state->operands [walk_state->num_operands - 1];
-               acpi_ds_obj_stack_pop (1, walk_state);
-
-               /* Resolve the object (could be an arg or local) */
-
-               status = acpi_aml_resolve_to_value (&arg_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       acpi_cm_remove_reference (arg_desc);
-                       return (status);
-               }
-
-               /* We are expecting a number */
-
-               if (arg_desc->common.type != ACPI_TYPE_INTEGER) {
-                       acpi_cm_remove_reference (arg_desc);
-                       return (AE_TYPE);
-               }
-
-               /* Get the value, delete the internal object */
-
-               (*obj_desc)->buffer.length = (u32) arg_desc->integer.value;
-               acpi_cm_remove_reference (arg_desc);
-
-               /* Allocate the buffer */
-
-               if ((*obj_desc)->buffer.length == 0) {
-                       (*obj_desc)->buffer.pointer = NULL;
-                       REPORT_WARNING (("Buffer created with zero length in AML\n"));
-                       break;
-               }
-
-               else {
-                       (*obj_desc)->buffer.pointer =
-                                         acpi_cm_callocate ((*obj_desc)->buffer.length);
-
-                       if (!(*obj_desc)->buffer.pointer) {
-                               return (AE_NO_MEMORY);
-                       }
-               }
-
-               /*
-                * Second arg is the buffer data (optional)
-                * Byte_list can be either individual bytes or a
-                * string initializer!
-                */
-
-               /* skip first arg */
-               arg = op->value.arg;
-               byte_list = (ACPI_PARSE2_OBJECT *) arg->next;
-               if (byte_list) {
-                       if (byte_list->opcode != AML_BYTELIST_OP) {
-                               return (AE_TYPE);
-                       }
-
-                       MEMCPY ((*obj_desc)->buffer.pointer, byte_list->data,
-                                       (*obj_desc)->buffer.length);
-               }
-
-               break;
-
-
-       case ACPI_TYPE_PACKAGE:
-
-               /*
-                * When called, an internal package object has already
-                *  been built and is pointed to by *Obj_desc.
-                *  Acpi_ds_build_internal_object build another internal
-                *  package object, so remove reference to the original
-                *  so that it is deleted.  Error checking is done
-                *  within the remove reference function.
-                */
-               acpi_cm_remove_reference(*obj_desc);
-
-               status = acpi_ds_build_internal_object (walk_state, op, obj_desc);
-               break;
-
-       case ACPI_TYPE_INTEGER:
-               (*obj_desc)->integer.value = op->value.integer;
-               break;
-
-
-       case ACPI_TYPE_STRING:
-               (*obj_desc)->string.pointer = op->value.string;
-               (*obj_desc)->string.length = STRLEN (op->value.string);
-               break;
-
-
-       case ACPI_TYPE_METHOD:
-               break;
-
-
-       case INTERNAL_TYPE_REFERENCE:
-
-               switch (ACPI_GET_OP_CLASS (op_info)) {
-               case OPTYPE_LOCAL_VARIABLE:
-
-                       /* Split the opcode into a base opcode + offset */
-
-                       (*obj_desc)->reference.opcode = AML_LOCAL_OP;
-                       (*obj_desc)->reference.offset = opcode - AML_LOCAL_OP;
-                       break;
-
-               case OPTYPE_METHOD_ARGUMENT:
-
-                       /* Split the opcode into a base opcode + offset */
-
-                       (*obj_desc)->reference.opcode = AML_ARG_OP;
-                       (*obj_desc)->reference.offset = opcode - AML_ARG_OP;
-                       break;
-
-               default: /* Constants, Literals, etc.. */
-
-                       if (op->opcode == AML_NAMEPATH_OP) {
-                               /* Node was saved in Op */
-
-                               (*obj_desc)->reference.node = op->node;
-                       }
-
-                       (*obj_desc)->reference.opcode = opcode;
-                       break;
-               }
-
-               break;
-
-
-       default:
-
-               break;
-       }
-
-       return (AE_OK);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_build_internal_simple_obj
- *
- * PARAMETERS:  Op              - Parser object to be translated
- *              Obj_desc_ptr    - Where the ACPI internal object is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Translate a parser Op object to the equivalent namespace object
- *              Simple objects are any objects other than a package object!
- *
- ****************************************************************************/
-
-static ACPI_STATUS
-acpi_ds_build_internal_simple_obj (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_OPERAND_OBJECT     **obj_desc_ptr)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       OBJECT_TYPE_INTERNAL    type;
-       ACPI_STATUS             status;
-       u32                     length;
-       char                    *name;
-
-
-       if (op->opcode == AML_NAMEPATH_OP) {
-               /*
-                * This is an object reference.  If The name was
-                * previously looked up in the NS, it is stored in this op.
-                * Otherwise, go ahead and look it up now
-                */
-
-               if (!op->node) {
-                       status = acpi_ns_lookup (walk_state->scope_info,
-                                         op->value.string, ACPI_TYPE_ANY,
-                                         IMODE_EXECUTE,
-                                         NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE,
-                                         NULL,
-                                         (ACPI_NAMESPACE_NODE **)&(op->node));
-
-                       if (ACPI_FAILURE (status)) {
-                               if (status == AE_NOT_FOUND) {
-                                       name = NULL;
-                                       acpi_ns_externalize_name (ACPI_UINT32_MAX, op->value.string, &length, &name);
-
-                                       if (name) {
-                                               REPORT_WARNING (("Reference %s at AML %X not found\n",
-                                                                name, op->aml_offset));
-                                               acpi_cm_free (name);
-                                       }
-                                       else {
-                                               REPORT_WARNING (("Reference %s at AML %X not found\n",
-                                                                  op->value.string, op->aml_offset));
-                                       }
-                                       *obj_desc_ptr = NULL;
-                               }
-
-                               else {
-                                       return (status);
-                               }
-                       }
-               }
-
-               /*
-                * The reference will be a Reference
-                * TBD: [Restructure] unless we really need a separate
-                *  type of INTERNAL_TYPE_REFERENCE change
-                *  Acpi_ds_map_opcode_to_data_type to handle this case
-                */
-               type = INTERNAL_TYPE_REFERENCE;
-       }
-       else {
-               type = acpi_ds_map_opcode_to_data_type (op->opcode, NULL);
-       }
-
-
-       /* Create and init the internal ACPI object */
-
-       obj_desc = acpi_cm_create_internal_object (type);
-       if (!obj_desc) {
-               return (AE_NO_MEMORY);
-       }
-
-       status = acpi_ds_init_object_from_op (walk_state, op,
-                        op->opcode, &obj_desc);
-
-       if (ACPI_FAILURE (status)) {
-               acpi_cm_remove_reference (obj_desc);
-               return (status);
-       }
-
-       *obj_desc_ptr = obj_desc;
-
-       return (AE_OK);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_build_internal_package_obj
- *
- * PARAMETERS:  Op              - Parser object to be translated
- *              Obj_desc_ptr    - Where the ACPI internal object is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Translate a parser Op package object to the equivalent
- *              namespace object
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_build_internal_package_obj (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_OPERAND_OBJECT     **obj_desc_ptr)
-{
-       ACPI_PARSE_OBJECT       *arg;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status = AE_OK;
-
-
-       obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_PACKAGE);
-       if (!obj_desc) {
-               return (AE_NO_MEMORY);
-       }
-
-       /* The first argument must be the package length */
-
-       arg = op->value.arg;
-       obj_desc->package.count = arg->value.integer;
-
-       /*
-        * Allocate the array of pointers (ptrs to the
-        * individual objects) Add an extra pointer slot so
-        * that the list is always null terminated.
-        */
-
-       obj_desc->package.elements =
-                        acpi_cm_callocate ((obj_desc->package.count + 1) *
-                        sizeof (void *));
-
-       if (!obj_desc->package.elements) {
-               /* Package vector allocation failure   */
-
-               REPORT_ERROR (("Ds_build_internal_package_obj: Package vector allocation failure\n"));
-
-               acpi_cm_delete_object_desc (obj_desc);
-               return (AE_NO_MEMORY);
-       }
-
-       obj_desc->package.next_element = obj_desc->package.elements;
-
-       /*
-        * Now init the elements of the package
-        */
-
-       arg = arg->next;
-       while (arg) {
-               if (arg->opcode == AML_PACKAGE_OP) {
-                       status = acpi_ds_build_internal_package_obj (walk_state, arg,
-                                         obj_desc->package.next_element);
-               }
-
-               else {
-                       status = acpi_ds_build_internal_simple_obj (walk_state, arg,
-                                         obj_desc->package.next_element);
-               }
-
-               obj_desc->package.next_element++;
-               arg = arg->next;
-       }
-
-       *obj_desc_ptr = obj_desc;
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_build_internal_object
- *
- * PARAMETERS:  Op              - Parser object to be translated
- *              Obj_desc_ptr    - Where the ACPI internal object is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Translate a parser Op object to the equivalent namespace
- *              object
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_build_internal_object (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_OPERAND_OBJECT     **obj_desc_ptr)
-{
-       ACPI_STATUS             status;
-
-
-       if (op->opcode == AML_PACKAGE_OP) {
-               status = acpi_ds_build_internal_package_obj (walk_state, op,
-                                 obj_desc_ptr);
-       }
-
-       else {
-               status = acpi_ds_build_internal_simple_obj (walk_state, op,
-                                 obj_desc_ptr);
-       }
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_create_node
- *
- * PARAMETERS:  Op              - Parser object to be translated
- *              Obj_desc_ptr    - Where the ACPI internal object is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION:
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_create_node (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       if (!op->value.arg) {
-               /* No arguments, there is nothing to do */
-
-               return (AE_OK);
-       }
-
-
-       /* Build an internal object for the argument(s) */
-
-       status = acpi_ds_build_internal_object (walk_state,
-                        op->value.arg, &obj_desc);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /* Re-type the object according to it's argument */
-
-       node->type = obj_desc->common.type;
-
-       /* Init obj */
-
-       status = acpi_ns_attach_object ((ACPI_HANDLE) node, obj_desc,
-                          (u8) node->type);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       return (status);
-
-
-cleanup:
-
-       acpi_cm_remove_reference (obj_desc);
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/dispatcher/dsopcode.c b/reactos/drivers/bus/acpi/dispatcher/dsopcode.c
deleted file mode 100644 (file)
index 4a68ef8..0000000
+++ /dev/null
@@ -1,868 +0,0 @@
-/******************************************************************************
- *
- * Module Name: dsopcode - Dispatcher Op Region support and handling of
- *                         "control" opcodes
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dsopcode")
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_get_field_unit_arguments
- *
- * PARAMETERS:  Obj_desc        - A valid Field_unit object
- *
- * RETURN:      Status.
- *
- * DESCRIPTION: Get Field_unit Buffer and Index. This implements the late
- *              evaluation of these field attributes.
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_get_field_unit_arguments (
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-       ACPI_OPERAND_OBJECT     *extra_desc;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_PARSE_OBJECT       *op;
-       ACPI_PARSE_OBJECT       *field_op;
-       ACPI_STATUS             status;
-       ACPI_TABLE_DESC         *table_desc;
-
-
-       if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
-               return (AE_OK);
-       }
-
-
-       /* Get the AML pointer (method object) and Field_unit node */
-
-       extra_desc = obj_desc->field_unit.extra;
-       node = obj_desc->field_unit.node;
-
-       /*
-        * Allocate a new parser op to be the root of the parsed
-        * Op_region tree
-        */
-
-       op = acpi_ps_alloc_op (AML_SCOPE_OP);
-       if (!op) {
-               return (AE_NO_MEMORY);
-       }
-
-       /* Save the Node for use in Acpi_ps_parse_aml */
-
-       op->node = acpi_ns_get_parent_object (node);
-
-       /* Get a handle to the parent ACPI table */
-
-       status = acpi_tb_handle_to_object (node->owner_id, &table_desc);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Pass1: Parse the entire Field_unit declaration */
-
-       status = acpi_ps_parse_aml (op, extra_desc->extra.pcode,
-                         extra_desc->extra.pcode_length, 0,
-                         NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op);
-       if (ACPI_FAILURE (status)) {
-               acpi_ps_delete_parse_tree (op);
-               return (status);
-       }
-
-
-       /* Get and init the actual Fiel_unit_op created above */
-
-       field_op = op->value.arg;
-       op->node = node;
-
-
-       field_op = op->value.arg;
-       field_op->node = node;
-       acpi_ps_delete_parse_tree (op);
-
-       /* Acpi_evaluate the address and length arguments for the Op_region */
-
-       op = acpi_ps_alloc_op (AML_SCOPE_OP);
-       if (!op) {
-               return (AE_NO_MEMORY);
-       }
-
-       op->node = acpi_ns_get_parent_object (node);
-
-       status = acpi_ps_parse_aml (op, extra_desc->extra.pcode,
-                         extra_desc->extra.pcode_length,
-                         ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE,
-                         NULL /*Method_desc*/, NULL, NULL,
-                         acpi_ds_exec_begin_op, acpi_ds_exec_end_op);
-       /* All done with the parse tree, delete it */
-
-       acpi_ps_delete_parse_tree (op);
-
-
-       /*
-        * The pseudo-method object is no longer needed since the region is
-        * now initialized
-        */
-       acpi_cm_remove_reference (obj_desc->field_unit.extra);
-       obj_desc->field_unit.extra = NULL;
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_get_region_arguments
- *
- * PARAMETERS:  Obj_desc        - A valid region object
- *
- * RETURN:      Status.
- *
- * DESCRIPTION: Get region address and length.  This implements the late
- *              evaluation of these region attributes.
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_get_region_arguments (
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-       ACPI_OPERAND_OBJECT     *extra_desc = NULL;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_PARSE_OBJECT       *op;
-       ACPI_PARSE_OBJECT       *region_op;
-       ACPI_STATUS             status;
-       ACPI_TABLE_DESC         *table_desc;
-
-
-       if (obj_desc->region.flags & AOPOBJ_DATA_VALID) {
-               return (AE_OK);
-       }
-
-
-       /* Get the AML pointer (method object) and region node */
-
-       extra_desc = obj_desc->region.extra;
-       node = obj_desc->region.node;
-
-       /*
-        * Allocate a new parser op to be the root of the parsed
-        * Op_region tree
-        */
-
-       op = acpi_ps_alloc_op (AML_SCOPE_OP);
-       if (!op) {
-               return (AE_NO_MEMORY);
-       }
-
-       /* Save the Node for use in Acpi_ps_parse_aml */
-
-       op->node = acpi_ns_get_parent_object (node);
-
-       /* Get a handle to the parent ACPI table */
-
-       status = acpi_tb_handle_to_object (node->owner_id, &table_desc);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Parse the entire Op_region declaration, creating a parse tree */
-
-       status = acpi_ps_parse_aml (op, extra_desc->extra.pcode,
-                         extra_desc->extra.pcode_length, 0,
-                         NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op);
-
-       if (ACPI_FAILURE (status)) {
-               acpi_ps_delete_parse_tree (op);
-               return (status);
-       }
-
-
-       /* Get and init the actual Region_op created above */
-
-       region_op = op->value.arg;
-       op->node = node;
-
-
-       region_op = op->value.arg;
-       region_op->node = node;
-       acpi_ps_delete_parse_tree (op);
-
-       /* Acpi_evaluate the address and length arguments for the Op_region */
-
-       op = acpi_ps_alloc_op (AML_SCOPE_OP);
-       if (!op) {
-               return (AE_NO_MEMORY);
-       }
-
-       op->node = acpi_ns_get_parent_object (node);
-
-       status = acpi_ps_parse_aml (op, extra_desc->extra.pcode,
-                         extra_desc->extra.pcode_length,
-                         ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE,
-                         NULL /*Method_desc*/, NULL, NULL,
-                         acpi_ds_exec_begin_op, acpi_ds_exec_end_op);
-
-       /* All done with the parse tree, delete it */
-
-       acpi_ps_delete_parse_tree (op);
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_initialize_region
- *
- * PARAMETERS:  Op              - A valid region Op object
- *
- * RETURN:      Status
- *
- * DESCRIPTION:
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_initialize_region (
-       ACPI_HANDLE             obj_handle)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status;
-
-
-       obj_desc = acpi_ns_get_attached_object (obj_handle);
-
-       /* Namespace is NOT locked */
-
-       status = acpi_ev_initialize_region (obj_desc, FALSE);
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_eval_field_unit_operands
- *
- * PARAMETERS:  Op              - A valid Field_unit Op object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get Field_unit Buffer and Index
- *              Called from Acpi_ds_exec_end_op during Field_unit parse tree walk
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_eval_field_unit_operands (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *field_desc;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_PARSE_OBJECT       *next_op;
-       u32                     offset;
-       u32                     bit_offset;
-       u16                     bit_count;
-
-
-       ACPI_OPERAND_OBJECT     *res_desc = NULL;
-       ACPI_OPERAND_OBJECT     *cnt_desc = NULL;
-       ACPI_OPERAND_OBJECT     *off_desc = NULL;
-       ACPI_OPERAND_OBJECT     *src_desc = NULL;
-       u32                     num_operands = 3;
-
-
-       /*
-        * This is where we evaluate the address and length fields of the Op_field_unit declaration
-        */
-
-       node =  op->node;
-
-       /* Next_op points to the op that holds the Buffer */
-       next_op = op->value.arg;
-
-       /* Acpi_evaluate/create the address and length operands */
-
-       status = acpi_ds_create_operands (walk_state, next_op);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       field_desc = acpi_ns_get_attached_object (node);
-       if (!field_desc) {
-               return (AE_NOT_EXIST);
-       }
-
-
-       /* Resolve the operands */
-
-       status = acpi_aml_resolve_operands (op->opcode, WALK_OPERANDS, walk_state);
-
-       /* Get the operands */
-
-       status |= acpi_ds_obj_stack_pop_object (&res_desc, walk_state);
-       if (AML_CREATE_FIELD_OP == op->opcode) {
-               num_operands = 4;
-               status |= acpi_ds_obj_stack_pop_object (&cnt_desc, walk_state);
-       }
-
-       status |= acpi_ds_obj_stack_pop_object (&off_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&src_desc, walk_state);
-
-       if (ACPI_FAILURE (status)) {
-               /* Invalid parameters on object stack  */
-
-               goto cleanup;
-       }
-
-
-       offset = (u32) off_desc->integer.value;
-
-
-       /*
-        * If Res_desc is a Name, it will be a direct name pointer after
-        * Acpi_aml_resolve_operands()
-        */
-
-       if (!VALID_DESCRIPTOR_TYPE (res_desc, ACPI_DESC_TYPE_NAMED)) {
-               status = AE_AML_OPERAND_TYPE;
-               goto cleanup;
-       }
-
-
-       /*
-        * Setup the Bit offsets and counts, according to the opcode
-        */
-
-       switch (op->opcode) {
-
-       /* Def_create_bit_field */
-
-       case AML_BIT_FIELD_OP:
-
-               /* Offset is in bits, Field is a bit */
-
-               bit_offset = offset;
-               bit_count = 1;
-               break;
-
-
-       /* Def_create_byte_field */
-
-       case AML_BYTE_FIELD_OP:
-
-               /* Offset is in bytes, field is a byte */
-
-               bit_offset = 8 * offset;
-               bit_count = 8;
-               break;
-
-
-       /* Def_create_word_field */
-
-       case AML_WORD_FIELD_OP:
-
-               /* Offset is in bytes, field is a word */
-
-               bit_offset = 8 * offset;
-               bit_count = 16;
-               break;
-
-
-       /* Def_create_dWord_field */
-
-       case AML_DWORD_FIELD_OP:
-
-               /* Offset is in bytes, field is a dword */
-
-               bit_offset = 8 * offset;
-               bit_count = 32;
-               break;
-
-
-       /* Def_create_field */
-
-       case AML_CREATE_FIELD_OP:
-
-               /* Offset is in bits, count is in bits */
-
-               bit_offset = offset;
-               bit_count = (u16) cnt_desc->integer.value;
-               break;
-
-
-       default:
-
-               status = AE_AML_BAD_OPCODE;
-               goto cleanup;
-       }
-
-
-       /*
-        * Setup field according to the object type
-        */
-
-       switch (src_desc->common.type) {
-
-       /* Source_buff :=  Term_arg=>Buffer */
-
-       case ACPI_TYPE_BUFFER:
-
-               if (bit_offset + (u32) bit_count >
-                       (8 * (u32) src_desc->buffer.length)) {
-                       status = AE_AML_BUFFER_LIMIT;
-                       goto cleanup;
-               }
-
-
-               /* Construct the remainder of the field object */
-
-               field_desc->field_unit.access     = (u8) ACCESS_ANY_ACC;
-               field_desc->field_unit.lock_rule  = (u8) GLOCK_NEVER_LOCK;
-               field_desc->field_unit.update_rule = (u8) UPDATE_PRESERVE;
-               field_desc->field_unit.length     = bit_count;
-               field_desc->field_unit.bit_offset = (u8) (bit_offset % 8);
-               field_desc->field_unit.offset     = DIV_8 (bit_offset);
-               field_desc->field_unit.container  = src_desc;
-
-               /* Reference count for Src_desc inherits Field_desc count */
-
-               src_desc->common.reference_count = (u16) (src_desc->common.reference_count +
-                                  field_desc->common.reference_count);
-
-               break;
-
-
-       /* Improper object type */
-
-       default:
-
-
-
-               status = AE_AML_OPERAND_TYPE;
-               goto cleanup;
-       }
-
-
-       if (AML_CREATE_FIELD_OP == op->opcode) {
-               /* Delete object descriptor unique to Create_field */
-
-               acpi_cm_remove_reference (cnt_desc);
-               cnt_desc = NULL;
-       }
-
-
-cleanup:
-
-       /* Always delete the operands */
-
-       acpi_cm_remove_reference (off_desc);
-       acpi_cm_remove_reference (src_desc);
-
-       if (AML_CREATE_FIELD_OP == op->opcode) {
-               acpi_cm_remove_reference (cnt_desc);
-       }
-
-       /* On failure, delete the result descriptor */
-
-       if (ACPI_FAILURE (status)) {
-               acpi_cm_remove_reference (res_desc); /* Result descriptor */
-       }
-
-       else {
-               /* Now the address and length are valid for this op_field_unit */
-
-               field_desc->field_unit.flags |= AOPOBJ_DATA_VALID;
-       }
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_eval_region_operands
- *
- * PARAMETERS:  Op              - A valid region Op object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get region address and length
- *              Called from Acpi_ds_exec_end_op during Op_region parse tree walk
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_eval_region_operands (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *operand_desc;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_PARSE_OBJECT       *next_op;
-
-
-       /*
-        * This is where we evaluate the address and length fields of the Op_region declaration
-        */
-
-       node =  op->node;
-
-       /* Next_op points to the op that holds the Space_iD */
-       next_op = op->value.arg;
-
-       /* Next_op points to address op */
-       next_op = next_op->next;
-
-       /* Acpi_evaluate/create the address and length operands */
-
-       status = acpi_ds_create_operands (walk_state, next_op);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Resolve the length and address operands to numbers */
-
-       status = acpi_aml_resolve_operands (op->opcode, WALK_OPERANDS, walk_state);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       obj_desc = acpi_ns_get_attached_object (node);
-       if (!obj_desc) {
-               return (AE_NOT_EXIST);
-       }
-
-       /*
-        * Get the length operand and save it
-        * (at Top of stack)
-        */
-       operand_desc = walk_state->operands[walk_state->num_operands - 1];
-
-       obj_desc->region.length = (u32) operand_desc->integer.value;
-       acpi_cm_remove_reference (operand_desc);
-
-       /*
-        * Get the address and save it
-        * (at top of stack - 1)
-        */
-       operand_desc = walk_state->operands[walk_state->num_operands - 2];
-
-       obj_desc->region.address = (ACPI_PHYSICAL_ADDRESS) operand_desc->integer.value;
-       acpi_cm_remove_reference (operand_desc);
-
-
-       /* Now the address and length are valid for this opregion */
-
-       obj_desc->region.flags |= AOPOBJ_DATA_VALID;
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_exec_begin_control_op
- *
- * PARAMETERS:  Walk_list       - The list that owns the walk stack
- *              Op              - The control Op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Handles all control ops encountered during control method
- *              execution.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_exec_begin_control_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_GENERIC_STATE      *control_state;
-
-
-       switch (op->opcode) {
-       case AML_IF_OP:
-       case AML_WHILE_OP:
-
-               /*
-                * IF/WHILE: Create a new control state to manage these
-                * constructs. We need to manage these as a stack, in order
-                * to handle nesting.
-                */
-
-               control_state = acpi_cm_create_control_state ();
-               if (!control_state) {
-                       status = AE_NO_MEMORY;
-                       break;
-               }
-
-               acpi_cm_push_generic_state (&walk_state->control_state, control_state);
-
-               /*
-                * Save a pointer to the predicate for multiple executions
-                * of a loop
-                */
-               walk_state->control_state->control.aml_predicate_start =
-                                walk_state->parser_state->aml - 1;
-                                /* TBD: can this be removed? */
-                                /*Acpi_ps_pkg_length_encoding_size (GET8 (Walk_state->Parser_state->Aml));*/
-               break;
-
-
-       case AML_ELSE_OP:
-
-               /* Predicate is in the state object */
-               /* If predicate is true, the IF was executed, ignore ELSE part */
-
-               if (walk_state->last_predicate) {
-                       status = AE_CTRL_TRUE;
-               }
-
-               break;
-
-
-       case AML_RETURN_OP:
-
-               break;
-
-
-       default:
-               break;
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_exec_end_control_op
- *
- * PARAMETERS:  Walk_list       - The list that owns the walk stack
- *              Op              - The control Op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Handles all control ops encountered during control method
- *              execution.
- *
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_exec_end_control_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_GENERIC_STATE      *control_state;
-
-
-       switch (op->opcode) {
-       case AML_IF_OP:
-
-               /*
-                * Save the result of the predicate in case there is an
-                * ELSE to come
-                */
-
-               walk_state->last_predicate =
-                               (u8) walk_state->control_state->common.value;
-
-               /*
-                * Pop the control state that was created at the start
-                * of the IF and free it
-                */
-
-               control_state =
-                               acpi_cm_pop_generic_state (&walk_state->control_state);
-
-               acpi_cm_delete_generic_state (control_state);
-
-               break;
-
-
-       case AML_ELSE_OP:
-
-               break;
-
-
-       case AML_WHILE_OP:
-
-               if (walk_state->control_state->common.value) {
-                       /* Predicate was true, go back and evaluate it again! */
-
-                       status = AE_CTRL_PENDING;
-               }
-
-
-               /* Pop this control state and free it */
-
-               control_state =
-                               acpi_cm_pop_generic_state (&walk_state->control_state);
-
-               walk_state->aml_last_while = control_state->control.aml_predicate_start;
-               acpi_cm_delete_generic_state (control_state);
-
-               break;
-
-
-       case AML_RETURN_OP:
-
-
-               /*
-                * One optional operand -- the return value
-                * It can be either an immediate operand or a result that
-                * has been bubbled up the tree
-                */
-               if (op->value.arg) {
-                       /* Return statement has an immediate operand */
-
-                       status = acpi_ds_create_operands (walk_state, op->value.arg);
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       /*
-                        * If value being returned is a Reference (such as
-                        * an arg or local), resolve it now because it may
-                        * cease to exist at the end of the method.
-                        */
-                       status = acpi_aml_resolve_to_value (&walk_state->operands [0], walk_state);
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       /*
-                        * Get the return value and save as the last result
-                        * value.  This is the only place where Walk_state->Return_desc
-                        * is set to anything other than zero!
-                        */
-
-                       walk_state->return_desc = walk_state->operands[0];
-               }
-
-               else if ((walk_state->results) &&
-                                (walk_state->results->results.num_results > 0)) {
-                       /*
-                        * The return value has come from a previous calculation.
-                        *
-                        * If value being returned is a Reference (such as
-                        * an arg or local), resolve it now because it may
-                        * cease to exist at the end of the method.
-                        *
-                        * Allow references created by the Index operator to return unchanged.
-                        */
-
-                       if (VALID_DESCRIPTOR_TYPE (walk_state->results->results.obj_desc [0], ACPI_DESC_TYPE_INTERNAL) &&
-                               ((walk_state->results->results.obj_desc [0])->common.type == INTERNAL_TYPE_REFERENCE) &&
-                               ((walk_state->results->results.obj_desc [0])->reference.opcode != AML_INDEX_OP)) {
-                                       status = acpi_aml_resolve_to_value (&walk_state->results->results.obj_desc [0], walk_state);
-                                       if (ACPI_FAILURE (status)) {
-                                               return (status);
-                                       }
-                       }
-
-                       walk_state->return_desc = walk_state->results->results.obj_desc [0];
-               }
-
-               else {
-                       /* No return operand */
-
-                       if (walk_state->num_operands) {
-                               acpi_cm_remove_reference (walk_state->operands [0]);
-                       }
-
-                       walk_state->operands [0]    = NULL;
-                       walk_state->num_operands    = 0;
-                       walk_state->return_desc     = NULL;
-               }
-
-
-               /* End the control method execution right now */
-               status = AE_CTRL_TERMINATE;
-               break;
-
-
-       case AML_NOOP_OP:
-
-               /* Just do nothing! */
-               break;
-
-
-       case AML_BREAK_POINT_OP:
-
-               /* Call up to the OS dependent layer to handle this */
-
-               acpi_os_breakpoint (NULL);
-
-               /* If it returns, we are done! */
-
-               break;
-
-
-       case AML_BREAK_OP:
-
-               /*
-                * As per the ACPI specification:
-                *      "The break operation causes the current package
-                *          execution to complete"
-                *      "Break -- Stop executing the current code package
-                *          at this point"
-                *
-                * Returning AE_FALSE here will cause termination of
-                * the current package, and execution will continue one
-                * level up, starting with the completion of the parent Op.
-                */
-
-               status = AE_CTRL_FALSE;
-               break;
-
-
-       default:
-
-               status = AE_AML_BAD_OPCODE;
-               break;
-       }
-
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/dispatcher/dsutils.c b/reactos/drivers/bus/acpi/dispatcher/dsutils.c
deleted file mode 100644 (file)
index c874694..0000000
+++ /dev/null
@@ -1,744 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: dsutils - Dispatcher utilities
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dsutils")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_is_result_used
- *
- * PARAMETERS:  Op
- *              Result_obj
- *              Walk_state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Check if a result object will be used by the parent
- *
- ******************************************************************************/
-
-u8
-acpi_ds_is_result_used (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPCODE_INFO        *parent_info;
-
-
-       /* Must have both an Op and a Result Object */
-
-       if (!op) {
-               return (TRUE);
-       }
-
-
-       /*
-        * If there is no parent, the result can't possibly be used!
-        * (An executing method typically has no parent, since each
-        * method is parsed separately)  However, a method that is
-        * invoked from another method has a parent.
-        */
-       if (!op->parent) {
-               return (FALSE);
-       }
-
-
-       /*
-        * Get info on the parent.  The root Op is AML_SCOPE
-        */
-
-       parent_info = acpi_ps_get_opcode_info (op->parent->opcode);
-       if (ACPI_GET_OP_TYPE (parent_info) != ACPI_OP_TYPE_OPCODE) {
-               return (FALSE);
-       }
-
-
-       /*
-        * Decide what to do with the result based on the parent.  If
-        * the parent opcode will not use the result, delete the object.
-        * Otherwise leave it as is, it will be deleted when it is used
-        * as an operand later.
-        */
-
-       switch (ACPI_GET_OP_CLASS (parent_info)) {
-       /*
-        * In these cases, the parent will never use the return object
-        */
-       case OPTYPE_CONTROL:        /* IF, ELSE, WHILE only */
-
-               switch (op->parent->opcode) {
-               case AML_RETURN_OP:
-
-                       /* Never delete the return value associated with a return opcode */
-
-                       return (TRUE);
-                       break;
-
-               case AML_IF_OP:
-               case AML_WHILE_OP:
-
-                       /*
-                        * If we are executing the predicate AND this is the predicate op,
-                        * we will use the return value!
-                        */
-
-                       if ((walk_state->control_state->common.state == CONTROL_PREDICATE_EXECUTING) &&
-                               (walk_state->control_state->control.predicate_op == op)) {
-                               return (TRUE);
-                       }
-
-                       break;
-               }
-
-
-               /* Fall through to not used case below */
-
-
-       case OPTYPE_NAMED_OBJECT:   /* Scope, method, etc. */
-
-               /*
-                * These opcodes allow Term_arg(s) as operands and therefore
-                * method calls.  The result is used.
-                */
-               if ((op->parent->opcode == AML_REGION_OP)       ||
-                       (op->parent->opcode == AML_CREATE_FIELD_OP) ||
-                       (op->parent->opcode == AML_BIT_FIELD_OP)    ||
-                       (op->parent->opcode == AML_BYTE_FIELD_OP)   ||
-                       (op->parent->opcode == AML_WORD_FIELD_OP)   ||
-                       (op->parent->opcode == AML_DWORD_FIELD_OP)  ||
-                       (op->parent->opcode == AML_QWORD_FIELD_OP)) {
-                       return (TRUE);
-               }
-
-               return (FALSE);
-               break;
-
-       /*
-        * In all other cases. the parent will actually use the return
-        * object, so keep it.
-        */
-       default:
-               break;
-       }
-
-       return (TRUE);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_delete_result_if_not_used
- *
- * PARAMETERS:  Op
- *              Result_obj
- *              Walk_state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Used after interpretation of an opcode.  If there is an internal
- *              result descriptor, check if the parent opcode will actually use
- *              this result.  If not, delete the result now so that it will
- *              not become orphaned.
- *
- ******************************************************************************/
-
-void
-acpi_ds_delete_result_if_not_used (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_OPERAND_OBJECT     *result_obj,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status;
-
-
-       if (!op) {
-               return;
-       }
-
-       if (!result_obj) {
-               return;
-       }
-
-
-       if (!acpi_ds_is_result_used (op, walk_state)) {
-               /*
-                * Must pop the result stack (Obj_desc should be equal
-                *  to Result_obj)
-                */
-
-               status = acpi_ds_result_pop (&obj_desc, walk_state);
-               if (ACPI_SUCCESS (status)) {
-                       acpi_cm_remove_reference (result_obj);
-               }
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_create_operand
- *
- * PARAMETERS:  Walk_state
- *              Arg
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Translate a parse tree object that is an argument to an AML
- *              opcode to the equivalent interpreter object.  This may include
- *              looking up a name or entering a new name into the internal
- *              namespace.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_create_operand (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *arg,
-       u32                     arg_index)
-{
-       ACPI_STATUS             status = AE_OK;
-       NATIVE_CHAR             *name_string;
-       u32                     name_length;
-       OBJECT_TYPE_INTERNAL    data_type;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_PARSE_OBJECT       *parent_op;
-       u16                     opcode;
-       u32                     flags = 0;
-       OPERATING_MODE          interpreter_mode;
-
-
-       /* A valid name must be looked up in the namespace */
-
-       if ((arg->opcode == AML_NAMEPATH_OP) &&
-               (arg->value.string)) {
-               /* Get the entire name string from the AML stream */
-
-               status = acpi_aml_get_name_string (ACPI_TYPE_ANY,
-                                  arg->value.buffer,
-                                  &name_string,
-                                  &name_length);
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /*
-                * All prefixes have been handled, and the name is
-                * in Name_string
-                */
-
-               /*
-                * Differentiate between a namespace "create" operation
-                * versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
-                * IMODE_EXECUTE) in order to support the creation of
-                * namespace objects during the execution of control methods.
-                */
-
-               parent_op = arg->parent;
-               if ((acpi_ps_is_node_op (parent_op->opcode)) &&
-                       (parent_op->opcode != AML_METHODCALL_OP) &&
-                       (parent_op->opcode != AML_REGION_OP) &&
-                       (parent_op->opcode != AML_NAMEPATH_OP)) {
-                       /* Enter name into namespace if not found */
-
-                       interpreter_mode = IMODE_LOAD_PASS2;
-               }
-
-               else {
-                       /* Return a failure if name not found */
-
-                       interpreter_mode = IMODE_EXECUTE;
-               }
-
-               status = acpi_ns_lookup (walk_state->scope_info, name_string,
-                                ACPI_TYPE_ANY, interpreter_mode,
-                                NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE,
-                                walk_state,
-                                (ACPI_NAMESPACE_NODE **) &obj_desc);
-
-               /* Free the namestring created above */
-
-               acpi_cm_free (name_string);
-
-               /*
-                * The only case where we pass through (ignore) a NOT_FOUND
-                * error is for the Cond_ref_of opcode.
-                */
-
-               if (status == AE_NOT_FOUND) {
-                       if (parent_op->opcode == AML_COND_REF_OF_OP) {
-                               /*
-                                * For the Conditional Reference op, it's OK if
-                                * the name is not found;  We just need a way to
-                                * indicate this to the interpreter, set the
-                                * object to the root
-                                */
-                               obj_desc = (ACPI_OPERAND_OBJECT *) acpi_gbl_root_node;
-                               status = AE_OK;
-                       }
-
-                       else {
-                               /*
-                                * We just plain didn't find it -- which is a
-                                * very serious error at this point
-                                */
-                               status = AE_AML_NAME_NOT_FOUND;
-                       }
-               }
-
-               /* Check status from the lookup */
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* Put the resulting object onto the current object stack */
-
-               status = acpi_ds_obj_stack_push (obj_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-               DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state));
-       }
-
-
-       else {
-               /* Check for null name case */
-
-               if (arg->opcode == AML_NAMEPATH_OP) {
-                       /*
-                        * If the name is null, this means that this is an
-                        * optional result parameter that was not specified
-                        * in the original ASL.  Create an Reference for a
-                        * placeholder
-                        */
-                       opcode = AML_ZERO_OP;       /* Has no arguments! */
-
-                       /*
-                        * TBD: [Investigate] anything else needed for the
-                        * zero op lvalue?
-                        */
-               }
-
-               else {
-                       opcode = arg->opcode;
-               }
-
-
-               /* Get the data type of the argument */
-
-               data_type = acpi_ds_map_opcode_to_data_type (opcode, &flags);
-               if (data_type == INTERNAL_TYPE_INVALID) {
-                       return (AE_NOT_IMPLEMENTED);
-               }
-
-               if (flags & OP_HAS_RETURN_VALUE) {
-                       DEBUGGER_EXEC (acpi_db_display_argument_object (walk_state->operands [walk_state->num_operands - 1], walk_state));
-
-                       /*
-                        * Use value that was already previously returned
-                        * by the evaluation of this argument
-                        */
-
-                       status = acpi_ds_result_pop_from_bottom (&obj_desc, walk_state);
-                       if (ACPI_FAILURE (status)) {
-                               /*
-                                * Only error is underflow, and this indicates
-                                * a missing or null operand!
-                                */
-                               return (status);
-                       }
-
-               }
-
-               else {
-                       /* Create an ACPI_INTERNAL_OBJECT for the argument */
-
-                       obj_desc = acpi_cm_create_internal_object (data_type);
-                       if (!obj_desc) {
-                               return (AE_NO_MEMORY);
-                       }
-
-                       /* Initialize the new object */
-
-                       status = acpi_ds_init_object_from_op (walk_state, arg,
-                                        opcode, &obj_desc);
-                       if (ACPI_FAILURE (status)) {
-                               acpi_cm_delete_object_desc (obj_desc);
-                               return (status);
-                       }
-          }
-
-               /* Put the operand object on the object stack */
-
-               status = acpi_ds_obj_stack_push (obj_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state));
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_create_operands
- *
- * PARAMETERS:  First_arg           - First argument of a parser argument tree
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert an operator's arguments from a parse tree format to
- *              namespace objects and place those argument object on the object
- *              stack in preparation for evaluation by the interpreter.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_create_operands (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *first_arg)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_PARSE_OBJECT       *arg;
-       u32                     arg_count = 0;
-
-
-       /* For all arguments in the list... */
-
-       arg = first_arg;
-       while (arg) {
-               status = acpi_ds_create_operand (walk_state, arg, arg_count);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               /* Move on to next argument, if any */
-
-               arg = arg->next;
-               arg_count++;
-       }
-
-       return (status);
-
-
-cleanup:
-       /*
-        * We must undo everything done above; meaning that we must
-        * pop everything off of the operand stack and delete those
-        * objects
-        */
-
-       acpi_ds_obj_stack_pop_and_delete (arg_count, walk_state);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_resolve_operands
- *
- * PARAMETERS:  Walk_state          - Current walk state with operands on stack
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Resolve all operands to their values.  Used to prepare
- *              arguments to a control method invocation (a call from one
- *              method to another.)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_resolve_operands (
-       ACPI_WALK_STATE         *walk_state)
-{
-       u32                     i;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /*
-        * Attempt to resolve each of the valid operands
-        * Method arguments are passed by value, not by reference
-        */
-
-       /*
-        * TBD: [Investigate] Note from previous parser:
-        *   Ref_of problem with Acpi_aml_resolve_to_value() conversion.
-        */
-
-       for (i = 0; i < walk_state->num_operands; i++) {
-               status = acpi_aml_resolve_to_value (&walk_state->operands[i], walk_state);
-               if (ACPI_FAILURE (status)) {
-                       break;
-               }
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_map_opcode_to_data_type
- *
- * PARAMETERS:  Opcode          - AML opcode to map
- *              Out_flags       - Additional info about the opcode
- *
- * RETURN:      The ACPI type associated with the opcode
- *
- * DESCRIPTION: Convert a raw AML opcode to the associated ACPI data type,
- *              if any.  If the opcode returns a value as part of the
- *              intepreter execution, a flag is returned in Out_flags.
- *
- ******************************************************************************/
-
-OBJECT_TYPE_INTERNAL
-acpi_ds_map_opcode_to_data_type (
-       u16                     opcode,
-       u32                     *out_flags)
-{
-       OBJECT_TYPE_INTERNAL    data_type = INTERNAL_TYPE_INVALID;
-       ACPI_OPCODE_INFO        *op_info;
-       u32                     flags = 0;
-
-
-       op_info = acpi_ps_get_opcode_info (opcode);
-       if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) {
-               /* Unknown opcode */
-
-               return (data_type);
-       }
-
-       switch (ACPI_GET_OP_CLASS (op_info)) {
-
-       case OPTYPE_LITERAL:
-
-               switch (opcode) {
-               case AML_BYTE_OP:
-               case AML_WORD_OP:
-               case AML_DWORD_OP:
-
-                       data_type = ACPI_TYPE_INTEGER;
-                       break;
-
-
-               case AML_STRING_OP:
-
-                       data_type = ACPI_TYPE_STRING;
-                       break;
-
-               case AML_NAMEPATH_OP:
-                       data_type = INTERNAL_TYPE_REFERENCE;
-                       break;
-
-               default:
-                       break;
-               }
-               break;
-
-
-       case OPTYPE_DATA_TERM:
-
-               switch (opcode) {
-               case AML_BUFFER_OP:
-
-                       data_type = ACPI_TYPE_BUFFER;
-                       break;
-
-               case AML_PACKAGE_OP:
-
-                       data_type = ACPI_TYPE_PACKAGE;
-                       break;
-
-               default:
-                       break;
-               }
-               break;
-
-
-       case OPTYPE_CONSTANT:
-       case OPTYPE_METHOD_ARGUMENT:
-       case OPTYPE_LOCAL_VARIABLE:
-
-               data_type = INTERNAL_TYPE_REFERENCE;
-               break;
-
-
-       case OPTYPE_MONADIC2:
-       case OPTYPE_MONADIC2_r:
-       case OPTYPE_DYADIC2:
-       case OPTYPE_DYADIC2_r:
-       case OPTYPE_DYADIC2_s:
-       case OPTYPE_INDEX:
-       case OPTYPE_MATCH:
-       case OPTYPE_RETURN:
-
-               flags = OP_HAS_RETURN_VALUE;
-               data_type = ACPI_TYPE_ANY;
-               break;
-
-       case OPTYPE_METHOD_CALL:
-
-               flags = OP_HAS_RETURN_VALUE;
-               data_type = ACPI_TYPE_METHOD;
-               break;
-
-
-       case OPTYPE_NAMED_OBJECT:
-
-               data_type = acpi_ds_map_named_opcode_to_data_type (opcode);
-               break;
-
-
-       case OPTYPE_DYADIC1:
-       case OPTYPE_CONTROL:
-
-               /* No mapping needed at this time */
-
-               break;
-
-
-       default:
-
-               break;
-       }
-
-       /* Return flags to caller if requested */
-
-       if (out_flags) {
-               *out_flags = flags;
-       }
-
-       return (data_type);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_map_named_opcode_to_data_type
- *
- * PARAMETERS:  Opcode              - The Named AML opcode to map
- *
- * RETURN:      The ACPI type associated with the named opcode
- *
- * DESCRIPTION: Convert a raw Named AML opcode to the associated data type.
- *              Named opcodes are a subsystem of the AML opcodes.
- *
- ******************************************************************************/
-
-OBJECT_TYPE_INTERNAL
-acpi_ds_map_named_opcode_to_data_type (
-       u16                     opcode)
-{
-       OBJECT_TYPE_INTERNAL    data_type;
-
-
-       /* Decode Opcode */
-
-       switch (opcode) {
-       case AML_SCOPE_OP:
-               data_type = INTERNAL_TYPE_SCOPE;
-               break;
-
-       case AML_DEVICE_OP:
-               data_type = ACPI_TYPE_DEVICE;
-               break;
-
-       case AML_THERMAL_ZONE_OP:
-               data_type = ACPI_TYPE_THERMAL;
-               break;
-
-       case AML_METHOD_OP:
-               data_type = ACPI_TYPE_METHOD;
-               break;
-
-       case AML_POWER_RES_OP:
-               data_type = ACPI_TYPE_POWER;
-               break;
-
-       case AML_PROCESSOR_OP:
-               data_type = ACPI_TYPE_PROCESSOR;
-               break;
-
-       case AML_DEF_FIELD_OP:                          /* Def_field_op */
-               data_type = INTERNAL_TYPE_DEF_FIELD_DEFN;
-               break;
-
-       case AML_INDEX_FIELD_OP:                        /* Index_field_op */
-               data_type = INTERNAL_TYPE_INDEX_FIELD_DEFN;
-               break;
-
-       case AML_BANK_FIELD_OP:                         /* Bank_field_op */
-               data_type = INTERNAL_TYPE_BANK_FIELD_DEFN;
-               break;
-
-       case AML_NAMEDFIELD_OP:                         /* NO CASE IN ORIGINAL  */
-               data_type = ACPI_TYPE_ANY;
-               break;
-
-       case AML_NAME_OP:                               /* Name_op - special code in original */
-       case AML_NAMEPATH_OP:
-               data_type = ACPI_TYPE_ANY;
-               break;
-
-       case AML_ALIAS_OP:
-               data_type = INTERNAL_TYPE_ALIAS;
-               break;
-
-       case AML_MUTEX_OP:
-               data_type = ACPI_TYPE_MUTEX;
-               break;
-
-       case AML_EVENT_OP:
-               data_type = ACPI_TYPE_EVENT;
-               break;
-
-       case AML_REGION_OP:
-               data_type = ACPI_TYPE_REGION;
-               break;
-
-
-       default:
-               data_type = ACPI_TYPE_ANY;
-               break;
-
-       }
-
-       return (data_type);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/dispatcher/dswexec.c b/reactos/drivers/bus/acpi/dispatcher/dswexec.c
deleted file mode 100644 (file)
index a712130..0000000
+++ /dev/null
@@ -1,646 +0,0 @@
-/******************************************************************************
- *
- * Module Name: dswexec - Dispatcher method execution callbacks;
- *                        dispatch to interpreter.
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dswexec")
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_get_predicate_value
- *
- * PARAMETERS:  Walk_state      - Current state of the parse tree walk
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get the result of a predicate evaluation
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_get_predicate_value (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       NATIVE_UINT             has_result_obj)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       walk_state->control_state->common.state = 0;
-
-       if (has_result_obj) {
-               status = acpi_ds_result_pop (&obj_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       else {
-               status = acpi_ds_create_operand (walk_state, op, 0);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               status = acpi_aml_resolve_to_value (&walk_state->operands [0], walk_state);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               obj_desc = walk_state->operands [0];
-       }
-
-       if (!obj_desc) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-
-       /*
-        * Result of predicate evaluation currently must
-        * be a number
-        */
-
-       if (obj_desc->common.type != ACPI_TYPE_INTEGER) {
-               status = AE_AML_OPERAND_TYPE;
-               goto cleanup;
-       }
-
-
-       /* Truncate the predicate to 32-bits if necessary */
-
-       acpi_aml_truncate_for32bit_table (obj_desc, walk_state);
-
-       /*
-        * Save the result of the predicate evaluation on
-        * the control stack
-        */
-
-       if (obj_desc->integer.value) {
-               walk_state->control_state->common.value = TRUE;
-       }
-
-       else {
-               /*
-                * Predicate is FALSE, we will just toss the
-                * rest of the package
-                */
-
-               walk_state->control_state->common.value = FALSE;
-               status = AE_CTRL_FALSE;
-       }
-
-
-cleanup:
-
-        /* Break to debugger to display result */
-
-       DEBUGGER_EXEC (acpi_db_display_result_object (obj_desc, walk_state));
-
-       /*
-        * Delete the predicate result object (we know that
-        * we don't need it anymore)
-        */
-
-       acpi_cm_remove_reference (obj_desc);
-
-       walk_state->control_state->common.state = CONTROL_NORMAL;
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_exec_begin_op
- *
- * PARAMETERS:  Walk_state      - Current state of the parse tree walk
- *              Op              - Op that has been just been reached in the
- *                                walk;  Arguments have not been evaluated yet.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Descending callback used during the execution of control
- *              methods.  This is where most operators and operands are
- *              dispatched to the interpreter.
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_exec_begin_op (
-       u16                     opcode,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       **out_op)
-{
-       ACPI_OPCODE_INFO        *op_info;
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (!op) {
-               status = acpi_ds_load2_begin_op (opcode, NULL, walk_state, out_op);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               op = *out_op;
-       }
-
-       if (op == walk_state->origin) {
-               if (out_op) {
-                       *out_op = op;
-               }
-
-               return (AE_OK);
-       }
-
-       /*
-        * If the previous opcode was a conditional, this opcode
-        * must be the beginning of the associated predicate.
-        * Save this knowledge in the current scope descriptor
-        */
-
-       if ((walk_state->control_state) &&
-               (walk_state->control_state->common.state ==
-                       CONTROL_CONDITIONAL_EXECUTING)) {
-               walk_state->control_state->common.state = CONTROL_PREDICATE_EXECUTING;
-
-               /* Save start of predicate */
-
-               walk_state->control_state->control.predicate_op = op;
-       }
-
-
-       op_info = acpi_ps_get_opcode_info (op->opcode);
-
-       /* We want to send namepaths to the load code */
-
-       if (op->opcode == AML_NAMEPATH_OP) {
-               op_info->flags = OPTYPE_NAMED_OBJECT;
-       }
-
-
-       /*
-        * Handle the opcode based upon the opcode type
-        */
-
-       switch (ACPI_GET_OP_CLASS (op_info)) {
-       case OPTYPE_CONTROL:
-
-               status = acpi_ds_result_stack_push (walk_state);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               status = acpi_ds_exec_begin_control_op (walk_state, op);
-               break;
-
-
-       case OPTYPE_NAMED_OBJECT:
-
-               if (walk_state->walk_type == WALK_METHOD) {
-                       /*
-                        * Found a named object declaration during method
-                        * execution;  we must enter this object into the
-                        * namespace.  The created object is temporary and
-                        * will be deleted upon completion of the execution
-                        * of this method.
-                        */
-
-                       status = acpi_ds_load2_begin_op (op->opcode, op, walk_state, NULL);
-               }
-
-
-               if (op->opcode == AML_REGION_OP) {
-                       status = acpi_ds_result_stack_push (walk_state);
-               }
-
-               break;
-
-
-       /* most operators with arguments */
-
-       case OPTYPE_MONADIC1:
-       case OPTYPE_DYADIC1:
-       case OPTYPE_MONADIC2:
-       case OPTYPE_MONADIC2_r:
-       case OPTYPE_DYADIC2:
-       case OPTYPE_DYADIC2_r:
-       case OPTYPE_DYADIC2_s:
-       case OPTYPE_RECONFIGURATION:
-       case OPTYPE_INDEX:
-       case OPTYPE_MATCH:
-       case OPTYPE_FATAL:
-       case OPTYPE_CREATE_FIELD:
-
-               /* Start a new result/operand state */
-
-               status = acpi_ds_result_stack_push (walk_state);
-               break;
-
-
-       default:
-               break;
-       }
-
-       /* Nothing to do here during method execution */
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ds_exec_end_op
- *
- * PARAMETERS:  Walk_state      - Current state of the parse tree walk
- *              Op              - Op that has been just been completed in the
- *                                walk;  Arguments have now been evaluated.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Ascending callback used during the execution of control
- *              methods.  The only thing we really need to do here is to
- *              notice the beginning of IF, ELSE, and WHILE blocks.
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ds_exec_end_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_STATUS             status = AE_OK;
-       u16                     opcode;
-       u8                      optype;
-       ACPI_PARSE_OBJECT       *next_op;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_PARSE_OBJECT       *first_arg;
-       ACPI_OPERAND_OBJECT     *result_obj = NULL;
-       ACPI_OPCODE_INFO        *op_info;
-       u32                     operand_index;
-
-
-       opcode = (u16) op->opcode;
-
-
-       op_info = acpi_ps_get_opcode_info (op->opcode);
-       if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) {
-               return (AE_NOT_IMPLEMENTED);
-       }
-
-       optype = (u8) ACPI_GET_OP_CLASS (op_info);
-       first_arg = op->value.arg;
-
-       /* Init the walk state */
-
-       walk_state->num_operands = 0;
-       walk_state->return_desc = NULL;
-       walk_state->op_info = op_info;
-       walk_state->opcode = opcode;
-
-
-       /* Call debugger for single step support (DEBUG build only) */
-
-       DEBUGGER_EXEC (status = acpi_db_single_step (walk_state, op, optype));
-       DEBUGGER_EXEC (if (ACPI_FAILURE (status)) {return (status);});
-
-
-       /* Decode the opcode */
-
-       switch (optype) {
-       case OPTYPE_UNDEFINED:
-
-               return (AE_NOT_IMPLEMENTED);
-               break;
-
-
-       case OPTYPE_BOGUS:
-               break;
-
-       case OPTYPE_CONSTANT:           /* argument type only */
-       case OPTYPE_LITERAL:            /* argument type only */
-       case OPTYPE_DATA_TERM:          /* argument type only */
-       case OPTYPE_LOCAL_VARIABLE:     /* argument type only */
-       case OPTYPE_METHOD_ARGUMENT:    /* argument type only */
-               break;
-
-
-       /* most operators with arguments */
-
-       case OPTYPE_MONADIC1:
-       case OPTYPE_DYADIC1:
-       case OPTYPE_MONADIC2:
-       case OPTYPE_MONADIC2_r:
-       case OPTYPE_DYADIC2:
-       case OPTYPE_DYADIC2_r:
-       case OPTYPE_DYADIC2_s:
-       case OPTYPE_RECONFIGURATION:
-       case OPTYPE_INDEX:
-       case OPTYPE_MATCH:
-       case OPTYPE_FATAL:
-
-
-               /* Build resolved operand stack */
-
-               status = acpi_ds_create_operands (walk_state, first_arg);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               operand_index = walk_state->num_operands - 1;
-
-
-               /* Done with this result state (Now that operand stack is built) */
-
-               status = acpi_ds_result_stack_pop (walk_state);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               switch (optype) {
-               case OPTYPE_MONADIC1:
-
-                       /* 1 Operand, 0 External_result, 0 Internal_result */
-
-                       status = acpi_aml_exec_monadic1 (opcode, walk_state);
-                       break;
-
-
-               case OPTYPE_MONADIC2:
-
-                       /* 1 Operand, 0 External_result, 1 Internal_result */
-
-                       status = acpi_aml_exec_monadic2 (opcode, walk_state, &result_obj);
-                       break;
-
-
-               case OPTYPE_MONADIC2_r:
-
-                       /* 1 Operand, 1 External_result, 1 Internal_result */
-
-                       status = acpi_aml_exec_monadic2_r (opcode, walk_state, &result_obj);
-                       break;
-
-
-               case OPTYPE_DYADIC1:
-
-                       /* 2 Operands, 0 External_result, 0 Internal_result */
-
-                       status = acpi_aml_exec_dyadic1 (opcode, walk_state);
-                       break;
-
-
-               case OPTYPE_DYADIC2:
-
-                       /* 2 Operands, 0 External_result, 1 Internal_result */
-
-                       status = acpi_aml_exec_dyadic2 (opcode, walk_state, &result_obj);
-                       break;
-
-
-               case OPTYPE_DYADIC2_r:
-
-                       /* 2 Operands, 1 or 2 External_results, 1 Internal_result */
-
-                       status = acpi_aml_exec_dyadic2_r (opcode, walk_state, &result_obj);
-                       break;
-
-
-               case OPTYPE_DYADIC2_s:  /* Synchronization Operator */
-
-                       /* 2 Operands, 0 External_result, 1 Internal_result */
-
-                       status = acpi_aml_exec_dyadic2_s (opcode, walk_state, &result_obj);
-                       break;
-
-
-               case OPTYPE_INDEX:  /* Type 2 opcode with 3 operands */
-
-                       /* 3 Operands, 1 External_result, 1 Internal_result */
-
-                       status = acpi_aml_exec_index (walk_state, &result_obj);
-                       break;
-
-
-               case OPTYPE_MATCH:  /* Type 2 opcode with 6 operands */
-
-                       /* 6 Operands, 0 External_result, 1 Internal_result */
-
-                       status = acpi_aml_exec_match (walk_state, &result_obj);
-                       break;
-
-
-               case OPTYPE_RECONFIGURATION:
-
-                       /* 1 or 2 operands, 0 Internal Result */
-
-                       status = acpi_aml_exec_reconfiguration (opcode, walk_state);
-                       break;
-
-
-               case OPTYPE_FATAL:
-
-                       /* 3 Operands, 0 External_result, 0 Internal_result */
-
-                       status = acpi_aml_exec_fatal (walk_state);
-                       break;
-               }
-
-               /*
-                * If a result object was returned from above, push it on the
-                * current result stack
-                */
-               if (ACPI_SUCCESS (status) &&
-                       result_obj) {
-                       status = acpi_ds_result_push (result_obj, walk_state);
-               }
-
-               break;
-
-
-       case OPTYPE_CONTROL:    /* Type 1 opcode, IF/ELSE/WHILE/NOOP */
-
-               /* 1 Operand, 0 External_result, 0 Internal_result */
-
-               status = acpi_ds_exec_end_control_op (walk_state, op);
-
-               acpi_ds_result_stack_pop (walk_state);
-               break;
-
-
-       case OPTYPE_METHOD_CALL:
-
-               /*
-                * (AML_METHODCALL) Op->Value->Arg->Node contains
-                * the method Node pointer
-                */
-               /* Next_op points to the op that holds the method name */
-
-               next_op = first_arg;
-               node = next_op->node;
-
-               /* Next_op points to first argument op */
-
-               next_op = next_op->next;
-
-               /*
-                * Get the method's arguments and put them on the operand stack
-                */
-               status = acpi_ds_create_operands (walk_state, next_op);
-               if (ACPI_FAILURE (status)) {
-                       break;
-               }
-
-               /*
-                * Since the operands will be passed to another
-                * control method, we must resolve all local
-                * references here (Local variables, arguments
-                * to *this* method, etc.)
-                */
-
-               status = acpi_ds_resolve_operands (walk_state);
-               if (ACPI_FAILURE (status)) {
-                       break;
-               }
-
-               /*
-                * Tell the walk loop to preempt this running method and
-                * execute the new method
-                */
-               status = AE_CTRL_TRANSFER;
-
-               /*
-                * Return now; we don't want to disturb anything,
-                * especially the operand count!
-                */
-               return (status);
-               break;
-
-
-       case OPTYPE_CREATE_FIELD:
-
-               status = acpi_ds_load2_end_op (walk_state, op);
-               if (ACPI_FAILURE (status)) {
-                       break;
-               }
-
-               status = acpi_ds_eval_field_unit_operands (walk_state, op);
-               break;
-
-
-       case OPTYPE_NAMED_OBJECT:
-
-               status = acpi_ds_load2_end_op (walk_state, op);
-               if (ACPI_FAILURE (status)) {
-                       break;
-               }
-
-               switch (op->opcode) {
-               case AML_REGION_OP:
-
-                       status = acpi_ds_eval_region_operands (walk_state, op);
-                       if (ACPI_FAILURE (status)) {
-                               break;
-                       }
-
-                       status = acpi_ds_result_stack_pop (walk_state);
-                       break;
-
-
-               case AML_METHOD_OP:
-                       break;
-
-
-               case AML_ALIAS_OP:
-
-                       /* Alias creation was already handled by call
-                       to psxload above */
-                       break;
-
-
-               default:
-                       /* Nothing needs to be done */
-
-                       status = AE_OK;
-                       break;
-               }
-
-               break;
-
-       default:
-
-               status = AE_NOT_IMPLEMENTED;
-               break;
-       }
-
-
-       /*
-        * ACPI 2.0 support for 64-bit integers:
-        * Truncate numeric result value if we are executing from a 32-bit ACPI table
-        */
-       acpi_aml_truncate_for32bit_table (result_obj, walk_state);
-
-       /*
-        * Check if we just completed the evaluation of a
-        * conditional predicate
-        */
-
-       if ((walk_state->control_state) &&
-               (walk_state->control_state->common.state ==
-                       CONTROL_PREDICATE_EXECUTING) &&
-               (walk_state->control_state->control.predicate_op == op)) {
-               status = acpi_ds_get_predicate_value (walk_state, op, (NATIVE_UINT) result_obj);
-               result_obj = NULL;
-       }
-
-
-cleanup:
-       if (result_obj) {
-               /* Break to debugger to display result */
-
-               DEBUGGER_EXEC (acpi_db_display_result_object (result_obj, walk_state));
-
-               /*
-                * Delete the result op if and only if:
-                * Parent will not use the result -- such as any
-                * non-nested type2 op in a method (parent will be method)
-                */
-               acpi_ds_delete_result_if_not_used (op, result_obj, walk_state);
-       }
-
-       /* Always clear the object stack */
-
-       /* TBD: [Investigate] Clear stack of return value,
-       but don't delete it */
-       walk_state->num_operands = 0;
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/dispatcher/dswload.c b/reactos/drivers/bus/acpi/dispatcher/dswload.c
deleted file mode 100644 (file)
index b810d5f..0000000
+++ /dev/null
@@ -1,672 +0,0 @@
-/******************************************************************************
- *
- * Module Name: dswload - Dispatcher namespace load callbacks
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dswload")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_load1_begin_op
- *
- * PARAMETERS:  Walk_state      - Current state of the parse tree walk
- *              Op              - Op that has been just been reached in the
- *                                walk;  Arguments have not been evaluated yet.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Descending callback used during the loading of ACPI tables.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_load1_begin_op (
-       u16                     opcode,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       **out_op)
-{
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_STATUS             status;
-       OBJECT_TYPE_INTERNAL    data_type;
-       NATIVE_CHAR             *path;
-
-
-       /* We are only interested in opcodes that have an associated name */
-
-       if (!acpi_ps_is_named_op (opcode)) {
-               *out_op = op;
-               return (AE_OK);
-       }
-
-
-       /* Check if this object has already been installed in the namespace */
-
-       if (op && op->node) {
-               *out_op = op;
-               return (AE_OK);
-       }
-
-       path = acpi_ps_get_next_namestring (walk_state->parser_state);
-
-       /* Map the raw opcode into an internal object type */
-
-       data_type = acpi_ds_map_named_opcode_to_data_type (opcode);
-
-
-
-       /*
-        * Enter the named type into the internal namespace.  We enter the name
-        * as we go downward in the parse tree.  Any necessary subobjects that involve
-        * arguments to the opcode must be created as we go back up the parse tree later.
-        */
-       status = acpi_ns_lookup (walk_state->scope_info, path,
-                        data_type, IMODE_LOAD_PASS1,
-                        NS_NO_UPSEARCH, walk_state, &(node));
-
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       if (!op) {
-               /* Create a new op */
-
-               op = acpi_ps_alloc_op (opcode);
-               if (!op) {
-                       return (AE_NO_MEMORY);
-               }
-       }
-
-       /* Initialize */
-
-       ((ACPI_PARSE2_OBJECT *)op)->name = node->name;
-
-       /*
-        * Put the Node in the "op" object that the parser uses, so we
-        * can get it again quickly when this scope is closed
-        */
-       op->node = node;
-
-
-       acpi_ps_append_arg (acpi_ps_get_parent_scope (walk_state->parser_state), op);
-
-       *out_op = op;
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_load1_end_op
- *
- * PARAMETERS:  Walk_state      - Current state of the parse tree walk
- *              Op              - Op that has been just been completed in the
- *                                walk;  Arguments have now been evaluated.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Ascending callback used during the loading of the namespace,
- *              both control methods and everything else.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_load1_end_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op)
-{
-       OBJECT_TYPE_INTERNAL    data_type;
-
-
-       /* We are only interested in opcodes that have an associated name */
-
-       if (!acpi_ps_is_named_op (op->opcode)) {
-               return (AE_OK);
-       }
-
-
-       /* Get the type to determine if we should pop the scope */
-
-       data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);
-
-       if (op->opcode == AML_NAME_OP) {
-               /* For Name opcode, check the argument */
-
-               if (op->value.arg) {
-                       data_type = acpi_ds_map_opcode_to_data_type (
-                                         (op->value.arg)->opcode, NULL);
-                       ((ACPI_NAMESPACE_NODE *)op->node)->type =
-                                         (u8) data_type;
-               }
-       }
-
-
-       /* Pop the scope stack */
-
-       if (acpi_ns_opens_scope (data_type)) {
-
-               acpi_ds_scope_stack_pop (walk_state);
-       }
-
-       return (AE_OK);
-
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_load2_begin_op
- *
- * PARAMETERS:  Walk_state      - Current state of the parse tree walk
- *              Op              - Op that has been just been reached in the
- *                                walk;  Arguments have not been evaluated yet.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Descending callback used during the loading of ACPI tables.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_load2_begin_op (
-       u16                     opcode,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       **out_op)
-{
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_STATUS             status;
-       OBJECT_TYPE_INTERNAL    data_type;
-       NATIVE_CHAR             *buffer_ptr;
-       void                    *original = NULL;
-
-
-       /* We only care about Namespace opcodes here */
-
-       if (!acpi_ps_is_namespace_op (opcode) &&
-               opcode != AML_NAMEPATH_OP) {
-               return (AE_OK);
-       }
-
-
-       /* Temp! same code as in psparse */
-
-       if (!acpi_ps_is_named_op (opcode)) {
-               return (AE_OK);
-       }
-
-       if (op) {
-               /*
-                * Get the name we are going to enter or lookup in the namespace
-                */
-               if (opcode == AML_NAMEPATH_OP) {
-                       /* For Namepath op, get the path string */
-
-                       buffer_ptr = op->value.string;
-                       if (!buffer_ptr) {
-                               /* No name, just exit */
-
-                               return (AE_OK);
-                       }
-               }
-
-               else {
-                       /* Get name from the op */
-
-                       buffer_ptr = (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)op)->name;
-               }
-       }
-
-       else {
-               buffer_ptr = acpi_ps_get_next_namestring (walk_state->parser_state);
-       }
-
-
-       /* Map the raw opcode into an internal object type */
-
-       data_type = acpi_ds_map_named_opcode_to_data_type (opcode);
-
-
-       if (opcode == AML_DEF_FIELD_OP      ||
-               opcode == AML_BANK_FIELD_OP     ||
-               opcode == AML_INDEX_FIELD_OP) {
-               node = NULL;
-               status = AE_OK;
-       }
-
-       else if (opcode == AML_NAMEPATH_OP) {
-               /*
-                * The Name_path is an object reference to an existing object. Don't enter the
-                * name into the namespace, but look it up for use later
-                */
-               status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr,
-                                data_type, IMODE_EXECUTE,
-                                NS_SEARCH_PARENT, walk_state,
-                                &(node));
-       }
-
-       else {
-               if (op && op->node) {
-                       original = op->node;
-                       node = op->node;
-
-                       if (acpi_ns_opens_scope (data_type)) {
-                               status = acpi_ds_scope_stack_push (node,
-                                                  data_type,
-                                                  walk_state);
-                               if (ACPI_FAILURE (status)) {
-                                       return (status);
-                               }
-
-                       }
-                       return (AE_OK);
-               }
-
-               /*
-                * Enter the named type into the internal namespace.  We enter the name
-                * as we go downward in the parse tree.  Any necessary subobjects that involve
-                * arguments to the opcode must be created as we go back up the parse tree later.
-                */
-               status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr,
-                                data_type, IMODE_EXECUTE,
-                                NS_NO_UPSEARCH, walk_state,
-                                &(node));
-       }
-
-       if (ACPI_SUCCESS (status)) {
-               if (!op) {
-                       /* Create a new op */
-
-                       op = acpi_ps_alloc_op (opcode);
-                       if (!op) {
-                               return (AE_NO_MEMORY);
-                       }
-
-                       /* Initialize */
-
-                       ((ACPI_PARSE2_OBJECT *)op)->name = node->name;
-                       *out_op = op;
-               }
-
-
-               /*
-                * Put the Node in the "op" object that the parser uses, so we
-                * can get it again quickly when this scope is closed
-                */
-               op->node = node;
-
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_load2_end_op
- *
- * PARAMETERS:  Walk_state      - Current state of the parse tree walk
- *              Op              - Op that has been just been completed in the
- *                                walk;  Arguments have now been evaluated.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Ascending callback used during the loading of the namespace,
- *              both control methods and everything else.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_load2_end_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_STATUS             status = AE_OK;
-       OBJECT_TYPE_INTERNAL    data_type;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_PARSE_OBJECT       *arg;
-       ACPI_NAMESPACE_NODE     *new_node;
-
-
-       if (!acpi_ps_is_namespace_object_op (op->opcode)) {
-               return (AE_OK);
-       }
-
-       if (op->opcode == AML_SCOPE_OP) {
-               if (((ACPI_PARSE2_OBJECT *)op)->name == -1) {
-                       return (AE_OK);
-               }
-       }
-
-
-       data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);
-
-       /*
-        * Get the Node/name from the earlier lookup
-        * (It was saved in the *op structure)
-        */
-       node = op->node;
-
-       /*
-        * Put the Node on the object stack (Contains the ACPI Name of
-        * this object)
-        */
-
-       walk_state->operands[0] = (void *) node;
-       walk_state->num_operands = 1;
-
-       /* Pop the scope stack */
-
-       if (acpi_ns_opens_scope (data_type)) {
-
-               acpi_ds_scope_stack_pop (walk_state);
-       }
-
-
-       /*
-        * Named operations are as follows:
-        *
-        * AML_SCOPE
-        * AML_DEVICE
-        * AML_THERMALZONE
-        * AML_METHOD
-        * AML_POWERRES
-        * AML_PROCESSOR
-        * AML_FIELD
-        * AML_INDEXFIELD
-        * AML_BANKFIELD
-        * AML_NAMEDFIELD
-        * AML_NAME
-        * AML_ALIAS
-        * AML_MUTEX
-        * AML_EVENT
-        * AML_OPREGION
-        * AML_CREATEFIELD
-        * AML_CREATEBITFIELD
-        * AML_CREATEBYTEFIELD
-        * AML_CREATEWORDFIELD
-        * AML_CREATEDWORDFIELD
-        * AML_METHODCALL
-        */
-
-
-       /* Decode the opcode */
-
-       arg = op->value.arg;
-
-       switch (op->opcode) {
-
-       case AML_CREATE_FIELD_OP:
-       case AML_BIT_FIELD_OP:
-       case AML_BYTE_FIELD_OP:
-       case AML_WORD_FIELD_OP:
-       case AML_DWORD_FIELD_OP:
-
-               /*
-                * Create the field object, but the field buffer and index must
-                * be evaluated later during the execution phase
-                */
-
-               /* Get the Name_string argument */
-
-               if (op->opcode == AML_CREATE_FIELD_OP) {
-                       arg = acpi_ps_get_arg (op, 3);
-               }
-               else {
-                       /* Create Bit/Byte/Word/Dword field */
-
-                       arg = acpi_ps_get_arg (op, 2);
-               }
-
-               /*
-                * Enter the Name_string into the namespace
-                */
-
-               status = acpi_ns_lookup (walk_state->scope_info,
-                                arg->value.string,
-                                INTERNAL_TYPE_DEF_ANY,
-                                IMODE_LOAD_PASS1,
-                                NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
-                                walk_state, &(new_node));
-
-               if (ACPI_SUCCESS (status)) {
-                       /* We could put the returned object (Node) on the object stack for later, but
-                        * for now, we will put it in the "op" object that the parser uses, so we
-                        * can get it again at the end of this scope
-                        */
-                       op->node = new_node;
-
-                       /*
-                        * If there is no object attached to the node, this node was just created and
-                        * we need to create the field object.  Otherwise, this was a lookup of an
-                        * existing node and we don't want to create the field object again.
-                        */
-                       if (!new_node->object) {
-                               /*
-                                * The Field definition is not fully parsed at this time.
-                                * (We must save the address of the AML for the buffer and index operands)
-                                */
-                               status = acpi_aml_exec_create_field (((ACPI_PARSE2_OBJECT *) op)->data,
-                                                  ((ACPI_PARSE2_OBJECT *) op)->length,
-                                                  new_node, walk_state);
-                       }
-               }
-
-
-               break;
-
-
-       case AML_METHODCALL_OP:
-
-               /*
-                * Lookup the method name and save the Node
-                */
-
-               status = acpi_ns_lookup (walk_state->scope_info, arg->value.string,
-                                ACPI_TYPE_ANY, IMODE_LOAD_PASS2,
-                                NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE,
-                                walk_state, &(new_node));
-
-               if (ACPI_SUCCESS (status)) {
-
-/* has name already been resolved by here ??*/
-
-                       /* TBD: [Restructure] Make sure that what we found is indeed a method! */
-                       /* We didn't search for a method on purpose, to see if the name would resolve! */
-
-                       /* We could put the returned object (Node) on the object stack for later, but
-                        * for now, we will put it in the "op" object that the parser uses, so we
-                        * can get it again at the end of this scope
-                        */
-                       op->node = new_node;
-               }
-
-
-                break;
-
-
-       case AML_PROCESSOR_OP:
-
-               /* Nothing to do other than enter object into namespace */
-
-               status = acpi_aml_exec_create_processor (op, (ACPI_HANDLE) node);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               break;
-
-
-       case AML_POWER_RES_OP:
-
-               /* Nothing to do other than enter object into namespace */
-
-               status = acpi_aml_exec_create_power_resource (op, (ACPI_HANDLE) node);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               break;
-
-
-       case AML_THERMAL_ZONE_OP:
-
-               /* Nothing to do other than enter object into namespace */
-
-               break;
-
-
-       case AML_DEF_FIELD_OP:
-
-               arg = op->value.arg;
-
-               status = acpi_ds_create_field (op, arg->node, walk_state);
-               break;
-
-
-       case AML_INDEX_FIELD_OP:
-
-               arg = op->value.arg;
-
-               status = acpi_ds_create_index_field (op, (ACPI_HANDLE) arg->node,
-                                  walk_state);
-               break;
-
-
-       case AML_BANK_FIELD_OP:
-
-               arg = op->value.arg;
-               status = acpi_ds_create_bank_field (op, arg->node, walk_state);
-               break;
-
-
-       /*
-        * Method_op Pkg_length Names_string Method_flags Term_list
-        */
-       case AML_METHOD_OP:
-
-               if (!node->object) {
-                       status = acpi_aml_exec_create_method (((ACPI_PARSE2_OBJECT *) op)->data,
-                                          ((ACPI_PARSE2_OBJECT *) op)->length,
-                                          arg->value.integer, (ACPI_HANDLE) node);
-               }
-
-               break;
-
-
-       case AML_MUTEX_OP:
-
-               status = acpi_ds_create_operands (walk_state, arg);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               status = acpi_aml_exec_create_mutex (walk_state);
-               break;
-
-
-       case AML_EVENT_OP:
-
-               status = acpi_ds_create_operands (walk_state, arg);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               status = acpi_aml_exec_create_event (walk_state);
-               break;
-
-
-       case AML_REGION_OP:
-
-               if (node->object) {
-                       break;
-               }
-
-
-               /*
-                * The Op_region is not fully parsed at this time. Only valid argument is the Space_id.
-                * (We must save the address of the AML of the address and length operands)
-                */
-
-               status = acpi_aml_exec_create_region (((ACPI_PARSE2_OBJECT *) op)->data,
-                                  ((ACPI_PARSE2_OBJECT *) op)->length,
-                                  (ACPI_ADDRESS_SPACE_TYPE) arg->value.integer,
-                                  walk_state);
-
-               break;
-
-
-       /* Namespace Modifier Opcodes */
-
-       case AML_ALIAS_OP:
-
-               status = acpi_ds_create_operands (walk_state, arg);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               status = acpi_aml_exec_create_alias (walk_state);
-               break;
-
-
-       case AML_NAME_OP:
-
-               /*
-                * Because of the execution pass through the non-control-method
-                * parts of the table, we can arrive here twice.  Only init
-                * the named object node the first time through
-                */
-
-               if (!node->object) {
-                       status = acpi_ds_create_node (walk_state, node, op);
-               }
-
-               break;
-
-
-       case AML_NAMEPATH_OP:
-
-               break;
-
-
-       default:
-               break;
-       }
-
-
-cleanup:
-
-       /* Remove the Node pushed at the very beginning */
-
-       acpi_ds_obj_stack_pop (1, walk_state);
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/dispatcher/dswscope.c b/reactos/drivers/bus/acpi/dispatcher/dswscope.c
deleted file mode 100644 (file)
index 87bdfd4..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/******************************************************************************
- *
- * Module Name: dswscope - Scope stack manipulation
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dswscope")
-
-
-#define STACK_POP(head) head
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ds_scope_stack_clear
- *
- * PARAMETERS:  None
- *
- * DESCRIPTION: Pop (and free) everything on the scope stack except the
- *              root scope object (which remains at the stack top.)
- *
- ***************************************************************************/
-
-void
-acpi_ds_scope_stack_clear (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_GENERIC_STATE      *scope_info;
-
-
-       while (walk_state->scope_info) {
-               /* Pop a scope off the stack */
-
-               scope_info = walk_state->scope_info;
-               walk_state->scope_info = scope_info->scope.next;
-
-               acpi_cm_delete_generic_state (scope_info);
-       }
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ds_scope_stack_push
- *
- * PARAMETERS:  *Node,              - Name to be made current
- *              Type,               - Type of frame being pushed
- *
- * DESCRIPTION: Push the current scope on the scope stack, and make the
- *              passed Node current.
- *
- ***************************************************************************/
-
-ACPI_STATUS
-acpi_ds_scope_stack_push (
-       ACPI_NAMESPACE_NODE     *node,
-       OBJECT_TYPE_INTERNAL    type,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_GENERIC_STATE      *scope_info;
-
-
-       if (!node) {
-               /*  invalid scope   */
-
-               REPORT_ERROR (("Ds_scope_stack_push: null scope passed\n"));
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Make sure object type is valid */
-
-       if (!acpi_aml_validate_object_type (type)) {
-               REPORT_WARNING (("Ds_scope_stack_push: type code out of range\n"));
-       }
-
-
-       /* Allocate a new scope object */
-
-       scope_info = acpi_cm_create_generic_state ();
-       if (!scope_info) {
-               return (AE_NO_MEMORY);
-       }
-
-       /* Init new scope object */
-
-       scope_info->scope.node = node;
-       scope_info->common.value = (u16) type;
-
-       /* Push new scope object onto stack */
-
-       acpi_cm_push_generic_state (&walk_state->scope_info, scope_info);
-
-       return (AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ds_scope_stack_pop
- *
- * PARAMETERS:  Type                - The type of frame to be found
- *
- * DESCRIPTION: Pop the scope stack until a frame of the requested type
- *              is found.
- *
- * RETURN:      Count of frames popped.  If no frame of the requested type
- *              was found, the count is returned as a negative number and
- *              the scope stack is emptied (which sets the current scope
- *              to the root).  If the scope stack was empty at entry, the
- *              function is a no-op and returns 0.
- *
- ***************************************************************************/
-
-ACPI_STATUS
-acpi_ds_scope_stack_pop (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_GENERIC_STATE      *scope_info;
-
-
-       /*
-        * Pop scope info object off the stack.
-        */
-
-       scope_info = acpi_cm_pop_generic_state (&walk_state->scope_info);
-       if (!scope_info) {
-               return (AE_STACK_UNDERFLOW);
-       }
-
-       acpi_cm_delete_generic_state (scope_info);
-
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/dispatcher/dswstate.c b/reactos/drivers/bus/acpi/dispatcher/dswstate.c
deleted file mode 100644 (file)
index 80e9933..0000000
+++ /dev/null
@@ -1,872 +0,0 @@
-/******************************************************************************
- *
- * Module Name: dswstate - Dispatcher parse tree walk management routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_DISPATCHER
-        MODULE_NAME         ("dswstate")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_result_insert
- *
- * PARAMETERS:  Object              - Object to push
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Push an object onto this walk's result stack
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_result_insert (
-       void                    *object,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       state = walk_state->results;
-       if (!state) {
-               return (AE_NOT_EXIST);
-       }
-
-       if (index >= OBJ_NUM_OPERANDS) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       if (!object) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       state->results.obj_desc [index] = object;
-       state->results.num_results++;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_result_remove
- *
- * PARAMETERS:  Object              - Where to return the popped object
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Pop an object off the bottom of this walk's result stack.  In
- *              other words, this is a FIFO.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_result_remove (
-       ACPI_OPERAND_OBJECT     **object,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       state = walk_state->results;
-       if (!state) {
-               return (AE_NOT_EXIST);
-       }
-
-
-
-       /* Check for a valid result object */
-
-       if (!state->results.obj_desc [index]) {
-               return (AE_AML_NO_RETURN_VALUE);
-       }
-
-       /* Remove the object */
-
-       state->results.num_results--;
-
-       *object = state->results.obj_desc [index];
-       state->results.obj_desc [index] = NULL;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_result_pop
- *
- * PARAMETERS:  Object              - Where to return the popped object
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Pop an object off the bottom of this walk's result stack.  In
- *              other words, this is a FIFO.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_result_pop (
-       ACPI_OPERAND_OBJECT     **object,
-       ACPI_WALK_STATE         *walk_state)
-{
-       u32                     index;
-       ACPI_GENERIC_STATE      *state;
-
-
-       state = walk_state->results;
-       if (!state) {
-               return (AE_OK);
-       }
-
-
-       if (!state->results.num_results) {
-               return (AE_AML_NO_RETURN_VALUE);
-       }
-
-       /* Remove top element */
-
-       state->results.num_results--;
-
-       for (index = OBJ_NUM_OPERANDS; index; index--) {
-               /* Check for a valid result object */
-
-               if (state->results.obj_desc [index -1]) {
-                       *object = state->results.obj_desc [index -1];
-                       state->results.obj_desc [index -1] = NULL;
-
-                       return (AE_OK);
-               }
-       }
-
-
-       return (AE_AML_NO_RETURN_VALUE);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_result_pop_from_bottom
- *
- * PARAMETERS:  Object              - Where to return the popped object
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Pop an object off the bottom of this walk's result stack.  In
- *              other words, this is a FIFO.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_result_pop_from_bottom (
-       ACPI_OPERAND_OBJECT     **object,
-       ACPI_WALK_STATE         *walk_state)
-{
-       u32                     index;
-       ACPI_GENERIC_STATE      *state;
-
-
-       state = walk_state->results;
-       if (!state) {
-               return (AE_NOT_EXIST);
-       }
-
-
-       if (!state->results.num_results) {
-               return (AE_AML_NO_RETURN_VALUE);
-       }
-
-       /* Remove Bottom element */
-
-       *object = state->results.obj_desc [0];
-
-
-       /* Push entire stack down one element */
-
-       for (index = 0; index < state->results.num_results; index++) {
-               state->results.obj_desc [index] = state->results.obj_desc [index + 1];
-       }
-
-       state->results.num_results--;
-
-       /* Check for a valid result object */
-
-       if (!*object) {
-               return (AE_AML_NO_RETURN_VALUE);
-       }
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_result_push
- *
- * PARAMETERS:  Object              - Where to return the popped object
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Push an object onto the current result stack
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_result_push (
-       ACPI_OPERAND_OBJECT     *object,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       state = walk_state->results;
-       if (!state) {
-               return (AE_AML_INTERNAL);
-       }
-
-       if (state->results.num_results == OBJ_NUM_OPERANDS) {
-               return (AE_STACK_OVERFLOW);
-       }
-
-       if (!object) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       state->results.obj_desc [state->results.num_results] = object;
-       state->results.num_results++;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_result_stack_push
- *
- * PARAMETERS:  Object              - Object to push
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION:
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_result_stack_push (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       state = acpi_cm_create_generic_state ();
-       if (!state) {
-               return (AE_NO_MEMORY);
-       }
-
-       acpi_cm_push_generic_state (&walk_state->results, state);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_result_stack_pop
- *
- * PARAMETERS:  Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION:
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_result_stack_pop (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       /* Check for stack underflow */
-
-       if (walk_state->results == NULL) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-
-       state = acpi_cm_pop_generic_state (&walk_state->results);
-
-       acpi_cm_delete_generic_state (state);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_obj_stack_delete_all
- *
- * PARAMETERS:  Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Clear the object stack by deleting all objects that are on it.
- *              Should be used with great care, if at all!
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_obj_stack_delete_all (
-       ACPI_WALK_STATE         *walk_state)
-{
-       u32                     i;
-
-
-       /* The stack size is configurable, but fixed */
-
-       for (i = 0; i < OBJ_NUM_OPERANDS; i++) {
-               if (walk_state->operands[i]) {
-                       acpi_cm_remove_reference (walk_state->operands[i]);
-                       walk_state->operands[i] = NULL;
-               }
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_obj_stack_push
- *
- * PARAMETERS:  Object              - Object to push
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Push an object onto this walk's object/operand stack
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_obj_stack_push (
-       void                    *object,
-       ACPI_WALK_STATE         *walk_state)
-{
-
-
-       /* Check for stack overflow */
-
-       if (walk_state->num_operands >= OBJ_NUM_OPERANDS) {
-               return (AE_STACK_OVERFLOW);
-       }
-
-       /* Put the object onto the stack */
-
-       walk_state->operands [walk_state->num_operands] = object;
-       walk_state->num_operands++;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_obj_stack_pop_object
- *
- * PARAMETERS:  Pop_count           - Number of objects/entries to pop
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Pop this walk's object stack.  Objects on the stack are NOT
- *              deleted by this routine.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_obj_stack_pop_object (
-       ACPI_OPERAND_OBJECT     **object,
-       ACPI_WALK_STATE         *walk_state)
-{
-
-
-       /* Check for stack underflow */
-
-       if (walk_state->num_operands == 0) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-
-       /* Pop the stack */
-
-       walk_state->num_operands--;
-
-       /* Check for a valid operand */
-
-       if (!walk_state->operands [walk_state->num_operands]) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-       /* Get operand and set stack entry to null */
-
-       *object = walk_state->operands [walk_state->num_operands];
-       walk_state->operands [walk_state->num_operands] = NULL;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_obj_stack_pop
- *
- * PARAMETERS:  Pop_count           - Number of objects/entries to pop
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Pop this walk's object stack.  Objects on the stack are NOT
- *              deleted by this routine.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_obj_stack_pop (
-       u32                     pop_count,
-       ACPI_WALK_STATE         *walk_state)
-{
-       u32                     i;
-
-
-       for (i = 0; i < pop_count; i++) {
-               /* Check for stack underflow */
-
-               if (walk_state->num_operands == 0) {
-                       return (AE_STACK_UNDERFLOW);
-               }
-
-               /* Just set the stack entry to null */
-
-               walk_state->num_operands--;
-               walk_state->operands [walk_state->num_operands] = NULL;
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_obj_stack_pop_and_delete
- *
- * PARAMETERS:  Pop_count           - Number of objects/entries to pop
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Pop this walk's object stack and delete each object that is
- *              popped off.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ds_obj_stack_pop_and_delete (
-       u32                     pop_count,
-       ACPI_WALK_STATE         *walk_state)
-{
-       u32                     i;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       for (i = 0; i < pop_count; i++) {
-               /* Check for stack underflow */
-
-               if (walk_state->num_operands == 0) {
-                       return (AE_STACK_UNDERFLOW);
-               }
-
-               /* Pop the stack and delete an object if present in this stack entry */
-
-               walk_state->num_operands--;
-               obj_desc = walk_state->operands [walk_state->num_operands];
-               if (obj_desc) {
-                       acpi_cm_remove_reference (walk_state->operands [walk_state->num_operands]);
-                       walk_state->operands [walk_state->num_operands] = NULL;
-               }
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_obj_stack_get_value
- *
- * PARAMETERS:  Index               - Stack index whose value is desired.  Based
- *                                    on the top of the stack (index=0 == top)
- *              Walk_state          - Current Walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Retrieve an object from this walk's object stack.  Index must
- *              be within the range of the current stack pointer.
- *
- ******************************************************************************/
-
-void *
-acpi_ds_obj_stack_get_value (
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state)
-{
-
-
-       /* Can't do it if the stack is empty */
-
-       if (walk_state->num_operands == 0) {
-               return (NULL);
-       }
-
-       /* or if the index is past the top of the stack */
-
-       if (index > (walk_state->num_operands - (u32) 1)) {
-               return (NULL);
-       }
-
-
-       return (walk_state->operands[(NATIVE_UINT)(walk_state->num_operands - 1) -
-                         index]);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_get_current_walk_state
- *
- * PARAMETERS:  Walk_list       - Get current active state for this walk list
- *
- * RETURN:      Pointer to the current walk state
- *
- * DESCRIPTION: Get the walk state that is at the head of the list (the "current"
- *              walk state.
- *
- ******************************************************************************/
-
-ACPI_WALK_STATE *
-acpi_ds_get_current_walk_state (
-       ACPI_WALK_LIST          *walk_list)
-
-{
-
-       if (!walk_list) {
-               return (NULL);
-       }
-
-       return (walk_list->walk_state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_push_walk_state
- *
- * PARAMETERS:  Walk_state      - State to push
- *              Walk_list       - The list that owns the walk stack
- *
- * RETURN:      None
- *
- * DESCRIPTION: Place the Walk_state at the head of the state list.
- *
- ******************************************************************************/
-
-static void
-acpi_ds_push_walk_state (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_WALK_LIST          *walk_list)
-{
-
-
-       walk_state->next    = walk_list->walk_state;
-       walk_list->walk_state = walk_state;
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_pop_walk_state
- *
- * PARAMETERS:  Walk_list       - The list that owns the walk stack
- *
- * RETURN:      A Walk_state object popped from the stack
- *
- * DESCRIPTION: Remove and return the walkstate object that is at the head of
- *              the walk stack for the given walk list.  NULL indicates that
- *              the list is empty.
- *
- ******************************************************************************/
-
-ACPI_WALK_STATE *
-acpi_ds_pop_walk_state (
-       ACPI_WALK_LIST          *walk_list)
-{
-       ACPI_WALK_STATE         *walk_state;
-
-
-       walk_state = walk_list->walk_state;
-
-       if (walk_state) {
-               /* Next walk state becomes the current walk state */
-
-               walk_list->walk_state = walk_state->next;
-
-               /*
-                * Don't clear the NEXT field, this serves as an indicator
-                * that there is a parent WALK STATE
-                *     Walk_state->Next = NULL;
-                */
-       }
-
-       return (walk_state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_create_walk_state
- *
- * PARAMETERS:  Origin          - Starting point for this walk
- *              Walk_list       - Owning walk list
- *
- * RETURN:      Pointer to the new walk state.
- *
- * DESCRIPTION: Allocate and initialize a new walk state.  The current walk state
- *              is set to this new state.
- *
- ******************************************************************************/
-
-ACPI_WALK_STATE *
-acpi_ds_create_walk_state (
-       ACPI_OWNER_ID           owner_id,
-       ACPI_PARSE_OBJECT       *origin,
-       ACPI_OPERAND_OBJECT     *mth_desc,
-       ACPI_WALK_LIST          *walk_list)
-{
-       ACPI_WALK_STATE         *walk_state;
-       ACPI_STATUS             status;
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-       acpi_gbl_walk_state_cache_requests++;
-
-       /* Check the cache first */
-
-       if (acpi_gbl_walk_state_cache) {
-               /* There is an object available, use it */
-
-               walk_state = acpi_gbl_walk_state_cache;
-               acpi_gbl_walk_state_cache = walk_state->next;
-
-               acpi_gbl_walk_state_cache_hits++;
-               acpi_gbl_walk_state_cache_depth--;
-
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-       }
-
-       else {
-               /* The cache is empty, create a new object */
-
-               /* Avoid deadlock with Acpi_cm_callocate */
-
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-
-               walk_state = acpi_cm_callocate (sizeof (ACPI_WALK_STATE));
-               if (!walk_state) {
-                       return (NULL);
-               }
-       }
-
-       walk_state->data_type       = ACPI_DESC_TYPE_WALK;
-       walk_state->owner_id        = owner_id;
-       walk_state->origin          = origin;
-       walk_state->method_desc     = mth_desc;
-       walk_state->walk_list       = walk_list;
-
-       /* Init the method args/local */
-
-#ifndef _ACPI_ASL_COMPILER
-       acpi_ds_method_data_init (walk_state);
-#endif
-
-       /* Create an initial result stack entry */
-
-       status = acpi_ds_result_stack_push (walk_state);
-       if (ACPI_FAILURE (status)) {
-               return (NULL);
-       }
-
-
-       /* Put the new state at the head of the walk list */
-
-       acpi_ds_push_walk_state (walk_state, walk_list);
-
-       return (walk_state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ds_delete_walk_state
- *
- * PARAMETERS:  Walk_state      - State to delete
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Delete a walk state including all internal data structures
- *
- ******************************************************************************/
-
-void
-acpi_ds_delete_walk_state (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       if (!walk_state) {
-               return;
-       }
-
-       if (walk_state->data_type != ACPI_DESC_TYPE_WALK) {
-               return;
-       }
-
-
-       /* Always must free any linked control states */
-
-       while (walk_state->control_state) {
-               state = walk_state->control_state;
-               walk_state->control_state = state->common.next;
-
-               acpi_cm_delete_generic_state (state);
-       }
-
-       /* Always must free any linked parse states */
-
-       while (walk_state->scope_info) {
-               state = walk_state->scope_info;
-               walk_state->scope_info = state->common.next;
-
-               acpi_cm_delete_generic_state (state);
-       }
-
-       /* Always must free any stacked result states */
-
-       while (walk_state->results) {
-               state = walk_state->results;
-               walk_state->results = state->common.next;
-
-               acpi_cm_delete_generic_state (state);
-       }
-
-
-       /* If walk cache is full, just free this wallkstate object */
-
-       if (acpi_gbl_walk_state_cache_depth >= MAX_WALK_CACHE_DEPTH) {
-               acpi_cm_free (walk_state);
-       }
-
-       /* Otherwise put this object back into the cache */
-
-       else {
-               acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-
-               /* Clear the state */
-
-               MEMSET (walk_state, 0, sizeof (ACPI_WALK_STATE));
-               walk_state->data_type = ACPI_DESC_TYPE_WALK;
-
-               /* Put the object at the head of the global cache list */
-
-               walk_state->next = acpi_gbl_walk_state_cache;
-               acpi_gbl_walk_state_cache = walk_state;
-               acpi_gbl_walk_state_cache_depth++;
-
-
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-       }
-
-       return;
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ds_delete_walk_state_cache
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Purge the global state object cache.  Used during subsystem
- *              termination.
- *
- ******************************************************************************/
-
-void
-acpi_ds_delete_walk_state_cache (
-       void)
-{
-       ACPI_WALK_STATE         *next;
-
-
-       /* Traverse the global cache list */
-
-       while (acpi_gbl_walk_state_cache) {
-               /* Delete one cached state object */
-
-               next = acpi_gbl_walk_state_cache->next;
-               acpi_cm_free (acpi_gbl_walk_state_cache);
-               acpi_gbl_walk_state_cache = next;
-               acpi_gbl_walk_state_cache_depth--;
-       }
-
-       return;
-}
-
-
diff --git a/reactos/drivers/bus/acpi/events/evevent.c b/reactos/drivers/bus/acpi/events/evevent.c
deleted file mode 100644 (file)
index 8fafa3c..0000000
+++ /dev/null
@@ -1,765 +0,0 @@
-/******************************************************************************
- *
- * Module Name: evevent - Fixed and General Purpose Acpi_event
- *                          handling and dispatch
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EVENTS
-        MODULE_NAME         ("evevent")
-
-
-/**************************************************************************
- *
- * FUNCTION:    Acpi_ev_initialize
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Ensures that the system control interrupt (SCI) is properly
- *              configured, disables SCI event sources, installs the SCI
- *              handler
- *
- *************************************************************************/
-
-ACPI_STATUS
-acpi_ev_initialize (
-       void)
-{
-       ACPI_STATUS             status;
-
-
-       /* Make sure we have ACPI tables */
-
-       if (!acpi_gbl_DSDT) {
-               return (AE_NO_ACPI_TABLES);
-       }
-
-
-       /* Make sure the BIOS supports ACPI mode */
-
-       if (SYS_MODE_LEGACY == acpi_hw_get_mode_capabilities()) {
-               return (AE_ERROR);
-       }
-
-
-       acpi_gbl_original_mode = acpi_hw_get_mode();
-
-       /*
-        * Initialize the Fixed and General Purpose Acpi_events prior. This is
-        * done prior to enabling SCIs to prevent interrupts from occuring
-        * before handers are installed.
-        */
-
-       status = acpi_ev_fixed_event_initialize ();
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       status = acpi_ev_gpe_initialize ();
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Install the SCI handler */
-
-       status = acpi_ev_install_sci_handler ();
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /* Install handlers for control method GPE handlers (_Lxx, _Exx) */
-
-       status = acpi_ev_init_gpe_control_methods ();
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Install the handler for the Global Lock */
-
-       status = acpi_ev_init_global_lock_handler ();
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_fixed_event_initialize
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initialize the Fixed Acpi_event data structures
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ev_fixed_event_initialize(void)
-{
-       int                     i = 0;
-
-       /* Initialize the structure that keeps track of fixed event handlers */
-
-       for (i = 0; i < NUM_FIXED_EVENTS; i++) {
-               acpi_gbl_fixed_event_handlers[i].handler = NULL;
-               acpi_gbl_fixed_event_handlers[i].context = NULL;
-       }
-
-       acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, TMR_EN, 0);
-       acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, GBL_EN, 0);
-       acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, PWRBTN_EN, 0);
-       acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, SLPBTN_EN, 0);
-       acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, RTC_EN, 0);
-
-       return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_fixed_event_detect
- *
- * PARAMETERS:  None
- *
- * RETURN:      INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
- *
- * DESCRIPTION: Checks the PM status register for fixed events
- *
- ******************************************************************************/
-
-u32
-acpi_ev_fixed_event_detect(void)
-{
-       u32                     int_status = INTERRUPT_NOT_HANDLED;
-       u32                     status_register;
-       u32                     enable_register;
-
-       /*
-        * Read the fixed feature status and enable registers, as all the cases
-        * depend on their values.
-        */
-
-       status_register = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_STS);
-       enable_register = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_EN);
-
-
-       /* power management timer roll over */
-
-       if ((status_register & ACPI_STATUS_PMTIMER) &&
-               (enable_register & ACPI_ENABLE_PMTIMER)) {
-               int_status |= acpi_ev_fixed_event_dispatch (ACPI_EVENT_PMTIMER);
-       }
-
-       /* global event (BIOS want's the global lock) */
-
-       if ((status_register & ACPI_STATUS_GLOBAL) &&
-               (enable_register & ACPI_ENABLE_GLOBAL)) {
-               int_status |= acpi_ev_fixed_event_dispatch (ACPI_EVENT_GLOBAL);
-       }
-
-       /* power button event */
-
-       if ((status_register & ACPI_STATUS_POWER_BUTTON) &&
-               (enable_register & ACPI_ENABLE_POWER_BUTTON)) {
-               int_status |= acpi_ev_fixed_event_dispatch (ACPI_EVENT_POWER_BUTTON);
-       }
-
-       /* sleep button event */
-
-       if ((status_register & ACPI_STATUS_SLEEP_BUTTON) &&
-               (enable_register & ACPI_ENABLE_SLEEP_BUTTON)) {
-               int_status |= acpi_ev_fixed_event_dispatch (ACPI_EVENT_SLEEP_BUTTON);
-       }
-
-       return (int_status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_fixed_event_dispatch
- *
- * PARAMETERS:  Event               - Event type
- *
- * RETURN:      INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
- *
- * DESCRIPTION: Clears the status bit for the requested event, calls the
- *              handler that previously registered for the event.
- *
- ******************************************************************************/
-
-u32
-acpi_ev_fixed_event_dispatch (
-       u32                     event)
-{
-       u32 register_id;
-
-       /* Clear the status bit */
-
-       switch (event) {
-       case ACPI_EVENT_PMTIMER:
-               register_id = TMR_STS;
-               break;
-
-       case ACPI_EVENT_GLOBAL:
-               register_id = GBL_STS;
-               break;
-
-       case ACPI_EVENT_POWER_BUTTON:
-               register_id = PWRBTN_STS;
-               break;
-
-       case ACPI_EVENT_SLEEP_BUTTON:
-               register_id = SLPBTN_STS;
-               break;
-
-       case ACPI_EVENT_RTC:
-               register_id = RTC_STS;
-               break;
-
-       default:
-               return 0;
-               break;
-       }
-
-       acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK, register_id, 1);
-
-       /*
-        * Make sure we've got a handler.  If not, report an error.
-        * The event is disabled to prevent further interrupts.
-        */
-       if (NULL == acpi_gbl_fixed_event_handlers[event].handler) {
-               register_id = (PM1_EN | REGISTER_BIT_ID(register_id));
-
-               acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK,
-                                register_id, 0);
-
-               REPORT_ERROR (
-                       ("Ev_gpe_dispatch: No installed handler for fixed event [%08X]\n",
-                       event));
-
-               return (INTERRUPT_NOT_HANDLED);
-       }
-
-       /* Invoke the handler */
-
-       return ((acpi_gbl_fixed_event_handlers[event].handler)(
-                         acpi_gbl_fixed_event_handlers[event].context));
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_gpe_initialize
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initialize the GPE data structures
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ev_gpe_initialize (void)
-{
-       u32                     i;
-       u32                     j;
-       u32                     register_index;
-       u32                     gpe_number;
-       u16                     gpe0register_count;
-       u16                     gpe1_register_count;
-
-
-       /*
-        * Set up various GPE counts
-        *
-        * You may ask,why are the GPE register block lengths divided by 2?
-        * From the ACPI 2.0 Spec, section, 4.7.1.6 General-Purpose Event
-        * Registers, we have,
-        *
-        * "Each register block contains two registers of equal length
-        * GPEx_STS and GPEx_EN (where x is 0 or 1). The length of the
-        * GPE0_STS and GPE0_EN registers is equal to half the GPE0_LEN
-        * The length of the GPE1_STS and GPE1_EN registers is equal to
-        * half the GPE1_LEN. If a generic register block is not supported
-        * then its respective block pointer and block length values in the
-        * FADT table contain zeros. The GPE0_LEN and GPE1_LEN do not need
-        * to be the same size."
-        */
-
-       gpe0register_count          = (u16) DIV_2 (acpi_gbl_FADT->gpe0blk_len);
-       gpe1_register_count         = (u16) DIV_2 (acpi_gbl_FADT->gpe1_blk_len);
-       acpi_gbl_gpe_register_count = gpe0register_count + gpe1_register_count;
-
-       if (!acpi_gbl_gpe_register_count) {
-               REPORT_WARNING (("Zero GPEs are defined in the FADT\n"));
-               return (AE_OK);
-       }
-
-       /*
-        * Allocate the Gpe information block
-        */
-
-       acpi_gbl_gpe_registers = acpi_cm_callocate (acpi_gbl_gpe_register_count *
-                        sizeof (ACPI_GPE_REGISTERS));
-       if (!acpi_gbl_gpe_registers) {
-               return (AE_NO_MEMORY);
-       }
-
-       /*
-        * Allocate the Gpe dispatch handler block
-        * There are eight distinct GP events per register.
-        * Initialization to zeros is sufficient
-        */
-
-       acpi_gbl_gpe_info = acpi_cm_callocate (MUL_8 (acpi_gbl_gpe_register_count) *
-                        sizeof (ACPI_GPE_LEVEL_INFO));
-       if (!acpi_gbl_gpe_info) {
-               acpi_cm_free (acpi_gbl_gpe_registers);
-               return (AE_NO_MEMORY);
-       }
-
-       /* Set the Gpe validation table to GPE_INVALID */
-
-       MEMSET (acpi_gbl_gpe_valid, (int) ACPI_GPE_INVALID, NUM_GPE);
-
-       /*
-        * Initialize the Gpe information and validation blocks.  A goal of these
-        * blocks is to hide the fact that there are two separate GPE register sets
-        * In a given block, the status registers occupy the first half, and
-        * the enable registers occupy the second half.
-        */
-
-       /* GPE Block 0 */
-
-       register_index = 0;
-
-       for (i = 0; i < gpe0register_count; i++) {
-               acpi_gbl_gpe_registers[register_index].status_addr =
-                                (u16) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) + i);
-
-               acpi_gbl_gpe_registers[register_index].enable_addr =
-                                (u16) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) + i + gpe0register_count);
-
-               acpi_gbl_gpe_registers[register_index].gpe_base = (u8) MUL_8 (i);
-
-               for (j = 0; j < 8; j++) {
-                       gpe_number = acpi_gbl_gpe_registers[register_index].gpe_base + j;
-                       acpi_gbl_gpe_valid[gpe_number] = (u8) register_index;
-               }
-
-               /*
-                * Clear the status/enable registers.  Note that status registers
-                * are cleared by writing a '1', while enable registers are cleared
-                * by writing a '0'.
-                */
-               acpi_os_out8 (acpi_gbl_gpe_registers[register_index].enable_addr, 0x00);
-               acpi_os_out8 (acpi_gbl_gpe_registers[register_index].status_addr, 0xFF);
-
-               register_index++;
-       }
-
-       /* GPE Block 1 */
-
-       for (i = 0; i < gpe1_register_count; i++) {
-               acpi_gbl_gpe_registers[register_index].status_addr =
-                                (u16) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) + i);
-
-               acpi_gbl_gpe_registers[register_index].enable_addr =
-                                (u16) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) + i + gpe1_register_count);
-
-               acpi_gbl_gpe_registers[register_index].gpe_base =
-                                (u8) (acpi_gbl_FADT->gpe1_base + MUL_8 (i));
-
-               for (j = 0; j < 8; j++) {
-                       gpe_number = acpi_gbl_gpe_registers[register_index].gpe_base + j;
-                       acpi_gbl_gpe_valid[gpe_number] = (u8) register_index;
-               }
-
-               /*
-                * Clear the status/enable registers.  Note that status registers
-                * are cleared by writing a '1', while enable registers are cleared
-                * by writing a '0'.
-                */
-               acpi_os_out8 (acpi_gbl_gpe_registers[register_index].enable_addr, 0x00);
-               acpi_os_out8 (acpi_gbl_gpe_registers[register_index].status_addr, 0xFF);
-
-               register_index++;
-       }
-
-       return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_save_method_info
- *
- * PARAMETERS:  None
- *
- * RETURN:      None
- *
- * DESCRIPTION: Called from Acpi_walk_namespace. Expects each object to be a
- *              control method under the _GPE portion of the namespace.
- *              Extract the name and GPE type from the object, saving this
- *              information for quick lookup during GPE dispatch
- *
- *              The name of each GPE control method is of the form:
- *                  "_Lnn" or "_Enn"
- *              Where:
- *                  L      - means that the GPE is level triggered
- *                  E      - means that the GPE is edge triggered
- *                  nn     - is the GPE number
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_ev_save_method_info (
-       ACPI_HANDLE             obj_handle,
-       u32                     level,
-       void                    *obj_desc,
-       void                    **return_value)
-{
-       u32                     gpe_number;
-       NATIVE_CHAR             name[ACPI_NAME_SIZE + 1];
-       u8                      type;
-
-
-       /* Extract the name from the object and convert to a string */
-
-       MOVE_UNALIGNED32_TO_32 (name, &((ACPI_NAMESPACE_NODE *) obj_handle)->name);
-       name[ACPI_NAME_SIZE] = 0;
-
-       /*
-        * Edge/Level determination is based on the 2nd s8 of the method name
-        */
-       if (name[1] == 'L') {
-               type = ACPI_EVENT_LEVEL_TRIGGERED;
-       }
-       else if (name[1] == 'E') {
-               type = ACPI_EVENT_EDGE_TRIGGERED;
-       }
-       else {
-               /* Unknown method type, just ignore it! */
-
-               return (AE_OK);
-       }
-
-       /* Convert the last two characters of the name to the Gpe Number */
-
-       gpe_number = STRTOUL (&name[2], NULL, 16);
-       if (gpe_number == ACPI_UINT32_MAX) {
-               /* Conversion failed; invalid method, just ignore it */
-
-               return (AE_OK);
-       }
-
-       /* Ensure that we have a valid GPE number */
-
-       if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) {
-               /* Not valid, all we can do here is ignore it */
-
-               return (AE_OK);
-       }
-
-       /*
-        * Now we can add this information to the Gpe_info block
-        * for use during dispatch of this GPE.
-        */
-
-       acpi_gbl_gpe_info [gpe_number].type         = type;
-       acpi_gbl_gpe_info [gpe_number].method_handle = obj_handle;
-
-
-       /*
-        * Enable the GPE (SCIs should be disabled at this point)
-        */
-
-       acpi_hw_enable_gpe (gpe_number);
-
-       return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_init_gpe_control_methods
- *
- * PARAMETERS:  None
- *
- * RETURN:      None
- *
- * DESCRIPTION: Obtain the control methods associated with the GPEs.
- *
- *              NOTE: Must be called AFTER namespace initialization!
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ev_init_gpe_control_methods (void)
-{
-       ACPI_STATUS             status;
-
-
-       /* Get a permanent handle to the _GPE object */
-
-       status = acpi_get_handle (NULL, "\\_GPE", &acpi_gbl_gpe_obj_handle);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Traverse the namespace under \_GPE to find all methods there */
-
-       status = acpi_walk_namespace (ACPI_TYPE_METHOD, acpi_gbl_gpe_obj_handle,
-                         ACPI_UINT32_MAX, acpi_ev_save_method_info,
-                         NULL, NULL);
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_gpe_detect
- *
- * PARAMETERS:  None
- *
- * RETURN:      INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
- *
- * DESCRIPTION: Detect if any GP events have occurred
- *
- ******************************************************************************/
-
-u32
-acpi_ev_gpe_detect (void)
-{
-       u32                     int_status = INTERRUPT_NOT_HANDLED;
-       u32                     i;
-       u32                     j;
-       u8                      enabled_status_byte;
-       u8                      bit_mask;
-
-
-       /*
-        * Read all of the 8-bit GPE status and enable registers
-        * in both of the register blocks, saving all of it.
-        * Find all currently active GP events.
-        */
-
-       for (i = 0; i < acpi_gbl_gpe_register_count; i++) {
-               acpi_gbl_gpe_registers[i].status =
-                                  acpi_os_in8 (acpi_gbl_gpe_registers[i].status_addr);
-
-               acpi_gbl_gpe_registers[i].enable =
-                                  acpi_os_in8 (acpi_gbl_gpe_registers[i].enable_addr);
-
-               /* First check if there is anything active at all in this register */
-
-               enabled_status_byte = (u8) (acpi_gbl_gpe_registers[i].status &
-                                 acpi_gbl_gpe_registers[i].enable);
-
-               if (!enabled_status_byte) {
-                       /* No active GPEs in this register, move on */
-
-                       continue;
-               }
-
-               /* Now look at the individual GPEs in this byte register */
-
-               for (j = 0, bit_mask = 1; j < 8; j++, bit_mask <<= 1) {
-                       /* Examine one GPE bit */
-
-                       if (enabled_status_byte & bit_mask) {
-                               /*
-                                * Found an active GPE.  Dispatch the event to a handler
-                                * or method.
-                                */
-                               int_status |=
-                                       acpi_ev_gpe_dispatch (acpi_gbl_gpe_registers[i].gpe_base + j);
-                       }
-               }
-       }
-
-       return (int_status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_asynch_execute_gpe_method
- *
- * PARAMETERS:  Gpe_number      - The 0-based Gpe number
- *
- * RETURN:      None
- *
- * DESCRIPTION: Perform the actual execution of a GPE control method.  This
- *              function is called from an invocation of Acpi_os_queue_for_execution
- *              (and therefore does NOT execute at interrupt level) so that
- *              the control method itself is not executed in the context of
- *              the SCI interrupt handler.
- *
- ******************************************************************************/
-
-static void
-acpi_ev_asynch_execute_gpe_method (
-       void                    *context)
-{
-       NATIVE_UINT             gpe_number = (NATIVE_UINT) context;
-       ACPI_GPE_LEVEL_INFO     gpe_info;
-
-
-       /*
-        * Take a snapshot of the GPE info for this level
-        */
-       acpi_cm_acquire_mutex (ACPI_MTX_EVENTS);
-       gpe_info = acpi_gbl_gpe_info [gpe_number];
-       acpi_cm_release_mutex (ACPI_MTX_EVENTS);
-
-       /*
-        * Method Handler (_Lxx, _Exx):
-        * ----------------------------
-        * Evaluate the _Lxx/_Exx control method that corresponds to this GPE.
-        */
-       if (gpe_info.method_handle) {
-               acpi_ns_evaluate_by_handle (gpe_info.method_handle, NULL, NULL);
-       }
-
-       /*
-        * Level-Triggered?
-        * ----------------
-        * If level-triggered we clear the GPE status bit after handling the event.
-        */
-       if (gpe_info.type & ACPI_EVENT_LEVEL_TRIGGERED) {
-               acpi_hw_clear_gpe (gpe_number);
-       }
-
-       /*
-        * Enable the GPE.
-        */
-       acpi_hw_enable_gpe (gpe_number);
-
-       return;
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_gpe_dispatch
- *
- * PARAMETERS:  Gpe_number      - The 0-based Gpe number
- *
- * RETURN:      INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
- *
- * DESCRIPTION: Handle and dispatch a General Purpose Acpi_event.
- *              Clears the status bit for the requested event.
- *
- * TBD: [Investigate] is this still valid or necessary:
- * The Gpe handler differs from the fixed events in that it clears the enable
- * bit rather than the status bit to clear the interrupt.  This allows
- * software outside of interrupt context to determine what caused the SCI and
- * dispatch the correct AML.
- *
- ******************************************************************************/
-
-u32
-acpi_ev_gpe_dispatch (
-       u32                     gpe_number)
-{
-       ACPI_GPE_LEVEL_INFO     gpe_info;
-
-       /*
-        * Valid GPE number?
-        */
-       if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) {
-               return (INTERRUPT_NOT_HANDLED);
-       }
-
-       /*
-        * Disable the GPE.
-        */
-       acpi_hw_disable_gpe (gpe_number);
-
-       gpe_info = acpi_gbl_gpe_info [gpe_number];
-
-       /*
-        * Edge-Triggered?
-        * ---------------
-        * If edge-triggered, clear the GPE status bit now.  Note that
-        * level-triggered events are cleared after the GPE is serviced.
-        */
-       if (gpe_info.type & ACPI_EVENT_EDGE_TRIGGERED) {
-               acpi_hw_clear_gpe (gpe_number);
-       }
-               /*
-                * Function Handler (e.g. EC)?
-                */
-       if (gpe_info.handler) {
-               /* Invoke function handler (at interrupt level). */
-               gpe_info.handler (gpe_info.context);
-
-               /* Level-Triggered? */
-               if (gpe_info.type & ACPI_EVENT_LEVEL_TRIGGERED) {
-                       acpi_hw_clear_gpe (gpe_number);
-               }
-
-               /* Enable GPE */
-               acpi_hw_enable_gpe (gpe_number);
-       }
-       /*
-        * Method Handler (e.g. _Exx/_Lxx)?
-        */
-       else if (gpe_info.method_handle) {
-               if (ACPI_FAILURE(acpi_os_queue_for_execution (OSD_PRIORITY_GPE,
-                       acpi_ev_asynch_execute_gpe_method, (void*)(NATIVE_UINT)gpe_number))) {
-                       /*
-                        * Shoudn't occur, but if it does report an error. Note that
-                        * the GPE will remain disabled until the ACPI Core Subsystem
-                        * is restarted, or the handler is removed/reinstalled.
-                        */
-                       REPORT_ERROR (("Acpi_ev_gpe_dispatch: Unable to queue handler for GPE bit [%X]\n", gpe_number));
-               }
-       }
-       /*
-        * No Handler? Report an error and leave the GPE disabled.
-        */
-       else {
-               REPORT_ERROR (("Acpi_ev_gpe_dispatch: No installed handler for GPE [%X]\n", gpe_number));
-
-               /* Level-Triggered? */
-               if (gpe_info.type & ACPI_EVENT_LEVEL_TRIGGERED) {
-                       acpi_hw_clear_gpe (gpe_number);
-               }
-       }
-
-       return (INTERRUPT_HANDLED);
-}
diff --git a/reactos/drivers/bus/acpi/events/evmisc.c b/reactos/drivers/bus/acpi/events/evmisc.c
deleted file mode 100644 (file)
index 7d137d1..0000000
+++ /dev/null
@@ -1,439 +0,0 @@
-/******************************************************************************
- *
- * Module Name: evmisc - ACPI device notification handler dispatch
- *                       and ACPI Global Lock support
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EVENTS
-        MODULE_NAME         ("evmisc")
-
-
-/**************************************************************************
- *
- * FUNCTION:    Acpi_ev_queue_notify_request
- *
- * PARAMETERS:
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Dispatch a device notification event to a previously
- *              installed handler.
- *
- *************************************************************************/
-
-ACPI_STATUS
-acpi_ev_queue_notify_request (
-       ACPI_NAMESPACE_NODE     *node,
-       u32                     notify_value)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *handler_obj = NULL;
-       ACPI_GENERIC_STATE      *notify_info;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /*
-        * For value 1 (Ejection Request), some device method may need to be run.
-        * For value 2 (Device Wake) if _PRW exists, the _PS0 method may need to be run.
-        * For value 0x80 (Status Change) on the power button or sleep button,
-        * initiate soft-off or sleep operation?
-        */
-
-       switch (notify_value) {
-       case 0:
-               break;
-
-       case 1:
-               break;
-
-       case 2:
-               break;
-
-       case 0x80:
-               break;
-
-       default:
-               break;
-       }
-
-
-       /*
-        * Get the notify object attached to the device Node
-        */
-
-       obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node);
-       if (obj_desc) {
-
-               /* We have the notify object, Get the right handler */
-
-               switch (node->type) {
-               case ACPI_TYPE_DEVICE:
-                       if (notify_value <= MAX_SYS_NOTIFY) {
-                               handler_obj = obj_desc->device.sys_handler;
-                       }
-                       else {
-                               handler_obj = obj_desc->device.drv_handler;
-                       }
-                       break;
-
-               case ACPI_TYPE_THERMAL:
-                       if (notify_value <= MAX_SYS_NOTIFY) {
-                               handler_obj = obj_desc->thermal_zone.sys_handler;
-                       }
-                       else {
-                               handler_obj = obj_desc->thermal_zone.drv_handler;
-                       }
-                       break;
-               }
-       }
-
-
-       /* If there is any handler to run, schedule the dispatcher */
-
-       if ((acpi_gbl_sys_notify.handler && (notify_value <= MAX_SYS_NOTIFY)) ||
-               (acpi_gbl_drv_notify.handler && (notify_value > MAX_SYS_NOTIFY)) ||
-               handler_obj) {
-
-               notify_info = acpi_cm_create_generic_state ();
-               if (!notify_info) {
-                       return (AE_NO_MEMORY);
-               }
-
-               notify_info->notify.node      = node;
-               notify_info->notify.value     = (u16) notify_value;
-               notify_info->notify.handler_obj = handler_obj;
-
-               status = acpi_os_queue_for_execution (OSD_PRIORITY_HIGH,
-                                 acpi_ev_notify_dispatch, notify_info);
-               if (ACPI_FAILURE (status)) {
-                       acpi_cm_delete_generic_state (notify_info);
-               }
-       }
-
-       if (!handler_obj) {
-               /* There is no per-device notify handler for this device */
-
-       }
-
-
-       return (status);
-}
-
-
-/**************************************************************************
- *
- * FUNCTION:    Acpi_ev_notify_dispatch
- *
- * PARAMETERS:
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Dispatch a device notification event to a previously
- *              installed handler.
- *
- *************************************************************************/
-
-void
-acpi_ev_notify_dispatch (
-       void                    *context)
-{
-       ACPI_GENERIC_STATE      *notify_info = (ACPI_GENERIC_STATE *) context;
-       NOTIFY_HANDLER          global_handler = NULL;
-       void                    *global_context = NULL;
-       ACPI_OPERAND_OBJECT     *handler_obj;
-
-
-       /*
-        * We will invoke a global notify handler if installed.
-        * This is done _before_ we invoke the per-device handler attached to the device.
-        */
-
-       if (notify_info->notify.value <= MAX_SYS_NOTIFY) {
-               /* Global system notification handler */
-
-               if (acpi_gbl_sys_notify.handler) {
-                       global_handler = acpi_gbl_sys_notify.handler;
-                       global_context = acpi_gbl_sys_notify.context;
-               }
-       }
-
-       else {
-               /* Global driver notification handler */
-
-               if (acpi_gbl_drv_notify.handler) {
-                       global_handler = acpi_gbl_drv_notify.handler;
-                       global_context = acpi_gbl_drv_notify.context;
-               }
-       }
-
-
-       /* Invoke the system handler first, if present */
-
-       if (global_handler) {
-               global_handler (notify_info->notify.node, notify_info->notify.value, global_context);
-       }
-
-       /* Now invoke the per-device handler, if present */
-
-       handler_obj = notify_info->notify.handler_obj;
-       if (handler_obj) {
-               handler_obj->notify_handler.handler (notify_info->notify.node, notify_info->notify.value,
-                                 handler_obj->notify_handler.context);
-       }
-
-
-       /* All done with the info object */
-
-       acpi_cm_delete_generic_state (notify_info);
-}
-
-
-/***************************************************************************
- *
- * FUNCTION:    Acpi_ev_global_lock_thread
- *
- * RETURN:      None
- *
- * DESCRIPTION: Invoked by SCI interrupt handler upon acquisition of the
- *              Global Lock.  Simply signal all threads that are waiting
- *              for the lock.
- *
- **************************************************************************/
-
-static void
-acpi_ev_global_lock_thread (
-       void                    *context)
-{
-
-       /* Signal threads that are waiting for the lock */
-
-       if (acpi_gbl_global_lock_thread_count) {
-               /* Send sufficient units to the semaphore */
-
-               acpi_os_signal_semaphore (acpi_gbl_global_lock_semaphore,
-                                acpi_gbl_global_lock_thread_count);
-       }
-}
-
-
-/***************************************************************************
- *
- * FUNCTION:    Acpi_ev_global_lock_handler
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Invoked directly from the SCI handler when a global lock
- *              release interrupt occurs.  Grab the global lock and queue
- *              the global lock thread for execution
- *
- **************************************************************************/
-
-static u32
-acpi_ev_global_lock_handler (
-       void                    *context)
-{
-       u8                      acquired = FALSE;
-       void                    *global_lock;
-
-
-       /*
-        * Attempt to get the lock
-        * If we don't get it now, it will be marked pending and we will
-        * take another interrupt when it becomes free.
-        */
-
-       global_lock = acpi_gbl_FACS->global_lock;
-       ACPI_ACQUIRE_GLOBAL_LOCK (global_lock, acquired);
-       if (acquired) {
-               /* Got the lock, now wake all threads waiting for it */
-
-               acpi_gbl_global_lock_acquired = TRUE;
-
-               /* Run the Global Lock thread which will signal all waiting threads */
-
-               acpi_os_queue_for_execution (OSD_PRIORITY_HIGH, acpi_ev_global_lock_thread,
-                                 context);
-       }
-
-       return (INTERRUPT_HANDLED);
-}
-
-
-/***************************************************************************
- *
- * FUNCTION:    Acpi_ev_init_global_lock_handler
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Install a handler for the global lock release event
- *
- **************************************************************************/
-
-ACPI_STATUS
-acpi_ev_init_global_lock_handler (void)
-{
-       ACPI_STATUS             status;
-
-
-       acpi_gbl_global_lock_present = TRUE;
-       status = acpi_install_fixed_event_handler (ACPI_EVENT_GLOBAL,
-                         acpi_ev_global_lock_handler, NULL);
-
-       /*
-        * If the global lock does not exist on this platform, the attempt
-        * to enable GBL_STS will fail (the GBL_EN bit will not stick)
-        * Map to AE_OK, but mark global lock as not present.
-        * Any attempt to actually use the global lock will be flagged
-        * with an error.
-        */
-       if (status == AE_NO_HARDWARE_RESPONSE) {
-               acpi_gbl_global_lock_present = FALSE;
-               status = AE_OK;
-       }
-
-       return (status);
-}
-
-
-/***************************************************************************
- *
- * FUNCTION:    Acpi_ev_acquire_global_lock
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Attempt to gain ownership of the Global Lock.
- *
- **************************************************************************/
-
-ACPI_STATUS
-acpi_ev_acquire_global_lock(void)
-{
-       ACPI_STATUS             status = AE_OK;
-       u8                      acquired = FALSE;
-       void                    *global_lock;
-
-
-       /* Make sure that we actually have a global lock */
-
-       if (!acpi_gbl_global_lock_present) {
-               return (AE_NO_GLOBAL_LOCK);
-       }
-
-       /* One more thread wants the global lock */
-
-       acpi_gbl_global_lock_thread_count++;
-
-
-       /* If we (OS side) have the hardware lock already, we are done */
-
-       if (acpi_gbl_global_lock_acquired) {
-               return (AE_OK);
-       }
-
-       /* Only if the FACS is valid */
-
-       if (!acpi_gbl_FACS) {
-               return (AE_OK);
-       }
-
-
-       /* We must acquire the actual hardware lock */
-
-       global_lock = acpi_gbl_FACS->global_lock;
-       ACPI_ACQUIRE_GLOBAL_LOCK (global_lock, acquired);
-       if (acquired) {
-          /* We got the lock */
-
-               acpi_gbl_global_lock_acquired = TRUE;
-
-               return (AE_OK);
-       }
-
-
-       /*
-        * Did not get the lock.  The pending bit was set above, and we must now
-        * wait until we get the global lock released interrupt.
-        */
-
-        /*
-         * Acquire the global lock semaphore first.
-         * Since this wait will block, we must release the interpreter
-         */
-
-       status = acpi_aml_system_wait_semaphore (acpi_gbl_global_lock_semaphore,
-                         ACPI_UINT32_MAX);
-
-       return (status);
-}
-
-
-/***************************************************************************
- *
- * FUNCTION:    Acpi_ev_release_global_lock
- *
- * DESCRIPTION: Releases ownership of the Global Lock.
- *
- **************************************************************************/
-
-void
-acpi_ev_release_global_lock (void)
-{
-       u8                      pending = FALSE;
-       void                    *global_lock;
-
-
-       if (!acpi_gbl_global_lock_thread_count) {
-               REPORT_WARNING(("Global Lock has not be acquired, cannot release\n"));
-               return;
-       }
-
-   /* One fewer thread has the global lock */
-
-       acpi_gbl_global_lock_thread_count--;
-
-       /* Have all threads released the lock? */
-
-       if (!acpi_gbl_global_lock_thread_count) {
-               /*
-                * No more threads holding lock, we can do the actual hardware
-                * release
-                */
-
-               global_lock = acpi_gbl_FACS->global_lock;
-               ACPI_RELEASE_GLOBAL_LOCK (global_lock, pending);
-               acpi_gbl_global_lock_acquired = FALSE;
-
-               /*
-                * If the pending bit was set, we must write GBL_RLS to the control
-                * register
-                */
-               if (pending) {
-                       acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK,
-                                        GBL_RLS, 1);
-               }
-       }
-
-       return;
-}
diff --git a/reactos/drivers/bus/acpi/events/evregion.c b/reactos/drivers/bus/acpi/events/evregion.c
deleted file mode 100644 (file)
index 61bb392..0000000
+++ /dev/null
@@ -1,602 +0,0 @@
-/******************************************************************************
- *
- * Module Name: evregion - ACPI Address_space (Op_region) handler dispatch
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EVENTS
-        MODULE_NAME         ("evregion")
-
-
-/**************************************************************************
- *
- * FUNCTION:    Acpi_ev_install_default_address_space_handlers
- *
- * PARAMETERS:
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Installs the core subsystem address space handlers.
- *
- *************************************************************************/
-
-ACPI_STATUS
-acpi_ev_install_default_address_space_handlers (
-       void)
-{
-       ACPI_STATUS             status;
-
-
-       /*
-        * All address spaces (PCI Config, EC, SMBus) are scope dependent
-        * and registration must occur for a specific device.  In the case
-        * system memory and IO address spaces there is currently no device
-        * associated with the address space.  For these we use the root.
-        * We install the default PCI config space handler at the root so
-        * that this space is immediately available even though the we have
-        * not enumerated all the PCI Root Buses yet.  This is to conform
-        * to the ACPI specification which states that the PCI config
-        * space must be always available -- even though we are nowhere
-        * near ready to find the PCI root buses at this point.
-        *
-        * NOTE: We ignore AE_EXIST because this means that a handler has
-        * already been installed (via Acpi_install_address_space_handler)
-        */
-
-       status = acpi_install_address_space_handler (acpi_gbl_root_node,
-                          ADDRESS_SPACE_SYSTEM_MEMORY,
-                          ACPI_DEFAULT_HANDLER, NULL, NULL);
-       if ((ACPI_FAILURE (status)) &&
-               (status != AE_EXIST)) {
-               return (status);
-       }
-
-       status = acpi_install_address_space_handler (acpi_gbl_root_node,
-                          ADDRESS_SPACE_SYSTEM_IO,
-                          ACPI_DEFAULT_HANDLER, NULL, NULL);
-       if ((ACPI_FAILURE (status)) &&
-               (status != AE_EXIST)) {
-               return (status);
-       }
-
-       status = acpi_install_address_space_handler (acpi_gbl_root_node,
-                          ADDRESS_SPACE_PCI_CONFIG,
-                          ACPI_DEFAULT_HANDLER, NULL, NULL);
-       if ((ACPI_FAILURE (status)) &&
-               (status != AE_EXIST)) {
-               return (status);
-       }
-
-
-       return (AE_OK);
-}
-
-
-/* TBD: [Restructure] Move elsewhere */
-
-/**************************************************************************
- *
- * FUNCTION:    Acpi_ev_execute_reg_method
- *
- * PARAMETERS:  Region_obj          - Object structure
- *              Function            - On (1) or Off (0)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute _REG method for a region
- *
- *************************************************************************/
-
-static ACPI_STATUS
-acpi_ev_execute_reg_method (
-       ACPI_OPERAND_OBJECT    *region_obj,
-       u32                     function)
-{
-       ACPI_OPERAND_OBJECT    *params[3];
-       ACPI_OPERAND_OBJECT     space_id_desc;
-       ACPI_OPERAND_OBJECT     function_desc;
-       ACPI_STATUS             status;
-
-
-       if (region_obj->region.extra->extra.method_REG == NULL) {
-               return (AE_OK);
-       }
-
-       /*
-        *  _REG method has two arguments
-        *  Arg0:   Integer: Operation region space ID
-        *          Same value as Region_obj->Region.Space_id
-        *  Arg1:   Integer: connection status
-        *          1 for connecting the handler,
-        *          0 for disconnecting the handler
-        *          Passed as a parameter
-        */
-
-       acpi_cm_init_static_object (&space_id_desc);
-       acpi_cm_init_static_object (&function_desc);
-
-       /*
-        *  Method requires two parameters.
-        */
-       params [0] = &space_id_desc;
-       params [1] = &function_desc;
-       params [2] = NULL;
-
-       /*
-        *  Set up the parameter objects
-        */
-       space_id_desc.common.type  = ACPI_TYPE_INTEGER;
-       space_id_desc.integer.value = region_obj->region.space_id;
-
-       function_desc.common.type  = ACPI_TYPE_INTEGER;
-       function_desc.integer.value = function;
-
-       /*
-        *  Execute the method, no return value
-        */
-       status = acpi_ns_evaluate_by_handle (region_obj->region.extra->extra.method_REG, params, NULL);
-       return (status);
-}
-
-
-/**************************************************************************
- *
- * FUNCTION:    Acpi_ev_address_space_dispatch
- *
- * PARAMETERS:  Region_obj          - internal region object
- *              Space_id            - ID of the address space (0-255)
- *              Function            - Read or Write operation
- *              Address             - Where in the space to read or write
- *              Bit_width           - Field width in bits (8, 16, or 32)
- *              Value               - Pointer to in or out value
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Dispatch an address space or operation region access to
- *              a previously installed handler.
- *
- *************************************************************************/
-
-ACPI_STATUS
-acpi_ev_address_space_dispatch (
-       ACPI_OPERAND_OBJECT     *region_obj,
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value)
-{
-       ACPI_STATUS             status;
-       ADDRESS_SPACE_HANDLER   handler;
-       ADDRESS_SPACE_SETUP     region_setup;
-       ACPI_OPERAND_OBJECT     *handler_desc;
-       void                    *region_context = NULL;
-
-
-       /*
-        * Ensure that there is a handler associated with this region
-        */
-       handler_desc = region_obj->region.addr_handler;
-       if (!handler_desc) {
-               return(AE_NOT_EXIST);
-       }
-
-       /*
-        * It may be the case that the region has never been initialized
-        * Some types of regions require special init code
-        */
-       if (!(region_obj->region.flags & AOPOBJ_INITIALIZED)) {
-               /*
-                * This region has not been initialized yet, do it
-                */
-               region_setup = handler_desc->addr_handler.setup;
-               if (!region_setup) {
-                       /*
-                        *  Bad news, no init routine and not init'd
-                        */
-                       return (AE_UNKNOWN_STATUS);
-               }
-
-               /*
-                * We must exit the interpreter because the region setup will potentially
-                * execute control methods
-                */
-               acpi_aml_exit_interpreter ();
-
-               status = region_setup (region_obj, ACPI_REGION_ACTIVATE,
-                                 handler_desc->addr_handler.context,
-                                 &region_context);
-
-               /* Re-enter the interpreter */
-
-               acpi_aml_enter_interpreter ();
-
-               /*
-                *  Init routine may fail
-                */
-               if (ACPI_FAILURE (status)) {
-                       return(status);
-               }
-
-               region_obj->region.flags |= AOPOBJ_INITIALIZED;
-
-               /*
-                *  Save the returned context for use in all accesses to
-                *  this particular region.
-                */
-               region_obj->region.extra->extra.region_context = region_context;
-       }
-
-       /*
-        *  We have everything we need, begin the process
-        */
-       handler = handler_desc->addr_handler.handler;
-
-       if (!(handler_desc->addr_handler.flags & ADDR_HANDLER_DEFAULT_INSTALLED)) {
-               /*
-                *  For handlers other than the default (supplied) handlers, we must
-                *  exit the interpreter because the handler *might* block -- we don't
-                *  know what it will do, so we can't hold the lock on the intepreter.
-                */
-               acpi_aml_exit_interpreter();
-       }
-
-       /*
-        *  Invoke the handler.
-        */
-       status = handler (function, address, bit_width, value,
-                        handler_desc->addr_handler.context,
-                        region_obj->region.extra->extra.region_context);
-
-
-       if (!(handler_desc->addr_handler.flags & ADDR_HANDLER_DEFAULT_INSTALLED)) {
-               /* We just returned from a non-default handler, we must re-enter the
-               interpreter */
-
-               acpi_aml_enter_interpreter ();
-       }
-
-       return (status);
-}
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_disassociate_region_from_handler
- *
- * PARAMETERS:  Region_obj      - Region Object
- *              Acpi_ns_is_locked - Namespace Region Already Locked?
- *
- * RETURN:      None
- *
- * DESCRIPTION: Break the association between the handler and the region
- *              this is a two way association.
- *
- ******************************************************************************/
-
-void
-acpi_ev_disassociate_region_from_handler(
-       ACPI_OPERAND_OBJECT     *region_obj,
-       u8                      acpi_ns_is_locked)
-{
-       ACPI_OPERAND_OBJECT     *handler_obj;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     **last_obj_ptr;
-       ADDRESS_SPACE_SETUP     region_setup;
-       void                    *region_context;
-       ACPI_STATUS             status;
-
-
-       region_context = region_obj->region.extra->extra.region_context;
-
-       /*
-        *  Get the address handler from the region object
-        */
-
-       handler_obj = region_obj->region.addr_handler;
-       if (!handler_obj) {
-               /*
-                *  This region has no handler, all done
-                */
-               return;
-       }
-
-
-       /*
-        *  Find this region in the handler's list
-        */
-
-       obj_desc = handler_obj->addr_handler.region_list;
-       last_obj_ptr = &handler_obj->addr_handler.region_list;
-
-       while (obj_desc) {
-               /*
-                *  See if this is the one
-                */
-               if (obj_desc == region_obj) {
-                       /*
-                        *  This is it, remove it from the handler's list
-                        */
-                       *last_obj_ptr = obj_desc->region.next;
-                       obj_desc->region.next = NULL;           /* Must clear field */
-
-                       if (acpi_ns_is_locked) {
-                               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-                       }
-
-                       /*
-                        *  Now stop region accesses by executing the _REG method
-                        */
-                       acpi_ev_execute_reg_method (region_obj, 0);
-
-                       if (acpi_ns_is_locked) {
-                               acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-                       }
-
-                       /*
-                        *  Call the setup handler with the deactivate notification
-                        */
-                       region_setup = handler_obj->addr_handler.setup;
-                       status = region_setup (region_obj, ACPI_REGION_DEACTIVATE,
-                                         handler_obj->addr_handler.context,
-                                         &region_context);
-
-                       /*
-                        *  Init routine may fail, Just ignore errors
-                        */
-
-                       region_obj->region.flags &= ~(AOPOBJ_INITIALIZED);
-
-                       /*
-                        *  Remove handler reference in the region
-                        *
-                        *  NOTE: this doesn't mean that the region goes away
-                        *  The region is just inaccessible as indicated to
-                        *  the _REG method
-                        *
-                        *  If the region is on the handler's list
-                        *  this better be the region's handler
-                        */
-                       ACPI_ASSERT (region_obj->region.addr_handler == handler_obj);
-
-                       region_obj->region.addr_handler = NULL;
-
-                       return;
-
-               } /* found the right handler */
-
-               /*
-                *  Move through the linked list of handlers
-                */
-               last_obj_ptr = &obj_desc->region.next;
-               obj_desc = obj_desc->region.next;
-       }
-
-       /*
-        *  If we get here, the region was not in the handler's region list
-        */
-       return;
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_associate_region_and_handler
- *
- * PARAMETERS:  Handler_obj     - Handler Object
- *              Region_obj      - Region Object
- *              Acpi_ns_is_locked - Namespace Region Already Locked?
- *
- * RETURN:      None
- *
- * DESCRIPTION: Create the association between the handler and the region
- *              this is a two way association.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ev_associate_region_and_handler (
-       ACPI_OPERAND_OBJECT     *handler_obj,
-       ACPI_OPERAND_OBJECT     *region_obj,
-       u8                      acpi_ns_is_locked)
-{
-       ACPI_STATUS     status;
-
-
-       ACPI_ASSERT (region_obj->region.space_id == handler_obj->addr_handler.space_id);
-       ACPI_ASSERT (region_obj->region.addr_handler == 0);
-
-       /*
-        *  Link this region to the front of the handler's list
-        */
-
-       region_obj->region.next = handler_obj->addr_handler.region_list;
-       handler_obj->addr_handler.region_list = region_obj;
-
-       /*
-        *  set the region's handler
-        */
-
-/*
-       Handler_obj->Common.Reference_count =
-                         (u16) (Handler_obj->Common.Reference_count +
-                         Region_obj->Common.Reference_count - 1);
-*/
-       region_obj->region.addr_handler = handler_obj;
-
-       /*
-        *  Last thing, tell all users that this region is usable
-        */
-       if (acpi_ns_is_locked) {
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       }
-
-       status = acpi_ev_execute_reg_method (region_obj, 1);
-
-       if (acpi_ns_is_locked) {
-               acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-       }
-
-       return (status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ev_addr_handler_helper
- *
- * PARAMETERS:  Handle              - Node to be dumped
- *              Level               - Nesting level of the handle
- *              Context             - Passed into Acpi_ns_walk_namespace
- *
- * DESCRIPTION: This routine checks to see if the object is a Region if it
- *              is then the address handler is installed in it.
- *
- *              If the Object is a Device, and the device has a handler of
- *              the same type then the search is terminated in that branch.
- *
- *              This is because the existing handler is closer in proximity
- *              to any more regions than the one we are trying to install.
- *
- ***************************************************************************/
-
-ACPI_STATUS
-acpi_ev_addr_handler_helper (
-       ACPI_HANDLE             obj_handle,
-       u32                     level,
-       void                    *context,
-       void                    **return_value)
-{
-       ACPI_OPERAND_OBJECT     *handler_obj;
-       ACPI_OPERAND_OBJECT     *tmp_obj;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_STATUS             status;
-
-
-       handler_obj = (ACPI_OPERAND_OBJECT *) context;
-
-       /* Parameter validation */
-
-       if (!handler_obj) {
-               return (AE_OK);
-       }
-
-       /* Convert and validate the device handle */
-
-       node = acpi_ns_convert_handle_to_entry (obj_handle);
-       if (!node) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        *  We only care about regions.and objects
-        *  that can have address handlers
-        */
-
-       if ((node->type != ACPI_TYPE_DEVICE) &&
-               (node->type != ACPI_TYPE_REGION) &&
-               (node != acpi_gbl_root_node)) {
-               return (AE_OK);
-       }
-
-       /* Check for an existing internal object */
-
-       obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node);
-       if (!obj_desc) {
-               /*
-                *  The object DNE, we don't care about it
-                */
-               return (AE_OK);
-       }
-
-       /*
-        *  Devices are handled different than regions
-        */
-       if (IS_THIS_OBJECT_TYPE (obj_desc, ACPI_TYPE_DEVICE)) {
-               /*
-                *  See if this guy has any handlers
-                */
-               tmp_obj = obj_desc->device.addr_handler;
-               while (tmp_obj) {
-                       /*
-                        *  Now let's see if it's for the same address space.
-                        */
-                       if (tmp_obj->addr_handler.space_id == handler_obj->addr_handler.space_id) {
-                               /*
-                                *  It's for the same address space
-                                */
-                               /*
-                                *  Since the object we found it on was a device, then it
-                                *  means that someone has already installed a handler for
-                                *  the branch of the namespace from this device on.  Just
-                                *  bail out telling the walk routine to not traverse this
-                                *  branch.  This preserves the scoping rule for handlers.
-                                */
-                               return (AE_CTRL_DEPTH);
-                       }
-
-                       /*
-                        *  Move through the linked list of handlers
-                        */
-                       tmp_obj = tmp_obj->addr_handler.next;
-               }
-
-               /*
-                *  As long as the device didn't have a handler for this
-                *  space we don't care about it.  We just ignore it and
-                *  proceed.
-                */
-               return (AE_OK);
-       }
-
-       /*
-        *  Only here if it was a region
-        */
-       ACPI_ASSERT (obj_desc->common.type == ACPI_TYPE_REGION);
-
-       if (obj_desc->region.space_id != handler_obj->addr_handler.space_id) {
-               /*
-                *  This region is for a different address space
-                *  ignore it
-                */
-               return (AE_OK);
-       }
-
-       /*
-        *  Now we have a region and it is for the handler's address
-        *  space type.
-        *
-        *  First disconnect region for any previous handler (if any)
-        */
-       acpi_ev_disassociate_region_from_handler (obj_desc, FALSE);
-
-       /*
-        *  Then connect the region to the new handler
-        */
-       status = acpi_ev_associate_region_and_handler (handler_obj, obj_desc, FALSE);
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/events/evrgnini.c b/reactos/drivers/bus/acpi/events/evrgnini.c
deleted file mode 100644 (file)
index e37e78a..0000000
+++ /dev/null
@@ -1,413 +0,0 @@
-/******************************************************************************
- *
- * Module Name: evrgnini- ACPI Address_space (Op_region) init
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EVENTS
-        MODULE_NAME         ("evrgnini")
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ev_system_memory_region_setup
- *
- * PARAMETERS:  Region_obj          - region we are interested in
- *              Function            - start or stop
- *              Handler_context     - Address space handler context
- *              Region_context      - Region specific context
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Do any prep work for region handling, a nop for now
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ev_system_memory_region_setup (
-       ACPI_HANDLE             handle,
-       u32                     function,
-       void                    *handler_context,
-       void                    **region_context)
-{
-
-       if (function == ACPI_REGION_DEACTIVATE) {
-               if (*region_context) {
-                       acpi_cm_free (*region_context);
-                       *region_context = NULL;
-               }
-               return (AE_OK);
-       }
-
-
-       /* Activate.  Create a new context */
-
-       *region_context = acpi_cm_callocate (sizeof (MEM_HANDLER_CONTEXT));
-       if (!(*region_context)) {
-               return (AE_NO_MEMORY);
-       }
-
-       return (AE_OK);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ev_io_space_region_setup
- *
- * PARAMETERS:  Region_obj          - region we are interested in
- *              Function            - start or stop
- *              Handler_context     - Address space handler context
- *              Region_context      - Region specific context
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Do any prep work for region handling
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ev_io_space_region_setup (
-       ACPI_HANDLE             handle,
-       u32                     function,
-       void                    *handler_context,
-       void                    **region_context)
-{
-       if (function == ACPI_REGION_DEACTIVATE) {
-               *region_context = NULL;
-       }
-       else {
-               *region_context = handler_context;
-       }
-
-       return (AE_OK);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ev_pci_config_region_setup
- *
- * PARAMETERS:  Region_obj          - region we are interested in
- *              Function            - start or stop
- *              Handler_context     - Address space handler context
- *              Region_context      - Region specific context
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Do any prep work for region handling
- *
- * MUTEX:       Assumes namespace is not locked
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ev_pci_config_region_setup (
-       ACPI_HANDLE             handle,
-       u32                     function,
-       void                    *handler_context,
-       void                    **region_context)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_INTEGER            temp;
-       PCI_HANDLER_CONTEXT     *pci_context = *region_context;
-       ACPI_OPERAND_OBJECT     *handler_obj;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_OPERAND_OBJECT     *region_obj = (ACPI_OPERAND_OBJECT *) handle;
-       DEVICE_ID               object_hID;
-
-       handler_obj = region_obj->region.addr_handler;
-
-       if (!handler_obj) {
-               /*
-                *  No installed handler. This shouldn't happen because the dispatch
-                *  routine checks before we get here, but we check again just in case.
-                */
-               return(AE_NOT_EXIST);
-       }
-
-       if (function == ACPI_REGION_DEACTIVATE) {
-               if (pci_context) {
-                       acpi_cm_free (pci_context);
-                       *region_context = NULL;
-               }
-
-               return (status);
-       }
-
-
-       /* Create a new context */
-
-       pci_context = acpi_cm_callocate (sizeof(PCI_HANDLER_CONTEXT));
-       if (!pci_context) {
-               return (AE_NO_MEMORY);
-       }
-
-       /*
-        *  For PCI Config space access, we have to pass the segment, bus,
-        *  device and function numbers.  This routine must acquire those.
-        */
-
-       /*
-        *  First get device and function numbers from the _ADR object
-        *  in the parent's scope.
-        */
-       ACPI_ASSERT(region_obj->region.node);
-
-       node = acpi_ns_get_parent_object (region_obj->region.node);
-
-
-       /* Acpi_evaluate the _ADR object */
-
-       status = acpi_cm_evaluate_numeric_object (METHOD_NAME__ADR, node, &temp);
-       /*
-        *  The default is zero, since the allocation above zeroed the data, just
-        *  do nothing on failures.
-        */
-       if (ACPI_SUCCESS (status)) {
-               /*
-                *  Got it..
-                */
-               pci_context->dev_func = (u32) temp;
-       }
-
-       /*
-        *  Get the _SEG and _BBN values from the device upon which the handler
-        *  is installed.
-        *
-        *  We need to get the _SEG and _BBN objects relative to the PCI BUS device.
-        *  This is the device the handler has been registered to handle.
-        */
-
-       /*
-        *  If the Addr_handler.Node is still pointing to the root, we need
-        *  to scan upward for a PCI Root bridge and re-associate the Op_region
-        *  handlers with that device.
-        */
-       if (handler_obj->addr_handler.node == acpi_gbl_root_node) {
-               /*
-                * Node is currently the parent object
-                */
-               while (node != acpi_gbl_root_node) {
-                       status = acpi_cm_execute_HID(node, &object_hID);
-
-                       if (ACPI_SUCCESS (status)) {
-                               if (!(STRNCMP(object_hID.buffer, PCI_ROOT_HID_STRING,
-                                                  sizeof (PCI_ROOT_HID_STRING)))) {
-                                       acpi_install_address_space_handler(node,
-                                                          ADDRESS_SPACE_PCI_CONFIG,
-                                                          ACPI_DEFAULT_HANDLER, NULL, NULL);
-
-                                       break;
-                               }
-                       }
-
-                       node = acpi_ns_get_parent_object(node);
-               }
-       }
-       else {
-               node = handler_obj->addr_handler.node;
-       }
-
-       status = acpi_cm_evaluate_numeric_object (METHOD_NAME__SEG, node, &temp);
-       if (ACPI_SUCCESS (status)) {
-               /*
-                *  Got it..
-                */
-               pci_context->seg = (u32) temp;
-       }
-
-       status = acpi_cm_evaluate_numeric_object (METHOD_NAME__BBN, node, &temp);
-       if (ACPI_SUCCESS (status)) {
-               /*
-                *  Got it..
-                */
-               pci_context->bus = (u32) temp;
-       }
-
-       *region_context = pci_context;
-
-       return (AE_OK);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_ev_default_region_setup
- *
- * PARAMETERS:  Region_obj          - region we are interested in
- *              Function            - start or stop
- *              Handler_context     - Address space handler context
- *              Region_context      - Region specific context
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Do any prep work for region handling
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ev_default_region_setup (
-       ACPI_HANDLE             handle,
-       u32                     function,
-       void                    *handler_context,
-       void                    **region_context)
-{
-       if (function == ACPI_REGION_DEACTIVATE) {
-               *region_context = NULL;
-       }
-       else {
-               *region_context = handler_context;
-       }
-
-       return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_initialize_region
- *
- * PARAMETERS:  Region_obj - Region we are initializing
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initializes the region, finds any _REG methods and saves them
- *              for execution at a later time
- *
- *              Get the appropriate address space handler for a newly
- *              created region.
- *
- *              This also performs address space specific intialization.  For
- *              example, PCI regions must have an _ADR object that contains
- *              a PCI address in the scope of the defintion.  This address is
- *              required to perform an access to PCI config space.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ev_initialize_region (
-       ACPI_OPERAND_OBJECT     *region_obj,
-       u8                      acpi_ns_locked)
-{
-       ACPI_OPERAND_OBJECT    *handler_obj;
-       ACPI_OPERAND_OBJECT    *obj_desc;
-       ACPI_ADDRESS_SPACE_TYPE space_id;
-       ACPI_NAMESPACE_NODE    *node;
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE    *method_node;
-       ACPI_NAME              *reg_name_ptr = (ACPI_NAME *) METHOD_NAME__REG;
-
-
-       if (!region_obj) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       ACPI_ASSERT(region_obj->region.node);
-
-       node = acpi_ns_get_parent_object (region_obj->region.node);
-       space_id = region_obj->region.space_id;
-
-       region_obj->region.addr_handler = NULL;
-       region_obj->region.extra->extra.method_REG = NULL;
-       region_obj->region.flags &= ~(AOPOBJ_INITIALIZED);
-
-       /*
-        *  Find any "_REG" associated with this region definition
-        */
-       status = acpi_ns_search_node (*reg_name_ptr, node,
-                         ACPI_TYPE_METHOD, &method_node);
-       if (ACPI_SUCCESS (status)) {
-               /*
-                *  The _REG method is optional and there can be only one per region
-                *  definition.  This will be executed when the handler is attached
-                *  or removed
-                */
-               region_obj->region.extra->extra.method_REG = method_node;
-       }
-
-       /*
-        *  The following loop depends upon the root Node having no parent
-        *  ie: Acpi_gbl_Root_node->Parent_entry being set to NULL
-        */
-       while (node) {
-               /*
-                *  Check to see if a handler exists
-                */
-               handler_obj = NULL;
-               obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node);
-               if (obj_desc) {
-                       /*
-                        *  can only be a handler if the object exists
-                        */
-                       switch (node->type) {
-                       case ACPI_TYPE_DEVICE:
-
-                               handler_obj = obj_desc->device.addr_handler;
-                               break;
-
-                       case ACPI_TYPE_PROCESSOR:
-
-                               handler_obj = obj_desc->processor.addr_handler;
-                               break;
-
-                       case ACPI_TYPE_THERMAL:
-
-                               handler_obj = obj_desc->thermal_zone.addr_handler;
-                               break;
-                       }
-
-                       while (handler_obj) {
-                               /*
-                                *  This guy has at least one address handler
-                                *  see if it has the type we want
-                                */
-                               if (handler_obj->addr_handler.space_id == space_id) {
-                                       /*
-                                        *  Found it! Now update the region and the handler
-                                        */
-                                       acpi_ev_associate_region_and_handler (handler_obj, region_obj, acpi_ns_locked);
-                                       return (AE_OK);
-                               }
-
-                               handler_obj = handler_obj->addr_handler.next;
-
-                       } /* while handlerobj */
-               }
-
-               /*
-                *  This one does not have the handler we need
-                *  Pop up one level
-                */
-               node = acpi_ns_get_parent_object (node);
-
-       } /* while Node != ROOT */
-
-       /*
-        *  If we get here, there is no handler for this region
-        */
-       return (AE_NOT_EXIST);
-}
-
diff --git a/reactos/drivers/bus/acpi/events/evsci.c b/reactos/drivers/bus/acpi/events/evsci.c
deleted file mode 100644 (file)
index 748c5f7..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: evsci - System Control Interrupt configuration and
- *                      legacy to ACPI mode state transition functions
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EVENTS
-        MODULE_NAME         ("evsci")
-
-
-/*
- * Elements correspond to counts for TMR, NOT_USED, GBL, PWR_BTN, SLP_BTN, RTC,
- * and GENERAL respectively.  These counts are modified by the ACPI interrupt
- * handler.
- *
- * TBD: [Investigate] Note that GENERAL should probably be split out into
- * one element for each bit in the GPE registers
- */
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ev_sci_handler
- *
- * PARAMETERS:  Context   - Calling Context
- *
- * RETURN:      Status code indicates whether interrupt was handled.
- *
- * DESCRIPTION: Interrupt handler that will figure out what function or
- *              control method to call to deal with a SCI.  Installed
- *              using BU interrupt support.
- *
- ******************************************************************************/
-
-static u32
-acpi_ev_sci_handler (void *context)
-{
-       u32                     interrupt_handled = INTERRUPT_NOT_HANDLED;
-
-
-       /*
-        * Make sure that ACPI is enabled by checking SCI_EN.  Note that we are
-        * required to treat the SCI interrupt as sharable, level, active low.
-        */
-       if (!acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_DO_NOT_LOCK, SCI_EN)) {
-               /* ACPI is not enabled;  this interrupt cannot be for us */
-
-               return (INTERRUPT_NOT_HANDLED);
-       }
-
-       /*
-        * Fixed Acpi_events:
-        * -------------
-        * Check for and dispatch any Fixed Acpi_events that have occurred
-        */
-       interrupt_handled |= acpi_ev_fixed_event_detect ();
-
-       /*
-        * GPEs:
-        * -----
-        * Check for and dispatch any GPEs that have occurred
-        */
-       interrupt_handled |= acpi_ev_gpe_detect ();
-
-       return (interrupt_handled);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_install_sci_handler
- *
- * PARAMETERS:  none
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Installs SCI handler.
- *
- ******************************************************************************/
-
-u32
-acpi_ev_install_sci_handler (void)
-{
-       u32                     except = AE_OK;
-
-
-       except = acpi_os_install_interrupt_handler ((u32) acpi_gbl_FADT->sci_int,
-                         acpi_ev_sci_handler,
-                         NULL);
-
-       return (except);
-}
-
-
-/******************************************************************************
-
- *
- * FUNCTION:    Acpi_ev_remove_sci_handler
- *
- * PARAMETERS:  none
- *
- * RETURN:      E_OK if handler uninstalled OK, E_ERROR if handler was not
- *              installed to begin with
- *
- * DESCRIPTION: Restores original status of all fixed event enable bits and
- *              removes SCI handler.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ev_remove_sci_handler (void)
-{
-#if 0
-       /* TBD:[Investigate] Figure this out!!  Disable all events first ???  */
-
-       if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (TMR_FIXED_EVENT)) {
-               acpi_event_disable_event (TMR_FIXED_EVENT);
-       }
-
-       if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (GBL_FIXED_EVENT)) {
-               acpi_event_disable_event (GBL_FIXED_EVENT);
-       }
-
-       if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (PWR_BTN_FIXED_EVENT)) {
-               acpi_event_disable_event (PWR_BTN_FIXED_EVENT);
-       }
-
-       if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (SLP_BTN_FIXED_EVENT)) {
-               acpi_event_disable_event (SLP_BTN_FIXED_EVENT);
-       }
-
-       if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (RTC_FIXED_EVENT)) {
-               acpi_event_disable_event (RTC_FIXED_EVENT);
-       }
-
-       original_fixed_enable_bit_status = 0;
-
-#endif
-
-       acpi_os_remove_interrupt_handler ((u32) acpi_gbl_FADT->sci_int,
-                          acpi_ev_sci_handler);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ev_restore_acpi_state
- *
- * PARAMETERS:  none
- *
- * RETURN:      none
- *
- * DESCRIPTION: Restore the original ACPI state of the machine
- *
- ******************************************************************************/
-
-void
-acpi_ev_restore_acpi_state (void)
-{
-       u32                     index;
-
-
-       /* Restore the state of the chipset enable bits. */
-
-       if (acpi_gbl_restore_acpi_chipset == TRUE) {
-               /* Restore the fixed events */
-
-               if (acpi_hw_register_read (ACPI_MTX_LOCK, PM1_EN) !=
-                               acpi_gbl_pm1_enable_register_save) {
-                       acpi_hw_register_write (ACPI_MTX_LOCK, PM1_EN,
-                               acpi_gbl_pm1_enable_register_save);
-               }
-
-
-               /* Ensure that all status bits are clear */
-
-               acpi_hw_clear_acpi_status ();
-
-
-               /* Now restore the GPEs */
-
-               for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe0blk_len); index++) {
-                       if (acpi_hw_register_read (ACPI_MTX_LOCK, GPE0_EN_BLOCK | index) !=
-                                       acpi_gbl_gpe0enable_register_save[index]) {
-                               acpi_hw_register_write (ACPI_MTX_LOCK, GPE0_EN_BLOCK | index,
-                                       acpi_gbl_gpe0enable_register_save[index]);
-                       }
-               }
-
-               /* GPE 1 present? */
-
-               if (acpi_gbl_FADT->gpe1_blk_len) {
-                       for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe1_blk_len); index++) {
-                               if (acpi_hw_register_read (ACPI_MTX_LOCK, GPE1_EN_BLOCK | index) !=
-                                       acpi_gbl_gpe1_enable_register_save[index]) {
-                                       acpi_hw_register_write (ACPI_MTX_LOCK, GPE1_EN_BLOCK | index,
-                                               acpi_gbl_gpe1_enable_register_save[index]);
-                               }
-                       }
-               }
-
-               if (acpi_hw_get_mode() != acpi_gbl_original_mode) {
-                       acpi_hw_set_mode (acpi_gbl_original_mode);
-               }
-       }
-
-       return;
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ev_terminate
- *
- * PARAMETERS:  none
- *
- * RETURN:      none
- *
- * DESCRIPTION: free memory allocated for table storage.
- *
- ******************************************************************************/
-
-void
-acpi_ev_terminate (void)
-{
-
-
-       /*
-        * Free global tables, etc.
-        */
-
-       if (acpi_gbl_gpe_registers) {
-               acpi_cm_free (acpi_gbl_gpe_registers);
-       }
-
-       if (acpi_gbl_gpe_info) {
-               acpi_cm_free (acpi_gbl_gpe_info);
-       }
-
-       return;
-}
-
-
diff --git a/reactos/drivers/bus/acpi/events/evxface.c b/reactos/drivers/bus/acpi/events/evxface.c
deleted file mode 100644 (file)
index 3322616..0000000
+++ /dev/null
@@ -1,604 +0,0 @@
-/******************************************************************************
- *
- * Module Name: evxface - External interfaces for ACPI events
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EVENTS
-        MODULE_NAME         ("evxface")
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_install_fixed_event_handler
- *
- * PARAMETERS:  Event           - Event type to enable.
- *              Handler         - Pointer to the handler function for the
- *                                event
- *              Context         - Value passed to the handler on each GPE
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Saves the pointer to the handler function and then enables the
- *              event.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_install_fixed_event_handler (
-       u32                     event,
-       FIXED_EVENT_HANDLER     handler,
-       void                    *context)
-{
-       ACPI_STATUS             status;
-
-
-       /* Parameter validation */
-
-       if (event >= NUM_FIXED_EVENTS) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_EVENTS);
-
-       /* Don't allow two handlers. */
-
-       if (NULL != acpi_gbl_fixed_event_handlers[event].handler) {
-               status = AE_EXIST;
-               goto cleanup;
-       }
-
-
-       /* Install the handler before enabling the event - just in case... */
-
-       acpi_gbl_fixed_event_handlers[event].handler = handler;
-       acpi_gbl_fixed_event_handlers[event].context = context;
-
-       status = acpi_enable_event (event, ACPI_EVENT_FIXED);
-       if (!ACPI_SUCCESS (status)) {
-               /* Remove the handler */
-
-               acpi_gbl_fixed_event_handlers[event].handler = NULL;
-               acpi_gbl_fixed_event_handlers[event].context = NULL;
-       }
-
-
-
-cleanup:
-       acpi_cm_release_mutex (ACPI_MTX_EVENTS);
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_remove_fixed_event_handler
- *
- * PARAMETERS:  Event           - Event type to disable.
- *              Handler         - Address of the handler
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Disables the event and unregisters the event handler.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_remove_fixed_event_handler (
-       u32                     event,
-       FIXED_EVENT_HANDLER     handler)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Parameter validation */
-
-       if (event >= NUM_FIXED_EVENTS) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_EVENTS);
-
-       /* Disable the event before removing the handler - just in case... */
-
-       status = acpi_disable_event(event, ACPI_EVENT_FIXED);
-
-       /* Always Remove the handler */
-
-       acpi_gbl_fixed_event_handlers[event].handler = NULL;
-       acpi_gbl_fixed_event_handlers[event].context = NULL;
-
-
-
-
-       acpi_cm_release_mutex (ACPI_MTX_EVENTS);
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_install_notify_handler
- *
- * PARAMETERS:  Device          - The device for which notifies will be handled
- *              Handler_type    - The type of handler:
- *                                  ACPI_SYSTEM_NOTIFY: System_handler (00-7f)
- *                                  ACPI_DEVICE_NOTIFY: Driver_handler (80-ff)
- *              Handler         - Address of the handler
- *              Context         - Value passed to the handler on each GPE
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Install a handler for notifies on an ACPI device
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_install_notify_handler (
-       ACPI_HANDLE             device,
-       u32                     handler_type,
-       NOTIFY_HANDLER          handler,
-       void                    *context)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *notify_obj;
-       ACPI_NAMESPACE_NODE     *device_node;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Parameter validation */
-
-       if ((!handler) ||
-               (handler_type > ACPI_MAX_NOTIFY_HANDLER_TYPE)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /* Convert and validate the device handle */
-
-       device_node = acpi_ns_convert_handle_to_entry (device);
-       if (!device_node) {
-               status = AE_BAD_PARAMETER;
-               goto unlock_and_exit;
-       }
-
-       /*
-        * Root Object:
-        * ------------
-        * Registering a notify handler on the root object indicates that the
-        * caller wishes to receive notifications for all objects.  Note that
-        * only one <external> global handler can be regsitered (per notify type).
-        */
-       if (device == ACPI_ROOT_OBJECT) {
-               /* Make sure the handler is not already installed */
-
-               if (((handler_type == ACPI_SYSTEM_NOTIFY) &&
-                         acpi_gbl_sys_notify.handler) ||
-                       ((handler_type == ACPI_DEVICE_NOTIFY) &&
-                         acpi_gbl_drv_notify.handler)) {
-                       status = AE_EXIST;
-                       goto unlock_and_exit;
-               }
-
-               if (handler_type == ACPI_SYSTEM_NOTIFY) {
-                       acpi_gbl_sys_notify.node = device_node;
-                       acpi_gbl_sys_notify.handler = handler;
-                       acpi_gbl_sys_notify.context = context;
-               }
-               else /* ACPI_DEVICE_NOTIFY */ {
-                       acpi_gbl_drv_notify.node = device_node;
-                       acpi_gbl_drv_notify.handler = handler;
-                       acpi_gbl_drv_notify.context = context;
-               }
-
-               /* Global notify handler installed */
-       }
-
-       /*
-        * Other Objects:
-        * --------------
-        * Caller will only receive notifications specific to the target object.
-        * Note that only certain object types can receive notifications.
-        */
-       else {
-               /*
-                * These are the ONLY objects that can receive ACPI notifications
-                */
-               if ((device_node->type != ACPI_TYPE_DEVICE)    &&
-                       (device_node->type != ACPI_TYPE_PROCESSOR) &&
-                       (device_node->type != ACPI_TYPE_POWER)     &&
-                       (device_node->type != ACPI_TYPE_THERMAL)) {
-                       status = AE_BAD_PARAMETER;
-                       goto unlock_and_exit;
-               }
-
-               /* Check for an existing internal object */
-
-               obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) device_node);
-               if (obj_desc) {
-
-                       /* Object exists - make sure there's no handler */
-
-                       if (((handler_type == ACPI_SYSTEM_NOTIFY) &&
-                                 obj_desc->device.sys_handler) ||
-                               ((handler_type == ACPI_DEVICE_NOTIFY) &&
-                                 obj_desc->device.drv_handler)) {
-                               status = AE_EXIST;
-                               goto unlock_and_exit;
-                       }
-               }
-
-               else {
-                       /* Create a new object */
-
-                       obj_desc = acpi_cm_create_internal_object (device_node->type);
-                       if (!obj_desc) {
-                               status = AE_NO_MEMORY;
-                               goto unlock_and_exit;
-                       }
-
-                       /* Attach new object to the Node */
-
-                       status = acpi_ns_attach_object (device, obj_desc, (u8) device_node->type);
-
-                       if (ACPI_FAILURE (status)) {
-                               goto unlock_and_exit;
-                       }
-               }
-
-               /* Install the handler */
-
-               notify_obj = acpi_cm_create_internal_object (INTERNAL_TYPE_NOTIFY);
-               if (!notify_obj) {
-                       status = AE_NO_MEMORY;
-                       goto unlock_and_exit;
-               }
-
-               notify_obj->notify_handler.node = device_node;
-               notify_obj->notify_handler.handler = handler;
-               notify_obj->notify_handler.context = context;
-
-
-               if (handler_type == ACPI_SYSTEM_NOTIFY) {
-                       obj_desc->device.sys_handler = notify_obj;
-               }
-               else /* ACPI_DEVICE_NOTIFY */ {
-                       obj_desc->device.drv_handler = notify_obj;
-               }
-       }
-
-unlock_and_exit:
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_remove_notify_handler
- *
- * PARAMETERS:  Device          - The device for which notifies will be handled
- *              Handler_type    - The type of handler:
- *                                  ACPI_SYSTEM_NOTIFY: System_handler (00-7f)
- *                                  ACPI_DEVICE_NOTIFY: Driver_handler (80-ff)
- *              Handler         - Address of the handler
- * RETURN:      Status
- *
- * DESCRIPTION: Remove a handler for notifies on an ACPI device
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_remove_notify_handler (
-       ACPI_HANDLE             device,
-       u32                     handler_type,
-       NOTIFY_HANDLER          handler)
-{
-       ACPI_OPERAND_OBJECT     *notify_obj;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_NAMESPACE_NODE     *device_node;
-       ACPI_STATUS             status = AE_OK;
-
-       /* Parameter validation */
-
-       if ((!handler) ||
-               (handler_type > ACPI_MAX_NOTIFY_HANDLER_TYPE)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /* Convert and validate the device handle */
-
-       device_node = acpi_ns_convert_handle_to_entry (device);
-       if (!device_node) {
-               status = AE_BAD_PARAMETER;
-               goto unlock_and_exit;
-       }
-
-       /*
-        * Root Object:
-        * ------------
-        */
-       if (device == ACPI_ROOT_OBJECT) {
-
-               if (((handler_type == ACPI_SYSTEM_NOTIFY) &&
-                         !acpi_gbl_sys_notify.handler) ||
-                       ((handler_type == ACPI_DEVICE_NOTIFY) &&
-                         !acpi_gbl_drv_notify.handler)) {
-                       status = AE_NOT_EXIST;
-                       goto unlock_and_exit;
-               }
-
-               if (handler_type == ACPI_SYSTEM_NOTIFY) {
-                       acpi_gbl_sys_notify.node = NULL;
-                       acpi_gbl_sys_notify.handler = NULL;
-                       acpi_gbl_sys_notify.context = NULL;
-               }
-               else {
-                       acpi_gbl_drv_notify.node = NULL;
-                       acpi_gbl_drv_notify.handler = NULL;
-                       acpi_gbl_drv_notify.context = NULL;
-               }
-       }
-
-       /*
-        * Other Objects:
-        * --------------
-        */
-       else {
-               /*
-                * These are the ONLY objects that can receive ACPI notifications
-                */
-               if ((device_node->type != ACPI_TYPE_DEVICE)    &&
-                       (device_node->type != ACPI_TYPE_PROCESSOR) &&
-                       (device_node->type != ACPI_TYPE_POWER)     &&
-                       (device_node->type != ACPI_TYPE_THERMAL)) {
-                       status = AE_BAD_PARAMETER;
-                       goto unlock_and_exit;
-               }
-
-               /* Check for an existing internal object */
-
-               obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) device_node);
-               if (!obj_desc) {
-                       status = AE_NOT_EXIST;
-                       goto unlock_and_exit;
-               }
-
-               /* Object exists - make sure there's an existing handler */
-
-               if (handler_type == ACPI_SYSTEM_NOTIFY) {
-                       notify_obj = obj_desc->device.sys_handler;
-               }
-               else {
-                       notify_obj = obj_desc->device.drv_handler;
-               }
-
-               if ((!notify_obj) ||
-                       (notify_obj->notify_handler.handler != handler)) {
-                       status = AE_BAD_PARAMETER;
-                       goto unlock_and_exit;
-               }
-
-               /* Remove the handler */
-
-               if (handler_type == ACPI_SYSTEM_NOTIFY) {
-                       obj_desc->device.sys_handler = NULL;
-               }
-               else {
-                       obj_desc->device.drv_handler = NULL;
-               }
-
-               acpi_cm_remove_reference (notify_obj);
-       }
-
-
-unlock_and_exit:
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_install_gpe_handler
- *
- * PARAMETERS:  Gpe_number      - The GPE number.  The numbering scheme is
- *                                bank 0 first, then bank 1.
- *              Type            - Whether this GPE should be treated as an
- *                                edge- or level-triggered interrupt.
- *              Handler         - Address of the handler
- *              Context         - Value passed to the handler on each GPE
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Install a handler for a General Purpose Event.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_install_gpe_handler (
-       u32                     gpe_number,
-       u32                     type,
-       GPE_HANDLER             handler,
-       void                    *context)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       /* Parameter validation */
-
-       if (!handler || (gpe_number >= NUM_GPE)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Ensure that we have a valid GPE number */
-
-       if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_EVENTS);
-
-       /* Make sure that there isn't a handler there already */
-
-       if (acpi_gbl_gpe_info[gpe_number].handler) {
-               status = AE_EXIST;
-               goto cleanup;
-       }
-
-       /* Install the handler */
-
-       acpi_gbl_gpe_info[gpe_number].handler = handler;
-       acpi_gbl_gpe_info[gpe_number].context = context;
-       acpi_gbl_gpe_info[gpe_number].type = (u8) type;
-
-       /* Clear the GPE (of stale events), the enable it */
-
-       acpi_hw_clear_gpe (gpe_number);
-       acpi_hw_enable_gpe (gpe_number);
-
-cleanup:
-       acpi_cm_release_mutex (ACPI_MTX_EVENTS);
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_remove_gpe_handler
- *
- * PARAMETERS:  Gpe_number      - The event to remove a handler
- *              Handler         - Address of the handler
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Remove a handler for a General Purpose Acpi_event.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_remove_gpe_handler (
-       u32                     gpe_number,
-       GPE_HANDLER             handler)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Parameter validation */
-
-       if (!handler || (gpe_number >= NUM_GPE)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Ensure that we have a valid GPE number */
-
-       if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Disable the GPE before removing the handler */
-
-       acpi_hw_disable_gpe (gpe_number);
-
-       acpi_cm_acquire_mutex (ACPI_MTX_EVENTS);
-
-       /* Make sure that the installed handler is the same */
-
-       if (acpi_gbl_gpe_info[gpe_number].handler != handler) {
-               acpi_hw_enable_gpe (gpe_number);
-               status = AE_BAD_PARAMETER;
-               goto cleanup;
-       }
-
-       /* Remove the handler */
-
-       acpi_gbl_gpe_info[gpe_number].handler = NULL;
-       acpi_gbl_gpe_info[gpe_number].context = NULL;
-
-cleanup:
-       acpi_cm_release_mutex (ACPI_MTX_EVENTS);
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_acquire_global_lock
- *
- * PARAMETERS:  Timeout         - How long the caller is willing to wait
- *              Out_handle      - A handle to the lock if acquired
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Acquire the ACPI Global Lock
- *
- ******************************************************************************/
-ACPI_STATUS
-acpi_acquire_global_lock (
-       void)
-{
-       ACPI_STATUS             status;
-
-
-       status = acpi_aml_enter_interpreter ();
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * TBD: [Restructure] add timeout param to internal interface, and
-        * perhaps INTERPRETER_LOCKED
-        */
-
-       status = acpi_ev_acquire_global_lock ();
-       acpi_aml_exit_interpreter ();
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_release_global_lock
- *
- * PARAMETERS:  Handle      - Returned from Acpi_acquire_global_lock
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Release the ACPI Global Lock
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_release_global_lock (
-       void)
-{
-       acpi_ev_release_global_lock ();
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/events/evxfevnt.c b/reactos/drivers/bus/acpi/events/evxfevnt.c
deleted file mode 100644 (file)
index 439f62e..0000000
+++ /dev/null
@@ -1,480 +0,0 @@
-/******************************************************************************
- *
- * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EVENTS
-        MODULE_NAME         ("evxfevnt")
-
-
-/**************************************************************************
- *
- * FUNCTION:    Acpi_enable
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Transfers the system into ACPI mode.
- *
- *************************************************************************/
-
-ACPI_STATUS
-acpi_enable (void)
-{
-       ACPI_STATUS             status;
-
-
-       /* Make sure we've got ACPI tables */
-
-       if (!acpi_gbl_DSDT) {
-               return (AE_NO_ACPI_TABLES);
-       }
-
-       /* Make sure the BIOS supports ACPI mode */
-
-       if (SYS_MODE_LEGACY == acpi_hw_get_mode_capabilities()) {
-               return (AE_ERROR);
-       }
-
-       /* Transition to ACPI mode */
-
-       status = acpi_hw_set_mode (SYS_MODE_ACPI);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       return (status);
-}
-
-
-/**************************************************************************
- *
- * FUNCTION:    Acpi_disable
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Returns the system to original ACPI/legacy mode, and
- *              uninstalls the SCI interrupt handler.
- *
- *************************************************************************/
-
-ACPI_STATUS
-acpi_disable (void)
-{
-       ACPI_STATUS             status;
-
-
-       /* Restore original mode  */
-
-       status = acpi_hw_set_mode (acpi_gbl_original_mode);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Unload the SCI interrupt handler  */
-
-       acpi_ev_remove_sci_handler ();
-       acpi_ev_restore_acpi_state ();
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_enable_event
- *
- * PARAMETERS:  Event           - The fixed event or GPE to be enabled
- *              Type            - The type of event
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Enable an ACPI event (fixed and general purpose)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_enable_event (
-       u32                     event,
-       u32                     type)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     register_id;
-
-
-       /* The Type must be either Fixed Acpi_event or GPE */
-
-       switch (type) {
-
-       case ACPI_EVENT_FIXED:
-
-               /* Decode the Fixed Acpi_event */
-
-               switch (event) {
-               case ACPI_EVENT_PMTIMER:
-                       register_id = TMR_EN;
-                       break;
-
-               case ACPI_EVENT_GLOBAL:
-                       register_id = GBL_EN;
-                       break;
-
-               case ACPI_EVENT_POWER_BUTTON:
-                       register_id = PWRBTN_EN;
-                       break;
-
-               case ACPI_EVENT_SLEEP_BUTTON:
-                       register_id = SLPBTN_EN;
-                       break;
-
-               case ACPI_EVENT_RTC:
-                       register_id = RTC_EN;
-                       break;
-
-               default:
-                       return (AE_BAD_PARAMETER);
-                       break;
-               }
-
-               /*
-                * Enable the requested fixed event (by writing a one to the
-                * enable register bit)
-                */
-
-               acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, register_id, 1);
-
-               if (1 != acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_LOCK, register_id)) {
-                       return (AE_NO_HARDWARE_RESPONSE);
-               }
-
-               break;
-
-
-       case ACPI_EVENT_GPE:
-
-               /* Ensure that we have a valid GPE number */
-
-               if ((event >= NUM_GPE) ||
-                       (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) {
-                       return (AE_BAD_PARAMETER);
-               }
-
-
-               /* Enable the requested GPE number */
-
-               acpi_hw_enable_gpe (event);
-               break;
-
-
-       default:
-
-               status = AE_BAD_PARAMETER;
-       }
-
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_disable_event
- *
- * PARAMETERS:  Event           - The fixed event or GPE to be enabled
- *              Type            - The type of event
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Disable an ACPI event (fixed and general purpose)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_disable_event (
-       u32                     event,
-       u32                     type)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     register_id;
-
-
-       /* The Type must be either Fixed Acpi_event or GPE */
-
-       switch (type) {
-
-       case ACPI_EVENT_FIXED:
-
-               /* Decode the Fixed Acpi_event */
-
-               switch (event) {
-               case ACPI_EVENT_PMTIMER:
-                       register_id = TMR_EN;
-                       break;
-
-               case ACPI_EVENT_GLOBAL:
-                       register_id = GBL_EN;
-                       break;
-
-               case ACPI_EVENT_POWER_BUTTON:
-                       register_id = PWRBTN_EN;
-                       break;
-
-               case ACPI_EVENT_SLEEP_BUTTON:
-                       register_id = SLPBTN_EN;
-                       break;
-
-               case ACPI_EVENT_RTC:
-                       register_id = RTC_EN;
-                       break;
-
-               default:
-                       return (AE_BAD_PARAMETER);
-                       break;
-               }
-
-               /*
-                * Disable the requested fixed event (by writing a zero to the
-                * enable register bit)
-                */
-
-               acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, register_id, 0);
-
-               if (0 != acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_LOCK, register_id)) {
-                       return (AE_NO_HARDWARE_RESPONSE);
-               }
-
-               break;
-
-
-       case ACPI_EVENT_GPE:
-
-               /* Ensure that we have a valid GPE number */
-
-               if ((event >= NUM_GPE) ||
-                       (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) {
-                       return (AE_BAD_PARAMETER);
-               }
-
-               /* Disable the requested GPE number */
-
-               acpi_hw_disable_gpe (event);
-               break;
-
-
-       default:
-               status = AE_BAD_PARAMETER;
-       }
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_clear_event
- *
- * PARAMETERS:  Event           - The fixed event or GPE to be cleared
- *              Type            - The type of event
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Clear an ACPI event (fixed and general purpose)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_clear_event (
-       u32                     event,
-       u32                     type)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     register_id;
-
-
-       /* The Type must be either Fixed Acpi_event or GPE */
-
-       switch (type) {
-
-       case ACPI_EVENT_FIXED:
-
-               /* Decode the Fixed Acpi_event */
-
-               switch (event) {
-               case ACPI_EVENT_PMTIMER:
-                       register_id = TMR_STS;
-                       break;
-
-               case ACPI_EVENT_GLOBAL:
-                       register_id = GBL_STS;
-                       break;
-
-               case ACPI_EVENT_POWER_BUTTON:
-                       register_id = PWRBTN_STS;
-                       break;
-
-               case ACPI_EVENT_SLEEP_BUTTON:
-                       register_id = SLPBTN_STS;
-                       break;
-
-               case ACPI_EVENT_RTC:
-                       register_id = RTC_STS;
-                       break;
-
-               default:
-                       return (AE_BAD_PARAMETER);
-                       break;
-               }
-
-               /*
-                * Clear the requested fixed event (By writing a one to the
-                * status register bit)
-                */
-
-               acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, register_id, 1);
-               break;
-
-
-       case ACPI_EVENT_GPE:
-
-               /* Ensure that we have a valid GPE number */
-
-               if ((event >= NUM_GPE) ||
-                       (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) {
-                       return (AE_BAD_PARAMETER);
-               }
-
-
-               acpi_hw_clear_gpe (event);
-               break;
-
-
-       default:
-
-               status = AE_BAD_PARAMETER;
-       }
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_get_event_status
- *
- * PARAMETERS:  Event           - The fixed event or GPE
- *              Type            - The type of event
- *              Status          - Where the current status of the event will
- *                                be returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Obtains and returns the current status of the event
- *
- ******************************************************************************/
-
-
-ACPI_STATUS
-acpi_get_event_status (
-       u32                     event,
-       u32                     type,
-       ACPI_EVENT_STATUS       *event_status)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     register_id;
-
-
-       if (!event_status) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* The Type must be either Fixed Acpi_event or GPE */
-
-       switch (type) {
-
-       case ACPI_EVENT_FIXED:
-
-               /* Decode the Fixed Acpi_event */
-
-               switch (event) {
-               case ACPI_EVENT_PMTIMER:
-                       register_id = TMR_STS;
-                       break;
-
-               case ACPI_EVENT_GLOBAL:
-                       register_id = GBL_STS;
-                       break;
-
-               case ACPI_EVENT_POWER_BUTTON:
-                       register_id = PWRBTN_STS;
-                       break;
-
-               case ACPI_EVENT_SLEEP_BUTTON:
-                       register_id = SLPBTN_STS;
-                       break;
-
-               case ACPI_EVENT_RTC:
-                       register_id = RTC_STS;
-                       break;
-
-               default:
-                       return (AE_BAD_PARAMETER);
-                       break;
-               }
-
-               /* Get the status of the requested fixed event */
-
-               *event_status = acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_LOCK, register_id);
-               break;
-
-
-       case ACPI_EVENT_GPE:
-
-               /* Ensure that we have a valid GPE number */
-
-               if ((event >= NUM_GPE) ||
-                       (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) {
-                       return (AE_BAD_PARAMETER);
-               }
-
-
-               /* Obtain status on the requested GPE number */
-
-               acpi_hw_get_gpe_status (event, event_status);
-               break;
-
-
-       default:
-               status = AE_BAD_PARAMETER;
-       }
-
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/events/evxfregn.c b/reactos/drivers/bus/acpi/events/evxfregn.c
deleted file mode 100644 (file)
index e9d720e..0000000
+++ /dev/null
@@ -1,373 +0,0 @@
-/******************************************************************************
- *
- * Module Name: evxfregn - External Interfaces, ACPI Operation Regions and
- *                         Address Spaces.
- *              $Revision: 1.2 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EVENTS
-        MODULE_NAME         ("evxfregn")
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_install_address_space_handler
- *
- * PARAMETERS:  Device          - Handle for the device
- *              Space_id        - The address space ID
- *              Handler         - Address of the handler
- *              Setup           - Address of the setup function
- *              Context         - Value passed to the handler on each access
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Install a handler for all Op_regions of a given Space_id.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_install_address_space_handler (
-       ACPI_HANDLE             device,
-       ACPI_ADDRESS_SPACE_TYPE space_id,
-       ADDRESS_SPACE_HANDLER   handler,
-       ADDRESS_SPACE_SETUP     setup,
-       void                    *context)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *handler_obj;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_STATUS             status = AE_OK;
-       OBJECT_TYPE_INTERNAL    type;
-       u16                     flags = 0;
-
-
-       /* Parameter validation */
-
-       if ((!device)   ||
-               ((!handler)  && (handler != ACPI_DEFAULT_HANDLER))) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /* Convert and validate the device handle */
-
-       node = acpi_ns_convert_handle_to_entry (device);
-       if (!node) {
-               status = AE_BAD_PARAMETER;
-               goto unlock_and_exit;
-       }
-
-       /*
-        *  This registration is valid for only the types below
-        *  and the root.  This is where the default handlers
-        *  get placed.
-        */
-
-       if ((node->type != ACPI_TYPE_DEVICE)     &&
-               (node->type != ACPI_TYPE_PROCESSOR)  &&
-               (node->type != ACPI_TYPE_THERMAL)    &&
-               (node != acpi_gbl_root_node)) {
-               status = AE_BAD_PARAMETER;
-               goto unlock_and_exit;
-       }
-
-       if (handler == ACPI_DEFAULT_HANDLER) {
-               flags = ADDR_HANDLER_DEFAULT_INSTALLED;
-
-               switch (space_id) {
-               case ADDRESS_SPACE_SYSTEM_MEMORY:
-                       handler = acpi_aml_system_memory_space_handler;
-                       setup = acpi_ev_system_memory_region_setup;
-                       break;
-
-               case ADDRESS_SPACE_SYSTEM_IO:
-                       handler = acpi_aml_system_io_space_handler;
-                       setup = acpi_ev_io_space_region_setup;
-                       break;
-
-               case ADDRESS_SPACE_PCI_CONFIG:
-                       handler = acpi_aml_pci_config_space_handler;
-                       setup = acpi_ev_pci_config_region_setup;
-                       break;
-
-               default:
-                       status = AE_NOT_EXIST;
-                       goto unlock_and_exit;
-                       break;
-               }
-       }
-
-       /*
-        *  If the caller hasn't specified a setup routine, use the default
-        */
-       if (!setup) {
-               setup = acpi_ev_default_region_setup;
-       }
-
-       /*
-        *  Check for an existing internal object
-        */
-
-       obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node);
-       if (obj_desc) {
-               /*
-                *  The object exists.
-                *  Make sure the handler is not already installed.
-                */
-
-               /* check the address handler the user requested */
-
-               handler_obj = obj_desc->device.addr_handler;
-               while (handler_obj) {
-                       /*
-                        *  We have an Address handler, see if user requested this
-                        *  address space.
-                        */
-                       if(handler_obj->addr_handler.space_id == space_id) {
-                               status = AE_EXIST;
-                               goto unlock_and_exit;
-                       }
-
-                       /*
-                        *  Move through the linked list of handlers
-                        */
-                       handler_obj = handler_obj->addr_handler.next;
-               }
-       }
-
-       else {
-               /* Obj_desc does not exist, create one */
-
-               if (node->type == ACPI_TYPE_ANY) {
-                       type = ACPI_TYPE_DEVICE;
-               }
-
-               else {
-                       type = node->type;
-               }
-
-               obj_desc = acpi_cm_create_internal_object (type);
-               if (!obj_desc) {
-                       status = AE_NO_MEMORY;
-                       goto unlock_and_exit;
-               }
-
-               /* Init new descriptor */
-
-               obj_desc->common.type = (u8) type;
-
-               /* Attach the new object to the Node */
-
-               status = acpi_ns_attach_object (node, obj_desc, (u8) type);
-               if (ACPI_FAILURE (status)) {
-                       acpi_cm_remove_reference (obj_desc);
-                       goto unlock_and_exit;
-               }
-       }
-
-       /*
-        *  Now we can install the handler
-        *
-        *  At this point we know that there is no existing handler.
-        *  So, we just allocate the object for the handler and link it
-        *  into the list.
-        */
-       handler_obj = acpi_cm_create_internal_object (INTERNAL_TYPE_ADDRESS_HANDLER);
-       if (!handler_obj) {
-               status = AE_NO_MEMORY;
-               goto unlock_and_exit;
-       }
-
-       handler_obj->addr_handler.space_id  = (u8) space_id;
-       handler_obj->addr_handler.hflags    = flags;
-       handler_obj->addr_handler.next      = obj_desc->device.addr_handler;
-       handler_obj->addr_handler.region_list = NULL;
-       handler_obj->addr_handler.node      = node;
-       handler_obj->addr_handler.handler   = handler;
-       handler_obj->addr_handler.context   = context;
-       handler_obj->addr_handler.setup     = setup;
-
-       /*
-        *  Now walk the namespace finding all of the regions this
-        *  handler will manage.
-        *
-        *  We start at the device and search the branch toward
-        *  the leaf nodes until either the leaf is encountered or
-        *  a device is detected that has an address handler of the
-        *  same type.
-        *
-        *  In either case we back up and search down the remainder
-        *  of the branch
-        */
-       status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device,
-                        ACPI_UINT32_MAX, NS_WALK_UNLOCK,
-                        acpi_ev_addr_handler_helper,
-                        handler_obj, NULL);
-
-       /*
-        *  Place this handler 1st on the list
-        */
-
-       handler_obj->common.reference_count =
-                        (u16) (handler_obj->common.reference_count +
-                        obj_desc->common.reference_count - 1);
-       obj_desc->device.addr_handler = handler_obj;
-
-
-unlock_and_exit:
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_remove_address_space_handler
- *
- * PARAMETERS:  Space_id        - The address space ID
- *              Handler         - Address of the handler
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Install a handler for accesses on an Operation Region
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_remove_address_space_handler (
-       ACPI_HANDLE             device,
-       ACPI_ADDRESS_SPACE_TYPE space_id,
-       ADDRESS_SPACE_HANDLER   handler)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *handler_obj;
-       ACPI_OPERAND_OBJECT     *region_obj;
-       ACPI_OPERAND_OBJECT     **last_obj_ptr;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Parameter validation */
-
-       if ((!device)   ||
-               ((!handler)  && (handler != ACPI_DEFAULT_HANDLER))) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /* Convert and validate the device handle */
-
-       node = acpi_ns_convert_handle_to_entry (device);
-       if (!node) {
-               status = AE_BAD_PARAMETER;
-               goto unlock_and_exit;
-       }
-
-
-       /* Make sure the internal object exists */
-
-       obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node);
-       if (!obj_desc) {
-               /*
-                *  The object DNE.
-                */
-               status = AE_NOT_EXIST;
-               goto unlock_and_exit;
-       }
-
-       /*
-        *  find the address handler the user requested
-        */
-
-       handler_obj = obj_desc->device.addr_handler;
-       last_obj_ptr = &obj_desc->device.addr_handler;
-       while (handler_obj) {
-               /*
-                *  We have a handler, see if user requested this one
-                */
-
-               if(handler_obj->addr_handler.space_id == space_id) {
-                       /*
-                        *  Got it, first dereference this in the Regions
-                        */
-                       region_obj = handler_obj->addr_handler.region_list;
-
-                       /* Walk the handler's region list */
-
-                       while (region_obj) {
-                               /*
-                                *  First disassociate the handler from the region.
-                                *
-                                *  NOTE: this doesn't mean that the region goes away
-                                *  The region is just inaccessible as indicated to
-                                *  the _REG method
-                                */
-                               acpi_ev_disassociate_region_from_handler(region_obj, FALSE);
-
-                               /*
-                                *  Walk the list, since we took the first region and it
-                                *  was removed from the list by the dissassociate call
-                                *  we just get the first item on the list again
-                                */
-                               region_obj = handler_obj->addr_handler.region_list;
-
-                       }
-
-                       /*
-                        *  Remove this Handler object from the list
-                        */
-                       *last_obj_ptr = handler_obj->addr_handler.next;
-
-                       /*
-                        *  Now we can delete the handler object
-                        */
-                       acpi_cm_remove_reference (handler_obj);
-                       acpi_cm_remove_reference (handler_obj);
-
-                       goto unlock_and_exit;
-               }
-
-               /*
-                *  Move through the linked list of handlers
-                */
-               last_obj_ptr = &handler_obj->addr_handler.next;
-               handler_obj = handler_obj->addr_handler.next;
-       }
-
-
-       /*
-        *  The handler does not exist
-        */
-       status = AE_NOT_EXIST;
-
-
-unlock_and_exit:
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amconfig.c b/reactos/drivers/bus/acpi/executer/amconfig.c
deleted file mode 100644 (file)
index b2e8c55..0000000
+++ /dev/null
@@ -1,297 +0,0 @@
-/******************************************************************************
- *
- * Module Name: amconfig - Namespace reconfiguration (Load/Unload opcodes)
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amconfig")
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_load_table
- *
- * PARAMETERS:  Rgn_desc        - Op region where the table will be obtained
- *              Ddb_handle      - Where a handle to the table will be returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load an ACPI table
- *
- ****************************************************************************/
-
-static ACPI_STATUS
-acpi_aml_exec_load_table (
-       ACPI_OPERAND_OBJECT     *rgn_desc,
-       ACPI_HANDLE             *ddb_handle)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *table_desc = NULL;
-       u8                      *table_ptr;
-       u8                      *table_data_ptr;
-       ACPI_TABLE_HEADER       table_header;
-       ACPI_TABLE_DESC         table_info;
-       u32                     i;
-
-
-       /* TBD: [Unhandled] Object can be either a field or an opregion */
-
-
-       /* Get the table header */
-
-       table_header.length = 0;
-       for (i = 0; i < sizeof (ACPI_TABLE_HEADER); i++) {
-               status = acpi_ev_address_space_dispatch (rgn_desc, ADDRESS_SPACE_READ,
-                                  (ACPI_PHYSICAL_ADDRESS) i, 8,
-                                  (u32 *) ((u8 *) &table_header + i));
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       /* Allocate a buffer for the entire table */
-
-       table_ptr = acpi_cm_allocate (table_header.length);
-       if (!table_ptr) {
-               return (AE_NO_MEMORY);
-       }
-
-       /* Copy the header to the buffer */
-
-       MEMCPY (table_ptr, &table_header, sizeof (ACPI_TABLE_HEADER));
-       table_data_ptr = table_ptr + sizeof (ACPI_TABLE_HEADER);
-
-
-       /* Get the table from the op region */
-
-       for (i = 0; i < table_header.length; i++) {
-               status = acpi_ev_address_space_dispatch (rgn_desc, ADDRESS_SPACE_READ,
-                                  (ACPI_PHYSICAL_ADDRESS)i, 8,
-                                  (u32 *) (table_data_ptr + i));
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-       }
-
-
-       /* Table must be either an SSDT or a PSDT */
-
-       if ((!STRNCMP (table_header.signature,
-                         acpi_gbl_acpi_table_data[ACPI_TABLE_PSDT].signature,
-                         acpi_gbl_acpi_table_data[ACPI_TABLE_PSDT].sig_length)) &&
-               (!STRNCMP (table_header.signature,
-                                acpi_gbl_acpi_table_data[ACPI_TABLE_SSDT].signature,
-                                acpi_gbl_acpi_table_data[ACPI_TABLE_SSDT].sig_length))) {
-               status = AE_BAD_SIGNATURE;
-               goto cleanup;
-       }
-
-       /* Create an object to be the table handle */
-
-       table_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_REFERENCE);
-       if (!table_desc) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-
-       /* Install the new table into the local data structures */
-
-       table_info.pointer     = (ACPI_TABLE_HEADER *) table_ptr;
-       table_info.length      = table_header.length;
-       table_info.allocation  = ACPI_MEM_ALLOCATED;
-       table_info.base_pointer = table_ptr;
-
-       status = acpi_tb_install_table (NULL, &table_info);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       /* Add the table to the namespace */
-
-       /* TBD: [Restructure] - change to whatever new interface is appropriate */
-/*
-       Status = Acpi_load_namespace ();
-       if (ACPI_FAILURE (Status))
-       {
-*/
-               /* TBD: [Errors] Unload the table on failure ? */
-/*
-               goto Cleanup;
-       }
-*/
-
-
-       /* TBD: [Investigate] we need a pointer to the table desc */
-
-       /* Init the table handle */
-
-       table_desc->reference.opcode = AML_LOAD_OP;
-       table_desc->reference.object = table_info.installed_desc;
-
-       *ddb_handle = table_desc;
-
-       return (status);
-
-
-cleanup:
-
-       acpi_cm_free (table_desc);
-       acpi_cm_free (table_ptr);
-       return (status);
-
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_unload_table
- *
- * PARAMETERS:  Ddb_handle          - Handle to a previously loaded table
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Unload an ACPI table
- *
- ****************************************************************************/
-
-static ACPI_STATUS
-acpi_aml_exec_unload_table (
-       ACPI_HANDLE             ddb_handle)
-{
-       ACPI_STATUS             status = AE_NOT_IMPLEMENTED;
-       ACPI_OPERAND_OBJECT     *table_desc = (ACPI_OPERAND_OBJECT *) ddb_handle;
-       ACPI_TABLE_DESC         *table_info;
-
-
-       /* Validate the handle */
-       /* Although the handle is partially validated in Acpi_aml_exec_reconfiguration(),
-        *  when it calls Acpi_aml_resolve_operands(), the handle is more completely
-        *  validated here.
-        */
-
-       if ((!ddb_handle) ||
-               (!VALID_DESCRIPTOR_TYPE (ddb_handle, ACPI_DESC_TYPE_INTERNAL)) ||
-               (((ACPI_OPERAND_OBJECT  *)ddb_handle)->common.type !=
-                               INTERNAL_TYPE_REFERENCE)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Get the actual table descriptor from the Ddb_handle */
-
-       table_info = (ACPI_TABLE_DESC *) table_desc->reference.object;
-
-       /*
-        * Delete the entire namespace under this table Node
-        * (Offset contains the Table_id)
-        */
-
-       status = acpi_ns_delete_namespace_by_owner (table_info->table_id);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Delete the table itself */
-
-       acpi_tb_uninstall_table (table_info->installed_desc);
-
-       /* Delete the table descriptor (Ddb_handle) */
-
-       acpi_cm_remove_reference (table_desc);
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_reconfiguration
- *
- * PARAMETERS:  Opcode              - The opcode to be executed
- *              Walk_state          - Current state of the parse tree walk
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Reconfiguration opcodes such as LOAD and UNLOAD
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_reconfiguration (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *region_desc = NULL;
-       ACPI_HANDLE             *ddb_handle;
-
-
-       /* Resolve the operands */
-
-       status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state);
-       /* Get the table handle, common for both opcodes */
-
-       status |= acpi_ds_obj_stack_pop_object ((ACPI_OPERAND_OBJECT **) &ddb_handle,
-                        walk_state);
-
-       switch (opcode) {
-
-       case AML_LOAD_OP:
-
-               /* Get the region or field descriptor */
-
-               status |= acpi_ds_obj_stack_pop_object (&region_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       acpi_cm_remove_reference (region_desc);
-                       return (status);
-               }
-
-               status = acpi_aml_exec_load_table (region_desc, ddb_handle);
-               break;
-
-
-       case AML_UNLOAD_OP:
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               status = acpi_aml_exec_unload_table (ddb_handle);
-               break;
-
-
-       default:
-
-               status = AE_AML_BAD_OPCODE;
-               break;
-       }
-
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/executer/amconvrt.c b/reactos/drivers/bus/acpi/executer/amconvrt.c
deleted file mode 100644 (file)
index cb53d14..0000000
+++ /dev/null
@@ -1,511 +0,0 @@
-/******************************************************************************
- *
- * Module Name: amconvrt - Object conversion routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amconvrt")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_convert_to_integer
- *
- * PARAMETERS:  *Obj_desc       - Object to be converted.  Must be an
- *                                Integer, Buffer, or String
- *              Walk_state      - Current method state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert an ACPI Object to an integer.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_convert_to_integer (
-       ACPI_OPERAND_OBJECT     **obj_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       u32                     i;
-       ACPI_OPERAND_OBJECT     *ret_desc;
-       u32                     count;
-       char                    *pointer;
-       ACPI_INTEGER            result;
-       u32                     integer_size = sizeof (ACPI_INTEGER);
-
-
-       switch ((*obj_desc)->common.type) {
-       case ACPI_TYPE_INTEGER:
-               return (AE_OK);
-
-       case ACPI_TYPE_STRING:
-               pointer = (*obj_desc)->string.pointer;
-               count = (*obj_desc)->string.length;
-               break;
-
-       case ACPI_TYPE_BUFFER:
-               pointer = (char *) (*obj_desc)->buffer.pointer;
-               count = (*obj_desc)->buffer.length;
-               break;
-
-       default:
-               return (AE_TYPE);
-       }
-
-       /*
-        * Create a new integer
-        */
-       ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-       if (!ret_desc) {
-               return (AE_NO_MEMORY);
-       }
-
-
-       /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */
-
-       if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) {
-               /*
-                * We are running a method that exists in a 32-bit ACPI table.
-                * Truncate the value to 32 bits by zeroing out the upper 32-bit field
-                */
-               integer_size = sizeof (u32);
-       }
-
-
-       /*
-        * Convert the buffer/string to an integer.  Note that both buffers and
-        * strings are treated as raw data - we don't convert ascii to hex for
-        * strings.
-        *
-        * There are two terminating conditions for the loop:
-        * 1) The size of an integer has been reached, or
-        * 2) The end of the buffer or string has been reached
-        */
-       result = 0;
-
-       /* Transfer no more than an integer's worth of data */
-
-       if (count > integer_size) {
-               count = integer_size;
-       }
-
-       /*
-        * String conversion is different than Buffer conversion
-        */
-       switch ((*obj_desc)->common.type) {
-       case ACPI_TYPE_STRING:
-
-               /* TBD: Need to use 64-bit STRTOUL */
-
-               /*
-                * Convert string to an integer
-                * String must be hexadecimal as per the ACPI specification
-                */
-
-               result = STRTOUL (pointer, NULL, 16);
-               break;
-
-
-       case ACPI_TYPE_BUFFER:
-
-               /*
-                * Buffer conversion - we simply grab enough raw data from the
-                * buffer to fill an integer
-                */
-               for (i = 0; i < count; i++) {
-                       /*
-                        * Get next byte and shift it into the Result.
-                        * Little endian is used, meaning that the first byte of the buffer
-                        * is the LSB of the integer
-                        */
-                       result |= (((ACPI_INTEGER) pointer[i]) << (i * 8));
-               }
-
-               break;
-       }
-
-       /* Save the Result, delete original descriptor, store new descriptor */
-
-       ret_desc->integer.value = result;
-
-       if (walk_state->opcode != AML_STORE_OP) {
-               acpi_cm_remove_reference (*obj_desc);
-       }
-
-       *obj_desc = ret_desc;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_convert_to_buffer
- *
- * PARAMETERS:  *Obj_desc       - Object to be converted.  Must be an
- *                                Integer, Buffer, or String
- *              Walk_state      - Current method state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert an ACPI Object to an Buffer
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_convert_to_buffer (
-       ACPI_OPERAND_OBJECT     **obj_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *ret_desc;
-       u32                     i;
-       u32                     integer_size = sizeof (ACPI_INTEGER);
-       u8                      *new_buf;
-
-
-       switch ((*obj_desc)->common.type) {
-       case ACPI_TYPE_INTEGER:
-
-               /*
-                * Create a new Buffer
-                */
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_BUFFER);
-               if (!ret_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */
-
-               if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) {
-                       /*
-                        * We are running a method that exists in a 32-bit ACPI table.
-                        * Truncate the value to 32 bits by zeroing out the upper
-                        * 32-bit field
-                        */
-                       integer_size = sizeof (u32);
-               }
-
-               /* Need enough space for one integers */
-
-               ret_desc->buffer.length = integer_size;
-               new_buf = acpi_cm_callocate (integer_size);
-               if (!new_buf) {
-                       REPORT_ERROR
-                               (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n"));
-                       acpi_cm_remove_reference (ret_desc);
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Copy the integer to the buffer */
-
-               for (i = 0; i < integer_size; i++) {
-                       new_buf[i] = (u8) ((*obj_desc)->integer.value >> (i * 8));
-               }
-               ret_desc->buffer.pointer = new_buf;
-
-               /* Return the new buffer descriptor */
-
-               if (walk_state->opcode != AML_STORE_OP) {
-                       acpi_cm_remove_reference (*obj_desc);
-               }
-               *obj_desc = ret_desc;
-               break;
-
-
-       case ACPI_TYPE_STRING:
-               break;
-
-
-       case ACPI_TYPE_BUFFER:
-               break;
-
-
-       default:
-               return (AE_TYPE);
-               break;
-   }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_convert_to_string
- *
- * PARAMETERS:  *Obj_desc       - Object to be converted.  Must be an
- *                                Integer, Buffer, or String
- *              Walk_state      - Current method state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert an ACPI Object to a string
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_convert_to_string (
-       ACPI_OPERAND_OBJECT     **obj_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *ret_desc;
-       u32                     i;
-       u32                     index;
-       u32                     integer_size = sizeof (ACPI_INTEGER);
-       u8                      *new_buf;
-       u8                      *pointer;
-
-
-       switch ((*obj_desc)->common.type) {
-       case ACPI_TYPE_INTEGER:
-
-               /*
-                * Create a new String
-                */
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_STRING);
-               if (!ret_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */
-
-               if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) {
-                       /*
-                        * We are running a method that exists in a 32-bit ACPI table.
-                        * Truncate the value to 32 bits by zeroing out the upper
-                        * 32-bit field
-                        */
-                       integer_size = sizeof (u32);
-               }
-
-               /* Need enough space for one ASCII integer plus null terminator */
-
-               ret_desc->string.length = (integer_size * 2) + 1;
-               new_buf = acpi_cm_callocate (ret_desc->string.length);
-               if (!new_buf) {
-                       REPORT_ERROR
-                               (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n"));
-                       acpi_cm_remove_reference (ret_desc);
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Copy the integer to the buffer */
-
-               for (i = 0; i < (integer_size * 2); i++) {
-                       new_buf[i] = acpi_gbl_hex_to_ascii [((*obj_desc)->integer.value >> (i * 4)) & 0xF];
-               }
-
-               /* Null terminate */
-
-               new_buf [i] = 0;
-               ret_desc->buffer.pointer = new_buf;
-
-               /* Return the new buffer descriptor */
-
-               if (walk_state->opcode != AML_STORE_OP) {
-                       acpi_cm_remove_reference (*obj_desc);
-               }
-               *obj_desc = ret_desc;
-
-               return (AE_OK);
-
-
-       case ACPI_TYPE_BUFFER:
-
-               if (((*obj_desc)->buffer.length * 3) > ACPI_MAX_STRING_CONVERSION) {
-                       return (AE_AML_STRING_LIMIT);
-               }
-
-               /*
-                * Create a new String
-                */
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_STRING);
-               if (!ret_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Need enough space for one ASCII integer plus null terminator */
-
-               ret_desc->string.length = (*obj_desc)->buffer.length * 3;
-               new_buf = acpi_cm_callocate (ret_desc->string.length + 1);
-               if (!new_buf) {
-                       REPORT_ERROR
-                               (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n"));
-                       acpi_cm_remove_reference (ret_desc);
-                       return (AE_NO_MEMORY);
-               }
-
-               /*
-                * Convert each byte of the buffer to two ASCII characters plus a space.
-                */
-               pointer = (*obj_desc)->buffer.pointer;
-               index = 0;
-               for (i = 0; i < (*obj_desc)->buffer.length; i++) {
-                       new_buf[index + 0] = acpi_gbl_hex_to_ascii [pointer[i] & 0x0F];
-                       new_buf[index + 1] = acpi_gbl_hex_to_ascii [(pointer[i] >> 4) & 0x0F];
-                       new_buf[index + 2] = ' ';
-                       index += 3;
-               }
-
-               /* Null terminate */
-
-               new_buf [index] = 0;
-               ret_desc->buffer.pointer = new_buf;
-
-               /* Return the new buffer descriptor */
-
-               if (walk_state->opcode != AML_STORE_OP) {
-                       acpi_cm_remove_reference (*obj_desc);
-               }
-               *obj_desc = ret_desc;
-               break;
-
-
-       case ACPI_TYPE_STRING:
-               break;
-
-
-       default:
-               return (AE_TYPE);
-               break;
-   }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_convert_to_target_type
- *
- * PARAMETERS:  *Obj_desc       - Object to be converted.
- *              Walk_state      - Current method state
- *
- * RETURN:      Status
- *
- * DESCRIPTION:
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_convert_to_target_type (
-       OBJECT_TYPE_INTERNAL    destination_type,
-       ACPI_OPERAND_OBJECT     **obj_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       /*
-        * If required by the target,
-        * perform implicit conversion on the source before we store it.
-        */
-
-       switch (GET_CURRENT_ARG_TYPE (walk_state->op_info->runtime_args)) {
-       case ARGI_SIMPLE_TARGET:
-       case ARGI_FIXED_TARGET:
-       case ARGI_INTEGER_REF:      /* Handles Increment, Decrement cases */
-
-               switch (destination_type) {
-               case INTERNAL_TYPE_DEF_FIELD:
-                       /*
-                        * Named field can always handle conversions
-                        */
-                       break;
-
-               default:
-                       /* No conversion allowed for these types */
-
-                       if (destination_type != (*obj_desc)->common.type) {
-                               status = AE_TYPE;
-                       }
-               }
-               break;
-
-
-       case ARGI_TARGETREF:
-
-               switch (destination_type) {
-               case ACPI_TYPE_INTEGER:
-               case ACPI_TYPE_FIELD_UNIT:
-               case INTERNAL_TYPE_BANK_FIELD:
-               case INTERNAL_TYPE_INDEX_FIELD:
-                       /*
-                        * These types require an Integer operand.  We can convert
-                        * a Buffer or a String to an Integer if necessary.
-                        */
-                       status = acpi_aml_convert_to_integer (obj_desc, walk_state);
-                       break;
-
-
-               case ACPI_TYPE_STRING:
-
-                       /*
-                        * The operand must be a String.  We can convert an
-                        * Integer or Buffer if necessary
-                        */
-                       status = acpi_aml_convert_to_string (obj_desc, walk_state);
-                       break;
-
-
-               case ACPI_TYPE_BUFFER:
-
-                       /*
-                        * The operand must be a String.  We can convert an
-                        * Integer or Buffer if necessary
-                        */
-                       status = acpi_aml_convert_to_buffer (obj_desc, walk_state);
-                       break;
-               }
-               break;
-
-
-       case ARGI_REFERENCE:
-               /*
-                * Create_xxxx_field cases - we are storing the field object into the name
-                */
-               break;
-
-
-       default:
-               status = AE_AML_INTERNAL;
-       }
-
-
-       /*
-        * Source-to-Target conversion semantics:
-        *
-        * If conversion to the target type cannot be performed, then simply
-        * overwrite the target with the new object and type.
-        */
-       if (status == AE_TYPE) {
-               status = AE_OK;
-       }
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amcreate.c b/reactos/drivers/bus/acpi/executer/amcreate.c
deleted file mode 100644 (file)
index e8c5704..0000000
+++ /dev/null
@@ -1,714 +0,0 @@
-/******************************************************************************
- *
- * Module Name: amcreate - Named object creation
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amcreate")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_create_field
- *
- * PARAMETERS:  Opcode              - The opcode to be executed
- *              Operands            - List of operands for the opcode
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Create_field operators: Create_bit_field_op,
- *              Create_byte_field_op, Create_word_field_op, Create_dWord_field_op,
- *              Create_field_op (which define fields in buffers)
- *
- * ALLOCATION:  Deletes Create_field_op's count operand descriptor
- *
- *
- *  ACPI SPECIFICATION REFERENCES:
- *  Def_create_bit_field := Create_bit_field_op Src_buf Bit_idx   Name_string
- *  Def_create_byte_field := Create_byte_field_op Src_buf Byte_idx Name_string
- *  Def_create_dWord_field := Create_dWord_field_op Src_buf Byte_idx Name_string
- *  Def_create_field    :=  Create_field_op     Src_buf Bit_idx   Num_bits    Name_string
- *  Def_create_word_field := Create_word_field_op Src_buf Byte_idx Name_string
- *  Bit_index           :=  Term_arg=>Integer
- *  Byte_index          :=  Term_arg=>Integer
- *  Num_bits            :=  Term_arg=>Integer
- *  Source_buff         :=  Term_arg=>Buffer
- *
- ******************************************************************************/
-
-
-ACPI_STATUS
-acpi_aml_exec_create_field (
-       u8                      *aml_ptr,
-       u32                     aml_length,
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *tmp_desc;
-
-
-       /* Create the region descriptor */
-
-       obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_FIELD_UNIT);
-       if (!obj_desc) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       /* Construct the field object */
-
-       obj_desc->field_unit.access     = (u8) ACCESS_ANY_ACC;
-       obj_desc->field_unit.lock_rule  = (u8) GLOCK_NEVER_LOCK;
-       obj_desc->field_unit.update_rule = (u8) UPDATE_PRESERVE;
-
-       /*
-        * Allocate a method object for this field unit
-        */
-
-       obj_desc->field_unit.extra = acpi_cm_create_internal_object (
-                        INTERNAL_TYPE_EXTRA);
-       if (!obj_desc->field_unit.extra) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       /*
-        * Remember location in AML stream of the field unit
-        * opcode and operands -- since the buffer and index
-        * operands must be evaluated.
-        */
-
-       obj_desc->field_unit.extra->extra.pcode     = aml_ptr;
-       obj_desc->field_unit.extra->extra.pcode_length = aml_length;
-       obj_desc->field_unit.node = node;
-
-
-       /*
-        * This operation is supposed to cause the destination Name to refer
-        * to the defined Field_unit -- it must not store the constructed
-        * Field_unit object (or its current value) in some location that the
-        * Name may already be pointing to.  So, if the Name currently contains
-        * a reference which would cause Acpi_aml_exec_store() to perform an indirect
-        * store rather than setting the value of the Name itself, clobber that
-        * reference before calling Acpi_aml_exec_store().
-        */
-
-       /* Type of Name's existing value */
-
-       switch (acpi_ns_get_type (node)) {
-
-       case ACPI_TYPE_FIELD_UNIT:
-
-       case INTERNAL_TYPE_ALIAS:
-       case INTERNAL_TYPE_BANK_FIELD:
-       case INTERNAL_TYPE_DEF_FIELD:
-       case INTERNAL_TYPE_INDEX_FIELD:
-
-               tmp_desc = acpi_ns_get_attached_object (node);
-               if (tmp_desc) {
-                       /*
-                        * There is an existing object here;  delete it and zero out the
-                        * object field within the Node
-                        */
-
-                       acpi_cm_remove_reference (tmp_desc);
-                       acpi_ns_attach_object ((ACPI_NAMESPACE_NODE *) node, NULL,
-                                        ACPI_TYPE_ANY);
-               }
-
-               /* Set the type to ANY (or the store below will fail) */
-
-               ((ACPI_NAMESPACE_NODE *) node)->type = ACPI_TYPE_ANY;
-
-               break;
-
-
-       default:
-
-               break;
-       }
-
-
-       /* Store constructed field descriptor in result location */
-
-       status = acpi_aml_exec_store (obj_desc, (ACPI_OPERAND_OBJECT *) node, walk_state);
-
-       /*
-        * If the field descriptor was not physically stored (or if a failure
-        * above), we must delete it
-        */
-       if (obj_desc->common.reference_count <= 1) {
-               acpi_cm_remove_reference (obj_desc);
-       }
-
-
-       return (AE_OK);
-
-
-cleanup:
-
-       /* Delete region object and method subobject */
-
-       if (obj_desc) {
-               /* Remove deletes both objects! */
-
-               acpi_cm_remove_reference (obj_desc);
-               obj_desc = NULL;
-       }
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_create_alias
- *
- * PARAMETERS:  Operands            - List of operands for the opcode
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new named alias
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_create_alias (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_NAMESPACE_NODE     *source_node;
-       ACPI_NAMESPACE_NODE     *alias_node;
-       ACPI_STATUS             status;
-
-
-       /* Get the source/alias operands (both NTEs) */
-
-       status = acpi_ds_obj_stack_pop_object ((ACPI_OPERAND_OBJECT **) &source_node,
-                        walk_state);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * Don't pop it, it gets removed in the calling routine
-        */
-
-       alias_node = acpi_ds_obj_stack_get_value (0, walk_state);
-
-       /* Add an additional reference to the object */
-
-       acpi_cm_add_reference (source_node->object);
-
-       /*
-        * Attach the original source Node to the new Alias Node.
-        */
-       status = acpi_ns_attach_object (alias_node, source_node->object,
-                          source_node->type);
-
-
-       /*
-        * The new alias assumes the type of the source, but it points
-        * to the same object.  The reference count of the object has two
-        * additional references to prevent deletion out from under either the
-        * source or the alias Node
-        */
-
-       /* Since both operands are NTEs, we don't need to delete them */
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_create_event
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new event object
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_create_event (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
- BREAKPOINT3;
-
-       obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_EVENT);
-       if (!obj_desc) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       /* Create the actual OS semaphore */
-
-       /* TBD: [Investigate] should be created with 0 or 1 units? */
-
-       status = acpi_os_create_semaphore (ACPI_NO_UNIT_LIMIT, 1,
-                          &obj_desc->event.semaphore);
-       if (ACPI_FAILURE (status)) {
-               acpi_cm_remove_reference (obj_desc);
-               goto cleanup;
-       }
-
-       /* Attach object to the Node */
-
-       status = acpi_ns_attach_object (acpi_ds_obj_stack_get_value (0, walk_state),
-                          obj_desc, (u8) ACPI_TYPE_EVENT);
-       if (ACPI_FAILURE (status)) {
-               acpi_os_delete_semaphore (obj_desc->event.semaphore);
-               acpi_cm_remove_reference (obj_desc);
-               goto cleanup;
-       }
-
-
-cleanup:
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_create_mutex
- *
- * PARAMETERS:  Interpreter_mode    - Current running mode (load1/Load2/Exec)
- *              Operands            - List of operands for the opcode
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new mutex object
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_create_mutex (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OPERAND_OBJECT     *sync_desc;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       /* Get the operand */
-
-       status = acpi_ds_obj_stack_pop_object (&sync_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Attempt to allocate a new object */
-
-       obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_MUTEX);
-       if (!obj_desc) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       /* Create the actual OS semaphore */
-
-       status = acpi_os_create_semaphore (1, 1, &obj_desc->mutex.semaphore);
-       if (ACPI_FAILURE (status)) {
-               acpi_cm_remove_reference (obj_desc);
-               goto cleanup;
-       }
-
-       obj_desc->mutex.sync_level = (u8) sync_desc->integer.value;
-
-       /* Obj_desc was on the stack top, and the name is below it */
-
-       status = acpi_ns_attach_object (acpi_ds_obj_stack_get_value (0, walk_state),
-                         obj_desc, (u8) ACPI_TYPE_MUTEX);
-       if (ACPI_FAILURE (status)) {
-               acpi_os_delete_semaphore (obj_desc->mutex.semaphore);
-               acpi_cm_remove_reference (obj_desc);
-               goto cleanup;
-       }
-
-
-cleanup:
-
-       /* Always delete the operand */
-
-       acpi_cm_remove_reference (sync_desc);
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_create_region
- *
- * PARAMETERS:  Aml_ptr             - Pointer to the region declaration AML
- *              Aml_length          - Max length of the declaration AML
- *              Operands            - List of operands for the opcode
- *              Interpreter_mode    - Load1/Load2/Execute
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new operation region object
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_create_region (
-       u8                      *aml_ptr,
-       u32                     aml_length,
-       u8                      region_space,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_NAMESPACE_NODE     *node;
-
-
-       /*
-        * Space ID must be one of the predefined IDs, or in the user-defined
-        * range
-        */
-       if ((region_space >= NUM_REGION_TYPES) &&
-               (region_space < USER_REGION_BEGIN)) {
-               REPORT_ERROR (("Invalid Address_space type %X\n", region_space));
-               return (AE_AML_INVALID_SPACE_ID);
-       }
-
-
-       /* Get the Node from the object stack  */
-
-       node = (ACPI_NAMESPACE_NODE *) acpi_ds_obj_stack_get_value (0, walk_state);
-
-       /* Create the region descriptor */
-
-       obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_REGION);
-       if (!obj_desc) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       /*
-        * Allocate a method object for this region.
-        */
-
-       obj_desc->region.extra = acpi_cm_create_internal_object (
-                        INTERNAL_TYPE_EXTRA);
-       if (!obj_desc->region.extra) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       /*
-        * Remember location in AML stream of address & length
-        * operands since they need to be evaluated at run time.
-        */
-
-       obj_desc->region.extra->extra.pcode      = aml_ptr;
-       obj_desc->region.extra->extra.pcode_length = aml_length;
-
-       /* Init the region from the operands */
-
-       obj_desc->region.space_id     = region_space;
-       obj_desc->region.address      = 0;
-       obj_desc->region.length       = 0;
-
-
-       /* Install the new region object in the parent Node */
-
-       obj_desc->region.node = node;
-
-       status = acpi_ns_attach_object (node, obj_desc,
-                         (u8) ACPI_TYPE_REGION);
-
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       /*
-        * If we have a valid region, initialize it
-        * Namespace is NOT locked at this point.
-        */
-
-       status = acpi_ev_initialize_region (obj_desc, FALSE);
-
-       if (ACPI_FAILURE (status)) {
-               /*
-                *  If AE_NOT_EXIST is returned, it is not fatal
-                *  because many regions get created before a handler
-                *  is installed for said region.
-                */
-               if (AE_NOT_EXIST == status) {
-                       status = AE_OK;
-               }
-       }
-
-cleanup:
-
-       if (ACPI_FAILURE (status)) {
-               /* Delete region object and method subobject */
-
-               if (obj_desc) {
-                       /* Remove deletes both objects! */
-
-                       acpi_cm_remove_reference (obj_desc);
-                       obj_desc = NULL;
-               }
-       }
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_create_processor
- *
- * PARAMETERS:  Op              - Op containing the Processor definition and
- *                                args
- *              Processor_nTE   - Node for the containing Node
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new processor object and populate the fields
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_create_processor (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_HANDLE             processor_nTE)
-{
-       ACPI_STATUS             status;
-       ACPI_PARSE_OBJECT       *arg;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_PROCESSOR);
-       if (!obj_desc) {
-               status = AE_NO_MEMORY;
-               return (status);
-       }
-
-       /* Install the new processor object in the parent Node */
-
-       status = acpi_ns_attach_object (processor_nTE, obj_desc,
-                          (u8) ACPI_TYPE_PROCESSOR);
-       if (ACPI_FAILURE (status)) {
-               return(status);
-       }
-
-       arg = op->value.arg;
-
-       /* check existence */
-
-       if (!arg) {
-               status = AE_AML_NO_OPERAND;
-               return (status);
-       }
-
-       /* First arg is the Processor ID */
-
-       obj_desc->processor.proc_id = (u8) arg->value.integer;
-
-       /* Move to next arg and check existence */
-
-       arg = arg->next;
-       if (!arg) {
-               status = AE_AML_NO_OPERAND;
-               return (status);
-       }
-
-       /* Second arg is the PBlock Address */
-
-       obj_desc->processor.address = (ACPI_IO_ADDRESS) arg->value.integer;
-
-       /* Move to next arg and check existence */
-
-       arg = arg->next;
-       if (!arg) {
-               status = AE_AML_NO_OPERAND;
-               return (status);
-       }
-
-       /* Third arg is the PBlock Length */
-
-       obj_desc->processor.length = (u8) arg->value.integer;
-
-       return (AE_OK);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_create_power_resource
- *
- * PARAMETERS:  Op              - Op containing the Power_resource definition
- *                                and args
- *              Power_res_nTE   - Node for the containing Node
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new Power_resource object and populate the fields
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_create_power_resource (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_HANDLE             power_res_nTE)
-{
-       ACPI_STATUS             status;
-       ACPI_PARSE_OBJECT       *arg;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_POWER);
-       if (!obj_desc) {
-               status = AE_NO_MEMORY;
-               return (status);
-       }
-
-       /* Install the new power resource object in the parent Node */
-
-       status = acpi_ns_attach_object (power_res_nTE, obj_desc,
-                         (u8) ACPI_TYPE_POWER);
-       if (ACPI_FAILURE (status)) {
-               return(status);
-       }
-
-       arg = op->value.arg;
-
-       /* check existence */
-
-       if (!arg) {
-               status = AE_AML_NO_OPERAND;
-               return (status);
-       }
-
-       /* First arg is the System_level */
-
-       obj_desc->power_resource.system_level = (u8) arg->value.integer;
-
-       /* Move to next arg and check existence */
-
-       arg = arg->next;
-       if (!arg) {
-               status = AE_AML_NO_OPERAND;
-               return (status);
-       }
-
-       /* Second arg is the PBlock Address */
-
-       obj_desc->power_resource.resource_order = (u16) arg->value.integer;
-
-       return (AE_OK);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_create_method
- *
- * PARAMETERS:  Aml_ptr         - First byte of the method's AML
- *              Aml_length      - AML byte count for this method
- *              Method_flags    - AML method flag byte
- *              Method          - Method Node
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a new method object
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_create_method (
-       u8                      *aml_ptr,
-       u32                     aml_length,
-       u32                     method_flags,
-       ACPI_HANDLE             method)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status;
-
-
-       /* Create a new method object */
-
-       obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_METHOD);
-       if (!obj_desc) {
-          return (AE_NO_MEMORY);
-       }
-
-       /* Get the method's AML pointer/length from the Op */
-
-       obj_desc->method.pcode      = aml_ptr;
-       obj_desc->method.pcode_length = aml_length;
-
-       /*
-        * First argument is the Method Flags (contains parameter count for the
-        * method)
-        */
-
-       obj_desc->method.method_flags = (u8) method_flags;
-       obj_desc->method.param_count = (u8) (method_flags &
-                         METHOD_FLAGS_ARG_COUNT);
-
-       /*
-        * Get the concurrency count.  If required, a semaphore will be
-        * created for this method when it is parsed.
-        */
-       if (method_flags & METHOD_FLAGS_SERIALIZED) {
-               /*
-                * ACPI 1.0: Concurrency = 1
-                * ACPI 2.0: Concurrency = (Sync_level (in method declaration) + 1)
-                */
-               obj_desc->method.concurrency = (u8)
-                                 (((method_flags & METHOD_FLAGS_SYNCH_LEVEL) >> 4) + 1);
-       }
-
-       else {
-               obj_desc->method.concurrency = INFINITE_CONCURRENCY;
-       }
-
-       /* Attach the new object to the method Node */
-
-       status = acpi_ns_attach_object (method, obj_desc, (u8) ACPI_TYPE_METHOD);
-       if (ACPI_FAILURE (status)) {
-               acpi_cm_delete_object_desc (obj_desc);
-       }
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amdump.c b/reactos/drivers/bus/acpi/executer/amdump.c
deleted file mode 100644 (file)
index 4f04ee9..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/******************************************************************************
- *
- * Module Name: amdump - Interpreter debug output routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amdump")
-
-
-/*
- * The following routines are used for debug output only
- */
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amdyadic.c b/reactos/drivers/bus/acpi/executer/amdyadic.c
deleted file mode 100644 (file)
index 66744f8..0000000
+++ /dev/null
@@ -1,870 +0,0 @@
-/******************************************************************************
- *
- * Module Name: amdyadic - ACPI AML (p-code) execution for dyadic operators
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amdyadic")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_do_concatenate
- *
- * PARAMETERS:  *Obj_desc       - Object to be converted.  Must be an
- *                                Integer, Buffer, or String
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Concatenate two objects OF THE SAME TYPE.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_do_concatenate (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_OPERAND_OBJECT     *obj_desc2,
-       ACPI_OPERAND_OBJECT     **actual_ret_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-       u32                     i;
-       ACPI_INTEGER            this_integer;
-       ACPI_OPERAND_OBJECT     *ret_desc;
-       NATIVE_CHAR             *new_buf;
-       u32                     integer_size = sizeof (ACPI_INTEGER);
-
-
-       /*
-        * There are three cases to handle:
-        * 1) Two Integers concatenated to produce a buffer
-        * 2) Two Strings concatenated to produce a string
-        * 3) Two Buffers concatenated to produce a buffer
-        */
-       switch (obj_desc->common.type) {
-       case ACPI_TYPE_INTEGER:
-
-               /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */
-
-               if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) {
-                       /*
-                        * We are running a method that exists in a 32-bit ACPI table.
-                        * Truncate the value to 32 bits by zeroing out the upper
-                        * 32-bit field
-                        */
-                       integer_size = sizeof (u32);
-               }
-
-               /* Result of two integers is a buffer */
-
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_BUFFER);
-               if (!ret_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Need enough space for two integers */
-
-               ret_desc->buffer.length = integer_size * 2;
-               new_buf = acpi_cm_callocate (ret_desc->buffer.length);
-               if (!new_buf) {
-                       REPORT_ERROR
-                               (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n"));
-                       status = AE_NO_MEMORY;
-                       goto cleanup;
-               }
-
-               ret_desc->buffer.pointer = (u8 *) new_buf;
-
-               /* Convert the first integer */
-
-               this_integer = obj_desc->integer.value;
-               for (i = 0; i < integer_size; i++) {
-                       new_buf[i] = (u8) this_integer;
-                       this_integer >>= 8;
-               }
-
-               /* Convert the second integer */
-
-               this_integer = obj_desc2->integer.value;
-               for (; i < (integer_size * 2); i++) {
-                       new_buf[i] = (u8) this_integer;
-                       this_integer >>= 8;
-               }
-
-               break;
-
-
-       case ACPI_TYPE_STRING:
-
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_STRING);
-               if (!ret_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Operand1 is string  */
-
-               new_buf = acpi_cm_allocate (obj_desc->string.length +
-                                 obj_desc2->string.length + 1);
-               if (!new_buf) {
-                       REPORT_ERROR
-                               (("Aml_exec_dyadic2_r/Concat_op: String allocation failure\n"));
-                       status = AE_NO_MEMORY;
-                       goto cleanup;
-               }
-
-               STRCPY (new_buf, obj_desc->string.pointer);
-               STRCPY (new_buf + obj_desc->string.length,
-                                 obj_desc2->string.pointer);
-
-               /* Point the return object to the new string */
-
-               ret_desc->string.pointer = new_buf;
-               ret_desc->string.length = obj_desc->string.length +=
-                                 obj_desc2->string.length;
-               break;
-
-
-       case ACPI_TYPE_BUFFER:
-
-               /* Operand1 is a buffer */
-
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_BUFFER);
-               if (!ret_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               new_buf = acpi_cm_allocate (obj_desc->buffer.length +
-                                 obj_desc2->buffer.length);
-               if (!new_buf) {
-                       REPORT_ERROR
-                               (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n"));
-                       status = AE_NO_MEMORY;
-                       goto cleanup;
-               }
-
-               MEMCPY (new_buf, obj_desc->buffer.pointer,
-                                 obj_desc->buffer.length);
-               MEMCPY (new_buf + obj_desc->buffer.length, obj_desc2->buffer.pointer,
-                                 obj_desc2->buffer.length);
-
-               /*
-                * Point the return object to the new buffer
-                */
-
-               ret_desc->buffer.pointer    = (u8 *) new_buf;
-               ret_desc->buffer.length     = obj_desc->buffer.length +
-                                obj_desc2->buffer.length;
-               break;
-
-       default:
-               status = AE_AML_INTERNAL;
-               ret_desc = NULL;
-       }
-
-
-       *actual_ret_desc = ret_desc;
-       return (AE_OK);
-
-
-cleanup:
-
-       acpi_cm_remove_reference (ret_desc);
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_dyadic1
- *
- * PARAMETERS:  Opcode              - The opcode to be executed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Type 1 dyadic operator with numeric operands:
- *              Notify_op
- *
- * ALLOCATION:  Deletes both operands
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_dyadic1 (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc = NULL;
-       ACPI_OPERAND_OBJECT     *val_desc = NULL;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Resolve all operands */
-
-       status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state);
-       /* Get the operands */
-
-       status |= acpi_ds_obj_stack_pop_object (&val_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               /* Invalid parameters on object stack  */
-
-               goto cleanup;
-       }
-
-
-       /* Examine the opcode */
-
-       switch (opcode) {
-
-       /* Def_notify  :=  Notify_op   Notify_object   Notify_value */
-
-       case AML_NOTIFY_OP:
-
-               /* The Obj_desc is actually an Node */
-
-               node = (ACPI_NAMESPACE_NODE *) obj_desc;
-               obj_desc = NULL;
-
-               /* Object must be a device or thermal zone */
-
-               if (node && val_desc) {
-                       switch (node->type) {
-                       case ACPI_TYPE_DEVICE:
-                       case ACPI_TYPE_THERMAL:
-
-                               /*
-                                * Dispatch the notify to the appropriate handler
-                                * NOTE: the request is queued for execution after this method
-                                * completes.  The notify handlers are NOT invoked synchronously
-                                * from this thread -- because handlers may in turn run other
-                                * control methods.
-                                */
-
-                               status = acpi_ev_queue_notify_request (node,
-                                                (u32) val_desc->integer.value);
-                               break;
-
-                       default:
-                               status = AE_AML_OPERAND_TYPE;
-                               break;
-                       }
-               }
-               break;
-
-       default:
-
-               REPORT_ERROR (("Acpi_aml_exec_dyadic1: Unknown dyadic opcode %X\n",
-                       opcode));
-               status = AE_AML_BAD_OPCODE;
-       }
-
-
-cleanup:
-
-       /* Always delete both operands */
-
-       acpi_cm_remove_reference (val_desc);
-       acpi_cm_remove_reference (obj_desc);
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_dyadic2_r
- *
- * PARAMETERS:  Opcode              - The opcode to be executed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Type 2 dyadic operator with numeric operands and
- *              one or two result operands.
- *
- * ALLOCATION:  Deletes one operand descriptor -- other remains on stack
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_dyadic2_r (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc   = NULL;
-       ACPI_OPERAND_OBJECT     *obj_desc2  = NULL;
-       ACPI_OPERAND_OBJECT     *res_desc   = NULL;
-       ACPI_OPERAND_OBJECT     *res_desc2  = NULL;
-       ACPI_OPERAND_OBJECT     *ret_desc   = NULL;
-       ACPI_OPERAND_OBJECT     *ret_desc2  = NULL;
-       ACPI_STATUS             status      = AE_OK;
-       u32                     num_operands = 3;
-
-
-       /* Resolve all operands */
-
-       status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state);
-       /* Get all operands */
-
-       if (AML_DIVIDE_OP == opcode) {
-               num_operands = 4;
-               status |= acpi_ds_obj_stack_pop_object (&res_desc2, walk_state);
-       }
-
-       status |= acpi_ds_obj_stack_pop_object (&res_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&obj_desc2, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-
-       /* Create an internal return object if necessary */
-
-       switch (opcode) {
-       case AML_ADD_OP:
-       case AML_BIT_AND_OP:
-       case AML_BIT_NAND_OP:
-       case AML_BIT_OR_OP:
-       case AML_BIT_NOR_OP:
-       case AML_BIT_XOR_OP:
-       case AML_DIVIDE_OP:
-       case AML_MULTIPLY_OP:
-       case AML_SHIFT_LEFT_OP:
-       case AML_SHIFT_RIGHT_OP:
-       case AML_SUBTRACT_OP:
-
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-               if (!ret_desc) {
-                       status = AE_NO_MEMORY;
-                       goto cleanup;
-               }
-
-               break;
-       }
-
-
-       /*
-        * Execute the opcode
-        */
-
-       switch (opcode) {
-
-       /* Def_add :=  Add_op  Operand1    Operand2    Result  */
-
-       case AML_ADD_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value +
-                                obj_desc2->integer.value;
-               break;
-
-
-       /* Def_and :=  And_op  Operand1    Operand2    Result  */
-
-       case AML_BIT_AND_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value &
-                                obj_desc2->integer.value;
-               break;
-
-
-       /* Def_nAnd := NAnd_op Operand1    Operand2    Result  */
-
-       case AML_BIT_NAND_OP:
-
-               ret_desc->integer.value = ~(obj_desc->integer.value &
-                                  obj_desc2->integer.value);
-               break;
-
-
-       /* Def_or  :=  Or_op   Operand1    Operand2    Result  */
-
-       case AML_BIT_OR_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value |
-                                obj_desc2->integer.value;
-               break;
-
-
-       /* Def_nOr :=  NOr_op  Operand1    Operand2    Result  */
-
-       case AML_BIT_NOR_OP:
-
-               ret_desc->integer.value = ~(obj_desc->integer.value |
-                                  obj_desc2->integer.value);
-               break;
-
-
-       /* Def_xOr :=  XOr_op  Operand1    Operand2    Result  */
-
-       case AML_BIT_XOR_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value ^
-                                obj_desc2->integer.value;
-               break;
-
-
-       /* Def_divide  :=  Divide_op Dividend Divisor Remainder Quotient */
-
-       case AML_DIVIDE_OP:
-
-               if (!obj_desc2->integer.value) {
-                       REPORT_ERROR
-                               (("Aml_exec_dyadic2_r/Divide_op: Divide by zero\n"));
-
-                       status = AE_AML_DIVIDE_BY_ZERO;
-                       goto cleanup;
-               }
-
-               ret_desc2 = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-               if (!ret_desc2) {
-                       status = AE_NO_MEMORY;
-                       goto cleanup;
-               }
-
-               /* Remainder (modulo) */
-
-               ret_desc->integer.value  = ACPI_MODULO (obj_desc->integer.value,
-                                 obj_desc2->integer.value);
-
-               /* Result (what we used to call the quotient) */
-
-               ret_desc2->integer.value = ACPI_DIVIDE (obj_desc->integer.value,
-                                 obj_desc2->integer.value);
-               break;
-
-
-       /* Def_multiply := Multiply_op Operand1    Operand2    Result  */
-
-       case AML_MULTIPLY_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value *
-                                obj_desc2->integer.value;
-               break;
-
-
-       /* Def_shift_left  :=  Shift_left_op Operand Shift_count Result */
-
-       case AML_SHIFT_LEFT_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value <<
-                                obj_desc2->integer.value;
-               break;
-
-
-       /* Def_shift_right :=  Shift_right_op  Operand Shift_count Result  */
-
-       case AML_SHIFT_RIGHT_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value >>
-                                obj_desc2->integer.value;
-               break;
-
-
-       /* Def_subtract := Subtract_op Operand1    Operand2    Result  */
-
-       case AML_SUBTRACT_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value -
-                                obj_desc2->integer.value;
-               break;
-
-
-       /* Def_concat  :=  Concat_op   Data1   Data2   Result  */
-
-       case AML_CONCAT_OP:
-
-
-               /*
-                * Convert the second operand if necessary.  The first operand
-                * determines the type of the second operand, (See the Data Types
-                * section of the ACPI specification.)  Both object types are
-                * guaranteed to be either Integer/String/Buffer by the operand
-                * resolution mechanism above.
-                */
-
-               switch (obj_desc->common.type) {
-               case ACPI_TYPE_INTEGER:
-                       status = acpi_aml_convert_to_integer (&obj_desc2, walk_state);
-                       break;
-
-               case ACPI_TYPE_STRING:
-                       status = acpi_aml_convert_to_string (&obj_desc2, walk_state);
-                       break;
-
-               case ACPI_TYPE_BUFFER:
-                       status = acpi_aml_convert_to_buffer (&obj_desc2, walk_state);
-                       break;
-
-               default:
-                       status = AE_AML_INTERNAL;
-               }
-
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-
-               /*
-                * Both operands are now known to be the same object type
-                * (Both are Integer, String, or Buffer), and we can now perform the
-                * concatenation.
-                */
-               status = acpi_aml_do_concatenate (obj_desc, obj_desc2, &ret_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-               break;
-
-
-       default:
-
-               REPORT_ERROR (("Acpi_aml_exec_dyadic2_r: Unknown dyadic opcode %X\n",
-                               opcode));
-               status = AE_AML_BAD_OPCODE;
-               goto cleanup;
-       }
-
-
-       /*
-        * Store the result of the operation (which is now in Obj_desc) into
-        * the result descriptor, or the location pointed to by the result
-        * descriptor (Res_desc).
-        */
-
-       status = acpi_aml_exec_store (ret_desc, res_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       if (AML_DIVIDE_OP == opcode) {
-               status = acpi_aml_exec_store (ret_desc2, res_desc2, walk_state);
-
-               /*
-                * Since the remainder is not returned, remove a reference to
-                * the object we created earlier
-                */
-
-               acpi_cm_remove_reference (ret_desc2);
-       }
-
-
-cleanup:
-
-       /* Always delete the operands */
-
-       acpi_cm_remove_reference (obj_desc);
-       acpi_cm_remove_reference (obj_desc2);
-
-
-       /* Delete return object on error */
-
-       if (ACPI_FAILURE (status)) {
-               /* On failure, delete the result ops */
-
-               acpi_cm_remove_reference (res_desc);
-               acpi_cm_remove_reference (res_desc2);
-
-               if (ret_desc) {
-                       /* And delete the internal return object */
-
-                       acpi_cm_remove_reference (ret_desc);
-                       ret_desc = NULL;
-               }
-       }
-
-       /* Set the return object and exit */
-
-       *return_desc = ret_desc;
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_dyadic2_s
- *
- * PARAMETERS:  Opcode              - The opcode to be executed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Type 2 dyadic synchronization operator
- *
- * ALLOCATION:  Deletes one operand descriptor -- other remains on stack
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_dyadic2_s (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *time_desc;
-       ACPI_OPERAND_OBJECT     *ret_desc = NULL;
-       ACPI_STATUS             status;
-
-
-       /* Resolve all operands */
-
-       status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state);
-       /* Get all operands */
-
-       status |= acpi_ds_obj_stack_pop_object (&time_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               /* Invalid parameters on object stack  */
-
-               goto cleanup;
-       }
-
-
-       /* Create the internal return object */
-
-       ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-       if (!ret_desc) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       /* Default return value is FALSE, operation did not time out */
-
-       ret_desc->integer.value = 0;
-
-
-       /* Examine the opcode */
-
-       switch (opcode) {
-
-       /* Def_acquire :=  Acquire_op  Mutex_object Timeout */
-
-       case AML_ACQUIRE_OP:
-
-               status = acpi_aml_acquire_mutex (time_desc, obj_desc, walk_state);
-               break;
-
-
-       /* Def_wait := Wait_op Acpi_event_object Timeout */
-
-       case AML_WAIT_OP:
-
-               status = acpi_aml_system_wait_event (time_desc, obj_desc);
-               break;
-
-
-       default:
-
-               REPORT_ERROR (("Acpi_aml_exec_dyadic2_s: Unknown dyadic synchronization opcode %X\n", opcode));
-               status = AE_AML_BAD_OPCODE;
-               goto cleanup;
-       }
-
-
-       /*
-        * Return a boolean indicating if operation timed out
-        * (TRUE) or not (FALSE)
-        */
-
-       if (status == AE_TIME) {
-               ret_desc->integer.value = ACPI_INTEGER_MAX;  /* TRUE, op timed out */
-               status = AE_OK;
-       }
-
-
-cleanup:
-
-       /* Delete params */
-
-       acpi_cm_remove_reference (time_desc);
-       acpi_cm_remove_reference (obj_desc);
-
-       /* Delete return object on error */
-
-       if (ACPI_FAILURE (status) &&
-               (ret_desc)) {
-               acpi_cm_remove_reference (ret_desc);
-               ret_desc = NULL;
-       }
-
-
-       /* Set the return object and exit */
-
-       *return_desc = ret_desc;
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_dyadic2
- *
- * PARAMETERS:  Opcode              - The opcode to be executed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Type 2 dyadic operator with numeric operands and
- *              no result operands
- *
- * ALLOCATION:  Deletes one operand descriptor -- other remains on stack
- *              containing result value
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_dyadic2 (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *obj_desc2;
-       ACPI_OPERAND_OBJECT     *ret_desc = NULL;
-       ACPI_STATUS             status;
-       u8                      lboolean;
-
-
-       /* Resolve all operands */
-
-       status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state);
-       /* Get all operands */
-
-       status |= acpi_ds_obj_stack_pop_object (&obj_desc2, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               /* Invalid parameters on object stack  */
-
-               goto cleanup;
-       }
-
-
-       /* Create the internal return object */
-
-       ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-       if (!ret_desc) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       /*
-        * Execute the Opcode
-        */
-
-       lboolean = FALSE;
-       switch (opcode) {
-
-       /* Def_lAnd := LAnd_op Operand1    Operand2    */
-
-       case AML_LAND_OP:
-
-               lboolean = (u8) (obj_desc->integer.value &&
-                                 obj_desc2->integer.value);
-               break;
-
-
-       /* Def_lEqual  :=  LEqual_op   Operand1    Operand2    */
-
-       case AML_LEQUAL_OP:
-
-               lboolean = (u8) (obj_desc->integer.value ==
-                                 obj_desc2->integer.value);
-               break;
-
-
-       /* Def_lGreater := LGreater_op Operand1    Operand2    */
-
-       case AML_LGREATER_OP:
-
-               lboolean = (u8) (obj_desc->integer.value >
-                                 obj_desc2->integer.value);
-               break;
-
-
-       /* Def_lLess   :=  LLess_op Operand1   Operand2    */
-
-       case AML_LLESS_OP:
-
-               lboolean = (u8) (obj_desc->integer.value <
-                                 obj_desc2->integer.value);
-               break;
-
-
-       /* Def_lOr :=  LOr_op  Operand1    Operand2    */
-
-       case AML_LOR_OP:
-
-               lboolean = (u8) (obj_desc->integer.value ||
-                                 obj_desc2->integer.value);
-               break;
-
-
-       default:
-
-               REPORT_ERROR (("Acpi_aml_exec_dyadic2: Unknown dyadic opcode %X\n", opcode));
-               status = AE_AML_BAD_OPCODE;
-               goto cleanup;
-               break;
-       }
-
-
-       /* Set return value to logical TRUE (all ones) or FALSE (zero) */
-
-       if (lboolean) {
-               ret_desc->integer.value = ACPI_INTEGER_MAX;
-       }
-       else {
-               ret_desc->integer.value = 0;
-       }
-
-
-cleanup:
-
-       /* Always delete operands */
-
-       acpi_cm_remove_reference (obj_desc);
-       acpi_cm_remove_reference (obj_desc2);
-
-
-       /* Delete return object on error */
-
-       if (ACPI_FAILURE (status) &&
-               (ret_desc)) {
-               acpi_cm_remove_reference (ret_desc);
-               ret_desc = NULL;
-       }
-
-
-       /* Set the return object and exit */
-
-       *return_desc = ret_desc;
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amfield.c b/reactos/drivers/bus/acpi/executer/amfield.c
deleted file mode 100644 (file)
index cb3007c..0000000
+++ /dev/null
@@ -1,274 +0,0 @@
-/******************************************************************************
- *
- * Module Name: amfield - ACPI AML (p-code) execution - field manipulation
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amfield")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_setup_field
- *
- * PARAMETERS:  *Obj_desc           - Field to be read or written
- *              *Rgn_desc           - Region containing field
- *              Field_bit_width     - Field Width in bits (8, 16, or 32)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Common processing for Acpi_aml_read_field and Acpi_aml_write_field
- *
- *  ACPI SPECIFICATION REFERENCES:
- *  Each of the Type1_opcodes is defined as specified in in-line
- *  comments below. For each one, use the following definitions.
- *
- *  Def_bit_field   :=  Bit_field_op    Src_buf Bit_idx Destination
- *  Def_byte_field  :=  Byte_field_op   Src_buf Byte_idx Destination
- *  Def_create_field := Create_field_op Src_buf Bit_idx Num_bits Name_string
- *  Def_dWord_field :=  DWord_field_op  Src_buf Byte_idx Destination
- *  Def_word_field  :=  Word_field_op   Src_buf Byte_idx Destination
- *  Bit_index       :=  Term_arg=>Integer
- *  Byte_index      :=  Term_arg=>Integer
- *  Destination     :=  Name_string
- *  Num_bits        :=  Term_arg=>Integer
- *  Source_buf      :=  Term_arg=>Buffer
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_setup_field (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_OPERAND_OBJECT     *rgn_desc,
-       u32                     field_bit_width)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     field_byte_width;
-
-
-       /* Parameter validation */
-
-       if (!obj_desc || !rgn_desc) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-       if (ACPI_TYPE_REGION != rgn_desc->common.type) {
-               return (AE_AML_OPERAND_TYPE);
-       }
-
-
-       /*
-        * TBD: [Future] Acpi 2.0 supports Qword fields
-        *
-        * Init and validate Field width
-        * Possible values are 1, 2, 4
-        */
-
-       field_byte_width = DIV_8 (field_bit_width);
-
-       if ((field_bit_width != 8) &&
-               (field_bit_width != 16) &&
-               (field_bit_width != 32)) {
-               return (AE_AML_OPERAND_VALUE);
-       }
-
-
-       /*
-        * If the Region Address and Length have not been previously evaluated,
-        * evaluate them and save the results.
-        */
-       if (!(rgn_desc->region.flags & AOPOBJ_DATA_VALID)) {
-
-               status = acpi_ds_get_region_arguments (rgn_desc);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-
-       if ((obj_desc->common.type == ACPI_TYPE_FIELD_UNIT) &&
-               (!(obj_desc->common.flags & AOPOBJ_DATA_VALID))) {
-               /*
-                * Field Buffer and Index have not been previously evaluated,
-                */
-               return (AE_AML_INTERNAL);
-       }
-
-       if (rgn_desc->region.length <
-          (obj_desc->field.offset & ~((u32) field_byte_width - 1)) +
-                       field_byte_width) {
-               /*
-                * Offset rounded up to next multiple of field width
-                * exceeds region length, indicate an error
-                */
-
-               return (AE_AML_REGION_LIMIT);
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_access_named_field
- *
- * PARAMETERS:  Mode                - ACPI_READ or ACPI_WRITE
- *              Named_field         - Handle for field to be accessed
- *              *Buffer             - Value(s) to be read or written
- *              Buffer_length         - Number of bytes to transfer
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Read or write a named field
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_access_named_field (
-       u32                     mode,
-       ACPI_HANDLE             named_field,
-       void                    *buffer,
-       u32                     buffer_length)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc = NULL;
-       ACPI_STATUS             status = AE_OK;
-       u8                      locked = FALSE;
-       u32                     bit_granularity = 0;
-       u32                     byte_granularity;
-       u32                     datum_length;
-       u32                     actual_byte_length;
-       u32                     byte_field_length;
-
-
-       /* Parameter validation */
-
-       if ((!named_field) || (ACPI_READ == mode && !buffer)) {
-               return (AE_AML_INTERNAL);
-       }
-
-       /* Get the attached field object */
-
-       obj_desc = acpi_ns_get_attached_object (named_field);
-       if (!obj_desc) {
-               return (AE_AML_INTERNAL);
-       }
-
-       /* Check the type */
-
-       if (INTERNAL_TYPE_DEF_FIELD != acpi_ns_get_type (named_field)) {
-               return (AE_AML_OPERAND_TYPE);
-       }
-
-       /* Obj_desc valid and Named_field is a defined field */
-
-
-       /* Double-check that the attached object is also a field */
-
-       if (INTERNAL_TYPE_DEF_FIELD != obj_desc->common.type) {
-               return (AE_AML_OPERAND_TYPE);
-       }
-
-
-       /*
-        * Granularity was decoded from the field access type
-        * (Any_acc will be the same as Byte_acc)
-        */
-
-       bit_granularity = obj_desc->field_unit.granularity;
-       byte_granularity = DIV_8 (bit_granularity);
-
-       /*
-        * Check if request is too large for the field, and silently truncate
-        * if necessary
-        */
-
-       /* TBD: [Errors] should an error be returned in this case? */
-
-       byte_field_length = (u32) DIV_8 (obj_desc->field_unit.length + 7);
-
-
-       actual_byte_length = buffer_length;
-       if (buffer_length > byte_field_length) {
-               actual_byte_length = byte_field_length;
-       }
-
-       /* TBD: should these round down to a power of 2? */
-
-       if (DIV_8 (bit_granularity) > byte_field_length) {
-               bit_granularity = MUL_8(byte_field_length);
-       }
-
-       if (byte_granularity > byte_field_length) {
-               byte_granularity = byte_field_length;
-       }
-
-
-       /* Convert byte count to datum count, round up if necessary */
-
-       datum_length = (actual_byte_length + (byte_granularity-1)) / byte_granularity;
-
-
-       /* Get the global lock if needed */
-
-       locked = acpi_aml_acquire_global_lock (obj_desc->field_unit.lock_rule);
-
-
-       /* Perform the actual read or write of the buffer */
-
-       switch (mode) {
-       case ACPI_READ:
-
-               status = acpi_aml_read_field (obj_desc, buffer, buffer_length,
-                                 actual_byte_length, datum_length,
-                                 bit_granularity, byte_granularity);
-               break;
-
-
-       case ACPI_WRITE:
-
-               status = acpi_aml_write_field (obj_desc, buffer, buffer_length,
-                                 actual_byte_length, datum_length,
-                                 bit_granularity, byte_granularity);
-               break;
-
-
-       default:
-
-               status = AE_BAD_PARAMETER;
-               break;
-       }
-
-
-       /* Release global lock if we acquired it earlier */
-
-       acpi_aml_release_global_lock (locked);
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/executer/amfldio.c b/reactos/drivers/bus/acpi/executer/amfldio.c
deleted file mode 100644 (file)
index 6804692..0000000
+++ /dev/null
@@ -1,668 +0,0 @@
-/******************************************************************************
- *
- * Module Name: amfldio - Aml Field I/O
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amfldio")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_read_field_data
- *
- * PARAMETERS:  *Obj_desc           - Field to be read
- *              *Value              - Where to store value
- *              Field_bit_width     - Field Width in bits (8, 16, or 32)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Retrieve the value of the given field
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_read_field_data (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       u32                     field_byte_offset,
-       u32                     field_bit_width,
-       u32                     *value)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *rgn_desc = NULL;
-       ACPI_PHYSICAL_ADDRESS   address;
-       u32                     local_value = 0;
-       u32                     field_byte_width;
-
-
-       /* Obj_desc is validated by callers */
-
-       if (obj_desc) {
-               rgn_desc = obj_desc->field.container;
-       }
-
-
-       field_byte_width = DIV_8 (field_bit_width);
-       status = acpi_aml_setup_field (obj_desc, rgn_desc, field_bit_width);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Setup_field validated Rgn_desc and Field_bit_width */
-
-       if (!value) {
-               value = &local_value;   /*  support reads without saving value  */
-       }
-
-
-       /*
-        * Set offset to next multiple of field width,
-        *  add region base address and offset within the field
-        */
-       address = rgn_desc->region.address +
-                         (obj_desc->field.offset * field_byte_width) +
-                         field_byte_offset;
-
-
-       /* Invoke the appropriate Address_space/Op_region handler */
-
-       status = acpi_ev_address_space_dispatch (rgn_desc, ADDRESS_SPACE_READ,
-                        address, field_bit_width, value);
-
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_read_field
- *
- * PARAMETERS:  *Obj_desc           - Field to be read
- *              *Value              - Where to store value
- *              Field_bit_width     - Field Width in bits (8, 16, or 32)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Retrieve the value of the given field
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_read_field (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       void                    *buffer,
-       u32                     buffer_length,
-       u32                     byte_length,
-       u32                     datum_length,
-       u32                     bit_granularity,
-       u32                     byte_granularity)
-{
-       ACPI_STATUS             status;
-       u32                     this_field_byte_offset;
-       u32                     this_field_datum_offset;
-       u32                     previous_raw_datum;
-       u32                     this_raw_datum = 0;
-       u32                     valid_field_bits;
-       u32                     mask;
-       u32                     merged_datum = 0;
-
-
-       /*
-        * Clear the caller's buffer (the whole buffer length as given)
-        * This is very important, especially in the cases where a byte is read,
-        * but the buffer is really a u32 (4 bytes).
-        */
-
-       MEMSET (buffer, 0, buffer_length);
-
-       /* Read the first raw datum to prime the loop */
-
-       this_field_byte_offset = 0;
-       this_field_datum_offset= 0;
-
-       status = acpi_aml_read_field_data (obj_desc, this_field_byte_offset, bit_granularity,
-                          &previous_raw_datum);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       /* We might actually be done if the request fits in one datum */
-
-       if ((datum_length == 1) &&
-               ((obj_desc->field.bit_offset + obj_desc->field_unit.length) <=
-                       (u16) bit_granularity)) {
-               merged_datum = previous_raw_datum;
-
-               merged_datum = (merged_datum >> obj_desc->field.bit_offset);
-
-               valid_field_bits = obj_desc->field_unit.length % bit_granularity;
-               if (valid_field_bits) {
-                       mask = (((u32) 1 << valid_field_bits) - (u32) 1);
-                       merged_datum &= mask;
-               }
-
-
-               /*
-                * Place the Merged_datum into the proper format and return buffer
-                * field
-                */
-
-               switch (byte_granularity) {
-               case 1:
-                       ((u8 *) buffer) [this_field_datum_offset] = (u8) merged_datum;
-                       break;
-
-               case 2:
-                       MOVE_UNALIGNED16_TO_16 (&(((u16 *) buffer)[this_field_datum_offset]), &merged_datum);
-                       break;
-
-               case 4:
-                       MOVE_UNALIGNED32_TO_32 (&(((u32 *) buffer)[this_field_datum_offset]), &merged_datum);
-                       break;
-               }
-
-               this_field_byte_offset = 1;
-               this_field_datum_offset = 1;
-       }
-
-       else {
-               /* We need to get more raw data to complete one or more field data */
-
-               while (this_field_datum_offset < datum_length) {
-                       /*
-                        * If the field is aligned on a byte boundary, we don't want
-                        * to perform a final read, since this would potentially read
-                        * past the end of the region.
-                        *
-                        * TBD: [Investigate] It may make more sense to just split the aligned
-                        * and non-aligned cases since the aligned case is so very simple,
-                        */
-                       if ((obj_desc->field.bit_offset != 0) ||
-                               ((obj_desc->field.bit_offset == 0) &&
-                               (this_field_datum_offset < (datum_length -1)))) {
-                               /*
-                                * Get the next raw datum, it contains some or all bits
-                                * of the current field datum
-                                */
-
-                               status = acpi_aml_read_field_data (obj_desc,
-                                                 this_field_byte_offset + byte_granularity,
-                                                 bit_granularity, &this_raw_datum);
-                               if (ACPI_FAILURE (status)) {
-                                       goto cleanup;
-                               }
-
-                               /* Before merging the data, make sure the unused bits are clear */
-
-                               switch (byte_granularity) {
-                               case 1:
-                                       this_raw_datum &= 0x000000FF;
-                                       previous_raw_datum &= 0x000000FF;
-                                       break;
-
-                               case 2:
-                                       this_raw_datum &= 0x0000FFFF;
-                                       previous_raw_datum &= 0x0000FFFF;
-                                       break;
-                               }
-                       }
-
-
-                       /*
-                        * Put together bits of the two raw data to make a complete
-                        * field datum
-                        */
-
-
-                       if (obj_desc->field.bit_offset != 0) {
-                               merged_datum =
-                                       (previous_raw_datum >> obj_desc->field.bit_offset) |
-                                       (this_raw_datum << (bit_granularity - obj_desc->field.bit_offset));
-                       }
-
-                       else {
-                               merged_datum = previous_raw_datum;
-                       }
-
-                       /*
-                        * Prepare the merged datum for storing into the caller's
-                        *  buffer.  It is possible to have a 32-bit buffer
-                        *  (Byte_granularity == 4), but a Obj_desc->Field.Length
-                        *  of 8 or 16, meaning that the upper bytes of merged data
-                        *  are undesired.  This section fixes that.
-                        */
-                       switch (obj_desc->field.length) {
-                       case 8:
-                               merged_datum &= 0x000000FF;
-                               break;
-
-                       case 16:
-                               merged_datum &= 0x0000FFFF;
-                               break;
-                       }
-
-                       /*
-                        * Now store the datum in the caller's buffer, according to
-                        * the data type
-                        */
-                       switch (byte_granularity) {
-                       case 1:
-                               ((u8 *) buffer) [this_field_datum_offset] = (u8) merged_datum;
-                               break;
-
-                       case 2:
-                               MOVE_UNALIGNED16_TO_16 (&(((u16 *) buffer) [this_field_datum_offset]), &merged_datum);
-                               break;
-
-                       case 4:
-                               MOVE_UNALIGNED32_TO_32 (&(((u32 *) buffer) [this_field_datum_offset]), &merged_datum);
-                               break;
-                       }
-
-                       /*
-                        * Save the most recent datum since it contains bits of
-                        * the *next* field datum
-                        */
-
-                       previous_raw_datum = this_raw_datum;
-
-                       this_field_byte_offset += byte_granularity;
-                       this_field_datum_offset++;
-
-               }  /* while */
-       }
-
-cleanup:
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_write_field_data
- *
- * PARAMETERS:  *Obj_desc           - Field to be set
- *              Value               - Value to store
- *              Field_bit_width     - Field Width in bits (8, 16, or 32)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Store the value into the given field
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_aml_write_field_data (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       u32                     field_byte_offset,
-       u32                     field_bit_width,
-       u32                     value)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OPERAND_OBJECT     *rgn_desc = NULL;
-       ACPI_PHYSICAL_ADDRESS   address;
-       u32                     field_byte_width;
-
-
-       /* Obj_desc is validated by callers */
-
-       if (obj_desc) {
-               rgn_desc = obj_desc->field.container;
-       }
-
-       field_byte_width = DIV_8 (field_bit_width);
-       status = acpi_aml_setup_field (obj_desc, rgn_desc, field_bit_width);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /*
-        * Set offset to next multiple of field width,
-        *  add region base address and offset within the field
-        */
-       address = rgn_desc->region.address +
-                         (obj_desc->field.offset * field_byte_width) +
-                         field_byte_offset;
-
-       /* Invoke the appropriate Address_space/Op_region handler */
-
-       status = acpi_ev_address_space_dispatch (rgn_desc, ADDRESS_SPACE_WRITE,
-                        address, field_bit_width, &value);
-
-
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_write_field_data_with_update_rule
- *
- * PARAMETERS:  *Obj_desc           - Field to be set
- *              Value               - Value to store
- *              Field_bit_width     - Field Width in bits (8, 16, or 32)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Apply the field update rule to a field write
- *
- ****************************************************************************/
-
-static ACPI_STATUS
-acpi_aml_write_field_data_with_update_rule (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       u32                     mask,
-       u32                     field_value,
-       u32                     this_field_byte_offset,
-       u32                     bit_granularity)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     merged_value;
-       u32                     current_value;
-
-
-       /* Start with the new bits  */
-
-       merged_value = field_value;
-
-
-       /* Decode the update rule */
-
-       switch (obj_desc->field.update_rule) {
-
-       case UPDATE_PRESERVE:
-
-               /* Check if update rule needs to be applied (not if mask is all ones) */
-
-               /* The left shift drops the bits we want to ignore. */
-               if ((~mask << (sizeof(mask)*8 - bit_granularity)) != 0) {
-                       /*
-                        * Read the current contents of the byte/word/dword containing
-                        * the field, and merge with the new field value.
-                        */
-                       status = acpi_aml_read_field_data (obj_desc, this_field_byte_offset,
-                                          bit_granularity, &current_value);
-                       merged_value |= (current_value & ~mask);
-               }
-               break;
-
-
-       case UPDATE_WRITE_AS_ONES:
-
-               /* Set positions outside the field to all ones */
-
-               merged_value |= ~mask;
-               break;
-
-
-       case UPDATE_WRITE_AS_ZEROS:
-
-               /* Set positions outside the field to all zeros */
-
-               merged_value &= mask;
-               break;
-
-
-       default:
-               status = AE_AML_OPERAND_VALUE;
-       }
-
-
-       /* Write the merged value */
-
-       if (ACPI_SUCCESS (status)) {
-               status = acpi_aml_write_field_data (obj_desc, this_field_byte_offset,
-                                  bit_granularity, merged_value);
-       }
-
-       return (status);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_aml_write_field
- *
- * PARAMETERS:  *Obj_desc           - Field to be set
- *              Value               - Value to store
- *              Field_bit_width     - Field Width in bits (8, 16, or 32)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Store the value into the given field
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_aml_write_field (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       void                    *buffer,
-       u32                     buffer_length,
-       u32                     byte_length,
-       u32                     datum_length,
-       u32                     bit_granularity,
-       u32                     byte_granularity)
-{
-       ACPI_STATUS             status;
-       u32                     this_field_byte_offset;
-       u32                     this_field_datum_offset;
-       u32                     mask;
-       u32                     merged_datum;
-       u32                     previous_raw_datum;
-       u32                     this_raw_datum;
-       u32                     field_value;
-       u32                     valid_field_bits;
-
-
-       /*
-        * Break the request into up to three parts:
-        * non-aligned part at start, aligned part in middle, non-aligned part
-        * at end --- Just like an I/O request ---
-        */
-
-       this_field_byte_offset = 0;
-       this_field_datum_offset= 0;
-
-       /* Get a datum */
-
-       switch (byte_granularity) {
-       case 1:
-               previous_raw_datum = ((u8 *) buffer) [this_field_datum_offset];
-               break;
-
-       case 2:
-               MOVE_UNALIGNED16_TO_32 (&previous_raw_datum, &(((u16 *) buffer) [this_field_datum_offset]));
-               break;
-
-       case 4:
-               MOVE_UNALIGNED32_TO_32 (&previous_raw_datum, &(((u32 *) buffer) [this_field_datum_offset]));
-               break;
-
-       default:
-               status = AE_AML_OPERAND_VALUE;
-               goto cleanup;
-       }
-
-
-       /*
-        * Write a partial field datum if field does not begin on a datum boundary
-        *
-        * Construct Mask with 1 bits where the field is, 0 bits elsewhere
-        *
-        * 1) Bits above the field
-        */
-
-       mask = (((u32)(-1)) << (u32)obj_desc->field.bit_offset);
-
-       /* 2) Only the bottom 5 bits are valid for a shift operation. */
-
-       if ((obj_desc->field.bit_offset + obj_desc->field_unit.length) < 32) {
-               /* Bits above the field */
-
-               mask &= (~(((u32)(-1)) << ((u32)obj_desc->field.bit_offset +
-                                  (u32)obj_desc->field_unit.length)));
-       }
-
-       /* 3) Shift and mask the value into the field position */
-
-       field_value = (previous_raw_datum << obj_desc->field.bit_offset) & mask;
-
-       status = acpi_aml_write_field_data_with_update_rule (obj_desc, mask, field_value,
-                        this_field_byte_offset,
-                        bit_granularity);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-
-       /* If the field fits within one datum, we are done. */
-
-       if ((datum_length == 1) &&
-          ((obj_desc->field.bit_offset + obj_desc->field_unit.length) <=
-                       (u16) bit_granularity)) {
-               goto cleanup;
-       }
-
-       /*
-        * We don't need to worry about the update rule for these data, because
-        * all of the bits are part of the field.
-        *
-        * Can't write the last datum, however, because it might contain bits that
-        * are not part of the field -- the update rule must be applied.
-        */
-
-       while (this_field_datum_offset < (datum_length - 1)) {
-               this_field_datum_offset++;
-
-               /* Get the next raw datum, it contains bits of the current field datum... */
-
-               switch (byte_granularity) {
-               case 1:
-                       this_raw_datum = ((u8 *) buffer) [this_field_datum_offset];
-                       break;
-
-               case 2:
-                       MOVE_UNALIGNED16_TO_32 (&this_raw_datum, &(((u16 *) buffer) [this_field_datum_offset]));
-                       break;
-
-               case 4:
-                       MOVE_UNALIGNED32_TO_32 (&this_raw_datum, &(((u32 *) buffer) [this_field_datum_offset]));
-                       break;
-
-               default:
-                       status = AE_AML_OPERAND_VALUE;
-                       goto cleanup;
-               }
-
-               /*
-                * Put together bits of the two raw data to make a complete field
-                * datum
-                */
-
-               if (obj_desc->field.bit_offset != 0) {
-                       merged_datum =
-                               (previous_raw_datum >> (bit_granularity - obj_desc->field.bit_offset)) |
-                               (this_raw_datum << obj_desc->field.bit_offset);
-               }
-
-               else {
-                       merged_datum = this_raw_datum;
-               }
-
-               /* Now write the completed datum  */
-
-
-               status = acpi_aml_write_field_data (obj_desc,
-                                  this_field_byte_offset + byte_granularity,
-                                  bit_granularity, merged_datum);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-
-               /*
-                * Save the most recent datum since it contains bits of
-                * the *next* field datum
-                */
-
-               previous_raw_datum = this_raw_datum;
-
-               this_field_byte_offset += byte_granularity;
-
-       }  /* while */
-
-
-       /* Write a partial field datum if field does not end on a datum boundary */
-
-       if ((obj_desc->field_unit.length + obj_desc->field_unit.bit_offset) %
-               bit_granularity) {
-               switch (byte_granularity) {
-               case 1:
-                       this_raw_datum = ((u8 *) buffer) [this_field_datum_offset];
-                       break;
-
-               case 2:
-                       MOVE_UNALIGNED16_TO_32 (&this_raw_datum, &(((u16 *) buffer) [this_field_datum_offset]));
-                       break;
-
-               case 4:
-                       MOVE_UNALIGNED32_TO_32 (&this_raw_datum, &(((u32 *) buffer) [this_field_datum_offset]));
-                       break;
-               }
-
-               /* Construct Mask with 1 bits where the field is, 0 bits elsewhere */
-
-               valid_field_bits = ((obj_desc->field_unit.length % bit_granularity) +
-                                  obj_desc->field.bit_offset);
-
-               mask = (((u32) 1 << valid_field_bits) - (u32) 1);
-
-               /* Shift and mask the value into the field position */
-
-               field_value = (previous_raw_datum >>
-                                 (bit_granularity - obj_desc->field.bit_offset)) & mask;
-
-               status = acpi_aml_write_field_data_with_update_rule (obj_desc, mask, field_value,
-                                this_field_byte_offset + byte_granularity,
-                                bit_granularity);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-       }
-
-
-cleanup:
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/ammisc.c b/reactos/drivers/bus/acpi/executer/ammisc.c
deleted file mode 100644 (file)
index b4adaf1..0000000
+++ /dev/null
@@ -1,510 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: ammisc - ACPI AML (p-code) execution - specific opcodes
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("ammisc")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_fatal
- *
- * PARAMETERS:  none
- *
- * RETURN:      Status.  If the OS returns from the OSD call, we just keep
- *              on going.
- *
- * DESCRIPTION: Execute Fatal operator
- *
- * ACPI SPECIFICATION REFERENCES:
- *  Def_fatal   :=  Fatal_op Fatal_type Fatal_code  Fatal_arg
- *  Fatal_type  :=  Byte_data
- *  Fatal_code  :=  DWord_data
- *  Fatal_arg   :=  Term_arg=>Integer
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_fatal (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *type_desc;
-       ACPI_OPERAND_OBJECT     *code_desc;
-       ACPI_OPERAND_OBJECT     *arg_desc;
-       ACPI_STATUS             status;
-
-
-       /* Resolve operands */
-
-       status = acpi_aml_resolve_operands (AML_FATAL_OP, WALK_OPERANDS, walk_state);
-       /* Get operands */
-
-       status |= acpi_ds_obj_stack_pop_object (&arg_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&code_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&type_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               /* Invalid parameters on object stack  */
-
-               goto cleanup;
-       }
-
-
-       /* Def_fatal   :=  Fatal_op Fatal_type Fatal_code  Fatal_arg   */
-
-
-       /*
-        * TBD: [Unhandled] call OSD interface to notify OS of fatal error
-        * requiring shutdown!
-        */
-
-
-cleanup:
-
-       /* Free the operands */
-
-       acpi_cm_remove_reference (arg_desc);
-       acpi_cm_remove_reference (code_desc);
-       acpi_cm_remove_reference (type_desc);
-
-
-       /* If we get back from the OS call, we might as well keep going. */
-
-       REPORT_WARNING (("An AML \"fatal\" Opcode (Fatal_op) was executed\n"));
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_index
- *
- * PARAMETERS:  none
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Index operator
- *
- * ALLOCATION:  Deletes one operand descriptor -- other remains on stack
- *
- *  ACPI SPECIFICATION REFERENCES:
- *  Def_index   :=  Index_op Buff_pkg_obj Index_value Result
- *  Index_value :=  Term_arg=>Integer
- *  Name_string :=  <Root_char Name_path> | <Prefix_path Name_path>
- *  Result      :=  Super_name
- *  Super_name  :=  Name_string | Arg_obj | Local_obj | Debug_obj | Def_index
- *                             Local4_op | Local5_op | Local6_op | Local7_op
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_index (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *idx_desc;
-       ACPI_OPERAND_OBJECT     *res_desc;
-       ACPI_OPERAND_OBJECT     *ret_desc = NULL;
-       ACPI_OPERAND_OBJECT     *tmp_desc;
-       ACPI_STATUS             status;
-
-
-       /* Resolve operands */
-       /* First operand can be either a package or a buffer */
-
-       status = acpi_aml_resolve_operands (AML_INDEX_OP, WALK_OPERANDS, walk_state);
-       /* Get all operands */
-
-       status |= acpi_ds_obj_stack_pop_object (&res_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&idx_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               /* Invalid parameters on object stack  */
-
-               goto cleanup;
-       }
-
-
-       /* Create the internal return object */
-
-       ret_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_REFERENCE);
-       if (!ret_desc) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-
-       /*
-        * At this point, the Obj_desc operand is either a Package or a Buffer
-        */
-
-       if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
-               /* Object to be indexed is a Package */
-
-               if (idx_desc->integer.value >= obj_desc->package.count) {
-                       status = AE_AML_PACKAGE_LIMIT;
-                       goto cleanup;
-               }
-
-               if ((res_desc->common.type == INTERNAL_TYPE_REFERENCE) &&
-                       (res_desc->reference.opcode == AML_ZERO_OP)) {
-                       /*
-                        * There is no actual result descriptor (the Zero_op Result
-                        * descriptor is a placeholder), so just delete the placeholder and
-                        * return a reference to the package element
-                        */
-
-                       acpi_cm_remove_reference (res_desc);
-               }
-
-               else {
-                       /*
-                        * Each element of the package is an internal object.  Get the one
-                        * we are after.
-                        */
-
-                       tmp_desc                      = obj_desc->package.elements[idx_desc->integer.value];
-                       ret_desc->reference.opcode    = AML_INDEX_OP;
-                       ret_desc->reference.target_type = tmp_desc->common.type;
-                       ret_desc->reference.object    = tmp_desc;
-
-                       status = acpi_aml_exec_store (ret_desc, res_desc, walk_state);
-                       ret_desc->reference.object    = NULL;
-               }
-
-               /*
-                * The local return object must always be a reference to the package element,
-                * not the element itself.
-                */
-               ret_desc->reference.opcode    = AML_INDEX_OP;
-               ret_desc->reference.target_type = ACPI_TYPE_PACKAGE;
-               ret_desc->reference.where     = &obj_desc->package.elements[idx_desc->integer.value];
-       }
-
-       else {
-               /* Object to be indexed is a Buffer */
-
-               if (idx_desc->integer.value >= obj_desc->buffer.length) {
-                       status = AE_AML_BUFFER_LIMIT;
-                       goto cleanup;
-               }
-
-               ret_desc->reference.opcode      = AML_INDEX_OP;
-               ret_desc->reference.target_type = ACPI_TYPE_BUFFER_FIELD;
-               ret_desc->reference.object      = obj_desc;
-               ret_desc->reference.offset      = (u32) idx_desc->integer.value;
-
-               status = acpi_aml_exec_store (ret_desc, res_desc, walk_state);
-       }
-
-
-cleanup:
-
-       /* Always delete operands */
-
-       acpi_cm_remove_reference (obj_desc);
-       acpi_cm_remove_reference (idx_desc);
-
-       /* Delete return object on error */
-
-       if (ACPI_FAILURE (status)) {
-               acpi_cm_remove_reference (res_desc);
-
-               if (ret_desc) {
-                       acpi_cm_remove_reference (ret_desc);
-                       ret_desc = NULL;
-               }
-       }
-
-       /* Set the return object and exit */
-
-       *return_desc = ret_desc;
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_match
- *
- * PARAMETERS:  none
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Match operator
- *
- * ACPI SPECIFICATION REFERENCES:
- *  Def_match   :=  Match_op Search_pkg Opcode1     Operand1
- *                              Opcode2 Operand2    Start_index
- *  Opcode1     :=  Byte_data: MTR, MEQ, MLE, MLT, MGE, or MGT
- *  Opcode2     :=  Byte_data: MTR, MEQ, MLE, MLT, MGE, or MGT
- *  Operand1    :=  Term_arg=>Integer
- *  Operand2    :=  Term_arg=>Integer
- *  Search_pkg  :=  Term_arg=>Package_object
- *  Start_index :=  Term_arg=>Integer
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_match (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc)
-{
-       ACPI_OPERAND_OBJECT     *pkg_desc;
-       ACPI_OPERAND_OBJECT     *op1_desc;
-       ACPI_OPERAND_OBJECT     *V1_desc;
-       ACPI_OPERAND_OBJECT     *op2_desc;
-       ACPI_OPERAND_OBJECT     *V2_desc;
-       ACPI_OPERAND_OBJECT     *start_desc;
-       ACPI_OPERAND_OBJECT     *ret_desc = NULL;
-       ACPI_STATUS             status;
-       u32                     index;
-       u32                     match_value = (u32) -1;
-
-
-       /* Resolve all operands */
-
-       status = acpi_aml_resolve_operands (AML_MATCH_OP, WALK_OPERANDS, walk_state);
-       /* Get all operands */
-
-       status |= acpi_ds_obj_stack_pop_object (&start_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&V2_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&op2_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&V1_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&op1_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&pkg_desc, walk_state);
-
-       if (ACPI_FAILURE (status)) {
-               /* Invalid parameters on object stack  */
-
-               goto cleanup;
-       }
-
-       /* Validate match comparison sub-opcodes */
-
-       if ((op1_desc->integer.value > MAX_MATCH_OPERATOR) ||
-               (op2_desc->integer.value > MAX_MATCH_OPERATOR)) {
-               status = AE_AML_OPERAND_VALUE;
-               goto cleanup;
-       }
-
-       index = (u32) start_desc->integer.value;
-       if (index >= (u32) pkg_desc->package.count) {
-               status = AE_AML_PACKAGE_LIMIT;
-               goto cleanup;
-       }
-
-       ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-       if (!ret_desc) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-
-       }
-
-       /*
-        * Examine each element until a match is found.  Within the loop,
-        * "continue" signifies that the current element does not match
-        * and the next should be examined.
-        * Upon finding a match, the loop will terminate via "break" at
-        * the bottom.  If it terminates "normally", Match_value will be -1
-        * (its initial value) indicating that no match was found.  When
-        * returned as a Number, this will produce the Ones value as specified.
-        */
-
-       for ( ; index < pkg_desc->package.count; ++index) {
-               /*
-                * Treat any NULL or non-numeric elements as non-matching.
-                * TBD [Unhandled] - if an element is a Name,
-                *      should we examine its value?
-                */
-               if (!pkg_desc->package.elements[index] ||
-                       ACPI_TYPE_INTEGER != pkg_desc->package.elements[index]->common.type) {
-                       continue;
-               }
-
-               /*
-                * Within these switch statements:
-                *      "break" (exit from the switch) signifies a match;
-                *      "continue" (proceed to next iteration of enclosing
-                *          "for" loop) signifies a non-match.
-                */
-               switch (op1_desc->integer.value) {
-
-               case MATCH_MTR:   /* always true */
-
-                       break;
-
-
-               case MATCH_MEQ:   /* true if equal   */
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                != V1_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               case MATCH_MLE:   /* true if less than or equal  */
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                > V1_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               case MATCH_MLT:   /* true if less than   */
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                >= V1_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               case MATCH_MGE:   /* true if greater than or equal   */
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                < V1_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               case MATCH_MGT:   /* true if greater than    */
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                <= V1_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               default:    /* undefined   */
-
-                       continue;
-               }
-
-
-               switch(op2_desc->integer.value) {
-
-               case MATCH_MTR:
-
-                       break;
-
-
-               case MATCH_MEQ:
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                != V2_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               case MATCH_MLE:
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                > V2_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               case MATCH_MLT:
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                >= V2_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               case MATCH_MGE:
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                < V2_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               case MATCH_MGT:
-
-                       if (pkg_desc->package.elements[index]->integer.value
-                                <= V2_desc->integer.value) {
-                               continue;
-                       }
-                       break;
-
-
-               default:
-
-                       continue;
-               }
-
-               /* Match found: exit from loop */
-
-               match_value = index;
-               break;
-       }
-
-       /* Match_value is the return value */
-
-       ret_desc->integer.value = match_value;
-
-
-cleanup:
-
-       /* Free the operands */
-
-       acpi_cm_remove_reference (start_desc);
-       acpi_cm_remove_reference (V2_desc);
-       acpi_cm_remove_reference (op2_desc);
-       acpi_cm_remove_reference (V1_desc);
-       acpi_cm_remove_reference (op1_desc);
-       acpi_cm_remove_reference (pkg_desc);
-
-
-       /* Delete return object on error */
-
-       if (ACPI_FAILURE (status) &&
-               (ret_desc)) {
-               acpi_cm_remove_reference (ret_desc);
-               ret_desc = NULL;
-       }
-
-
-       /* Set the return object and exit */
-
-       *return_desc = ret_desc;
-       return (status);
-}
diff --git a/reactos/drivers/bus/acpi/executer/ammonad.c b/reactos/drivers/bus/acpi/executer/ammonad.c
deleted file mode 100644 (file)
index e37e27d..0000000
+++ /dev/null
@@ -1,957 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: ammonad - ACPI AML (p-code) execution for monadic operators
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("ammonad")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_get_object_reference
- *
- * PARAMETERS:  Obj_desc        - Create a reference to this object
- *              Ret_desc        - Where to store the reference
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Obtain and return a "reference" to the target object
- *              Common code for the Ref_of_op and the Cond_ref_of_op.
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_aml_get_object_reference (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_OPERAND_OBJECT     **ret_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) {
-               if (obj_desc->common.type != INTERNAL_TYPE_REFERENCE) {
-                       *ret_desc = NULL;
-                       status = AE_TYPE;
-                       goto cleanup;
-               }
-
-               /*
-                * Not a Name -- an indirect name pointer would have
-                * been converted to a direct name pointer in Acpi_aml_resolve_operands
-                */
-               switch (obj_desc->reference.opcode) {
-               case AML_LOCAL_OP:
-               case AML_ARG_OP:
-
-                       *ret_desc = (void *) acpi_ds_method_data_get_node (obj_desc->reference.opcode,
-                                         obj_desc->reference.offset, walk_state);
-                       break;
-
-               default:
-
-                       *ret_desc = NULL;
-                       status = AE_AML_INTERNAL;
-                       goto cleanup;
-               }
-
-       }
-
-       else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) {
-               /* Must be a named object;  Just return the Node */
-
-               *ret_desc = obj_desc;
-       }
-
-       else {
-               *ret_desc = NULL;
-               status = AE_TYPE;
-       }
-
-
-cleanup:
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_monadic1
- *
- * PARAMETERS:  Opcode              - The opcode to be executed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Type 1 monadic operator with numeric operand on
- *              object stack
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_monadic1 (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status;
-
-
-       /* Resolve all operands */
-
-       status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state);
-       /* Get all operands */
-
-       status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-
-       /* Examine the opcode */
-
-       switch (opcode) {
-
-       /*  Def_release :=  Release_op  Mutex_object */
-
-       case AML_RELEASE_OP:
-
-               status = acpi_aml_release_mutex (obj_desc, walk_state);
-               break;
-
-
-       /*  Def_reset   :=  Reset_op    Acpi_event_object */
-
-       case AML_RESET_OP:
-
-               status = acpi_aml_system_reset_event (obj_desc);
-               break;
-
-
-       /*  Def_signal  :=  Signal_op   Acpi_event_object */
-
-       case AML_SIGNAL_OP:
-
-               status = acpi_aml_system_signal_event (obj_desc);
-               break;
-
-
-       /*  Def_sleep   :=  Sleep_op    Msec_time   */
-
-       case AML_SLEEP_OP:
-
-               acpi_aml_system_do_suspend ((u32) obj_desc->integer.value);
-               break;
-
-
-       /*  Def_stall   :=  Stall_op    Usec_time   */
-
-       case AML_STALL_OP:
-
-               acpi_aml_system_do_stall ((u32) obj_desc->integer.value);
-               break;
-
-
-       /*  Unknown opcode  */
-
-       default:
-
-               REPORT_ERROR (("Acpi_aml_exec_monadic1: Unknown monadic opcode %X\n",
-                       opcode));
-               status = AE_AML_BAD_OPCODE;
-               break;
-
-       } /* switch */
-
-
-cleanup:
-
-       /* Always delete the operand */
-
-       acpi_cm_remove_reference (obj_desc);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_monadic2_r
- *
- * PARAMETERS:  Opcode              - The opcode to be executed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Type 2 monadic operator with numeric operand and
- *              result operand on operand stack
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_monadic2_r (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *res_desc;
-       ACPI_OPERAND_OBJECT     *ret_desc = NULL;
-       ACPI_OPERAND_OBJECT     *ret_desc2 = NULL;
-       u32                     res_val;
-       ACPI_STATUS             status;
-       u32                     i;
-       u32                     j;
-       ACPI_INTEGER            digit;
-
-
-       /* Resolve all operands */
-
-       status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state);
-       /* Get all operands */
-
-       status |= acpi_ds_obj_stack_pop_object (&res_desc, walk_state);
-       status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-
-       /* Create a return object of type NUMBER for most opcodes */
-
-       switch (opcode) {
-       case AML_BIT_NOT_OP:
-       case AML_FIND_SET_LEFT_BIT_OP:
-       case AML_FIND_SET_RIGHT_BIT_OP:
-       case AML_FROM_BCD_OP:
-       case AML_TO_BCD_OP:
-       case AML_COND_REF_OF_OP:
-
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-               if (!ret_desc) {
-                       status = AE_NO_MEMORY;
-                       goto cleanup;
-               }
-
-               break;
-       }
-
-
-       switch (opcode) {
-       /*  Def_not :=  Not_op  Operand Result  */
-
-       case AML_BIT_NOT_OP:
-
-               ret_desc->integer.value = ~obj_desc->integer.value;
-               break;
-
-
-       /*  Def_find_set_left_bit := Find_set_left_bit_op Operand Result */
-
-       case AML_FIND_SET_LEFT_BIT_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value;
-
-               /*
-                * Acpi specification describes Integer type as a little
-                * endian unsigned value, so this boundry condition is valid.
-                */
-               for (res_val = 0; ret_desc->integer.value && res_val < ACPI_INTEGER_BIT_SIZE; ++res_val) {
-                       ret_desc->integer.value >>= 1;
-               }
-
-               ret_desc->integer.value = res_val;
-               break;
-
-
-       /*  Def_find_set_right_bit := Find_set_right_bit_op Operand Result */
-
-       case AML_FIND_SET_RIGHT_BIT_OP:
-
-               ret_desc->integer.value = obj_desc->integer.value;
-
-               /*
-                * Acpi specification describes Integer type as a little
-                * endian unsigned value, so this boundry condition is valid.
-                */
-               for (res_val = 0; ret_desc->integer.value && res_val < ACPI_INTEGER_BIT_SIZE; ++res_val) {
-                       ret_desc->integer.value <<= 1;
-               }
-
-               /* Since returns must be 1-based, subtract from 33 (65) */
-
-               ret_desc->integer.value = res_val == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - res_val;
-               break;
-
-
-       /*  Def_from_bDC := From_bCDOp  BCDValue    Result  */
-
-       case AML_FROM_BCD_OP:
-
-               /*
-                * The 64-bit ACPI integer can hold 16 4-bit BCD integers
-                */
-               ret_desc->integer.value = 0;
-               for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) {
-                       /* Get one BCD digit */
-
-                       digit = (ACPI_INTEGER) ((obj_desc->integer.value >> (i * 4)) & 0xF);
-
-                       /* Check the range of the digit */
-
-                       if (digit > 9) {
-                               status = AE_AML_NUMERIC_OVERFLOW;
-                               goto cleanup;
-                       }
-
-                       if (digit > 0) {
-                               /* Sum into the result with the appropriate power of 10 */
-
-                               for (j = 0; j < i; j++) {
-                                       digit *= 10;
-                               }
-
-                               ret_desc->integer.value += digit;
-                       }
-               }
-               break;
-
-
-       /*  Def_to_bDC  :=  To_bCDOp Operand Result */
-
-       case AML_TO_BCD_OP:
-
-
-               if (obj_desc->integer.value > ACPI_MAX_BCD_VALUE) {
-                       status = AE_AML_NUMERIC_OVERFLOW;
-                       goto cleanup;
-               }
-
-               ret_desc->integer.value = 0;
-               for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) {
-                       /* Divide by nth factor of 10 */
-
-                       digit = obj_desc->integer.value;
-                       for (j = 0; j < i; j++) {
-                               digit /= 10;
-                       }
-
-                       /* Create the BCD digit */
-
-                       if (digit > 0) {
-                               ret_desc->integer.value += (ACPI_MODULO (digit, 10) << (i * 4));
-                       }
-               }
-               break;
-
-
-       /*  Def_cond_ref_of     :=  Cond_ref_of_op  Source_object   Result  */
-
-       case AML_COND_REF_OF_OP:
-
-               /*
-                * This op is a little strange because the internal return value is
-                * different than the return value stored in the result descriptor
-                * (There are really two return values)
-                */
-
-               if ((ACPI_NAMESPACE_NODE *) obj_desc == acpi_gbl_root_node) {
-                       /*
-                        * This means that the object does not exist in the namespace,
-                        * return FALSE
-                        */
-
-                       ret_desc->integer.value = 0;
-
-                       /*
-                        * Must delete the result descriptor since there is no reference
-                        * being returned
-                        */
-
-                       acpi_cm_remove_reference (res_desc);
-                       goto cleanup;
-               }
-
-               /* Get the object reference and store it */
-
-               status = acpi_aml_get_object_reference (obj_desc, &ret_desc2, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               status = acpi_aml_exec_store (ret_desc2, res_desc, walk_state);
-
-               /* The object exists in the namespace, return TRUE */
-
-               ret_desc->integer.value = ACPI_INTEGER_MAX;
-               goto cleanup;
-               break;
-
-
-       case AML_STORE_OP:
-
-               /*
-                * A store operand is typically a number, string, buffer or lvalue
-                * TBD: [Unhandled] What about a store to a package?
-                */
-
-               /*
-                * Do the store, and be careful about deleting the source object,
-                * since the object itself may have been stored.
-                */
-
-               status = acpi_aml_exec_store (obj_desc, res_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       /* On failure, just delete the Obj_desc */
-
-                       acpi_cm_remove_reference (obj_desc);
-               }
-
-               else {
-                       /*
-                        * Normally, we would remove a reference on the Obj_desc parameter;
-                        * But since it is being used as the internal return object
-                        * (meaning we would normally increment it), the two cancel out,
-                        * and we simply don't do anything.
-                        */
-                       *return_desc = obj_desc;
-               }
-
-               obj_desc = NULL;
-               return (status);
-
-               break;
-
-
-       case AML_DEBUG_OP:
-
-               /* Reference, returning an Reference */
-
-               return (AE_OK);
-               break;
-
-
-       /*
-        * These are obsolete opcodes
-        */
-
-       /*  Def_shift_left_bit  :=  Shift_left_bit_op   Source          Bit_num */
-       /*  Def_shift_right_bit :=  Shift_right_bit_op  Source          Bit_num */
-
-       case AML_SHIFT_LEFT_BIT_OP:
-       case AML_SHIFT_RIGHT_BIT_OP:
-
-               status = AE_SUPPORT;
-               goto cleanup;
-               break;
-
-
-       default:
-
-               REPORT_ERROR (("Acpi_aml_exec_monadic2_r: Unknown monadic opcode %X\n",
-                       opcode));
-               status = AE_AML_BAD_OPCODE;
-               goto cleanup;
-       }
-
-
-       status = acpi_aml_exec_store (ret_desc, res_desc, walk_state);
-
-
-cleanup:
-       /* Always delete the operand object */
-
-       acpi_cm_remove_reference (obj_desc);
-
-       /* Delete return object(s) on error */
-
-       if (ACPI_FAILURE (status)) {
-               acpi_cm_remove_reference (res_desc); /* Result descriptor */
-               if (ret_desc) {
-                       acpi_cm_remove_reference (ret_desc);
-                       ret_desc = NULL;
-               }
-       }
-
-       /* Set the return object and exit */
-
-       *return_desc = ret_desc;
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_monadic2
- *
- * PARAMETERS:  Opcode              - The opcode to be executed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute Type 2 monadic operator with numeric operand:
- *              Deref_of_op, Ref_of_op, Size_of_op, Type_op, Increment_op,
- *              Decrement_op, LNot_op,
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_monadic2 (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *tmp_desc;
-       ACPI_OPERAND_OBJECT     *ret_desc = NULL;
-       ACPI_STATUS             resolve_status;
-       ACPI_STATUS             status;
-       u32                     type;
-       ACPI_INTEGER            value;
-
-
-       /* Attempt to resolve the operands */
-
-       resolve_status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state);
-       /* Always get all operands */
-
-       status = acpi_ds_obj_stack_pop_object (&obj_desc, walk_state);
-
-
-       /* Now we can check the status codes */
-
-       if (ACPI_FAILURE (resolve_status)) {
-               goto cleanup;
-       }
-
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-
-       /* Get the operand and decode the opcode */
-
-
-       switch (opcode) {
-
-       /*  Def_lNot := LNot_op Operand */
-
-       case AML_LNOT_OP:
-
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-               if (!ret_desc) {
-                       status = AE_NO_MEMORY;
-                       goto cleanup;
-               }
-
-               ret_desc->integer.value = !obj_desc->integer.value;
-               break;
-
-
-       /*  Def_decrement   :=  Decrement_op Target */
-       /*  Def_increment   :=  Increment_op Target */
-
-       case AML_DECREMENT_OP:
-       case AML_INCREMENT_OP:
-
-               /*
-                * Since we are expecting an Reference on the top of the stack, it
-                * can be either an Node or an internal object.
-                *
-                * TBD: [Future] This may be the prototype code for all cases where
-                * an Reference is expected!! 10/99
-                */
-
-               if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) {
-                       ret_desc = obj_desc;
-               }
-
-               else {
-                       /*
-                        * Duplicate the Reference in a new object so that we can resolve it
-                        * without destroying the original Reference object
-                        */
-
-                       ret_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_REFERENCE);
-                       if (!ret_desc) {
-                               status = AE_NO_MEMORY;
-                               goto cleanup;
-                       }
-
-                       ret_desc->reference.opcode = obj_desc->reference.opcode;
-                       ret_desc->reference.offset = obj_desc->reference.offset;
-                       ret_desc->reference.object = obj_desc->reference.object;
-               }
-
-
-               /*
-                * Convert the Ret_desc Reference to a Number
-                * (This deletes the original Ret_desc)
-                */
-
-               status = acpi_aml_resolve_operands (AML_LNOT_OP, &ret_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-
-               /* Do the actual increment or decrement */
-
-               if (AML_INCREMENT_OP == opcode) {
-                       ret_desc->integer.value++;
-               }
-               else {
-                       ret_desc->integer.value--;
-               }
-
-               /* Store the result back in the original descriptor */
-
-               status = acpi_aml_exec_store (ret_desc, obj_desc, walk_state);
-
-               /* Objdesc was just deleted (because it is an Reference) */
-
-               obj_desc = NULL;
-
-               break;
-
-
-       /*  Def_object_type :=  Object_type_op  Source_object   */
-
-       case AML_TYPE_OP:
-
-               if (INTERNAL_TYPE_REFERENCE == obj_desc->common.type) {
-                       /*
-                        * Not a Name -- an indirect name pointer would have
-                        * been converted to a direct name pointer in Resolve_operands
-                        */
-                       switch (obj_desc->reference.opcode) {
-                       case AML_ZERO_OP:
-                       case AML_ONE_OP:
-                       case AML_ONES_OP:
-
-                               /* Constants are of type Number */
-
-                               type = ACPI_TYPE_INTEGER;
-                               break;
-
-
-                       case AML_DEBUG_OP:
-
-                               /* Per 1.0b spec, Debug object is of type Debug_object */
-
-                               type = ACPI_TYPE_DEBUG_OBJECT;
-                               break;
-
-
-                       case AML_INDEX_OP:
-
-                               /* Get the type of this reference (index into another object) */
-
-                               type = obj_desc->reference.target_type;
-                               if (type == ACPI_TYPE_PACKAGE) {
-                                       /*
-                                        * The main object is a package, we want to get the type
-                                        * of the individual package element that is referenced by
-                                        * the index.
-                                        */
-                                       type = (*(obj_desc->reference.where))->common.type;
-                               }
-
-                               break;
-
-
-                       case AML_LOCAL_OP:
-                       case AML_ARG_OP:
-
-                               type = acpi_ds_method_data_get_type (obj_desc->reference.opcode,
-                                                 obj_desc->reference.offset, walk_state);
-                               break;
-
-
-                       default:
-
-                               REPORT_ERROR (("Acpi_aml_exec_monadic2/Type_op: Internal error - Unknown Reference subtype %X\n",
-                                       obj_desc->reference.opcode));
-                               status = AE_AML_INTERNAL;
-                               goto cleanup;
-                       }
-               }
-
-               else {
-                       /*
-                        * It's not a Reference, so it must be a direct name pointer.
-                        */
-                       type = acpi_ns_get_type ((ACPI_HANDLE) obj_desc);
-               }
-
-               /* Allocate a descriptor to hold the type. */
-
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-               if (!ret_desc) {
-                       status = AE_NO_MEMORY;
-                       goto cleanup;
-               }
-
-               ret_desc->integer.value = type;
-               break;
-
-
-       /*  Def_size_of :=  Size_of_op  Source_object   */
-
-       case AML_SIZE_OF_OP:
-
-               if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) {
-                       obj_desc = acpi_ns_get_attached_object (obj_desc);
-               }
-
-               if (!obj_desc) {
-                       value = 0;
-               }
-
-               else {
-                       switch (obj_desc->common.type) {
-
-                       case ACPI_TYPE_BUFFER:
-
-                               value = obj_desc->buffer.length;
-                               break;
-
-
-                       case ACPI_TYPE_STRING:
-
-                               value = obj_desc->string.length;
-                               break;
-
-
-                       case ACPI_TYPE_PACKAGE:
-
-                               value = obj_desc->package.count;
-                               break;
-
-                       case INTERNAL_TYPE_REFERENCE:
-
-                               value = 4;
-                               break;
-
-                       default:
-
-                               status = AE_AML_OPERAND_TYPE;
-                               goto cleanup;
-                       }
-               }
-
-               /*
-                * Now that we have the size of the object, create a result
-                * object to hold the value
-                */
-
-               ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-               if (!ret_desc) {
-                       status = AE_NO_MEMORY;
-                       goto cleanup;
-               }
-
-               ret_desc->integer.value = value;
-               break;
-
-
-       /*  Def_ref_of  :=  Ref_of_op   Source_object   */
-
-       case AML_REF_OF_OP:
-
-               status = acpi_aml_get_object_reference (obj_desc, &ret_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       goto cleanup;
-               }
-               break;
-
-
-       /*  Def_deref_of := Deref_of_op Obj_reference   */
-
-       case AML_DEREF_OF_OP:
-
-
-               /* Check for a method local or argument */
-
-               if (!VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) {
-                       /*
-                        * Must resolve/dereference the local/arg reference first
-                        */
-                       switch (obj_desc->reference.opcode) {
-                       /* Set Obj_desc to the value of the local/arg */
-
-                       case AML_LOCAL_OP:
-                       case AML_ARG_OP:
-
-                               acpi_ds_method_data_get_value (obj_desc->reference.opcode,
-                                               obj_desc->reference.offset, walk_state, &tmp_desc);
-
-                               /*
-                                * Delete our reference to the input object and
-                                * point to the object just retrieved
-                                */
-                               acpi_cm_remove_reference (obj_desc);
-                               obj_desc = tmp_desc;
-                               break;
-
-                       default:
-
-                               /* Index op - handled below */
-                               break;
-                       }
-               }
-
-
-               /* Obj_desc may have changed from the code above */
-
-               if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) {
-                       /* Get the actual object from the Node (This is the dereference) */
-
-                       ret_desc = ((ACPI_NAMESPACE_NODE *) obj_desc)->object;
-
-                       /* Returning a pointer to the object, add another reference! */
-
-                       acpi_cm_add_reference (ret_desc);
-               }
-
-               else {
-                       /*
-                        * This must be a reference object produced by the Index
-                        * ASL operation -- check internal opcode
-                        */
-
-                       if ((obj_desc->reference.opcode != AML_INDEX_OP) &&
-                               (obj_desc->reference.opcode != AML_REF_OF_OP)) {
-                               status = AE_TYPE;
-                               goto cleanup;
-                       }
-
-
-                       switch (obj_desc->reference.opcode) {
-                       case AML_INDEX_OP:
-
-                               /*
-                                * Supported target types for the Index operator are
-                                * 1) A Buffer
-                                * 2) A Package
-                                */
-
-                               if (obj_desc->reference.target_type == ACPI_TYPE_BUFFER_FIELD) {
-                                       /*
-                                        * The target is a buffer, we must create a new object that
-                                        * contains one element of the buffer, the element pointed
-                                        * to by the index.
-                                        *
-                                        * NOTE: index into a buffer is NOT a pointer to a
-                                        * sub-buffer of the main buffer, it is only a pointer to a
-                                        * single element (byte) of the buffer!
-                                        */
-                                       ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-                                       if (!ret_desc) {
-                                               status = AE_NO_MEMORY;
-                                               goto cleanup;
-                                       }
-
-                                       tmp_desc = obj_desc->reference.object;
-                                       ret_desc->integer.value =
-                                               tmp_desc->buffer.pointer[obj_desc->reference.offset];
-
-                                       /* TBD: [Investigate] (see below) Don't add an additional
-                                        * ref!
-                                        */
-                               }
-
-                               else if (obj_desc->reference.target_type == ACPI_TYPE_PACKAGE) {
-                                       /*
-                                        * The target is a package, we want to return the referenced
-                                        * element of the package.  We must add another reference to
-                                        * this object, however.
-                                        */
-
-                                       ret_desc = *(obj_desc->reference.where);
-                                       if (!ret_desc) {
-                                               /*
-                                                * We can't return a NULL dereferenced value.  This is
-                                                * an uninitialized package element and is thus a
-                                                * severe error.
-                                                */
-
-                                               status = AE_AML_UNINITIALIZED_ELEMENT;
-                                               goto cleanup;
-                                       }
-
-                                       acpi_cm_add_reference (ret_desc);
-                               }
-
-                               else {
-                                       status = AE_AML_OPERAND_TYPE;
-                                       goto cleanup;
-                               }
-
-                               break;
-
-
-                       case AML_REF_OF_OP:
-
-                               ret_desc = obj_desc->reference.object;
-
-                               /* Add another reference to the object! */
-
-                               acpi_cm_add_reference (ret_desc);
-                               break;
-                       }
-               }
-
-               break;
-
-
-       default:
-
-               REPORT_ERROR (("Acpi_aml_exec_monadic2: Unknown monadic opcode %X\n",
-                       opcode));
-               status = AE_AML_BAD_OPCODE;
-               goto cleanup;
-       }
-
-
-cleanup:
-
-       if (obj_desc) {
-               acpi_cm_remove_reference (obj_desc);
-       }
-
-       /* Delete return object on error */
-
-       if (ACPI_FAILURE (status) &&
-               (ret_desc)) {
-               acpi_cm_remove_reference (ret_desc);
-               ret_desc = NULL;
-       }
-
-       *return_desc = ret_desc;
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/executer/ammutex.c b/reactos/drivers/bus/acpi/executer/ammutex.c
deleted file mode 100644 (file)
index 2a40910..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: ammutex - ASL Mutex Acquire/Release functions
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("ammutex")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_unlink_mutex
- *
- * PARAMETERS:  *Obj_desc           - The mutex to be unlinked
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Remove a mutex from the "Acquired_mutex" list
- *
- ******************************************************************************/
-
-void
-acpi_aml_unlink_mutex (
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-
-       if (obj_desc->mutex.next) {
-               (obj_desc->mutex.next)->mutex.prev = obj_desc->mutex.prev;
-       }
-       if (obj_desc->mutex.prev) {
-               (obj_desc->mutex.prev)->mutex.next = obj_desc->mutex.next;
-       }
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_link_mutex
- *
- * PARAMETERS:  *Obj_desc           - The mutex to be linked
- *              *List_head          - head of the "Acquired_mutex" list
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Add a mutex to the "Acquired_mutex" list for this walk
- *
- ******************************************************************************/
-
-static void
-acpi_aml_link_mutex (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_OPERAND_OBJECT     *list_head)
-{
-
-       /* This object will be the first object in the list */
-
-       obj_desc->mutex.prev = list_head;
-       obj_desc->mutex.next = list_head->mutex.next;
-
-       /* Update old first object to point back to this object */
-
-       if (list_head->mutex.next) {
-               (list_head->mutex.next)->mutex.prev = obj_desc;
-       }
-
-       /* Update list head */
-
-       list_head->mutex.next = obj_desc;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_acquire_mutex
- *
- * PARAMETERS:  *Time_desc          - The 'time to delay' object descriptor
- *              *Obj_desc           - The object descriptor for this op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Acquire an AML mutex
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_acquire_mutex (
-       ACPI_OPERAND_OBJECT     *time_desc,
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-
-
-       if (!obj_desc) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Current Sync must be less than or equal to the sync level of the
-        * mutex.  This mechanism provides some deadlock prevention
-        */
-       if (walk_state->current_sync_level > obj_desc->mutex.sync_level) {
-               return (AE_AML_MUTEX_ORDER);
-       }
-
-       /*
-        * If the mutex is already owned by this thread,
-        * just increment the acquisition depth
-        */
-       if (obj_desc->mutex.owner == walk_state) {
-               obj_desc->mutex.acquisition_depth++;
-               return (AE_OK);
-       }
-
-       /* Acquire the mutex, wait if necessary */
-
-       status = acpi_aml_system_acquire_mutex (time_desc, obj_desc);
-       if (ACPI_FAILURE (status)) {
-               /* Includes failure from a timeout on Time_desc */
-
-               return (status);
-       }
-
-       /* Have the mutex, update mutex and walk info */
-
-       obj_desc->mutex.owner = walk_state;
-       obj_desc->mutex.acquisition_depth = 1;
-       walk_state->current_sync_level = obj_desc->mutex.sync_level;
-
-       /* Link the mutex to the walk state for force-unlock at method exit */
-
-       acpi_aml_link_mutex (obj_desc, (ACPI_OPERAND_OBJECT *)
-                        &(walk_state->walk_list->acquired_mutex_list));
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_release_mutex
- *
- * PARAMETERS:  *Obj_desc           - The object descriptor for this op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Release a previously acquired Mutex.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_release_mutex (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status;
-
-
-       if (!obj_desc) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*  The mutex must have been previously acquired in order to release it */
-
-       if (!obj_desc->mutex.owner) {
-               return (AE_AML_MUTEX_NOT_ACQUIRED);
-       }
-
-       /* The Mutex is owned, but this thread must be the owner */
-
-       if (obj_desc->mutex.owner != walk_state) {
-               return (AE_AML_NOT_OWNER);
-       }
-
-       /*
-        * The sync level of the mutex must be less than or
-        * equal to the current sync level
-        */
-       if (obj_desc->mutex.sync_level > walk_state->current_sync_level) {
-               return (AE_AML_MUTEX_ORDER);
-       }
-
-       /*
-        * Match multiple Acquires with multiple Releases
-        */
-       obj_desc->mutex.acquisition_depth--;
-       if (obj_desc->mutex.acquisition_depth != 0) {
-               /* Just decrement the depth and return */
-
-               return (AE_OK);
-       }
-
-
-       /* Release the mutex */
-
-       status = acpi_aml_system_release_mutex (obj_desc);
-
-       /* Update the mutex and walk state */
-
-       obj_desc->mutex.owner = NULL;
-       walk_state->current_sync_level = obj_desc->mutex.sync_level;
-
-       /* Unlink the mutex from the owner's list */
-
-       acpi_aml_unlink_mutex (obj_desc);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_release_all_mutexes
- *
- * PARAMETERS:  *Mutex_list           - Head of the mutex list
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Release all mutexes in the list
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_release_all_mutexes (
-       ACPI_OPERAND_OBJECT     *list_head)
-{
-       ACPI_OPERAND_OBJECT     *next = list_head->mutex.next;
-       ACPI_OPERAND_OBJECT     *this;
-
-
-       /*
-        * Traverse the list of owned mutexes, releasing each one.
-        */
-       while (next) {
-               this = next;
-               next = this->mutex.next;
-
-               /* Mark mutex un-owned */
-
-               this->mutex.owner = NULL;
-               this->mutex.prev = NULL;
-               this->mutex.next = NULL;
-               this->mutex.acquisition_depth = 0;
-
-                /* Release the mutex */
-
-               acpi_aml_system_release_mutex (this);
-       }
-
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amnames.c b/reactos/drivers/bus/acpi/executer/amnames.c
deleted file mode 100644 (file)
index 269631f..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amnames - interpreter/scanner name load/execute
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amnames")
-
-
-/* AML Package Length encodings */
-
-#define ACPI_AML_PACKAGE_TYPE1   0x40
-#define ACPI_AML_PACKAGE_TYPE2   0x4000
-#define ACPI_AML_PACKAGE_TYPE3   0x400000
-#define ACPI_AML_PACKAGE_TYPE4   0x40000000
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_allocate_name_string
- *
- * PARAMETERS:  Prefix_count        - Count of parent levels. Special cases:
- *                                    (-1) = root,  0 = none
- *              Num_name_segs       - count of 4-character name segments
- *
- * RETURN:      A pointer to the allocated string segment.  This segment must
- *              be deleted by the caller.
- *
- * DESCRIPTION: Allocate a buffer for a name string. Ensure allocated name
- *              string is long enough, and set up prefix if any.
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_aml_allocate_name_string (
-       u32                     prefix_count,
-       u32                     num_name_segs)
-{
-       NATIVE_CHAR             *temp_ptr;
-       NATIVE_CHAR             *name_string;
-       u32                      size_needed;
-
-
-       /*
-        * Allow room for all \ and ^ prefixes, all segments, and a Multi_name_prefix.
-        * Also, one byte for the null terminator.
-        * This may actually be somewhat longer than needed.
-        */
-
-       if (prefix_count == (u32) -1) {
-               /* Special case for root */
-
-               size_needed = 1 + (ACPI_NAME_SIZE * num_name_segs) + 2 + 1;
-       }
-       else {
-               size_needed = prefix_count + (ACPI_NAME_SIZE * num_name_segs) + 2 + 1;
-       }
-
-       /*
-        * Allocate a buffer for the name.
-        * This buffer must be deleted by the caller!
-        */
-
-       name_string = acpi_cm_allocate (size_needed);
-       if (!name_string) {
-               REPORT_ERROR (("Aml_allocate_name_string: name allocation failure\n"));
-               return (NULL);
-       }
-
-       temp_ptr = name_string;
-
-       /* Set up Root or Parent prefixes if needed */
-
-       if (prefix_count == (u32) -1) {
-               *temp_ptr++ = AML_ROOT_PREFIX;
-       }
-
-       else {
-               while (prefix_count--) {
-                       *temp_ptr++ = AML_PARENT_PREFIX;
-               }
-       }
-
-
-       /* Set up Dual or Multi prefixes if needed */
-
-       if (num_name_segs > 2) {
-               /* Set up multi prefixes   */
-
-               *temp_ptr++ = AML_MULTI_NAME_PREFIX_OP;
-               *temp_ptr++ = (char) num_name_segs;
-       }
-
-       else if (2 == num_name_segs) {
-               /* Set up dual prefixes */
-
-               *temp_ptr++ = AML_DUAL_NAME_PREFIX;
-       }
-
-       /*
-        * Terminate string following prefixes. Acpi_aml_exec_name_segment() will
-        * append the segment(s)
-        */
-
-       *temp_ptr = 0;
-
-       return (name_string);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_name_segment
- *
- * PARAMETERS:  Interpreter_mode    - Current running mode (load1/Load2/Exec)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute a name segment (4 bytes)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_name_segment (
-       u8                      **in_aml_address,
-       NATIVE_CHAR             *name_string)
-{
-       u8                      *aml_address = *in_aml_address;
-       ACPI_STATUS             status = AE_OK;
-       u32                     index;
-       NATIVE_CHAR             char_buf[5];
-
-
-       /*
-        * If first character is a digit, then we know that we aren't looking at a
-        * valid name segment
-        */
-
-       char_buf[0] = *aml_address;
-
-       if ('0' <= char_buf[0] && char_buf[0] <= '9') {
-               return (AE_CTRL_PENDING);
-       }
-
-       for (index = 4;
-               (index > 0) && (acpi_cm_valid_acpi_character (*aml_address));
-               --index) {
-               char_buf[4 - index] = *aml_address++;
-       }
-
-
-       /* Valid name segment  */
-
-       if (0 == index) {
-               /* Found 4 valid characters */
-
-               char_buf[4] = '\0';
-
-               if (name_string) {
-                       STRCAT (name_string, char_buf);
-               }
-
-       }
-
-       else if (4 == index) {
-               /*
-                * First character was not a valid name character,
-                * so we are looking at something other than a name.
-                */
-               status = AE_CTRL_PENDING;
-       }
-
-       else {
-               /* Segment started with one or more valid characters, but fewer than 4 */
-
-               status = AE_AML_BAD_NAME;
-       }
-
-       *in_aml_address = aml_address;
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_get_name_string
- *
- * PARAMETERS:  Data_type           - Data type to be associated with this name
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get a name, including any prefixes.
- *
- ******************************************************************************/
-
-
-ACPI_STATUS
-acpi_aml_get_name_string (
-       OBJECT_TYPE_INTERNAL    data_type,
-       u8                      *in_aml_address,
-       NATIVE_CHAR             **out_name_string,
-       u32                     *out_name_length)
-{
-       ACPI_STATUS             status = AE_OK;
-       u8                      *aml_address = in_aml_address;
-       NATIVE_CHAR             *name_string = NULL;
-       u32                     num_segments;
-       u32                     prefix_count = 0;
-       u8                      prefix = 0;
-       u8                      has_prefix = FALSE;
-
-
-       if (INTERNAL_TYPE_DEF_FIELD == data_type  ||
-               INTERNAL_TYPE_BANK_FIELD == data_type ||
-               INTERNAL_TYPE_INDEX_FIELD == data_type) {
-               /* Disallow prefixes for types associated with field names */
-
-               name_string = acpi_aml_allocate_name_string (0, 1);
-               if (!name_string) {
-                       status = AE_NO_MEMORY;
-               }
-               else {
-                       status = acpi_aml_exec_name_segment (&aml_address, name_string);
-               }
-       }
-
-       else {
-               /*
-                * Data_type is not a field name.
-                * Examine first character of name for root or parent prefix operators
-                */
-
-               switch (*aml_address) {
-
-               case AML_ROOT_PREFIX:
-
-                       prefix = *aml_address++;
-                       /*
-                        * Remember that we have a Root_prefix --
-                        * see comment in Acpi_aml_allocate_name_string()
-                        */
-                       prefix_count = (u32) -1;
-                       has_prefix = TRUE;
-                       break;
-
-
-               case AML_PARENT_PREFIX:
-
-                       /* Increment past possibly multiple parent prefixes */
-
-                       do {
-                               prefix = *aml_address++;
-                               ++prefix_count;
-
-                       } while (*aml_address == AML_PARENT_PREFIX);
-                       has_prefix = TRUE;
-                       break;
-
-
-               default:
-
-                       break;
-               }
-
-
-               /* Examine first character of name for name segment prefix operator */
-
-               switch (*aml_address) {
-
-               case AML_DUAL_NAME_PREFIX:
-
-                       prefix = *aml_address++;
-                       name_string = acpi_aml_allocate_name_string (prefix_count, 2);
-                       if (!name_string) {
-                               status = AE_NO_MEMORY;
-                               break;
-                       }
-
-                       /* Indicate that we processed a prefix */
-                       has_prefix = TRUE;
-
-                       status = acpi_aml_exec_name_segment (&aml_address, name_string);
-                       if (ACPI_SUCCESS (status)) {
-                               status = acpi_aml_exec_name_segment (&aml_address, name_string);
-                       }
-                       break;
-
-
-               case AML_MULTI_NAME_PREFIX_OP:
-
-                       prefix = *aml_address++;
-                       /* Fetch count of segments remaining in name path */
-
-                       num_segments = *aml_address++;
-
-                       name_string = acpi_aml_allocate_name_string (prefix_count, num_segments);
-                       if (!name_string) {
-                               status = AE_NO_MEMORY;
-                               break;
-                       }
-
-                       /* Indicate that we processed a prefix */
-                       has_prefix = TRUE;
-
-                       while (num_segments &&
-                                       (status = acpi_aml_exec_name_segment (&aml_address, name_string)) == AE_OK) {
-                               --num_segments;
-                       }
-
-                       break;
-
-
-               case 0:
-
-                       /* Null_name valid as of 8-12-98 ASL/AML Grammar Update */
-
-
-                       /* Consume the NULL byte */
-
-                       aml_address++;
-                       name_string = acpi_aml_allocate_name_string (prefix_count, 0);
-                       if (!name_string) {
-                               status = AE_NO_MEMORY;
-                               break;
-                       }
-
-                       break;
-
-
-               default:
-
-                       /* Name segment string */
-
-                       name_string = acpi_aml_allocate_name_string (prefix_count, 1);
-                       if (!name_string) {
-                               status = AE_NO_MEMORY;
-                               break;
-                       }
-
-                       status = acpi_aml_exec_name_segment (&aml_address, name_string);
-                       break;
-
-               }   /* Switch (Peek_op ())   */
-       }
-
-
-       if (AE_CTRL_PENDING == status && has_prefix) {
-               /* Ran out of segments after processing a prefix */
-
-               REPORT_ERROR (
-                       ("Aml_do_name: Malformed Name at %p\n", name_string));
-               status = AE_AML_BAD_NAME;
-       }
-
-
-       *out_name_string = name_string;
-       *out_name_length = (u32) (aml_address - in_aml_address);
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amprep.c b/reactos/drivers/bus/acpi/executer/amprep.c
deleted file mode 100644 (file)
index 351fb2b..0000000
+++ /dev/null
@@ -1,400 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amprep - ACPI AML (p-code) execution - field prep utilities
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amprep")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_decode_field_access_type
- *
- * PARAMETERS:  Access          - Encoded field access bits
- *
- * RETURN:      Field granularity (8, 16, or 32)
- *
- * DESCRIPTION: Decode the Access_type bits of a field definition.
- *
- ******************************************************************************/
-
-static u32
-acpi_aml_decode_field_access_type (
-       u32                     access,
-       u16                     length)
-{
-
-       switch (access) {
-       case ACCESS_ANY_ACC:
-               if (length <= 8) {
-                       return (8);
-               }
-               else if (length <= 16) {
-                       return (16);
-               }
-               else if (length <= 32) {
-                       return (32);
-               }
-               else {
-                       return (8);
-               }
-               break;
-
-       case ACCESS_BYTE_ACC:
-               return (8);
-               break;
-
-       case ACCESS_WORD_ACC:
-               return (16);
-               break;
-
-       case ACCESS_DWORD_ACC:
-               return (32);
-               break;
-
-       default:
-               /* Invalid field access type */
-
-               return (0);
-       }
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_prep_common_field_objec
- *
- * PARAMETERS:  Obj_desc            - The field object
- *              Field_flags         - Access, Lock_rule, or Update_rule.
- *                                    The format of a Field_flag is described
- *                                    in the ACPI specification
- *              Field_position      - Field position
- *              Field_length        - Field length
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initialize the areas of the field object that are common
- *              to the various types of fields.
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_aml_prep_common_field_object (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       u8                      field_flags,
-       u8                      field_attribute,
-       u32                     field_position,
-       u32                     field_length)
-{
-       u32                     granularity;
-
-
-       /*
-        * Note: the structure being initialized is the
-        * ACPI_COMMON_FIELD_INFO;  Therefore, we can just use the Field union to
-        * access this common area.  No structure fields outside of the common area
-        * are initialized by this procedure.
-        */
-
-       /* Decode the Field_flags */
-
-       obj_desc->field.access          = (u8) ((field_flags & ACCESS_TYPE_MASK)
-                        >> ACCESS_TYPE_SHIFT);
-       obj_desc->field.lock_rule       = (u8) ((field_flags & LOCK_RULE_MASK)
-                        >> LOCK_RULE_SHIFT);
-       obj_desc->field.update_rule     = (u8) ((field_flags & UPDATE_RULE_MASK)
-                        >> UPDATE_RULE_SHIFT);
-
-       /* Other misc fields */
-
-       obj_desc->field.length          = (u16) field_length;
-       obj_desc->field.access_attribute = field_attribute;
-
-       /* Decode the access type so we can compute offsets */
-
-       granularity = acpi_aml_decode_field_access_type (obj_desc->field.access, obj_desc->field.length);
-       if (!granularity) {
-               return (AE_AML_OPERAND_VALUE);
-       }
-
-       /* Access granularity based fields */
-
-       obj_desc->field.granularity     = (u8) granularity;
-       obj_desc->field.bit_offset      = (u8) (field_position % granularity);
-       obj_desc->field.offset          = (u32) field_position / granularity;
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_prep_def_field_value
- *
- * PARAMETERS:  Node            - Owning Node
- *              Region              - Region in which field is being defined
- *              Field_flags         - Access, Lock_rule, or Update_rule.
- *                                    The format of a Field_flag is described
- *                                    in the ACPI specification
- *              Field_position      - Field position
- *              Field_length        - Field length
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT  of type Def_field and
- *              connect it to the parent Node.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_prep_def_field_value (
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_HANDLE             region,
-       u8                      field_flags,
-       u8                      field_attribute,
-       u32                     field_position,
-       u32                     field_length)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       u32                     type;
-       ACPI_STATUS             status;
-
-
-       /* Parameter validation */
-
-       if (!region) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-       type = acpi_ns_get_type (region);
-       if (type != ACPI_TYPE_REGION) {
-               return (AE_AML_OPERAND_TYPE);
-       }
-
-       /* Allocate a new object */
-
-       obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_DEF_FIELD);
-       if (!obj_desc) {
-               return (AE_NO_MEMORY);
-       }
-
-
-       /* Obj_desc and Region valid */
-
-       /* Initialize areas of the object that are common to all fields */
-
-       status = acpi_aml_prep_common_field_object (obj_desc, field_flags, field_attribute,
-                         field_position, field_length);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Initialize areas of the object that are specific to this field type */
-
-       obj_desc->field.container = acpi_ns_get_attached_object (region);
-
-       /* An additional reference for the container */
-
-       acpi_cm_add_reference (obj_desc->field.container);
-
-
-       /* Debug info */
-
-       /*
-        * Store the constructed descriptor (Obj_desc) into the Named_obj whose
-        * handle is on TOS, preserving the current type of that Named_obj.
-        */
-       status = acpi_ns_attach_object ((ACPI_HANDLE) node, obj_desc,
-                         (u8) acpi_ns_get_type ((ACPI_HANDLE) node));
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_prep_bank_field_value
- *
- * PARAMETERS:  Node            - Owning Node
- *              Region              - Region in which field is being defined
- *              Bank_reg            - Bank selection register
- *              Bank_val            - Value to store in selection register
- *              Field_flags         - Access, Lock_rule, or Update_rule
- *              Field_position      - Field position
- *              Field_length        - Field length
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT  of type Bank_field and
- *              connect it to the parent Node.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_prep_bank_field_value (
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_HANDLE             region,
-       ACPI_HANDLE             bank_reg,
-       u32                     bank_val,
-       u8                      field_flags,
-       u8                      field_attribute,
-       u32                     field_position,
-       u32                     field_length)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       u32                     type;
-       ACPI_STATUS             status;
-
-
-       /* Parameter validation */
-
-       if (!region) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-       type = acpi_ns_get_type (region);
-       if (type != ACPI_TYPE_REGION) {
-               return (AE_AML_OPERAND_TYPE);
-       }
-
-       /* Allocate a new object */
-
-       obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_BANK_FIELD);
-       if (!obj_desc) {
-               return (AE_NO_MEMORY);
-       }
-
-       /*  Obj_desc and Region valid   */
-
-       /* Initialize areas of the object that are common to all fields */
-
-       status = acpi_aml_prep_common_field_object (obj_desc, field_flags, field_attribute,
-                         field_position, field_length);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Initialize areas of the object that are specific to this field type */
-
-       obj_desc->bank_field.value      = bank_val;
-       obj_desc->bank_field.container  = acpi_ns_get_attached_object (region);
-       obj_desc->bank_field.bank_select = acpi_ns_get_attached_object (bank_reg);
-
-       /* An additional reference for the container and bank select */
-       /* TBD: [Restructure] is "Bank_select" ever a real internal object?? */
-
-       acpi_cm_add_reference (obj_desc->bank_field.container);
-       acpi_cm_add_reference (obj_desc->bank_field.bank_select);
-
-       /* Debug info */
-
-       /*
-        * Store the constructed descriptor (Obj_desc) into the Named_obj whose
-        * handle is on TOS, preserving the current type of that Named_obj.
-        */
-       status = acpi_ns_attach_object ((ACPI_HANDLE) node, obj_desc,
-                        (u8) acpi_ns_get_type ((ACPI_HANDLE) node));
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_prep_index_field_value
- *
- * PARAMETERS:  Node            - Owning Node
- *              Index_reg           - Index register
- *              Data_reg            - Data register
- *              Field_flags         - Access, Lock_rule, or Update_rule
- *              Field_position      - Field position
- *              Field_length        - Field length
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT  of type Index_field and
- *              connect it to the parent Node.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_prep_index_field_value (
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_HANDLE             index_reg,
-       ACPI_HANDLE             data_reg,
-       u8                      field_flags,
-       u8                      field_attribute,
-       u32                     field_position,
-       u32                     field_length)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status;
-
-
-       /* Parameter validation */
-
-       if (!index_reg || !data_reg) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-       /* Allocate a new object descriptor */
-
-       obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_INDEX_FIELD);
-       if (!obj_desc) {
-               return (AE_NO_MEMORY);
-       }
-
-       /* Initialize areas of the object that are common to all fields */
-
-       status = acpi_aml_prep_common_field_object (obj_desc, field_flags, field_attribute,
-                         field_position, field_length);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Initialize areas of the object that are specific to this field type */
-
-       obj_desc->index_field.value     = (u32) (field_position /
-                          obj_desc->field.granularity);
-       obj_desc->index_field.index     = index_reg;
-       obj_desc->index_field.data      = data_reg;
-
-       /* Debug info */
-
-       /*
-        * Store the constructed descriptor (Obj_desc) into the Named_obj whose
-        * handle is on TOS, preserving the current type of that Named_obj.
-        */
-       status = acpi_ns_attach_object ((ACPI_HANDLE) node, obj_desc,
-                        (u8) acpi_ns_get_type ((ACPI_HANDLE) node));
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/executer/amregion.c b/reactos/drivers/bus/acpi/executer/amregion.c
deleted file mode 100644 (file)
index a3e9e0a..0000000
+++ /dev/null
@@ -1,405 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amregion - ACPI default Op_region (address space) handlers
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amregion")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_memory_space_handler
- *
- * PARAMETERS:  Function            - Read or Write operation
- *              Address             - Where in the space to read or write
- *              Bit_width           - Field width in bits (8, 16, or 32)
- *              Value               - Pointer to in or out value
- *              Handler_context     - Pointer to Handler's context
- *              Region_context      - Pointer to context specific to the
- *                                      accessed region
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Handler for the System Memory address space (Op Region)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_system_memory_space_handler (
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value,
-       void                    *handler_context,
-       void                    *region_context)
-{
-       ACPI_STATUS             status = AE_OK;
-       void                    *logical_addr_ptr = NULL;
-       MEM_HANDLER_CONTEXT     *mem_info = region_context;
-       u32                     length;
-
-
-       /* Validate and translate the bit width */
-
-       switch (bit_width) {
-       case 8:
-               length = 1;
-               break;
-
-       case 16:
-               length = 2;
-               break;
-
-       case 32:
-               length = 4;
-               break;
-
-       default:
-               return (AE_AML_OPERAND_VALUE);
-               break;
-       }
-
-
-       /*
-        * Does the request fit into the cached memory mapping?
-        * Is 1) Address below the current mapping? OR
-        *    2) Address beyond the current mapping?
-        */
-
-       if ((address < mem_info->mapped_physical_address) ||
-               (((ACPI_INTEGER) address + length) >
-                       ((ACPI_INTEGER) mem_info->mapped_physical_address + mem_info->mapped_length))) {
-               /*
-                * The request cannot be resolved by the current memory mapping;
-                * Delete the existing mapping and create a new one.
-                */
-
-               if (mem_info->mapped_length) {
-                       /* Valid mapping, delete it */
-
-                       acpi_os_unmap_memory (mem_info->mapped_logical_address,
-                                          mem_info->mapped_length);
-               }
-
-               mem_info->mapped_length = 0; /* In case of failure below */
-
-               /* Create a new mapping starting at the address given */
-
-               status = acpi_os_map_memory (address, SYSMEM_REGION_WINDOW_SIZE,
-                                 (void **) &mem_info->mapped_logical_address);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* TBD: should these pointers go to 64-bit in all cases ? */
-
-               mem_info->mapped_physical_address = address;
-               mem_info->mapped_length = SYSMEM_REGION_WINDOW_SIZE;
-       }
-
-
-       /*
-        * Generate a logical pointer corresponding to the address we want to
-        * access
-        */
-
-       /* TBD: should these pointers go to 64-bit in all cases ? */
-
-       logical_addr_ptr = mem_info->mapped_logical_address +
-                         ((ACPI_INTEGER) address - (ACPI_INTEGER) mem_info->mapped_physical_address);
-
-       /* Perform the memory read or write */
-
-       switch (function) {
-
-       case ADDRESS_SPACE_READ:
-
-               switch (bit_width) {
-               case 8:
-                       *value = (u32)* (u8 *) logical_addr_ptr;
-                       break;
-
-               case 16:
-                       MOVE_UNALIGNED16_TO_32 (value, logical_addr_ptr);
-                       break;
-
-               case 32:
-                       MOVE_UNALIGNED32_TO_32 (value, logical_addr_ptr);
-                       break;
-               }
-
-               break;
-
-
-       case ADDRESS_SPACE_WRITE:
-
-               switch (bit_width) {
-               case 8:
-                       *(u8 *) logical_addr_ptr = (u8) *value;
-                       break;
-
-               case 16:
-                       MOVE_UNALIGNED16_TO_16 (logical_addr_ptr, value);
-                       break;
-
-               case 32:
-                       MOVE_UNALIGNED32_TO_32 (logical_addr_ptr, value);
-                       break;
-               }
-
-               break;
-
-
-       default:
-               status = AE_BAD_PARAMETER;
-               break;
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_io_space_handler
- *
- * PARAMETERS:  Function            - Read or Write operation
- *              Address             - Where in the space to read or write
- *              Bit_width           - Field width in bits (8, 16, or 32)
- *              Value               - Pointer to in or out value
- *              Handler_context     - Pointer to Handler's context
- *              Region_context      - Pointer to context specific to the
- *                                      accessed region
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Handler for the System IO address space (Op Region)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_system_io_space_handler (
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value,
-       void                    *handler_context,
-       void                    *region_context)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Decode the function parameter */
-
-       switch (function) {
-
-       case ADDRESS_SPACE_READ:
-
-               switch (bit_width) {
-               /* I/O Port width */
-
-               case 8:
-                       *value = (u32) acpi_os_in8 ((ACPI_IO_ADDRESS) address);
-                       break;
-
-               case 16:
-                       *value = (u32) acpi_os_in16 ((ACPI_IO_ADDRESS) address);
-                       break;
-
-               case 32:
-                       *value = acpi_os_in32 ((ACPI_IO_ADDRESS) address);
-                       break;
-
-               default:
-                       status = AE_AML_OPERAND_VALUE;
-               }
-
-               break;
-
-
-       case ADDRESS_SPACE_WRITE:
-
-               switch (bit_width) {
-               /* I/O Port width */
-               case 8:
-                       acpi_os_out8 ((ACPI_IO_ADDRESS) address, (u8) *value);
-                       break;
-
-               case 16:
-                       acpi_os_out16 ((ACPI_IO_ADDRESS) address, (u16) *value);
-                       break;
-
-               case 32:
-                       acpi_os_out32 ((ACPI_IO_ADDRESS) address, *value);
-                       break;
-
-               default:
-                       status = AE_AML_OPERAND_VALUE;
-               }
-
-               break;
-
-
-       default:
-               status = AE_BAD_PARAMETER;
-               break;
-       }
-
-       return (status);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_pci_config_space_handler
- *
- * PARAMETERS:  Function            - Read or Write operation
- *              Address             - Where in the space to read or write
- *              Bit_width           - Field width in bits (8, 16, or 32)
- *              Value               - Pointer to in or out value
- *              Handler_context     - Pointer to Handler's context
- *              Region_context      - Pointer to context specific to the
- *                                      accessed region
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Handler for the PCI Config address space (Op Region)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_pci_config_space_handler (
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value,
-       void                    *handler_context,
-       void                    *region_context)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     pci_bus;
-       u32                     dev_func;
-       u8                      pci_reg;
-       PCI_HANDLER_CONTEXT    *PCIcontext;
-
-
-       /*
-        *  The arguments to Acpi_os(Read|Write)Pci_cfg(Byte|Word|Dword) are:
-        *
-        *  Seg_bus - 0xSSSSBBBB    - SSSS is the PCI bus segment
-        *                            BBBB is the PCI bus number
-        *
-        *  Dev_func - 0xDDDDFFFF   - DDDD is the PCI device number
-        *                            FFFF is the PCI device function number
-        *
-        *  Reg_num - Config space register must be < 40h
-        *
-        *  Value - input value for write, output for read
-        *
-        */
-
-       PCIcontext = (PCI_HANDLER_CONTEXT *) region_context;
-
-       pci_bus = LOWORD(PCIcontext->seg) << 16;
-       pci_bus |= LOWORD(PCIcontext->bus);
-
-       dev_func = PCIcontext->dev_func;
-
-       pci_reg = (u8) address;
-
-       switch (function) {
-
-       case ADDRESS_SPACE_READ:
-
-               *value  = 0;
-
-               switch (bit_width) {
-               /* PCI Register width */
-
-               case 8:
-                       status = acpi_os_read_pci_cfg_byte (pci_bus, dev_func, pci_reg,
-                                          (u8 *) value);
-                       break;
-
-               case 16:
-                       status = acpi_os_read_pci_cfg_word (pci_bus, dev_func, pci_reg,
-                                          (u16 *) value);
-                       break;
-
-               case 32:
-                       status = acpi_os_read_pci_cfg_dword (pci_bus, dev_func, pci_reg,
-                                          value);
-                       break;
-
-               default:
-                       status = AE_AML_OPERAND_VALUE;
-
-               } /* Switch bit_width */
-
-               break;
-
-
-       case ADDRESS_SPACE_WRITE:
-
-               switch (bit_width) {
-               /* PCI Register width */
-
-               case 8:
-                       status = acpi_os_write_pci_cfg_byte (pci_bus, dev_func, pci_reg,
-                                        *(u8 *) value);
-                       break;
-
-               case 16:
-                       status = acpi_os_write_pci_cfg_word (pci_bus, dev_func, pci_reg,
-                                        *(u16 *) value);
-                       break;
-
-               case 32:
-                       status = acpi_os_write_pci_cfg_dword (pci_bus, dev_func, pci_reg,
-                                        *value);
-                       break;
-
-               default:
-                       status = AE_AML_OPERAND_VALUE;
-
-               } /* Switch bit_width */
-
-               break;
-
-
-       default:
-
-               status = AE_BAD_PARAMETER;
-               break;
-
-       }
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/executer/amresnte.c b/reactos/drivers/bus/acpi/executer/amresnte.c
deleted file mode 100644 (file)
index 9ddbc84..0000000
+++ /dev/null
@@ -1,500 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amresnte - AML Interpreter object resolution
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amresnte")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_resolve_node_to_value
- *
- * PARAMETERS:  Stack_ptr       - Pointer to a location on a stack that contains
- *                                a pointer to an Node
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Resolve a ACPI_NAMESPACE_NODE (Node,
- *              A.K.A. a "direct name pointer")
- *
- * Note: for some of the data types, the pointer attached to the Node
- * can be either a pointer to an actual internal object or a pointer into the
- * AML stream itself.  These types are currently:
- *
- *      ACPI_TYPE_INTEGER
- *      ACPI_TYPE_STRING
- *      ACPI_TYPE_BUFFER
- *      ACPI_TYPE_MUTEX
- *      ACPI_TYPE_PACKAGE
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_resolve_node_to_value (
-       ACPI_NAMESPACE_NODE     **stack_ptr,
-       ACPI_WALK_STATE         *walk_state)
-
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OPERAND_OBJECT     *val_desc = NULL;
-       ACPI_OPERAND_OBJECT     *obj_desc = NULL;
-       ACPI_NAMESPACE_NODE     *node;
-       u8                      *aml_pointer = NULL;
-       OBJECT_TYPE_INTERNAL    entry_type;
-       u8                      locked;
-       u8                      attached_aml_pointer = FALSE;
-       u8                      aml_opcode = 0;
-       ACPI_INTEGER            temp_val;
-       OBJECT_TYPE_INTERNAL    object_type;
-
-
-       node = *stack_ptr;
-
-
-       /*
-        * The stack pointer is a "Direct name ptr", and points to a
-        * a ACPI_NAMESPACE_NODE (Node).  Get the pointer that is attached to
-        * the Node.
-        */
-
-       val_desc    = acpi_ns_get_attached_object ((ACPI_HANDLE) node);
-       entry_type  = acpi_ns_get_type ((ACPI_HANDLE) node);
-
-       /*
-        * The Val_desc attached to the Node can be either:
-        * 1) An internal ACPI object
-        * 2) A pointer into the AML stream (into one of the ACPI system tables)
-        */
-
-       if (acpi_tb_system_table_pointer (val_desc)) {
-               attached_aml_pointer = TRUE;
-               aml_opcode = *((u8 *) val_desc);
-               aml_pointer = ((u8 *) val_desc) + 1;
-
-       }
-
-
-       /*
-        * Several Entry_types do not require further processing, so
-        *  we will return immediately
-        */
-       /* Devices rarely have an attached object, return the Node
-        *  and Method locals and arguments have a pseudo-Node
-        */
-       if (entry_type == ACPI_TYPE_DEVICE ||
-               (node->flags & (ANOBJ_METHOD_ARG | ANOBJ_METHOD_LOCAL))) {
-               return (AE_OK);
-       }
-
-       if (!val_desc) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-       /*
-        * Action is based on the type of the Node, which indicates the type
-        * of the attached object or pointer
-        */
-       switch (entry_type) {
-
-       case ACPI_TYPE_PACKAGE:
-
-               if (attached_aml_pointer) {
-                       /*
-                        * This means that the package initialization is not parsed
-                        * -- should not happen
-                        */
-                       return (AE_NOT_IMPLEMENTED);
-               }
-
-               /* Val_desc is an internal object in all cases by the time we get here */
-
-               if (ACPI_TYPE_PACKAGE != val_desc->common.type) {
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-               /* Return an additional reference to the object */
-
-               obj_desc = val_desc;
-               acpi_cm_add_reference (obj_desc);
-               break;
-
-
-       case ACPI_TYPE_BUFFER:
-
-               if (attached_aml_pointer) {
-                       /*
-                        * This means that the buffer initialization is not parsed
-                        * -- should not happen
-                        */
-                       return (AE_NOT_IMPLEMENTED);
-               }
-
-               /* Val_desc is an internal object in all cases by the time we get here */
-
-               if (ACPI_TYPE_BUFFER != val_desc->common.type) {
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-               /* Return an additional reference to the object */
-
-               obj_desc = val_desc;
-               acpi_cm_add_reference (obj_desc);
-               break;
-
-
-       case ACPI_TYPE_STRING:
-
-               if (attached_aml_pointer) {
-                       /* Allocate a new string object */
-
-                       obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_STRING);
-                       if (!obj_desc) {
-                               return (AE_NO_MEMORY);
-                       }
-
-                       /* Init the internal object */
-
-                       obj_desc->string.pointer = (NATIVE_CHAR *) aml_pointer;
-                       obj_desc->string.length = STRLEN (obj_desc->string.pointer);
-               }
-
-               else {
-                       if (ACPI_TYPE_STRING != val_desc->common.type) {
-                               return (AE_AML_OPERAND_TYPE);
-                       }
-
-                       /* Return an additional reference to the object */
-
-                       obj_desc = val_desc;
-                       acpi_cm_add_reference (obj_desc);
-               }
-
-               break;
-
-
-       case ACPI_TYPE_INTEGER:
-
-               /*
-                * The Node has an attached internal object, make sure that it's a
-                * number
-                */
-
-               if (ACPI_TYPE_INTEGER != val_desc->common.type) {
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-               /* Return an additional reference to the object */
-
-               obj_desc = val_desc;
-               acpi_cm_add_reference (obj_desc);
-               break;
-
-
-       case INTERNAL_TYPE_DEF_FIELD:
-
-               /*
-                * TBD: [Investigate] Is this the correct solution?
-                *
-                * This section was extended to convert to generic buffer if
-                *  the return length is greater than 32 bits, but still allows
-                *  for returning a type Number for smaller values because the
-                *  caller can then apply arithmetic operators on those fields.
-                *
-                * XXX - Implementation limitation: Fields are implemented as type
-                * XXX - Number, but they really are supposed to be type Buffer.
-                * XXX - The two are interchangeable only for lengths <= 32 bits.
-                */
-               if(val_desc->field.length > 32) {
-                       object_type = ACPI_TYPE_BUFFER;
-               }
-               else {
-                       object_type = ACPI_TYPE_INTEGER;
-               }
-
-               /*
-                * Create the destination buffer object and the buffer space.
-                */
-               obj_desc = acpi_cm_create_internal_object (object_type);
-               if (!obj_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               /*
-                * Fill in the object specific details
-                */
-               if (ACPI_TYPE_BUFFER == object_type) {
-                       obj_desc->buffer.pointer = acpi_cm_callocate (val_desc->field.length);
-                       if (!obj_desc->buffer.pointer) {
-                               acpi_cm_remove_reference(obj_desc);
-                               return (AE_NO_MEMORY);
-                       }
-
-                       obj_desc->buffer.length = val_desc->field.length;
-
-                       status = acpi_aml_access_named_field (ACPI_READ, (ACPI_HANDLE) node,
-                                         obj_desc->buffer.pointer, obj_desc->buffer.length);
-
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-               }
-               else {
-                       status = acpi_aml_access_named_field (ACPI_READ, (ACPI_HANDLE) node,
-                                         &temp_val, sizeof (temp_val));
-
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       obj_desc->integer.value = temp_val;
-               }
-
-
-               break;
-
-
-       case INTERNAL_TYPE_BANK_FIELD:
-
-               if (attached_aml_pointer) {
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-               if (INTERNAL_TYPE_BANK_FIELD != val_desc->common.type) {
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-
-               /* Get the global lock if needed */
-
-               obj_desc = (ACPI_OPERAND_OBJECT *) *stack_ptr;
-               locked = acpi_aml_acquire_global_lock (obj_desc->field_unit.lock_rule);
-
-               /* Set Index value to select proper Data register */
-               /* perform the update */
-
-               status = acpi_aml_access_named_field (ACPI_WRITE,
-                                val_desc->bank_field.bank_select, &val_desc->bank_field.value,
-                                sizeof (val_desc->bank_field.value));
-
-               acpi_aml_release_global_lock (locked);
-
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* Read Data value */
-
-               status = acpi_aml_access_named_field (ACPI_READ,
-                                (ACPI_HANDLE) val_desc->bank_field.container,
-                                &temp_val, sizeof (temp_val));
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* Create an object for the result */
-
-               obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-               if (!obj_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               obj_desc->integer.value = temp_val;
-               break;
-
-
-       case INTERNAL_TYPE_INDEX_FIELD:
-
-               if (attached_aml_pointer) {
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-               if (INTERNAL_TYPE_INDEX_FIELD != val_desc->common.type) {
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-
-               /* Set Index value to select proper Data register */
-               /* Get the global lock if needed */
-
-               obj_desc = (ACPI_OPERAND_OBJECT *) *stack_ptr;
-               locked = acpi_aml_acquire_global_lock (obj_desc->field_unit.lock_rule);
-
-               /* Perform the update */
-
-               status = acpi_aml_access_named_field (ACPI_WRITE,
-                                 val_desc->index_field.index, &val_desc->index_field.value,
-                                 sizeof (val_desc->index_field.value));
-
-               acpi_aml_release_global_lock (locked);
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* Read Data value */
-
-               status = acpi_aml_access_named_field (ACPI_READ, val_desc->index_field.data,
-                                 &temp_val, sizeof (temp_val));
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* Create an object for the result */
-
-               obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-               if (!obj_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               obj_desc->integer.value = temp_val;
-               break;
-
-
-       case ACPI_TYPE_FIELD_UNIT:
-
-               if (attached_aml_pointer) {
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-               if (val_desc->common.type != (u8) entry_type) {
-                       return (AE_AML_OPERAND_TYPE);
-                       break;
-               }
-
-               /* Create object for result */
-
-               obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_ANY);
-               if (!obj_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               status = acpi_aml_get_field_unit_value (val_desc, obj_desc);
-               if (ACPI_FAILURE (status)) {
-                       acpi_cm_remove_reference (obj_desc);
-                       return (status);
-               }
-
-               break;
-
-
-       /*
-        * For these objects, just return the object attached to the Node
-        */
-
-       case ACPI_TYPE_MUTEX:
-       case ACPI_TYPE_METHOD:
-       case ACPI_TYPE_POWER:
-       case ACPI_TYPE_PROCESSOR:
-       case ACPI_TYPE_THERMAL:
-       case ACPI_TYPE_EVENT:
-       case ACPI_TYPE_REGION:
-
-
-               /* Return an additional reference to the object */
-
-               obj_desc = val_desc;
-               acpi_cm_add_reference (obj_desc);
-               break;
-
-
-       /* TYPE_Any is untyped, and thus there is no object associated with it */
-
-       case ACPI_TYPE_ANY:
-
-               return (AE_AML_OPERAND_TYPE);  /* Cannot be AE_TYPE */
-               break;
-
-
-       /*
-        * The only named references allowed are named constants
-        *
-        * e.g.     Name (\OSFL, Ones)
-        */
-       case INTERNAL_TYPE_REFERENCE:
-
-               switch (val_desc->reference.opcode) {
-
-               case AML_ZERO_OP:
-
-                       temp_val = 0;
-                       break;
-
-
-               case AML_ONE_OP:
-
-                       temp_val = 1;
-                       break;
-
-
-               case AML_ONES_OP:
-
-                       temp_val = ACPI_INTEGER_MAX;
-                       break;
-
-
-               default:
-
-                       return (AE_AML_BAD_OPCODE);
-               }
-
-               /* Create object for result */
-
-               obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER);
-               if (!obj_desc) {
-                       return (AE_NO_MEMORY);
-               }
-
-               obj_desc->integer.value = temp_val;
-
-               /* Truncate value if we are executing from a 32-bit ACPI table */
-
-               acpi_aml_truncate_for32bit_table (obj_desc, walk_state);
-               break;
-
-
-       /* Default case is for unknown types */
-
-       default:
-
-               return (AE_AML_OPERAND_TYPE);
-
-       } /* switch (Entry_type) */
-
-
-       /* Put the object descriptor on the stack */
-
-       *stack_ptr = (void *) obj_desc;
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amresolv.c b/reactos/drivers/bus/acpi/executer/amresolv.c
deleted file mode 100644 (file)
index bdbaed6..0000000
+++ /dev/null
@@ -1,420 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amresolv - AML Interpreter object resolution
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amresolv")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_get_field_unit_value
- *
- * PARAMETERS:  *Field_desc         - Pointer to a Field_unit
- *              *Result_desc        - Pointer to an empty descriptor
- *                                    which will become a Number
- *                                    containing the field's value.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Retrieve the value from a Field_unit
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_get_field_unit_value (
-       ACPI_OPERAND_OBJECT     *field_desc,
-       ACPI_OPERAND_OBJECT     *result_desc)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     mask;
-       u8                      *location = NULL;
-       u8                      locked = FALSE;
-
-
-       if (!field_desc) {
-               status = AE_AML_NO_OPERAND;
-       }
-
-       if (!(field_desc->common.flags & AOPOBJ_DATA_VALID)) {
-               status = acpi_ds_get_field_unit_arguments (field_desc);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       if (!field_desc->field_unit.container) {
-               status = AE_AML_INTERNAL;
-       }
-
-       else if (ACPI_TYPE_BUFFER != field_desc->field_unit.container->common.type) {
-               status = AE_AML_OPERAND_TYPE;
-       }
-
-       else if (!result_desc) {
-               status = AE_AML_INTERNAL;
-       }
-
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-               /* Get the global lock if needed */
-
-       locked = acpi_aml_acquire_global_lock (field_desc->field_unit.lock_rule);
-
-       /* Field location is (base of buffer) + (byte offset) */
-
-       location = field_desc->field_unit.container->buffer.pointer
-                        + field_desc->field_unit.offset;
-
-       /*
-        * Construct Mask with as many 1 bits as the field width
-        *
-        * NOTE: Only the bottom 5 bits are valid for a shift operation, so
-        *  special care must be taken for any shift greater than 31 bits.
-        *
-        * TBD: [Unhandled] Fields greater than 32-bits will not work.
-        */
-
-       if (field_desc->field_unit.length < 32) {
-               mask = ((u32) 1 << field_desc->field_unit.length) - (u32) 1;
-       }
-       else {
-               mask = ACPI_UINT32_MAX;
-       }
-
-       result_desc->integer.type = (u8) ACPI_TYPE_INTEGER;
-
-       /* Get the 32 bit value at the location */
-
-       MOVE_UNALIGNED32_TO_32 (&result_desc->integer.value, location);
-
-       /*
-        * Shift the 32-bit word containing the field, and mask off the
-        * resulting value
-        */
-
-       result_desc->integer.value =
-               (result_desc->integer.value >> field_desc->field_unit.bit_offset) & mask;
-
-       /* Release global lock if we acquired it earlier */
-
-       acpi_aml_release_global_lock (locked);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_resolve_to_value
- *
- * PARAMETERS:  **Stack_ptr         - Points to entry on Obj_stack, which can
- *                                    be either an (ACPI_OPERAND_OBJECT  *)
- *                                    or an ACPI_HANDLE.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert Reference objects to values
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_resolve_to_value (
-       ACPI_OPERAND_OBJECT     **stack_ptr,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (!stack_ptr || !*stack_ptr) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-
-       /*
-        * The entity pointed to by the Stack_ptr can be either
-        * 1) A valid ACPI_OPERAND_OBJECT, or
-        * 2) A ACPI_NAMESPACE_NODE (Named_obj)
-        */
-
-       if (VALID_DESCRIPTOR_TYPE (*stack_ptr, ACPI_DESC_TYPE_INTERNAL)) {
-
-               status = acpi_aml_resolve_object_to_value (stack_ptr, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       /*
-        * Object on the stack may have changed if Acpi_aml_resolve_object_to_value()
-        * was called (i.e., we can't use an _else_ here.)
-        */
-
-       if (VALID_DESCRIPTOR_TYPE (*stack_ptr, ACPI_DESC_TYPE_NAMED)) {
-               status = acpi_aml_resolve_node_to_value ((ACPI_NAMESPACE_NODE **) stack_ptr, walk_state);
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_resolve_object_to_value
- *
- * PARAMETERS:  Stack_ptr       - Pointer to a stack location that contains a
- *                                ptr to an internal object.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Retrieve the value from an internal object.  The Reference type
- *              uses the associated AML opcode to determine the value.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_resolve_object_to_value (
-       ACPI_OPERAND_OBJECT     **stack_ptr,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *stack_desc;
-       ACPI_STATUS             status = AE_OK;
-       ACPI_HANDLE             temp_handle = NULL;
-       ACPI_OPERAND_OBJECT     *obj_desc = NULL;
-       u32                     index = 0;
-       u16                     opcode;
-
-
-       stack_desc = *stack_ptr;
-
-       /* This is an ACPI_OPERAND_OBJECT  */
-
-       switch (stack_desc->common.type) {
-
-       case INTERNAL_TYPE_REFERENCE:
-
-               opcode = stack_desc->reference.opcode;
-
-               switch (opcode) {
-
-               case AML_NAME_OP:
-
-                       /*
-                        * Convert indirect name ptr to a direct name ptr.
-                        * Then, Acpi_aml_resolve_node_to_value can be used to get the value
-                        */
-
-                       temp_handle = stack_desc->reference.object;
-
-                       /* Delete the Reference Object */
-
-                       acpi_cm_remove_reference (stack_desc);
-
-                       /* Put direct name pointer onto stack and exit */
-
-                       (*stack_ptr) = temp_handle;
-                       status = AE_OK;
-                       break;
-
-
-               case AML_LOCAL_OP:
-               case AML_ARG_OP:
-
-                       index = stack_desc->reference.offset;
-
-                       /*
-                        * Get the local from the method's state info
-                        * Note: this increments the local's object reference count
-                        */
-
-                       status = acpi_ds_method_data_get_value (opcode, index,
-                                        walk_state, &obj_desc);
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       /*
-                        * Now we can delete the original Reference Object and
-                        * replace it with the resolve value
-                        */
-
-                       acpi_cm_remove_reference (stack_desc);
-                       *stack_ptr = obj_desc;
-
-                       break;
-
-
-               /*
-                * TBD: [Restructure] These next three opcodes change the type of
-                * the object, which is actually a no-no.
-                */
-
-               case AML_ZERO_OP:
-
-                       stack_desc->common.type = (u8) ACPI_TYPE_INTEGER;
-                       stack_desc->integer.value = 0;
-                       break;
-
-
-               case AML_ONE_OP:
-
-                       stack_desc->common.type = (u8) ACPI_TYPE_INTEGER;
-                       stack_desc->integer.value = 1;
-                       break;
-
-
-               case AML_ONES_OP:
-
-                       stack_desc->common.type = (u8) ACPI_TYPE_INTEGER;
-                       stack_desc->integer.value = ACPI_INTEGER_MAX;
-
-                       /* Truncate value if we are executing from a 32-bit ACPI table */
-
-                       acpi_aml_truncate_for32bit_table (stack_desc, walk_state);
-                       break;
-
-
-               case AML_INDEX_OP:
-
-                       switch (stack_desc->reference.target_type) {
-                       case ACPI_TYPE_BUFFER_FIELD:
-
-                               /* Just return - leave the Reference on the stack */
-                               break;
-
-
-                       case ACPI_TYPE_PACKAGE:
-                               obj_desc = *stack_desc->reference.where;
-                               if (obj_desc) {
-                                       /*
-                                        * Valid obj descriptor, copy pointer to return value
-                                        * (i.e., dereference the package index)
-                                        * Delete the ref object, increment the returned object
-                                        */
-                                       acpi_cm_remove_reference (stack_desc);
-                                       acpi_cm_add_reference (obj_desc);
-                                       *stack_ptr = obj_desc;
-                               }
-
-                               else {
-                                       /*
-                                        * A NULL object descriptor means an unitialized element of
-                                        * the package, can't deref it
-                                        */
-
-                                       status = AE_AML_UNINITIALIZED_ELEMENT;
-                               }
-                               break;
-
-                       default:
-                               /* Invalid reference OBJ*/
-
-                               status = AE_AML_INTERNAL;
-                               break;
-                       }
-
-                       break;
-
-
-               case AML_DEBUG_OP:
-
-                       /* Just leave the object as-is */
-                       break;
-
-
-               default:
-
-                       status = AE_AML_INTERNAL;
-
-               }   /* switch (Opcode) */
-
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               break; /* case INTERNAL_TYPE_REFERENCE */
-
-
-       case ACPI_TYPE_FIELD_UNIT:
-
-               obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_ANY);
-               if (!obj_desc) {
-                       /* Descriptor allocation failure  */
-
-                       return (AE_NO_MEMORY);
-               }
-
-               status = acpi_aml_get_field_unit_value (stack_desc, obj_desc);
-               if (ACPI_FAILURE (status)) {
-                       acpi_cm_remove_reference (obj_desc);
-                       obj_desc = NULL;
-               }
-
-               *stack_ptr = (void *) obj_desc;
-               break;
-
-
-       case INTERNAL_TYPE_BANK_FIELD:
-
-               obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_ANY);
-               if (!obj_desc) {
-                       /* Descriptor allocation failure */
-
-                       return (AE_NO_MEMORY);
-               }
-
-               status = acpi_aml_get_field_unit_value (stack_desc, obj_desc);
-               if (ACPI_FAILURE (status)) {
-                       acpi_cm_remove_reference (obj_desc);
-                       obj_desc = NULL;
-               }
-
-               *stack_ptr = (void *) obj_desc;
-               break;
-
-
-       /* TBD: [Future] - may need to handle Index_field, and Def_field someday */
-
-       default:
-
-               break;
-
-       }   /* switch (Stack_desc->Common.Type) */
-
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amresop.c b/reactos/drivers/bus/acpi/executer/amresop.c
deleted file mode 100644 (file)
index 58e9feb..0000000
+++ /dev/null
@@ -1,475 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amresop - AML Interpreter operand/object resolution
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amresop")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_check_object_type
- *
- * PARAMETERS:  Type_needed         Object type needed
- *              This_type           Actual object type
- *              Object              Object pointer
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Check required type against actual type
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_aml_check_object_type (
-       ACPI_OBJECT_TYPE        type_needed,
-       ACPI_OBJECT_TYPE        this_type,
-       void                    *object)
-{
-
-
-       if (type_needed == ACPI_TYPE_ANY) {
-               /* All types OK, so we don't perform any typechecks */
-
-               return (AE_OK);
-       }
-
-
-       if (type_needed != this_type) {
-               return (AE_AML_OPERAND_TYPE);
-       }
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_resolve_operands
- *
- * PARAMETERS:  Opcode              Opcode being interpreted
- *              Stack_ptr           Top of operand stack
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert stack entries to required types
- *
- *      Each nibble in Arg_types represents one required operand
- *      and indicates the required Type:
- *
- *      The corresponding stack entry will be converted to the
- *      required type if possible, else return an exception
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_resolve_operands (
-       u16                     opcode,
-       ACPI_OPERAND_OBJECT     **stack_ptr,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status = AE_OK;
-       u8                      object_type;
-       ACPI_HANDLE             temp_handle;
-       u32                     arg_types;
-       ACPI_OPCODE_INFO        *op_info;
-       u32                     this_arg_type;
-       ACPI_OBJECT_TYPE        type_needed;
-
-
-       op_info = acpi_ps_get_opcode_info (opcode);
-       if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) {
-               return (AE_AML_BAD_OPCODE);
-       }
-
-
-       arg_types = op_info->runtime_args;
-       if (arg_types == ARGI_INVALID_OPCODE) {
-               return (AE_AML_INTERNAL);
-       }
-
-
-   /*
-        * Normal exit is with *Types == '\0' at end of string.
-        * Function will return an exception from within the loop upon
-        * finding an entry which is not, and cannot be converted
-        * to, the required type; if stack underflows; or upon
-        * finding a NULL stack entry (which "should never happen").
-        */
-
-       while (GET_CURRENT_ARG_TYPE (arg_types)) {
-               if (!stack_ptr || !*stack_ptr) {
-                       return (AE_AML_INTERNAL);
-               }
-
-               /* Extract useful items */
-
-               obj_desc = *stack_ptr;
-
-               /* Decode the descriptor type */
-
-               if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) {
-                       /* Node */
-
-                       object_type = ((ACPI_NAMESPACE_NODE *) obj_desc)->type;
-               }
-
-               else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) {
-                       /* ACPI internal object */
-
-                       object_type = obj_desc->common.type;
-
-                       /* Check for bad ACPI_OBJECT_TYPE */
-
-                       if (!acpi_aml_validate_object_type (object_type)) {
-                               return (AE_AML_OPERAND_TYPE);
-                       }
-
-                       if (object_type == (u8) INTERNAL_TYPE_REFERENCE) {
-                               /*
-                                * Decode the Reference
-                                */
-
-                               op_info = acpi_ps_get_opcode_info (opcode);
-                               if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) {
-                                       return (AE_AML_BAD_OPCODE);
-                               }
-
-
-                               switch (obj_desc->reference.opcode) {
-                               case AML_ZERO_OP:
-                               case AML_ONE_OP:
-                               case AML_ONES_OP:
-                               case AML_DEBUG_OP:
-                               case AML_NAME_OP:
-                               case AML_INDEX_OP:
-                               case AML_ARG_OP:
-                               case AML_LOCAL_OP:
-
-                                       break;
-
-                               default:
-                                       return (AE_AML_OPERAND_TYPE);
-                                       break;
-                               }
-                       }
-               }
-
-               else {
-                       /* Invalid descriptor */
-
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-
-               /*
-                * Get one argument type, point to the next
-                */
-
-               this_arg_type = GET_CURRENT_ARG_TYPE (arg_types);
-               INCREMENT_ARG_LIST (arg_types);
-
-
-               /*
-                * Handle cases where the object does not need to be
-                * resolved to a value
-                */
-
-               switch (this_arg_type) {
-
-               case ARGI_REFERENCE:            /* References */
-               case ARGI_INTEGER_REF:
-               case ARGI_OBJECT_REF:
-               case ARGI_DEVICE_REF:
-               case ARGI_TARGETREF:            /* TBD: must implement implicit conversion rules before store */
-               case ARGI_FIXED_TARGET:         /* No implicit conversion before store to target */
-               case ARGI_SIMPLE_TARGET:        /* Name, Local, or Arg - no implicit conversion */
-
-                       /* Need an operand of type INTERNAL_TYPE_REFERENCE */
-
-                       if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED))            /* direct name ptr OK as-is */ {
-                               goto next_operand;
-                       }
-
-                       status = acpi_aml_check_object_type (INTERNAL_TYPE_REFERENCE,
-                                         object_type, obj_desc);
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-
-                       if (AML_NAME_OP == obj_desc->reference.opcode) {
-                               /*
-                                * Convert an indirect name ptr to direct name ptr and put
-                                * it on the stack
-                                */
-
-                               temp_handle = obj_desc->reference.object;
-                               acpi_cm_remove_reference (obj_desc);
-                               (*stack_ptr) = temp_handle;
-                       }
-
-                       goto next_operand;
-                       break;
-
-
-               case ARGI_ANYTYPE:
-
-                       /*
-                        * We don't want to resolve Index_op reference objects during
-                        * a store because this would be an implicit De_ref_of operation.
-                        * Instead, we just want to store the reference object.
-                        * -- All others must be resolved below.
-                        */
-
-                       if ((opcode == AML_STORE_OP) &&
-                               ((*stack_ptr)->common.type == INTERNAL_TYPE_REFERENCE) &&
-                               ((*stack_ptr)->reference.opcode == AML_INDEX_OP)) {
-                               goto next_operand;
-                       }
-                       break;
-               }
-
-
-               /*
-                * Resolve this object to a value
-                */
-
-               status = acpi_aml_resolve_to_value (stack_ptr, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-
-               /*
-                * Check the resulting object (value) type
-                */
-               switch (this_arg_type) {
-               /*
-                * For the simple cases, only one type of resolved object
-                * is allowed
-                */
-               case ARGI_MUTEX:
-
-                       /* Need an operand of type ACPI_TYPE_MUTEX */
-
-                       type_needed = ACPI_TYPE_MUTEX;
-                       break;
-
-               case ARGI_EVENT:
-
-                       /* Need an operand of type ACPI_TYPE_EVENT */
-
-                       type_needed = ACPI_TYPE_EVENT;
-                       break;
-
-               case ARGI_REGION:
-
-                       /* Need an operand of type ACPI_TYPE_REGION */
-
-                       type_needed = ACPI_TYPE_REGION;
-                       break;
-
-               case ARGI_IF:   /* If */
-
-                       /* Need an operand of type INTERNAL_TYPE_IF */
-
-                       type_needed = INTERNAL_TYPE_IF;
-                       break;
-
-               case ARGI_PACKAGE:   /* Package */
-
-                       /* Need an operand of type ACPI_TYPE_PACKAGE */
-
-                       type_needed = ACPI_TYPE_PACKAGE;
-                       break;
-
-               case ARGI_ANYTYPE:
-
-                       /* Any operand type will do */
-
-                       type_needed = ACPI_TYPE_ANY;
-                       break;
-
-
-               /*
-                * The more complex cases allow multiple resolved object types
-                */
-
-               case ARGI_INTEGER:   /* Number */
-
-                       /*
-                        * Need an operand of type ACPI_TYPE_INTEGER,
-                        * But we can implicitly convert from a STRING or BUFFER
-                        */
-                       status = acpi_aml_convert_to_integer (stack_ptr, walk_state);
-                       if (ACPI_FAILURE (status)) {
-                               if (status == AE_TYPE) {
-                                       return (AE_AML_OPERAND_TYPE);
-                               }
-
-                               return (status);
-                       }
-
-                       goto next_operand;
-                       break;
-
-
-               case ARGI_BUFFER:
-
-                       /*
-                        * Need an operand of type ACPI_TYPE_BUFFER,
-                        * But we can implicitly convert from a STRING or INTEGER
-                        */
-                       status = acpi_aml_convert_to_buffer (stack_ptr, walk_state);
-                       if (ACPI_FAILURE (status)) {
-                               if (status == AE_TYPE) {
-                                       return (AE_AML_OPERAND_TYPE);
-                               }
-
-                               return (status);
-                       }
-
-                       goto next_operand;
-                       break;
-
-
-               case ARGI_STRING:
-
-                       /*
-                        * Need an operand of type ACPI_TYPE_STRING,
-                        * But we can implicitly convert from a BUFFER or INTEGER
-                        */
-                       status = acpi_aml_convert_to_string (stack_ptr, walk_state);
-                       if (ACPI_FAILURE (status)) {
-                               if (status == AE_TYPE) {
-                                       return (AE_AML_OPERAND_TYPE);
-                               }
-
-                               return (status);
-                       }
-
-                       goto next_operand;
-                       break;
-
-
-               case ARGI_COMPUTEDATA:
-
-                       /* Need an operand of type INTEGER, STRING or BUFFER */
-
-                       if ((ACPI_TYPE_INTEGER != (*stack_ptr)->common.type) &&
-                               (ACPI_TYPE_STRING != (*stack_ptr)->common.type) &&
-                               (ACPI_TYPE_BUFFER != (*stack_ptr)->common.type)) {
-                               return (AE_AML_OPERAND_TYPE);
-                       }
-                       goto next_operand;
-                       break;
-
-
-               case ARGI_DATAOBJECT:
-                       /*
-                        * ARGI_DATAOBJECT is only used by the Size_of operator.
-                        *
-                        * The ACPI specification allows Size_of to return the size of
-                        *  a Buffer, String or Package.  However, the MS ACPI.SYS AML
-                        *  Interpreter also allows an Node reference to return without
-                        *  error with a size of 4.
-                        */
-
-                       /* Need a buffer, string, package or Node reference */
-
-                       if (((*stack_ptr)->common.type != ACPI_TYPE_BUFFER) &&
-                               ((*stack_ptr)->common.type != ACPI_TYPE_STRING) &&
-                               ((*stack_ptr)->common.type != ACPI_TYPE_PACKAGE) &&
-                               ((*stack_ptr)->common.type != INTERNAL_TYPE_REFERENCE)) {
-                               return (AE_AML_OPERAND_TYPE);
-                       }
-
-                       /*
-                        * If this is a reference, only allow a reference to an Node.
-                        */
-                       if ((*stack_ptr)->common.type == INTERNAL_TYPE_REFERENCE) {
-                               if (!(*stack_ptr)->reference.node) {
-                                       return (AE_AML_OPERAND_TYPE);
-                               }
-                       }
-                       goto next_operand;
-                       break;
-
-
-               case ARGI_COMPLEXOBJ:
-
-                       /* Need a buffer or package */
-
-                       if (((*stack_ptr)->common.type != ACPI_TYPE_BUFFER) &&
-                               ((*stack_ptr)->common.type != ACPI_TYPE_PACKAGE)) {
-                               return (AE_AML_OPERAND_TYPE);
-                       }
-                       goto next_operand;
-                       break;
-
-
-               default:
-
-                       /* Unknown type */
-
-                       return (AE_BAD_PARAMETER);
-               }
-
-
-               /*
-                * Make sure that the original object was resolved to the
-                * required object type (Simple cases only).
-                */
-               status = acpi_aml_check_object_type (type_needed,
-                                 (*stack_ptr)->common.type, *stack_ptr);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-
-next_operand:
-               /*
-                * If more operands needed, decrement Stack_ptr to point
-                * to next operand on stack
-                */
-               if (GET_CURRENT_ARG_TYPE (arg_types)) {
-                       stack_ptr--;
-               }
-
-       }   /* while (*Types) */
-
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amstore.c b/reactos/drivers/bus/acpi/executer/amstore.c
deleted file mode 100644 (file)
index 136373a..0000000
+++ /dev/null
@@ -1,563 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amstore - AML Interpreter object store support
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amstore")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exec_store
- *
- * PARAMETERS:  *Val_desc           - Value to be stored
- *              *Dest_desc          - Where to store it 0 Must be (ACPI_HANDLE)
- *                                    or an ACPI_OPERAND_OBJECT  of type
- *                                    Reference; if the latter the descriptor
- *                                    will be either reused or deleted.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Store the value described by Val_desc into the location
- *              described by Dest_desc. Called by various interpreter
- *              functions to store the result of an operation into
- *              the destination operand.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_exec_store (
-       ACPI_OPERAND_OBJECT     *val_desc,
-       ACPI_OPERAND_OBJECT     *dest_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OPERAND_OBJECT     *ref_desc = dest_desc;
-
-
-       /* Validate parameters */
-
-       if (!val_desc || !dest_desc) {
-               return (AE_AML_NO_OPERAND);
-       }
-
-       /* Dest_desc can be either a namespace node or an ACPI object */
-
-       if (VALID_DESCRIPTOR_TYPE (dest_desc, ACPI_DESC_TYPE_NAMED)) {
-               /*
-                * Dest is a namespace node,
-                * Storing an object into a Name "container"
-                */
-               status = acpi_aml_store_object_to_node (val_desc,
-                                (ACPI_NAMESPACE_NODE *) dest_desc, walk_state);
-
-               /* All done, that's it */
-
-               return (status);
-       }
-
-
-       /* Destination object must be an object of type Reference */
-
-       if (dest_desc->common.type != INTERNAL_TYPE_REFERENCE) {
-               /* Destination is not an Reference */
-
-               return (AE_AML_OPERAND_TYPE);
-       }
-
-
-       /*
-        * Examine the Reference opcode.  These cases are handled:
-        *
-        * 1) Store to Name (Change the object associated with a name)
-        * 2) Store to an indexed area of a Buffer or Package
-        * 3) Store to a Method Local or Arg
-        * 4) Store to the debug object
-        * 5) Store to a constant -- a noop
-        */
-
-       switch (ref_desc->reference.opcode) {
-
-       case AML_NAME_OP:
-
-               /* Storing an object into a Name "container" */
-
-               status = acpi_aml_store_object_to_node (val_desc, ref_desc->reference.object,
-                                 walk_state);
-               break;
-
-
-       case AML_INDEX_OP:
-
-               /* Storing to an Index (pointer into a packager or buffer) */
-
-               status = acpi_aml_store_object_to_index (val_desc, ref_desc, walk_state);
-               break;
-
-
-       case AML_LOCAL_OP:
-       case AML_ARG_OP:
-
-               /* Store to a method local/arg  */
-
-               status = acpi_ds_store_object_to_local (ref_desc->reference.opcode,
-                                 ref_desc->reference.offset, val_desc, walk_state);
-               break;
-
-
-       case AML_DEBUG_OP:
-
-               /*
-                * Storing to the Debug object causes the value stored to be
-                * displayed and otherwise has no effect -- see ACPI Specification
-                *
-                * TBD: print known object types "prettier".
-                */
-
-               break;
-
-
-       case AML_ZERO_OP:
-       case AML_ONE_OP:
-       case AML_ONES_OP:
-
-               /*
-                * Storing to a constant is a no-op -- see ACPI Specification
-                * Delete the reference descriptor, however
-                */
-               break;
-
-
-       default:
-
-               /* TBD: [Restructure] use object dump routine !! */
-
-               status = AE_AML_INTERNAL;
-               break;
-
-       }   /* switch (Ref_desc->Reference.Opcode) */
-
-
-       /* Always delete the reference descriptor object */
-
-       if (ref_desc) {
-               acpi_cm_remove_reference (ref_desc);
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_store_object_to_index
- *
- * PARAMETERS:  *Val_desc           - Value to be stored
- *              *Node               - Named object to receive the value
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Store the object to the named object.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_store_object_to_index (
-       ACPI_OPERAND_OBJECT     *val_desc,
-       ACPI_OPERAND_OBJECT     *dest_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       u32                     length;
-       u32                     i;
-       u8                      value = 0;
-
-
-       /*
-        * Destination must be a reference pointer, and
-        * must point to either a buffer or a package
-        */
-
-       switch (dest_desc->reference.target_type) {
-       case ACPI_TYPE_PACKAGE:
-               /*
-                * Storing to a package element is not simple.  The source must be
-                * evaluated and converted to the type of the destination and then the
-                * source is copied into the destination - we can't just point to the
-                * source object.
-                */
-               if (dest_desc->reference.target_type == ACPI_TYPE_PACKAGE) {
-                       /*
-                        * The object at *(Dest_desc->Reference.Where) is the
-                        *  element within the package that is to be modified.
-                        */
-                       obj_desc = *(dest_desc->reference.where);
-                       if (obj_desc) {
-                               /*
-                                * If the Destination element is a package, we will delete
-                                *  that object and construct a new one.
-                                *
-                                * TBD: [Investigate] Should both the src and dest be required
-                                *      to be packages?
-                                *       && (Val_desc->Common.Type == ACPI_TYPE_PACKAGE)
-                                */
-                               if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
-                                       /*
-                                        * Take away the reference for being part of a package and
-                                        * delete
-                                        */
-                                       acpi_cm_remove_reference (obj_desc);
-                                       acpi_cm_remove_reference (obj_desc);
-
-                                       obj_desc = NULL;
-                               }
-                       }
-
-                       if (!obj_desc) {
-                               /*
-                                * If the Obj_desc is NULL, it means that an uninitialized package
-                                * element has been used as a destination (this is OK), therefore,
-                                * we must create the destination element to match the type of the
-                                * source element NOTE: Val_desc can be of any type.
-                                */
-                               obj_desc = acpi_cm_create_internal_object (val_desc->common.type);
-                               if (!obj_desc) {
-                                       return (AE_NO_MEMORY);
-                               }
-
-                               /*
-                                * If the source is a package, copy the source to the new dest
-                                */
-                               if (ACPI_TYPE_PACKAGE == obj_desc->common.type) {
-                                       status = acpi_cm_copy_ipackage_to_ipackage (val_desc, obj_desc, walk_state);
-                                       if (ACPI_FAILURE (status)) {
-                                               acpi_cm_remove_reference (obj_desc);
-                                               return (status);
-                                       }
-                               }
-
-                               /*
-                                * Install the new descriptor into the package and add a
-                                * reference to the newly created descriptor for now being
-                                * part of the parent package
-                                */
-
-                               *(dest_desc->reference.where) = obj_desc;
-                               acpi_cm_add_reference (obj_desc);
-                       }
-
-                       if (ACPI_TYPE_PACKAGE != obj_desc->common.type) {
-                               /*
-                                * The destination element is not a package, so we need to
-                                * convert the contents of the source (Val_desc) and copy into
-                                * the destination (Obj_desc)
-                                */
-                               status = acpi_aml_store_object_to_object (val_desc, obj_desc,
-                                                 walk_state);
-                               if (ACPI_FAILURE (status)) {
-                                       /*
-                                        * An error occurrered when copying the internal object
-                                        * so delete the reference.
-                                        */
-                                       return (AE_AML_OPERAND_TYPE);
-                               }
-                       }
-               }
-               break;
-
-
-       case ACPI_TYPE_BUFFER_FIELD:
-               /*
-                * Storing into a buffer at a location defined by an Index.
-                *
-                * Each 8-bit element of the source object is written to the
-                * 8-bit Buffer Field of the Index destination object.
-                */
-
-               /*
-                * Set the Obj_desc to the destination object and type check.
-                */
-               obj_desc = dest_desc->reference.object;
-               if (obj_desc->common.type != ACPI_TYPE_BUFFER) {
-                       return (AE_AML_OPERAND_TYPE);
-               }
-
-               /*
-                * The assignment of the individual elements will be slightly
-                * different for each source type.
-                */
-
-               switch (val_desc->common.type) {
-               /*
-                * If the type is Integer, assign bytewise
-                * This loop to assign each of the elements is somewhat
-                * backward because of the Big Endian-ness of IA-64
-                */
-               case ACPI_TYPE_INTEGER:
-                       length = sizeof (ACPI_INTEGER);
-                       for (i = length; i != 0; i--) {
-                               value = (u8)(val_desc->integer.value >> (MUL_8 (i - 1)));
-                               obj_desc->buffer.pointer[dest_desc->reference.offset] = value;
-                       }
-                       break;
-
-               /*
-                * If the type is Buffer, the Length is in the structure.
-                * Just loop through the elements and assign each one in turn.
-                */
-               case ACPI_TYPE_BUFFER:
-                       length = val_desc->buffer.length;
-                       for (i = 0; i < length; i++) {
-                               value = *(val_desc->buffer.pointer + i);
-                               obj_desc->buffer.pointer[dest_desc->reference.offset] = value;
-                       }
-                       break;
-
-               /*
-                * If the type is String, the Length is in the structure.
-                * Just loop through the elements and assign each one in turn.
-                */
-               case ACPI_TYPE_STRING:
-                       length = val_desc->string.length;
-                       for (i = 0; i < length; i++) {
-                               value = *(val_desc->string.pointer + i);
-                               obj_desc->buffer.pointer[dest_desc->reference.offset] = value;
-                       }
-                       break;
-
-               /*
-                * If source is not a valid type so return an error.
-                */
-               default:
-                       status = AE_AML_OPERAND_TYPE;
-                       break;
-               }
-               break;
-
-
-       default:
-               status = AE_AML_OPERAND_TYPE;
-               break;
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_store_object_to_node
- *
- * PARAMETERS:  *Source_desc           - Value to be stored
- *              *Node                  - Named object to receive the value
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Store the object to the named object.
- *
- *              The Assignment of an object to a named object is handled here
- *              The val passed in will replace the current value (if any)
- *              with the input value.
- *
- *              When storing into an object the data is converted to the
- *              target object type then stored in the object.  This means
- *              that the target object type (for an initialized target) will
- *              not be changed by a store operation.
- *
- *              NOTE: the global lock is acquired early.  This will result
- *              in the global lock being held a bit longer.  Also, if the
- *              function fails during set up we may get the lock when we
- *              don't really need it.  I don't think we care.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_store_object_to_node (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OPERAND_OBJECT     *target_desc;
-       OBJECT_TYPE_INTERNAL    target_type = ACPI_TYPE_ANY;
-
-
-       /*
-        * Assuming the parameters were already validated
-        */
-       ACPI_ASSERT((node) && (source_desc));
-
-
-       /*
-        * Get current type of the node, and object attached to Node
-        */
-       target_type = acpi_ns_get_type (node);
-       target_desc = acpi_ns_get_attached_object (node);
-
-
-       /*
-        * Resolve the source object to an actual value
-        * (If it is a reference object)
-        */
-       status = acpi_aml_resolve_object (&source_desc, target_type, walk_state);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /*
-        * Do the actual store operation
-        */
-       switch (target_type) {
-       case INTERNAL_TYPE_DEF_FIELD:
-
-               /* Raw data copy for target types Integer/String/Buffer */
-
-               status = acpi_aml_copy_data_to_named_field (source_desc, node);
-               break;
-
-
-       case ACPI_TYPE_INTEGER:
-       case ACPI_TYPE_STRING:
-       case ACPI_TYPE_BUFFER:
-       case INTERNAL_TYPE_BANK_FIELD:
-       case INTERNAL_TYPE_INDEX_FIELD:
-       case ACPI_TYPE_FIELD_UNIT:
-
-               /*
-                * These target types are all of type Integer/String/Buffer, and
-                * therefore support implicit conversion before the store.
-                *
-                * Copy and/or convert the source object to a new target object
-                */
-               status = acpi_aml_store_object (source_desc, target_type, &target_desc, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /*
-                * Store the new Target_desc as the new value of the Name, and set
-                * the Name's type to that of the value being stored in it.
-                * Source_desc reference count is incremented by Attach_object.
-                */
-               status = acpi_ns_attach_object (node, target_desc, target_type);
-               break;
-
-
-       default:
-
-               /* No conversions for all other types.  Just attach the source object */
-
-               status = acpi_ns_attach_object (node, source_desc, source_desc->common.type);
-
-               break;
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_store_object_to_object
- *
- * PARAMETERS:  *Source_desc           - Value to be stored
- *              *Dest_desc          - Object to receive the value
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Store an object to another object.
- *
- *              The Assignment of an object to another (not named) object
- *              is handled here.
- *              The val passed in will replace the current value (if any)
- *              with the input value.
- *
- *              When storing into an object the data is converted to the
- *              target object type then stored in the object.  This means
- *              that the target object type (for an initialized target) will
- *              not be changed by a store operation.
- *
- *              This module allows destination types of Number, String,
- *              and Buffer.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_store_object_to_object (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *dest_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-       OBJECT_TYPE_INTERNAL    destination_type = dest_desc->common.type;
-
-
-       /*
-        *  Assuming the parameters are valid!
-        */
-       ACPI_ASSERT((dest_desc) && (source_desc));
-
-
-       /*
-        * From this interface, we only support Integers/Strings/Buffers
-        */
-       switch (destination_type) {
-       case ACPI_TYPE_INTEGER:
-       case ACPI_TYPE_STRING:
-       case ACPI_TYPE_BUFFER:
-               break;
-
-       default:
-               return (AE_NOT_IMPLEMENTED);
-       }
-
-
-       /*
-        * Resolve the source object to an actual value
-        * (If it is a reference object)
-        */
-       status = acpi_aml_resolve_object (&source_desc, destination_type, walk_state);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /*
-        * Copy and/or convert the source object to the destination object
-        */
-       status = acpi_aml_store_object (source_desc, destination_type, &dest_desc, walk_state);
-
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/executer/amstoren.c b/reactos/drivers/bus/acpi/executer/amstoren.c
deleted file mode 100644 (file)
index aacf99e..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amstoren - AML Interpreter object store support,
- *                        Store to Node (namespace object)
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amstoren")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_resolve_object
- *
- * PARAMETERS:  Source_desc_ptr     - Pointer to the source object
- *              Target_type         - Current type of the target
- *              Walk_state          - Current walk state
- *
- * RETURN:      Status, resolved object in Source_desc_ptr.
- *
- * DESCRIPTION: Resolve an object.  If the object is a reference, dereference
- *              it and return the actual object in the Source_desc_ptr.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_resolve_object (
-       ACPI_OPERAND_OBJECT     **source_desc_ptr,
-       OBJECT_TYPE_INTERNAL    target_type,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *source_desc = *source_desc_ptr;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /*
-        * Ensure we have a Source that can be stored in the target
-        */
-       switch (target_type) {
-
-       /* This case handles the "interchangeable" types Integer, String, and Buffer. */
-
-       /*
-        * These cases all require only Integers or values that
-        * can be converted to Integers (Strings or Buffers)
-        */
-       case ACPI_TYPE_INTEGER:
-       case ACPI_TYPE_FIELD_UNIT:
-       case INTERNAL_TYPE_BANK_FIELD:
-       case INTERNAL_TYPE_INDEX_FIELD:
-
-       /*
-        * Stores into a Field/Region or into a Buffer/String
-        * are all essentially the same.
-        */
-       case ACPI_TYPE_STRING:
-       case ACPI_TYPE_BUFFER:
-       case INTERNAL_TYPE_DEF_FIELD:
-
-               /*
-                * If Source_desc is not a valid type, try to resolve it to one.
-                */
-               if ((source_desc->common.type != ACPI_TYPE_INTEGER)    &&
-                       (source_desc->common.type != ACPI_TYPE_BUFFER)     &&
-                       (source_desc->common.type != ACPI_TYPE_STRING)) {
-                       /*
-                        * Initially not a valid type, convert
-                        */
-                       status = acpi_aml_resolve_to_value (source_desc_ptr, walk_state);
-                       if (ACPI_SUCCESS (status) &&
-                               (source_desc->common.type != ACPI_TYPE_INTEGER)    &&
-                               (source_desc->common.type != ACPI_TYPE_BUFFER)     &&
-                               (source_desc->common.type != ACPI_TYPE_STRING)) {
-                               /*
-                                * Conversion successful but still not a valid type
-                                */
-                               status = AE_AML_OPERAND_TYPE;
-                       }
-               }
-               break;
-
-
-       case INTERNAL_TYPE_ALIAS:
-
-               /*
-                * Aliases are resolved by Acpi_aml_prep_operands
-                */
-               status = AE_AML_INTERNAL;
-               break;
-
-
-       case ACPI_TYPE_PACKAGE:
-       default:
-
-               /*
-                * All other types than Alias and the various Fields come here,
-                * including the untyped case - ACPI_TYPE_ANY.
-                */
-               break;
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_store_object
- *
- * PARAMETERS:  Source_desc         - Object to store
- *              Target_type         - Current type of the target
- *              Target_desc_ptr     - Pointer to the target
- *              Walk_state          - Current walk state
- *
- * RETURN:      Status
- *
- * DESCRIPTION: "Store" an object to another object.  This may include
- *              converting the source type to the target type (implicit
- *              conversion), and a copy of the value of the source to
- *              the target.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_store_object (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       OBJECT_TYPE_INTERNAL    target_type,
-       ACPI_OPERAND_OBJECT     **target_desc_ptr,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_OPERAND_OBJECT     *target_desc = *target_desc_ptr;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /*
-        * Perform the "implicit conversion" of the source to the current type
-        * of the target - As per the ACPI specification.
-        *
-        * If no conversion performed, Source_desc is left alone, otherwise it
-        * is updated with a new object.
-        */
-       status = acpi_aml_convert_to_target_type (target_type, &source_desc, walk_state);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * We now have two objects of identical types, and we can perform a
-        * copy of the *value* of the source object.
-        */
-       switch (target_type) {
-       case ACPI_TYPE_ANY:
-       case INTERNAL_TYPE_DEF_ANY:
-
-               /*
-                * The target namespace node is uninitialized (has no target object),
-                * and will take on the type of the source object
-                */
-
-               *target_desc_ptr = source_desc;
-               break;
-
-
-       case ACPI_TYPE_INTEGER:
-
-               target_desc->integer.value = source_desc->integer.value;
-
-               /* Truncate value if we are executing from a 32-bit ACPI table */
-
-               acpi_aml_truncate_for32bit_table (target_desc, walk_state);
-               break;
-
-
-       case ACPI_TYPE_FIELD_UNIT:
-
-               status = acpi_aml_copy_integer_to_field_unit (source_desc, target_desc);
-               break;
-
-
-       case INTERNAL_TYPE_BANK_FIELD:
-
-               status = acpi_aml_copy_integer_to_bank_field (source_desc, target_desc);
-               break;
-
-
-       case INTERNAL_TYPE_INDEX_FIELD:
-
-               status = acpi_aml_copy_integer_to_index_field (source_desc, target_desc);
-               break;
-
-
-       case ACPI_TYPE_STRING:
-
-               status = acpi_aml_copy_string_to_string (source_desc, target_desc);
-               break;
-
-
-       case ACPI_TYPE_BUFFER:
-
-               status = acpi_aml_copy_buffer_to_buffer (source_desc, target_desc);
-               break;
-
-
-       case ACPI_TYPE_PACKAGE:
-
-               /*
-                * TBD: [Unhandled] Not real sure what to do here
-                */
-               status = AE_NOT_IMPLEMENTED;
-               break;
-
-
-       default:
-
-               /*
-                * All other types come here.
-                */
-               status = AE_NOT_IMPLEMENTED;
-               break;
-       }
-
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amstorob.c b/reactos/drivers/bus/acpi/executer/amstorob.c
deleted file mode 100644 (file)
index a0d25c7..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amstorob - AML Interpreter object store support, store to object
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amstorob")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_copy_buffer_to_buffer
- *
- * PARAMETERS:  Source_desc         - Source object to copy
- *              Target_desc         - Destination object of the copy
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Copy a buffer object to another buffer object.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_copy_buffer_to_buffer (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc)
-{
-       u32                     length;
-       u8                      *buffer;
-
-
-       /*
-        * We know that Source_desc is a buffer by now
-        */
-       buffer = (u8 *) source_desc->buffer.pointer;
-       length = source_desc->buffer.length;
-
-       /*
-        * If target is a buffer of length zero, allocate a new
-        * buffer of the proper length
-        */
-       if (target_desc->buffer.length == 0) {
-               target_desc->buffer.pointer = acpi_cm_allocate (length);
-               if (!target_desc->buffer.pointer) {
-                       return (AE_NO_MEMORY);
-               }
-
-               target_desc->buffer.length = length;
-       }
-
-       /*
-        * Buffer is a static allocation,
-        * only place what will fit in the buffer.
-        */
-       if (length <= target_desc->buffer.length) {
-               /* Clear existing buffer and copy in the new one */
-
-               MEMSET(target_desc->buffer.pointer, 0, target_desc->buffer.length);
-               MEMCPY(target_desc->buffer.pointer, buffer, length);
-       }
-
-       else {
-               /*
-                * Truncate the source, copy only what will fit
-                */
-               MEMCPY(target_desc->buffer.pointer, buffer, target_desc->buffer.length);
-
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_copy_string_to_string
- *
- * PARAMETERS:  Source_desc         - Source object to copy
- *              Target_desc         - Destination object of the copy
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Copy a String object to another String object
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_copy_string_to_string (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc)
-{
-       u32                     length;
-       u8                      *buffer;
-
-
-       /*
-        * We know that Source_desc is a string by now.
-        */
-       buffer = (u8 *) source_desc->string.pointer;
-       length = source_desc->string.length;
-
-       /*
-        * Setting a string value replaces the old string
-        */
-       if (length < target_desc->string.length) {
-               /* Clear old string and copy in the new one */
-
-               MEMSET(target_desc->string.pointer, 0, target_desc->string.length);
-               MEMCPY(target_desc->string.pointer, buffer, length);
-       }
-
-       else {
-               /*
-                * Free the current buffer, then allocate a buffer
-                * large enough to hold the value
-                */
-               if (target_desc->string.pointer &&
-                       !acpi_tb_system_table_pointer (target_desc->string.pointer)) {
-                       /*
-                        * Only free if not a pointer into the DSDT
-                        */
-                       acpi_cm_free(target_desc->string.pointer);
-               }
-
-               target_desc->string.pointer = acpi_cm_allocate (length + 1);
-               if (!target_desc->string.pointer) {
-                       return (AE_NO_MEMORY);
-               }
-               target_desc->string.length = length;
-
-
-               MEMCPY(target_desc->string.pointer, buffer, length);
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_copy_integer_to_index_field
- *
- * PARAMETERS:  Source_desc         - Source object to copy
- *              Target_desc         - Destination object of the copy
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Write an Integer to an Index Field
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_copy_integer_to_index_field (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc)
-{
-       ACPI_STATUS             status;
-       u8                      locked;
-
-
-       /*
-        * Get the global lock if needed
-        */
-       locked = acpi_aml_acquire_global_lock (target_desc->index_field.lock_rule);
-
-       /*
-        * Set Index value to select proper Data register
-        * perform the update (Set index)
-        */
-       status = acpi_aml_access_named_field (ACPI_WRITE,
-                        target_desc->index_field.index,
-                        &target_desc->index_field.value,
-                        sizeof (target_desc->index_field.value));
-       if (ACPI_SUCCESS (status)) {
-               /* Set_index was successful, next set Data value */
-
-               status = acpi_aml_access_named_field (ACPI_WRITE,
-                                  target_desc->index_field.data,
-                                  &source_desc->integer.value,
-                                  sizeof (source_desc->integer.value));
-
-       }
-
-
-
-       /*
-        * Release global lock if we acquired it earlier
-        */
-       acpi_aml_release_global_lock (locked);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_copy_integer_to_bank_field
- *
- * PARAMETERS:  Source_desc         - Source object to copy
- *              Target_desc         - Destination object of the copy
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Write an Integer to a Bank Field
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_copy_integer_to_bank_field (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc)
-{
-       ACPI_STATUS             status;
-       u8                      locked;
-
-
-       /*
-        * Get the global lock if needed
-        */
-       locked = acpi_aml_acquire_global_lock (target_desc->index_field.lock_rule);
-
-
-       /*
-        * Set Bank value to select proper Bank
-        * Perform the update (Set Bank Select)
-        */
-
-       status = acpi_aml_access_named_field (ACPI_WRITE,
-                        target_desc->bank_field.bank_select,
-                        &target_desc->bank_field.value,
-                        sizeof (target_desc->bank_field.value));
-       if (ACPI_SUCCESS (status)) {
-               /* Set bank select successful, set data value  */
-
-               status = acpi_aml_access_named_field (ACPI_WRITE,
-                                  target_desc->bank_field.bank_select,
-                                  &source_desc->bank_field.value,
-                                  sizeof (source_desc->bank_field.value));
-       }
-
-
-
-       /*
-        * Release global lock if we acquired it earlier
-        */
-       acpi_aml_release_global_lock (locked);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_copy_data_to_named_field
- *
- * PARAMETERS:  Source_desc         - Source object to copy
- *              Node                - Destination Namespace node
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Copy raw data to a Named Field.  No implicit conversion
- *              is performed on the source object
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_copy_data_to_named_field (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_NAMESPACE_NODE     *node)
-{
-       ACPI_STATUS             status;
-       u8                      locked;
-       u32                     length;
-       u8                      *buffer;
-
-
-       /*
-        * Named fields (Create_xxx_field) - We don't perform any conversions on the
-        * source operand, just use the raw data
-        */
-       switch (source_desc->common.type) {
-       case ACPI_TYPE_INTEGER:
-               buffer = (u8 *) &source_desc->integer.value;
-               length = sizeof (source_desc->integer.value);
-               break;
-
-       case ACPI_TYPE_BUFFER:
-               buffer = (u8 *) source_desc->buffer.pointer;
-               length = source_desc->buffer.length;
-               break;
-
-       case ACPI_TYPE_STRING:
-               buffer = (u8 *) source_desc->string.pointer;
-               length = source_desc->string.length;
-               break;
-
-       default:
-               return (AE_TYPE);
-       }
-
-       /*
-        * Get the global lock if needed before the update
-        * TBD: not needed!
-        */
-       locked = acpi_aml_acquire_global_lock (source_desc->field.lock_rule);
-
-       status = acpi_aml_access_named_field (ACPI_WRITE,
-                         node, buffer, length);
-
-       acpi_aml_release_global_lock (locked);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_copy_integer_to_field_unit
- *
- * PARAMETERS:  Source_desc         - Source object to copy
- *              Target_desc         - Destination object of the copy
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Write an Integer to a Field Unit.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_copy_integer_to_field_unit (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc)
-{
-       ACPI_STATUS             status = AE_OK;
-       u8                      *location = NULL;
-       u32                     mask;
-       u32                     new_value;
-       u8                      locked = FALSE;
-
-
-       /*
-        * If the Field Buffer and Index have not been previously evaluated,
-        * evaluate them and save the results.
-        */
-       if (!(target_desc->common.flags & AOPOBJ_DATA_VALID)) {
-               status = acpi_ds_get_field_unit_arguments (target_desc);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       if ((!target_desc->field_unit.container ||
-               ACPI_TYPE_BUFFER != target_desc->field_unit.container->common.type)) {
-               return (AE_AML_INTERNAL);
-       }
-
-       /*
-        * Get the global lock if needed
-        */
-       locked = acpi_aml_acquire_global_lock (target_desc->field_unit.lock_rule);
-
-       /*
-        * TBD: [Unhandled] REMOVE this limitation
-        * Make sure the operation is within the limits of our implementation
-        * this is not a Spec limitation!!
-        */
-       if (target_desc->field_unit.length + target_desc->field_unit.bit_offset > 32) {
-               return (AE_NOT_IMPLEMENTED);
-       }
-
-       /* Field location is (base of buffer) + (byte offset) */
-
-       location = target_desc->field_unit.container->buffer.pointer
-                         + target_desc->field_unit.offset;
-
-       /*
-        * Construct Mask with 1 bits where the field is,
-        * 0 bits elsewhere
-        */
-       mask = ((u32) 1 << target_desc->field_unit.length) - ((u32)1
-                          << target_desc->field_unit.bit_offset);
-
-       /* Zero out the field in the buffer */
-
-       MOVE_UNALIGNED32_TO_32 (&new_value, location);
-       new_value &= ~mask;
-
-       /*
-        * Shift and mask the new value into position,
-        * and or it into the buffer.
-        */
-       new_value |= (source_desc->integer.value << target_desc->field_unit.bit_offset) &
-                        mask;
-
-       /* Store back the value */
-
-       MOVE_UNALIGNED32_TO_32 (location, &new_value);
-
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amsystem.c b/reactos/drivers/bus/acpi/executer/amsystem.c
deleted file mode 100644 (file)
index aff8688..0000000
+++ /dev/null
@@ -1,323 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amsystem - Interface to OS services
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amsystem")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_wait_semaphore
- *
- * PARAMETERS:  Semaphore           - OSD semaphore to wait on
- *              Timeout             - Max time to wait
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Implements a semaphore wait with a check to see if the
- *              semaphore is available immediately.  If it is not, the
- *              interpreter is released.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_system_wait_semaphore (
-       ACPI_HANDLE             semaphore,
-       u32                     timeout)
-{
-       ACPI_STATUS             status;
-
-
-       status = acpi_os_wait_semaphore (semaphore, 1, 0);
-       if (ACPI_SUCCESS (status)) {
-               return (status);
-       }
-
-       if (status == AE_TIME) {
-               /* We must wait, so unlock the interpreter */
-
-               acpi_aml_exit_interpreter ();
-
-               status = acpi_os_wait_semaphore (semaphore, 1, timeout);
-
-               /* Reacquire the interpreter */
-
-               status = acpi_aml_enter_interpreter ();
-               if (ACPI_SUCCESS (status)) {
-                       /* Restore the timeout exception */
-
-                       status = AE_TIME;
-               }
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_do_stall
- *
- * PARAMETERS:  How_long            - The amount of time to stall
- *
- * RETURN:      None
- *
- * DESCRIPTION: Suspend running thread for specified amount of time.
- *
- ******************************************************************************/
-
-void
-acpi_aml_system_do_stall (
-       u32                     how_long)
-{
-
-       if (how_long > 1000) /* 1 millisecond */ {
-               /* Since this thread will sleep, we must release the interpreter */
-
-               acpi_aml_exit_interpreter ();
-
-               acpi_os_sleep_usec (how_long);
-
-               /* And now we must get the interpreter again */
-
-               acpi_aml_enter_interpreter ();
-       }
-
-       else {
-               acpi_os_sleep_usec (how_long);
-       }
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_do_suspend
- *
- * PARAMETERS:  How_long            - The amount of time to suspend
- *
- * RETURN:      None
- *
- * DESCRIPTION: Suspend running thread for specified amount of time.
- *
- ******************************************************************************/
-
-void
-acpi_aml_system_do_suspend (
-       u32                     how_long)
-{
-       /* Since this thread will sleep, we must release the interpreter */
-
-       acpi_aml_exit_interpreter ();
-
-       acpi_os_sleep ((u16) (how_long / (u32) 1000),
-                         (u16) (how_long % (u32) 1000));
-
-       /* And now we must get the interpreter again */
-
-       acpi_aml_enter_interpreter ();
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_acquire_mutex
- *
- * PARAMETERS:  *Time_desc          - The 'time to delay' object descriptor
- *              *Obj_desc           - The object descriptor for this op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Provides an access point to perform synchronization operations
- *              within the AML.  This function will cause a lock to be generated
- *              for the Mutex pointed to by Obj_desc.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_system_acquire_mutex (
-       ACPI_OPERAND_OBJECT     *time_desc,
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (!obj_desc) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Support for the _GL_ Mutex object -- go get the global lock
-        */
-
-       if (obj_desc->mutex.semaphore == acpi_gbl_global_lock_semaphore) {
-               status = acpi_ev_acquire_global_lock ();
-               return (status);
-       }
-
-       status = acpi_aml_system_wait_semaphore (obj_desc->mutex.semaphore,
-                         (u32) time_desc->integer.value);
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_release_mutex
- *
- * PARAMETERS:  *Obj_desc           - The object descriptor for this op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Provides an access point to perform synchronization operations
- *              within the AML.  This operation is a request to release a
- *              previously acquired Mutex.  If the Mutex variable is set then
- *              it will be decremented.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_system_release_mutex (
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (!obj_desc) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Support for the _GL_ Mutex object -- release the global lock
-        */
-       if (obj_desc->mutex.semaphore == acpi_gbl_global_lock_semaphore) {
-               acpi_ev_release_global_lock ();
-               return (AE_OK);
-       }
-
-       status = acpi_os_signal_semaphore (obj_desc->mutex.semaphore, 1);
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_signal_event
- *
- * PARAMETERS:  *Obj_desc           - The object descriptor for this op
- *
- * RETURN:      AE_OK
- *
- * DESCRIPTION: Provides an access point to perform synchronization operations
- *              within the AML.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_system_signal_event (
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (obj_desc) {
-               status = acpi_os_signal_semaphore (obj_desc->event.semaphore, 1);
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_wait_event
- *
- * PARAMETERS:  *Time_desc          - The 'time to delay' object descriptor
- *              *Obj_desc           - The object descriptor for this op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Provides an access point to perform synchronization operations
- *              within the AML.  This operation is a request to wait for an
- *              event.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_system_wait_event (
-       ACPI_OPERAND_OBJECT     *time_desc,
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (obj_desc) {
-               status = acpi_aml_system_wait_semaphore (obj_desc->event.semaphore,
-                                 (u32) time_desc->integer.value);
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_system_reset_event
- *
- * PARAMETERS:  *Obj_desc           - The object descriptor for this op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Reset an event to a known state.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_system_reset_event (
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-       ACPI_STATUS             status = AE_OK;
-       void                    *temp_semaphore;
-
-
-       /*
-        * We are going to simply delete the existing semaphore and
-        * create a new one!
-        */
-
-       status = acpi_os_create_semaphore (ACPI_NO_UNIT_LIMIT, 0, &temp_semaphore);
-       if (ACPI_SUCCESS (status)) {
-               acpi_os_delete_semaphore (obj_desc->event.semaphore);
-               obj_desc->event.semaphore = temp_semaphore;
-       }
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/executer/amutils.c b/reactos/drivers/bus/acpi/executer/amutils.c
deleted file mode 100644 (file)
index 28333f8..0000000
+++ /dev/null
@@ -1,359 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amutils - interpreter/scanner utilities
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amutils")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_enter_interpreter
- *
- * PARAMETERS:  None
- *
- * DESCRIPTION: Enter the interpreter execution region
- *              TBD: should be a macro
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_enter_interpreter (void)
-{
-       ACPI_STATUS             status;
-
-
-       status = acpi_cm_acquire_mutex (ACPI_MTX_EXECUTE);
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_exit_interpreter
- *
- * PARAMETERS:  None
- *
- * DESCRIPTION: Exit the interpreter execution region
- *
- * Cases where the interpreter is unlocked:
- *      1) Completion of the execution of a control method
- *      2) Method blocked on a Sleep() AML opcode
- *      3) Method blocked on an Acquire() AML opcode
- *      4) Method blocked on a Wait() AML opcode
- *      5) Method blocked to acquire the global lock
- *      6) Method blocked to execute a serialized control method that is
- *          already executing
- *      7) About to invoke a user-installed opregion handler
- *
- *              TBD: should be a macro
- *
- ******************************************************************************/
-
-void
-acpi_aml_exit_interpreter (void)
-{
-
-       acpi_cm_release_mutex (ACPI_MTX_EXECUTE);
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_validate_object_type
- *
- * PARAMETERS:  Type            Object type to validate
- *
- * DESCRIPTION: Determine if a type is a valid ACPI object type
- *
- ******************************************************************************/
-
-u8
-acpi_aml_validate_object_type (
-       ACPI_OBJECT_TYPE        type)
-{
-
-       if ((type > ACPI_TYPE_MAX && type < INTERNAL_TYPE_BEGIN) ||
-               (type > INTERNAL_TYPE_MAX)) {
-               return (FALSE);
-       }
-
-       return (TRUE);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_truncate_for32bit_table
- *
- * PARAMETERS:  Obj_desc        - Object to be truncated
- *              Walk_state      - Current walk state
- *                                (A method must be executing)
- *
- * RETURN:      none
- *
- * DESCRIPTION: Truncate a number to 32-bits if the currently executing method
- *              belongs to a 32-bit ACPI table.
- *
- ******************************************************************************/
-
-void
-acpi_aml_truncate_for32bit_table (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_WALK_STATE         *walk_state)
-{
-
-       /*
-        * Object must be a valid number and we must be executing
-        * a control method
-        */
-
-       if ((!obj_desc) ||
-               (obj_desc->common.type != ACPI_TYPE_INTEGER) ||
-               (!walk_state->method_node)) {
-               return;
-       }
-
-       if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) {
-               /*
-                * We are running a method that exists in a 32-bit ACPI table.
-                * Truncate the value to 32 bits by zeroing out the upper 32-bit field
-                */
-               obj_desc->integer.value &= (ACPI_INTEGER) ACPI_UINT32_MAX;
-       }
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_acquire_global_lock
- *
- * PARAMETERS:  Rule            - Lock rule: Always_lock, Never_lock
- *
- * RETURN:      TRUE/FALSE indicating whether the lock was actually acquired
- *
- * DESCRIPTION: Obtain the global lock and keep track of this fact via two
- *              methods.  A global variable keeps the state of the lock, and
- *              the state is returned to the caller.
- *
- ******************************************************************************/
-
-u8
-acpi_aml_acquire_global_lock (
-       u32                     rule)
-{
-       u8                      locked = FALSE;
-       ACPI_STATUS             status;
-
-
-       /* Only attempt lock if the Rule says so */
-
-       if (rule == (u32) GLOCK_ALWAYS_LOCK) {
-               /* We should attempt to get the lock */
-
-               status = acpi_ev_acquire_global_lock ();
-               if (ACPI_SUCCESS (status)) {
-                       locked = TRUE;
-               }
-
-       }
-
-       return (locked);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_release_global_lock
- *
- * PARAMETERS:  Locked_by_me    - Return value from corresponding call to
- *                                Acquire_global_lock.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Release the global lock if it is locked.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_release_global_lock (
-       u8                      locked_by_me)
-{
-
-
-       /* Only attempt unlock if the caller locked it */
-
-       if (locked_by_me) {
-               /* OK, now release the lock */
-
-               acpi_ev_release_global_lock ();
-       }
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_digits_needed
- *
- * PARAMETERS:  val             - Value to be represented
- *              base            - Base of representation
- *
- * RETURN:      the number of digits needed to represent val in base
- *
- ******************************************************************************/
-
-u32
-acpi_aml_digits_needed (
-       ACPI_INTEGER            val,
-       u32                     base)
-{
-       u32                     num_digits = 0;
-
-
-       if (base < 1) {
-               REPORT_ERROR (("Aml_digits_needed: Internal error - Invalid base\n"));
-       }
-
-       else {
-               for (num_digits = 1; (val = ACPI_DIVIDE (val,base)); ++num_digits) { ; }
-       }
-
-       return (num_digits);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    ntohl
- *
- * PARAMETERS:  Value           - Value to be converted
- *
- * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes)
- *
- ******************************************************************************/
-
-static u32
-_ntohl (
-       u32                     value)
-{
-       union {
-               u32                 value;
-               u8                  bytes[4];
-       } out;
-
-       union {
-               u32                 value;
-               u8                  bytes[4];
-       } in;
-
-
-       in.value = value;
-
-       out.bytes[0] = in.bytes[3];
-       out.bytes[1] = in.bytes[2];
-       out.bytes[2] = in.bytes[1];
-       out.bytes[3] = in.bytes[0];
-
-       return (out.value);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_eisa_id_to_string
- *
- * PARAMETERS:  Numeric_id      - EISA ID to be converted
- *              Out_string      - Where to put the converted string (8 bytes)
- *
- * DESCRIPTION: Convert a numeric EISA ID to string representation
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_eisa_id_to_string (
-       u32                     numeric_id,
-       NATIVE_CHAR             *out_string)
-{
-       u32                     id;
-
-       /* swap to big-endian to get contiguous bits */
-
-       id = _ntohl (numeric_id);
-
-       out_string[0] = (char) ('@' + ((id >> 26) & 0x1f));
-       out_string[1] = (char) ('@' + ((id >> 21) & 0x1f));
-       out_string[2] = (char) ('@' + ((id >> 16) & 0x1f));
-       out_string[3] = acpi_gbl_hex_to_ascii[(id >> 12) & 0xf];
-       out_string[4] = acpi_gbl_hex_to_ascii[(id >> 8) & 0xf];
-       out_string[5] = acpi_gbl_hex_to_ascii[(id >> 4) & 0xf];
-       out_string[6] = acpi_gbl_hex_to_ascii[id & 0xf];
-       out_string[7] = 0;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_unsigned_integer_to_string
- *
- * PARAMETERS:  Value           - Value to be converted
- *              Out_string      - Where to put the converted string (8 bytes)
- *
- * RETURN:      Convert a number to string representation
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_unsigned_integer_to_string (
-       ACPI_INTEGER            value,
-       NATIVE_CHAR             *out_string)
-{
-       u32                     count;
-       u32                     digits_needed;
-
-
-       digits_needed = acpi_aml_digits_needed (value, 10);
-
-       out_string[digits_needed] = '\0';
-
-       for (count = digits_needed; count > 0; count--) {
-               out_string[count-1] = (NATIVE_CHAR) ('0' + (ACPI_MODULO (value, 10)));
-               value = ACPI_DIVIDE (value, 10);
-       }
-
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/executer/amxface.c b/reactos/drivers/bus/acpi/executer/amxface.c
deleted file mode 100644 (file)
index 7ce20dd..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: amxface - External interpreter interfaces
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT          ACPI_EXECUTER
-        MODULE_NAME         ("amxface")
-
-
-/*
- * DEFINE_AML_GLOBALS is tested in amlcode.h
- * to determine whether certain global names should be "defined" or only
- * "declared" in the current compilation.  This enhances maintainability
- * by enabling a single header file to embody all knowledge of the names
- * in question.
- *
- * Exactly one module of any executable should #define DEFINE_GLOBALS
- * before #including the header files which use this convention.  The
- * names in question will be defined and initialized in that module,
- * and declared as extern in all other modules which #include those
- * header files.
- */
-
-#define DEFINE_AML_GLOBALS
-#include "amlcode.h"
-#include "acparser.h"
-#include "acnamesp.h"
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_aml_execute_method
- *
- * PARAMETERS:  Pcode               - Pointer to the pcode stream
- *              Pcode_length        - Length of pcode that comprises the method
- *              **Params            - List of parameters to pass to method,
- *                                    terminated by NULL. Params itself may be
- *                                    NULL if no parameters are being passed.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute a control method
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_aml_execute_method (
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_obj_desc)
-{
-       ACPI_STATUS             status;
-
-
-       /*
-        * The point here is to lock the interpreter and call the low
-        * level execute.
-        */
-
-       status = acpi_aml_enter_interpreter ();
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       status = acpi_psx_execute (method_node, params, return_obj_desc);
-
-       acpi_aml_exit_interpreter ();
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/hardware/hwacpi.c b/reactos/drivers/bus/acpi/hardware/hwacpi.c
deleted file mode 100644 (file)
index b1504fa..0000000
+++ /dev/null
@@ -1,303 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_HARDWARE
-        MODULE_NAME         ("hwacpi")
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_initialize
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initialize and validate various ACPI registers
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_hw_initialize (
-       void)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     index;
-
-
-       /* We must have the ACPI tables by the time we get here */
-
-       if (!acpi_gbl_FADT) {
-               acpi_gbl_restore_acpi_chipset = FALSE;
-
-               return (AE_NO_ACPI_TABLES);
-       }
-
-       /* Must support *some* mode! */
-/*
-       if (!(System_flags & SYS_MODES_MASK))
-       {
-               Restore_acpi_chipset = FALSE;
-
-               return (AE_ERROR);
-       }
-
-*/
-
-
-       switch (acpi_gbl_system_flags & SYS_MODES_MASK) {
-               /* Identify current ACPI/legacy mode   */
-
-       case (SYS_MODE_ACPI):
-
-               acpi_gbl_original_mode = SYS_MODE_ACPI;
-               break;
-
-
-       case (SYS_MODE_LEGACY):
-
-               acpi_gbl_original_mode = SYS_MODE_LEGACY;
-               break;
-
-
-       case (SYS_MODE_ACPI | SYS_MODE_LEGACY):
-
-               if (acpi_hw_get_mode () == SYS_MODE_ACPI) {
-                       acpi_gbl_original_mode = SYS_MODE_ACPI;
-               }
-               else {
-                       acpi_gbl_original_mode = SYS_MODE_LEGACY;
-               }
-
-               break;
-       }
-
-
-       if (acpi_gbl_system_flags & SYS_MODE_ACPI) {
-               /* Target system supports ACPI mode */
-
-               /*
-                * The purpose of this code is to save the initial state
-                * of the ACPI event enable registers. An exit function will be
-                * registered which will restore this state when the application
-                * exits. The exit function will also clear all of the ACPI event
-                * status bits prior to restoring the original mode.
-                *
-                * The location of the PM1a_evt_blk enable registers is defined as the
-                * base of PM1a_evt_blk + DIV_2(PM1a_evt_blk_length). Since the spec further
-                * fully defines the PM1a_evt_blk to be a total of 4 bytes, the offset
-                * for the enable registers is always 2 from the base. It is hard
-                * coded here. If this changes in the spec, this code will need to
-                * be modified. The PM1b_evt_blk behaves as expected.
-                */
-
-               acpi_gbl_pm1_enable_register_save = (u16) acpi_hw_register_read (ACPI_MTX_LOCK, PM1_EN);
-
-
-               /*
-                * The GPEs behave similarly, except that the length of the register
-                * block is not fixed, so the buffer must be allocated with malloc
-                */
-
-               if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) &&
-                       acpi_gbl_FADT->gpe0blk_len) {
-                       /* GPE0 specified in FADT  */
-
-                       acpi_gbl_gpe0enable_register_save =
-                               acpi_cm_allocate (DIV_2 (acpi_gbl_FADT->gpe0blk_len));
-                       if (!acpi_gbl_gpe0enable_register_save) {
-                               return (AE_NO_MEMORY);
-                       }
-
-                       /* Save state of GPE0 enable bits */
-
-                       for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe0blk_len); index++) {
-                               acpi_gbl_gpe0enable_register_save[index] =
-                                       (u8) acpi_hw_register_read (ACPI_MTX_LOCK, GPE0_EN_BLOCK | index);
-                       }
-               }
-
-               else {
-                       acpi_gbl_gpe0enable_register_save = NULL;
-               }
-
-               if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) &&
-                       acpi_gbl_FADT->gpe1_blk_len) {
-                       /* GPE1 defined */
-
-                       acpi_gbl_gpe1_enable_register_save =
-                               acpi_cm_allocate (DIV_2 (acpi_gbl_FADT->gpe1_blk_len));
-                       if (!acpi_gbl_gpe1_enable_register_save) {
-                               return (AE_NO_MEMORY);
-                       }
-
-                       /* save state of GPE1 enable bits */
-
-                       for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe1_blk_len); index++) {
-                               acpi_gbl_gpe1_enable_register_save[index] =
-                                       (u8) acpi_hw_register_read (ACPI_MTX_LOCK, GPE1_EN_BLOCK | index);
-                       }
-               }
-
-               else {
-                       acpi_gbl_gpe1_enable_register_save = NULL;
-               }
-       }
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_set_mode
- *
- * PARAMETERS:  Mode            - SYS_MODE_ACPI or SYS_MODE_LEGACY
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Transitions the system into the requested mode or does nothing
- *              if the system is already in that mode.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_hw_set_mode (
-       u32                     mode)
-{
-
-       ACPI_STATUS             status = AE_NO_HARDWARE_RESPONSE;
-
-
-       if (mode == SYS_MODE_ACPI) {
-               /* BIOS should have disabled ALL fixed and GP events */
-
-               acpi_os_out8 (acpi_gbl_FADT->smi_cmd, acpi_gbl_FADT->acpi_enable);
-       }
-
-       else if (mode == SYS_MODE_LEGACY) {
-               /*
-                * BIOS should clear all fixed status bits and restore fixed event
-                * enable bits to default
-                */
-
-               acpi_os_out8 (acpi_gbl_FADT->smi_cmd, acpi_gbl_FADT->acpi_disable);
-       }
-
-       if (acpi_hw_get_mode () == mode) {
-               status = AE_OK;
-       }
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_get_mode
- *
- * PARAMETERS:  none
- *
- * RETURN:      SYS_MODE_ACPI or SYS_MODE_LEGACY
- *
- * DESCRIPTION: Return current operating state of system.  Determined by
- *              querying the SCI_EN bit.
- *
- ******************************************************************************/
-
-u32
-acpi_hw_get_mode (void)
-{
-
-
-       if (acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_LOCK, SCI_EN)) {
-               return (SYS_MODE_ACPI);
-       }
-       else {
-               return (SYS_MODE_LEGACY);
-       }
-}
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_get_mode_capabilities
- *
- * PARAMETERS:  none
- *
- * RETURN:      logical OR of SYS_MODE_ACPI and SYS_MODE_LEGACY determined at initial
- *              system state.
- *
- * DESCRIPTION: Returns capablities of system
- *
- ******************************************************************************/
-
-u32
-acpi_hw_get_mode_capabilities (void)
-{
-
-
-       if (!(acpi_gbl_system_flags & SYS_MODES_MASK)) {
-               if (acpi_hw_get_mode () == SYS_MODE_LEGACY) {
-                       /*
-                        * Assume that if this call is being made, Acpi_init has been called
-                        * and ACPI support has been established by the presence of the
-                        * tables.  Therefore since we're in SYS_MODE_LEGACY, the system
-                        * must support both modes
-                        */
-
-                       acpi_gbl_system_flags |= (SYS_MODE_ACPI | SYS_MODE_LEGACY);
-               }
-
-               else {
-                       /* TBD: [Investigate] !!! this may be unsafe... */
-                       /*
-                        * system is is ACPI mode, so try to switch back to LEGACY to see if
-                        * it is supported
-                        */
-                       acpi_hw_set_mode (SYS_MODE_LEGACY);
-
-                       if (acpi_hw_get_mode () == SYS_MODE_LEGACY) {
-                               /* Now in SYS_MODE_LEGACY, so both are supported */
-
-                               acpi_gbl_system_flags |= (SYS_MODE_ACPI | SYS_MODE_LEGACY);
-                               acpi_hw_set_mode (SYS_MODE_ACPI);
-                       }
-
-                       else {
-                               /* Still in SYS_MODE_ACPI so this must be an ACPI only system */
-
-                               acpi_gbl_system_flags |= SYS_MODE_ACPI;
-                       }
-               }
-       }
-
-       return (acpi_gbl_system_flags & SYS_MODES_MASK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/hardware/hwgpe.c b/reactos/drivers/bus/acpi/hardware/hwgpe.c
deleted file mode 100644 (file)
index 9d7ed9e..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-
-/******************************************************************************
- *
- * Module Name: hwgpe - Low level GPE enable/disable/clear functions
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_HARDWARE
-        MODULE_NAME         ("hwgpe")
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_enable_gpe
- *
- * PARAMETERS:  Gpe_number      - The GPE
- *
- * RETURN:      None
- *
- * DESCRIPTION: Enable a single GPE.
- *
- ******************************************************************************/
-
-void
-acpi_hw_enable_gpe (
-       u32                     gpe_number)
-{
-       u8                      in_byte;
-       u32                     register_index;
-       u8                      bit_mask;
-
-       /*
-        * Translate GPE number to index into global registers array.
-        */
-       register_index = acpi_gbl_gpe_valid[gpe_number];
-
-       /*
-        * Figure out the bit offset for this GPE within the target register.
-        */
-       bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)];
-
-       /*
-        * Read the current value of the register, set the appropriate bit
-        * to enable the GPE, and write out the new register.
-        */
-       in_byte = acpi_os_in8 (acpi_gbl_gpe_registers[register_index].enable_addr);
-       acpi_os_out8 (acpi_gbl_gpe_registers[register_index].enable_addr,
-                        (u8)(in_byte | bit_mask));
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_disable_gpe
- *
- * PARAMETERS:  Gpe_number      - The GPE
- *
- * RETURN:      None
- *
- * DESCRIPTION: Disable a single GPE.
- *
- ******************************************************************************/
-
-void
-acpi_hw_disable_gpe (
-       u32                     gpe_number)
-{
-       u8                      in_byte;
-       u32                     register_index;
-       u8                      bit_mask;
-
-       /*
-        * Translate GPE number to index into global registers array.
-        */
-       register_index = acpi_gbl_gpe_valid[gpe_number];
-
-       /*
-        * Figure out the bit offset for this GPE within the target register.
-        */
-       bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)];
-
-       /*
-        * Read the current value of the register, clear the appropriate bit,
-        * and write out the new register value to disable the GPE.
-        */
-       in_byte = acpi_os_in8 (acpi_gbl_gpe_registers[register_index].enable_addr);
-       acpi_os_out8 (acpi_gbl_gpe_registers[register_index].enable_addr,
-                        (u8)(in_byte & ~bit_mask));
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_clear_gpe
- *
- * PARAMETERS:  Gpe_number      - The GPE
- *
- * RETURN:      None
- *
- * DESCRIPTION: Clear a single GPE.
- *
- ******************************************************************************/
-
-void
-acpi_hw_clear_gpe (
-       u32                     gpe_number)
-{
-       u32                     register_index;
-       u8                      bit_mask;
-
-       /*
-        * Translate GPE number to index into global registers array.
-        */
-       register_index = acpi_gbl_gpe_valid[gpe_number];
-
-       /*
-        * Figure out the bit offset for this GPE within the target register.
-        */
-       bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)];
-
-       /*
-        * Write a one to the appropriate bit in the status register to
-        * clear this GPE.
-        */
-       acpi_os_out8 (acpi_gbl_gpe_registers[register_index].status_addr, bit_mask);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_get_gpe_status
- *
- * PARAMETERS:  Gpe_number      - The GPE
- *
- * RETURN:      None
- *
- * DESCRIPTION: Return the status of a single GPE.
- *
- ******************************************************************************/
-
-void
-acpi_hw_get_gpe_status (
-       u32                     gpe_number,
-       ACPI_EVENT_STATUS       *event_status)
-{
-       u8                      in_byte = 0;
-       u32                     register_index = 0;
-       u8                      bit_mask = 0;
-
-       if (!event_status) {
-               return;
-       }
-
-       (*event_status) = 0;
-
-       /*
-        * Translate GPE number to index into global registers array.
-        */
-       register_index = acpi_gbl_gpe_valid[gpe_number];
-
-       /*
-        * Figure out the bit offset for this GPE within the target register.
-        */
-       bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)];
-
-       /*
-        * Enabled?:
-        */
-       in_byte = acpi_os_in8 (acpi_gbl_gpe_registers[register_index].enable_addr);
-
-       if (bit_mask & in_byte) {
-               (*event_status) |= ACPI_EVENT_FLAG_ENABLED;
-       }
-
-       /*
-        * Set?
-        */
-       in_byte = acpi_os_in8 (acpi_gbl_gpe_registers[register_index].status_addr);
-
-       if (bit_mask & in_byte) {
-               (*event_status) |= ACPI_EVENT_FLAG_SET;
-       }
-}
diff --git a/reactos/drivers/bus/acpi/hardware/hwregs.c b/reactos/drivers/bus/acpi/hardware/hwregs.c
deleted file mode 100644 (file)
index 658d5c8..0000000
+++ /dev/null
@@ -1,964 +0,0 @@
-
-/*******************************************************************************
- *
- * Module Name: hwregs - Read/write access functions for the various ACPI
- *                       control and status registers.
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_HARDWARE
-        MODULE_NAME         ("hwregs")
-
-
-/* This matches the #defines in actypes.h. */
-
-NATIVE_CHAR                 *sleep_state_table[] = {"\\_S0_","\\_S1_","\\_S2_","\\_S3_",
-                         "\\_S4_","\\_S5_","\\_S4_b"};
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_hw_get_bit_shift
- *
- * PARAMETERS:  Mask            - Input mask to determine bit shift from.
- *                                Must have at least 1 bit set.
- *
- * RETURN:      Bit location of the lsb of the mask
- *
- * DESCRIPTION: Returns the bit number for the low order bit that's set.
- *
- ******************************************************************************/
-
-u32
-acpi_hw_get_bit_shift (
-       u32                     mask) {
-       u32                     shift;
-
-
-       for (shift = 0; ((mask >> shift) & 1) == 0; shift++) { ; }
-
-       return (shift);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_hw_clear_acpi_status
- *
- * PARAMETERS:  none
- *
- * RETURN:      none
- *
- * DESCRIPTION: Clears all fixed and general purpose status bits
- *
- ******************************************************************************/
-
-void
-acpi_hw_clear_acpi_status (void)
-{
-       u16                     gpe_length;
-       u16                     index;
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_HARDWARE);
-
-       acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, PM1_STS, ALL_FIXED_STS_BITS);
-
-
-       if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1b_evt_blk.address)) {
-               acpi_os_out16 ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xpm1b_evt_blk.address),
-                                 (u16) ALL_FIXED_STS_BITS);
-       }
-
-       /* now clear the GPE Bits */
-
-       if (acpi_gbl_FADT->gpe0blk_len) {
-               gpe_length = (u16) DIV_2 (acpi_gbl_FADT->gpe0blk_len);
-
-               for (index = 0; index < gpe_length; index++) {
-                       acpi_os_out8 ((ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) + index),
-                                         (u8) 0xff);
-               }
-       }
-
-       if (acpi_gbl_FADT->gpe1_blk_len) {
-               gpe_length = (u16) DIV_2 (acpi_gbl_FADT->gpe1_blk_len);
-
-               for (index = 0; index < gpe_length; index++) {
-                       acpi_os_out8 ((ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) + index),
-                                         (u8) 0xff);
-               }
-       }
-
-       acpi_cm_release_mutex (ACPI_MTX_HARDWARE);
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_hw_obtain_sleep_type_register_data
- *
- * PARAMETERS:  Sleep_state       - Numeric state requested
- *              *Slp_Typ_a         - Pointer to byte to receive SLP_TYPa value
- *              *Slp_Typ_b         - Pointer to byte to receive SLP_TYPb value
- *
- * RETURN:      Status - ACPI status
- *
- * DESCRIPTION: Acpi_hw_obtain_sleep_type_register_data() obtains the SLP_TYP and
- *              SLP_TYPb values for the sleep state requested.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_hw_obtain_sleep_type_register_data (
-       u8                      sleep_state,
-       u8                      *slp_typ_a,
-       u8                      *slp_typ_b)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       /*
-        *  Validate parameters
-        */
-
-       if ((sleep_state > ACPI_S_STATES_MAX) ||
-               !slp_typ_a || !slp_typ_b) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        *  Acpi_evaluate the namespace object containing the values for this state
-        */
-
-       status = acpi_ns_evaluate_by_name (sleep_state_table[sleep_state], NULL, &obj_desc);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       if (!obj_desc) {
-               REPORT_ERROR (("Missing Sleep State object\n"));
-               return (AE_NOT_EXIST);
-       }
-
-       /*
-        *  We got something, now ensure it is correct.  The object must
-        *  be a package and must have at least 2 numeric values as the
-        *  two elements
-        */
-
-       /* Even though Acpi_evaluate_object resolves package references,
-        * Ns_evaluate dpesn't. So, we do it here.
-        */
-       status = acpi_cm_resolve_package_references(obj_desc);
-
-       if (obj_desc->package.count < 2) {
-               /* Must have at least two elements */
-
-               REPORT_ERROR (("Sleep State package does not have at least two elements\n"));
-               status = AE_ERROR;
-       }
-
-       else if (((obj_desc->package.elements[0])->common.type !=
-                        ACPI_TYPE_INTEGER) ||
-                        ((obj_desc->package.elements[1])->common.type !=
-                               ACPI_TYPE_INTEGER)) {
-               /* Must have two  */
-
-               REPORT_ERROR (("Sleep State package elements are not both of type Number\n"));
-               status = AE_ERROR;
-       }
-
-       else {
-               /*
-                *  Valid _Sx_ package size, type, and value
-                */
-               *slp_typ_a = (u8) (obj_desc->package.elements[0])->integer.value;
-
-               *slp_typ_b = (u8) (obj_desc->package.elements[1])->integer.value;
-       }
-
-
-
-       acpi_cm_remove_reference (obj_desc);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_hw_register_bit_access
- *
- * PARAMETERS:  Read_write      - Either ACPI_READ or ACPI_WRITE.
- *              Use_lock        - Lock the hardware
- *              Register_id     - index of ACPI Register to access
- *              Value           - (only used on write) value to write to the
- *                                Register.  Shifted all the way right.
- *
- * RETURN:      Value written to or read from specified Register.  This value
- *              is shifted all the way right.
- *
- * DESCRIPTION: Generic ACPI Register read/write function.
- *
- ******************************************************************************/
-
-u32
-acpi_hw_register_bit_access (
-       NATIVE_UINT             read_write,
-       u8                      use_lock,
-       u32                     register_id,
-       ...)                    /* Value (only used on write) */
-{
-       u32                     register_value = 0;
-       u32                     mask = 0;
-       u32                     value = 0;
-
-
-       if (read_write == ACPI_WRITE) {
-               va_list         marker;
-
-               va_start (marker, register_id);
-               value = va_arg (marker, u32);
-               va_end (marker);
-       }
-
-       if (ACPI_MTX_LOCK == use_lock) {
-               acpi_cm_acquire_mutex (ACPI_MTX_HARDWARE);
-       }
-
-       /*
-        * Decode the Register ID
-        *  Register id = Register block id | bit id
-        *
-        * Check bit id to fine locate Register offset.
-        *  check Mask to determine Register offset, and then read-write.
-        */
-
-       switch (REGISTER_BLOCK_ID(register_id)) {
-       case PM1_STS:
-
-               switch (register_id) {
-               case TMR_STS:
-                       mask = TMR_STS_MASK;
-                       break;
-
-               case BM_STS:
-                       mask = BM_STS_MASK;
-                       break;
-
-               case GBL_STS:
-                       mask = GBL_STS_MASK;
-                       break;
-
-               case PWRBTN_STS:
-                       mask = PWRBTN_STS_MASK;
-                       break;
-
-               case SLPBTN_STS:
-                       mask = SLPBTN_STS_MASK;
-                       break;
-
-               case RTC_STS:
-                       mask = RTC_STS_MASK;
-                       break;
-
-               case WAK_STS:
-                       mask = WAK_STS_MASK;
-                       break;
-
-               default:
-                       mask = 0;
-                       break;
-               }
-
-               register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_STS);
-
-               if (read_write == ACPI_WRITE) {
-                       /*
-                        * Status Registers are different from the rest.  Clear by
-                        * writing 1, writing 0 has no effect.  So, the only relevent
-                        * information is the single bit we're interested in, all
-                        * others should be written as 0 so they will be left
-                        * unchanged
-                        */
-
-                       value <<= acpi_hw_get_bit_shift (mask);
-                       value &= mask;
-
-                       if (value) {
-                               acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, PM1_STS, (u16) value);
-
-                               register_value = 0;
-                       }
-               }
-
-               break;
-
-
-       case PM1_EN:
-
-               switch (register_id) {
-               case TMR_EN:
-                       mask = TMR_EN_MASK;
-                       break;
-
-               case GBL_EN:
-                       mask = GBL_EN_MASK;
-                       break;
-
-               case PWRBTN_EN:
-                       mask = PWRBTN_EN_MASK;
-                       break;
-
-               case SLPBTN_EN:
-                       mask = SLPBTN_EN_MASK;
-                       break;
-
-               case RTC_EN:
-                       mask = RTC_EN_MASK;
-                       break;
-
-               default:
-                       mask = 0;
-                       break;
-               }
-
-               register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_EN);
-
-               if (read_write == ACPI_WRITE) {
-                       register_value &= ~mask;
-                       value          <<= acpi_hw_get_bit_shift (mask);
-                       value          &= mask;
-                       register_value |= value;
-
-                       acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, PM1_EN, (u16) register_value);
-               }
-
-               break;
-
-
-       case PM1_CONTROL:
-
-               switch (register_id) {
-               case SCI_EN:
-                       mask = SCI_EN_MASK;
-                       break;
-
-               case BM_RLD:
-                       mask = BM_RLD_MASK;
-                       break;
-
-               case GBL_RLS:
-                       mask = GBL_RLS_MASK;
-                       break;
-
-               case SLP_TYPE_A:
-               case SLP_TYPE_B:
-                       mask = SLP_TYPE_X_MASK;
-                       break;
-
-               case SLP_EN:
-                       mask = SLP_EN_MASK;
-                       break;
-
-               default:
-                       mask = 0;
-                       break;
-               }
-
-
-               /*
-                * Read the PM1 Control register.
-                * Note that at this level, the fact that there are actually TWO
-                * registers (A and B) and that B may not exist, are abstracted.
-                */
-               register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_CONTROL);
-
-               if (read_write == ACPI_WRITE) {
-                       register_value &= ~mask;
-                       value          <<= acpi_hw_get_bit_shift (mask);
-                       value          &= mask;
-                       register_value |= value;
-
-                       /*
-                        * SLP_TYPE_x Registers are written differently
-                        * than any other control Registers with
-                        * respect to A and B Registers.  The value
-                        * for A may be different than the value for B
-                        *
-                        * Therefore, pass the Register_id, not just generic PM1_CONTROL,
-                        * because we need to do different things. Yuck.
-                        */
-
-                       acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
-                               register_id, (u16) register_value);
-               }
-               break;
-
-
-       case PM2_CONTROL:
-
-               switch (register_id) {
-               case ARB_DIS:
-                       mask = ARB_DIS_MASK;
-                       break;
-
-               default:
-                       mask = 0;
-                       break;
-               }
-
-               register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM2_CONTROL);
-
-               if (read_write == ACPI_WRITE) {
-                       register_value &= ~mask;
-                       value          <<= acpi_hw_get_bit_shift (mask);
-                       value          &= mask;
-                       register_value |= value;
-
-                       acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
-                                          PM2_CONTROL, (u8) (register_value));
-               }
-               break;
-
-
-       case PM_TIMER:
-
-               mask = TMR_VAL_MASK;
-               register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK,
-                                PM_TIMER);
-               break;
-
-
-       case GPE1_EN_BLOCK:
-       case GPE1_STS_BLOCK:
-       case GPE0_EN_BLOCK:
-       case GPE0_STS_BLOCK:
-
-               /* Determine the bit to be accessed
-                *
-                *  (u32) Register_id:
-                *      31      24       16       8        0
-                *      +--------+--------+--------+--------+
-                *      |  gpe_block_id   |  gpe_bit_number |
-                *      +--------+--------+--------+--------+
-                *
-                *     gpe_block_id is one of GPE[01]_EN_BLOCK and GPE[01]_STS_BLOCK
-                *     gpe_bit_number is relative from the gpe_block (0x00~0xFF)
-                */
-
-               mask = REGISTER_BIT_ID(register_id); /* gpe_bit_number */
-               register_id = REGISTER_BLOCK_ID(register_id) | (mask >> 3);
-               mask = acpi_gbl_decode_to8bit [mask % 8];
-
-               /*
-                * The base address of the GPE 0 Register Block
-                * Plus 1/2 the length of the GPE 0 Register Block
-                * The enable Register is the Register following the Status Register
-                * and each Register is defined as 1/2 of the total Register Block
-                */
-
-               /*
-                * This sets the bit within Enable_bit that needs to be written to
-                * the Register indicated in Mask to a 1, all others are 0
-                */
-
-               /* Now get the current Enable Bits in the selected Reg */
-
-               register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, register_id);
-               if (read_write == ACPI_WRITE) {
-                       register_value &= ~mask;
-                       value          <<= acpi_hw_get_bit_shift (mask);
-                       value          &= mask;
-                       register_value |= value;
-
-                       /* This write will put the Action state into the General Purpose */
-                       /* Enable Register indexed by the value in Mask */
-
-                       acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
-                                          register_id, (u8) register_value);
-                       register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, register_id);
-               }
-               break;
-
-
-       case SMI_CMD_BLOCK:
-       case PROCESSOR_BLOCK:
-               /* not used */
-       default:
-
-               mask = 0;
-               break;
-       }
-
-       if (ACPI_MTX_LOCK == use_lock) {
-               acpi_cm_release_mutex (ACPI_MTX_HARDWARE);
-       }
-
-
-       register_value &= mask;
-       register_value >>= acpi_hw_get_bit_shift (mask);
-
-       return (register_value);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_register_read
- *
- * PARAMETERS:  Use_lock               - Mutex hw access.
- *              Register_id            - Register_iD + Offset.
- *
- * RETURN:      Value read or written.
- *
- * DESCRIPTION: Acpi register read function.  Registers are read at the
- *              given offset.
- *
- ******************************************************************************/
-
-u32
-acpi_hw_register_read (
-       u8                      use_lock,
-       u32                     register_id)
-{
-       u32                     value       = 0;
-       u32                     bank_offset;
-
-       if (ACPI_MTX_LOCK == use_lock) {
-               acpi_cm_acquire_mutex (ACPI_MTX_HARDWARE);
-       }
-
-
-       switch (REGISTER_BLOCK_ID(register_id)) {
-       case PM1_STS: /* 16-bit access */
-
-               value =  acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1a_evt_blk, 0);
-               value |= acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1b_evt_blk, 0);
-               break;
-
-
-       case PM1_EN: /* 16-bit access*/
-
-               bank_offset = DIV_2 (acpi_gbl_FADT->pm1_evt_len);
-               value =  acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1a_evt_blk, bank_offset);
-               value |= acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1b_evt_blk, bank_offset);
-               break;
-
-
-       case PM1_CONTROL: /* 16-bit access */
-
-               value =  acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0);
-               value |= acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0);
-               break;
-
-
-       case PM2_CONTROL: /* 8-bit access */
-
-               value =  acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xpm2_cnt_blk, 0);
-               break;
-
-
-       case PM_TIMER: /* 32-bit access */
-
-               value =  acpi_hw_low_level_read (32, &acpi_gbl_FADT->Xpm_tmr_blk, 0);
-               break;
-
-
-       case GPE0_STS_BLOCK: /* 8-bit access */
-
-               value =  acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xgpe0blk, 0);
-               break;
-
-
-       case GPE0_EN_BLOCK: /* 8-bit access */
-
-               bank_offset = DIV_2 (acpi_gbl_FADT->gpe0blk_len);
-               value =  acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xgpe0blk, bank_offset);
-               break;
-
-
-       case GPE1_STS_BLOCK: /* 8-bit access */
-
-               value =  acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xgpe1_blk, 0);
-               break;
-
-
-       case GPE1_EN_BLOCK: /* 8-bit access */
-
-               bank_offset = DIV_2 (acpi_gbl_FADT->gpe1_blk_len);
-               value =  acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xgpe1_blk, bank_offset);
-               break;
-
-
-       case SMI_CMD_BLOCK: /* 8bit */
-
-               value = (u32) acpi_os_in8 (acpi_gbl_FADT->smi_cmd);
-               break;
-
-
-       default:
-               value = 0;
-               break;
-       }
-
-
-       if (ACPI_MTX_LOCK == use_lock) {
-               acpi_cm_release_mutex (ACPI_MTX_HARDWARE);
-       }
-
-       return (value);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_register_write
- *
- * PARAMETERS:  Use_lock               - Mutex hw access.
- *              Register_id            - Register_iD + Offset.
- *
- * RETURN:      Value read or written.
- *
- * DESCRIPTION: Acpi register Write function.  Registers are written at the
- *              given offset.
- *
- ******************************************************************************/
-
-void
-acpi_hw_register_write (
-       u8                      use_lock,
-       u32                     register_id,
-       u32                     value)
-{
-       u32                     bank_offset;
-
-
-       if (ACPI_MTX_LOCK == use_lock) {
-               acpi_cm_acquire_mutex (ACPI_MTX_HARDWARE);
-       }
-
-
-       switch (REGISTER_BLOCK_ID (register_id)) {
-       case PM1_STS: /* 16-bit access */
-
-               acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_evt_blk, 0);
-               acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_evt_blk, 0);
-               break;
-
-
-       case PM1_EN: /* 16-bit access*/
-
-               bank_offset = DIV_2 (acpi_gbl_FADT->pm1_evt_len);
-               acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_evt_blk, bank_offset);
-               acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_evt_blk, bank_offset);
-               break;
-
-
-       case PM1_CONTROL: /* 16-bit access */
-
-               acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0);
-               acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0);
-               break;
-
-
-       case PM1_a_CONTROL: /* 16-bit access */
-
-               acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0);
-               break;
-
-
-       case PM1_b_CONTROL: /* 16-bit access */
-
-               acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0);
-               break;
-
-
-       case PM2_CONTROL: /* 8-bit access */
-
-               acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xpm2_cnt_blk, 0);
-               break;
-
-
-       case PM_TIMER: /* 32-bit access */
-
-               acpi_hw_low_level_write (32, value, &acpi_gbl_FADT->Xpm_tmr_blk, 0);
-               break;
-
-
-       case GPE0_STS_BLOCK: /* 8-bit access */
-
-               acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xgpe0blk, 0);
-               break;
-
-
-       case GPE0_EN_BLOCK: /* 8-bit access */
-
-               bank_offset = DIV_2 (acpi_gbl_FADT->gpe0blk_len);
-               acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xgpe0blk, bank_offset);
-               break;
-
-
-       case GPE1_STS_BLOCK: /* 8-bit access */
-
-               acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xgpe1_blk, 0);
-               break;
-
-
-       case GPE1_EN_BLOCK: /* 8-bit access */
-
-               bank_offset = DIV_2 (acpi_gbl_FADT->gpe1_blk_len);
-               acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xgpe1_blk, bank_offset);
-               break;
-
-
-       case SMI_CMD_BLOCK: /* 8bit */
-
-               /* For 2.0, SMI_CMD is always in IO space */
-               /* TBD: what about 1.0? 0.71? */
-
-          acpi_os_out8 (acpi_gbl_FADT->smi_cmd, (u8) value);
-               break;
-
-
-       default:
-               value = 0;
-               break;
-       }
-
-
-       if (ACPI_MTX_LOCK == use_lock) {
-               acpi_cm_release_mutex (ACPI_MTX_HARDWARE);
-       }
-
-       return;
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_low_level_read
- *
- * PARAMETERS:  Register            - GAS register structure
- *              Offset              - Offset from the base address in the GAS
- *              Width               - 8, 16, or 32
- *
- * RETURN:      Value read
- *
- * DESCRIPTION: Read from either memory, IO, or PCI config space.
- *
- ******************************************************************************/
-
-u32
-acpi_hw_low_level_read (
-       u32                     width,
-       ACPI_GAS                *reg,
-       u32                     offset)
-{
-       u32                     value = 0;
-       ACPI_PHYSICAL_ADDRESS   mem_address;
-       ACPI_IO_ADDRESS         io_address;
-       u32                     pci_register;
-       u32                     pci_dev_func;
-
-
-       /*
-        * Must have a valid pointer to a GAS structure, and
-        * a non-zero address within
-        */
-       if ((!reg) ||
-               (!ACPI_VALID_ADDRESS (reg->address))) {
-               return 0;
-       }
-
-
-       /*
-        * Three address spaces supported:
-        * Memory, Io, or PCI config.
-        */
-
-       switch (reg->address_space_id) {
-       case ADDRESS_SPACE_SYSTEM_MEMORY:
-
-               mem_address = (ACPI_PHYSICAL_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset);
-
-               switch (width) {
-               case 8:
-                       value = acpi_os_mem_in8 (mem_address);
-                       break;
-               case 16:
-                       value = acpi_os_mem_in16 (mem_address);
-                       break;
-               case 32:
-                       value = acpi_os_mem_in32 (mem_address);
-                       break;
-               }
-               break;
-
-
-       case ADDRESS_SPACE_SYSTEM_IO:
-
-               io_address = (ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset);
-
-               switch (width) {
-               case 8:
-                       value = acpi_os_in8 (io_address);
-                       break;
-               case 16:
-                       value = acpi_os_in16 (io_address);
-                       break;
-               case 32:
-                       value = acpi_os_in32 (io_address);
-                       break;
-               }
-               break;
-
-
-       case ADDRESS_SPACE_PCI_CONFIG:
-
-               pci_dev_func = ACPI_PCI_DEVFUN  (ACPI_GET_ADDRESS (reg->address));
-               pci_register = ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (reg->address)) + offset;
-
-               switch (width) {
-               case 8:
-                       acpi_os_read_pci_cfg_byte (0, pci_dev_func, pci_register, (u8 *) &value);
-                       break;
-               case 16:
-                       acpi_os_read_pci_cfg_word (0, pci_dev_func, pci_register, (u16 *) &value);
-                       break;
-               case 32:
-                       acpi_os_read_pci_cfg_dword (0, pci_dev_func, pci_register, (u32 *) &value);
-                       break;
-               }
-               break;
-       }
-
-       return value;
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_hw_low_level_write
- *
- * PARAMETERS:  Width               - 8, 16, or 32
- *              Value               - To be written
- *              Register            - GAS register structure
- *              Offset              - Offset from the base address in the GAS
- *
- *
- * RETURN:      Value read
- *
- * DESCRIPTION: Read from either memory, IO, or PCI config space.
- *
- ******************************************************************************/
-
-void
-acpi_hw_low_level_write (
-       u32                     width,
-       u32                     value,
-       ACPI_GAS                *reg,
-       u32                     offset)
-{
-       ACPI_PHYSICAL_ADDRESS   mem_address;
-       ACPI_IO_ADDRESS         io_address;
-       u32                     pci_register;
-       u32                     pci_dev_func;
-
-
-       /*
-        * Must have a valid pointer to a GAS structure, and
-        * a non-zero address within
-        */
-       if ((!reg) ||
-               (!ACPI_VALID_ADDRESS (reg->address))) {
-               return;
-       }
-
-
-       /*
-        * Three address spaces supported:
-        * Memory, Io, or PCI config.
-        */
-
-       switch (reg->address_space_id) {
-       case ADDRESS_SPACE_SYSTEM_MEMORY:
-
-               mem_address = (ACPI_PHYSICAL_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset);
-
-               switch (width) {
-               case 8:
-                       acpi_os_mem_out8 (mem_address, (u8) value);
-                       break;
-               case 16:
-                       acpi_os_mem_out16 (mem_address, (u16) value);
-                       break;
-               case 32:
-                       acpi_os_mem_out32 (mem_address, (u32) value);
-                       break;
-               }
-               break;
-
-
-       case ADDRESS_SPACE_SYSTEM_IO:
-
-               io_address = (ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset);
-
-               switch (width) {
-               case 8:
-                       acpi_os_out8 (io_address, (u8) value);
-                       break;
-               case 16:
-                       acpi_os_out16 (io_address, (u16) value);
-                       break;
-               case 32:
-                       acpi_os_out32 (io_address, (u32) value);
-                       break;
-               }
-               break;
-
-
-       case ADDRESS_SPACE_PCI_CONFIG:
-
-               pci_dev_func = ACPI_PCI_DEVFUN  (ACPI_GET_ADDRESS (reg->address));
-               pci_register = ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (reg->address)) + offset;
-
-               switch (width) {
-               case 8:
-                       acpi_os_write_pci_cfg_byte (0, pci_dev_func, pci_register, (u8) value);
-                       break;
-               case 16:
-                       acpi_os_write_pci_cfg_word (0, pci_dev_func, pci_register, (u16) value);
-                       break;
-               case 32:
-                       acpi_os_write_pci_cfg_dword (0, pci_dev_func, pci_register, (u32) value);
-                       break;
-               }
-               break;
-       }
-}
diff --git a/reactos/drivers/bus/acpi/hardware/hwsleep.c b/reactos/drivers/bus/acpi/hardware/hwsleep.c
deleted file mode 100644 (file)
index a30fbe6..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-
-/******************************************************************************
- *
- * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_HARDWARE
-        MODULE_NAME         ("hwsleep")
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_set_firmware_waking_vector
- *
- * PARAMETERS:  Physical_address    - Physical address of ACPI real mode
- *                                    entry point.
- *
- * RETURN:      AE_OK or AE_ERROR
- *
- * DESCRIPTION: Access function for d_firmware_waking_vector field in FACS
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_set_firmware_waking_vector (
-       ACPI_PHYSICAL_ADDRESS physical_address)
-{
-
-
-       /* Make sure that we have an FACS */
-
-       if (!acpi_gbl_FACS) {
-               return (AE_NO_ACPI_TABLES);
-       }
-
-       /* Set the vector */
-
-       if (acpi_gbl_FACS->vector_width == 32) {
-               * (u32 *) acpi_gbl_FACS->firmware_waking_vector = (u32) physical_address;
-       }
-       else {
-               *acpi_gbl_FACS->firmware_waking_vector = physical_address;
-       }
-
-       return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_get_firmware_waking_vector
- *
- * PARAMETERS:  *Physical_address   - Output buffer where contents of
- *                                    the Firmware_waking_vector field of
- *                                    the FACS will be stored.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Access function for d_firmware_waking_vector field in FACS
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_firmware_waking_vector (
-       ACPI_PHYSICAL_ADDRESS *physical_address)
-{
-
-
-       if (!physical_address) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Make sure that we have an FACS */
-
-       if (!acpi_gbl_FACS) {
-               return (AE_NO_ACPI_TABLES);
-       }
-
-       /* Get the vector */
-
-       if (acpi_gbl_FACS->vector_width == 32) {
-               *physical_address = * (u32 *) acpi_gbl_FACS->firmware_waking_vector;
-       }
-       else {
-               *physical_address = *acpi_gbl_FACS->firmware_waking_vector;
-       }
-
-       return (AE_OK);
-}
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_enter_sleep_state
- *
- * PARAMETERS:  Sleep_state         - Which sleep state to enter
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Enter a system sleep state (see ACPI 2.0 spec p 231)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_enter_sleep_state (
-       u8 sleep_state)
-{
-       ACPI_STATUS status;
-       ACPI_OBJECT_LIST arg_list;
-       ACPI_OBJECT arg;
-       u8 type_a;
-       u8 type_b;
-       u16 PM1_acontrol;
-       u16 PM1_bcontrol;
-
-       /*
-        * _PSW methods could be run here to enable wake-on keyboard, LAN, etc.
-        */
-
-       status = acpi_hw_obtain_sleep_type_register_data(sleep_state, &type_a, &type_b);
-
-       if (!ACPI_SUCCESS(status)) {
-               return status;
-       }
-
-       /* run the _PTS and _GTS methods */
-       MEMSET(&arg_list, 0, sizeof(arg_list));
-       arg_list.count = 1;
-       arg_list.pointer = &arg;
-
-       MEMSET(&arg, 0, sizeof(arg));
-       arg.type = ACPI_TYPE_INTEGER;
-       arg.integer.value = sleep_state;
-
-       acpi_evaluate_object(NULL, "\\_PTS", &arg_list, NULL);
-       acpi_evaluate_object(NULL, "\\_GTS", &arg_list, NULL);
-
-       /* clear wake status */
-       acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_LOCK, WAK_STS, 1);
-
-       PM1_acontrol = (u16) acpi_hw_register_read(ACPI_MTX_LOCK, PM1_CONTROL);
-
-       /* mask off SLP_EN and SLP_TYP fields */
-       PM1_acontrol &= 0xC3FF;
-
-       /* mask in SLP_EN */
-       PM1_acontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK));
-
-       PM1_bcontrol = PM1_acontrol;
-
-       /* mask in SLP_TYP */
-       PM1_acontrol |= (type_a << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK));
-       PM1_bcontrol |= (type_b << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK));
-
-       disable();
-
-       acpi_hw_register_write(ACPI_MTX_LOCK, PM1_a_CONTROL, PM1_acontrol);
-       acpi_hw_register_write(ACPI_MTX_LOCK, PM1_b_CONTROL, PM1_bcontrol);
-       acpi_hw_register_write(ACPI_MTX_LOCK, PM1_CONTROL,
-               (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)));
-
-       enable();
-
-       return (AE_OK);
-}
diff --git a/reactos/drivers/bus/acpi/hardware/hwtimer.c b/reactos/drivers/bus/acpi/hardware/hwtimer.c
deleted file mode 100644 (file)
index 06dfbbe..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-
-/******************************************************************************
- *
- * Name: hwtimer.c - ACPI Power Management Timer Interface
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_HARDWARE
-        MODULE_NAME         ("hwtimer")
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_get_timer_resolution
- *
- * PARAMETERS:  none
- *
- * RETURN:      Number of bits of resolution in the PM Timer (24 or 32).
- *
- * DESCRIPTION: Obtains resolution of the ACPI PM Timer.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_timer_resolution (
-       u32                     *resolution)
-{
-       if (!resolution) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       if (0 == acpi_gbl_FADT->tmr_val_ext) {
-               *resolution = 24;
-       }
-       else {
-               *resolution = 32;
-       }
-
-       return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_get_timer
- *
- * PARAMETERS:  none
- *
- * RETURN:      Current value of the ACPI PM Timer (in ticks).
- *
- * DESCRIPTION: Obtains current value of ACPI PM Timer.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_timer (
-       u32                     *ticks)
-{
-       if (!ticks) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       *ticks = acpi_os_in32 ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xpm_tmr_blk.address));
-
-       return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_get_timer_duration
- *
- * PARAMETERS:  Start_ticks
- *              End_ticks
- *              Time_elapsed
- *
- * RETURN:      Time_elapsed
- *
- * DESCRIPTION: Computes the time elapsed (in microseconds) between two
- *              PM Timer time stamps, taking into account the possibility of
- *              rollovers, the timer resolution, and timer frequency.
- *
- *              The PM Timer's clock ticks at roughly 3.6 times per
- *              _microsecond_, and its clock continues through Cx state
- *              transitions (unlike many CPU timestamp counters) -- making it
- *              a versatile and accurate timer.
- *
- *              Note that this function accomodates only a single timer
- *              rollover.  Thus for 24-bit timers, this function should only
- *              be used for calculating durations less than ~4.6 seconds
- *              (~20 hours for 32-bit timers).
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_timer_duration (
-       u32                     start_ticks,
-       u32                     end_ticks,
-       u32                     *time_elapsed)
-{
-       u32                     delta_ticks = 0;
-       u32                     seconds = 0;
-       u32                     milliseconds = 0;
-       u32                     microseconds = 0;
-       u32                     remainder = 0;
-
-       if (!time_elapsed) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Compute Tick Delta:
-        * -------------------
-        * Handle (max one) timer rollovers on 24- versus 32-bit timers.
-        */
-       if (start_ticks < end_ticks) {
-               delta_ticks = end_ticks - start_ticks;
-       }
-       else if (start_ticks > end_ticks) {
-               /* 24-bit Timer */
-               if (0 == acpi_gbl_FADT->tmr_val_ext) {
-                       delta_ticks = (((0x00FFFFFF - start_ticks) + end_ticks) & 0x00FFFFFF);
-               }
-               /* 32-bit Timer */
-               else {
-                       delta_ticks = (0xFFFFFFFF - start_ticks) + end_ticks;
-               }
-       }
-       else {
-               *time_elapsed = 0;
-               return (AE_OK);
-       }
-
-       /*
-        * Compute Duration:
-        * -----------------
-        * Since certain compilers (gcc/Linux, argh!) don't support 64-bit
-        * divides in kernel-space we have to do some trickery to preserve
-        * accuracy while using 32-bit math.
-        *
-        * TODO: Change to use 64-bit math when supported.
-        *
-        * The process is as follows:
-        *  1. Compute the number of seconds by dividing Delta Ticks by
-        *     the timer frequency.
-        *  2. Compute the number of milliseconds in the remainder from step #1
-        *     by multiplying by 1000 and then dividing by the timer frequency.
-        *  3. Compute the number of microseconds in the remainder from step #2
-        *     by multiplying by 1000 and then dividing by the timer frequency.
-        *  4. Add the results from steps 1, 2, and 3 to get the total duration.
-        *
-        * Example: The time elapsed for Delta_ticks = 0xFFFFFFFF should be
-        *          1199864031 microseconds.  This is computed as follows:
-        *          Step #1: Seconds = 1199; Remainder = 3092840
-        *          Step #2: Milliseconds = 864; Remainder = 113120
-        *          Step #3: Microseconds = 31; Remainder = <don't care!>
-        */
-
-       /* Step #1 */
-       seconds = delta_ticks / PM_TIMER_FREQUENCY;
-       remainder = delta_ticks % PM_TIMER_FREQUENCY;
-
-       /* Step #2 */
-       milliseconds = (remainder * 1000) / PM_TIMER_FREQUENCY;
-       remainder = (remainder * 1000) % PM_TIMER_FREQUENCY;
-
-       /* Step #3 */
-       microseconds = (remainder * 1000) / PM_TIMER_FREQUENCY;
-
-       /* Step #4 */
-       *time_elapsed = seconds * 1000000;
-       *time_elapsed += milliseconds * 1000;
-       *time_elapsed += microseconds;
-
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/include/accommon.h b/reactos/drivers/bus/acpi/include/accommon.h
deleted file mode 100644 (file)
index 56bdf49..0000000
+++ /dev/null
@@ -1,725 +0,0 @@
-/******************************************************************************
- *
- * Name: accommon.h -- prototypes for the common (subsystem-wide) procedures
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef _ACCOMMON_H
-#define _ACCOMMON_H
-
-
-typedef
-ACPI_STATUS (*ACPI_PKG_CALLBACK) (
-       u8                      object_type,
-       ACPI_OPERAND_OBJECT     *source_object,
-       ACPI_GENERIC_STATE      *state,
-       void                    *context);
-
-
-ACPI_STATUS
-acpi_cm_walk_package_tree (
-       ACPI_OPERAND_OBJECT     *source_object,
-       void                    *target_object,
-       ACPI_PKG_CALLBACK       walk_callback,
-       void                    *context);
-
-
-typedef struct acpi_pkg_info
-{
-       u8                      *free_space;
-       u32                     length;
-       u32                     object_space;
-       u32                     num_packages;
-} ACPI_PKG_INFO;
-
-#define REF_INCREMENT       (u16) 0
-#define REF_DECREMENT       (u16) 1
-#define REF_FORCE_DELETE    (u16) 2
-
-/* Acpi_cm_dump_buffer */
-
-#define DB_BYTE_DISPLAY     1
-#define DB_WORD_DISPLAY     2
-#define DB_DWORD_DISPLAY    4
-#define DB_QWORD_DISPLAY    8
-
-
-/* Global initialization interfaces */
-
-void
-acpi_cm_init_globals (
-       void);
-
-void
-acpi_cm_terminate (
-       void);
-
-
-/*
- * Cm_init - miscellaneous initialization and shutdown
- */
-
-ACPI_STATUS
-acpi_cm_hardware_initialize (
-       void);
-
-ACPI_STATUS
-acpi_cm_subsystem_shutdown (
-       void);
-
-ACPI_STATUS
-acpi_cm_validate_fadt (
-       void);
-
-/*
- * Cm_global - Global data structures and procedures
- */
-
-#ifdef ACPI_DEBUG
-
-NATIVE_CHAR *
-acpi_cm_get_mutex_name (
-       u32                     mutex_id);
-
-NATIVE_CHAR *
-acpi_cm_get_type_name (
-       u32                     type);
-
-NATIVE_CHAR *
-acpi_cm_get_region_name (
-       u8                      space_id);
-
-#endif
-
-
-u8
-acpi_cm_valid_object_type (
-       u32                     type);
-
-ACPI_OWNER_ID
-acpi_cm_allocate_owner_id (
-       u32                     id_type);
-
-
-/*
- * Cm_clib - Local implementations of C library functions
- */
-
-#ifndef ACPI_USE_SYSTEM_CLIBRARY
-
-u32
-acpi_cm_strlen (
-       const NATIVE_CHAR       *string);
-
-NATIVE_CHAR *
-acpi_cm_strcpy (
-       NATIVE_CHAR             *dst_string,
-       const NATIVE_CHAR       *src_string);
-
-NATIVE_CHAR *
-acpi_cm_strncpy (
-       NATIVE_CHAR             *dst_string,
-       const NATIVE_CHAR       *src_string,
-       NATIVE_UINT             count);
-
-u32
-acpi_cm_strncmp (
-       const NATIVE_CHAR       *string1,
-       const NATIVE_CHAR       *string2,
-       NATIVE_UINT             count);
-
-u32
-acpi_cm_strcmp (
-       const NATIVE_CHAR       *string1,
-       const NATIVE_CHAR       *string2);
-
-NATIVE_CHAR *
-acpi_cm_strcat (
-       NATIVE_CHAR             *dst_string,
-       const NATIVE_CHAR       *src_string);
-
-NATIVE_CHAR *
-acpi_cm_strncat (
-       NATIVE_CHAR             *dst_string,
-       const NATIVE_CHAR       *src_string,
-       NATIVE_UINT             count);
-
-NATIVE_UINT
-acpi_cm_strtoul (
-       const NATIVE_CHAR       *string,
-       NATIVE_CHAR             **terminator,
-       NATIVE_UINT             base);
-
-NATIVE_CHAR *
-acpi_cm_strstr (
-       NATIVE_CHAR             *string1,
-       NATIVE_CHAR             *string2);
-
-NATIVE_CHAR *
-acpi_cm_strupr (
-       NATIVE_CHAR             *src_string);
-
-void *
-acpi_cm_memcpy (
-       void                    *dest,
-       const void              *src,
-       NATIVE_UINT             count);
-
-void *
-acpi_cm_memset (
-       void                    *dest,
-       NATIVE_UINT             value,
-       NATIVE_UINT             count);
-
-u32
-acpi_cm_to_upper (
-       u32                     c);
-
-u32
-acpi_cm_to_lower (
-       u32                     c);
-
-#endif /* ACPI_USE_SYSTEM_CLIBRARY */
-
-/*
- * Cm_copy - Object construction and conversion interfaces
- */
-
-ACPI_STATUS
-acpi_cm_build_simple_object(
-       ACPI_OPERAND_OBJECT     *obj,
-       ACPI_OBJECT             *user_obj,
-       u8                      *data_space,
-       u32                     *buffer_space_used);
-
-ACPI_STATUS
-acpi_cm_build_package_object (
-       ACPI_OPERAND_OBJECT     *obj,
-       u8                      *buffer,
-       u32                     *space_used);
-
-ACPI_STATUS
-acpi_cm_copy_iobject_to_eobject (
-       ACPI_OPERAND_OBJECT     *obj,
-       ACPI_BUFFER             *ret_buffer);
-
-ACPI_STATUS
-acpi_cm_copy_esimple_to_isimple(
-       ACPI_OBJECT             *user_obj,
-       ACPI_OPERAND_OBJECT     *obj);
-
-ACPI_STATUS
-acpi_cm_copy_eobject_to_iobject (
-       ACPI_OBJECT             *obj,
-       ACPI_OPERAND_OBJECT     *internal_obj);
-
-ACPI_STATUS
-acpi_cm_copy_isimple_to_isimple (
-       ACPI_OPERAND_OBJECT     *source_obj,
-       ACPI_OPERAND_OBJECT     *dest_obj);
-
-ACPI_STATUS
-acpi_cm_copy_ipackage_to_ipackage (
-       ACPI_OPERAND_OBJECT     *source_obj,
-       ACPI_OPERAND_OBJECT     *dest_obj,
-       ACPI_WALK_STATE         *walk_state);
-
-
-/*
- * Cm_create - Object creation
- */
-
-ACPI_STATUS
-acpi_cm_update_object_reference (
-       ACPI_OPERAND_OBJECT     *object,
-       u16                     action);
-
-ACPI_OPERAND_OBJECT  *
-_cm_create_internal_object (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       OBJECT_TYPE_INTERNAL    type);
-
-
-/*
- * Cm_debug - Debug interfaces
- */
-
-u32
-get_debug_level (
-       void);
-
-void
-set_debug_level (
-       u32                     level);
-
-void
-function_trace (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name);
-
-void
-function_trace_ptr (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       void                    *pointer);
-
-void
-function_trace_u32 (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       u32                     integer);
-
-void
-function_trace_str (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       NATIVE_CHAR             *string);
-
-void
-function_exit (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name);
-
-void
-function_status_exit (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       ACPI_STATUS             status);
-
-void
-function_value_exit (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       ACPI_INTEGER            value);
-
-void
-function_ptr_exit (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       u8                      *ptr);
-
-void
-debug_print_prefix (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number);
-
-void
-debug_print (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       u32                     print_level,
-       NATIVE_CHAR             *format, ...);
-
-void
-debug_print_raw (
-       NATIVE_CHAR             *format, ...);
-
-void
-_report_info (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id);
-
-void
-_report_error (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id);
-
-void
-_report_warning (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id);
-
-void
-acpi_cm_dump_buffer (
-       u8                      *buffer,
-       u32                     count,
-       u32                     display,
-       u32                     component_id);
-
-
-/*
- * Cm_delete - Object deletion
- */
-
-void
-acpi_cm_delete_internal_obj (
-       ACPI_OPERAND_OBJECT     *object);
-
-void
-acpi_cm_delete_internal_package_object (
-       ACPI_OPERAND_OBJECT     *object);
-
-void
-acpi_cm_delete_internal_simple_object (
-       ACPI_OPERAND_OBJECT     *object);
-
-ACPI_STATUS
-acpi_cm_delete_internal_object_list (
-       ACPI_OPERAND_OBJECT     **obj_list);
-
-
-/*
- * Cm_eval - object evaluation
- */
-
-/* Method name strings */
-
-#define METHOD_NAME__HID        "_HID"
-#define METHOD_NAME__UID        "_UID"
-#define METHOD_NAME__ADR        "_ADR"
-#define METHOD_NAME__STA        "_STA"
-#define METHOD_NAME__REG        "_REG"
-#define METHOD_NAME__SEG        "_SEG"
-#define METHOD_NAME__BBN        "_BBN"
-
-
-ACPI_STATUS
-acpi_cm_evaluate_numeric_object (
-       NATIVE_CHAR             *object_name,
-       ACPI_NAMESPACE_NODE     *device_node,
-       ACPI_INTEGER            *address);
-
-ACPI_STATUS
-acpi_cm_execute_HID (
-       ACPI_NAMESPACE_NODE     *device_node,
-       DEVICE_ID               *hid);
-
-ACPI_STATUS
-acpi_cm_execute_STA (
-       ACPI_NAMESPACE_NODE     *device_node,
-       u32                     *status_flags);
-
-ACPI_STATUS
-acpi_cm_execute_UID (
-       ACPI_NAMESPACE_NODE     *device_node,
-       DEVICE_ID               *uid);
-
-
-/*
- * Cm_error - exception interfaces
- */
-
-NATIVE_CHAR *
-acpi_cm_format_exception (
-       ACPI_STATUS             status);
-
-
-/*
- * Cm_mutex - mutual exclusion interfaces
- */
-
-ACPI_STATUS
-acpi_cm_mutex_initialize (
-       void);
-
-void
-acpi_cm_mutex_terminate (
-       void);
-
-ACPI_STATUS
-acpi_cm_create_mutex (
-       ACPI_MUTEX_HANDLE       mutex_id);
-
-ACPI_STATUS
-acpi_cm_delete_mutex (
-       ACPI_MUTEX_HANDLE       mutex_id);
-
-ACPI_STATUS
-acpi_cm_acquire_mutex (
-       ACPI_MUTEX_HANDLE       mutex_id);
-
-ACPI_STATUS
-acpi_cm_release_mutex (
-       ACPI_MUTEX_HANDLE       mutex_id);
-
-
-/*
- * Cm_object - internal object create/delete/cache routines
- */
-
-void *
-_cm_allocate_object_desc (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id);
-
-#define acpi_cm_create_internal_object(t) _cm_create_internal_object(_THIS_MODULE,__LINE__,_COMPONENT,t)
-#define acpi_cm_allocate_object_desc()  _cm_allocate_object_desc(_THIS_MODULE,__LINE__,_COMPONENT)
-
-void
-acpi_cm_delete_object_desc (
-       ACPI_OPERAND_OBJECT     *object);
-
-u8
-acpi_cm_valid_internal_object (
-       void                    *object);
-
-
-/*
- * Cm_ref_cnt - Object reference count management
- */
-
-void
-acpi_cm_add_reference (
-       ACPI_OPERAND_OBJECT     *object);
-
-void
-acpi_cm_remove_reference (
-       ACPI_OPERAND_OBJECT     *object);
-
-/*
- * Cm_size - Object size routines
- */
-
-ACPI_STATUS
-acpi_cm_get_simple_object_size (
-       ACPI_OPERAND_OBJECT     *obj,
-       u32                     *obj_length);
-
-ACPI_STATUS
-acpi_cm_get_package_object_size (
-       ACPI_OPERAND_OBJECT     *obj,
-       u32                     *obj_length);
-
-ACPI_STATUS
-acpi_cm_get_object_size(
-       ACPI_OPERAND_OBJECT     *obj,
-       u32                     *obj_length);
-
-
-/*
- * Cm_state - Generic state creation/cache routines
- */
-
-void
-acpi_cm_push_generic_state (
-       ACPI_GENERIC_STATE      **list_head,
-       ACPI_GENERIC_STATE      *state);
-
-ACPI_GENERIC_STATE *
-acpi_cm_pop_generic_state (
-       ACPI_GENERIC_STATE      **list_head);
-
-
-ACPI_GENERIC_STATE *
-acpi_cm_create_generic_state (
-       void);
-
-ACPI_GENERIC_STATE *
-acpi_cm_create_update_state (
-       ACPI_OPERAND_OBJECT     *object,
-       u16                     action);
-
-ACPI_GENERIC_STATE *
-acpi_cm_create_pkg_state (
-       void                    *internal_object,
-       void                    *external_object,
-       u16                     index);
-
-ACPI_STATUS
-acpi_cm_create_update_state_and_push (
-       ACPI_OPERAND_OBJECT     *object,
-       u16                     action,
-       ACPI_GENERIC_STATE      **state_list);
-
-ACPI_STATUS
-acpi_cm_create_pkg_state_and_push (
-       void                    *internal_object,
-       void                    *external_object,
-       u16                     index,
-       ACPI_GENERIC_STATE      **state_list);
-
-ACPI_GENERIC_STATE *
-acpi_cm_create_control_state (
-       void);
-
-void
-acpi_cm_delete_generic_state (
-       ACPI_GENERIC_STATE      *state);
-
-void
-acpi_cm_delete_generic_state_cache (
-       void);
-
-void
-acpi_cm_delete_object_cache (
-       void);
-
-/*
- * Cmutils
- */
-
-u8
-acpi_cm_valid_acpi_name (
-       u32                     name);
-
-u8
-acpi_cm_valid_acpi_character (
-       NATIVE_CHAR             character);
-
-ACPI_STATUS
-acpi_cm_resolve_package_references (
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-#ifdef ACPI_DEBUG
-
-void
-acpi_cm_display_init_pathname (
-       ACPI_HANDLE             obj_handle,
-       char                    *path);
-
-#endif
-
-
-/*
- * Memory allocation functions and related macros.
- * Macros that expand to include filename and line number
- */
-
-void *
-_cm_allocate (
-       u32                     size,
-       u32                     component,
-       NATIVE_CHAR             *module,
-       u32                     line);
-
-void *
-_cm_callocate (
-       u32                     size,
-       u32                     component,
-       NATIVE_CHAR             *module,
-       u32                     line);
-
-void
-_cm_free (
-       void                    *address,
-       u32                     component,
-       NATIVE_CHAR             *module,
-       u32                     line);
-
-void
-acpi_cm_init_static_object (
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-#define acpi_cm_allocate(a)             _cm_allocate(a,_COMPONENT,_THIS_MODULE,__LINE__)
-#define acpi_cm_callocate(a)            _cm_callocate(a, _COMPONENT,_THIS_MODULE,__LINE__)
-#define acpi_cm_free(a)                 _cm_free(a,_COMPONENT,_THIS_MODULE,__LINE__)
-
-#ifndef ACPI_DEBUG_TRACK_ALLOCATIONS
-
-#define acpi_cm_add_element_to_alloc_list(a,b,c,d,e,f)
-#define acpi_cm_delete_element_from_alloc_list(a,b,c,d)
-#define acpi_cm_dump_current_allocations(a,b)
-#define acpi_cm_dump_allocation_info()
-
-#define DECREMENT_OBJECT_METRICS(a)
-#define INCREMENT_OBJECT_METRICS(a)
-#define INITIALIZE_ALLOCATION_METRICS()
-#define DECREMENT_NAME_TABLE_METRICS(a)
-#define INCREMENT_NAME_TABLE_METRICS(a)
-
-#else
-
-#define INITIALIZE_ALLOCATION_METRICS() \
-       acpi_gbl_current_object_count = 0; \
-       acpi_gbl_current_object_size = 0; \
-       acpi_gbl_running_object_count = 0; \
-       acpi_gbl_running_object_size = 0; \
-       acpi_gbl_max_concurrent_object_count = 0; \
-       acpi_gbl_max_concurrent_object_size = 0; \
-       acpi_gbl_current_alloc_size = 0; \
-       acpi_gbl_current_alloc_count = 0; \
-       acpi_gbl_running_alloc_size = 0; \
-       acpi_gbl_running_alloc_count = 0; \
-       acpi_gbl_max_concurrent_alloc_size = 0; \
-       acpi_gbl_max_concurrent_alloc_count = 0; \
-       acpi_gbl_current_node_count = 0; \
-       acpi_gbl_current_node_size = 0; \
-       acpi_gbl_max_concurrent_node_count = 0
-
-
-#define DECREMENT_OBJECT_METRICS(a) \
-       acpi_gbl_current_object_count--; \
-       acpi_gbl_current_object_size -= a
-
-#define INCREMENT_OBJECT_METRICS(a) \
-       acpi_gbl_current_object_count++; \
-       acpi_gbl_running_object_count++; \
-       if (acpi_gbl_max_concurrent_object_count < acpi_gbl_current_object_count) \
-       { \
-               acpi_gbl_max_concurrent_object_count = acpi_gbl_current_object_count; \
-       } \
-       acpi_gbl_running_object_size += a; \
-       acpi_gbl_current_object_size += a; \
-       if (acpi_gbl_max_concurrent_object_size < acpi_gbl_current_object_size) \
-       { \
-               acpi_gbl_max_concurrent_object_size = acpi_gbl_current_object_size; \
-       }
-
-#define DECREMENT_NAME_TABLE_METRICS(a) \
-       acpi_gbl_current_node_count--; \
-       acpi_gbl_current_node_size -= (a)
-
-#define INCREMENT_NAME_TABLE_METRICS(a) \
-       acpi_gbl_current_node_count++; \
-       acpi_gbl_current_node_size+= (a); \
-       if (acpi_gbl_max_concurrent_node_count < acpi_gbl_current_node_count) \
-       { \
-               acpi_gbl_max_concurrent_node_count = acpi_gbl_current_node_count; \
-       } \
-
-
-void
-acpi_cm_dump_allocation_info (
-       void);
-
-void
-acpi_cm_dump_current_allocations (
-       u32                     component,
-       NATIVE_CHAR             *module);
-
-#endif
-
-
-#endif /* _ACCOMMON_H */
diff --git a/reactos/drivers/bus/acpi/include/acconfig.h b/reactos/drivers/bus/acpi/include/acconfig.h
deleted file mode 100644 (file)
index c31e16f..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/******************************************************************************
- *
- * Name: acconfig.h - Global configuration constants
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef _ACCONFIG_H
-#define _ACCONFIG_H
-
-
-/******************************************************************************
- *
- * Compile-time options
- *
- *****************************************************************************/
-
-/*
- * ACPI_DEBUG           - This switch enables all the debug facilities of the ACPI
- *                          subsystem.  This includes the DEBUG_PRINT output statements
- *                          When disabled, all DEBUG_PRINT statements are compiled out.
- *
- * ACPI_APPLICATION     - Use this switch if the subsystem is going to be run
- *                          at the application level.
- *
- */
-
-
-/******************************************************************************
- *
- * Subsystem Constants
- *
- *****************************************************************************/
-
-
-/* Version string */
-
-#define ACPI_CA_VERSION             0x20010313
-
-
-/* Maximum objects in the various object caches */
-
-#define MAX_STATE_CACHE_DEPTH       64         /* State objects for stacks */
-#define MAX_PARSE_CACHE_DEPTH       96          /* Parse tree objects */
-#define MAX_EXTPARSE_CACHE_DEPTH    64          /* Parse tree objects */
-#define MAX_OBJECT_CACHE_DEPTH      64          /* Interpreter operand objects */
-#define MAX_WALK_CACHE_DEPTH        2           /* Objects for parse tree walks (method execution) */
-
-
-/* String size constants */
-
-#define MAX_STRING_LENGTH           512
-#define PATHNAME_MAX                256     /* A full namespace pathname */
-
-
-/* Maximum count for a semaphore object */
-
-#define MAX_SEMAPHORE_COUNT         256
-
-
-/* Max reference count (for debug only) */
-
-#define MAX_REFERENCE_COUNT         0x200
-
-
-/* Size of cached memory mapping for system memory operation region */
-
-#define SYSMEM_REGION_WINDOW_SIZE   4096
-
-
-/*
- * Debugger threading model
- * Use single threaded if the entire subsystem is contained in an application
- * Use multiple threaded when the subsystem is running in the kernel.
- *
- * By default the model is single threaded if ACPI_APPLICATION is set,
- * multi-threaded if ACPI_APPLICATION is not set.
- */
-
-#define DEBUGGER_SINGLE_THREADED    0
-#define DEBUGGER_MULTI_THREADED     1
-
-#ifdef ACPI_APPLICATION
-#define DEBUGGER_THREADING          DEBUGGER_SINGLE_THREADED
-
-#else
-#define DEBUGGER_THREADING          DEBUGGER_MULTI_THREADED
-#endif
-
-
-/******************************************************************************
- *
- * ACPI Specification constants (Do not change unless the specification changes)
- *
- *****************************************************************************/
-
-/*
- * Method info (in WALK_STATE), containing local variables and argumetns
- */
-
-#define MTH_NUM_LOCALS              8
-#define MTH_MAX_LOCAL               7
-
-#define MTH_NUM_ARGS                7
-#define MTH_MAX_ARG                 6
-
-/* Maximum length of resulting string when converting from a buffer */
-
-#define ACPI_MAX_STRING_CONVERSION  200
-
-/*
- * Operand Stack (in WALK_STATE), Must be large enough to contain MTH_MAX_ARG
- */
-
-#define OBJ_NUM_OPERANDS            8
-#define OBJ_MAX_OPERAND             7
-
-/* Names within the namespace are 4 bytes long */
-
-#define ACPI_NAME_SIZE              4
-#define PATH_SEGMENT_LENGTH         5           /* 4 chars for name + 1 s8 for separator */
-#define PATH_SEPARATOR              '.'
-
-
-/* Constants used in searching for the RSDP in low memory */
-
-#define LO_RSDP_WINDOW_BASE         0           /* Physical Address */
-#define HI_RSDP_WINDOW_BASE         0xE0000     /* Physical Address */
-#define LO_RSDP_WINDOW_SIZE         0x400
-#define HI_RSDP_WINDOW_SIZE         0x20000
-#define RSDP_SCAN_STEP              16
-
-#endif /* _ACCONFIG_H */
-
diff --git a/reactos/drivers/bus/acpi/include/acdebug.h b/reactos/drivers/bus/acpi/include/acdebug.h
deleted file mode 100644 (file)
index 3694f51..0000000
+++ /dev/null
@@ -1,411 +0,0 @@
-/******************************************************************************
- *
- * Name: acdebug.h - ACPI/AML debugger
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACDEBUG_H__
-#define __ACDEBUG_H__
-
-
-#define DB_MAX_ARGS             8  /* Must be max method args + 1 */
-
-#define DB_COMMAND_PROMPT      '-'
-#define DB_EXECUTE_PROMPT      '%'
-
-
-extern int                      optind;
-extern NATIVE_CHAR              *optarg;
-extern u8                       *aml_ptr;
-extern u32                      acpi_aml_length;
-
-extern u8                       opt_tables;
-extern u8                       opt_disasm;
-extern u8                       opt_stats;
-extern u8                       opt_parse_jit;
-extern u8                       opt_verbose;
-extern u8                       opt_ini_methods;
-
-
-extern NATIVE_CHAR              *args[DB_MAX_ARGS];
-extern NATIVE_CHAR              line_buf[80];
-extern NATIVE_CHAR              scope_buf[40];
-extern NATIVE_CHAR              debug_filename[40];
-extern u8                       output_to_file;
-extern NATIVE_CHAR              *buffer;
-extern NATIVE_CHAR              *filename;
-extern NATIVE_CHAR              *INDENT_STRING;
-extern u8                       acpi_gbl_db_output_flags;
-extern u32                      acpi_gbl_db_debug_level;
-extern u32                      acpi_gbl_db_console_debug_level;
-
-extern u32                      num_names;
-extern u32                      num_methods;
-extern u32                      num_regions;
-extern u32                      num_packages;
-extern u32                      num_aliases;
-extern u32                      num_devices;
-extern u32                      num_field_defs;
-extern u32                      num_thermal_zones;
-extern u32                      num_nodes;
-extern u32                      num_grammar_elements;
-extern u32                      num_method_elements ;
-extern u32                      num_mutexes;
-extern u32                      num_power_resources;
-extern u32                      num_bank_fields ;
-extern u32                      num_index_fields;
-extern u32                      num_events;
-
-extern u32                      size_of_parse_tree;
-extern u32                      size_of_method_trees;
-extern u32                      size_of_nTes;
-extern u32                      size_of_acpi_objects;
-
-
-#define BUFFER_SIZE             4196
-
-#define DB_REDIRECTABLE_OUTPUT  0x01
-#define DB_CONSOLE_OUTPUT       0x02
-#define DB_DUPLICATE_OUTPUT     0x03
-
-
-typedef struct command_info
-{
-       NATIVE_CHAR             *name;          /* Command Name */
-       u8                      min_args;       /* Minimum arguments required */
-
-} COMMAND_INFO;
-
-
-typedef struct argument_info
-{
-       NATIVE_CHAR             *name;          /* Argument Name */
-
-} ARGUMENT_INFO;
-
-
-#define PARAM_LIST(pl)                  pl
-
-#define DBTEST_OUTPUT_LEVEL(lvl)        if (opt_verbose)
-
-#define VERBOSE_PRINT(fp)               DBTEST_OUTPUT_LEVEL(lvl) {\
-                         acpi_os_printf PARAM_LIST(fp);}
-
-#define EX_NO_SINGLE_STEP       1
-#define EX_SINGLE_STEP          2
-
-
-/* Prototypes */
-
-
-/*
- * dbapi - external debugger interfaces
- */
-
-int
-acpi_db_initialize (
-       void);
-
-ACPI_STATUS
-acpi_db_single_step (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       u8                      op_type);
-
-
-/*
- * dbcmds - debug commands and output routines
- */
-
-
-void
-acpi_db_display_table_info (
-       NATIVE_CHAR             *table_arg);
-
-void
-acpi_db_unload_acpi_table (
-       NATIVE_CHAR             *table_arg,
-       NATIVE_CHAR             *instance_arg);
-
-void
-acpi_db_set_method_breakpoint (
-       NATIVE_CHAR             *location,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_db_set_method_call_breakpoint (
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_db_disassemble_aml (
-       NATIVE_CHAR             *statements,
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_db_dump_namespace (
-       NATIVE_CHAR             *start_arg,
-       NATIVE_CHAR             *depth_arg);
-
-void
-acpi_db_dump_namespace_by_owner (
-       NATIVE_CHAR             *owner_arg,
-       NATIVE_CHAR             *depth_arg);
-
-void
-acpi_db_send_notify (
-       NATIVE_CHAR             *name,
-       u32                     value);
-
-void
-acpi_db_set_method_data (
-       NATIVE_CHAR             *type_arg,
-       NATIVE_CHAR             *index_arg,
-       NATIVE_CHAR             *value_arg);
-
-ACPI_STATUS
-acpi_db_display_objects (
-       NATIVE_CHAR             *obj_type_arg,
-       NATIVE_CHAR             *display_count_arg);
-
-ACPI_STATUS
-acpi_db_find_name_in_namespace (
-       NATIVE_CHAR             *name_arg);
-
-void
-acpi_db_set_scope (
-       NATIVE_CHAR             *name);
-
-void
-acpi_db_find_references (
-       NATIVE_CHAR             *object_arg);
-
-void
-acpi_db_display_locks (void);
-
-
-void
-acpi_db_display_resources (
-       NATIVE_CHAR             *object_arg);
-
-
-/*
- * dbdisasm - AML disassembler
- */
-
-void
-acpi_db_display_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *origin,
-       u32                     num_opcodes);
-
-void
-acpi_db_display_namestring (
-       NATIVE_CHAR             *name);
-
-void
-acpi_db_display_path (
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_db_display_opcode (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_db_decode_internal_object (
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-
-/*
- * dbdisply - debug display commands
- */
-
-
-void
-acpi_db_display_method_info (
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_db_decode_and_display_object (
-       NATIVE_CHAR             *target,
-       NATIVE_CHAR             *output_type);
-
-void
-acpi_db_display_result_object (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_db_display_all_methods (
-       NATIVE_CHAR             *display_count_arg);
-
-void
-acpi_db_display_internal_object (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-void
-acpi_db_display_arguments (
-       void);
-
-void
-acpi_db_display_locals (
-       void);
-
-void
-acpi_db_display_results (
-       void);
-
-void
-acpi_db_display_calling_tree (
-       void);
-
-void
-acpi_db_display_argument_object (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-
-/*
- * dbexec - debugger control method execution
- */
-
-void
-acpi_db_execute (
-       NATIVE_CHAR             *name,
-       NATIVE_CHAR             **args,
-       u32                     flags);
-
-void
-acpi_db_create_execution_threads (
-       NATIVE_CHAR             *num_threads_arg,
-       NATIVE_CHAR             *num_loops_arg,
-       NATIVE_CHAR             *method_name_arg);
-
-
-/*
- * dbfileio - Debugger file I/O commands
- */
-
-OBJECT_TYPE_INTERNAL
-acpi_db_match_argument (
-       NATIVE_CHAR             *user_argument,
-       ARGUMENT_INFO           *arguments);
-
-
-void
-acpi_db_close_debug_file (
-       void);
-
-void
-acpi_db_open_debug_file (
-       NATIVE_CHAR             *name);
-
-ACPI_STATUS
-acpi_db_load_acpi_table (
-       NATIVE_CHAR             *filename);
-
-
-/*
- * dbhistry - debugger HISTORY command
- */
-
-void
-acpi_db_add_to_history (
-       NATIVE_CHAR             *command_line);
-
-void
-acpi_db_display_history (void);
-
-NATIVE_CHAR *
-acpi_db_get_from_history (
-       NATIVE_CHAR             *command_num_arg);
-
-
-/*
- * dbinput - user front-end to the AML debugger
- */
-
-ACPI_STATUS
-acpi_db_command_dispatch (
-       NATIVE_CHAR             *input_buffer,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_db_execute_thread (
-       void                    *context);
-
-ACPI_STATUS
-acpi_db_user_commands (
-       NATIVE_CHAR             prompt,
-       ACPI_PARSE_OBJECT       *op);
-
-
-/*
- * dbstats - Generation and display of ACPI table statistics
- */
-
-void
-acpi_db_generate_statistics (
-       ACPI_PARSE_OBJECT       *root,
-       u8                      is_method);
-
-
-ACPI_STATUS
-acpi_db_display_statistics (
-       NATIVE_CHAR             *type_arg);
-
-
-/*
- * dbutils - AML debugger utilities
- */
-
-void
-acpi_db_set_output_destination (
-       u32                     where);
-
-void
-acpi_db_dump_buffer (
-       u32                     address);
-
-void
-acpi_db_dump_object (
-       ACPI_OBJECT             *obj_desc,
-       u32                     level);
-
-void
-acpi_db_prep_namestring (
-       NATIVE_CHAR             *name);
-
-
-ACPI_STATUS
-acpi_db_second_pass_parse (
-       ACPI_PARSE_OBJECT       *root);
-
-ACPI_NAMESPACE_NODE *
-acpi_db_local_ns_lookup (
-       NATIVE_CHAR             *name);
-
-
-#endif  /* __ACDEBUG_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acdispat.h b/reactos/drivers/bus/acpi/include/acdispat.h
deleted file mode 100644 (file)
index ab79229..0000000
+++ /dev/null
@@ -1,450 +0,0 @@
-/******************************************************************************
- *
- * Name: acdispat.h - dispatcher (parser to interpreter interface)
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#ifndef _ACDISPAT_H_
-#define _ACDISPAT_H_
-
-
-#define NAMEOF_LOCAL_NTE    "__L0"
-#define NAMEOF_ARG_NTE      "__A0"
-
-
-/* Common interfaces */
-
-ACPI_STATUS
-acpi_ds_obj_stack_push (
-       void                    *object,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_obj_stack_pop (
-       u32                     pop_count,
-       ACPI_WALK_STATE         *walk_state);
-
-void *
-acpi_ds_obj_stack_get_value (
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_obj_stack_pop_object (
-       ACPI_OPERAND_OBJECT     **object,
-       ACPI_WALK_STATE         *walk_state);
-
-
-/* dsopcode - support for late evaluation */
-
-ACPI_STATUS
-acpi_ds_get_field_unit_arguments (
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-ACPI_STATUS
-acpi_ds_get_region_arguments (
-       ACPI_OPERAND_OBJECT     *rgn_desc);
-
-
-/* dsctrl - Parser/Interpreter interface, control stack routines */
-
-
-ACPI_STATUS
-acpi_ds_exec_begin_control_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op);
-
-ACPI_STATUS
-acpi_ds_exec_end_control_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op);
-
-
-/* dsexec - Parser/Interpreter interface, method execution callbacks */
-
-
-ACPI_STATUS
-acpi_ds_get_predicate_value (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       NATIVE_UINT             has_result_obj);
-
-ACPI_STATUS
-acpi_ds_exec_begin_op (
-       u16                     opcode,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       **out_op);
-
-ACPI_STATUS
-acpi_ds_exec_end_op (
-       ACPI_WALK_STATE         *state,
-       ACPI_PARSE_OBJECT       *op);
-
-
-/* dsfield - Parser/Interpreter interface for AML fields */
-
-
-ACPI_STATUS
-acpi_ds_create_field (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_NAMESPACE_NODE     *region_node,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_create_bank_field (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_NAMESPACE_NODE     *region_node,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_create_index_field (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_HANDLE             region_node,
-       ACPI_WALK_STATE         *walk_state);
-
-
-/* dsload - Parser/Interpreter interface, namespace load callbacks */
-
-ACPI_STATUS
-acpi_ds_load1_begin_op (
-       u16                     opcode,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       **out_op);
-
-ACPI_STATUS
-acpi_ds_load1_end_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op);
-
-ACPI_STATUS
-acpi_ds_load2_begin_op (
-       u16                     opcode,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       **out_op);
-
-ACPI_STATUS
-acpi_ds_load2_end_op (
-       ACPI_WALK_STATE         *state,
-       ACPI_PARSE_OBJECT       *op);
-
-ACPI_STATUS
-acpi_ds_load3_begin_op (
-       u16                     opcode,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       **out_op);
-
-ACPI_STATUS
-acpi_ds_load3_end_op (
-       ACPI_WALK_STATE         *state,
-       ACPI_PARSE_OBJECT       *op);
-
-
-/* dsmthdat - method data (locals/args) */
-
-
-ACPI_STATUS
-acpi_ds_store_object_to_local (
-       u16                     opcode,
-       u32                     index,
-       ACPI_OPERAND_OBJECT     *src_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_method_data_get_entry (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     ***node);
-
-ACPI_STATUS
-acpi_ds_method_data_delete_all (
-       ACPI_WALK_STATE         *walk_state);
-
-u8
-acpi_ds_is_method_value (
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-OBJECT_TYPE_INTERNAL
-acpi_ds_method_data_get_type (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_method_data_get_value (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **dest_desc);
-
-ACPI_STATUS
-acpi_ds_method_data_delete_value (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_method_data_init_args (
-       ACPI_OPERAND_OBJECT     **params,
-       u32                     max_param_count,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_NAMESPACE_NODE *
-acpi_ds_method_data_get_node (
-       u16                     opcode,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_method_data_init (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_method_data_set_entry (
-       u16                     opcode,
-       u32                     index,
-       ACPI_OPERAND_OBJECT     *object,
-       ACPI_WALK_STATE         *walk_state);
-
-
-/* dsmethod - Parser/Interpreter interface - control method parsing */
-
-ACPI_STATUS
-acpi_ds_parse_method (
-       ACPI_HANDLE             obj_handle);
-
-ACPI_STATUS
-acpi_ds_call_control_method (
-       ACPI_WALK_LIST          *walk_list,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op);
-
-ACPI_STATUS
-acpi_ds_restart_control_method (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     *return_desc);
-
-ACPI_STATUS
-acpi_ds_terminate_control_method (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_begin_method_execution (
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_NAMESPACE_NODE     *calling_method_node);
-
-
-/* dsobj - Parser/Interpreter interface - object initialization and conversion */
-
-ACPI_STATUS
-acpi_ds_init_one_object (
-       ACPI_HANDLE             obj_handle,
-       u32                     level,
-       void                    *context,
-       void                    **return_value);
-
-ACPI_STATUS
-acpi_ds_initialize_objects (
-       ACPI_TABLE_DESC         *table_desc,
-       ACPI_NAMESPACE_NODE     *start_node);
-
-ACPI_STATUS
-acpi_ds_build_internal_package_obj (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_OPERAND_OBJECT     **obj_desc);
-
-ACPI_STATUS
-acpi_ds_build_internal_object (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_OPERAND_OBJECT     **obj_desc_ptr);
-
-ACPI_STATUS
-acpi_ds_init_object_from_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       u16                     opcode,
-       ACPI_OPERAND_OBJECT     **obj_desc);
-
-ACPI_STATUS
-acpi_ds_create_node (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_PARSE_OBJECT       *op);
-
-
-/* dsregn - Parser/Interpreter interface - Op Region parsing */
-
-ACPI_STATUS
-acpi_ds_eval_field_unit_operands (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op);
-
-ACPI_STATUS
-acpi_ds_eval_region_operands (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op);
-
-ACPI_STATUS
-acpi_ds_initialize_region (
-       ACPI_HANDLE             obj_handle);
-
-
-/* dsutils - Parser/Interpreter interface utility routines */
-
-u8
-acpi_ds_is_result_used (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state);
-
-void
-acpi_ds_delete_result_if_not_used (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_OPERAND_OBJECT     *result_obj,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_create_operand (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *arg,
-       u32                     args_remaining);
-
-ACPI_STATUS
-acpi_ds_create_operands (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *first_arg);
-
-ACPI_STATUS
-acpi_ds_resolve_operands (
-       ACPI_WALK_STATE         *walk_state);
-
-OBJECT_TYPE_INTERNAL
-acpi_ds_map_opcode_to_data_type (
-       u16                     opcode,
-       u32                     *out_flags);
-
-OBJECT_TYPE_INTERNAL
-acpi_ds_map_named_opcode_to_data_type (
-       u16                     opcode);
-
-
-/*
- * dswscope - Scope Stack manipulation
- */
-
-ACPI_STATUS
-acpi_ds_scope_stack_push (
-       ACPI_NAMESPACE_NODE     *node,
-       OBJECT_TYPE_INTERNAL    type,
-       ACPI_WALK_STATE         *walk_state);
-
-
-ACPI_STATUS
-acpi_ds_scope_stack_pop (
-       ACPI_WALK_STATE         *walk_state);
-
-void
-acpi_ds_scope_stack_clear (
-       ACPI_WALK_STATE         *walk_state);
-
-
-/* Acpi_dswstate - parser WALK_STATE management routines */
-
-ACPI_WALK_STATE *
-acpi_ds_create_walk_state (
-       ACPI_OWNER_ID           owner_id,
-       ACPI_PARSE_OBJECT       *origin,
-       ACPI_OPERAND_OBJECT     *mth_desc,
-       ACPI_WALK_LIST          *walk_list);
-
-ACPI_STATUS
-acpi_ds_obj_stack_delete_all (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_obj_stack_pop_and_delete (
-       u32                     pop_count,
-       ACPI_WALK_STATE         *walk_state);
-
-void
-acpi_ds_delete_walk_state (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_WALK_STATE *
-acpi_ds_pop_walk_state (
-       ACPI_WALK_LIST          *walk_list);
-
-ACPI_STATUS
-acpi_ds_result_stack_pop (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_result_stack_push (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_result_stack_clear (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_WALK_STATE *
-acpi_ds_get_current_walk_state (
-       ACPI_WALK_LIST          *walk_list);
-
-void
-acpi_ds_delete_walk_state_cache (
-       void);
-
-ACPI_STATUS
-acpi_ds_result_insert (
-       void                    *object,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_result_remove (
-       ACPI_OPERAND_OBJECT     **object,
-       u32                     index,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_result_pop (
-       ACPI_OPERAND_OBJECT     **object,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_result_push (
-       ACPI_OPERAND_OBJECT     *object,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ds_result_pop_from_bottom (
-       ACPI_OPERAND_OBJECT     **object,
-       ACPI_WALK_STATE         *walk_state);
-
-#endif /* _ACDISPAT_H_ */
diff --git a/reactos/drivers/bus/acpi/include/acevents.h b/reactos/drivers/bus/acpi/include/acevents.h
deleted file mode 100644 (file)
index 4f54d64..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/******************************************************************************
- *
- * Name: acevents.h - Event subcomponent prototypes and defines
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACEVENTS_H__
-#define __ACEVENTS_H__
-
-
-ACPI_STATUS
-acpi_ev_initialize (
-       void);
-
-
-/*
- * Acpi_evfixed - Fixed event handling
- */
-
-ACPI_STATUS
-acpi_ev_fixed_event_initialize (
-       void);
-
-u32
-acpi_ev_fixed_event_detect (
-       void);
-
-u32
-acpi_ev_fixed_event_dispatch (
-       u32                     acpi_event);
-
-
-/*
- * Acpi_evglock - Global Lock support
- */
-
-ACPI_STATUS
-acpi_ev_acquire_global_lock(
-       void);
-
-void
-acpi_ev_release_global_lock(
-       void);
-
-ACPI_STATUS
-acpi_ev_init_global_lock_handler (
-       void);
-
-
-/*
- * Acpi_evgpe - GPE handling and dispatch
- */
-
-ACPI_STATUS
-acpi_ev_gpe_initialize (
-       void);
-
-ACPI_STATUS
-acpi_ev_init_gpe_control_methods (
-       void);
-
-u32
-acpi_ev_gpe_dispatch (
-       u32                     gpe_number);
-
-u32
-acpi_ev_gpe_detect (
-       void);
-
-
-/*
- * Acpi_evnotify - Device Notify handling and dispatch
- */
-
-ACPI_STATUS
-acpi_ev_queue_notify_request (
-       ACPI_NAMESPACE_NODE     *node,
-       u32                     notify_value);
-
-void
-acpi_ev_notify_dispatch (
-       void                    *context);
-
-/*
- * Acpi_evregion - Address Space handling
- */
-
-ACPI_STATUS
-acpi_ev_install_default_address_space_handlers (
-       void);
-
-ACPI_STATUS
-acpi_ev_address_space_dispatch (
-       ACPI_OPERAND_OBJECT    *region_obj,
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value);
-
-
-ACPI_STATUS
-acpi_ev_addr_handler_helper (
-       ACPI_HANDLE             obj_handle,
-       u32                     level,
-       void                    *context,
-       void                    **return_value);
-
-void
-acpi_ev_disassociate_region_from_handler(
-       ACPI_OPERAND_OBJECT    *region_obj,
-       u8                      acpi_ns_is_locked);
-
-
-ACPI_STATUS
-acpi_ev_associate_region_and_handler (
-       ACPI_OPERAND_OBJECT     *handler_obj,
-       ACPI_OPERAND_OBJECT     *region_obj,
-       u8                      acpi_ns_is_locked);
-
-
-/*
- * Acpi_evregini - Region initialization and setup
- */
-
-ACPI_STATUS
-acpi_ev_system_memory_region_setup (
-       ACPI_HANDLE             handle,
-       u32                     function,
-       void                    *handler_context,
-       void                    **region_context);
-
-ACPI_STATUS
-acpi_ev_io_space_region_setup (
-       ACPI_HANDLE             handle,
-       u32                     function,
-       void                    *handler_context,
-       void                    **region_context);
-
-ACPI_STATUS
-acpi_ev_pci_config_region_setup (
-       ACPI_HANDLE             handle,
-       u32                     function,
-       void                    *handler_context,
-       void                    **region_context);
-
-ACPI_STATUS
-acpi_ev_default_region_setup (
-       ACPI_HANDLE             handle,
-       u32                     function,
-       void                    *handler_context,
-       void                    **region_context);
-
-ACPI_STATUS
-acpi_ev_initialize_region (
-       ACPI_OPERAND_OBJECT     *region_obj,
-       u8                      acpi_ns_locked);
-
-
-/*
- * Evsci - SCI (System Control Interrupt) handling/dispatch
- */
-
-u32
-acpi_ev_install_sci_handler (
-       void);
-
-ACPI_STATUS
-acpi_ev_remove_sci_handler (
-       void);
-
-u32
-acpi_ev_initialize_sCI (
-       u32                     program_sCI);
-
-void
-acpi_ev_restore_acpi_state (
-       void);
-
-void
-acpi_ev_terminate (
-       void);
-
-
-#endif  /* __ACEVENTS_H__  */
diff --git a/reactos/drivers/bus/acpi/include/acexcep.h b/reactos/drivers/bus/acpi/include/acexcep.h
deleted file mode 100644 (file)
index 82089e3..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/******************************************************************************
- *
- * Name: acexcep.h - Exception codes returned by the ACPI subsystem
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACEXCEP_H__
-#define __ACEXCEP_H__
-
-
-/*
- * Exceptions returned by external ACPI interfaces
- */
-
-#define AE_CODE_ENVIRONMENTAL           0x0000
-#define AE_CODE_PROGRAMMER              0x1000
-#define AE_CODE_ACPI_TABLES             0x2000
-#define AE_CODE_AML                     0x3000
-#define AE_CODE_CONTROL                 0x4000
-#define AE_CODE_MASK                    0xF000
-
-
-#define ACPI_SUCCESS(a)                 (!(a))
-#define ACPI_FAILURE(a)                 (a)
-
-
-#define AE_OK                           (ACPI_STATUS) 0x0000
-
-/*
- * Environmental exceptions
- */
-#define AE_ERROR                        (ACPI_STATUS) (0x0001 | AE_CODE_ENVIRONMENTAL)
-#define AE_NO_ACPI_TABLES               (ACPI_STATUS) (0x0002 | AE_CODE_ENVIRONMENTAL)
-#define AE_NO_NAMESPACE                 (ACPI_STATUS) (0x0003 | AE_CODE_ENVIRONMENTAL)
-#define AE_NO_MEMORY                    (ACPI_STATUS) (0x0004 | AE_CODE_ENVIRONMENTAL)
-#define AE_NOT_FOUND                    (ACPI_STATUS) (0x0005 | AE_CODE_ENVIRONMENTAL)
-#define AE_NOT_EXIST                    (ACPI_STATUS) (0x0006 | AE_CODE_ENVIRONMENTAL)
-#define AE_EXIST                        (ACPI_STATUS) (0x0007 | AE_CODE_ENVIRONMENTAL)
-#define AE_TYPE                         (ACPI_STATUS) (0x0008 | AE_CODE_ENVIRONMENTAL)
-#define AE_NULL_OBJECT                  (ACPI_STATUS) (0x0009 | AE_CODE_ENVIRONMENTAL)
-#define AE_NULL_ENTRY                   (ACPI_STATUS) (0x000A | AE_CODE_ENVIRONMENTAL)
-#define AE_BUFFER_OVERFLOW              (ACPI_STATUS) (0x000B | AE_CODE_ENVIRONMENTAL)
-#define AE_STACK_OVERFLOW               (ACPI_STATUS) (0x000C | AE_CODE_ENVIRONMENTAL)
-#define AE_STACK_UNDERFLOW              (ACPI_STATUS) (0x000D | AE_CODE_ENVIRONMENTAL)
-#define AE_NOT_IMPLEMENTED              (ACPI_STATUS) (0x000E | AE_CODE_ENVIRONMENTAL)
-#define AE_VERSION_MISMATCH             (ACPI_STATUS) (0x000F | AE_CODE_ENVIRONMENTAL)
-#define AE_SUPPORT                      (ACPI_STATUS) (0x0010 | AE_CODE_ENVIRONMENTAL)
-#define AE_SHARE                        (ACPI_STATUS) (0x0011 | AE_CODE_ENVIRONMENTAL)
-#define AE_LIMIT                        (ACPI_STATUS) (0x0012 | AE_CODE_ENVIRONMENTAL)
-#define AE_TIME                         (ACPI_STATUS) (0x0013 | AE_CODE_ENVIRONMENTAL)
-#define AE_UNKNOWN_STATUS               (ACPI_STATUS) (0x0014 | AE_CODE_ENVIRONMENTAL)
-#define AE_ACQUIRE_DEADLOCK             (ACPI_STATUS) (0x0015 | AE_CODE_ENVIRONMENTAL)
-#define AE_RELEASE_DEADLOCK             (ACPI_STATUS) (0x0016 | AE_CODE_ENVIRONMENTAL)
-#define AE_NOT_ACQUIRED                 (ACPI_STATUS) (0x0017 | AE_CODE_ENVIRONMENTAL)
-#define AE_ALREADY_ACQUIRED             (ACPI_STATUS) (0x0018 | AE_CODE_ENVIRONMENTAL)
-#define AE_NO_HARDWARE_RESPONSE         (ACPI_STATUS) (0x0019 | AE_CODE_ENVIRONMENTAL)
-#define AE_NO_GLOBAL_LOCK               (ACPI_STATUS) (0x001A | AE_CODE_ENVIRONMENTAL)
-
-#define AE_CODE_ENV_MAX                 0x001A
-
-/*
- * Programmer exceptions
- */
-#define AE_BAD_PARAMETER                (ACPI_STATUS) (0x0001 | AE_CODE_PROGRAMMER)
-#define AE_BAD_CHARACTER                (ACPI_STATUS) (0x0002 | AE_CODE_PROGRAMMER)
-#define AE_BAD_PATHNAME                 (ACPI_STATUS) (0x0003 | AE_CODE_PROGRAMMER)
-#define AE_BAD_DATA                     (ACPI_STATUS) (0x0004 | AE_CODE_PROGRAMMER)
-#define AE_BAD_ADDRESS                  (ACPI_STATUS) (0x0005 | AE_CODE_PROGRAMMER)
-
-#define AE_CODE_PGM_MAX                 0x0005
-
-
-/*
- * Acpi table exceptions
- */
-#define AE_BAD_SIGNATURE                (ACPI_STATUS) (0x0001 | AE_CODE_ACPI_TABLES)
-#define AE_BAD_HEADER                   (ACPI_STATUS) (0x0002 | AE_CODE_ACPI_TABLES)
-#define AE_BAD_CHECKSUM                 (ACPI_STATUS) (0x0003 | AE_CODE_ACPI_TABLES)
-#define AE_BAD_VALUE                    (ACPI_STATUS) (0x0004 | AE_CODE_ACPI_TABLES)
-
-#define AE_CODE_TBL_MAX                 0x0003
-
-
-/*
- * AML exceptions.  These are caused by problems with
- * the actual AML byte stream
- */
-#define AE_AML_ERROR                    (ACPI_STATUS) (0x0001 | AE_CODE_AML)
-#define AE_AML_PARSE                    (ACPI_STATUS) (0x0002 | AE_CODE_AML)
-#define AE_AML_BAD_OPCODE               (ACPI_STATUS) (0x0003 | AE_CODE_AML)
-#define AE_AML_NO_OPERAND               (ACPI_STATUS) (0x0004 | AE_CODE_AML)
-#define AE_AML_OPERAND_TYPE             (ACPI_STATUS) (0x0005 | AE_CODE_AML)
-#define AE_AML_OPERAND_VALUE            (ACPI_STATUS) (0x0006 | AE_CODE_AML)
-#define AE_AML_UNINITIALIZED_LOCAL      (ACPI_STATUS) (0x0007 | AE_CODE_AML)
-#define AE_AML_UNINITIALIZED_ARG        (ACPI_STATUS) (0x0008 | AE_CODE_AML)
-#define AE_AML_UNINITIALIZED_ELEMENT    (ACPI_STATUS) (0x0009 | AE_CODE_AML)
-#define AE_AML_NUMERIC_OVERFLOW         (ACPI_STATUS) (0x000A | AE_CODE_AML)
-#define AE_AML_REGION_LIMIT             (ACPI_STATUS) (0x000B | AE_CODE_AML)
-#define AE_AML_BUFFER_LIMIT             (ACPI_STATUS) (0x000C | AE_CODE_AML)
-#define AE_AML_PACKAGE_LIMIT            (ACPI_STATUS) (0x000D | AE_CODE_AML)
-#define AE_AML_DIVIDE_BY_ZERO           (ACPI_STATUS) (0x000E | AE_CODE_AML)
-#define AE_AML_BAD_NAME                 (ACPI_STATUS) (0x000F | AE_CODE_AML)
-#define AE_AML_NAME_NOT_FOUND           (ACPI_STATUS) (0x0010 | AE_CODE_AML)
-#define AE_AML_INTERNAL                 (ACPI_STATUS) (0x0011 | AE_CODE_AML)
-#define AE_AML_INVALID_SPACE_ID         (ACPI_STATUS) (0x0012 | AE_CODE_AML)
-#define AE_AML_STRING_LIMIT             (ACPI_STATUS) (0x0013 | AE_CODE_AML)
-#define AE_AML_NO_RETURN_VALUE          (ACPI_STATUS) (0x0014 | AE_CODE_AML)
-#define AE_AML_METHOD_LIMIT             (ACPI_STATUS) (0x0015 | AE_CODE_AML)
-#define AE_AML_NOT_OWNER                (ACPI_STATUS) (0x0016 | AE_CODE_AML)
-#define AE_AML_MUTEX_ORDER              (ACPI_STATUS) (0x0017 | AE_CODE_AML)
-#define AE_AML_MUTEX_NOT_ACQUIRED       (ACPI_STATUS) (0x0018 | AE_CODE_AML)
-
-#define AE_CODE_AML_MAX                 0x0018
-
-/*
- * Internal exceptions used for control
- */
-#define AE_CTRL_RETURN_VALUE            (ACPI_STATUS) (0x0001 | AE_CODE_CONTROL)
-#define AE_CTRL_PENDING                 (ACPI_STATUS) (0x0002 | AE_CODE_CONTROL)
-#define AE_CTRL_TERMINATE               (ACPI_STATUS) (0x0003 | AE_CODE_CONTROL)
-#define AE_CTRL_TRUE                    (ACPI_STATUS) (0x0004 | AE_CODE_CONTROL)
-#define AE_CTRL_FALSE                   (ACPI_STATUS) (0x0005 | AE_CODE_CONTROL)
-#define AE_CTRL_DEPTH                   (ACPI_STATUS) (0x0006 | AE_CODE_CONTROL)
-#define AE_CTRL_END                     (ACPI_STATUS) (0x0007 | AE_CODE_CONTROL)
-#define AE_CTRL_TRANSFER                (ACPI_STATUS) (0x0008 | AE_CODE_CONTROL)
-
-#define AE_CODE_CTRL_MAX                0x0008
-
-
-
-#endif /* __ACEXCEP_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acglobal.h b/reactos/drivers/bus/acpi/include/acglobal.h
deleted file mode 100644 (file)
index 92446be..0000000
+++ /dev/null
@@ -1,301 +0,0 @@
-/******************************************************************************
- *
- * Name: acglobal.h - Declarations for global variables
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACGLOBAL_H__
-#define __ACGLOBAL_H__
-
-
-/*
- * Ensure that the globals are actually defined only once.
- *
- * The use of these defines allows a single list of globals (here) in order
- * to simplify maintenance of the code.
- */
-#ifdef DEFINE_ACPI_GLOBALS
-#define ACPI_EXTERN
-#else
-#define ACPI_EXTERN extern
-#endif
-
-
-extern      NATIVE_CHAR                 *msg_acpi_error_break;
-
-/*****************************************************************************
- *
- * Debug support
- *
- ****************************************************************************/
-
-/* Runtime configuration of debug print levels */
-
-extern      u32                         acpi_dbg_level;
-extern      u32                         acpi_dbg_layer;
-
-
-/* Procedure nesting level for debug output */
-
-extern      u32                         acpi_gbl_nesting_level;
-
-
-/*****************************************************************************
- *
- * ACPI Table globals
- *
- ****************************************************************************/
-
-/*
- * Table pointers.
- * Although these pointers are somewhat redundant with the global Acpi_table,
- * they are convenient because they are typed pointers.
- *
- * These tables are single-table only; meaning that there can be at most one
- * of each in the system.  Each global points to the actual table.
- *
- */
-ACPI_EXTERN RSDP_DESCRIPTOR             *acpi_gbl_RSDP;
-ACPI_EXTERN XSDT_DESCRIPTOR             *acpi_gbl_XSDT;
-ACPI_EXTERN FADT_DESCRIPTOR             *acpi_gbl_FADT;
-ACPI_EXTERN ACPI_TABLE_HEADER           *acpi_gbl_DSDT;
-ACPI_EXTERN ACPI_COMMON_FACS            *acpi_gbl_FACS;
-
-/*
- * Since there may be multiple SSDTs and PSDTS, a single pointer is not
- * sufficient; Therefore, there isn't one!
- */
-
-
-/*
- * ACPI Table info arrays
- */
-extern      ACPI_TABLE_DESC             acpi_gbl_acpi_tables[NUM_ACPI_TABLES];
-extern      ACPI_TABLE_SUPPORT          acpi_gbl_acpi_table_data[NUM_ACPI_TABLES];
-
-/*
- * Predefined mutex objects.  This array contains the
- * actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs.
- * (The table maps local handles to the real OS handles)
- */
-ACPI_EXTERN ACPI_MUTEX_INFO             acpi_gbl_acpi_mutex_info [NUM_MTX];
-
-
-/*****************************************************************************
- *
- * Miscellaneous globals
- *
- ****************************************************************************/
-
-
-ACPI_EXTERN u8                         *acpi_gbl_gpe0enable_register_save;
-ACPI_EXTERN u8                         *acpi_gbl_gpe1_enable_register_save;
-ACPI_EXTERN ACPI_WALK_STATE            *acpi_gbl_breakpoint_walk;
-ACPI_EXTERN ACPI_GENERIC_STATE         *acpi_gbl_generic_state_cache;
-ACPI_EXTERN ACPI_PARSE_OBJECT          *acpi_gbl_parse_cache;
-ACPI_EXTERN ACPI_PARSE2_OBJECT         *acpi_gbl_ext_parse_cache;
-ACPI_EXTERN ACPI_OPERAND_OBJECT        *acpi_gbl_object_cache;
-ACPI_EXTERN ACPI_WALK_STATE            *acpi_gbl_walk_state_cache;
-ACPI_EXTERN ACPI_HANDLE                 acpi_gbl_global_lock_semaphore;
-
-
-ACPI_EXTERN u32                         acpi_gbl_global_lock_thread_count;
-ACPI_EXTERN u32                         acpi_gbl_restore_acpi_chipset;
-ACPI_EXTERN u32                         acpi_gbl_original_mode;
-ACPI_EXTERN u32                         acpi_gbl_edge_level_save;
-ACPI_EXTERN u32                         acpi_gbl_irq_enable_save;
-ACPI_EXTERN u32                         acpi_gbl_rsdp_original_location;
-
-ACPI_EXTERN u32                         acpi_gbl_state_cache_requests;
-ACPI_EXTERN u32                         acpi_gbl_state_cache_hits;
-ACPI_EXTERN u32                         acpi_gbl_parse_cache_requests;
-ACPI_EXTERN u32                         acpi_gbl_parse_cache_hits;
-ACPI_EXTERN u32                         acpi_gbl_ext_parse_cache_requests;
-ACPI_EXTERN u32                         acpi_gbl_ext_parse_cache_hits;
-ACPI_EXTERN u32                         acpi_gbl_object_cache_requests;
-ACPI_EXTERN u32                         acpi_gbl_object_cache_hits;
-ACPI_EXTERN u32                         acpi_gbl_walk_state_cache_requests;
-ACPI_EXTERN u32                         acpi_gbl_walk_state_cache_hits;
-ACPI_EXTERN u32                         acpi_gbl_ns_lookup_count;
-ACPI_EXTERN u32                         acpi_gbl_ps_find_count;
-
-
-ACPI_EXTERN u16                         acpi_gbl_generic_state_cache_depth;
-ACPI_EXTERN u16                         acpi_gbl_parse_cache_depth;
-ACPI_EXTERN u16                         acpi_gbl_ext_parse_cache_depth;
-ACPI_EXTERN u16                         acpi_gbl_object_cache_depth;
-ACPI_EXTERN u16                         acpi_gbl_walk_state_cache_depth;
-ACPI_EXTERN u16                         acpi_gbl_pm1_enable_register_save;
-ACPI_EXTERN u16                         acpi_gbl_next_table_owner_id;
-ACPI_EXTERN u16                         acpi_gbl_next_method_owner_id;
-
-ACPI_EXTERN u8                          acpi_gbl_debugger_configuration;
-ACPI_EXTERN u8                          acpi_gbl_global_lock_acquired;
-ACPI_EXTERN u8                          acpi_gbl_step_to_next_call;
-ACPI_EXTERN u8                          acpi_gbl_acpi_hardware_present;
-ACPI_EXTERN u8                          acpi_gbl_global_lock_present;
-
-ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER  acpi_gbl_drv_notify;
-ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER  acpi_gbl_sys_notify;
-
-
-extern u8                               acpi_gbl_shutdown;
-extern u32                              acpi_gbl_system_flags;
-extern u32                              acpi_gbl_startup_flags;
-extern u8                               acpi_gbl_decode_to8bit[8];
-extern NATIVE_CHAR                      acpi_gbl_hex_to_ascii[16];
-
-
-/*****************************************************************************
- *
- * Namespace globals
- *
- ****************************************************************************/
-
-#define NUM_NS_TYPES                    INTERNAL_TYPE_INVALID+1
-#define NUM_PREDEFINED_NAMES            9
-
-
-ACPI_EXTERN ACPI_NAMESPACE_NODE         acpi_gbl_root_node_struct;
-ACPI_EXTERN ACPI_NAMESPACE_NODE        *acpi_gbl_root_node;
-
-extern u8                               acpi_gbl_ns_properties[NUM_NS_TYPES];
-extern PREDEFINED_NAMES                 acpi_gbl_pre_defined_names [NUM_PREDEFINED_NAMES];
-
-
-/* Used to detect memory leaks (DEBUG ONLY) */
-
-#ifdef ACPI_DEBUG
-ACPI_EXTERN ALLOCATION_INFO            *acpi_gbl_head_alloc_ptr;
-ACPI_EXTERN ALLOCATION_INFO            *acpi_gbl_tail_alloc_ptr;
-#endif
-
-
-/*****************************************************************************
- *
- * Interpreter globals
- *
- ****************************************************************************/
-
-
-ACPI_EXTERN ACPI_WALK_LIST             *acpi_gbl_current_walk_list;
-
-/*
- * Handle to the last method found - used during pass1 of load
- */
-ACPI_EXTERN ACPI_HANDLE                 acpi_gbl_last_method;
-
-/*
- * Table of Address Space handlers
- */
-
-ACPI_EXTERN ACPI_ADDRESS_SPACE_INFO     acpi_gbl_address_spaces[ACPI_NUM_ADDRESS_SPACES];
-
-
-/* Control method single step flag */
-
-ACPI_EXTERN u8                          acpi_gbl_cm_single_step;
-
-
-/*****************************************************************************
- *
- * Parser globals
- *
- ****************************************************************************/
-
-ACPI_EXTERN ACPI_PARSE_OBJECT           *acpi_gbl_parsed_namespace_root;
-
-/*****************************************************************************
- *
- * Hardware globals
- *
- ****************************************************************************/
-
-extern ACPI_C_STATE_HANDLER             acpi_hw_cx_handlers[MAX_CX_STATES];
-extern u32                              acpi_hw_active_cx_state;
-
-
-/*****************************************************************************
- *
- * Event globals
- *
- ****************************************************************************/
-
-ACPI_EXTERN ACPI_FIXED_EVENT_INFO       acpi_gbl_fixed_event_handlers[NUM_FIXED_EVENTS];
-
-ACPI_EXTERN ACPI_HANDLE                 acpi_gbl_gpe_obj_handle;
-ACPI_EXTERN u32                         acpi_gbl_gpe_register_count;
-ACPI_EXTERN ACPI_GPE_REGISTERS          *acpi_gbl_gpe_registers;
-ACPI_EXTERN ACPI_GPE_LEVEL_INFO         *acpi_gbl_gpe_info;
-
-/*
- * Gpe validation and translation table
- * Indexed by the GPE number, returns GPE_INVALID if the GPE is not supported.
- * Otherwise, returns a valid index into the global GPE table.
- *
- * This table is needed because the GPE numbers supported by block 1 do not
- * have to be contiguous with the GPE numbers supported by block 0.
- */
-ACPI_EXTERN u8                          acpi_gbl_gpe_valid [NUM_GPE];
-
-/* Acpi_event counter for debug only */
-
-#ifdef ACPI_DEBUG
-ACPI_EXTERN u32                         acpi_gbl_event_count[NUM_FIXED_EVENTS];
-#endif
-
-
-/*****************************************************************************
- *
- * Debugger globals
- *
- ****************************************************************************/
-
-#ifdef ENABLE_DEBUGGER
-ACPI_EXTERN u8                          acpi_gbl_method_executing;
-ACPI_EXTERN u8                          acpi_gbl_db_terminate_threads;
-#endif
-
-/* Memory allocation metrics - Debug Only! */
-
-#ifdef ACPI_DEBUG
-
-ACPI_EXTERN u32                         acpi_gbl_current_alloc_size;
-ACPI_EXTERN u32                         acpi_gbl_current_alloc_count;
-ACPI_EXTERN u32                         acpi_gbl_running_alloc_size;
-ACPI_EXTERN u32                         acpi_gbl_running_alloc_count;
-ACPI_EXTERN u32                         acpi_gbl_max_concurrent_alloc_size;
-ACPI_EXTERN u32                         acpi_gbl_max_concurrent_alloc_count;
-ACPI_EXTERN u32                         acpi_gbl_current_object_count;
-ACPI_EXTERN u32                         acpi_gbl_current_object_size;
-ACPI_EXTERN u32                         acpi_gbl_max_concurrent_object_count;
-ACPI_EXTERN u32                         acpi_gbl_max_concurrent_object_size;
-ACPI_EXTERN u32                         acpi_gbl_running_object_count;
-ACPI_EXTERN u32                         acpi_gbl_running_object_size;
-ACPI_EXTERN u32                         acpi_gbl_current_node_count;
-ACPI_EXTERN u32                         acpi_gbl_current_node_size;
-ACPI_EXTERN u32                         acpi_gbl_max_concurrent_node_count;
-
-#endif
-
-
-#endif /* __ACGLOBAL_H__ */
diff --git a/reactos/drivers/bus/acpi/include/achware.h b/reactos/drivers/bus/acpi/include/achware.h
deleted file mode 100644 (file)
index 412b91e..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-/******************************************************************************
- *
- * Name: achware.h -- hardware specific interfaces
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACHWARE_H__
-#define __ACHWARE_H__
-
-
-/* PM Timer ticks per second (HZ) */
-#define PM_TIMER_FREQUENCY  3579545
-
-
-/* Prototypes */
-
-
-ACPI_STATUS
-acpi_hw_initialize (
-       void);
-
-ACPI_STATUS
-acpi_hw_shutdown (
-       void);
-
-ACPI_STATUS
-acpi_hw_initialize_system_info (
-       void);
-
-ACPI_STATUS
-acpi_hw_set_mode (
-       u32                     mode);
-
-u32
-acpi_hw_get_mode (
-       void);
-
-u32
-acpi_hw_get_mode_capabilities (
-       void);
-
-/* Register I/O Prototypes */
-
-
-u32
-acpi_hw_register_bit_access (
-       NATIVE_UINT             read_write,
-       u8                      use_lock,
-       u32                     register_id,
-       ... /* DWORD Write Value */);
-
-u32
-acpi_hw_register_read (
-       u8                      use_lock,
-       u32                     register_id);
-
-void
-acpi_hw_register_write (
-       u8                      use_lock,
-       u32                     register_id,
-       u32                     value);
-
-u32
-acpi_hw_low_level_read (
-       u32                     width,
-       ACPI_GAS                *reg,
-       u32                     offset);
-
-void
-acpi_hw_low_level_write (
-       u32                     width,
-       u32                     value,
-       ACPI_GAS                *reg,
-       u32                     offset);
-
-void
-acpi_hw_clear_acpi_status (
-   void);
-
-u32
-acpi_hw_get_bit_shift (
-       u32                     mask);
-
-
-/* GPE support */
-
-void
-acpi_hw_enable_gpe (
-       u32                     gpe_index);
-
-void
-acpi_hw_disable_gpe (
-       u32                     gpe_index);
-
-void
-acpi_hw_clear_gpe (
-       u32                     gpe_index);
-
-void
-acpi_hw_get_gpe_status (
-       u32                     gpe_number,
-       ACPI_EVENT_STATUS       *event_status);
-
-/* Sleep Prototypes */
-
-ACPI_STATUS
-acpi_hw_obtain_sleep_type_register_data (
-       u8                      sleep_state,
-       u8                      *slp_typ_a,
-       u8                      *slp_typ_b);
-
-
-/* ACPI Timer prototypes */
-
-ACPI_STATUS
-acpi_get_timer_resolution (
-       u32                     *resolution);
-
-ACPI_STATUS
-acpi_get_timer (
-       u32                     *ticks);
-
-ACPI_STATUS
-acpi_get_timer_duration (
-       u32                     start_ticks,
-       u32                     end_ticks,
-       u32                     *time_elapsed);
-
-
-#endif /* __ACHWARE_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acinterp.h b/reactos/drivers/bus/acpi/include/acinterp.h
deleted file mode 100644 (file)
index 177dd3f..0000000
+++ /dev/null
@@ -1,632 +0,0 @@
-/******************************************************************************
- *
- * Name: acinterp.h - Interpreter subcomponent prototypes and defines
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACINTERP_H__
-#define __ACINTERP_H__
-
-
-#define WALK_OPERANDS       &(walk_state->operands [walk_state->num_operands -1])
-
-
-/* Interpreter constants */
-
-#define AML_END_OF_BLOCK            -1
-#define PUSH_PKG_LENGTH             1
-#define DO_NOT_PUSH_PKG_LENGTH      0
-
-
-#define STACK_TOP                   0
-#define STACK_BOTTOM                (u32) -1
-
-/* Constants for global "When_to_parse_methods" */
-
-#define METHOD_PARSE_AT_INIT        0x0
-#define METHOD_PARSE_JUST_IN_TIME   0x1
-#define METHOD_DELETE_AT_COMPLETION 0x2
-
-
-ACPI_STATUS
-acpi_aml_resolve_operands (
-       u16                     opcode,
-       ACPI_OPERAND_OBJECT     **stack_ptr,
-       ACPI_WALK_STATE         *walk_state);
-
-
-/*
- * amxface - External interpreter interfaces
- */
-
-ACPI_STATUS
-acpi_aml_load_table (
-       ACPI_TABLE_TYPE         table_id);
-
-ACPI_STATUS
-acpi_aml_execute_method (
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_obj_desc);
-
-
-/*
- * amconvrt - object conversion
- */
-
-ACPI_STATUS
-acpi_aml_convert_to_integer (
-       ACPI_OPERAND_OBJECT     **obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_convert_to_buffer (
-       ACPI_OPERAND_OBJECT     **obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_convert_to_string (
-       ACPI_OPERAND_OBJECT     **obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_convert_to_target_type (
-       OBJECT_TYPE_INTERNAL    destination_type,
-       ACPI_OPERAND_OBJECT     **obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-
-/*
- * amfield - ACPI AML (p-code) execution - field manipulation
- */
-
-ACPI_STATUS
-acpi_aml_read_field (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       void                    *buffer,
-       u32                     buffer_length,
-       u32                     byte_length,
-       u32                     datum_length,
-       u32                     bit_granularity,
-       u32                     byte_granularity);
-
-ACPI_STATUS
-acpi_aml_write_field (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       void                    *buffer,
-       u32                     buffer_length,
-       u32                     byte_length,
-       u32                     datum_length,
-       u32                     bit_granularity,
-       u32                     byte_granularity);
-
-ACPI_STATUS
-acpi_aml_setup_field (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_OPERAND_OBJECT     *rgn_desc,
-       u32                     field_bit_width);
-
-ACPI_STATUS
-acpi_aml_read_field_data (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       u32                     field_byte_offset,
-       u32                     field_bit_width,
-       u32                     *value);
-
-ACPI_STATUS
-acpi_aml_access_named_field (
-       u32                     mode,
-       ACPI_HANDLE             named_field,
-       void                    *buffer,
-       u32                     length);
-
-/*
- * ammisc - ACPI AML (p-code) execution - specific opcodes
- */
-
-ACPI_STATUS
-acpi_aml_exec_create_field (
-       u8                      *aml_ptr,
-       u32                     aml_length,
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_exec_reconfiguration (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_exec_fatal (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_exec_index (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc);
-
-ACPI_STATUS
-acpi_aml_exec_match (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc);
-
-ACPI_STATUS
-acpi_aml_exec_create_mutex (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_exec_create_processor (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_HANDLE             processor_nTE);
-
-ACPI_STATUS
-acpi_aml_exec_create_power_resource (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_HANDLE             processor_nTE);
-
-ACPI_STATUS
-acpi_aml_exec_create_region (
-       u8                      *aml_ptr,
-       u32                     acpi_aml_length,
-       u8                      region_space,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_exec_create_event (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_exec_create_alias (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_exec_create_method (
-       u8                      *aml_ptr,
-       u32                     acpi_aml_length,
-       u32                     method_flags,
-       ACPI_HANDLE             method);
-
-
-/*
- * ammutex - mutex support
- */
-
-ACPI_STATUS
-acpi_aml_acquire_mutex (
-       ACPI_OPERAND_OBJECT     *time_desc,
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_release_mutex (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_release_all_mutexes (
-       ACPI_OPERAND_OBJECT     *mutex_list);
-
-void
-acpi_aml_unlink_mutex (
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-
-/*
- * amprep - ACPI AML (p-code) execution - prep utilities
- */
-
-ACPI_STATUS
-acpi_aml_prep_def_field_value (
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_HANDLE             region,
-       u8                      field_flags,
-       u8                      field_attribute,
-       u32                     field_position,
-       u32                     field_length);
-
-ACPI_STATUS
-acpi_aml_prep_bank_field_value (
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_HANDLE             region,
-       ACPI_HANDLE             bank_reg,
-       u32                     bank_val,
-       u8                      field_flags,
-       u8                      field_attribute,
-       u32                     field_position,
-       u32                     field_length);
-
-ACPI_STATUS
-acpi_aml_prep_index_field_value (
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_HANDLE             index_reg,
-       ACPI_HANDLE             data_reg,
-       u8                      field_flags,
-       u8                      field_attribute,
-       u32                     field_position,
-       u32                     field_length);
-
-
-/*
- * amsystem - Interface to OS services
- */
-
-ACPI_STATUS
-acpi_aml_system_do_notify_op (
-       ACPI_OPERAND_OBJECT     *value,
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-void
-acpi_aml_system_do_suspend(
-       u32                     time);
-
-void
-acpi_aml_system_do_stall (
-       u32                     time);
-
-ACPI_STATUS
-acpi_aml_system_acquire_mutex(
-       ACPI_OPERAND_OBJECT     *time,
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-ACPI_STATUS
-acpi_aml_system_release_mutex(
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-ACPI_STATUS
-acpi_aml_system_signal_event(
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-ACPI_STATUS
-acpi_aml_system_wait_event(
-       ACPI_OPERAND_OBJECT     *time,
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-ACPI_STATUS
-acpi_aml_system_reset_event(
-       ACPI_OPERAND_OBJECT     *obj_desc);
-
-ACPI_STATUS
-acpi_aml_system_wait_semaphore (
-       ACPI_HANDLE             semaphore,
-       u32                     timeout);
-
-
-/*
- * ammonadic - ACPI AML (p-code) execution, monadic operators
- */
-
-ACPI_STATUS
-acpi_aml_exec_monadic1 (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_exec_monadic2 (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc);
-
-ACPI_STATUS
-acpi_aml_exec_monadic2_r (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc);
-
-
-/*
- * amdyadic - ACPI AML (p-code) execution, dyadic operators
- */
-
-ACPI_STATUS
-acpi_aml_exec_dyadic1 (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_exec_dyadic2 (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc);
-
-ACPI_STATUS
-acpi_aml_exec_dyadic2_r (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc);
-
-ACPI_STATUS
-acpi_aml_exec_dyadic2_s (
-       u16                     opcode,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_OPERAND_OBJECT     **return_desc);
-
-
-/*
- * amresolv  - Object resolution and get value functions
- */
-
-ACPI_STATUS
-acpi_aml_resolve_to_value (
-       ACPI_OPERAND_OBJECT     **stack_ptr,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_resolve_node_to_value (
-       ACPI_NAMESPACE_NODE     **stack_ptr,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_resolve_object_to_value (
-       ACPI_OPERAND_OBJECT     **stack_ptr,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_get_field_unit_value (
-       ACPI_OPERAND_OBJECT     *field_desc,
-       ACPI_OPERAND_OBJECT     *result_desc);
-
-
-/*
- * amdump - Scanner debug output routines
- */
-
-void
-acpi_aml_show_hex_value (
-       u32                     byte_count,
-       u8                      *aml_ptr,
-       u32                     lead_space);
-
-
-ACPI_STATUS
-acpi_aml_dump_operand (
-       ACPI_OPERAND_OBJECT     *entry_desc);
-
-void
-acpi_aml_dump_operands (
-       ACPI_OPERAND_OBJECT     **operands,
-       OPERATING_MODE          interpreter_mode,
-       NATIVE_CHAR             *ident,
-       u32                     num_levels,
-       NATIVE_CHAR             *note,
-       NATIVE_CHAR             *module_name,
-       u32                     line_number);
-
-void
-acpi_aml_dump_object_descriptor (
-       ACPI_OPERAND_OBJECT     *object,
-       u32                     flags);
-
-
-void
-acpi_aml_dump_node (
-       ACPI_NAMESPACE_NODE     *node,
-       u32                     flags);
-
-
-/*
- * amnames - interpreter/scanner name load/execute
- */
-
-NATIVE_CHAR *
-acpi_aml_allocate_name_string (
-       u32                     prefix_count,
-       u32                     num_name_segs);
-
-u32
-acpi_aml_good_char (
-       u32                     character);
-
-ACPI_STATUS
-acpi_aml_exec_name_segment (
-       u8                      **in_aml_address,
-       NATIVE_CHAR             *name_string);
-
-ACPI_STATUS
-acpi_aml_get_name_string (
-       OBJECT_TYPE_INTERNAL    data_type,
-       u8                      *in_aml_address,
-       NATIVE_CHAR             **out_name_string,
-       u32                     *out_name_length);
-
-ACPI_STATUS
-acpi_aml_do_name (
-       ACPI_OBJECT_TYPE        data_type,
-       OPERATING_MODE          load_exec_mode);
-
-
-/*
- * amstore - Object store support
- */
-
-ACPI_STATUS
-acpi_aml_exec_store (
-       ACPI_OPERAND_OBJECT     *val_desc,
-       ACPI_OPERAND_OBJECT     *dest_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_store_object_to_index (
-       ACPI_OPERAND_OBJECT     *val_desc,
-       ACPI_OPERAND_OBJECT     *dest_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_store_object_to_node (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_store_object_to_object (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *dest_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-
-/*
- *
- */
-
-ACPI_STATUS
-acpi_aml_resolve_object (
-       ACPI_OPERAND_OBJECT     **source_desc_ptr,
-       OBJECT_TYPE_INTERNAL    target_type,
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_aml_store_object (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       OBJECT_TYPE_INTERNAL    target_type,
-       ACPI_OPERAND_OBJECT     **target_desc_ptr,
-       ACPI_WALK_STATE         *walk_state);
-
-
-/*
- * amcopy - object copy
- */
-
-ACPI_STATUS
-acpi_aml_copy_buffer_to_buffer (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc);
-
-ACPI_STATUS
-acpi_aml_copy_string_to_string (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc);
-
-ACPI_STATUS
-acpi_aml_copy_integer_to_index_field (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc);
-
-ACPI_STATUS
-acpi_aml_copy_integer_to_bank_field (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc);
-
-ACPI_STATUS
-acpi_aml_copy_data_to_named_field (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_NAMESPACE_NODE     *node);
-
-ACPI_STATUS
-acpi_aml_copy_integer_to_field_unit (
-       ACPI_OPERAND_OBJECT     *source_desc,
-       ACPI_OPERAND_OBJECT     *target_desc);
-
-/*
- * amutils - interpreter/scanner utilities
- */
-
-ACPI_STATUS
-acpi_aml_enter_interpreter (
-       void);
-
-void
-acpi_aml_exit_interpreter (
-       void);
-
-void
-acpi_aml_truncate_for32bit_table (
-       ACPI_OPERAND_OBJECT     *obj_desc,
-       ACPI_WALK_STATE         *walk_state);
-
-u8
-acpi_aml_validate_object_type (
-       ACPI_OBJECT_TYPE        type);
-
-u8
-acpi_aml_acquire_global_lock (
-       u32                     rule);
-
-ACPI_STATUS
-acpi_aml_release_global_lock (
-       u8                      locked);
-
-u32
-acpi_aml_digits_needed (
-       ACPI_INTEGER            value,
-       u32                     base);
-
-ACPI_STATUS
-acpi_aml_eisa_id_to_string (
-       u32                     numeric_id,
-       NATIVE_CHAR             *out_string);
-
-ACPI_STATUS
-acpi_aml_unsigned_integer_to_string (
-       ACPI_INTEGER            value,
-       NATIVE_CHAR             *out_string);
-
-
-/*
- * amregion - default Op_region handlers
- */
-
-ACPI_STATUS
-acpi_aml_system_memory_space_handler (
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value,
-       void                    *handler_context,
-       void                    *region_context);
-
-ACPI_STATUS
-acpi_aml_system_io_space_handler (
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value,
-       void                    *handler_context,
-       void                    *region_context);
-
-ACPI_STATUS
-acpi_aml_pci_config_space_handler (
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value,
-       void                    *handler_context,
-       void                    *region_context);
-
-ACPI_STATUS
-acpi_aml_embedded_controller_space_handler (
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value,
-       void                    *handler_context,
-       void                    *region_context);
-
-ACPI_STATUS
-acpi_aml_sm_bus_space_handler (
-       u32                     function,
-       ACPI_PHYSICAL_ADDRESS   address,
-       u32                     bit_width,
-       u32                     *value,
-       void                    *handler_context,
-       void                    *region_context);
-
-
-#endif /* __INTERP_H__ */
diff --git a/reactos/drivers/bus/acpi/include/aclocal.h b/reactos/drivers/bus/acpi/include/aclocal.h
deleted file mode 100644 (file)
index 3eac5d5..0000000
+++ /dev/null
@@ -1,832 +0,0 @@
-/******************************************************************************
- *
- * Name: aclocal.h - Internal data types used across the ACPI subsystem
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACLOCAL_H__
-#define __ACLOCAL_H__
-
-
-#define WAIT_FOREVER                    ((u32) -1)
-
-typedef void*                           ACPI_MUTEX;
-typedef u32                             ACPI_MUTEX_HANDLE;
-
-
-/* Object descriptor types */
-
-#define ACPI_CACHED_OBJECT              0x11    /* ORed in when object is cached */
-#define ACPI_DESC_TYPE_STATE            0x22
-#define ACPI_DESC_TYPE_WALK             0x44
-#define ACPI_DESC_TYPE_PARSER           0x66
-#define ACPI_DESC_TYPE_INTERNAL         0x88
-#define ACPI_DESC_TYPE_NAMED            0xAA
-
-
-/*****************************************************************************
- *
- * Mutex typedefs and structs
- *
- ****************************************************************************/
-
-
-/*
- * Predefined handles for the mutex objects used within the subsystem
- * All mutex objects are automatically created by Acpi_cm_mutex_initialize.
- *
- * The acquire/release ordering protocol is implied via this list.  Mutexes
- * with a lower value must be acquired before mutexes with a higher value.
- *
- * NOTE: any changes here must be reflected in the Acpi_gbl_Mutex_names table also!
- */
-
-#define ACPI_MTX_EXECUTE                0
-#define ACPI_MTX_INTERPRETER            1
-#define ACPI_MTX_PARSER                 2
-#define ACPI_MTX_DISPATCHER             3
-#define ACPI_MTX_TABLES                 4
-#define ACPI_MTX_OP_REGIONS             5
-#define ACPI_MTX_NAMESPACE              6
-#define ACPI_MTX_EVENTS                 7
-#define ACPI_MTX_HARDWARE               8
-#define ACPI_MTX_CACHES                 9
-#define ACPI_MTX_MEMORY                 10
-#define ACPI_MTX_DEBUG_CMD_COMPLETE     11
-#define ACPI_MTX_DEBUG_CMD_READY        12
-
-#define MAX_MTX                         12
-#define NUM_MTX                         MAX_MTX+1
-
-
-#if defined(ACPI_DEBUG) || defined(ENABLE_DEBUGGER)
-#ifdef DEFINE_ACPI_GLOBALS
-
-/* Names for the mutexes used in the subsystem */
-
-static NATIVE_CHAR          *acpi_gbl_mutex_names[] =
-{
-       "ACPI_MTX_Execute",
-       "ACPI_MTX_Interpreter",
-       "ACPI_MTX_Parser",
-       "ACPI_MTX_Dispatcher",
-       "ACPI_MTX_Tables",
-       "ACPI_MTX_Op_regions",
-       "ACPI_MTX_Namespace",
-       "ACPI_MTX_Events",
-       "ACPI_MTX_Hardware",
-       "ACPI_MTX_Caches",
-       "ACPI_MTX_Memory",
-       "ACPI_MTX_Debug_cmd_complete"
-       "ACPI_MTX_Debug_cmd_ready",
-};
-
-#endif
-#endif
-
-
-/* Table for the global mutexes */
-
-typedef struct acpi_mutex_info
-{
-       ACPI_MUTEX                  mutex;
-       u32                         use_count;
-       u32                         owner_id;
-       u8                          locked;
-
-} ACPI_MUTEX_INFO;
-
-
-/* Lock flag parameter for various interfaces */
-
-#define ACPI_MTX_DO_NOT_LOCK            0
-#define ACPI_MTX_LOCK                   1
-
-
-typedef u16                             ACPI_OWNER_ID;
-#define OWNER_TYPE_TABLE                0x0
-#define OWNER_TYPE_METHOD               0x1
-#define FIRST_METHOD_ID                 0x0000
-#define FIRST_TABLE_ID                  0x8000
-
-/* TBD: [Restructure] get rid of the need for this! */
-
-#define TABLE_ID_DSDT                   (ACPI_OWNER_ID) 0x8000
-
-
-/*****************************************************************************
- *
- * Namespace typedefs and structs
- *
- ****************************************************************************/
-
-
-/* Operational modes of the AML interpreter/scanner */
-
-typedef enum
-{
-       IMODE_LOAD_PASS1                = 0x01,
-       IMODE_LOAD_PASS2                = 0x02,
-       IMODE_EXECUTE                   = 0x0E
-
-} OPERATING_MODE;
-
-
-/*
- * The Node describes a named object that appears in the AML
- * An Acpi_node is used to store Nodes.
- *
- * Data_type is used to differentiate between internal descriptors, and MUST
- * be the first byte in this structure.
- */
-
-typedef struct acpi_node
-{
-       u8                      data_type;
-       u8                      type;           /* Type associated with this name */
-       u16                     owner_id;
-       u32                     name;           /* ACPI Name, always 4 chars per ACPI spec */
-
-
-       void                    *object;        /* Pointer to attached ACPI object (optional) */
-       struct acpi_node        *child;         /* first child */
-       struct acpi_node        *peer;          /* Next peer*/
-       u16                     reference_count; /* Current count of references and children */
-       u8                      flags;
-
-} ACPI_NAMESPACE_NODE;
-
-
-#define ENTRY_NOT_FOUND             NULL
-
-
-/* Node flags */
-
-#define ANOBJ_AML_ATTACHMENT            0x01
-#define ANOBJ_END_OF_PEER_LIST          0x02
-#define ANOBJ_DATA_WIDTH_32             0x04     /* Parent table is 64-bits */
-#define ANOBJ_METHOD_ARG                0x08
-#define ANOBJ_METHOD_LOCAL              0x10
-#define ANOBJ_METHOD_NO_RETVAL          0x20
-#define ANOBJ_METHOD_SOME_NO_RETVAL     0x40
-
-
-/*
- * ACPI Table Descriptor.  One per ACPI table
- */
-typedef struct acpi_table_desc
-{
-       struct acpi_table_desc  *prev;
-       struct acpi_table_desc  *next;
-       struct acpi_table_desc  *installed_desc;
-       ACPI_TABLE_HEADER       *pointer;
-       void                    *base_pointer;
-       u8                      *aml_pointer;
-       UINT64                  physical_address;
-       u32                     aml_length;
-       u32                     length;
-       u32                     count;
-       ACPI_OWNER_ID           table_id;
-       u8                      type;
-       u8                      allocation;
-       u8                      loaded_into_namespace;
-
-} ACPI_TABLE_DESC;
-
-
-typedef struct
-{
-       NATIVE_CHAR             *search_for;
-       ACPI_HANDLE             *list;
-       u32                     *count;
-
-} FIND_CONTEXT;
-
-
-typedef struct
-{
-       ACPI_NAMESPACE_NODE     *node;
-} NS_SEARCH_DATA;
-
-
-/*
- * Predefined Namespace items
- */
-#define ACPI_MAX_ADDRESS_SPACE          255
-#define ACPI_NUM_ADDRESS_SPACES         256
-
-
-typedef struct
-{
-       NATIVE_CHAR             *name;
-       ACPI_OBJECT_TYPE        type;
-       NATIVE_CHAR             *val;
-
-} PREDEFINED_NAMES;
-
-
-/* Object types used during package copies */
-
-
-#define ACPI_COPY_TYPE_SIMPLE           0
-#define ACPI_COPY_TYPE_PACKAGE          1
-
-
-/*****************************************************************************
- *
- * Event typedefs and structs
- *
- ****************************************************************************/
-
-
-/* Status bits. */
-
-#define ACPI_STATUS_PMTIMER             0x0001
-#define ACPI_STATUS_GLOBAL              0x0020
-#define ACPI_STATUS_POWER_BUTTON        0x0100
-#define ACPI_STATUS_SLEEP_BUTTON        0x0200
-#define ACPI_STATUS_RTC_ALARM           0x0400
-
-/* Enable bits. */
-
-#define ACPI_ENABLE_PMTIMER             0x0001
-#define ACPI_ENABLE_GLOBAL              0x0020
-#define ACPI_ENABLE_POWER_BUTTON        0x0100
-#define ACPI_ENABLE_SLEEP_BUTTON        0x0200
-#define ACPI_ENABLE_RTC_ALARM           0x0400
-
-
-/*
- * Entry in the Address_space (AKA Operation Region) table
- */
-
-typedef struct
-{
-       ADDRESS_SPACE_HANDLER   handler;
-       void                    *context;
-
-} ACPI_ADDRESS_SPACE_INFO;
-
-
-/* Values and addresses of the GPE registers (both banks) */
-
-typedef struct
-{
-       u8                      status;         /* Current value of status reg */
-       u8                      enable;         /* Current value of enable reg */
-       u16                     status_addr;    /* Address of status reg */
-       u16                     enable_addr;    /* Address of enable reg */
-       u8                      gpe_base;       /* Base GPE number */
-
-} ACPI_GPE_REGISTERS;
-
-
-#define ACPI_GPE_LEVEL_TRIGGERED        1
-#define ACPI_GPE_EDGE_TRIGGERED         2
-
-
-/* Information about each particular GPE level */
-
-typedef struct
-{
-       u8                      type;           /* Level or Edge */
-
-       ACPI_HANDLE             method_handle;  /* Method handle for direct (fast) execution */
-       GPE_HANDLER             handler;        /* Address of handler, if any */
-       void                    *context;       /* Context to be passed to handler */
-
-} ACPI_GPE_LEVEL_INFO;
-
-
-/* Information about each particular fixed event */
-
-typedef struct
-{
-       FIXED_EVENT_HANDLER     handler;        /* Address of handler. */
-       void                    *context;       /* Context to be passed to handler */
-
-} ACPI_FIXED_EVENT_INFO;
-
-
-/* Information used during field processing */
-
-typedef struct
-{
-       u8                      skip_field;
-       u8                      field_flag;
-       u32                     pkg_length;
-
-} ACPI_FIELD_INFO;
-
-
-/*****************************************************************************
- *
- * Generic "state" object for stacks
- *
- ****************************************************************************/
-
-
-#define CONTROL_NORMAL                  0xC0
-#define CONTROL_CONDITIONAL_EXECUTING   0xC1
-#define CONTROL_PREDICATE_EXECUTING     0xC2
-#define CONTROL_PREDICATE_FALSE         0xC3
-#define CONTROL_PREDICATE_TRUE          0xC4
-
-
-/* Forward declarations */
-struct acpi_walk_state;
-struct acpi_walk_list;
-struct acpi_parse_obj;
-struct acpi_obj_mutex;
-
-
-#define ACPI_STATE_COMMON                  /* Two 32-bit fields and a pointer */\
-       u8                      data_type;          /* To differentiate various internal objs */\
-       u8                      flags; \
-       u16                     value; \
-       u16                     state; \
-       u16                     acpi_eval; \
-       void                    *next; \
-
-typedef struct acpi_common_state
-{
-       ACPI_STATE_COMMON
-} ACPI_COMMON_STATE;
-
-
-/*
- * Update state - used to traverse complex objects such as packages
- */
-typedef struct acpi_update_state
-{
-       ACPI_STATE_COMMON
-       union acpi_operand_obj  *object;
-
-} ACPI_UPDATE_STATE;
-
-
-/*
- * Pkg state - used to traverse nested package structures
- */
-typedef struct acpi_pkg_state
-{
-       ACPI_STATE_COMMON
-       union acpi_operand_obj  *source_object;
-       union acpi_operand_obj  *dest_object;
-       struct acpi_walk_state  *walk_state;
-       void                    *this_target_obj;
-       u32                     num_packages;
-       u16                     index;
-
-} ACPI_PKG_STATE;
-
-
-/*
- * Control state - one per if/else and while constructs.
- * Allows nesting of these constructs
- */
-typedef struct acpi_control_state
-{
-       ACPI_STATE_COMMON
-       struct acpi_parse_obj   *predicate_op;
-       u8                      *aml_predicate_start; /* Start of if/while predicate */
-
-} ACPI_CONTROL_STATE;
-
-
-/*
- * Scope state - current scope during namespace lookups
- */
-
-typedef struct acpi_scope_state
-{
-       ACPI_STATE_COMMON
-       ACPI_NAMESPACE_NODE     *node;
-
-} ACPI_SCOPE_STATE;
-
-
-typedef struct acpi_pscope_state
-{
-       ACPI_STATE_COMMON
-       struct acpi_parse_obj   *op;            /* current op being parsed */
-       u8                      *arg_end;       /* current argument end */
-       u8                      *pkg_end;       /* current package end */
-       u32                     arg_list;       /* next argument to parse */
-       u32                     arg_count;      /* Number of fixed arguments */
-
-} ACPI_PSCOPE_STATE;
-
-
-/*
- * Result values - used to accumulate the results of nested
- * AML arguments
- */
-typedef struct acpi_result_values
-{
-       ACPI_STATE_COMMON
-       union acpi_operand_obj  *obj_desc [OBJ_NUM_OPERANDS];
-       u8                      num_results;
-       u8                      last_insert;
-
-} ACPI_RESULT_VALUES;
-
-
-/*
- * Notify info - used to pass info to the deferred notify
- * handler/dispatcher.
- */
-
-typedef struct acpi_notify_info
-{
-       ACPI_STATE_COMMON
-       ACPI_NAMESPACE_NODE     *node;
-       union acpi_operand_obj  *handler_obj;
-
-} ACPI_NOTIFY_INFO;
-
-
-/* Generic state is union of structs above */
-
-typedef union acpi_gen_state
-{
-       ACPI_COMMON_STATE       common;
-       ACPI_CONTROL_STATE      control;
-       ACPI_UPDATE_STATE       update;
-       ACPI_SCOPE_STATE        scope;
-       ACPI_PSCOPE_STATE       parse_scope;
-       ACPI_PKG_STATE          pkg;
-       ACPI_RESULT_VALUES      results;
-       ACPI_NOTIFY_INFO        notify;
-
-} ACPI_GENERIC_STATE;
-
-
-typedef
-ACPI_STATUS (*ACPI_PARSE_DOWNWARDS) (
-       u16                     opcode,
-       struct acpi_parse_obj   *op,
-       struct acpi_walk_state  *walk_state,
-       struct acpi_parse_obj   **out_op);
-
-typedef
-ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
-       struct acpi_walk_state  *walk_state,
-       struct acpi_parse_obj   *op);
-
-
-/*****************************************************************************
- *
- * Parser typedefs and structs
- *
- ****************************************************************************/
-
-
-#define ACPI_OP_CLASS_MASK              0x1F
-#define ACPI_OP_ARGS_MASK               0x20
-#define ACPI_OP_TYPE_MASK               0xC0
-
-#define ACPI_OP_TYPE_OPCODE             0x00
-#define ACPI_OP_TYPE_ASCII              0x40
-#define ACPI_OP_TYPE_PREFIX             0x80
-#define ACPI_OP_TYPE_UNKNOWN            0xC0
-
-#define ACPI_GET_OP_CLASS(a)            ((a)->flags & ACPI_OP_CLASS_MASK)
-#define ACPI_GET_OP_ARGS(a)             ((a)->flags & ACPI_OP_ARGS_MASK)
-#define ACPI_GET_OP_TYPE(a)             ((a)->flags & ACPI_OP_TYPE_MASK)
-
-
-/*
- * AML opcode, name, and argument layout
- */
-typedef struct acpi_opcode_info
-{
-       u8                      flags;          /* Opcode type, Has_args flag */
-       u32                     parse_args;     /* Grammar/Parse time arguments */
-       u32                     runtime_args;   /* Interpret time arguments */
-
-#ifdef _OPCODE_NAMES
-       NATIVE_CHAR             *name;          /* op name (debug only) */
-#endif
-
-} ACPI_OPCODE_INFO;
-
-
-typedef union acpi_parse_val
-{
-       u32                     integer;        /* integer constant */
-       u32                     size;           /* bytelist or field size */
-       NATIVE_CHAR             *string;        /* NULL terminated string */
-       u8                      *buffer;        /* buffer or string */
-       NATIVE_CHAR             *name;          /* NULL terminated string */
-       struct acpi_parse_obj   *arg;           /* arguments and contained ops */
-
-} ACPI_PARSE_VALUE;
-
-
-#define ACPI_PARSE_COMMON \
-       u8                      data_type;      /* To differentiate various internal objs */\
-       u8                      flags;          /* Type of Op */\
-       u16                     opcode;         /* AML opcode */\
-       u32                     aml_offset;     /* offset of declaration in AML */\
-       struct acpi_parse_obj   *parent;        /* parent op */\
-       struct acpi_parse_obj   *next;          /* next op */\
-       DEBUG_ONLY_MEMBERS (\
-       NATIVE_CHAR             op_name[16])    /* op name (debug only) */\
-                         /* NON-DEBUG members below: */\
-       ACPI_NAMESPACE_NODE     *node;          /* for use by interpreter */\
-       ACPI_PARSE_VALUE        value;          /* Value or args associated with the opcode */\
-
-
-/*
- * generic operation (eg. If, While, Store)
- */
-typedef struct acpi_parse_obj
-{
-       ACPI_PARSE_COMMON
-} ACPI_PARSE_OBJECT;
-
-
-/*
- * Extended Op for named ops (Scope, Method, etc.), deferred ops (Methods and Op_regions),
- * and bytelists.
- */
-typedef struct acpi_parse2_obj
-{
-       ACPI_PARSE_COMMON
-       u8                      *data;          /* AML body or bytelist data */
-       u32                     length;         /* AML length */
-       u32                     name;           /* 4-byte name or zero if no name */
-
-} ACPI_PARSE2_OBJECT;
-
-
-/*
- * Parse state - one state per parser invocation and each control
- * method.
- */
-
-typedef struct acpi_parse_state
-{
-       u8                      *aml_start;     /* first AML byte */
-       u8                      *aml;           /* next AML byte */
-       u8                      *aml_end;       /* (last + 1) AML byte */
-       u8                      *pkg_start;     /* current package begin */
-       u8                      *pkg_end;       /* current package end */
-       ACPI_PARSE_OBJECT       *start_op;      /* root of parse tree */
-       struct acpi_node        *start_node;
-       ACPI_GENERIC_STATE      *scope;         /* current scope */
-       struct acpi_parse_state *next;
-
-} ACPI_PARSE_STATE;
-
-
-/*****************************************************************************
- *
- * Hardware and PNP
- *
- ****************************************************************************/
-
-
-/* PCI */
-
-#define PCI_ROOT_HID_STRING             "PNP0A03"
-#define PCI_ROOT_HID_VALUE              0x030AD041       /* EISAID("PNP0A03") */
-
-
-/* Sleep states */
-
-#define SLWA_DEBUG_LEVEL                4
-#define GTS_CALL                        0
-#define GTS_WAKE                        1
-
-/* Cx States */
-
-#define MAX_CX_STATE_LATENCY            0xFFFFFFFF
-#define MAX_CX_STATES                   4
-
-
-/*
- * The #define's and enum below establish an abstract way of identifying what
- * register block and register is to be accessed.  Do not change any of the
- * values as they are used in switch statements and offset calculations.
- */
-
-#define REGISTER_BLOCK_MASK             0xFF00  /* Register Block Id    */
-#define BIT_IN_REGISTER_MASK            0x00FF  /* Bit Id in the Register Block Id    */
-#define BYTE_IN_REGISTER_MASK           0x00FF  /* Register Offset in the Register Block    */
-
-#define REGISTER_BLOCK_ID(reg_id)       (reg_id & REGISTER_BLOCK_MASK)
-#define REGISTER_BIT_ID(reg_id)         (reg_id & BIT_IN_REGISTER_MASK)
-#define REGISTER_OFFSET(reg_id)         (reg_id & BYTE_IN_REGISTER_MASK)
-
-/*
- * Access Rule
- *  To access a Register Bit:
- *  -> Use Bit Name (= Register Block Id | Bit Id) defined in the enum.
- *
- *  To access a Register:
- *  -> Use Register Id (= Register Block Id | Register Offset)
- */
-
-
-/*
- * Register Block Id
- */
-#define PM1_STS                         0x0100
-#define PM1_EN                          0x0200
-#define PM1_CONTROL                     0x0300
-#define PM1_a_CONTROL                   0x0400
-#define PM1_b_CONTROL                   0x0500
-#define PM2_CONTROL                     0x0600
-#define PM_TIMER                        0x0700
-#define PROCESSOR_BLOCK                 0x0800
-#define GPE0_STS_BLOCK                  0x0900
-#define GPE0_EN_BLOCK                   0x0A00
-#define GPE1_STS_BLOCK                  0x0B00
-#define GPE1_EN_BLOCK                   0x0C00
-#define SMI_CMD_BLOCK                   0x0D00
-
-/*
- * Address space bitmasks for mmio or io spaces
- */
-
-#define SMI_CMD_ADDRESS_SPACE           0x01
-#define PM1_BLK_ADDRESS_SPACE           0x02
-#define PM2_CNT_BLK_ADDRESS_SPACE       0x04
-#define PM_TMR_BLK_ADDRESS_SPACE        0x08
-#define GPE0_BLK_ADDRESS_SPACE          0x10
-#define GPE1_BLK_ADDRESS_SPACE          0x20
-
-/*
- * Control bit definitions
- */
-#define TMR_STS                         (PM1_STS | 0x01)
-#define BM_STS                          (PM1_STS | 0x02)
-#define GBL_STS                         (PM1_STS | 0x03)
-#define PWRBTN_STS                      (PM1_STS | 0x04)
-#define SLPBTN_STS                      (PM1_STS | 0x05)
-#define RTC_STS                         (PM1_STS | 0x06)
-#define WAK_STS                         (PM1_STS | 0x07)
-
-#define TMR_EN                          (PM1_EN | 0x01)
-                        /* no BM_EN */
-#define GBL_EN                          (PM1_EN | 0x03)
-#define PWRBTN_EN                       (PM1_EN | 0x04)
-#define SLPBTN_EN                       (PM1_EN | 0x05)
-#define RTC_EN                          (PM1_EN | 0x06)
-#define WAK_EN                          (PM1_EN | 0x07)
-
-#define SCI_EN                          (PM1_CONTROL | 0x01)
-#define BM_RLD                          (PM1_CONTROL | 0x02)
-#define GBL_RLS                         (PM1_CONTROL | 0x03)
-#define SLP_TYPE_A                      (PM1_CONTROL | 0x04)
-#define SLP_TYPE_B                      (PM1_CONTROL | 0x05)
-#define SLP_EN                          (PM1_CONTROL | 0x06)
-
-#define ARB_DIS                         (PM2_CONTROL | 0x01)
-
-#define TMR_VAL                         (PM_TIMER | 0x01)
-
-#define GPE0_STS                        (GPE0_STS_BLOCK | 0x01)
-#define GPE0_EN                         (GPE0_EN_BLOCK  | 0x01)
-
-#define GPE1_STS                        (GPE1_STS_BLOCK | 0x01)
-#define GPE1_EN                         (GPE1_EN_BLOCK  | 0x01)
-
-
-#define TMR_STS_MASK                    0x0001
-#define BM_STS_MASK                     0x0010
-#define GBL_STS_MASK                    0x0020
-#define PWRBTN_STS_MASK                 0x0100
-#define SLPBTN_STS_MASK                 0x0200
-#define RTC_STS_MASK                    0x0400
-#define WAK_STS_MASK                    0x8000
-
-#define ALL_FIXED_STS_BITS              (TMR_STS_MASK   | BM_STS_MASK  | GBL_STS_MASK \
-                                         | PWRBTN_STS_MASK | SLPBTN_STS_MASK \
-                                         | RTC_STS_MASK | WAK_STS_MASK)
-
-#define TMR_EN_MASK                     0x0001
-#define GBL_EN_MASK                     0x0020
-#define PWRBTN_EN_MASK                  0x0100
-#define SLPBTN_EN_MASK                  0x0200
-#define RTC_EN_MASK                     0x0400
-
-#define SCI_EN_MASK                     0x0001
-#define BM_RLD_MASK                     0x0002
-#define GBL_RLS_MASK                    0x0004
-#define SLP_TYPE_X_MASK                 0x1C00
-#define SLP_EN_MASK                     0x2000
-
-#define ARB_DIS_MASK                    0x0001
-#define TMR_VAL_MASK                    0xFFFFFFFF
-
-#define GPE0_STS_MASK
-#define GPE0_EN_MASK
-
-#define GPE1_STS_MASK
-#define GPE1_EN_MASK
-
-
-#define ACPI_READ                       1
-#define ACPI_WRITE                      2
-
-
-/* Plug and play */
-
-/* Pnp and ACPI data */
-
-#define VERSION_NO                      0x01
-#define LOGICAL_DEVICE_ID               0x02
-#define COMPATIBLE_DEVICE_ID            0x03
-#define IRQ_FORMAT                      0x04
-#define DMA_FORMAT                      0x05
-#define START_DEPENDENT_TAG             0x06
-#define END_DEPENDENT_TAG               0x07
-#define IO_PORT_DESCRIPTOR              0x08
-#define FIXED_LOCATION_IO_DESCRIPTOR    0x09
-#define RESERVED_TYPE0                  0x0A
-#define RESERVED_TYPE1                  0x0B
-#define RESERVED_TYPE2                  0x0C
-#define RESERVED_TYPE3                  0x0D
-#define SMALL_VENDOR_DEFINED            0x0E
-#define END_TAG                         0x0F
-
-/* Pnp and ACPI data */
-
-#define MEMORY_RANGE_24                 0x81
-#define ISA_MEMORY_RANGE                0x81
-#define LARGE_VENDOR_DEFINED            0x84
-#define EISA_MEMORY_RANGE               0x85
-#define MEMORY_RANGE_32                 0x85
-#define FIXED_EISA_MEMORY_RANGE         0x86
-#define FIXED_MEMORY_RANGE_32           0x86
-
-/* ACPI only data */
-
-#define DWORD_ADDRESS_SPACE             0x87
-#define WORD_ADDRESS_SPACE              0x88
-#define EXTENDED_IRQ                    0x89
-
-/* MUST HAVES */
-
-#define DEVICE_ID_LENGTH                0x09
-
-typedef struct
-{
-       NATIVE_CHAR             buffer[DEVICE_ID_LENGTH];
-
-} DEVICE_ID;
-
-
-/*****************************************************************************
- *
- * Debug
- *
- ****************************************************************************/
-
-
-/* Entry for a memory allocation (debug only) */
-
-#ifdef ACPI_DEBUG
-
-#define MEM_MALLOC                      0
-#define MEM_CALLOC                      1
-#define MAX_MODULE_NAME                 16
-
-typedef struct allocation_info
-{
-       struct allocation_info  *previous;
-       struct allocation_info  *next;
-       void                    *address;
-       u32                     size;
-       u32                     component;
-       u32                     line;
-       NATIVE_CHAR             module[MAX_MODULE_NAME];
-       u8                      alloc_type;
-
-} ALLOCATION_INFO;
-
-#endif
-
-#endif /* __ACLOCAL_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acmacros.h b/reactos/drivers/bus/acpi/include/acmacros.h
deleted file mode 100644 (file)
index 6a386b6..0000000
+++ /dev/null
@@ -1,507 +0,0 @@
-/******************************************************************************
- *
- * Name: acmacros.h - C macros for the entire subsystem.
- *       $Revision: 1.4 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACMACROS_H__
-#define __ACMACROS_H__
-
-/*
- * Data manipulation macros
- */
-
-#ifndef LODWORD
-#define LODWORD(l)                      ((u32)(UINT64)(l))
-#endif
-
-#ifndef HIDWORD
-#define HIDWORD(l)                      ((u32)((((UINT64)(l)) >> 32) & 0xFFFFFFFF))
-#endif
-
-#ifndef LOWORD
-#define LOWORD(l)                       ((u16)(NATIVE_UINT)(l))
-#endif
-
-#ifndef HIWORD
-#define HIWORD(l)                       ((u16)((((NATIVE_UINT)(l)) >> 16) & 0xFFFF))
-#endif
-
-#ifndef LOBYTE
-#define LOBYTE(l)                       ((u8)(u16)(l))
-#endif
-
-#ifndef HIBYTE
-#define HIBYTE(l)                       ((u8)((((u16)(l)) >> 8) & 0xFF))
-#endif
-
-#define BIT0(x)                         ((((x) & 0x01) > 0) ? 1 : 0)
-#define BIT1(x)                         ((((x) & 0x02) > 0) ? 1 : 0)
-#define BIT2(x)                         ((((x) & 0x04) > 0) ? 1 : 0)
-
-#define BIT3(x)                         ((((x) & 0x08) > 0) ? 1 : 0)
-#define BIT4(x)                         ((((x) & 0x10) > 0) ? 1 : 0)
-#define BIT5(x)                         ((((x) & 0x20) > 0) ? 1 : 0)
-#define BIT6(x)                         ((((x) & 0x40) > 0) ? 1 : 0)
-#define BIT7(x)                         ((((x) & 0x80) > 0) ? 1 : 0)
-
-#define LOW_BASE(w)                     ((u16) ((w) & 0x0000FFFF))
-#define MID_BASE(b)                     ((u8) (((b) & 0x00FF0000) >> 16))
-#define HI_BASE(b)                      ((u8) (((b) & 0xFF000000) >> 24))
-#define LOW_LIMIT(w)                    ((u16) ((w) & 0x0000FFFF))
-#define HI_LIMIT(b)                     ((u8) (((b) & 0x00FF0000) >> 16))
-
-
-#ifdef _IA16
-/*
- * For 16-bit addresses, we have to assume that the upper 32 bits
- * are zero.
- */
-#define ACPI_GET_ADDRESS(a)             ((a).lo)
-#define ACPI_STORE_ADDRESS(a,b)         {(a).hi=0;(a).lo=(b);}
-#define ACPI_VALID_ADDRESS(a)           ((a).hi | (a).lo)
-
-#else
-/*
- * Full 64-bit address on 32-bit and 64-bit platforms
- */
-#define ACPI_GET_ADDRESS(a)             (a)
-#define ACPI_STORE_ADDRESS(a,b)         ((a)=(b))
-#define ACPI_VALID_ADDRESS(a)           (a)
-#endif
- /*
-  * Extract a byte of data using a pointer.  Any more than a byte and we
-  * get into potential aligment issues -- see the STORE macros below
-  */
-#define GET8(addr)                      (*(u8*)(addr))
-
-
-/*
- * Macros for moving data around to/from buffers that are possibly unaligned.
- * If the hardware supports the transfer of unaligned data, just do the store.
- * Otherwise, we have to move one byte at a time.
- */
-
-#ifdef _HW_ALIGNMENT_SUPPORT
-
-/* The hardware supports unaligned transfers, just do the move */
-
-#define MOVE_UNALIGNED16_TO_16(d,s)     *(u16*)(d) = *(u16*)(s)
-#define MOVE_UNALIGNED32_TO_32(d,s)     *(u32*)(d) = *(u32*)(s)
-#define MOVE_UNALIGNED16_TO_32(d,s)     *(u32*)(d) = *(u16*)(s)
-
-#else
-/*
- * The hardware does not support unaligned transfers.  We must move the
- * data one byte at a time.  These macros work whether the source or
- * the destination (or both) is/are unaligned.
- */
-
-#define MOVE_UNALIGNED16_TO_16(d,s)     {((u8 *)(d))[0] = ((u8 *)(s))[0];\
-        ((u8 *)(d))[1] = ((u8 *)(s))[1];}
-
-#define MOVE_UNALIGNED32_TO_32(d,s)     {((u8 *)(d))[0] = ((u8 *)(s))[0];\
-                         ((u8 *)(d))[1] = ((u8 *)(s))[1];\
-                         ((u8 *)(d))[2] = ((u8 *)(s))[2];\
-                         ((u8 *)(d))[3] = ((u8 *)(s))[3];}
-
-#define MOVE_UNALIGNED16_TO_32(d,s)     {(*(u32*)(d)) = 0; MOVE_UNALIGNED16_TO_16(d,s);}
-
-#endif
-
-
-/*
- * Fast power-of-two math macros for non-optimized compilers
- */
-
-#define _DIV(value,power_of2)           ((u32) ((value) >> (power_of2)))
-#define _MUL(value,power_of2)           ((u32) ((value) << (power_of2)))
-#define _MOD(value,divisor)             ((u32) ((value) & ((divisor) -1)))
-
-#define DIV_2(a)                        _DIV(a,1)
-#define MUL_2(a)                        _MUL(a,1)
-#define MOD_2(a)                        _MOD(a,2)
-
-#define DIV_4(a)                        _DIV(a,2)
-#define MUL_4(a)                        _MUL(a,2)
-#define MOD_4(a)                        _MOD(a,4)
-
-#define DIV_8(a)                        _DIV(a,3)
-#define MUL_8(a)                        _MUL(a,3)
-#define MOD_8(a)                        _MOD(a,8)
-
-#define DIV_16(a)                       _DIV(a,4)
-#define MUL_16(a)                       _MUL(a,4)
-#define MOD_16(a)                       _MOD(a,16)
-
-/*
- * Divide and Modulo
- */
-#define ACPI_DIVIDE(n,d)                ((n) / (d))
-#define ACPI_MODULO(n,d)                ((n) % (d))
-
-/*
- * Rounding macros (Power of two boundaries only)
- */
-
-#define ROUND_DOWN(value,boundary)      ((value) & (~((boundary)-1)))
-#define ROUND_UP(value,boundary)        (((value) + ((boundary)-1)) & (~((boundary)-1)))
-
-#define ROUND_DOWN_TO_32_BITS(a)        ROUND_DOWN(a,4)
-#define ROUND_DOWN_TO_64_BITS(a)        ROUND_DOWN(a,8)
-#define ROUND_DOWN_TO_NATIVE_WORD(a)    ROUND_DOWN(a,ALIGNED_ADDRESS_BOUNDARY)
-
-#define ROUND_UP_TO_32_bITS(a)          ROUND_UP(a,4)
-#define ROUND_UP_TO_64_bITS(a)          ROUND_UP(a,8)
-#define ROUND_UP_TO_NATIVE_WORD(a)      ROUND_UP(a,ALIGNED_ADDRESS_BOUNDARY)
-
-#define ROUND_PTR_UP_TO_4(a,b)          ((b *)(((NATIVE_UINT)(a) + 3) & ~3))
-#define ROUND_PTR_UP_TO_8(a,b)          ((b *)(((NATIVE_UINT)(a) + 7) & ~7))
-
-#define ROUND_UP_TO_1_k(a)              (((a) + 1023) >> 10)
-
-#ifdef DEBUG_ASSERT
-#undef DEBUG_ASSERT
-#endif
-
-
-/* Macros for GAS addressing */
-
-#ifdef __GNUC__
-#define ACPI_PCI_DEVICE_MASK            (UINT64) 0x0000FFFF00000000ULL
-#define ACPI_PCI_FUNCTION_MASK          (UINT64) 0x00000000FFFF0000ULL
-#define ACPI_PCI_REGISTER_MASK          (UINT64) 0x000000000000FFFFULL
-#else
-#define ACPI_PCI_DEVICE_MASK            (UINT64) 0x0000FFFF00000000
-#define ACPI_PCI_FUNCTION_MASK          (UINT64) 0x00000000FFFF0000
-#define ACPI_PCI_REGISTER_MASK          (UINT64) 0x000000000000FFFF
-#endif
-
-#define ACPI_PCI_FUNCTION(a)            (u32) ((((a) & ACPI_PCI_FUNCTION_MASK) >> 16))
-#define ACPI_PCI_DEVICE(a)              (u32) ((((a) & ACPI_PCI_DEVICE_MASK) >> 32))
-
-#ifndef _IA16
-#define ACPI_PCI_REGISTER(a)            (u32) (((a) & ACPI_PCI_REGISTER_MASK))
-#define ACPI_PCI_DEVFUN(a)              (u32) ((ACPI_PCI_DEVICE(a) << 16) | ACPI_PCI_FUNCTION(a))
-
-#else
-#define ACPI_PCI_REGISTER(a)            (u32) (((a) & 0x0000FFFF))
-#define ACPI_PCI_DEVFUN(a)              (u32) ((((a) & 0xFFFF0000) >> 16))
-
-#endif
-
-/*
- * An ACPI_HANDLE (which is actually an ACPI_NAMESPACE_NODE *) can appear in some contexts,
- * such as on ap_obj_stack, where a pointer to an ACPI_OPERAND_OBJECT can also
- * appear.  This macro is used to distinguish them.
- *
- * The Data_type field is the first field in both structures.
- */
-
-#define VALID_DESCRIPTOR_TYPE(d,t)      (((ACPI_NAMESPACE_NODE *)d)->data_type == t)
-
-
-/* Macro to test the object type */
-
-#define IS_THIS_OBJECT_TYPE(d,t)        (((ACPI_OPERAND_OBJECT  *)d)->common.type == (u8)t)
-
-/* Macro to check the table flags for SINGLE or MULTIPLE tables are allowed */
-
-#define IS_SINGLE_TABLE(x)              (((x) & 0x01) == ACPI_TABLE_SINGLE ? 1 : 0)
-
-/*
- * Macro to check if a pointer is within an ACPI table.
- * Parameter (a) is the pointer to check.  Parameter (b) must be defined
- * as a pointer to an ACPI_TABLE_HEADER.  (b+1) then points past the header,
- * and ((u8 *)b+b->Length) points one byte past the end of the table.
- */
-
-#ifndef _IA16
-#define IS_IN_ACPI_TABLE(a,b)           (((u8 *)(a) >= (u8 *)(b + 1)) &&\
-                                         ((u8 *)(a) < ((u8 *)b + b->length)))
-
-#else
-#define IS_IN_ACPI_TABLE(a,b)           (_segment)(a) == (_segment)(b) &&\
-                                                          (((u8 *)(a) >= (u8 *)(b + 1)) &&\
-                                                          ((u8 *)(a) < ((u8 *)b + b->length)))
-#endif
-
-/*
- * Macros for the master AML opcode table
- */
-
-#ifdef ACPI_DEBUG
-#define OP_INFO_ENTRY(flags,name,Pargs,Iargs)     {flags,Pargs,Iargs,name}
-#else
-#define OP_INFO_ENTRY(flags,name,Pargs,Iargs)     {flags,Pargs,Iargs}
-#endif
-
-#define ARG_TYPE_WIDTH                  5
-#define ARG_1(x)                        ((u32)(x))
-#define ARG_2(x)                        ((u32)(x) << (1 * ARG_TYPE_WIDTH))
-#define ARG_3(x)                        ((u32)(x) << (2 * ARG_TYPE_WIDTH))
-#define ARG_4(x)                        ((u32)(x) << (3 * ARG_TYPE_WIDTH))
-#define ARG_5(x)                        ((u32)(x) << (4 * ARG_TYPE_WIDTH))
-#define ARG_6(x)                        ((u32)(x) << (5 * ARG_TYPE_WIDTH))
-
-#define ARGI_LIST1(a)                   (ARG_1(a))
-#define ARGI_LIST2(a,b)                 (ARG_1(b)|ARG_2(a))
-#define ARGI_LIST3(a,b,c)               (ARG_1(c)|ARG_2(b)|ARG_3(a))
-#define ARGI_LIST4(a,b,c,d)             (ARG_1(d)|ARG_2(c)|ARG_3(b)|ARG_4(a))
-#define ARGI_LIST5(a,b,c,d,e)           (ARG_1(e)|ARG_2(d)|ARG_3(c)|ARG_4(b)|ARG_5(a))
-#define ARGI_LIST6(a,b,c,d,e,f)         (ARG_1(f)|ARG_2(e)|ARG_3(d)|ARG_4(c)|ARG_5(b)|ARG_6(a))
-
-#define ARGP_LIST1(a)                   (ARG_1(a))
-#define ARGP_LIST2(a,b)                 (ARG_1(a)|ARG_2(b))
-#define ARGP_LIST3(a,b,c)               (ARG_1(a)|ARG_2(b)|ARG_3(c))
-#define ARGP_LIST4(a,b,c,d)             (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d))
-#define ARGP_LIST5(a,b,c,d,e)           (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e))
-#define ARGP_LIST6(a,b,c,d,e,f)         (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e)|ARG_6(f))
-
-#define GET_CURRENT_ARG_TYPE(list)      (list & ((u32) 0x1F))
-#define INCREMENT_ARG_LIST(list)        (list >>= ((u32) ARG_TYPE_WIDTH))
-
-
-/*
- * Reporting macros that are never compiled out
- */
-
-#define PARAM_LIST(pl)                  pl
-
-/*
- * Error reporting.  These versions add callers module and line#.  Since
- * _THIS_MODULE gets compiled out when ACPI_DEBUG isn't defined, only
- * use it in debug mode.
- */
-
-#ifdef ACPI_DEBUG
-
-#define REPORT_INFO(fp)                 {_report_info(_THIS_MODULE,__LINE__,_COMPONENT); \
-                                                                         debug_print_raw PARAM_LIST(fp);}
-#define REPORT_ERROR(fp)                {_report_error(_THIS_MODULE,__LINE__,_COMPONENT); \
-                                                                                       debug_print_raw PARAM_LIST(fp);}
-#define REPORT_WARNING(fp)              {_report_warning(_THIS_MODULE,__LINE__,_COMPONENT); \
-                                                                                       debug_print_raw PARAM_LIST(fp);}
-
-#else
-
-#define REPORT_INFO(fp)                 {_report_info("ACPI",__LINE__,_COMPONENT); \
-                                                                                       debug_print_raw PARAM_LIST(fp);}
-#define REPORT_ERROR(fp)                {_report_error("ACPI",__LINE__,_COMPONENT); \
-                                                                                       debug_print_raw PARAM_LIST(fp);}
-#define REPORT_WARNING(fp)              {_report_warning("ACPI",__LINE__,_COMPONENT); \
-                                                                                       debug_print_raw PARAM_LIST(fp);}
-
-#endif
-
-/* Error reporting.  These versions pass thru the module and line# */
-
-#define _REPORT_INFO(a,b,c,fp)          {_report_info(a,b,c); \
-                                                                                       debug_print_raw PARAM_LIST(fp);}
-#define _REPORT_ERROR(a,b,c,fp)         {_report_error(a,b,c); \
-                                                                                       debug_print_raw PARAM_LIST(fp);}
-#define _REPORT_WARNING(a,b,c,fp)       {_report_warning(a,b,c); \
-                                                                                       debug_print_raw PARAM_LIST(fp);}
-
-/* Buffer dump macros */
-
-#define DUMP_BUFFER(a,b)                acpi_cm_dump_buffer((u8 *)a,b,DB_BYTE_DISPLAY,_COMPONENT)
-
-/*
- * Debug macros that are conditionally compiled
- */
-
-#ifdef ACPI_DEBUG
-
-#define MODULE_NAME(name)               static char *_THIS_MODULE = name;
-
-/*
- * Function entry tracing.
- * The first parameter should be the procedure name as a quoted string.  This is declared
- * as a local string ("_Proc_name) so that it can be also used by the function exit macros below.
- */
-
-#define FUNCTION_TRACE(a)               char * _proc_name = a;\
-                                                                               function_trace(_THIS_MODULE,__LINE__,_COMPONENT,a)
-#define FUNCTION_TRACE_PTR(a,b)         char * _proc_name = a;\
-                                                                               function_trace_ptr(_THIS_MODULE,__LINE__,_COMPONENT,a,(void *)b)
-#define FUNCTION_TRACE_U32(a,b)         char * _proc_name = a;\
-                                                                               function_trace_u32(_THIS_MODULE,__LINE__,_COMPONENT,a,(u32)b)
-#define FUNCTION_TRACE_STR(a,b)         char * _proc_name = a;\
-                                                                               function_trace_str(_THIS_MODULE,__LINE__,_COMPONENT,a,(NATIVE_CHAR *)b)
-/*
- * Function exit tracing.
- * WARNING: These macros include a return statement.  This is usually considered
- * bad form, but having a separate exit macro is very ugly and difficult to maintain.
- * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros
- * so that "_Proc_name" is defined.
- */
-#define return_VOID                     {function_exit(_THIS_MODULE,__LINE__,_COMPONENT,_proc_name);return;}
-#define return_ACPI_STATUS(s)           {function_status_exit(_THIS_MODULE,__LINE__,_COMPONENT,_proc_name,s);return(s);}
-#define return_VALUE(s)                 {function_value_exit(_THIS_MODULE,__LINE__,_COMPONENT,_proc_name,(ACPI_INTEGER)s);return(s);}
-#define return_PTR(s)                   {function_ptr_exit(_THIS_MODULE,__LINE__,_COMPONENT,_proc_name,(u8 *)s);return(s);}
-
-
-/* Conditional execution */
-
-#define DEBUG_EXEC(a)                   a
-#define NORMAL_EXEC(a)
-
-#define DEBUG_DEFINE(a)                 a;
-#define DEBUG_ONLY_MEMBERS(a)           a;
-#define _OPCODE_NAMES
-#define _VERBOSE_STRUCTURES
-
-
-/* Stack and buffer dumping */
-
-#define DUMP_STACK_ENTRY(a)             acpi_aml_dump_operand(a)
-#define DUMP_OPERANDS(a,b,c,d,e)        acpi_aml_dump_operands(a,b,c,d,e,_THIS_MODULE,__LINE__)
-
-
-#define DUMP_ENTRY(a,b)                 acpi_ns_dump_entry (a,b)
-#define DUMP_TABLES(a,b)                acpi_ns_dump_tables(a,b)
-#define DUMP_PATHNAME(a,b,c,d)          acpi_ns_dump_pathname(a,b,c,d)
-#define DUMP_RESOURCE_LIST(a)           acpi_rs_dump_resource_list(a)
-#define BREAK_MSG(a)                    acpi_os_breakpoint (a)
-
-/*
- * Generate INT3 on ACPI_ERROR (Debug only!)
- */
-
-#define ERROR_BREAK
-#ifdef  ERROR_BREAK
-#define BREAK_ON_ERROR(lvl)             if ((lvl)&ACPI_ERROR) acpi_os_breakpoint("Fatal error encountered\n")
-#else
-#define BREAK_ON_ERROR(lvl)
-#endif
-
-/*
- * Master debug print macros
- * Print iff:
- *    1) Debug print for the current component is enabled
- *    2) Debug error level or trace level for the print statement is enabled
- *
- */
-
-#define TEST_DEBUG_SWITCH(lvl)          if (((lvl) & acpi_dbg_level) && (_COMPONENT & acpi_dbg_layer))
-
-#define DEBUG_PRINT(lvl,fp)             TEST_DEBUG_SWITCH(lvl) {\
-                                                                                       debug_print_prefix (_THIS_MODULE,__LINE__);\
-                                                                                       debug_print_raw PARAM_LIST(fp);\
-                                                                                       BREAK_ON_ERROR(lvl);}
-
-#define DEBUG_PRINT_RAW(lvl,fp)         TEST_DEBUG_SWITCH(lvl) {\
-                                                                                       debug_print_raw PARAM_LIST(fp);}
-
-
-/* Assert macros */
-
-#define ACPI_ASSERT(exp)                if(!(exp)) \
-                                                                                       acpi_os_dbg_assert(#exp, __FILE__, __LINE__, "Failed Assertion")
-
-#define DEBUG_ASSERT(msg, exp)          if(!(exp)) \
-                                                                                       acpi_os_dbg_assert(#exp, __FILE__, __LINE__, msg)
-
-
-#else
-/*
- * This is the non-debug case -- make everything go away,
- * leaving no executable debug code!
- */
-
-#define MODULE_NAME(name)
-#define _THIS_MODULE ""
-
-#define DEBUG_EXEC(a)
-#define NORMAL_EXEC(a)                  a;
-
-#define DEBUG_DEFINE(a)
-#define DEBUG_ONLY_MEMBERS(a)
-#define FUNCTION_TRACE(a)
-#define FUNCTION_TRACE_PTR(a,b)
-#define FUNCTION_TRACE_U32(a,b)
-#define FUNCTION_TRACE_STR(a,b)
-#define FUNCTION_EXIT
-#define FUNCTION_STATUS_EXIT(s)
-#define FUNCTION_VALUE_EXIT(s)
-#define DUMP_STACK_ENTRY(a)
-#define DUMP_OPERANDS(a,b,c,d,e)
-#define DUMP_ENTRY(a,b)
-#define DUMP_TABLES(a,b)
-#define DUMP_PATHNAME(a,b,c,d)
-#define DUMP_RESOURCE_LIST(a)
-#define DEBUG_PRINT(l,f)
-#define DEBUG_PRINT_RAW(l,f)
-#define BREAK_MSG(a)
-
-#define return_VOID                     return
-#define return_ACPI_STATUS(s)           return(s)
-#define return_VALUE(s)                 return(s)
-#define return_PTR(s)                   return(s)
-
-#define ACPI_ASSERT(exp)
-#define DEBUG_ASSERT(msg, exp)
-
-#endif
-
-/*
- * Some code only gets executed when the debugger is built in.
- * Note that this is entirely independent of whether the
- * DEBUG_PRINT stuff (set by ACPI_DEBUG) is on, or not.
- */
-#ifdef ENABLE_DEBUGGER
-#define DEBUGGER_EXEC(a)                a
-#else
-#define DEBUGGER_EXEC(a)
-#endif
-
-
-/*
- * For 16-bit code, we want to shrink some things even though
- * we are using ACPI_DEBUG to get the debug output
- */
-#ifdef _IA16
-#undef DEBUG_ONLY_MEMBERS
-#undef _VERBOSE_STRUCTURES
-#define DEBUG_ONLY_MEMBERS(a)
-#endif
-
-
-#ifdef ACPI_DEBUG
-
-/*
- * 1) Set name to blanks
- * 2) Copy the object name
- */
-
-#define ADD_OBJECT_NAME(a,b)            MEMSET (a->common.name, ' ', sizeof (a->common.name));\
-                                                                               STRNCPY (a->common.name, acpi_gbl_ns_type_names[b], sizeof (a->common.name))
-
-#else
-
-#define ADD_OBJECT_NAME(a,b)
-
-#endif
-
-
-#endif /* ACMACROS_H */
diff --git a/reactos/drivers/bus/acpi/include/acnamesp.h b/reactos/drivers/bus/acpi/include/acnamesp.h
deleted file mode 100644 (file)
index ad1d0a6..0000000
+++ /dev/null
@@ -1,430 +0,0 @@
-/******************************************************************************
- *
- * Name: acnamesp.h - Namespace subcomponent prototypes and defines
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACNAMESP_H__
-#define __ACNAMESP_H__
-
-
-/* To search the entire name space, pass this as Search_base */
-
-#define NS_ALL                  ((ACPI_HANDLE)0)
-
-/*
- * Elements of Acpi_ns_properties are bit significant
- * and should be one-to-one with values of ACPI_OBJECT_TYPE
- */
-#define NSP_NORMAL              0
-#define NSP_NEWSCOPE            1   /* a definition of this type opens a name scope */
-#define NSP_LOCAL               2   /* suppress search of enclosing scopes */
-
-
-/* Definitions of the predefined namespace names  */
-
-#define ACPI_UNKNOWN_NAME       (u32) 0x3F3F3F3F     /* Unknown name is  "????" */
-#define ACPI_ROOT_NAME          (u32) 0x2F202020     /* Root name is     "/   " */
-#define ACPI_SYS_BUS_NAME       (u32) 0x5F53425F     /* Sys bus name is  "_SB_" */
-
-#define NS_ROOT_PATH            "/"
-#define NS_SYSTEM_BUS           "_SB_"
-
-
-/* Flags for Acpi_ns_lookup, Acpi_ns_search_and_enter */
-
-#define NS_NO_UPSEARCH          0
-#define NS_SEARCH_PARENT        0x01
-#define NS_DONT_OPEN_SCOPE      0x02
-#define NS_NO_PEER_SEARCH       0x04
-#define NS_ERROR_IF_FOUND       0x08
-
-#define NS_WALK_UNLOCK          TRUE
-#define NS_WALK_NO_UNLOCK       FALSE
-
-
-ACPI_STATUS
-acpi_ns_load_namespace (
-       void);
-
-ACPI_STATUS
-acpi_ns_initialize_objects (
-       void);
-
-ACPI_STATUS
-acpi_ns_initialize_devices (
-       void);
-
-
-/* Namespace init - nsxfinit */
-
-ACPI_STATUS
-acpi_ns_init_one_device (
-       ACPI_HANDLE             obj_handle,
-       u32                     nesting_level,
-       void                    *context,
-       void                    **return_value);
-
-ACPI_STATUS
-acpi_ns_init_one_object (
-       ACPI_HANDLE             obj_handle,
-       u32                     level,
-       void                    *context,
-       void                    **return_value);
-
-
-ACPI_STATUS
-acpi_ns_walk_namespace (
-       OBJECT_TYPE_INTERNAL    type,
-       ACPI_HANDLE             start_object,
-       u32                     max_depth,
-       u8                      unlock_before_callback,
-       WALK_CALLBACK           user_function,
-       void                    *context,
-       void                    **return_value);
-
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_get_next_object (
-       OBJECT_TYPE_INTERNAL    type,
-       ACPI_NAMESPACE_NODE     *parent,
-       ACPI_NAMESPACE_NODE     *child);
-
-
-ACPI_STATUS
-acpi_ns_delete_namespace_by_owner (
-       u16                     table_id);
-
-
-/* Namespace loading - nsload */
-
-ACPI_STATUS
-acpi_ns_one_complete_parse (
-       u32                     pass_number,
-       ACPI_TABLE_DESC         *table_desc);
-
-ACPI_STATUS
-acpi_ns_parse_table (
-       ACPI_TABLE_DESC         *table_desc,
-       ACPI_NAMESPACE_NODE     *scope);
-
-ACPI_STATUS
-acpi_ns_load_table (
-       ACPI_TABLE_DESC         *table_desc,
-       ACPI_NAMESPACE_NODE     *node);
-
-ACPI_STATUS
-acpi_ns_load_table_by_type (
-       ACPI_TABLE_TYPE         table_type);
-
-
-/*
- * Top-level namespace access - nsaccess
- */
-
-
-ACPI_STATUS
-acpi_ns_root_initialize (
-       void);
-
-ACPI_STATUS
-acpi_ns_lookup (
-       ACPI_GENERIC_STATE      *scope_info,
-       NATIVE_CHAR             *name,
-       OBJECT_TYPE_INTERNAL    type,
-       OPERATING_MODE          interpreter_mode,
-       u32                     flags,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_NAMESPACE_NODE     **ret_node);
-
-
-/*
- * Named object allocation/deallocation - nsalloc
- */
-
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_create_node (
-       u32                     acpi_name);
-
-void
-acpi_ns_delete_node (
-       ACPI_NAMESPACE_NODE     *node);
-
-ACPI_STATUS
-acpi_ns_delete_namespace_subtree (
-       ACPI_NAMESPACE_NODE     *parent_handle);
-
-void
-acpi_ns_detach_object (
-       ACPI_NAMESPACE_NODE     *node);
-
-void
-acpi_ns_delete_children (
-       ACPI_NAMESPACE_NODE     *parent);
-
-
-/*
- * Namespace modification - nsmodify
- */
-
-ACPI_STATUS
-acpi_ns_unload_namespace (
-       ACPI_HANDLE             handle);
-
-ACPI_STATUS
-acpi_ns_delete_subtree (
-       ACPI_HANDLE             start_handle);
-
-
-/*
- * Namespace dump/print utilities - nsdump
- */
-
-void
-acpi_ns_dump_tables (
-       ACPI_HANDLE             search_base,
-       u32                     max_depth);
-
-void
-acpi_ns_dump_entry (
-       ACPI_HANDLE             handle,
-       u32                     debug_level);
-
-ACPI_STATUS
-acpi_ns_dump_pathname (
-       ACPI_HANDLE             handle,
-       NATIVE_CHAR             *msg,
-       u32                     level,
-       u32                     component);
-
-void
-acpi_ns_dump_root_devices (
-       void);
-
-void
-acpi_ns_dump_objects (
-       OBJECT_TYPE_INTERNAL    type,
-       u32                     max_depth,
-       u32                     ownder_id,
-       ACPI_HANDLE             start_handle);
-
-
-/*
- * Namespace evaluation functions - nseval
- */
-
-ACPI_STATUS
-acpi_ns_evaluate_by_handle (
-       ACPI_NAMESPACE_NODE     *prefix_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_object);
-
-ACPI_STATUS
-acpi_ns_evaluate_by_name (
-       NATIVE_CHAR             *pathname,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_object);
-
-ACPI_STATUS
-acpi_ns_evaluate_relative (
-       ACPI_NAMESPACE_NODE     *prefix_node,
-       NATIVE_CHAR             *pathname,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_object);
-
-ACPI_STATUS
-acpi_ns_execute_control_method (
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_obj_desc);
-
-ACPI_STATUS
-acpi_ns_get_object_value (
-       ACPI_NAMESPACE_NODE     *object_node,
-       ACPI_OPERAND_OBJECT     **return_obj_desc);
-
-
-/*
- * Parent/Child/Peer utility functions - nsfamily
- */
-
-ACPI_NAME
-acpi_ns_find_parent_name (
-       ACPI_NAMESPACE_NODE     *node_to_search);
-
-u8
-acpi_ns_exist_downstream_sibling (
-       ACPI_NAMESPACE_NODE     *this_node);
-
-
-/*
- * Scope manipulation - nsscope
- */
-
-u32
-acpi_ns_opens_scope (
-       OBJECT_TYPE_INTERNAL    type);
-
-NATIVE_CHAR *
-acpi_ns_get_table_pathname (
-       ACPI_NAMESPACE_NODE     *node);
-
-NATIVE_CHAR *
-acpi_ns_name_of_current_scope (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ns_handle_to_pathname (
-       ACPI_HANDLE             obj_handle,
-       u32                     *buf_size,
-       NATIVE_CHAR             *user_buffer);
-
-u8
-acpi_ns_pattern_match (
-       ACPI_NAMESPACE_NODE     *obj_node,
-       NATIVE_CHAR             *search_for);
-
-ACPI_STATUS
-acpi_ns_name_compare (
-       ACPI_HANDLE             obj_handle,
-       u32                     level,
-       void                    *context,
-       void                    **return_value);
-
-ACPI_STATUS
-acpi_ns_get_node (
-       NATIVE_CHAR             *pathname,
-       ACPI_NAMESPACE_NODE     *in_prefix_node,
-       ACPI_NAMESPACE_NODE     **out_node);
-
-u32
-acpi_ns_get_pathname_length (
-       ACPI_NAMESPACE_NODE     *node);
-
-
-/*
- * Object management for NTEs - nsobject
- */
-
-ACPI_STATUS
-acpi_ns_attach_object (
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_OPERAND_OBJECT     *object,
-       OBJECT_TYPE_INTERNAL    type);
-
-
-void *
-acpi_ns_compare_value (
-       ACPI_HANDLE             obj_handle,
-       u32                     level,
-       void                    *obj_desc);
-
-
-/*
- * Namespace searching and entry - nssearch
- */
-
-ACPI_STATUS
-acpi_ns_search_and_enter (
-       u32                     entry_name,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_NAMESPACE_NODE     *node,
-       OPERATING_MODE          interpreter_mode,
-       OBJECT_TYPE_INTERNAL    type,
-       u32                     flags,
-       ACPI_NAMESPACE_NODE     **ret_node);
-
-ACPI_STATUS
-acpi_ns_search_node (
-       u32                     entry_name,
-       ACPI_NAMESPACE_NODE     *node,
-       OBJECT_TYPE_INTERNAL    type,
-       ACPI_NAMESPACE_NODE     **ret_node);
-
-void
-acpi_ns_install_node (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_NAMESPACE_NODE     *parent_node,   /* Parent */
-       ACPI_NAMESPACE_NODE     *node,      /* New Child*/
-       OBJECT_TYPE_INTERNAL    type);
-
-
-/*
- * Utility functions - nsutils
- */
-
-u8
-acpi_ns_valid_root_prefix (
-       NATIVE_CHAR             prefix);
-
-u8
-acpi_ns_valid_path_separator (
-       NATIVE_CHAR             sep);
-
-OBJECT_TYPE_INTERNAL
-acpi_ns_get_type (
-       ACPI_HANDLE             obj_handle);
-
-void *
-acpi_ns_get_attached_object (
-       ACPI_HANDLE             obj_handle);
-
-u32
-acpi_ns_local (
-       OBJECT_TYPE_INTERNAL    type);
-
-ACPI_STATUS
-acpi_ns_internalize_name (
-       NATIVE_CHAR             *dotted_name,
-       NATIVE_CHAR             **converted_name);
-
-ACPI_STATUS
-acpi_ns_externalize_name (
-       u32                     internal_name_length,
-       NATIVE_CHAR             *internal_name,
-       u32                     *converted_name_length,
-       NATIVE_CHAR             **converted_name);
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_convert_handle_to_entry (
-       ACPI_HANDLE             handle);
-
-ACPI_HANDLE
-acpi_ns_convert_entry_to_handle(
-       ACPI_NAMESPACE_NODE     *node);
-
-void
-acpi_ns_terminate (
-       void);
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_get_parent_object (
-       ACPI_NAMESPACE_NODE     *node);
-
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_get_next_valid_object (
-       ACPI_NAMESPACE_NODE     *node);
-
-
-#endif /* __ACNAMESP_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acobject.h b/reactos/drivers/bus/acpi/include/acobject.h
deleted file mode 100644 (file)
index 5996628..0000000
+++ /dev/null
@@ -1,425 +0,0 @@
-
-/******************************************************************************
- *
- * Name: acobject.h - Definition of ACPI_OPERAND_OBJECT  (Internal object only)
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef _ACOBJECT_H
-#define _ACOBJECT_H
-
-
-/*
- * The ACPI_OPERAND_OBJECT  is used to pass AML operands from the dispatcher
- * to the interpreter, and to keep track of the various handlers such as
- * address space handlers and notify handlers.  The object is a constant
- * size in order to allow them to be cached and reused.
- *
- * All variants of the ACPI_OPERAND_OBJECT  are defined with the same
- * sequence of field types, with fields that are not used in a particular
- * variant being named "Reserved".  This is not strictly necessary, but
- * may in some circumstances simplify understanding if these structures
- * need to be displayed in a debugger having limited (or no) support for
- * union types.  It also simplifies some debug code in Dump_table() which
- * dumps multi-level values: fetching Buffer.Pointer suffices to pick up
- * the value or next level for any of several types.
- */
-
-/******************************************************************************
- *
- * Common Descriptors
- *
- *****************************************************************************/
-
-/*
- * Common area for all objects.
- *
- * Data_type is used to differentiate between internal descriptors, and MUST
- * be the first byte in this structure.
- */
-
-
-#define ACPI_OBJECT_COMMON_HEADER           /* 32-bits plus 8-bit flag */\
-       u8                          data_type;          /* To differentiate various internal objs */\
-       u8                          type;               /* ACPI_OBJECT_TYPE */\
-       u16                         reference_count;    /* For object deletion management */\
-       u8                          flags; \
-
-/* Defines for flag byte above */
-
-#define AOPOBJ_STATIC_ALLOCATION    0x1
-#define AOPOBJ_DATA_VALID           0x2
-#define AOPOBJ_INITIALIZED          0x4
-
-
-/*
- * Common bitfield for the field objects
- */
-#define ACPI_COMMON_FIELD_INFO              /* Three 32-bit values plus 8*/\
-       u8                          granularity;\
-       u16                         length; \
-       u32                         offset;             /* Byte offset within containing object */\
-       u8                          bit_offset;         /* Bit offset within min read/write data unit */\
-       u8                          access;             /* Access_type */\
-       u8                          lock_rule;\
-       u8                          update_rule;\
-       u8                          access_attribute;
-
-
-/******************************************************************************
- *
- * Individual Object Descriptors
- *
- *****************************************************************************/
-
-
-typedef struct /* COMMON */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-} ACPI_OBJECT_COMMON;
-
-
-typedef struct /* CACHE_LIST */
-{
-       ACPI_OBJECT_COMMON_HEADER
-       union acpi_operand_obj      *next;              /* Link for object cache and internal lists*/
-
-} ACPI_OBJECT_CACHE_LIST;
-
-
-typedef struct /* NUMBER - has value */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       ACPI_INTEGER                value;
-
-} ACPI_OBJECT_INTEGER;
-
-
-typedef struct /* STRING - has length and pointer - Null terminated, ASCII characters only */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       u32                         length;
-       NATIVE_CHAR                 *pointer;       /* String value in AML stream or in allocated space */
-
-} ACPI_OBJECT_STRING;
-
-
-typedef struct /* BUFFER - has length and pointer - not null terminated */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       u32                         length;
-       u8                          *pointer;       /* points to the buffer in allocated space */
-
-} ACPI_OBJECT_BUFFER;
-
-
-typedef struct /* PACKAGE - has count, elements, next element */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       u32                         count;          /* # of elements in package */
-
-       union acpi_operand_obj      **elements;     /* Array of pointers to Acpi_objects */
-       union acpi_operand_obj      **next_element; /* used only while initializing */
-
-} ACPI_OBJECT_PACKAGE;
-
-
-typedef struct /* FIELD UNIT */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       ACPI_COMMON_FIELD_INFO
-
-       union acpi_operand_obj      *extra;             /* Pointer to executable AML (in field definition) */
-       ACPI_NAMESPACE_NODE         *node;              /* containing object */
-       union acpi_operand_obj      *container;         /* Containing object (Buffer) */
-
-} ACPI_OBJECT_FIELD_UNIT;
-
-
-typedef struct /* DEVICE - has handle and notification handler/context */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       union acpi_operand_obj      *sys_handler;        /* Handler for system notifies */
-       union acpi_operand_obj      *drv_handler;        /* Handler for driver notifies */
-       union acpi_operand_obj      *addr_handler;       /* Handler for Address space */
-
-} ACPI_OBJECT_DEVICE;
-
-
-typedef struct /* EVENT */
-{
-       ACPI_OBJECT_COMMON_HEADER
-       void                        *semaphore;
-
-} ACPI_OBJECT_EVENT;
-
-
-#define INFINITE_CONCURRENCY        0xFF
-
-typedef struct /* METHOD */
-{
-       ACPI_OBJECT_COMMON_HEADER
-       u8                          method_flags;
-       u8                          param_count;
-
-       u32                         pcode_length;
-
-       void                        *semaphore;
-       u8                          *pcode;
-
-       u8                          concurrency;
-       u8                          thread_count;
-       ACPI_OWNER_ID               owning_id;
-
-} ACPI_OBJECT_METHOD;
-
-
-typedef struct acpi_obj_mutex /* MUTEX */
-{
-       ACPI_OBJECT_COMMON_HEADER
-       u16                         sync_level;
-       u16                         acquisition_depth;
-
-       void                        *semaphore;
-       void                        *owner;
-       union acpi_operand_obj      *prev;              /* Link for list of acquired mutexes */
-       union acpi_operand_obj      *next;              /* Link for list of acquired mutexes */
-
-} ACPI_OBJECT_MUTEX;
-
-
-typedef struct /* REGION */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       u8                          space_id;
-       u32                         length;
-       ACPI_PHYSICAL_ADDRESS       address;
-       union acpi_operand_obj      *extra;             /* Pointer to executable AML (in region definition) */
-
-       union acpi_operand_obj      *addr_handler;      /* Handler for system notifies */
-       ACPI_NAMESPACE_NODE         *node;              /* containing object */
-       union acpi_operand_obj      *next;
-
-} ACPI_OBJECT_REGION;
-
-
-typedef struct /* POWER RESOURCE - has Handle and notification handler/context*/
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       u32                         system_level;
-       u32                         resource_order;
-
-       union acpi_operand_obj      *sys_handler;       /* Handler for system notifies */
-       union acpi_operand_obj      *drv_handler;       /* Handler for driver notifies */
-
-} ACPI_OBJECT_POWER_RESOURCE;
-
-
-typedef struct /* PROCESSOR - has Handle and notification handler/context*/
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       u32                         proc_id;
-       u32                         length;
-       ACPI_IO_ADDRESS             address;
-
-       union acpi_operand_obj      *sys_handler;       /* Handler for system notifies */
-       union acpi_operand_obj      *drv_handler;       /* Handler for driver notifies */
-       union acpi_operand_obj      *addr_handler;      /* Handler for Address space */
-
-} ACPI_OBJECT_PROCESSOR;
-
-
-typedef struct /* THERMAL ZONE - has Handle and Handler/Context */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       union acpi_operand_obj      *sys_handler;       /* Handler for system notifies */
-       union acpi_operand_obj      *drv_handler;       /* Handler for driver notifies */
-       union acpi_operand_obj      *addr_handler;      /* Handler for Address space */
-
-} ACPI_OBJECT_THERMAL_ZONE;
-
-
-/*
- * Internal types
- */
-
-
-typedef struct /* FIELD */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       ACPI_COMMON_FIELD_INFO
-
-       union acpi_operand_obj      *container;         /* Containing object */
-
-} ACPI_OBJECT_FIELD;
-
-
-typedef struct /* BANK FIELD */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       ACPI_COMMON_FIELD_INFO
-       u32                         value;              /* Value to store into Bank_select */
-
-       ACPI_HANDLE                 bank_select;        /* Bank select register */
-       union acpi_operand_obj      *container;         /* Containing object */
-
-} ACPI_OBJECT_BANK_FIELD;
-
-
-typedef struct /* INDEX FIELD */
-{
-       /*
-        * No container pointer needed since the index and data register definitions
-        * will define how to access the respective registers
-        */
-       ACPI_OBJECT_COMMON_HEADER
-
-       ACPI_COMMON_FIELD_INFO
-       u32                         value;              /* Value to store into Index register */
-
-       ACPI_HANDLE                 index;              /* Index register */
-       ACPI_HANDLE                 data;               /* Data register */
-
-} ACPI_OBJECT_INDEX_FIELD;
-
-
-typedef struct /* NOTIFY HANDLER */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       ACPI_NAMESPACE_NODE         *node;               /* Parent device */
-       NOTIFY_HANDLER              handler;
-       void                        *context;
-
-} ACPI_OBJECT_NOTIFY_HANDLER;
-
-
-/* Flags for address handler */
-
-#define ADDR_HANDLER_DEFAULT_INSTALLED  0x1
-
-
-typedef struct /* ADDRESS HANDLER */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       u8                          space_id;
-       u16                         hflags;
-       ADDRESS_SPACE_HANDLER       handler;
-
-       ACPI_NAMESPACE_NODE         *node;              /* Parent device */
-       void                        *context;
-       ADDRESS_SPACE_SETUP         setup;
-       union acpi_operand_obj      *region_list;       /* regions using this handler */
-       union acpi_operand_obj      *next;
-
-} ACPI_OBJECT_ADDR_HANDLER;
-
-
-/*
- * The Reference object type is used for these opcodes:
- * Arg[0-6], Local[0-7], Index_op, Name_op, Zero_op, One_op, Ones_op, Debug_op
- */
-
-typedef struct /* Reference - Local object type */
-{
-       ACPI_OBJECT_COMMON_HEADER
-
-       u8                          target_type;        /* Used for Index_op */
-       u16                         opcode;
-       u32                         offset;             /* Used for Arg_op, Local_op, and Index_op */
-
-       void                        *object;            /* Name_op=>HANDLE to obj, Index_op=>ACPI_OPERAND_OBJECT */
-       ACPI_NAMESPACE_NODE         *node;
-       union acpi_operand_obj      **where;
-
-} ACPI_OBJECT_REFERENCE;
-
-
-/*
- * Extra object is used as additional storage for types that
- * have AML code in their declarations (Term_args) that must be
- * evaluated at run time.
- *
- * Currently: Region and Field_unit types
- */
-
-typedef struct /* EXTRA */
-{
-       ACPI_OBJECT_COMMON_HEADER
-       u8                          byte_fill1;
-       u16                         word_fill1;
-       u32                         pcode_length;
-       u8                          *pcode;
-       ACPI_NAMESPACE_NODE         *method_REG;        /* _REG method for this region (if any) */
-       void                        *region_context;    /* Region-specific data */
-
-} ACPI_OBJECT_EXTRA;
-
-
-/******************************************************************************
- *
- * ACPI_OPERAND_OBJECT  Descriptor - a giant union of all of the above
- *
- *****************************************************************************/
-
-typedef union acpi_operand_obj
-{
-       ACPI_OBJECT_COMMON          common;
-       ACPI_OBJECT_CACHE_LIST      cache;
-       ACPI_OBJECT_INTEGER         integer;
-       ACPI_OBJECT_STRING          string;
-       ACPI_OBJECT_BUFFER          buffer;
-       ACPI_OBJECT_PACKAGE         package;
-       ACPI_OBJECT_FIELD_UNIT      field_unit;
-       ACPI_OBJECT_DEVICE          device;
-       ACPI_OBJECT_EVENT           event;
-       ACPI_OBJECT_METHOD          method;
-       ACPI_OBJECT_MUTEX           mutex;
-       ACPI_OBJECT_REGION          region;
-       ACPI_OBJECT_POWER_RESOURCE  power_resource;
-       ACPI_OBJECT_PROCESSOR       processor;
-       ACPI_OBJECT_THERMAL_ZONE    thermal_zone;
-       ACPI_OBJECT_FIELD           field;
-       ACPI_OBJECT_BANK_FIELD      bank_field;
-       ACPI_OBJECT_INDEX_FIELD     index_field;
-       ACPI_OBJECT_REFERENCE       reference;
-       ACPI_OBJECT_NOTIFY_HANDLER  notify_handler;
-       ACPI_OBJECT_ADDR_HANDLER    addr_handler;
-       ACPI_OBJECT_EXTRA           extra;
-
-} ACPI_OPERAND_OBJECT;
-
-#endif /* _ACOBJECT_H */
diff --git a/reactos/drivers/bus/acpi/include/acoutput.h b/reactos/drivers/bus/acpi/include/acoutput.h
deleted file mode 100644 (file)
index 82d137b..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/******************************************************************************
- *
- * Name: acoutput.h -- debug output
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACOUTPUT_H__
-#define __ACOUTPUT_H__
-
-/*
- * Debug levels and component IDs.  These are used to control the
- * granularity of the output of the DEBUG_PRINT macro -- on a per-
- * component basis and a per-exception-type basis.
- */
-
-/* Component IDs -- used in the global "Debug_layer" */
-
-#define ACPI_UTILITIES              0x00000001
-#define ACPI_HARDWARE               0x00000002
-#define ACPI_EVENTS                 0x00000003
-#define ACPI_TABLES                 0x00000008
-#define ACPI_NAMESPACE              0x00000010
-#define ACPI_PARSER                 0x00000020
-#define ACPI_DISPATCHER             0x00000040
-#define ACPI_EXECUTER               0x00000080
-#define ACPI_RESOURCES              0x00000100
-#define ACPI_DEVICES                0x00000200
-#define ACPI_POWER                  0x00000400
-
-
-#define ACPI_BUS_MANAGER            0x00001000
-#define ACPI_POWER_CONTROL          0x00002000
-#define ACPI_EMBEDDED_CONTROLLER    0x00004000
-#define ACPI_PROCESSOR_CONTROL      0x00008000
-#define ACPI_AC_ADAPTER             0x00010000
-#define ACPI_BATTERY                0x00020000
-#define ACPI_BUTTON                 0x00040000
-#define ACPI_SYSTEM                 0x00080000
-#define ACPI_THERMAL_ZONE           0x00100000
-
-#define ACPI_DEBUGGER               0x01000000
-#define ACPI_OS_SERVICES            0x02000000
-#define ACPI_ALL_COMPONENTS         0x01FFFFFF
-
-#define ACPI_COMPONENT_DEFAULT      (ACPI_ALL_COMPONENTS)
-
-
-#define ACPI_COMPILER               0x10000000
-#define ACPI_TOOLS                  0x20000000
-
-
-/* Exception level -- used in the global "Debug_level" */
-
-#define ACPI_OK                     0x00000001
-#define ACPI_INFO                   0x00000002
-#define ACPI_WARN                   0x00000004
-#define ACPI_ERROR                  0x00000008
-#define ACPI_FATAL                  0x00000010
-#define ACPI_DEBUG_OBJECT           0x00000020
-#define ACPI_ALL                    0x0000003F
-
-
-/* Trace level -- also used in the global "Debug_level" */
-
-#define TRACE_PARSE                 0x00000100
-#define TRACE_DISPATCH              0x00000200
-#define TRACE_LOAD                  0x00000400
-#define TRACE_EXEC                  0x00000800
-#define TRACE_NAMES                 0x00001000
-#define TRACE_OPREGION              0x00002000
-#define TRACE_BFIELD                0x00004000
-#define TRACE_TRASH                 0x00008000
-#define TRACE_TABLES                0x00010000
-#define TRACE_FUNCTIONS             0x00020000
-#define TRACE_VALUES                0x00040000
-#define TRACE_OBJECTS               0x00080000
-#define TRACE_ALLOCATIONS           0x00100000
-#define TRACE_RESOURCES             0x00200000
-#define TRACE_IO                    0x00400000
-#define TRACE_INTERRUPTS            0x00800000
-#define TRACE_USER_REQUESTS         0x01000000
-#define TRACE_PACKAGE               0x02000000
-#define TRACE_MUTEX                 0x04000000
-#define TRACE_INIT                  0x08000000
-
-#define TRACE_ALL                   0x0FFFFF00
-
-
-/* Exceptionally verbose output -- also used in the global "Debug_level" */
-
-#define VERBOSE_AML_DISASSEMBLE     0x10000000
-#define VERBOSE_INFO                0x20000000
-#define VERBOSE_TABLES              0x40000000
-#define VERBOSE_EVENTS              0x80000000
-
-#define VERBOSE_ALL                 0xF0000000
-
-
-/* Defaults for Debug_level, debug and normal */
-
-#define DEBUG_DEFAULT               (ACPI_OK | ACPI_WARN | ACPI_ERROR | ACPI_DEBUG_OBJECT)
-#define NORMAL_DEFAULT              (ACPI_OK | ACPI_WARN | ACPI_ERROR | ACPI_DEBUG_OBJECT)
-#define DEBUG_ALL                   (VERBOSE_AML_DISASSEMBLE | TRACE_ALL | ACPI_ALL)
-
-/* Misc defines */
-
-#define HEX                         0x01
-#define ASCII                       0x02
-#define FULL_ADDRESS                0x04
-#define CHARS_PER_LINE              16          /* used in Dump_buf function */
-
-
-#endif /* __ACOUTPUT_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acparser.h b/reactos/drivers/bus/acpi/include/acparser.h
deleted file mode 100644 (file)
index 83a6c67..0000000
+++ /dev/null
@@ -1,346 +0,0 @@
-/******************************************************************************
- *
- * Module Name: acparser.h - AML Parser subcomponent prototypes and defines
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#ifndef __ACPARSER_H__
-#define __ACPARSER_H__
-
-
-#define OP_HAS_RETURN_VALUE         1
-
-/* variable # arguments */
-
-#define ACPI_VAR_ARGS               ACPI_UINT32_MAX
-
-/* maximum virtual address */
-
-#define ACPI_MAX_AML                ((u8 *)(~0UL))
-
-
-#define ACPI_PARSE_DELETE_TREE          0x0001
-#define ACPI_PARSE_NO_TREE_DELETE       0x0000
-#define ACPI_PARSE_TREE_MASK            0x0001
-
-#define ACPI_PARSE_LOAD_PASS1           0x0010
-#define ACPI_PARSE_LOAD_PASS2           0x0020
-#define ACPI_PARSE_EXECUTE              0x0030
-#define ACPI_PARSE_MODE_MASK            0x0030
-
-/* psapi - Parser external interfaces */
-
-ACPI_STATUS
-acpi_psx_load_table (
-       u8                      *pcode_addr,
-       u32                     pcode_length);
-
-ACPI_STATUS
-acpi_psx_execute (
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_obj_desc);
-
-
-u8
-acpi_ps_is_namespace_object_op (
-       u16                     opcode);
-u8
-acpi_ps_is_namespace_op (
-       u16                     opcode);
-
-
-/******************************************************************************
- *
- * Parser interfaces
- *
- *****************************************************************************/
-
-
-/* psargs - Parse AML opcode arguments */
-
-u8 *
-acpi_ps_get_next_package_end (
-       ACPI_PARSE_STATE        *parser_state);
-
-u32
-acpi_ps_get_next_package_length (
-       ACPI_PARSE_STATE        *parser_state);
-
-NATIVE_CHAR *
-acpi_ps_get_next_namestring (
-       ACPI_PARSE_STATE        *parser_state);
-
-void
-acpi_ps_get_next_simple_arg (
-       ACPI_PARSE_STATE        *parser_state,
-       u32                     arg_type,       /* type of argument */
-       ACPI_PARSE_OBJECT       *arg);           /* (OUT) argument data */
-
-void
-acpi_ps_get_next_namepath (
-       ACPI_PARSE_STATE        *parser_state,
-       ACPI_PARSE_OBJECT       *arg,
-       u32                     *arg_count,
-       u8                      method_call);
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_next_field (
-       ACPI_PARSE_STATE        *parser_state);
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_next_arg (
-       ACPI_PARSE_STATE        *parser_state,
-       u32                     arg_type,
-       u32                     *arg_count);
-
-
-/* psopcode - AML Opcode information */
-
-ACPI_OPCODE_INFO *
-acpi_ps_get_opcode_info (
-       u16                     opcode);
-
-NATIVE_CHAR *
-acpi_ps_get_opcode_name (
-       u16                     opcode);
-
-
-/* psparse - top level parsing routines */
-
-ACPI_STATUS
-acpi_ps_find_object (
-       u16                     opcode,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       **out_op);
-
-void
-acpi_ps_delete_parse_tree (
-       ACPI_PARSE_OBJECT       *root);
-
-ACPI_STATUS
-acpi_ps_parse_loop (
-       ACPI_WALK_STATE         *walk_state);
-
-ACPI_STATUS
-acpi_ps_parse_aml (
-       ACPI_PARSE_OBJECT       *start_scope,
-       u8                      *aml,
-       u32                     aml_size,
-       u32                     parse_flags,
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **caller_return_desc,
-       ACPI_PARSE_DOWNWARDS    descending_callback,
-       ACPI_PARSE_UPWARDS      ascending_callback);
-
-ACPI_STATUS
-acpi_ps_parse_table (
-       u8                      *aml,
-       u32                     aml_size,
-       ACPI_PARSE_DOWNWARDS    descending_callback,
-       ACPI_PARSE_UPWARDS      ascending_callback,
-       ACPI_PARSE_OBJECT       **root_object);
-
-u16
-acpi_ps_peek_opcode (
-       ACPI_PARSE_STATE        *state);
-
-
-/* psscope - Scope stack management routines */
-
-
-ACPI_STATUS
-acpi_ps_init_scope (
-       ACPI_PARSE_STATE        *parser_state,
-       ACPI_PARSE_OBJECT       *root);
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_parent_scope (
-       ACPI_PARSE_STATE        *state);
-
-u8
-acpi_ps_has_completed_scope (
-       ACPI_PARSE_STATE        *parser_state);
-
-void
-acpi_ps_pop_scope (
-       ACPI_PARSE_STATE        *parser_state,
-       ACPI_PARSE_OBJECT       **op,
-       u32                     *arg_list,
-       u32                     *arg_count);
-
-ACPI_STATUS
-acpi_ps_push_scope (
-       ACPI_PARSE_STATE        *parser_state,
-       ACPI_PARSE_OBJECT       *op,
-       u32                     remaining_args,
-       u32                     arg_count);
-
-void
-acpi_ps_cleanup_scope (
-       ACPI_PARSE_STATE        *state);
-
-
-/* pstree - parse tree manipulation routines */
-
-void
-acpi_ps_append_arg(
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_PARSE_OBJECT       *arg);
-
-ACPI_PARSE_OBJECT*
-acpi_ps_find (
-       ACPI_PARSE_OBJECT       *scope,
-       NATIVE_CHAR             *path,
-       u16                     opcode,
-       u32                     create);
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_arg(
-       ACPI_PARSE_OBJECT       *op,
-       u32                      argn);
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_child (
-       ACPI_PARSE_OBJECT       *op);
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_depth_next (
-       ACPI_PARSE_OBJECT       *origin,
-       ACPI_PARSE_OBJECT       *op);
-
-
-/* pswalk - parse tree walk routines */
-
-ACPI_STATUS
-acpi_ps_walk_parsed_aml (
-       ACPI_PARSE_OBJECT       *start_op,
-       ACPI_PARSE_OBJECT       *end_op,
-       ACPI_OPERAND_OBJECT     *mth_desc,
-       ACPI_NAMESPACE_NODE     *start_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **caller_return_desc,
-       ACPI_OWNER_ID           owner_id,
-       ACPI_PARSE_DOWNWARDS    descending_callback,
-       ACPI_PARSE_UPWARDS      ascending_callback);
-
-ACPI_STATUS
-acpi_ps_get_next_walk_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_PARSE_UPWARDS      ascending_callback);
-
-
-/* psutils - parser utilities */
-
-
-ACPI_PARSE_STATE *
-acpi_ps_create_state (
-       u8                      *aml,
-       u32                     aml_size);
-
-void
-acpi_ps_init_op (
-       ACPI_PARSE_OBJECT       *op,
-       u16                     opcode);
-
-ACPI_PARSE_OBJECT *
-acpi_ps_alloc_op (
-       u16                     opcode);
-
-void
-acpi_ps_free_op (
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_ps_delete_parse_cache (
-       void);
-
-u8
-acpi_ps_is_leading_char (
-       u32                     c);
-
-u8
-acpi_ps_is_prefix_char (
-       u32                     c);
-
-u8
-acpi_ps_is_named_op (
-       u16                     opcode);
-
-u8
-acpi_ps_is_node_op (
-       u16                     opcode);
-
-u8
-acpi_ps_is_deferred_op (
-       u16                     opcode);
-
-u8
-acpi_ps_is_bytelist_op(
-       u16                     opcode);
-
-u8
-acpi_ps_is_field_op(
-       u16                     opcode);
-
-u8
-acpi_ps_is_create_field_op (
-       u16                     opcode);
-
-ACPI_PARSE2_OBJECT*
-acpi_ps_to_extended_op(
-       ACPI_PARSE_OBJECT       *op);
-
-u32
-acpi_ps_get_name(
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_ps_set_name(
-       ACPI_PARSE_OBJECT       *op,
-       u32                     name);
-
-
-/* psdump - display parser tree */
-
-u32
-acpi_ps_sprint_path (
-       NATIVE_CHAR             *buffer_start,
-       u32                     buffer_size,
-       ACPI_PARSE_OBJECT       *op);
-
-u32
-acpi_ps_sprint_op (
-       NATIVE_CHAR             *buffer_start,
-       u32                     buffer_size,
-       ACPI_PARSE_OBJECT       *op);
-
-void
-acpi_ps_show (
-       ACPI_PARSE_OBJECT       *op);
-
-
-#endif /* __ACPARSER_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acpi.h b/reactos/drivers/bus/acpi/include/acpi.h
deleted file mode 100644 (file)
index c1226f8..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/******************************************************************************
- *
- * Name: acpi.h - Master include file, Publics and external data.
- *       $Revision: 1.2 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACPI_H__
-#define __ACPI_H__
-
-#include "platform/types.h"
-#undef ROUND_DOWN
-#undef ROUND_UP
-#define DEFINE_ACPI_GLOBALS
-
-/*
- * Common includes for all ACPI driver files
- * We put them here because we don't want to duplicate them
- * in the rest of the source code again and again.
- */
-#include "acconfig.h"           /* Configuration constants */
-#include "platform/acenv.h"     /* Target environment specific items */
-#include "actypes.h"            /* Fundamental common data types */
-#include "acexcep.h"            /* ACPI exception codes */
-#include "acmacros.h"           /* C macros */
-#include "actbl.h"              /* ACPI table definitions */
-#include "aclocal.h"            /* Internal data types */
-#include "acoutput.h"           /* Error output and Debug macros */
-#include "acpiosxf.h"           /* Interfaces to the ACPI-to-OS layer*/
-#include "acpixf.h"             /* ACPI core subsystem external interfaces */
-#include "acobject.h"           /* ACPI internal object */
-#include "acstruct.h"           /* Common structures */
-#include "acglobal.h"           /* All global variables */
-#include "achware.h"            /* Hardware defines and interfaces */
-#include "accommon.h"           /* Common interfaces */
-#include "acresrc.h"            /* Resource Manager function prototypes */
-#include "acparser.h"
-#include "acinterp.h"
-#include "amlcode.h"
-#include "acnamesp.h"
-#include "acevents.h"
-#include "actables.h"
-#include "acdispat.h"
-#include <ntddk.h>
-#include <ndk/haltypes.h>
-#include <bm.h>
-#include <bn.h>
-#include <bmpower.h>
-#include <acpisys.h>
-#include <acglobal.h>
-
-#endif /* __ACPI_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acpiosxf.h b/reactos/drivers/bus/acpi/include/acpiosxf.h
deleted file mode 100644 (file)
index f65e038..0000000
+++ /dev/null
@@ -1,341 +0,0 @@
-
-/******************************************************************************
- *
- * Name: acpiosxf.h - All interfaces to the OS Services Layer (OSL).  These
- *                    interfaces must be implemented by OSL to interface the
- *                    ACPI components to the host operating system.
- *
- *****************************************************************************/
-
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACPIOSXF_H__
-#define __ACPIOSXF_H__
-
-#include "platform/acenv.h"
-#include "actypes.h"
-
-
-/* Priorities for Acpi_os_queue_for_execution */
-
-#define OSD_PRIORITY_GPE            1
-#define OSD_PRIORITY_HIGH           2
-#define OSD_PRIORITY_MED            3
-#define OSD_PRIORITY_LO             4
-
-#define ACPI_NO_UNIT_LIMIT          ((u32) -1)
-#define ACPI_MUTEX_SEM              1
-
-
-/*
- * Types specific to the OS service interfaces
- */
-
-typedef
-u32 (*OSD_HANDLER) (
-       void                    *context);
-
-typedef
-void (*OSD_EXECUTION_CALLBACK) (
-       void                    *context);
-
-
-/*
- * OSL Initialization and shutdown primitives
- */
-
-ACPI_STATUS
-acpi_os_initialize (
-       void);
-
-ACPI_STATUS
-acpi_os_terminate (
-       void);
-
-
-/*
- * Synchronization primitives
- */
-
-ACPI_STATUS
-acpi_os_create_semaphore (
-       u32                     max_units,
-       u32                     initial_units,
-       ACPI_HANDLE             *out_handle);
-
-ACPI_STATUS
-acpi_os_delete_semaphore (
-       ACPI_HANDLE             handle);
-
-ACPI_STATUS
-acpi_os_wait_semaphore (
-       ACPI_HANDLE             handle,
-       u32                     units,
-       u32                     timeout);
-
-ACPI_STATUS
-acpi_os_signal_semaphore (
-       ACPI_HANDLE             handle,
-       u32                     units);
-
-
-/*
- * Memory allocation and mapping
- */
-
-void *
-acpi_os_allocate (
-       u32                     size);
-
-void *
-acpi_os_callocate (
-       u32                     size);
-
-void
-acpi_os_free (
-       void *                  memory);
-
-ACPI_STATUS
-acpi_os_map_memory (
-       ACPI_PHYSICAL_ADDRESS   physical_address,
-       u32                     length,
-       void                    **logical_address);
-
-void
-acpi_os_unmap_memory (
-       void                    *logical_address,
-       u32                     length);
-
-ACPI_STATUS
-acpi_os_get_physical_address (
-       void                    *logical_address,
-       ACPI_PHYSICAL_ADDRESS   *physical_address);
-
-
-/*
- * Interrupt handlers
- */
-
-ACPI_STATUS
-acpi_os_install_interrupt_handler (
-       u32                     interrupt_number,
-       OSD_HANDLER             service_routine,
-       void                    *context);
-
-ACPI_STATUS
-acpi_os_remove_interrupt_handler (
-       u32                     interrupt_number,
-       OSD_HANDLER             service_routine);
-
-
-/*
- * Threads and Scheduling
- */
-
-u32
-acpi_os_get_thread_id (
-       void);
-
-ACPI_STATUS
-acpi_os_queue_for_execution (
-       u32                     priority,
-       OSD_EXECUTION_CALLBACK  function,
-       void                    *context);
-
-void
-acpi_os_sleep (
-       u32                     seconds,
-       u32                     milliseconds);
-
-void
-acpi_os_sleep_usec (
-       u32                     microseconds);
-
-
-/*
- * Platform/Hardware independent I/O interfaces
- */
-
-u8
-acpi_os_in8 (
-       ACPI_IO_ADDRESS         in_port);
-
-
-u16
-acpi_os_in16 (
-       ACPI_IO_ADDRESS         in_port);
-
-u32
-acpi_os_in32 (
-       ACPI_IO_ADDRESS         in_port);
-
-void
-acpi_os_out8 (
-       ACPI_IO_ADDRESS         out_port,
-       u8                      value);
-
-void
-acpi_os_out16 (
-       ACPI_IO_ADDRESS         out_port,
-       u16                     value);
-
-void
-acpi_os_out32 (
-       ACPI_IO_ADDRESS         out_port,
-       u32                     value);
-
-
-/*
- * Platform/Hardware independent physical memory interfaces
- */
-
-u8
-acpi_os_mem_in8 (
-       ACPI_PHYSICAL_ADDRESS   in_addr);
-
-u16
-acpi_os_mem_in16 (
-       ACPI_PHYSICAL_ADDRESS   in_addr);
-
-u32
-acpi_os_mem_in32 (
-       ACPI_PHYSICAL_ADDRESS   in_addr);
-
-void
-acpi_os_mem_out8 (
-       ACPI_PHYSICAL_ADDRESS   out_addr,
-       u8                      value);
-
-void
-acpi_os_mem_out16 (
-       ACPI_PHYSICAL_ADDRESS   out_addr,
-       u16                     value);
-
-void
-acpi_os_mem_out32 (
-       ACPI_PHYSICAL_ADDRESS   out_addr,
-       u32                     value);
-
-
-/*
- * Standard access to PCI configuration space
- */
-
-ACPI_STATUS
-acpi_os_read_pci_cfg_byte (
-       u32                     bus,
-       u32                     device_function,
-       u32                     register,
-       u8                      *value);
-
-ACPI_STATUS
-acpi_os_read_pci_cfg_word (
-       u32                     bus,
-       u32                     device_function,
-       u32                     register,
-       u16                     *value);
-
-ACPI_STATUS
-acpi_os_read_pci_cfg_dword (
-       u32                     bus,
-       u32                     device_function,
-       u32                     register,
-       u32                     *value);
-
-ACPI_STATUS
-acpi_os_write_pci_cfg_byte (
-       u32                     bus,
-       u32                     device_function,
-       u32                     register,
-       u8                      value);
-
-ACPI_STATUS
-acpi_os_write_pci_cfg_word (
-       u32                     bus,
-       u32                     device_function,
-       u32                     register,
-       u16                     value);
-
-
-ACPI_STATUS
-acpi_os_write_pci_cfg_dword (
-       u32                     bus,
-       u32                     device_function,
-       u32                     register,
-       u32                     value);
-
-
-/*
- * Miscellaneous
- */
-
-ACPI_STATUS
-acpi_os_breakpoint (
-       NATIVE_CHAR             *message);
-
-u8
-acpi_os_readable (
-       void                    *pointer,
-       u32                     length);
-
-
-u8
-acpi_os_writable (
-       void                    *pointer,
-       u32                     length);
-
-
-/*
- * Debug print routines
- */
-
-s32
-acpi_os_printf (
-       const NATIVE_CHAR       *format,
-       ...);
-
-s32
-acpi_os_vprintf (
-       const NATIVE_CHAR       *format,
-       va_list                 args);
-
-
-/*
- * Debug input
- */
-
-u32
-acpi_os_get_line (
-       NATIVE_CHAR             *buffer);
-
-
-/*
- * Debug
- */
-
-void
-acpi_os_dbg_assert(
-       void                    *failed_assertion,
-       void                    *file_name,
-       u32                     line_number,
-       NATIVE_CHAR             *message);
-
-
-#endif /* __ACPIOSXF_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acpixf.h b/reactos/drivers/bus/acpi/include/acpixf.h
deleted file mode 100644 (file)
index ef4b1dc..0000000
+++ /dev/null
@@ -1,340 +0,0 @@
-
-/******************************************************************************
- *
- * Name: acpixf.h - External interfaces to the ACPI subsystem
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#ifndef __ACXFACE_H__
-#define __ACXFACE_H__
-
-#include "actypes.h"
-#include "actbl.h"
-
-
-/*
- * Global interfaces
- */
-
-ACPI_STATUS
-acpi_initialize_subsystem (
-       void);
-
-ACPI_STATUS
-acpi_enable_subsystem (
-       u32                     flags);
-
-ACPI_STATUS
-acpi_terminate (
-       void);
-
-ACPI_STATUS
-acpi_enable (
-       void);
-
-ACPI_STATUS
-acpi_disable (
-       void);
-
-ACPI_STATUS
-acpi_get_system_info(
-       ACPI_BUFFER             *ret_buffer);
-
-ACPI_STATUS
-acpi_format_exception (
-       ACPI_STATUS             exception,
-       ACPI_BUFFER             *out_buffer);
-
-
-/*
- * ACPI Memory manager
- */
-
-void *
-acpi_allocate (
-       u32                     size);
-
-void *
-acpi_callocate (
-       u32                     size);
-
-void
-acpi_free (
-       void                    *address);
-
-
-/*
- * ACPI table manipulation interfaces
- */
-
-ACPI_STATUS
-acpi_find_root_pointer (
-       ACPI_PHYSICAL_ADDRESS   *rsdp_physical_address);
-
-ACPI_STATUS
-acpi_load_tables (
-       ACPI_PHYSICAL_ADDRESS   rsdp_physical_address);
-
-ACPI_STATUS
-acpi_load_table (
-       ACPI_TABLE_HEADER       *table_ptr);
-
-ACPI_STATUS
-acpi_unload_table (
-       ACPI_TABLE_TYPE         table_type);
-
-ACPI_STATUS
-acpi_get_table_header (
-       ACPI_TABLE_TYPE         table_type,
-       u32                     instance,
-       ACPI_TABLE_HEADER       *out_table_header);
-
-ACPI_STATUS
-acpi_get_table (
-       ACPI_TABLE_TYPE         table_type,
-       u32                     instance,
-       ACPI_BUFFER             *ret_buffer);
-
-
-/*
- * Namespace and name interfaces
- */
-
-ACPI_STATUS
-acpi_walk_namespace (
-       ACPI_OBJECT_TYPE        type,
-       ACPI_HANDLE             start_object,
-       u32                     max_depth,
-       WALK_CALLBACK           user_function,
-       void                    *context,
-       void *                  *return_value);
-
-ACPI_STATUS
-acpi_get_devices (
-       NATIVE_CHAR             *HID,
-       WALK_CALLBACK           user_function,
-       void                    *context,
-       void                    **return_value);
-
-ACPI_STATUS
-acpi_get_name (
-       ACPI_HANDLE             handle,
-       u32                     name_type,
-       ACPI_BUFFER             *ret_path_ptr);
-
-ACPI_STATUS
-acpi_get_handle (
-       ACPI_HANDLE             parent,
-       ACPI_STRING             pathname,
-       ACPI_HANDLE             *ret_handle);
-
-
-/*
- * Object manipulation and enumeration
- */
-
-ACPI_STATUS
-acpi_evaluate_object (
-       ACPI_HANDLE             object,
-       ACPI_STRING             pathname,
-       ACPI_OBJECT_LIST        *parameter_objects,
-       ACPI_BUFFER             *return_object_buffer);
-
-ACPI_STATUS
-acpi_get_object_info (
-       ACPI_HANDLE             device,
-       ACPI_DEVICE_INFO        *info);
-
-ACPI_STATUS
-acpi_get_next_object (
-       ACPI_OBJECT_TYPE        type,
-       ACPI_HANDLE             parent,
-       ACPI_HANDLE             child,
-       ACPI_HANDLE             *out_handle);
-
-ACPI_STATUS
-acpi_get_type (
-       ACPI_HANDLE             object,
-       ACPI_OBJECT_TYPE        *out_type);
-
-ACPI_STATUS
-acpi_get_parent (
-       ACPI_HANDLE             object,
-       ACPI_HANDLE             *out_handle);
-
-
-/*
- * Event handler interfaces
- */
-
-ACPI_STATUS
-acpi_install_fixed_event_handler (
-       u32                     acpi_event,
-       FIXED_EVENT_HANDLER     handler,
-       void                    *context);
-
-ACPI_STATUS
-acpi_remove_fixed_event_handler (
-       u32                     acpi_event,
-       FIXED_EVENT_HANDLER     handler);
-
-ACPI_STATUS
-acpi_install_notify_handler (
-       ACPI_HANDLE             device,
-       u32                     handler_type,
-       NOTIFY_HANDLER          handler,
-       void                    *context);
-
-ACPI_STATUS
-acpi_remove_notify_handler (
-       ACPI_HANDLE             device,
-       u32                     handler_type,
-       NOTIFY_HANDLER          handler);
-
-ACPI_STATUS
-acpi_install_address_space_handler (
-       ACPI_HANDLE             device,
-       ACPI_ADDRESS_SPACE_TYPE space_id,
-       ADDRESS_SPACE_HANDLER   handler,
-       ADDRESS_SPACE_SETUP     setup,
-       void                    *context);
-
-ACPI_STATUS
-acpi_remove_address_space_handler (
-       ACPI_HANDLE             device,
-       ACPI_ADDRESS_SPACE_TYPE space_id,
-       ADDRESS_SPACE_HANDLER   handler);
-
-ACPI_STATUS
-acpi_install_gpe_handler (
-       u32                     gpe_number,
-       u32                     type,
-       GPE_HANDLER             handler,
-       void                    *context);
-
-ACPI_STATUS
-acpi_acquire_global_lock (
-       void);
-
-ACPI_STATUS
-acpi_release_global_lock (
-       void);
-
-ACPI_STATUS
-acpi_remove_gpe_handler (
-       u32                     gpe_number,
-       GPE_HANDLER             handler);
-
-ACPI_STATUS
-acpi_enable_event (
-       u32                     acpi_event,
-       u32                     type);
-
-ACPI_STATUS
-acpi_disable_event (
-       u32                     acpi_event,
-       u32                     type);
-
-ACPI_STATUS
-acpi_clear_event (
-       u32                     acpi_event,
-       u32                     type);
-
-ACPI_STATUS
-acpi_get_event_status (
-       u32                     acpi_event,
-       u32                     type,
-       ACPI_EVENT_STATUS       *event_status);
-
-/*
- * Resource interfaces
- */
-
-ACPI_STATUS
-acpi_get_current_resources(
-       ACPI_HANDLE             device_handle,
-       ACPI_BUFFER             *ret_buffer);
-
-ACPI_STATUS
-acpi_get_possible_resources(
-       ACPI_HANDLE             device_handle,
-       ACPI_BUFFER             *ret_buffer);
-
-ACPI_STATUS
-acpi_set_current_resources (
-       ACPI_HANDLE             device_handle,
-       ACPI_BUFFER             *in_buffer);
-
-ACPI_STATUS
-acpi_get_irq_routing_table (
-       ACPI_HANDLE             bus_device_handle,
-       ACPI_BUFFER             *ret_buffer);
-
-
-/*
- * Hardware (ACPI device) interfaces
- */
-
-ACPI_STATUS
-acpi_set_firmware_waking_vector (
-       ACPI_PHYSICAL_ADDRESS   physical_address);
-
-ACPI_STATUS
-acpi_get_firmware_waking_vector (
-       ACPI_PHYSICAL_ADDRESS   *physical_address);
-
-ACPI_STATUS
-acpi_enter_sleep_state (
-       u8 sleep_state);
-
-ACPI_STATUS
-acpi_get_processor_throttling_info (
-       ACPI_HANDLE             processor_handle,
-       ACPI_BUFFER             *user_buffer);
-
-ACPI_STATUS
-acpi_set_processor_throttling_state (
-       ACPI_HANDLE             processor_handle,
-       u32                     throttle_state);
-
-ACPI_STATUS
-acpi_get_processor_throttling_state (
-       ACPI_HANDLE             processor_handle,
-       u32                     *throttle_state);
-
-ACPI_STATUS
-acpi_get_processor_cx_info (
-       ACPI_HANDLE             processor_handle,
-       ACPI_BUFFER             *user_buffer);
-
-ACPI_STATUS
-acpi_set_processor_sleep_state (
-       ACPI_HANDLE             processor_handle,
-       u32                     cx_state);
-
-ACPI_STATUS
-acpi_processor_sleep (
-       ACPI_HANDLE             processor_handle,
-       u32                     *pm_timer_ticks);
-
-
-#endif /* __ACXFACE_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acresrc.h b/reactos/drivers/bus/acpi/include/acresrc.h
deleted file mode 100644 (file)
index 239d1f9..0000000
+++ /dev/null
@@ -1,304 +0,0 @@
-/******************************************************************************
- *
- * Name: acresrc.h - Resource Manager function prototypes
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACRESRC_H__
-#define __ACRESRC_H__
-
-
-/*
- *  Function prototypes called from Acpi* APIs
- */
-
-ACPI_STATUS
-acpi_rs_get_prt_method_data (
-       ACPI_HANDLE             handle,
-       ACPI_BUFFER             *ret_buffer);
-
-
-ACPI_STATUS
-acpi_rs_get_crs_method_data (
-       ACPI_HANDLE             handle,
-       ACPI_BUFFER             *ret_buffer);
-
-ACPI_STATUS
-acpi_rs_get_prs_method_data (
-       ACPI_HANDLE             handle,
-       ACPI_BUFFER             *ret_buffer);
-
-ACPI_STATUS
-acpi_rs_set_srs_method_data (
-       ACPI_HANDLE             handle,
-       ACPI_BUFFER             *ret_buffer);
-
-ACPI_STATUS
-acpi_rs_create_resource_list (
-       ACPI_OPERAND_OBJECT     *byte_stream_buffer,
-       u8                      *output_buffer,
-       u32                     *output_buffer_length);
-
-ACPI_STATUS
-acpi_rs_create_byte_stream (
-       RESOURCE                *linked_list_buffer,
-       u8                      *output_buffer,
-       u32                     *output_buffer_length);
-
-ACPI_STATUS
-acpi_rs_create_pci_routing_table (
-       ACPI_OPERAND_OBJECT     *method_return_object,
-       u8                      *output_buffer,
-       u32                     *output_buffer_length);
-
-
-/*
- *Function prototypes called from Acpi_rs_create*APIs
- */
-
-void
-acpi_rs_dump_resource_list (
-       RESOURCE                *resource);
-
-void
-acpi_rs_dump_irq_list (
-       u8                      *route_table);
-
-ACPI_STATUS
-acpi_rs_get_byte_stream_start (
-       u8                      *byte_stream_buffer,
-       u8                      **byte_stream_start,
-       u32                     *size);
-
-ACPI_STATUS
-acpi_rs_calculate_list_length (
-       u8                      *byte_stream_buffer,
-       u32                     byte_stream_buffer_length,
-       u32                     *size_needed);
-
-ACPI_STATUS
-acpi_rs_calculate_byte_stream_length (
-       RESOURCE                *linked_list_buffer,
-       u32                     *size_needed);
-
-ACPI_STATUS
-acpi_rs_calculate_pci_routing_table_length (
-       ACPI_OPERAND_OBJECT     *package_object,
-       u32                     *buffer_size_needed);
-
-ACPI_STATUS
-acpi_rs_byte_stream_to_list (
-       u8                      *byte_stream_buffer,
-       u32                     byte_stream_buffer_length,
-       u8                      **output_buffer);
-
-ACPI_STATUS
-acpi_rs_list_to_byte_stream (
-       RESOURCE                *linked_list,
-       u32                     byte_stream_size_needed,
-       u8                      **output_buffer);
-
-ACPI_STATUS
-acpi_rs_io_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_fixed_io_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_io_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_fixed_io_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_irq_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_irq_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_dma_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_dma_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_address16_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_address16_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_address32_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_address32_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_start_dependent_functions_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_end_dependent_functions_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_start_dependent_functions_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_end_dependent_functions_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_memory24_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_memory24_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_memory32_range_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size
-);
-
-ACPI_STATUS
-acpi_rs_fixed_memory32_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_memory32_range_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_fixed_memory32_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_extended_irq_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_extended_irq_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_end_tag_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_end_tag_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-ACPI_STATUS
-acpi_rs_vendor_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size);
-
-ACPI_STATUS
-acpi_rs_vendor_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed);
-
-
-#endif  /* __ACRESRC_H__ */
diff --git a/reactos/drivers/bus/acpi/include/acstruct.h b/reactos/drivers/bus/acpi/include/acstruct.h
deleted file mode 100644 (file)
index c8abf99..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/******************************************************************************
- *
- * Name: acstruct.h - Internal structs
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACSTRUCT_H__
-#define __ACSTRUCT_H__
-
-
-/*****************************************************************************
- *
- * Tree walking typedefs and structs
- *
- ****************************************************************************/
-
-
-/*
- * Walk state - current state of a parse tree walk.  Used for both a leisurely stroll through
- * the tree (for whatever reason), and for control method execution.
- */
-
-#define NEXT_OP_DOWNWARD    1
-#define NEXT_OP_UPWARD      2
-
-#define WALK_NON_METHOD     0
-#define WALK_METHOD         1
-#define WALK_METHOD_RESTART 2
-
-typedef struct acpi_walk_state
-{
-       u8                      data_type;                          /* To differentiate various internal objs */\
-       ACPI_OWNER_ID           owner_id;                           /* Owner of objects created during the walk */
-       u8                      last_predicate;                     /* Result of last predicate */
-       u8                      next_op_info;                       /* Info about Next_op */
-       u8                      num_operands;                       /* Stack pointer for Operands[] array */
-       u8                      current_result;                     /* */
-
-       struct acpi_walk_state  *next;                              /* Next Walk_state in list */
-       ACPI_PARSE_OBJECT       *origin;                            /* Start of walk [Obsolete] */
-
-/* TBD: Obsolete with removal of WALK procedure ? */
-       ACPI_PARSE_OBJECT       *prev_op;                           /* Last op that was processed */
-       ACPI_PARSE_OBJECT       *next_op;                           /* next op to be processed */
-
-
-       ACPI_GENERIC_STATE      *results;                           /* Stack of accumulated results */
-       ACPI_GENERIC_STATE      *control_state;                     /* List of control states (nested IFs) */
-       ACPI_GENERIC_STATE      *scope_info;                        /* Stack of nested scopes */
-       ACPI_PARSE_STATE        *parser_state;                      /* Current state of parser */
-       u8                      *aml_last_while;
-       ACPI_OPCODE_INFO        *op_info;                           /* Info on current opcode */
-       ACPI_PARSE_DOWNWARDS    descending_callback;
-       ACPI_PARSE_UPWARDS      ascending_callback;
-
-       union acpi_operand_obj  *return_desc;                       /* Return object, if any */
-       union acpi_operand_obj  *method_desc;                       /* Method descriptor if running a method */
-       struct acpi_node        *method_node;                       /* Method Node if running a method */
-       ACPI_PARSE_OBJECT       *method_call_op;                    /* Method_call Op if running a method */
-       struct acpi_node        *method_call_node;                  /* Called method Node*/
-       union acpi_operand_obj  *operands[OBJ_NUM_OPERANDS];        /* Operands passed to the interpreter */
-       struct acpi_node        arguments[MTH_NUM_ARGS];            /* Control method arguments */
-       struct acpi_node        local_variables[MTH_NUM_LOCALS];    /* Control method locals */
-       struct acpi_walk_list   *walk_list;
-       u32                     parse_flags;
-       u8                      walk_type;
-       u8                      return_used;
-       u16                     opcode;                             /* Current AML opcode */
-       u32                     prev_arg_types;
-       u16                     current_sync_level;                 /* Mutex Sync (nested acquire) level */
-
-       /* Debug support */
-
-       u32                     method_breakpoint;
-
-
-} ACPI_WALK_STATE;
-
-
-/*
- * Walk list - head of a tree of walk states.  Multiple walk states are created when there
- * are nested control methods executing.
- */
-typedef struct acpi_walk_list
-{
-
-       ACPI_WALK_STATE         *walk_state;
-       ACPI_OBJECT_MUTEX       acquired_mutex_list;               /* List of all currently acquired mutexes */
-
-} ACPI_WALK_LIST;
-
-
-/* Info used by Acpi_ps_init_objects */
-
-typedef struct acpi_init_walk_info
-{
-       u16                     method_count;
-       u16                     op_region_count;
-       u16                     field_count;
-       u16                     op_region_init;
-       u16                     field_init;
-       u16                     object_count;
-       ACPI_TABLE_DESC         *table_desc;
-
-} ACPI_INIT_WALK_INFO;
-
-
-/* Info used by TBD */
-
-typedef struct acpi_device_walk_info
-{
-       u16                     device_count;
-       u16                     num_STA;
-       u16                     num_INI;
-       ACPI_TABLE_DESC         *table_desc;
-
-} ACPI_DEVICE_WALK_INFO;
-
-
-/* TBD: [Restructure] Merge with struct above */
-
-typedef struct acpi_walk_info
-{
-       u32                     debug_level;
-       u32                     owner_id;
-
-} ACPI_WALK_INFO;
-
-typedef struct acpi_get_devices_info
-{
-       WALK_CALLBACK           user_function;
-       void                    *context;
-       NATIVE_CHAR             *hid;
-
-} ACPI_GET_DEVICES_INFO;
-
-
-#endif
diff --git a/reactos/drivers/bus/acpi/include/actables.h b/reactos/drivers/bus/acpi/include/actables.h
deleted file mode 100644 (file)
index c702084..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-/******************************************************************************
- *
- * Name: actables.h - ACPI table management
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACTABLES_H__
-#define __ACTABLES_H__
-
-
-/* Used in Acpi_tb_map_acpi_table for size parameter if table header is to be used */
-
-#define SIZE_IN_HEADER          0
-
-
-ACPI_STATUS
-acpi_tb_handle_to_object (
-       u16                     table_id,
-       ACPI_TABLE_DESC         **table_desc);
-
-/*
- * tbconvrt - Table conversion routines
- */
-
-ACPI_STATUS
-acpi_tb_convert_to_xsdt (
-       ACPI_TABLE_DESC         *table_info,
-       u32                     *number_of_tables);
-
-ACPI_STATUS
-acpi_tb_convert_table_fadt (
-       void);
-
-ACPI_STATUS
-acpi_tb_build_common_facs (
-       ACPI_TABLE_DESC         *table_info);
-
-
-/*
- * tbget - Table "get" routines
- */
-
-ACPI_STATUS
-acpi_tb_get_table_ptr (
-       ACPI_TABLE_TYPE         table_type,
-       u32                     instance,
-       ACPI_TABLE_HEADER       **table_ptr_loc);
-
-ACPI_STATUS
-acpi_tb_get_table (
-       ACPI_PHYSICAL_ADDRESS   physical_address,
-       ACPI_TABLE_HEADER       *buffer_ptr,
-       ACPI_TABLE_DESC         *table_info);
-
-ACPI_STATUS
-acpi_tb_verify_rsdp (
-       ACPI_PHYSICAL_ADDRESS   RSDP_physical_address);
-
-ACPI_STATUS
-acpi_tb_get_table_facs (
-       ACPI_TABLE_HEADER       *buffer_ptr,
-       ACPI_TABLE_DESC         *table_info);
-
-
-/*
- * tbgetall - Get all firmware ACPI tables
- */
-
-ACPI_STATUS
-acpi_tb_get_all_tables (
-       u32                     number_of_tables,
-       ACPI_TABLE_HEADER       *buffer_ptr);
-
-
-/*
- * tbinstall - Table installation
- */
-
-ACPI_STATUS
-acpi_tb_install_table (
-       ACPI_TABLE_HEADER       *table_ptr,
-       ACPI_TABLE_DESC         *table_info);
-
-ACPI_STATUS
-acpi_tb_recognize_table (
-       ACPI_TABLE_HEADER       *table_ptr,
-       ACPI_TABLE_DESC         *table_info);
-
-ACPI_STATUS
-acpi_tb_init_table_descriptor (
-       ACPI_TABLE_TYPE         table_type,
-       ACPI_TABLE_DESC         *table_info);
-
-
-/*
- * tbremove - Table removal and deletion
- */
-
-void
-acpi_tb_delete_acpi_tables (
-       void);
-
-void
-acpi_tb_delete_acpi_table (
-       ACPI_TABLE_TYPE         type);
-
-void
-acpi_tb_delete_single_table (
-       ACPI_TABLE_DESC         *table_desc);
-
-ACPI_TABLE_DESC *
-acpi_tb_uninstall_table (
-       ACPI_TABLE_DESC         *table_desc);
-
-void
-acpi_tb_free_acpi_tables_of_type (
-       ACPI_TABLE_DESC         *table_info);
-
-
-/*
- * tbrsd - RSDP, RSDT utilities
- */
-
-ACPI_STATUS
-acpi_tb_get_table_rsdt (
-       u32                     *number_of_tables);
-
-u8 *
-acpi_tb_scan_memory_for_rsdp (
-       u8                      *start_address,
-       u32                     length);
-
-ACPI_STATUS
-acpi_tb_find_rsdp (
-       ACPI_TABLE_DESC         *table_info);
-
-
-/*
- * tbutils - common table utilities
- */
-
-u8
-acpi_tb_system_table_pointer (
-       void                    *where);
-
-ACPI_STATUS
-acpi_tb_map_acpi_table (
-       ACPI_PHYSICAL_ADDRESS   physical_address,
-       u32                     *size,
-       void                    **logical_address);
-
-ACPI_STATUS
-acpi_tb_verify_table_checksum (
-       ACPI_TABLE_HEADER       *table_header);
-
-u8
-acpi_tb_checksum (
-       void                    *buffer,
-       u32                     length);
-
-ACPI_STATUS
-acpi_tb_validate_table_header (
-       ACPI_TABLE_HEADER       *table_header);
-
-
-#endif /* __ACTABLES_H__ */
diff --git a/reactos/drivers/bus/acpi/include/actbl.h b/reactos/drivers/bus/acpi/include/actbl.h
deleted file mode 100644 (file)
index 7472372..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-/******************************************************************************
- *
- * Name: actbl.h - Table data structures defined in ACPI specification
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACTBL_H__
-#define __ACTBL_H__
-
-
-/*
- *  Values for description table header signatures
- */
-
-#define RSDP_NAME               "RSDP"
-#define RSDP_SIG                "RSD PTR "  /* RSDT Pointer signature */
-#define APIC_SIG                "APIC"      /* Multiple APIC Description Table */
-#define DSDT_SIG                "DSDT"      /* Differentiated System Description Table */
-#define FADT_SIG                "FACP"      /* Fixed ACPI Description Table */
-#define FACS_SIG                "FACS"      /* Firmware ACPI Control Structure */
-#define PSDT_SIG                "PSDT"      /* Persistent System Description Table */
-#define RSDT_SIG                "RSDT"      /* Root System Description Table */
-#define XSDT_SIG                "XSDT"      /* Extended  System Description Table */
-#define SSDT_SIG                "SSDT"      /* Secondary System Description Table */
-#define SBST_SIG                "SBST"      /* Smart Battery Specification Table */
-#define SPIC_SIG                "SPIC"      /* iosapic table */
-#define BOOT_SIG                "BOOT"      /* Boot table */
-
-
-#define GL_OWNED                0x02        /* Ownership of global lock is bit 1 */
-
-/* values of Mapic.Model */
-
-#define DUAL_PIC                0
-#define MULTIPLE_APIC           1
-
-/* values of Type in APIC_HEADER */
-
-#define APIC_PROC               0
-#define APIC_IO                 1
-
-
-/*
- * Common table types.  The base code can remain
- * constant if the underlying tables are changed
- */
-#define RSDT_DESCRIPTOR         RSDT_DESCRIPTOR_REV2
-#define XSDT_DESCRIPTOR         XSDT_DESCRIPTOR_REV2
-#define FACS_DESCRIPTOR         FACS_DESCRIPTOR_REV2
-#define FADT_DESCRIPTOR         FADT_DESCRIPTOR_REV2
-
-
-#pragma pack(1)
-
-/*
- * Architecture-independent tables
- * The architecture dependent tables are in separate files
- */
-
-typedef struct  /* Root System Descriptor Pointer */
-{
-       NATIVE_CHAR             signature [8];          /* contains "RSD PTR " */
-       u8                      checksum;               /* to make sum of struct == 0 */
-       NATIVE_CHAR             oem_id [6];             /* OEM identification */
-       u8                      revision;               /* Must be 0 for 1.0, 2 for 2.0 */
-       u32                     rsdt_physical_address;  /* 32-bit physical address of RSDT */
-       u32                     length;                 /* XSDT Length in bytes including hdr */
-       UINT64                  xsdt_physical_address;  /* 64-bit physical address of XSDT */
-       u8                      extended_checksum;      /* Checksum of entire table */
-       NATIVE_CHAR             reserved [3];           /* reserved field must be 0 */
-
-} RSDP_DESCRIPTOR;
-
-
-typedef struct  /* ACPI common table header */
-{
-       NATIVE_CHAR             signature [4];          /* identifies type of table */
-       u32                     length;                 /* length of table, in bytes,
-                         * including header */
-       u8                      revision;               /* specification minor version # */
-       u8                      checksum;               /* to make sum of entire table == 0 */
-       NATIVE_CHAR             oem_id [6];             /* OEM identification */
-       NATIVE_CHAR             oem_table_id [8];       /* OEM table identification */
-       u32                     oem_revision;           /* OEM revision number */
-       NATIVE_CHAR             asl_compiler_id [4];    /* ASL compiler vendor ID */
-       u32                     asl_compiler_revision;  /* ASL compiler revision number */
-
-} ACPI_TABLE_HEADER;
-
-
-typedef struct  /* Common FACS for internal use */
-{
-       u32                     *global_lock;
-       UINT64                  *firmware_waking_vector;
-       u8                      vector_width;
-
-} ACPI_COMMON_FACS;
-
-
-typedef struct  /* APIC Table */
-{
-       ACPI_TABLE_HEADER       header;                 /* table header */
-       u32                     local_apic_address;     /* Physical address for accessing local APICs */
-       u32                     PCATcompat      : 1;    /* a one indicates system also has dual 8259s */
-       u32                     reserved1       : 31;
-
-} APIC_TABLE;
-
-
-typedef struct  /* APIC Header */
-{
-       u8                      type;                   /* APIC type.  Either APIC_PROC or APIC_IO */
-       u8                      length;                 /* Length of APIC structure */
-
-} APIC_HEADER;
-
-
-typedef struct  /* Processor APIC */
-{
-       APIC_HEADER             header;
-       u8                      processor_apic_id;      /* ACPI processor id */
-       u8                      local_apic_id;          /* processor's local APIC id */
-       u32                     processor_enabled: 1;   /* Processor is usable if set */
-       u32                     reserved1       : 32;
-
-} PROCESSOR_APIC;
-
-
-typedef struct  /* IO APIC */
-{
-       APIC_HEADER             header;
-       u8                      io_apic_id;             /* I/O APIC ID */
-       u8                      reserved;               /* reserved - must be zero */
-       u32                     io_apic_address;        /* APIC's physical address */
-       u32                     vector;                 /* interrupt vector index where INTI
-                         * lines start */
-} IO_APIC;
-
-
-/*
-**  IA64 TODO:  Add SAPIC Tables
-*/
-
-/*
-**  IA64 TODO:  Modify Smart Battery Description to comply with ACPI IA64
-**              extensions.
-*/
-typedef struct  /* Smart Battery Description Table */
-{
-       ACPI_TABLE_HEADER       header;
-       u32                     warning_level;
-       u32                     low_level;
-       u32                     critical_level;
-
-} SMART_BATTERY_DESCRIPTION_TABLE;
-
-
-#pragma pack()
-
-
-/*
- * ACPI Table information.  We save the table address, length,
- * and type of memory allocation (mapped or allocated) for each
- * table for 1) when we exit, and 2) if a new table is installed
- */
-
-#define ACPI_MEM_NOT_ALLOCATED  0
-#define ACPI_MEM_ALLOCATED      1
-#define ACPI_MEM_MAPPED         2
-
-/* Definitions for the Flags bitfield member of ACPI_TABLE_SUPPORT */
-
-#define ACPI_TABLE_SINGLE       0
-#define ACPI_TABLE_MULTIPLE     1
-
-
-/* Data about each known table type */
-
-typedef struct _acpi_table_support
-{
-       NATIVE_CHAR             *name;
-       NATIVE_CHAR             *signature;
-       u8                      sig_length;
-       u8                      flags;
-       u16                     status;
-       void                    **global_ptr;
-
-} ACPI_TABLE_SUPPORT;
-
-/*
- * Get the architecture-specific tables
- */
-
-#include "actbl1.h"   /* Acpi 1.0 table defintions */
-#include "actbl71.h"  /* Acpi 0.71 IA-64 Extension table defintions */
-#include "actbl2.h"   /* Acpi 2.0 table definitions */
-
-#endif /* __ACTBL_H__ */
diff --git a/reactos/drivers/bus/acpi/include/actbl1.h b/reactos/drivers/bus/acpi/include/actbl1.h
deleted file mode 100644 (file)
index 8cb88b4..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/******************************************************************************
- *
- * Name: actbl1.h - ACPI 1.0 tables
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACTBL1_H__
-#define __ACTBL1_H__
-
-#pragma pack(1)
-
-/*************************************/
-/* ACPI Specification Rev 1.0 for    */
-/* the Root System Description Table */
-/*************************************/
-typedef struct
-{
-       ACPI_TABLE_HEADER       header;                 /* Table header */
-       u32                     table_offset_entry [1]; /* Array of pointers to other */
-                        /* ACPI tables */
-} RSDT_DESCRIPTOR_REV1;
-
-
-/***************************************/
-/* ACPI Specification Rev 1.0 for      */
-/* the Firmware ACPI Control Structure */
-/***************************************/
-typedef struct
-{
-       NATIVE_CHAR             signature[4];           /* signature "FACS" */
-       u32                     length;                 /* length of structure, in bytes */
-       u32                     hardware_signature;     /* hardware configuration signature */
-       u32                     firmware_waking_vector; /* ACPI OS waking vector */
-       u32                     global_lock;            /* Global Lock */
-       u32                     S4_bios_f       : 1;    /* Indicates if S4_bIOS support is present */
-       u32                     reserved1       : 31;   /* must be 0 */
-       u8                      resverved3 [40];        /* reserved - must be zero */
-
-} FACS_DESCRIPTOR_REV1;
-
-
-/************************************/
-/* ACPI Specification Rev 1.0 for   */
-/* the Fixed ACPI Description Table */
-/************************************/
-typedef struct
-{
-       ACPI_TABLE_HEADER       header;                 /* table header */
-       u32                     firmware_ctrl;          /* Physical address of FACS */
-       u32                     dsdt;                   /* Physical address of DSDT */
-       u8                      model;                  /* System Interrupt Model */
-       u8                      reserved1;              /* reserved */
-       u16                     sci_int;                /* System vector of SCI interrupt */
-       u32                     smi_cmd;                /* Port address of SMI command port */
-       u8                      acpi_enable;            /* value to write to smi_cmd to enable ACPI */
-       u8                      acpi_disable;           /* value to write to smi_cmd to disable ACPI */
-       u8                      S4_bios_req;            /* Value to write to SMI CMD to enter S4_bIOS state */
-       u8                      reserved2;              /* reserved - must be zero */
-       u32                     pm1a_evt_blk;           /* Port address of Power Mgt 1a Acpi_event Reg Blk */
-       u32                     pm1b_evt_blk;           /* Port address of Power Mgt 1b Acpi_event Reg Blk */
-       u32                     pm1a_cnt_blk;           /* Port address of Power Mgt 1a Control Reg Blk */
-       u32                     pm1b_cnt_blk;           /* Port address of Power Mgt 1b Control Reg Blk */
-       u32                     pm2_cnt_blk;            /* Port address of Power Mgt 2 Control Reg Blk */
-       u32                     pm_tmr_blk;             /* Port address of Power Mgt Timer Ctrl Reg Blk */
-       u32                     gpe0blk;                /* Port addr of General Purpose Acpi_event 0 Reg Blk */
-       u32                     gpe1_blk;               /* Port addr of General Purpose Acpi_event 1 Reg Blk */
-       u8                      pm1_evt_len;            /* Byte Length of ports at pm1_x_evt_blk */
-       u8                      pm1_cnt_len;            /* Byte Length of ports at pm1_x_cnt_blk */
-       u8                      pm2_cnt_len;            /* Byte Length of ports at pm2_cnt_blk */
-       u8                      pm_tm_len;              /* Byte Length of ports at pm_tm_blk */
-       u8                      gpe0blk_len;            /* Byte Length of ports at gpe0_blk */
-       u8                      gpe1_blk_len;           /* Byte Length of ports at gpe1_blk */
-       u8                      gpe1_base;              /* offset in gpe model where gpe1 events start */
-       u8                      reserved3;              /* reserved */
-       u16                     plvl2_lat;              /* worst case HW latency to enter/exit C2 state */
-       u16                     plvl3_lat;              /* worst case HW latency to enter/exit C3 state */
-       u16                     flush_size;             /* Size of area read to flush caches */
-       u16                     flush_stride;           /* Stride used in flushing caches */
-       u8                      duty_offset;            /* bit location of duty cycle field in p_cnt reg */
-       u8                      duty_width;             /* bit width of duty cycle field in p_cnt reg */
-       u8                      day_alrm;               /* index to day-of-month alarm in RTC CMOS RAM */
-       u8                      mon_alrm;               /* index to month-of-year alarm in RTC CMOS RAM */
-       u8                      century;                /* index to century in RTC CMOS RAM */
-       u8                      reserved4;              /* reserved */
-       u8                      reserved4a;             /* reserved */
-       u8                      reserved4b;             /* reserved */
-       u32                     wb_invd         : 1;    /* wbinvd instruction works properly */
-       u32                     wb_invd_flush   : 1;    /* wbinvd flushes but does not invalidate */
-       u32                     proc_c1         : 1;    /* all processors support C1 state */
-       u32                     plvl2_up        : 1;    /* C2 state works on MP system */
-       u32                     pwr_button      : 1;    /* Power button is handled as a generic feature */
-       u32                     sleep_button    : 1;    /* Sleep button is handled as a generic feature, or not present */
-       u32                     fixed_rTC       : 1;    /* RTC wakeup stat not in fixed register space */
-       u32                     rtcs4           : 1;    /* RTC wakeup stat not possible from S4 */
-       u32                     tmr_val_ext     : 1;    /* tmr_val is 32 bits */
-       u32                     reserved5       : 23;   /* reserved - must be zero */
-
-}  FADT_DESCRIPTOR_REV1;
-
-#pragma pack()
-
-#endif /* __ACTBL1_H__ */
-
-
diff --git a/reactos/drivers/bus/acpi/include/actbl2.h b/reactos/drivers/bus/acpi/include/actbl2.h
deleted file mode 100644 (file)
index 8b6fe8f..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-/******************************************************************************
- *
- * Name: actbl2.h - ACPI Specification Revision 2.0 Tables
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACTBL2_H__
-#define __ACTBL2_H__
-
-/**************************************/
-/* Prefered Power Management Profiles */
-/**************************************/
-#define PM_UNSPECIFIED        0
-#define PM_DESKTOP            1
-#define PM_MOBILE             2
-#define PM_WORKSTATION        3
-#define PM_ENTERPRISE_SERVER  4
-#define PM_SOHO_SERVER        5
-#define PM_APPLIANCE_PC       6
-
-/*********************************************/
-/* ACPI Boot Arch Flags, See spec Table 5-10 */
-/*********************************************/
-#define BAF_LEGACY_DEVICES             0x0001
-#define BAF_8042_KEYBOARD_CONTROLLER   0x0002
-
-#define FADT2_REVISION_ID     3
-
-#pragma pack(1)
-
-/*************************************/
-/* ACPI Specification Rev 2.0 for    */
-/* the Root System Description Table */
-/*************************************/
-typedef struct
-{
-       ACPI_TABLE_HEADER   header;                 /* Table header */
-       u32                 table_offset_entry [1]; /* Array of pointers to  */
-                          /* other tables' headers */
-} RSDT_DESCRIPTOR_REV2;
-
-
-/********************************************/
-/* ACPI Specification Rev 2.0 for the       */
-/* Extended System Description Table (XSDT) */
-/********************************************/
-typedef struct
-{
-       ACPI_TABLE_HEADER   header;                 /* Table header */
-       UINT64              table_offset_entry [1]; /* Array of pointers to  */
-                          /* other tables' headers */
-} XSDT_DESCRIPTOR_REV2;
-
-/***************************************/
-/* ACPI Specification Rev 2.0 for      */
-/* the Firmware ACPI Control Structure */
-/***************************************/
-typedef struct
-{
-       NATIVE_CHAR         signature[4];           /* signature "FACS" */
-       u32                 length;                 /* length of structure, in bytes */
-       u32                 hardware_signature;     /* hardware configuration signature */
-       u32                 firmware_waking_vector; /* 32bit physical address of the Firmware Waking Vector. */
-       u32                 global_lock;            /* Global Lock used to synchronize access to shared hardware resources */
-       u32                 S4_bios_f       : 1;    /* Indicates if S4_bIOS support is present */
-       u32                 reserved1       : 31;   /* must be 0 */
-       UINT64              Xfirmware_waking_vector; /* 64bit physical address of the Firmware Waking Vector. */
-       u8                  version;                /* Version of this table */
-       u8                  reserved3 [31];         /* reserved - must be zero */
-
-} FACS_DESCRIPTOR_REV2;
-
-
-/***************************************/
-/* ACPI Specification Rev 2.0 for      */
-/* the Generic Address Structure (GAS) */
-/***************************************/
-typedef struct
-{
-       u8                  address_space_id;   /* Address space where struct or register exists. */
-       u8                  register_bit_width; /* Size in bits of given register */
-       u8                  register_bit_offset; /* Bit offset within the register */
-       u8                  reserved;           /* Must be 0 */
-       UINT64              address;            /* 64-bit address of struct or register */
-
-} ACPI_GAS;
-
-
-/************************************/
-/* ACPI Specification Rev 2.0 for   */
-/* the Fixed ACPI Description Table */
-/************************************/
-typedef struct
-{
-       ACPI_TABLE_HEADER   header;            /* table header */
-       u32                 V1_firmware_ctrl;  /* 32-bit physical address of FACS */
-       u32                 V1_dsdt;           /* 32-bit physical address of DSDT */
-       u8                  reserved1;         /* System Interrupt Model isn't used in ACPI 2.0*/
-       u8                  prefer_PM_profile; /* Conveys preferred power management profile to OSPM. */
-       u16                 sci_int;           /* System vector of SCI interrupt */
-       u32                 smi_cmd;           /* Port address of SMI command port */
-       u8                  acpi_enable;       /* value to write to smi_cmd to enable ACPI */
-       u8                  acpi_disable;      /* value to write to smi_cmd to disable ACPI */
-       u8                  S4_bios_req;       /* Value to write to SMI CMD to enter S4_bIOS state */
-       u8                  pstate_cnt;        /* processor performance state control*/
-       u32                 V1_pm1a_evt_blk;   /* Port address of Power Mgt 1a Acpi_event Reg Blk */
-       u32                 V1_pm1b_evt_blk;   /* Port address of Power Mgt 1b Acpi_event Reg Blk */
-       u32                 V1_pm1a_cnt_blk;   /* Port address of Power Mgt 1a Control Reg Blk */
-       u32                 V1_pm1b_cnt_blk;   /* Port address of Power Mgt 1b Control Reg Blk */
-       u32                 V1_pm2_cnt_blk;    /* Port address of Power Mgt 2 Control Reg Blk */
-       u32                 V1_pm_tmr_blk;     /* Port address of Power Mgt Timer Ctrl Reg Blk */
-       u32                 V1_gpe0blk;        /* Port addr of General Purpose Acpi_event 0 Reg Blk */
-       u32                 V1_gpe1_blk;       /* Port addr of General Purpose Acpi_event 1 Reg Blk */
-       u8                  pm1_evt_len;       /* Byte Length of ports at pm1_x_evt_blk */
-       u8                  pm1_cnt_len;       /* Byte Length of ports at pm1_x_cnt_blk */
-       u8                  pm2_cnt_len;       /* Byte Length of ports at pm2_cnt_blk */
-       u8                  pm_tm_len;         /* Byte Length of ports at pm_tm_blk */
-       u8                  gpe0blk_len;       /* Byte Length of ports at gpe0_blk */
-       u8                  gpe1_blk_len;      /* Byte Length of ports at gpe1_blk */
-       u8                  gpe1_base;         /* offset in gpe model where gpe1 events start */
-       u8                  cst_cnt;           /* Support for the _CST object and C States change notification.*/
-       u16                 plvl2_lat;         /* worst case HW latency to enter/exit C2 state */
-       u16                 plvl3_lat;         /* worst case HW latency to enter/exit C3 state */
-       u16                 flush_size;        /* number of flush strides that need to be read */
-       u16                 flush_stride;      /* Processor's memory cache line width, in bytes */
-       u8                  duty_offset;       /* Processor_\92s duty cycle index in processor's P_CNT reg*/
-       u8                  duty_width;        /* Processor_\92s duty cycle value bit width in P_CNT register.*/
-       u8                  day_alrm;          /* index to day-of-month alarm in RTC CMOS RAM */
-       u8                  mon_alrm;          /* index to month-of-year alarm in RTC CMOS RAM */
-       u8                  century;           /* index to century in RTC CMOS RAM */
-       u16                 iapc_boot_arch;    /* IA-PC Boot Architecture Flags. See Table 5-10 for description*/
-       u8                  reserved2;         /* reserved */
-       u32                 wb_invd     : 1;   /* wbinvd instruction works properly */
-       u32                 wb_invd_flush : 1; /* wbinvd flushes but does not invalidate */
-       u32                 proc_c1     : 1;   /* all processors support C1 state */
-       u32                 plvl2_up    : 1;   /* C2 state works on MP system */
-       u32                 pwr_button  : 1;   /* Power button is handled as a generic feature */
-       u32                 sleep_button : 1;  /* Sleep button is handled as a generic feature, or not present */
-       u32                 fixed_rTC   : 1;   /* RTC wakeup stat not in fixed register space */
-       u32                 rtcs4       : 1;   /* RTC wakeup stat not possible from S4 */
-       u32                 tmr_val_ext : 1;   /* tmr_val is 32 bits */
-       u32                 dock_cap    : 1;   /* Supports Docking */
-       u32                 reset_reg_sup : 1; /* Indicates system supports system reset via the FADT RESET_REG*/
-       u32                 sealed_case : 1;   /* Indicates system has no internal expansion capabilities and case is sealed. */
-       u32                 headless    : 1;   /* Indicates system does not have local video capabilities or local input devices.*/
-       u32                 cpu_sw_sleep : 1;  /* Indicates to OSPM that a processor native instruction */
-                        /* must be executed after writing the SLP_TYPx register. */
-       u32                 reserved6   : 18;  /* reserved - must be zero */
-
-       ACPI_GAS            reset_register;    /* Reset register address in GAS format */
-       u8                  reset_value;       /* Value to write to the Reset_register port to reset the system. */
-       u8                  reserved7[3];      /* These three bytes must be zero */
-       UINT64              Xfirmware_ctrl;     /* 64-bit physical address of FACS */
-       UINT64              Xdsdt;              /* 64-bit physical address of DSDT */
-       ACPI_GAS            Xpm1a_evt_blk;      /* Extended Power Mgt 1a Acpi_event Reg Blk address */
-       ACPI_GAS            Xpm1b_evt_blk;      /* Extended Power Mgt 1b Acpi_event Reg Blk address */
-       ACPI_GAS            Xpm1a_cnt_blk;      /* Extended Power Mgt 1a Control Reg Blk address */
-       ACPI_GAS            Xpm1b_cnt_blk;      /* Extended Power Mgt 1b Control Reg Blk address */
-       ACPI_GAS            Xpm2_cnt_blk;       /* Extended Power Mgt 2 Control Reg Blk address */
-       ACPI_GAS            Xpm_tmr_blk;        /* Extended Power Mgt Timer Ctrl Reg Blk address */
-       ACPI_GAS            Xgpe0blk;           /* Extended General Purpose Acpi_event 0 Reg Blk address */
-       ACPI_GAS            Xgpe1_blk;          /* Extended General Purpose Acpi_event 1 Reg Blk address */
-
-}  FADT_DESCRIPTOR_REV2;
-
-
-#pragma pack()
-
-#endif /* __ACTBL2_H__ */
-
diff --git a/reactos/drivers/bus/acpi/include/actbl71.h b/reactos/drivers/bus/acpi/include/actbl71.h
deleted file mode 100644 (file)
index 0390d6f..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/******************************************************************************
- *
- * Name: actbl71.h - IA-64 Extensions to the ACPI Spec Rev. 0.71
- *                   This file includes tables specific to this
- *                   specification revision.
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACTBL71_H__
-#define __ACTBL71_H__
-
-/* 0.71 FADT Address_space data item bitmasks defines */
-/* If the associated bit is zero then it is in memory space else in io space */
-#define SMI_CMD_ADDRESS_SPACE       0x01
-#define PM1_BLK_ADDRESS_SPACE       0x02
-#define PM2_CNT_BLK_ADDRESS_SPACE   0x04
-#define PM_TMR_BLK_ADDRESS_SPACE    0x08
-#define GPE0_BLK_ADDRESS_SPACE      0x10
-#define GPE1_BLK_ADDRESS_SPACE      0x20
-
-/* Only for clarity in declarations */
-typedef UINT64              IO_ADDRESS;
-
-#pragma pack(1)
-
-typedef struct  /* Root System Descriptor Pointer */
-{
-       NATIVE_CHAR             signature [8];          /* contains "RSD PTR " */
-       u8                      checksum;               /* to make sum of struct == 0 */
-       NATIVE_CHAR             oem_id [6];             /* OEM identification */
-       u8                      reserved;               /* Must be 0 for 1.0, 2 for 2.0 */
-       UINT64                  rsdt_physical_address;  /* 64-bit physical address of RSDT */
-} RSDP_DESCRIPTOR_REV071;
-
-
-/*****************************************/
-/* IA64 Extensions to ACPI Spec Rev 0.71 */
-/* for the Root System Description Table */
-/*****************************************/
-typedef struct
-{
-       ACPI_TABLE_HEADER   header;                 /* Table header */
-       u32                 reserved_pad;           /* IA64 alignment, must be 0 */
-       UINT64              table_offset_entry [1]; /* Array of pointers to other */
-                          /* tables' headers */
-} RSDT_DESCRIPTOR_REV071;
-
-
-/*******************************************/
-/* IA64 Extensions to ACPI Spec Rev 0.71   */
-/* for the Firmware ACPI Control Structure */
-/*******************************************/
-typedef struct
-{
-       NATIVE_CHAR         signature[4];         /* signature "FACS" */
-       u32                 length;               /* length of structure, in bytes */
-       u32                 hardware_signature;   /* hardware configuration signature */
-       u32                 reserved4;            /* must be 0 */
-       UINT64              firmware_waking_vector; /* ACPI OS waking vector */
-       UINT64              global_lock;          /* Global Lock */
-       u32                 S4_bios_f     : 1;    /* Indicates if S4_bIOS support is present */
-       u32                 reserved1     : 31;   /* must be 0 */
-       u8                  reserved3 [28];       /* reserved - must be zero */
-
-} FACS_DESCRIPTOR_REV071;
-
-
-/******************************************/
-/* IA64 Extensions to ACPI Spec Rev 0.71  */
-/* for the Fixed ACPI Description Table   */
-/******************************************/
-typedef struct
-{
-       ACPI_TABLE_HEADER   header;             /* table header */
-       u32                 reserved_pad;       /* IA64 alignment, must be 0 */
-       UINT64              firmware_ctrl;      /* 64-bit Physical address of FACS */
-       UINT64              dsdt;               /* 64-bit Physical address of DSDT */
-       u8                  model;              /* System Interrupt Model */
-       u8                  address_space;      /* Address Space Bitmask */
-       u16                 sci_int;            /* System vector of SCI interrupt */
-       u8                  acpi_enable;        /* value to write to smi_cmd to enable ACPI */
-       u8                  acpi_disable;       /* value to write to smi_cmd to disable ACPI */
-       u8                  S4_bios_req;        /* Value to write to SMI CMD to enter S4_bIOS state */
-       u8                  reserved2;          /* reserved - must be zero */
-       UINT64              smi_cmd;            /* Port address of SMI command port */
-       UINT64              pm1a_evt_blk;       /* Port address of Power Mgt 1a Acpi_event Reg Blk */
-       UINT64              pm1b_evt_blk;       /* Port address of Power Mgt 1b Acpi_event Reg Blk */
-       UINT64              pm1a_cnt_blk;       /* Port address of Power Mgt 1a Control Reg Blk */
-       UINT64              pm1b_cnt_blk;       /* Port address of Power Mgt 1b Control Reg Blk */
-       UINT64              pm2_cnt_blk;        /* Port address of Power Mgt 2 Control Reg Blk */
-       UINT64              pm_tmr_blk;         /* Port address of Power Mgt Timer Ctrl Reg Blk */
-       UINT64              gpe0blk;            /* Port addr of General Purpose Acpi_event 0 Reg Blk */
-       UINT64              gpe1_blk;           /* Port addr of General Purpose Acpi_event 1 Reg Blk */
-       u8                  pm1_evt_len;        /* Byte Length of ports at pm1_x_evt_blk */
-       u8                  pm1_cnt_len;        /* Byte Length of ports at pm1_x_cnt_blk */
-       u8                  pm2_cnt_len;        /* Byte Length of ports at pm2_cnt_blk */
-       u8                  pm_tm_len;          /* Byte Length of ports at pm_tm_blk */
-       u8                  gpe0blk_len;        /* Byte Length of ports at gpe0_blk */
-       u8                  gpe1_blk_len;       /* Byte Length of ports at gpe1_blk */
-       u8                  gpe1_base;          /* offset in gpe model where gpe1 events start */
-       u8                  reserved3;          /* reserved */
-       u16                 plvl2_lat;          /* worst case HW latency to enter/exit C2 state */
-       u16                 plvl3_lat;          /* worst case HW latency to enter/exit C3 state */
-       u8                  day_alrm;           /* index to day-of-month alarm in RTC CMOS RAM */
-       u8                  mon_alrm;           /* index to month-of-year alarm in RTC CMOS RAM */
-       u8                  century;            /* index to century in RTC CMOS RAM */
-       u8                  reserved4;          /* reserved */
-       u32                 flush_cash  : 1;    /* PAL_FLUSH_CACHE is correctly supported */
-       u32                 reserved5   : 1;    /* reserved - must be zero */
-       u32                 proc_c1     : 1;    /* all processors support C1 state */
-       u32                 plvl2_up    : 1;    /* C2 state works on MP system */
-       u32                 pwr_button  : 1;    /* Power button is handled as a generic feature */
-       u32                 sleep_button : 1;   /* Sleep button is handled as a generic feature, or not present */
-       u32                 fixed_rTC   : 1;    /* RTC wakeup stat not in fixed register space */
-       u32                 rtcs4       : 1;    /* RTC wakeup stat not possible from S4 */
-       u32                 tmr_val_ext : 1;    /* tmr_val is 32 bits */
-       u32                 dock_cap    : 1;    /* Supports Docking */
-       u32                 reserved6   : 22;    /* reserved - must be zero */
-
-}  FADT_DESCRIPTOR_REV071;
-
-#pragma pack()
-
-#endif /* __ACTBL71_H__ */
-
diff --git a/reactos/drivers/bus/acpi/include/actypes.h b/reactos/drivers/bus/acpi/include/actypes.h
deleted file mode 100644 (file)
index 16c7b76..0000000
+++ /dev/null
@@ -1,1077 +0,0 @@
-/******************************************************************************
- *
- * Name: actypes.h - Common data types for the entire ACPI subsystem
- *       $Revision: 1.5 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACTYPES_H__
-#define __ACTYPES_H__
-
-/*! [Begin] no source code translation (keep the typedefs) */
-
-/*
- * Data types - Fixed across all compilation models
- *
- * BOOLEAN      Logical Boolean.
- *              1 byte value containing a 0 for FALSE or a 1 for TRUE.
- *              Other values are undefined.
- *
- * INT8         8-bit  (1 byte) signed value
- * UINT8        8-bit  (1 byte) unsigned value
- * INT16        16-bit (2 byte) signed value
- * UINT16       16-bit (2 byte) unsigned value
- * INT32        32-bit (4 byte) signed value
- * UINT32       32-bit (4 byte) unsigned value
- * INT64        64-bit (8 byte) signed value
- * UINT64       64-bit (8 byte) unsigned value
- * NATIVE_INT   32-bit on IA-32, 64-bit on IA-64 signed value
- * NATIVE_UINT  32-bit on IA-32, 64-bit on IA-64 unsigned value
- * UCHAR        Character. 1 byte unsigned value.
- */
-
-
-#if defined (_IA64) || defined(_AMD64_)
-/*
- * 64-bit type definitions
- */
-//typedef unsigned char                   UINT8;
-//typedef unsigned char                   BOOLEAN;
-//typedef unsigned char                   UCHAR;
-//typedef unsigned short                  UINT16;
-//typedef int                             INT32;
-//typedef unsigned int                    UINT32;
-//typedef COMPILER_DEPENDENT_UINT64       UINT64;
-
-typedef UINT64                          NATIVE_UINT;
-typedef INT64                           NATIVE_INT;
-
-typedef NATIVE_UINT                     ACPI_TBLPTR;
-typedef UINT64                          ACPI_IO_ADDRESS;
-typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
-
-#define ALIGNED_ADDRESS_BOUNDARY        0x00000008
-
-/* (No hardware alignment support in IA64) */
-
-
-#elif _IA16
-/*
- * 16-bit type definitions
- */
-typedef unsigned char                   UINT8;
-typedef unsigned char                   BOOLEAN;
-typedef unsigned char                   UCHAR;
-typedef unsigned int                    UINT16;
-typedef long                            INT32;
-typedef int                             INT16;
-typedef unsigned long                   UINT32;
-
-typedef struct
-{
-       UINT32                                  Lo;
-       UINT32                                  Hi;
-
-} UINT64;
-
-typedef UINT16                          NATIVE_UINT;
-typedef INT16                           NATIVE_INT;
-
-typedef UINT32                          ACPI_TBLPTR;
-typedef UINT32                          ACPI_IO_ADDRESS;
-typedef char                            *ACPI_PHYSICAL_ADDRESS;
-
-#define ALIGNED_ADDRESS_BOUNDARY        0x00000002
-#define _HW_ALIGNMENT_SUPPORT
-
-/*
- * (16-bit only) internal integers must be 32-bits, so
- * 64-bit integers cannot be supported
- */
-#define ACPI_NO_INTEGER64_SUPPORT
-
-
-#else
-/*
- * 32-bit type definitions (default)
- */
-//typedef unsigned char                   UINT8;
-//typedef unsigned char                   BOOLEAN;
-//typedef unsigned char                   UCHAR;
-//typedef unsigned short                  UINT16;
-//typedef int                             INT32;
-//typedef unsigned int                    UINT32;
-//typedef COMPILER_DEPENDENT_UINT64       UINT64;
-
-typedef UINT32                          NATIVE_UINT;
-typedef INT32                           NATIVE_INT;
-
-typedef NATIVE_UINT                     ACPI_TBLPTR;
-typedef UINT32                          ACPI_IO_ADDRESS;
-typedef UINT64                          ACPI_PHYSICAL_ADDRESS;
-
-#define ALIGNED_ADDRESS_BOUNDARY        0x00000004
-#define _HW_ALIGNMENT_SUPPORT
-#endif
-
-
-
-/*
- * Miscellaneous common types
- */
-
-typedef UINT32                          UINT32_BIT;
-typedef NATIVE_UINT                     ACPI_PTRDIFF;
-typedef char                            NATIVE_CHAR;
-
-
-/*
- * Data type ranges
- */
-
-#define ACPI_UINT8_MAX                  (UINT8)  0xFF
-#define ACPI_UINT16_MAX                 (UINT16) 0xFFFF
-#define ACPI_UINT32_MAX                 (UINT32) 0xFFFFFFFF
-#ifdef __GNUC__
-#define ACPI_UINT64_MAX                 (UINT64) 0xFFFFFFFFFFFFFFFFULL
-#else
-#define ACPI_UINT64_MAX                 (UINT64) 0xFFFFFFFFFFFFFFFF
-#endif
-
-#ifdef DEFINE_ALTERNATE_TYPES
-/*
- * Types used only in translated source
- */
-typedef INT32                           s32;
-typedef UINT8                           u8;
-typedef UINT16                          u16;
-typedef UINT32                          u32;
-typedef UINT64                          u64;
-#endif
-/*! [End] no source code translation !*/
-
-
-/*
- * Useful defines
- */
-
-#ifdef FALSE
-#undef FALSE
-#endif
-#define FALSE                           (1 == 0)
-
-#ifdef TRUE
-#undef TRUE
-#endif
-#define TRUE                            (1 == 1)
-
-#ifndef NULL
-#define NULL                            (void *) 0
-#endif
-
-
-/*
- * Local datatypes
- */
-#ifdef _MSC_VER
-typedef ULONGLONG u64;
-typedef ULONG u32;
-typedef USHORT u16;
-typedef UCHAR u8;
-typedef LONGLONG s64;
-typedef LONG s32;
-typedef SHORT s16;
-typedef CHAR s8;
-#endif
-
-typedef u32                             ACPI_STATUS;    /* All ACPI Exceptions */
-typedef u32                             ACPI_NAME;      /* 4-s8 ACPI name */
-typedef char*                           ACPI_STRING;    /* Null terminated ASCII string */
-typedef void*                           ACPI_HANDLE;    /* Actually a ptr to an Node */
-
-
-/*
- * Acpi integer width. In ACPI version 1, integers are
- * 32 bits.  In ACPI version 2, integers are 64 bits.
- * Note that this pertains to the ACPI integer type only, not
- * other integers used in the implementation of the ACPI CA
- * subsystem.
- */
-#ifdef ACPI_NO_INTEGER64_SUPPORT
-
-/* 32-bit integers only, no 64-bit support */
-
-typedef u32                             ACPI_INTEGER;
-#define ACPI_INTEGER_MAX                ACPI_UINT32_MAX
-#define ACPI_INTEGER_BIT_SIZE           32
-#define ACPI_MAX_BCD_VALUE              99999999
-#define ACPI_MAX_BCD_DIGITS             8
-
-#else
-
-/* 64-bit integers */
-
-typedef UINT64                          ACPI_INTEGER;
-#define ACPI_INTEGER_MAX                ACPI_UINT64_MAX
-#define ACPI_INTEGER_BIT_SIZE           64
-#ifdef __GNUC__
-#define ACPI_MAX_BCD_VALUE              9999999999999999ULL
-#else
-#define ACPI_MAX_BCD_VALUE              9999999999999999
-#endif
-#define ACPI_MAX_BCD_DIGITS             16
-
-#endif
-
-
-/*
- * Constants with special meanings
- */
-
-#define ACPI_ROOT_OBJECT                (ACPI_HANDLE)(-1)
-
-#define ACPI_FULL_INITIALIZATION        0x00
-#define ACPI_NO_ADDRESS_SPACE_INIT      0x01
-#define ACPI_NO_HARDWARE_INIT           0x02
-#define ACPI_NO_EVENT_INIT              0x04
-#define ACPI_NO_ACPI_ENABLE             0x08
-#define ACPI_NO_DEVICE_INIT             0x10
-#define ACPI_NO_OBJECT_INIT             0x20
-
-
-/*
- * System states
- */
-#define ACPI_STATE_S0                   (u8) 0
-#define ACPI_STATE_S1                   (u8) 1
-#define ACPI_STATE_S2                   (u8) 2
-#define ACPI_STATE_S3                   (u8) 3
-#define ACPI_STATE_S4                   (u8) 4
-#define ACPI_STATE_S5                   (u8) 5
-/* let's pretend S4_bIOS didn't exist for now. ASG */
-#define ACPI_STATE_S4_bIOS              (u8) 6
-#define ACPI_S_STATES_MAX               ACPI_STATE_S5
-#define ACPI_S_STATE_COUNT             6
-
-/*
- * Device power states
- */
-#define ACPI_STATE_D0                  (u8) 0
-#define ACPI_STATE_D1                  (u8) 1
-#define ACPI_STATE_D2                  (u8) 2
-#define ACPI_STATE_D3                  (u8) 3
-#define ACPI_D_STATES_MAX              ACPI_STATE_D3
-#define ACPI_D_STATE_COUNT             4
-
-#define ACPI_STATE_UNKNOWN             (u8) 0xFF
-
-
-/*
- *  Table types.  These values are passed to the table related APIs
- */
-
-typedef u32                             ACPI_TABLE_TYPE;
-
-#define ACPI_TABLE_RSDP                 (ACPI_TABLE_TYPE) 0
-#define ACPI_TABLE_DSDT                 (ACPI_TABLE_TYPE) 1
-#define ACPI_TABLE_FADT                 (ACPI_TABLE_TYPE) 2
-#define ACPI_TABLE_FACS                 (ACPI_TABLE_TYPE) 3
-#define ACPI_TABLE_PSDT                 (ACPI_TABLE_TYPE) 4
-#define ACPI_TABLE_SSDT                 (ACPI_TABLE_TYPE) 5
-#define ACPI_TABLE_XSDT                 (ACPI_TABLE_TYPE) 6
-#define ACPI_TABLE_MAX                  6
-#define NUM_ACPI_TABLES                 (ACPI_TABLE_MAX+1)
-
-
-/*
- * Types associated with names.  The first group of
- * values correspond to the definition of the ACPI
- * Object_type operator (See the ACPI Spec). Therefore,
- * only add to the first group if the spec changes!
- *
- * Types must be kept in sync with the Acpi_ns_properties
- * and Acpi_ns_type_names arrays
- */
-
-typedef u32                             ACPI_OBJECT_TYPE;
-typedef u8                              OBJECT_TYPE_INTERNAL;
-
-#define ACPI_BTYPE_ANY                  0x00000000
-#define ACPI_BTYPE_INTEGER               0x00000001
-#define ACPI_BTYPE_STRING               0x00000002
-#define ACPI_BTYPE_BUFFER               0x00000004
-#define ACPI_BTYPE_PACKAGE              0x00000008
-#define ACPI_BTYPE_FIELD_UNIT           0x00000010
-#define ACPI_BTYPE_DEVICE               0x00000020
-#define ACPI_BTYPE_EVENT                0x00000040
-#define ACPI_BTYPE_METHOD               0x00000080
-#define ACPI_BTYPE_MUTEX                0x00000100
-#define ACPI_BTYPE_REGION               0x00000200
-#define ACPI_BTYPE_POWER                0x00000400
-#define ACPI_BTYPE_PROCESSOR            0x00000800
-#define ACPI_BTYPE_THERMAL              0x00001000
-#define ACPI_BTYPE_BUFFER_FIELD         0x00002000
-#define ACPI_BTYPE_DDB_HANDLE           0x00004000
-#define ACPI_BTYPE_DEBUG_OBJECT         0x00008000
-#define ACPI_BTYPE_REFERENCE            0x00010000
-#define ACPI_BTYPE_RESOURCE             0x00020000
-
-#define ACPI_BTYPE_COMPUTE_DATA         (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER)
-
-#define ACPI_BTYPE_DATA                 (ACPI_BTYPE_COMPUTE_DATA  | ACPI_BTYPE_PACKAGE)
-#define ACPI_BTYPE_DATA_REFERENCE       (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE)
-#define ACPI_BTYPE_DEVICE_OBJECTS       (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR)
-#define ACPI_BTYPE_OBJECTS_AND_REFS     0x00017FFF  /* ARG or LOCAL */
-#define ACPI_BTYPE_ALL_OBJECTS          0x00007FFF
-
-
-#define ACPI_TYPE_ANY                   0  /* 0x00  */
-#define ACPI_TYPE_INTEGER               1  /* 0x01  Byte/Word/Dword/Zero/One/Ones */
-#define ACPI_TYPE_STRING                2  /* 0x02  */
-#define ACPI_TYPE_BUFFER                3  /* 0x03  */
-#define ACPI_TYPE_PACKAGE               4  /* 0x04  Byte_const, multiple Data_term/Constant/Super_name */
-#define ACPI_TYPE_FIELD_UNIT            5  /* 0x05  */
-#define ACPI_TYPE_DEVICE                6  /* 0x06  Name, multiple Node */
-#define ACPI_TYPE_EVENT                 7  /* 0x07  */
-#define ACPI_TYPE_METHOD                8  /* 0x08  Name, Byte_const, multiple Code */
-#define ACPI_TYPE_MUTEX                 9  /* 0x09  */
-#define ACPI_TYPE_REGION                10 /* 0x0A  */
-#define ACPI_TYPE_POWER                 11 /* 0x0B  Name,Byte_const,Word_const,multi Node */
-#define ACPI_TYPE_PROCESSOR             12 /* 0x0C  Name,Byte_const,DWord_const,Byte_const,multi Nm_o */
-#define ACPI_TYPE_THERMAL               13 /* 0x0D  Name, multiple Node */
-#define ACPI_TYPE_BUFFER_FIELD          14 /* 0x0E  */
-#define ACPI_TYPE_DDB_HANDLE            15 /* 0x0F  */
-#define ACPI_TYPE_DEBUG_OBJECT          16 /* 0x10  */
-
-#define ACPI_TYPE_MAX                   16
-
-/*
- * This section contains object types that do not relate to the ACPI Object_type operator.
- * They are used for various internal purposes only.  If new predefined ACPI_TYPEs are
- * added (via the ACPI specification), these internal types must move upwards.
- * Also, values exceeding the largest official ACPI Object_type must not overlap with
- * defined AML opcodes.
- */
-#define INTERNAL_TYPE_BEGIN             17
-
-#define INTERNAL_TYPE_DEF_FIELD         17 /* 0x11  */
-#define INTERNAL_TYPE_BANK_FIELD        18 /* 0x12  */
-#define INTERNAL_TYPE_INDEX_FIELD       19 /* 0x13  */
-#define INTERNAL_TYPE_REFERENCE         20 /* 0x14  Arg#, Local#, Name, Debug; used only in descriptors */
-#define INTERNAL_TYPE_ALIAS             21 /* 0x15  */
-#define INTERNAL_TYPE_NOTIFY            22 /* 0x16  */
-#define INTERNAL_TYPE_ADDRESS_HANDLER   23 /* 0x17  */
-#define INTERNAL_TYPE_RESOURCE          24 /* 0x18  */
-
-
-#define INTERNAL_TYPE_NODE_MAX          24
-
-/* These are pseudo-types because there are never any namespace nodes with these types */
-
-#define INTERNAL_TYPE_DEF_FIELD_DEFN    25 /* 0x19  Name, Byte_const, multiple Field_element */
-#define INTERNAL_TYPE_BANK_FIELD_DEFN   26 /* 0x1A  2 Name,DWord_const,Byte_const,multi Field_element */
-#define INTERNAL_TYPE_INDEX_FIELD_DEFN  27 /* 0x1B  2 Name, Byte_const, multiple Field_element */
-#define INTERNAL_TYPE_IF                28 /* 0x1C  */
-#define INTERNAL_TYPE_ELSE              29 /* 0x1D  */
-#define INTERNAL_TYPE_WHILE             30 /* 0x1E  */
-#define INTERNAL_TYPE_SCOPE             31 /* 0x1F  Name, multiple Node */
-#define INTERNAL_TYPE_DEF_ANY           32 /* 0x20  type is Any, suppress search of enclosing scopes */
-#define INTERNAL_TYPE_EXTRA             33 /* 0x21  */
-
-#define INTERNAL_TYPE_MAX               33
-
-#define INTERNAL_TYPE_INVALID           34
-#define ACPI_TYPE_NOT_FOUND             0xFF
-
-/*
- * Acpi_event Types:
- * ------------
- * Fixed & general purpose...
- */
-
-typedef u32                             ACPI_EVENT_TYPE;
-
-#define ACPI_EVENT_FIXED                (ACPI_EVENT_TYPE) 0
-#define ACPI_EVENT_GPE                  (ACPI_EVENT_TYPE) 1
-
-/*
- * Fixed events
- */
-
-#define ACPI_EVENT_PMTIMER              (ACPI_EVENT_TYPE) 0
-       /*
-        * There's no bus master event so index 1 is used for IRQ's that are not
-        * handled by the SCI handler
-        */
-#define ACPI_EVENT_NOT_USED             (ACPI_EVENT_TYPE) 1
-#define ACPI_EVENT_GLOBAL               (ACPI_EVENT_TYPE) 2
-#define ACPI_EVENT_POWER_BUTTON         (ACPI_EVENT_TYPE) 3
-#define ACPI_EVENT_SLEEP_BUTTON         (ACPI_EVENT_TYPE) 4
-#define ACPI_EVENT_RTC                  (ACPI_EVENT_TYPE) 5
-#define ACPI_EVENT_GENERAL              (ACPI_EVENT_TYPE) 6
-#define ACPI_EVENT_MAX                  6
-#define NUM_FIXED_EVENTS                (ACPI_EVENT_TYPE) 7
-
-#define ACPI_GPE_INVALID                0xFF
-#define ACPI_GPE_MAX                    0xFF
-#define NUM_GPE                         256
-
-#define ACPI_EVENT_LEVEL_TRIGGERED      (ACPI_EVENT_TYPE) 1
-#define ACPI_EVENT_EDGE_TRIGGERED       (ACPI_EVENT_TYPE) 2
-
-/*
- * Acpi_event Status:
- * -------------
- * The encoding of ACPI_EVENT_STATUS is illustrated below.
- * Note that a set bit (1) indicates the property is TRUE
- * (e.g. if bit 0 is set then the event is enabled).
- * +---------------+-+-+
- * |   Bits 31:2   |1|0|
- * +---------------+-+-+
- *          |       | |
- *          |       | +- Enabled?
- *          |       +--- Set?
- *          +----------- <Reserved>
- */
-typedef u32                             ACPI_EVENT_STATUS;
-
-#define ACPI_EVENT_FLAG_DISABLED        (ACPI_EVENT_STATUS) 0x00
-#define ACPI_EVENT_FLAG_ENABLED         (ACPI_EVENT_STATUS) 0x01
-#define ACPI_EVENT_FLAG_SET             (ACPI_EVENT_STATUS) 0x02
-
-
-/* Notify types */
-
-#define ACPI_SYSTEM_NOTIFY              0
-#define ACPI_DEVICE_NOTIFY              1
-#define ACPI_MAX_NOTIFY_HANDLER_TYPE    1
-
-#define MAX_SYS_NOTIFY                  0x7f
-
-
-/* Address Space (Operation Region) Types */
-
-typedef u8                              ACPI_ADDRESS_SPACE_TYPE;
-
-#define ADDRESS_SPACE_SYSTEM_MEMORY     (ACPI_ADDRESS_SPACE_TYPE) 0
-#define ADDRESS_SPACE_SYSTEM_IO         (ACPI_ADDRESS_SPACE_TYPE) 1
-#define ADDRESS_SPACE_PCI_CONFIG        (ACPI_ADDRESS_SPACE_TYPE) 2
-#define ADDRESS_SPACE_EC                (ACPI_ADDRESS_SPACE_TYPE) 3
-#define ADDRESS_SPACE_SMBUS             (ACPI_ADDRESS_SPACE_TYPE) 4
-#define ADDRESS_SPACE_CMOS              (ACPI_ADDRESS_SPACE_TYPE) 5
-#define ADDRESS_SPACE_PCI_BAR_TARGET    (ACPI_ADDRESS_SPACE_TYPE) 6
-
-
-/*
- * External ACPI object definition
- */
-
-typedef union acpi_obj
-{
-       ACPI_OBJECT_TYPE            type;   /* See definition of Acpi_ns_type for values */
-       struct
-       {
-               ACPI_OBJECT_TYPE            type;
-               ACPI_INTEGER                value;      /* The actual number */
-       } integer;
-
-       struct
-       {
-               ACPI_OBJECT_TYPE            type;
-               u32                         length;     /* # of bytes in string, excluding trailing null */
-               NATIVE_CHAR                 *pointer;   /* points to the string value */
-       } string;
-
-       struct
-       {
-               ACPI_OBJECT_TYPE            type;
-               u32                         length;     /* # of bytes in buffer */
-               u8                          *pointer;   /* points to the buffer */
-       } buffer;
-
-       struct
-       {
-               ACPI_OBJECT_TYPE            type;
-               u32                         fill1;
-               ACPI_HANDLE                 handle;     /* object reference */
-       } reference;
-
-       struct
-       {
-               ACPI_OBJECT_TYPE            type;
-               u32                         count;      /* # of elements in package */
-               union acpi_obj              *elements;  /* Pointer to an array of ACPI_OBJECTs */
-       } package;
-
-       struct
-       {
-               ACPI_OBJECT_TYPE            type;
-               u32                         proc_id;
-               ACPI_IO_ADDRESS             pblk_address;
-               u32                         pblk_length;
-       } processor;
-
-       struct
-       {
-               ACPI_OBJECT_TYPE            type;
-               u32                         system_level;
-               u32                         resource_order;
-       } power_resource;
-
-} ACPI_OBJECT, *PACPI_OBJECT;
-
-
-/*
- * List of objects, used as a parameter list for control method evaluation
- */
-
-typedef struct acpi_obj_list
-{
-       u32                         count;
-       ACPI_OBJECT                 *pointer;
-
-} ACPI_OBJECT_LIST, *PACPI_OBJECT_LIST;
-
-
-/*
- * Miscellaneous common Data Structures used by the interfaces
- */
-
-typedef struct
-{
-       u32                         length;         /* Length in bytes of the buffer */
-       void                        *pointer;       /* pointer to buffer */
-
-} ACPI_BUFFER;
-
-
-/*
- * Name_type for Acpi_get_name
- */
-
-#define ACPI_FULL_PATHNAME              0
-#define ACPI_SINGLE_NAME                1
-#define ACPI_NAME_TYPE_MAX              1
-
-
-/*
- * Structure and flags for Acpi_get_system_info
- */
-
-#define SYS_MODE_UNKNOWN                0x0000
-#define SYS_MODE_ACPI                   0x0001
-#define SYS_MODE_LEGACY                 0x0002
-#define SYS_MODES_MASK                  0x0003
-
-/*
- *  ACPI CPU Cx state handler
- */
-typedef
-ACPI_STATUS (*ACPI_SET_C_STATE_HANDLER) (
-       NATIVE_UINT                 pblk_address);
-
-/*
- *  ACPI Cx State info
- */
-typedef struct
-{
-       u32                         state_number;
-       u32                         latency;
-} ACPI_CX_STATE;
-
-/*
- *  ACPI CPU throttling info
- */
-typedef struct
-{
-       u32                         state_number;
-       u32                         percent_of_clock;
-} ACPI_CPU_THROTTLING_STATE;
-
-/*
- * ACPI Table Info.  One per ACPI table _type_
- */
-typedef struct acpi_table_info
-{
-       u32                         count;
-
-} ACPI_TABLE_INFO;
-
-
-/*
- * System info returned by Acpi_get_system_info()
- */
-
-typedef struct _acpi_sys_info
-{
-       u32                         acpi_ca_version;
-       u32                         flags;
-       u32                         timer_resolution;
-       u32                         reserved1;
-       u32                         reserved2;
-       u32                         debug_level;
-       u32                         debug_layer;
-       u32                         num_table_types;
-       ACPI_TABLE_INFO             table_info [NUM_ACPI_TABLES];
-
-} ACPI_SYSTEM_INFO;
-
-
-/*
- *  System Initiailization data.  This data is passed to ACPIInitialize
- *  copyied to global data and retained by ACPI CA
- */
-
-typedef struct _acpi_init_data
-{
-       void                        *RSDP_physical_address; /*  Address of RSDP, needed it it is    */
-                         /*  not found in the IA32 manner        */
-} ACPI_INIT_DATA;
-
-/*
- * Various handlers and callback procedures
- */
-
-typedef
-u32 (*FIXED_EVENT_HANDLER) (
-       void                        *context);
-
-typedef
-void (*GPE_HANDLER) (
-       void                        *context);
-
-typedef
-void (*NOTIFY_HANDLER) (
-       ACPI_HANDLE                 device,
-       u32                         value,
-       void                        *context);
-
-#define ADDRESS_SPACE_READ              1
-#define ADDRESS_SPACE_WRITE             2
-
-typedef
-ACPI_STATUS (*ADDRESS_SPACE_HANDLER) (
-       u32                         function,
-       ACPI_PHYSICAL_ADDRESS       address,
-       u32                         bit_width,
-       u32                         *value,
-       void                        *handler_context,
-       void                        *region_context);
-
-#define ACPI_DEFAULT_HANDLER            ((ADDRESS_SPACE_HANDLER) NULL)
-
-
-typedef
-ACPI_STATUS (*ADDRESS_SPACE_SETUP) (
-       ACPI_HANDLE                 region_handle,
-       u32                         function,
-       void                        *handler_context,
-       void                        **region_context);
-
-#define ACPI_REGION_ACTIVATE    0
-#define ACPI_REGION_DEACTIVATE  1
-
-typedef
-ACPI_STATUS (*WALK_CALLBACK) (
-       ACPI_HANDLE                 obj_handle,
-       u32                         nesting_level,
-       void                        *context,
-       void                        **return_value);
-
-
-/* Interrupt handler return values */
-
-#define INTERRUPT_NOT_HANDLED           0x00
-#define INTERRUPT_HANDLED               0x01
-
-
-/* Structure and flags for Acpi_get_device_info */
-
-#define ACPI_VALID_HID                  0x1
-#define ACPI_VALID_UID                  0x2
-#define ACPI_VALID_ADR                  0x4
-#define ACPI_VALID_STA                  0x8
-
-
-#define ACPI_COMMON_OBJ_INFO \
-       ACPI_OBJECT_TYPE            type;           /* ACPI object type */ \
-       ACPI_NAME                   name            /* ACPI object Name */
-
-
-typedef struct
-{
-       ACPI_COMMON_OBJ_INFO;
-} ACPI_OBJ_INFO_HEADER;
-
-
-typedef struct
-{
-       ACPI_COMMON_OBJ_INFO;
-
-       u32                         valid;              /*  Are the next bits legit? */
-       NATIVE_CHAR                 hardware_id [9];    /*  _HID value if any */
-       NATIVE_CHAR                 unique_id[9];       /*  _UID value if any */
-       ACPI_INTEGER                address;            /*  _ADR value if any */
-       u32                         current_status;     /*  _STA value */
-} ACPI_DEVICE_INFO;
-
-
-/* Context structs for address space handlers */
-
-typedef struct
-{
-       u32                         seg;
-       u32                         bus;
-       u32                         dev_func;
-} PCI_HANDLER_CONTEXT;
-
-
-typedef struct
-{
-       ACPI_PHYSICAL_ADDRESS       mapped_physical_address;
-       u8                          *mapped_logical_address;
-       u32                         mapped_length;
-} MEM_HANDLER_CONTEXT;
-
-
-/*
- * C-state handler
- */
-
-typedef ACPI_STATUS (*ACPI_C_STATE_HANDLER) (ACPI_IO_ADDRESS, u32*);
-
-
-/*
- * Definitions for Resource Attributes
- */
-
-/*
- *  Memory Attributes
- */
-#define READ_ONLY_MEMORY                (u8) 0x00
-#define READ_WRITE_MEMORY               (u8) 0x01
-
-#define NON_CACHEABLE_MEMORY            (u8) 0x00
-#define CACHABLE_MEMORY                 (u8) 0x01
-#define WRITE_COMBINING_MEMORY          (u8) 0x02
-#define PREFETCHABLE_MEMORY             (u8) 0x03
-
-/*
- *  IO Attributes
- *  The ISA IO ranges are: n000-n0FFh,  n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh.
- *  The non-ISA IO ranges are: n100-n3_fFh, n500-n7_fFh, n900-n_bFFh, n_cD0-n_fFFh.
- */
-#define NON_ISA_ONLY_RANGES             (u8) 0x01
-#define ISA_ONLY_RANGES                 (u8) 0x02
-#define ENTIRE_RANGE                    (NON_ISA_ONLY_RANGES | ISA_ONLY_RANGES)
-
-/*
- *  IO Port Descriptor Decode
- */
-#define DECODE_10                       (u8) 0x00    /* 10-bit IO address decode */
-#define DECODE_16                       (u8) 0x01    /* 16-bit IO address decode */
-
-/*
- *  IRQ Attributes
- */
-#define EDGE_SENSITIVE                  (u8) 0x00
-#define LEVEL_SENSITIVE                 (u8) 0x01
-
-#define ACTIVE_HIGH                     (u8) 0x00
-#define ACTIVE_LOW                      (u8) 0x01
-
-#define EXCLUSIVE                       (u8) 0x00
-#define SHARED                          (u8) 0x01
-
-/*
- *  DMA Attributes
- */
-#define COMPATIBILITY                   (u8) 0x00
-#define TYPE_A                          (u8) 0x01
-#define TYPE_B                          (u8) 0x02
-#define TYPE_F                          (u8) 0x03
-
-#define NOT_BUS_MASTER                  (u8) 0x00
-#define BUS_MASTER                      (u8) 0x01
-
-#define TRANSFER_8                      (u8) 0x00
-#define TRANSFER_8_16                   (u8) 0x01
-#define TRANSFER_16                     (u8) 0x02
-
-/*
- * Start Dependent Functions Priority definitions
- */
-#define GOOD_CONFIGURATION              (u8) 0x00
-#define ACCEPTABLE_CONFIGURATION        (u8) 0x01
-#define SUB_OPTIMAL_CONFIGURATION       (u8) 0x02
-
-/*
- *  16, 32 and 64-bit Address Descriptor resource types
- */
-#define MEMORY_RANGE                    (u8) 0x00
-#define IO_RANGE                        (u8) 0x01
-#define BUS_NUMBER_RANGE                (u8) 0x02
-
-#define ADDRESS_NOT_FIXED               (u8) 0x00
-#define ADDRESS_FIXED                   (u8) 0x01
-
-#define POS_DECODE                      (u8) 0x00
-#define SUB_DECODE                      (u8) 0x01
-
-#define PRODUCER                        (u8) 0x00
-#define CONSUMER                        (u8) 0x01
-
-
-/*
- *  Structures used to describe device resources
- */
-typedef struct
-{
-       u32                         edge_level;
-       u32                         active_high_low;
-       u32                         shared_exclusive;
-       u32                         number_of_interrupts;
-       u32                         interrupts[1];
-
-} IRQ_RESOURCE;
-
-typedef struct
-{
-       u32                         type;
-       u32                         bus_master;
-       u32                         transfer;
-       u32                         number_of_channels;
-       u32                         channels[1];
-
-} DMA_RESOURCE;
-
-typedef struct
-{
-       u32                         compatibility_priority;
-       u32                         performance_robustness;
-
-} START_DEPENDENT_FUNCTIONS_RESOURCE;
-
-/*
- * END_DEPENDENT_FUNCTIONS_RESOURCE struct is not
- *  needed because it has no fields
- */
-
-typedef struct
-{
-       u32                         io_decode;
-       u32                         min_base_address;
-       u32                         max_base_address;
-       u32                         alignment;
-       u32                         range_length;
-
-} IO_RESOURCE;
-
-typedef struct
-{
-       u32                         base_address;
-       u32                         range_length;
-
-} FIXED_IO_RESOURCE;
-
-typedef struct
-{
-       u32                         length;
-       u8                          reserved[1];
-
-} VENDOR_RESOURCE;
-
-typedef struct
-{
-       u32                         read_write_attribute;
-       u32                         min_base_address;
-       u32                         max_base_address;
-       u32                         alignment;
-       u32                         range_length;
-
-} MEMORY24_RESOURCE;
-
-typedef struct
-{
-       u32                         read_write_attribute;
-       u32                         min_base_address;
-       u32                         max_base_address;
-       u32                         alignment;
-       u32                         range_length;
-
-} MEMORY32_RESOURCE;
-
-typedef struct
-{
-       u32                         read_write_attribute;
-       u32                         range_base_address;
-       u32                         range_length;
-
-} FIXED_MEMORY32_RESOURCE;
-
-typedef struct
-{
-       u16                         cache_attribute;
-       u16                         read_write_attribute;
-
-} MEMORY_ATTRIBUTE;
-
-typedef struct
-{
-       u16                         range_attribute;
-       u16                         reserved;
-
-} IO_ATTRIBUTE;
-
-typedef struct
-{
-       u16                         reserved1;
-       u16                         reserved2;
-
-} BUS_ATTRIBUTE;
-
-typedef union
-{
-       MEMORY_ATTRIBUTE            memory;
-       IO_ATTRIBUTE                io;
-       BUS_ATTRIBUTE               bus;
-
-} ATTRIBUTE_DATA;
-
-typedef struct
-{
-       u32                         resource_type;
-       u32                         producer_consumer;
-       u32                         decode;
-       u32                         min_address_fixed;
-       u32                         max_address_fixed;
-       ATTRIBUTE_DATA              attribute;
-       u32                         granularity;
-       u32                         min_address_range;
-       u32                         max_address_range;
-       u32                         address_translation_offset;
-       u32                         address_length;
-       u32                         resource_source_index;
-       u32                         resource_source_string_length;
-       NATIVE_CHAR                 resource_source[1];
-
-} ADDRESS16_RESOURCE;
-
-typedef struct
-{
-       u32                         resource_type;
-       u32                         producer_consumer;
-       u32                         decode;
-       u32                         min_address_fixed;
-       u32                         max_address_fixed;
-       ATTRIBUTE_DATA              attribute;
-       u32                         granularity;
-       u32                         min_address_range;
-       u32                         max_address_range;
-       u32                         address_translation_offset;
-       u32                         address_length;
-       u32                         resource_source_index;
-       u32                         resource_source_string_length;
-       NATIVE_CHAR                 resource_source[1];
-
-} ADDRESS32_RESOURCE;
-
-typedef struct
-{
-       u32                         producer_consumer;
-       u32                         edge_level;
-       u32                         active_high_low;
-       u32                         shared_exclusive;
-       u32                         number_of_interrupts;
-       u32                         interrupts[1];
-       u32                         resource_source_index;
-       u32                         resource_source_string_length;
-       NATIVE_CHAR                 resource_source[1];
-
-} EXTENDED_IRQ_RESOURCE;
-
-typedef enum
-{
-       irq,
-       dma,
-       start_dependent_functions,
-       end_dependent_functions,
-       io,
-       fixed_io,
-       vendor_specific,
-       end_tag,
-       memory24,
-       memory32,
-       fixed_memory32,
-       address16,
-       address32,
-       extended_irq
-} RESOURCE_TYPE;
-
-typedef union
-{
-       IRQ_RESOURCE                        irq;
-       DMA_RESOURCE                        dma;
-       START_DEPENDENT_FUNCTIONS_RESOURCE  start_dependent_functions;
-       IO_RESOURCE                         io;
-       FIXED_IO_RESOURCE                   fixed_io;
-       VENDOR_RESOURCE                     vendor_specific;
-       MEMORY24_RESOURCE                   memory24;
-       MEMORY32_RESOURCE                   memory32;
-       FIXED_MEMORY32_RESOURCE             fixed_memory32;
-       ADDRESS16_RESOURCE                  address16;
-       ADDRESS32_RESOURCE                  address32;
-       EXTENDED_IRQ_RESOURCE               extended_irq;
-} RESOURCE_DATA;
-
-typedef struct _resource_tag
-{
-       RESOURCE_TYPE               id;
-       u32                         length;
-       RESOURCE_DATA               data;
-} RESOURCE;
-
-#define RESOURCE_LENGTH                 12
-#define RESOURCE_LENGTH_NO_DATA         8
-
-#define NEXT_RESOURCE(res)    (RESOURCE*)((u8*) res + res->length)
-
-/*
- * END: Definitions for Resource Attributes
- */
-
-
-typedef struct pci_routing_table
-{
-       u32                         length;
-       u32                         pin;
-       ACPI_INTEGER                address;        /* here for 64-bit alignment */
-       u32                         source_index;
-       NATIVE_CHAR                 source[4];      /* pad to 64 bits so sizeof() works in all cases */
-
-} PCI_ROUTING_TABLE;
-
-
-/*
- * END: Definitions for PCI Routing tables
- */
-
-#endif /* __ACTYPES_H__ */
diff --git a/reactos/drivers/bus/acpi/include/amlcode.h b/reactos/drivers/bus/acpi/include/amlcode.h
deleted file mode 100644 (file)
index 917722d..0000000
+++ /dev/null
@@ -1,420 +0,0 @@
-/******************************************************************************
- *
- * Name: amlcode.h - Definitions for AML, as included in "definition blocks"
- *                   Declarations and definitions contained herein are derived
- *                   directly from the ACPI specification.
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __AMLCODE_H__
-#define __AMLCODE_H__
-
-
-/* primary opcodes */
-
-#define AML_NULL_CHAR               (u16) 0x00
-
-#define AML_ZERO_OP                 (u16) 0x00
-#define AML_ONE_OP                  (u16) 0x01
-#define AML_UNASSIGNED              (u16) 0x02
-#define AML_ALIAS_OP                (u16) 0x06
-#define AML_NAME_OP                 (u16) 0x08
-#define AML_BYTE_OP                 (u16) 0x0a
-#define AML_WORD_OP                 (u16) 0x0b
-#define AML_DWORD_OP                (u16) 0x0c
-#define AML_STRING_OP               (u16) 0x0d
-#define AML_QWORD_OP                (u16) 0x0e     /* ACPI 2.0 */
-#define AML_SCOPE_OP                (u16) 0x10
-#define AML_BUFFER_OP               (u16) 0x11
-#define AML_PACKAGE_OP              (u16) 0x12
-#define AML_VAR_PACKAGE_OP          (u16) 0x13     /* ACPI 2.0 */
-#define AML_METHOD_OP               (u16) 0x14
-#define AML_DUAL_NAME_PREFIX        (u16) 0x2e
-#define AML_MULTI_NAME_PREFIX_OP    (u16) 0x2f
-#define AML_NAME_CHAR_SUBSEQ        (u16) 0x30
-#define AML_NAME_CHAR_FIRST         (u16) 0x41
-#define AML_OP_PREFIX               (u16) 0x5b
-#define AML_ROOT_PREFIX             (u16) 0x5c
-#define AML_PARENT_PREFIX           (u16) 0x5e
-#define AML_LOCAL_OP                (u16) 0x60
-#define AML_LOCAL0                  (u16) 0x60
-#define AML_LOCAL1                  (u16) 0x61
-#define AML_LOCAL2                  (u16) 0x62
-#define AML_LOCAL3                  (u16) 0x63
-#define AML_LOCAL4                  (u16) 0x64
-#define AML_LOCAL5                  (u16) 0x65
-#define AML_LOCAL6                  (u16) 0x66
-#define AML_LOCAL7                  (u16) 0x67
-#define AML_ARG_OP                  (u16) 0x68
-#define AML_ARG0                    (u16) 0x68
-#define AML_ARG1                    (u16) 0x69
-#define AML_ARG2                    (u16) 0x6a
-#define AML_ARG3                    (u16) 0x6b
-#define AML_ARG4                    (u16) 0x6c
-#define AML_ARG5                    (u16) 0x6d
-#define AML_ARG6                    (u16) 0x6e
-#define AML_STORE_OP                (u16) 0x70
-#define AML_REF_OF_OP               (u16) 0x71
-#define AML_ADD_OP                  (u16) 0x72
-#define AML_CONCAT_OP               (u16) 0x73
-#define AML_SUBTRACT_OP             (u16) 0x74
-#define AML_INCREMENT_OP            (u16) 0x75
-#define AML_DECREMENT_OP            (u16) 0x76
-#define AML_MULTIPLY_OP             (u16) 0x77
-#define AML_DIVIDE_OP               (u16) 0x78
-#define AML_SHIFT_LEFT_OP           (u16) 0x79
-#define AML_SHIFT_RIGHT_OP          (u16) 0x7a
-#define AML_BIT_AND_OP              (u16) 0x7b
-#define AML_BIT_NAND_OP             (u16) 0x7c
-#define AML_BIT_OR_OP               (u16) 0x7d
-#define AML_BIT_NOR_OP              (u16) 0x7e
-#define AML_BIT_XOR_OP              (u16) 0x7f
-#define AML_BIT_NOT_OP              (u16) 0x80
-#define AML_FIND_SET_LEFT_BIT_OP    (u16) 0x81
-#define AML_FIND_SET_RIGHT_BIT_OP   (u16) 0x82
-#define AML_DEREF_OF_OP             (u16) 0x83
-#define AML_CONCAT_RES_OP           (u16) 0x84     /* ACPI 2.0 */
-#define AML_MOD_OP                  (u16) 0x85     /* ACPI 2.0 */
-#define AML_NOTIFY_OP               (u16) 0x86
-#define AML_SIZE_OF_OP              (u16) 0x87
-#define AML_INDEX_OP                (u16) 0x88
-#define AML_MATCH_OP                (u16) 0x89
-#define AML_DWORD_FIELD_OP          (u16) 0x8a
-#define AML_WORD_FIELD_OP           (u16) 0x8b
-#define AML_BYTE_FIELD_OP           (u16) 0x8c
-#define AML_BIT_FIELD_OP            (u16) 0x8d
-#define AML_TYPE_OP                 (u16) 0x8e
-#define AML_QWORD_FIELD_OP          (u16) 0x8f     /* ACPI 2.0 */
-#define AML_LAND_OP                 (u16) 0x90
-#define AML_LOR_OP                  (u16) 0x91
-#define AML_LNOT_OP                 (u16) 0x92
-#define AML_LEQUAL_OP               (u16) 0x93
-#define AML_LGREATER_OP             (u16) 0x94
-#define AML_LLESS_OP                (u16) 0x95
-#define AML_TO_BUFFER_OP            (u16) 0x96     /* ACPI 2.0 */
-#define AML_TO_DECSTRING_OP         (u16) 0x97     /* ACPI 2.0 */
-#define AML_TO_HEXSTRING_OP         (u16) 0x98     /* ACPI 2.0 */
-#define AML_TO_INTEGER_OP           (u16) 0x99     /* ACPI 2.0 */
-#define AML_TO_STRING_OP            (u16) 0x9c     /* ACPI 2.0 */
-#define AML_COPY_OP                 (u16) 0x9d     /* ACPI 2.0 */
-#define AML_MID_OP                  (u16) 0x9e     /* ACPI 2.0 */
-#define AML_CONTINUE_OP             (u16) 0x9f     /* ACPI 2.0 */
-#define AML_IF_OP                   (u16) 0xa0
-#define AML_ELSE_OP                 (u16) 0xa1
-#define AML_WHILE_OP                (u16) 0xa2
-#define AML_NOOP_OP                 (u16) 0xa3
-#define AML_RETURN_OP               (u16) 0xa4
-#define AML_BREAK_OP                (u16) 0xa5
-#define AML_BREAK_POINT_OP          (u16) 0xcc
-#define AML_ONES_OP                 (u16) 0xff
-
-/* prefixed opcodes */
-
-#define AML_EXTOP                   (u16) 0x005b
-
-
-#define AML_MUTEX_OP                (u16) 0x5b01
-#define AML_EVENT_OP                (u16) 0x5b02
-#define AML_SHIFT_RIGHT_BIT_OP      (u16) 0x5b10
-#define AML_SHIFT_LEFT_BIT_OP       (u16) 0x5b11
-#define AML_COND_REF_OF_OP          (u16) 0x5b12
-#define AML_CREATE_FIELD_OP         (u16) 0x5b13
-#define AML_LOAD_TABLE_OP           (u16) 0x5b1f     /* ACPI 2.0 */
-#define AML_LOAD_OP                 (u16) 0x5b20
-#define AML_STALL_OP                (u16) 0x5b21
-#define AML_SLEEP_OP                (u16) 0x5b22
-#define AML_ACQUIRE_OP              (u16) 0x5b23
-#define AML_SIGNAL_OP               (u16) 0x5b24
-#define AML_WAIT_OP                 (u16) 0x5b25
-#define AML_RESET_OP                (u16) 0x5b26
-#define AML_RELEASE_OP              (u16) 0x5b27
-#define AML_FROM_BCD_OP             (u16) 0x5b28
-#define AML_TO_BCD_OP               (u16) 0x5b29
-#define AML_UNLOAD_OP               (u16) 0x5b2a
-#define AML_REVISION_OP             (u16) 0x5b30
-#define AML_DEBUG_OP                (u16) 0x5b31
-#define AML_FATAL_OP                (u16) 0x5b32
-#define AML_REGION_OP               (u16) 0x5b80
-#define AML_DEF_FIELD_OP            (u16) 0x5b81
-#define AML_DEVICE_OP               (u16) 0x5b82
-#define AML_PROCESSOR_OP            (u16) 0x5b83
-#define AML_POWER_RES_OP            (u16) 0x5b84
-#define AML_THERMAL_ZONE_OP         (u16) 0x5b85
-#define AML_INDEX_FIELD_OP          (u16) 0x5b86
-#define AML_BANK_FIELD_OP           (u16) 0x5b87
-#define AML_DATA_REGION_OP          (u16) 0x5b88     /* ACPI 2.0 */
-
-
-/* Bogus opcodes (they are actually two separate opcodes) */
-
-#define AML_LGREATEREQUAL_OP        (u16) 0x9295
-#define AML_LLESSEQUAL_OP           (u16) 0x9294
-#define AML_LNOTEQUAL_OP            (u16) 0x9293
-
-
-/*
- * Internal opcodes
- * Use only "Unknown" AML opcodes, don't attempt to use
- * any valid ACPI ASCII values (A-Z, 0-9, '-')
- */
-
-#define AML_NAMEPATH_OP             (u16) 0x002d
-#define AML_NAMEDFIELD_OP           (u16) 0x0030
-#define AML_RESERVEDFIELD_OP        (u16) 0x0031
-#define AML_ACCESSFIELD_OP          (u16) 0x0032
-#define AML_BYTELIST_OP             (u16) 0x0033
-#define AML_STATICSTRING_OP         (u16) 0x0034
-#define AML_METHODCALL_OP           (u16) 0x0035
-#define AML_RETURN_VALUE_OP         (u16) 0x0036
-
-
-#define ARG_NONE                    0x0
-
-/*
- * Argument types for the AML Parser
- * Each field in the Arg_types u32 is 5 bits, allowing for a maximum of 6 arguments.
- * There can be up to 31 unique argument types
- */
-
-#define ARGP_BYTEDATA               0x01
-#define ARGP_BYTELIST               0x02
-#define ARGP_CHARLIST               0x03
-#define ARGP_DATAOBJ                0x04
-#define ARGP_DATAOBJLIST            0x05
-#define ARGP_DWORDDATA              0x06
-#define ARGP_FIELDLIST              0x07
-#define ARGP_NAME                   0x08
-#define ARGP_NAMESTRING             0x09
-#define ARGP_OBJLIST                0x0A
-#define ARGP_PKGLENGTH              0x0B
-#define ARGP_SUPERNAME              0x0C
-#define ARGP_TARGET                 0x0D
-#define ARGP_TERMARG                0x0E
-#define ARGP_TERMLIST               0x0F
-#define ARGP_WORDDATA               0x10
-#define ARGP_QWORDDATA              0x11
-#define ARGP_SIMPLENAME             0x12
-
-/*
- * Resolved argument types for the AML Interpreter
- * Each field in the Arg_types u32 is 5 bits, allowing for a maximum of 6 arguments.
- * There can be up to 31 unique argument types (0 is end-of-arg-list indicator)
- */
-
-/* "Standard" ACPI types are 1-15 (0x0F) */
-
-#define ARGI_INTEGER                 ACPI_TYPE_INTEGER        /* 1 */
-#define ARGI_STRING                 ACPI_TYPE_STRING        /* 2 */
-#define ARGI_BUFFER                 ACPI_TYPE_BUFFER        /* 3 */
-#define ARGI_PACKAGE                ACPI_TYPE_PACKAGE       /* 4 */
-#define ARGI_EVENT                  ACPI_TYPE_EVENT
-#define ARGI_MUTEX                  ACPI_TYPE_MUTEX
-#define ARGI_REGION                 ACPI_TYPE_REGION
-#define ARGI_DDBHANDLE              ACPI_TYPE_DDB_HANDLE
-
-/* Custom types are 0x10 through 0x1F */
-
-#define ARGI_IF                     0x10
-#define ARGI_ANYOBJECT              0x11
-#define ARGI_ANYTYPE                0x12
-#define ARGI_COMPUTEDATA            0x13     /* Buffer, String, or Integer */
-#define ARGI_DATAOBJECT             0x14     /* Buffer, string, package or reference to a Node - Used only by Size_of operator*/
-#define ARGI_COMPLEXOBJ             0x15     /* Buffer or package */
-#define ARGI_INTEGER_REF            0x16
-#define ARGI_OBJECT_REF             0x17
-#define ARGI_DEVICE_REF             0x18
-#define ARGI_REFERENCE              0x19
-#define ARGI_TARGETREF              0x1A     /* Target, subject to implicit conversion */
-#define ARGI_FIXED_TARGET           0x1B     /* Target, no implicit conversion */
-#define ARGI_SIMPLE_TARGET          0x1C     /* Name, Local, Arg -- no implicit conversion */
-#define ARGI_BUFFERSTRING           0x1D
-
-#define ARGI_INVALID_OPCODE         0xFFFFFFFF
-
-
-/*
- * hash offsets
- */
-#define AML_EXTOP_HASH_OFFSET       22
-#define AML_LNOT_HASH_OFFSET        19
-
-
-/*
- * opcode groups and types
- */
-
-#define OPGRP_NAMED                 0x01
-#define OPGRP_FIELD                 0x02
-#define OPGRP_BYTELIST              0x04
-
-#define OPTYPE_UNDEFINED            0
-
-
-#define OPTYPE_LITERAL              1
-#define OPTYPE_CONSTANT             2
-#define OPTYPE_METHOD_ARGUMENT      3
-#define OPTYPE_LOCAL_VARIABLE       4
-#define OPTYPE_DATA_TERM            5
-
-/* Type 1 opcodes */
-
-#define OPTYPE_MONADIC1             6
-#define OPTYPE_DYADIC1              7
-
-
-/* Type 2 opcodes */
-
-#define OPTYPE_MONADIC2             8
-#define OPTYPE_MONADIC2_r            9
-#define OPTYPE_DYADIC2              10
-#define OPTYPE_DYADIC2_r             11
-#define OPTYPE_DYADIC2_s             12
-#define OPTYPE_INDEX                13
-#define OPTYPE_MATCH                14
-
-/* Generic for an op that returns a value */
-
-#define OPTYPE_METHOD_CALL          15
-
-
-/* Misc */
-
-#define OPTYPE_CREATE_FIELD         16
-#define OPTYPE_FATAL                17
-#define OPTYPE_CONTROL              18
-#define OPTYPE_RECONFIGURATION      19
-#define OPTYPE_NAMED_OBJECT         20
-#define OPTYPE_RETURN               21
-
-#define OPTYPE_BOGUS                22
-
-
-/* Predefined Operation Region Space_iDs */
-
-typedef enum
-{
-       REGION_MEMORY               = 0,
-       REGION_IO,
-       REGION_PCI_CONFIG,
-       REGION_EC,
-       REGION_SMBUS,
-       REGION_CMOS,
-       REGION_PCI_BAR
-
-} AML_REGION_TYPES;
-
-
-/* Comparison operation codes for Match_op operator */
-
-typedef enum
-{
-       MATCH_MTR                   = 0,
-       MATCH_MEQ                   = 1,
-       MATCH_MLE                   = 2,
-       MATCH_MLT                   = 3,
-       MATCH_MGE                   = 4,
-       MATCH_MGT                   = 5
-
-} AML_MATCH_OPERATOR;
-
-#define MAX_MATCH_OPERATOR      5
-
-
-/* Field Access Types */
-
-#define ACCESS_TYPE_MASK        0x0f
-#define ACCESS_TYPE_SHIFT       0
-
-typedef enum
-{
-       ACCESS_ANY_ACC              = 0,
-       ACCESS_BYTE_ACC             = 1,
-       ACCESS_WORD_ACC             = 2,
-       ACCESS_DWORD_ACC            = 3,
-       ACCESS_BLOCK_ACC            = 4,
-       ACCESS_SMBSEND_RECV_ACC     = 5,
-       ACCESS_SMBQUICK_ACC         = 6
-
-} AML_ACCESS_TYPE;
-
-
-/* Field Lock Rules */
-
-#define LOCK_RULE_MASK          0x10
-#define LOCK_RULE_SHIFT         4
-
-typedef enum
-{
-       GLOCK_NEVER_LOCK            = 0,
-       GLOCK_ALWAYS_LOCK           = 1
-
-} AML_LOCK_RULE;
-
-
-/* Field Update Rules */
-
-#define UPDATE_RULE_MASK        0x060
-#define UPDATE_RULE_SHIFT       5
-
-typedef enum
-{
-       UPDATE_PRESERVE             = 0,
-       UPDATE_WRITE_AS_ONES        = 1,
-       UPDATE_WRITE_AS_ZEROS       = 2
-
-} AML_UPDATE_RULE;
-
-
-/* bit fields in Method_flags byte */
-
-#define METHOD_FLAGS_ARG_COUNT      0x07
-#define METHOD_FLAGS_SERIALIZED     0x08
-#define METHOD_FLAGS_SYNCH_LEVEL    0xF0
-
-
-/* Array sizes.  Used for range checking also */
-
-#define NUM_REGION_TYPES        7
-#define NUM_ACCESS_TYPES        7
-#define NUM_UPDATE_RULES        3
-#define NUM_MATCH_OPS           7
-#define NUM_OPCODES             256
-#define NUM_FIELD_NAMES         2
-
-
-#define USER_REGION_BEGIN       0x80
-
-/*
- * AML tables
- */
-
-#ifdef DEFINE_AML_GLOBALS
-
-/* External declarations of the AML tables */
-
-extern u8                       acpi_gbl_aml            [NUM_OPCODES];
-extern u16                      acpi_gbl_pfx            [NUM_OPCODES];
-
-
-#endif /* DEFINE_AML_GLOBALS */
-
-#endif /* __AMLCODE_H__ */
diff --git a/reactos/drivers/bus/acpi/include/platform/acenv.h b/reactos/drivers/bus/acpi/include/platform/acenv.h
deleted file mode 100644 (file)
index 9679222..0000000
+++ /dev/null
@@ -1,288 +0,0 @@
-/******************************************************************************
- *
- * Name: acenv.h - Generation environment specific items
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACENV_H__
-#define __ACENV_H__
-
-
-/*
- * Configuration for ACPI tools and utilities
- */
-
-#ifdef _ACPI_DUMP_APP
-#define ACPI_DEBUG
-#define ACPI_APPLICATION
-#define ENABLE_DEBUGGER
-#define ACPI_USE_SYSTEM_CLIBRARY
-#define PARSER_ONLY
-#endif
-
-#ifdef _ACPI_EXEC_APP
-#undef DEBUGGER_THREADING
-#define DEBUGGER_THREADING      DEBUGGER_SINGLE_THREADED
-#define ACPI_DEBUG
-#define ACPI_APPLICATION
-#define ENABLE_DEBUGGER
-#define ACPI_USE_SYSTEM_CLIBRARY
-#endif
-
-#ifdef _ACPI_ASL_COMPILER
-#define ACPI_DEBUG
-#define ACPI_APPLICATION
-#define ENABLE_DEBUGGER
-#define ACPI_USE_SYSTEM_CLIBRARY
-#endif
-
-/*
- * Memory allocation tracking.  Used only if
- * 1) This is the debug version
- * 2) This is NOT a 16-bit version of the code (not enough real-mode memory)
- */
-#ifdef ACPI_DEBUG
-#ifndef _IA16
-#define ACPI_DEBUG_TRACK_ALLOCATIONS
-#endif
-#endif
-
-/*
- * Environment configuration.  The purpose of this file is to interface to the
- * local generation environment.
- *
- * 1) ACPI_USE_SYSTEM_CLIBRARY - Define this if linking to an actual C library.
- *      Otherwise, local versions of string/memory functions will be used.
- * 2) ACPI_USE_STANDARD_HEADERS - Define this if linking to a C library and
- *      the standard header files may be used.
- *
- * The ACPI subsystem only uses low level C library functions that do not call
- * operating system services and may therefore be inlined in the code.
- *
- * It may be necessary to tailor these include files to the target
- * generation environment.
- *
- *
- * Functions and constants used from each header:
- *
- * string.h:    memcpy
- *              memset
- *              strcat
- *              strcmp
- *              strcpy
- *              strlen
- *              strncmp
- *              strncat
- *              strncpy
- *
- * stdlib.h:    strtoul
- *
- * stdarg.h:    va_list
- *              va_arg
- *              va_start
- *              va_end
- *
- */
-
-/*! [Begin] no source code translation */
-
-#ifdef _LINUX
-#include "aclinux.h"
-
-#elif _AED_EFI
-#include "acefi.h"
-
-#elif WIN32
-#include "acwin.h"
-
-#elif __FreeBSD__
-#include "acfreebsd.h"
-
-#else
-
-/* All other environments */
-
-#define ACPI_USE_STANDARD_HEADERS
-
-/* Name of host operating system (returned by the _OS_ namespace object) */
-
-#define ACPI_OS_NAME         "Intel ACPI/CA Core Subsystem"
-
-#endif
-
-
-/*! [End] no source code translation !*/
-
-/******************************************************************************
- *
- * C library configuration
- *
- *****************************************************************************/
-
-#ifdef ACPI_USE_SYSTEM_CLIBRARY
-/*
- * Use the standard C library headers.
- * We want to keep these to a minimum.
- *
- */
-
-#ifdef ACPI_USE_STANDARD_HEADERS
-/*
- * Use the standard headers from the standard locations
- */
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#endif /* ACPI_USE_STANDARD_HEADERS */
-
-/*
- * We will be linking to the standard Clib functions
- */
-
-#define STRSTR(s1,s2)   strstr((s1), (s2))
-#define STRUPR(s)       strupr((s))
-#define STRLEN(s)       (u32) strlen((s))
-#define STRCPY(d,s)     strcpy((d), (s))
-#define STRNCPY(d,s,n)  strncpy((d), (s), (NATIVE_INT)(n))
-#define STRNCMP(d,s,n)  strncmp((d), (s), (NATIVE_INT)(n))
-#define STRCMP(d,s)     strcmp((d), (s))
-#define STRCAT(d,s)     strcat((d), (s))
-#define STRNCAT(d,s,n)  strncat((d), (s), (NATIVE_INT)(n))
-#define STRTOUL(d,s,n)  strtoul((d), (s), (NATIVE_INT)(n))
-#define MEMCPY(d,s,n)   memcpy((d), (s), (NATIVE_INT)(n))
-#define MEMSET(d,s,n)   memset((d), (s), (NATIVE_INT)(n))
-#define TOUPPER         toupper
-#define TOLOWER         tolower
-#define IS_XDIGIT       isxdigit
-
-/******************************************************************************
- *
- * Not using native C library, use local implementations
- *
- *****************************************************************************/
-#else
-
-/*
- * Use local definitions of C library macros and functions
- * NOTE: The function implementations may not be as efficient
- * as an inline or assembly code implementation provided by a
- * native C library.
- */
-
-#ifndef va_arg
-
-#ifndef _VALIST
-#define _VALIST
-typedef char *va_list;
-#endif /* _VALIST */
-
-/*
- * Storage alignment properties
- */
-
-#define  _AUPBND         (sizeof (NATIVE_INT) - 1)
-#define  _ADNBND         (sizeof (NATIVE_INT) - 1)
-
-/*
- * Variable argument list macro definitions
- */
-
-#define _bnd(X, bnd)    (((sizeof (X)) + (bnd)) & (~(bnd)))
-#define va_arg(ap, T)   (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
-#define va_end(ap)      (void) 0
-#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
-
-#endif /* va_arg */
-
-
-#define STRSTR(s1,s2)    acpi_cm_strstr ((s1), (s2))
-#define STRUPR(s)        acpi_cm_strupr ((s))
-#define STRLEN(s)        acpi_cm_strlen ((s))
-#define STRCPY(d,s)      acpi_cm_strcpy ((d), (s))
-#define STRNCPY(d,s,n)   acpi_cm_strncpy ((d), (s), (n))
-#define STRNCMP(d,s,n)   acpi_cm_strncmp ((d), (s), (n))
-#define STRCMP(d,s)      acpi_cm_strcmp ((d), (s))
-#define STRCAT(d,s)      acpi_cm_strcat ((d), (s))
-#define STRNCAT(d,s,n)   acpi_cm_strncat ((d), (s), (n))
-#define STRTOUL(d,s,n)   acpi_cm_strtoul ((d), (s),(n))
-#define MEMCPY(d,s,n)    acpi_cm_memcpy ((d), (s), (n))
-#define MEMSET(d,v,n)    acpi_cm_memset ((d), (v), (n))
-#define TOUPPER          acpi_cm_to_upper
-#define TOLOWER          acpi_cm_to_lower
-
-#endif /* ACPI_USE_SYSTEM_CLIBRARY */
-
-
-/******************************************************************************
- *
- * Assembly code macros
- *
- *****************************************************************************/
-
-/*
- * Handle platform- and compiler-specific assembly language differences.
- * These should already have been defined by the platform includes above.
- *
- * Notes:
- * 1) Interrupt 3 is used to break into a debugger
- * 2) Interrupts are turned off during ACPI register setup
- */
-
-/* Unrecognized compiler, use defaults */
-#ifndef ACPI_ASM_MACROS
-
-#define ACPI_ASM_MACROS
-#define causeinterrupt(level)
-#define BREAKPOINT3
-#define disable()
-#define enable()
-#define halt()
-#define ACPI_ACQUIRE_GLOBAL_LOCK(Glptr, acq)
-#define ACPI_RELEASE_GLOBAL_LOCK(Glptr, acq)
-
-#endif /* ACPI_ASM_MACROS */
-
-
-#ifdef ACPI_APPLICATION
-
-/* Don't want software interrupts within a ring3 application */
-
-#undef causeinterrupt
-#undef BREAKPOINT3
-#define causeinterrupt(level)
-#define BREAKPOINT3
-#endif
-
-
-/******************************************************************************
- *
- * Compiler-specific
- *
- *****************************************************************************/
-
-/* this has been moved to compiler-specific headers, which are included from the
-   platform header. */
-
-
-#endif /* __ACENV_H__ */
diff --git a/reactos/drivers/bus/acpi/include/platform/acgcc.h b/reactos/drivers/bus/acpi/include/platform/acgcc.h
deleted file mode 100644 (file)
index bf8f507..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-/******************************************************************************
- *
- * Name: acgcc.h - GCC specific defines, etc.
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACGCC_H__
-#define __ACGCC_H__
-
-
-#ifdef __ia64__
-#define _IA64
-
-#define COMPILER_DEPENDENT_UINT64   unsigned long
-/* Single threaded */
-#define ACPI_APPLICATION
-
-#define ACPI_ASM_MACROS
-#define causeinterrupt(level)
-#define BREAKPOINT3
-#define disable() __cli()
-#define enable()  __sti()
-#define wbinvd()
-
-/*! [Begin] no source code translation */
-
-#include <asm/pal.h>
-
-#define halt()              ia64_pal_halt_light()           /* PAL_HALT[_LIGHT] */
-#define safe_halt()         ia64_pal_halt(1)                /* PAL_HALT */
-
-
-#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
-       do { \
-       __asm__ volatile ("1:  ld4      r29=%1\n"  \
-               ";;\n"                  \
-               "mov    ar.ccv=r29\n"   \
-               "mov    r2=r29\n"       \
-               "shr.u  r30=r29,1\n"    \
-               "and    r29=-4,r29\n"   \
-               ";;\n"                  \
-               "add    r29=2,r29\n"    \
-               "and    r30=1,r30\n"    \
-               ";;\n"                  \
-               "add    r29=r29,r30\n"  \
-               ";;\n"                  \
-               "cmpxchg4.acq   r30=%1,r29,ar.ccv\n" \
-               ";;\n"                  \
-               "cmp.eq p6,p7=r2,r30\n" \
-               "(p7) br.dpnt.few 1b\n" \
-               "cmp.gt p8,p9=3,r29\n"  \
-               ";;\n"                  \
-               "(p8) mov %0=-1\n"      \
-               "(p9) mov %0=r0\n"      \
-               :"=r"(Acq):"m"(GLptr):"r2","r29","r30","memory"); \
-       } while (0)
-
-#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \
-       do { \
-       __asm__ volatile ("1:  ld4      r29=%1\n" \
-               ";;\n"                  \
-               "mov    ar.ccv=r29\n"   \
-               "mov    r2=r29\n"       \
-               "and    r29=-4,r29\n"   \
-               ";;\n"                  \
-               "cmpxchg4.acq   r30=%1,r29,ar.ccv\n" \
-               ";;\n"                  \
-               "cmp.eq p6,p7=r2,r30\n" \
-               "(p7) br.dpnt.few 1b\n" \
-               "and    %0=1,r2\n"      \
-               ";;\n"                  \
-               :"=r"(Acq):"m"(GLptr):"r2","r29","r30","memory"); \
-       } while (0)
-/*! [End] no source code translation !*/
-
-#elif defined (_AMD64_)
-
-#define COMPILER_DEPENDENT_UINT64   unsigned long long
-#define ACPI_ASM_MACROS
-#define causeinterrupt(level)
-#define BREAKPOINT3
-#define disable() __cli()
-#define enable()  __sti()
-#define halt()    __asm__ __volatile__ ("sti; hlt":::"memory")
-#define wbinvd()
-
-/*! [Begin] no source code translation
- *
- * A brief explanation as GNU inline assembly is a bit hairy
- *  %0 is the output parameter in EAX ("=a")
- *  %1 and %2 are the input parameters in ECX ("c")
- *  and an immediate value ("i") respectively
- *  All actual register references are preceded with "%%" as in "%%edx"
- *  Immediate values in the assembly are preceded by "$" as in "$0x1"
- *  The final asm parameter are the operation altered non-output registers.
- */
-// FIXME: These are only sonly stubs to make it compile
-
-#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
-       do { \
-               int dummy; \
-               asm("1:     movl (%1),%%eax;" \
-                       "movl   %%eax,%%edx;" \
-                       :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \
-       } while(0)
-
-#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \
-       do { \
-               int dummy; \
-               asm("1:     movl (%1),%%eax;" \
-                       "movl   %%eax,%%edx;" \
-                       :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \
-       } while(0)
-
-/*! [End] no source code translation !*/
-
-#else /* DO IA32 */
-
-#define COMPILER_DEPENDENT_UINT64   unsigned long long
-#define ACPI_ASM_MACROS
-#define causeinterrupt(level)
-#define BREAKPOINT3
-#define disable() __cli()
-#define enable()  __sti()
-#define halt()    __asm__ __volatile__ ("sti; hlt":::"memory")
-#define wbinvd()
-
-/*! [Begin] no source code translation
- *
- * A brief explanation as GNU inline assembly is a bit hairy
- *  %0 is the output parameter in EAX ("=a")
- *  %1 and %2 are the input parameters in ECX ("c")
- *  and an immediate value ("i") respectively
- *  All actual register references are preceded with "%%" as in "%%edx"
- *  Immediate values in the assembly are preceded by "$" as in "$0x1"
- *  The final asm parameter are the operation altered non-output registers.
- */
-#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
-       do { \
-               int dummy; \
-               asm("1:     movl (%1),%%eax;" \
-                       "movl   %%eax,%%edx;" \
-                       "andl   %2,%%edx;" \
-                       "btsl   $0x1,%%edx;" \
-                       "adcl   $0x0,%%edx;" \
-                       "lock;  cmpxchgl %%edx,(%1);" \
-                       "jnz    1b;" \
-                       "cmpb   $0x3,%%dl;" \
-                       "sbbl   %%eax,%%eax" \
-                       :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \
-       } while(0)
-
-#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \
-       do { \
-               int dummy; \
-               asm("1:     movl (%1),%%eax;" \
-                       "movl   %%eax,%%edx;" \
-                       "andl   %2,%%edx;" \
-                       "lock;  cmpxchgl %%edx,(%1);" \
-                       "jnz    1b;" \
-                       "andl   $0x1,%%eax" \
-                       :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \
-       } while(0)
-
-/*! [End] no source code translation !*/
-
-#endif /* IA 32 */
-
-#endif /* __ACGCC_H__ */
diff --git a/reactos/drivers/bus/acpi/include/platform/aclinux.h b/reactos/drivers/bus/acpi/include/platform/aclinux.h
deleted file mode 100644 (file)
index 81a6775..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/******************************************************************************
- *
- * Name: aclinux.h - OS specific defines, etc.
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACLINUX_H__
-#define __ACLINUX_H__
-
-#define ACPI_OS_NAME                "Linux"
-
-#undef ACPI_USE_SYSTEM_CLIBRARY
-
-#ifdef __KERNEL__
-
-#include <linux/config.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/ctype.h>
-#include <asm/system.h>
-#include <asm/atomic.h>
-#include <asm/div64.h>
-
-#else
-
-#include <stdarg.h>
-
-#endif
-
-/* Linux uses GCC */
-
-#include "acgcc.h"
-
-#undef DEBUGGER_THREADING
-#define DEBUGGER_THREADING          DEBUGGER_SINGLE_THREADED
-
-#ifndef _IA64
-/* Linux ia32 can't do int64 well */
-#define ACPI_NO_INTEGER64_SUPPORT
-/* And the ia32 kernel doesn't include 64-bit divide support */
-#define ACPI_DIV64(dividend, divisor) do_div(dividend, divisor)
-#else
-#define ACPI_DIV64(dividend, divisor) ACPI_DIVIDE(dividend, divisor)
-#endif
-
-
-#endif /* __ACLINUX_H__ */
diff --git a/reactos/drivers/bus/acpi/include/platform/acmsc.h b/reactos/drivers/bus/acpi/include/platform/acmsc.h
deleted file mode 100644 (file)
index 612edf9..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef __ACMSC_H__
-#define __ACMSC_H__
-
-#define COMPILER_DEPENDENT_UINT64 unsigned __int64
-
-#if defined(_M_IX86)
-
-#define ACPI_ASM_MACROS
-#define causeinterrupt(level)
-#define BREAKPOINT3
-#define halt() { __asm { sti } __asm { hlt } }
-#define wbinvd()
-
-__forceinline void _ACPI_ACQUIRE_GLOBAL_LOCK(void * GLptr, unsigned char * Acq_)
-{
-       unsigned char Acq;
-
-       __asm
-       {
-               mov ecx, [GLptr]
-
-       L1:     mov eax, [ecx]
-               mov edx, eax
-               and edx, ecx
-               bts edx, 1
-               adc edx, 0
-               lock cmpxchg [ecx], edx
-               jne L1
-               cmp dl, 3
-               sbb eax, eax
-
-               mov [Acq], al
-       };
-
-       *Acq_ = Acq;
-}
-
-#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
-       _ACPI_ACQUIRE_GLOBAL_LOCK((GLptr), (unsigned char *)&(Acq))
-
-__forceinline void _ACPI_RELEASE_GLOBAL_LOCK(void * GLptr, unsigned char * Acq_)
-{
-       unsigned char Acq;
-
-       __asm
-       {
-               mov ecx, [GLptr]
-
-       L1:     mov eax, [ecx]
-               mov edx, eax
-               and edx, ecx
-               lock cmpxchg [ecx], edx
-               jnz L1
-               and eax, 1
-
-               mov [Acq], al
-       };
-
-       *Acq_ = Acq;
-}
-
-#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \
-       _ACPI_RELEASE_GLOBAL_LOCK((GLptr), (unsigned char *)&(Acq))
-
-#endif
-
-#endif /* __ACMSC_H__ */
diff --git a/reactos/drivers/bus/acpi/include/platform/acwin.h b/reactos/drivers/bus/acpi/include/platform/acwin.h
deleted file mode 100644 (file)
index cfab772..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/******************************************************************************
- *
- * Name: aclinux.h - OS specific defines, etc.
- *       $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ACWIN_H__
-#define __ACWIN_H__
-
-#define ACPI_OS_NAME                "ReactOS"
-#define DEFINE_ALTERNATE_TYPES
-
-#undef ACPI_USE_SYSTEM_CLIBRARY
-
-#ifdef __KERNEL__
-
-#include <linux/config.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/ctype.h>
-#include <asm/system.h>
-#include <asm/atomic.h>
-#include <asm/div64.h>
-
-#else
-
-#include <stdarg.h>
-
-#endif
-
-#if defined(__GNUC__)
-
-#include "acgcc.h"
-
-#undef disable
-#define disable() __asm__("cli\n\t")
-#undef enable
-#define enable() __asm__("sti\n\t")
-
-#elif defined(_MSC_VER)
-
-#include "acmsc.h"
-
-#undef disable
-#define disable() __asm { cli }
-#undef enable
-#define enable() __asm { sti }
-
-#endif
-
-#undef DEBUGGER_THREADING
-#define DEBUGGER_THREADING          DEBUGGER_SINGLE_THREADED
-
-#ifndef _IA64
-/* Linux ia32 can't do int64 well */
-#define ACPI_NO_INTEGER64_SUPPORT
-/* And the ia32 kernel doesn't include 64-bit divide support */
-#define ACPI_DIV64(dividend, divisor) do_div(dividend, divisor)
-#else
-#define ACPI_DIV64(dividend, divisor) ACPI_DIVIDE(dividend, divisor)
-#endif
-
-#endif /* __ACWIN_H__ */
diff --git a/reactos/drivers/bus/acpi/include/platform/types.h b/reactos/drivers/bus/acpi/include/platform/types.h
deleted file mode 100644 (file)
index e823dda..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * COPYRIGHT:    See COPYING in the top level directory
- * PROJECT:      ReactOS kernel
- * FILE:         include/types.h
- * PURPOSE:      Types used by all the parts of the system
- * PROGRAMMER:   David Welch <welch@cwcom.net>
- * DEFINES:      _WIN64: 64-bit architecture
- *               _WIN32: 32-bit architecture (default)
- * UPDATE HISTORY:
- *               27/06/00: Created
- *               01/05/01: Portabillity changes
- */
-#ifndef __INCLUDE_ACPI_TYPES_H
-#define __INCLUDE_ACPI_TYPES_H
-
-#include <ntddk.h>
-#include <stdio.h>
-
-#endif /* __INCLUDE_ACPI_TYPES_H */
diff --git a/reactos/drivers/bus/acpi/namespace/nsaccess.c b/reactos/drivers/bus/acpi/namespace/nsaccess.c
deleted file mode 100644 (file)
index 4da6b90..0000000
+++ /dev/null
@@ -1,546 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: nsaccess - Top-level functions for accessing ACPI namespace
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nsaccess")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_root_initialize
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Allocate and initialize the default root named objects
- *
- * MUTEX:       Locks namespace for entire execution
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_root_initialize (void)
-{
-       ACPI_STATUS             status = AE_OK;
-       PREDEFINED_NAMES        *init_val = NULL;
-       ACPI_NAMESPACE_NODE     *new_node;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /*
-        * The global root ptr is initially NULL, so a non-NULL value indicates
-        * that Acpi_ns_root_initialize() has already been called; just return.
-        */
-
-       if (acpi_gbl_root_node) {
-               status = AE_OK;
-               goto unlock_and_exit;
-       }
-
-
-       /*
-        * Tell the rest of the subsystem that the root is initialized
-        * (This is OK because the namespace is locked)
-        */
-
-       acpi_gbl_root_node = &acpi_gbl_root_node_struct;
-
-
-       /* Enter the pre-defined names in the name table */
-
-       for (init_val = acpi_gbl_pre_defined_names; init_val->name; init_val++) {
-               status = acpi_ns_lookup (NULL, init_val->name,
-                                (OBJECT_TYPE_INTERNAL) init_val->type,
-                                IMODE_LOAD_PASS2, NS_NO_UPSEARCH,
-                                NULL, &new_node);
-
-
-               /*
-                * Name entered successfully.
-                * If entry in Pre_defined_names[] specifies an
-                * initial value, create the initial value.
-                */
-
-               if (init_val->val) {
-                       /*
-                        * Entry requests an initial value, allocate a
-                        * descriptor for it.
-                        */
-
-                       obj_desc = acpi_cm_create_internal_object (
-                                         (OBJECT_TYPE_INTERNAL) init_val->type);
-
-                       if (!obj_desc) {
-                               status = AE_NO_MEMORY;
-                               goto unlock_and_exit;
-                       }
-
-                       /*
-                        * Convert value string from table entry to
-                        * internal representation. Only types actually
-                        * used for initial values are implemented here.
-                        */
-
-                       switch (init_val->type) {
-
-                       case ACPI_TYPE_INTEGER:
-
-                               obj_desc->integer.value =
-                                               (ACPI_INTEGER) STRTOUL (init_val->val, NULL, 10);
-                               break;
-
-
-                       case ACPI_TYPE_STRING:
-
-                               obj_desc->string.length = STRLEN (init_val->val);
-
-                               /*
-                                * Allocate a buffer for the string.  All
-                                * String.Pointers must be allocated buffers!
-                                * (makes deletion simpler)
-                                */
-                               obj_desc->string.pointer = acpi_cm_allocate (
-                                                  (obj_desc->string.length + 1));
-                               if (!obj_desc->string.pointer) {
-                                       acpi_cm_remove_reference (obj_desc);
-                                       status = AE_NO_MEMORY;
-                                       goto unlock_and_exit;
-                               }
-
-                               STRCPY (obj_desc->string.pointer, init_val->val);
-                               break;
-
-
-                       case ACPI_TYPE_MUTEX:
-
-                               obj_desc->mutex.sync_level =
-                                                (u16) STRTOUL (init_val->val, NULL, 10);
-
-                               if (STRCMP (init_val->name, "_GL_") == 0) {
-                                       /*
-                                        * Create a counting semaphore for the
-                                        * global lock
-                                        */
-                                       status = acpi_os_create_semaphore (ACPI_NO_UNIT_LIMIT,
-                                                        1, &obj_desc->mutex.semaphore);
-
-                                       if (ACPI_FAILURE (status)) {
-                                               goto unlock_and_exit;
-                                       }
-                                       /*
-                                        * We just created the mutex for the
-                                        * global lock, save it
-                                        */
-
-                                       acpi_gbl_global_lock_semaphore = obj_desc->mutex.semaphore;
-                               }
-
-                               else {
-                                       /* Create a mutex */
-
-                                       status = acpi_os_create_semaphore (1, 1,
-                                                          &obj_desc->mutex.semaphore);
-
-                                       if (ACPI_FAILURE (status)) {
-                                               goto unlock_and_exit;
-                                       }
-                               }
-                               break;
-
-
-                       default:
-                               REPORT_ERROR (("Unsupported initial type value %X\n",
-                                       init_val->type));
-                               acpi_cm_remove_reference (obj_desc);
-                               obj_desc = NULL;
-                               continue;
-                       }
-
-                       /* Store pointer to value descriptor in the Node */
-
-                       acpi_ns_attach_object (new_node, obj_desc, obj_desc->common.type);
-               }
-       }
-
-
-unlock_and_exit:
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_lookup
- *
- * PARAMETERS:  Prefix_node     - Search scope if name is not fully qualified
- *              Pathname        - Search pathname, in internal format
- *                                (as represented in the AML stream)
- *              Type            - Type associated with name
- *              Interpreter_mode - IMODE_LOAD_PASS2 => add name if not found
- *              Flags           - Flags describing the search restrictions
- *              Walk_state      - Current state of the walk
- *              Return_node     - Where the Node is placed (if found
- *                                or created successfully)
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Find or enter the passed name in the name space.
- *              Log an error if name not found in Exec mode.
- *
- * MUTEX:       Assumes namespace is locked.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_lookup (
-       ACPI_GENERIC_STATE      *scope_info,
-       NATIVE_CHAR             *pathname,
-       OBJECT_TYPE_INTERNAL    type,
-       OPERATING_MODE          interpreter_mode,
-       u32                     flags,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_NAMESPACE_NODE     **return_node)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *prefix_node;
-       ACPI_NAMESPACE_NODE     *current_node = NULL;
-       ACPI_NAMESPACE_NODE     *scope_to_push = NULL;
-       ACPI_NAMESPACE_NODE     *this_node = NULL;
-       u32                     num_segments;
-       ACPI_NAME               simple_name;
-       u8                      null_name_path = FALSE;
-       OBJECT_TYPE_INTERNAL    type_to_check_for;
-       OBJECT_TYPE_INTERNAL    this_search_type;
-       u32                     local_flags = flags & ~NS_ERROR_IF_FOUND;
-
-
-       if (!return_node) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       acpi_gbl_ns_lookup_count++;
-
-       *return_node = ENTRY_NOT_FOUND;
-
-
-       if (!acpi_gbl_root_node) {
-               return (AE_NO_NAMESPACE);
-       }
-
-       /*
-        * Get the prefix scope.
-        * A null scope means use the root scope
-        */
-
-       if ((!scope_info) ||
-               (!scope_info->scope.node)) {
-               prefix_node = acpi_gbl_root_node;
-       }
-       else {
-               prefix_node = scope_info->scope.node;
-       }
-
-
-       /*
-        * This check is explicitly split provide relax the Type_to_check_for
-        * conditions for Bank_field_defn. Originally, both Bank_field_defn and
-        * Def_field_defn caused Type_to_check_for to be set to ACPI_TYPE_REGION,
-        * but the Bank_field_defn may also check for a Field definition as well
-        * as an Operation_region.
-        */
-
-       if (INTERNAL_TYPE_DEF_FIELD_DEFN == type) {
-               /* Def_field_defn defines fields in a Region */
-
-               type_to_check_for = ACPI_TYPE_REGION;
-       }
-
-       else if (INTERNAL_TYPE_BANK_FIELD_DEFN == type) {
-               /* Bank_field_defn defines data fields in a Field Object */
-
-               type_to_check_for = ACPI_TYPE_ANY;
-       }
-
-       else {
-               type_to_check_for = type;
-       }
-
-
-       /* TBD: [Restructure] - Move the pathname stuff into a new procedure */
-
-       /* Examine the name pointer */
-
-       if (!pathname) {
-               /*  8-12-98 ASL Grammar Update supports null Name_path  */
-
-               null_name_path = TRUE;
-               num_segments = 0;
-               this_node = acpi_gbl_root_node;
-
-       }
-
-       else {
-               /*
-                * Valid name pointer (Internal name format)
-                *
-                * Check for prefixes.  As represented in the AML stream, a
-                * Pathname consists of an optional scope prefix followed by
-                * a segment part.
-                *
-                * If present, the scope prefix is either a Root_prefix (in
-                * which case the name is fully qualified), or zero or more
-                * Parent_prefixes (in which case the name's scope is relative
-                * to the current scope).
-                *
-                * The segment part consists of either:
-                *  - A single 4-byte name segment, or
-                *  - A Dual_name_prefix followed by two 4-byte name segments, or
-                *  - A Multi_name_prefix_op, followed by a byte indicating the
-                *    number of segments and the segments themselves.
-                */
-
-               if (*pathname == AML_ROOT_PREFIX) {
-                       /* Pathname is fully qualified, look in root name table */
-
-                       current_node = acpi_gbl_root_node;
-
-                       /* point to segment part */
-
-                       pathname++;
-
-                       /* Direct reference to root, "\" */
-
-                       if (!(*pathname)) {
-                               this_node = acpi_gbl_root_node;
-                               goto check_for_new_scope_and_exit;
-                       }
-               }
-
-               else {
-                       /* Pathname is relative to current scope, start there */
-
-                       current_node = prefix_node;
-
-                       /*
-                        * Handle up-prefix (carat).  More than one prefix
-                        * is supported
-                        */
-
-                       while (*pathname == AML_PARENT_PREFIX) {
-                               /* Point to segment part or next Parent_prefix */
-
-                               pathname++;
-
-                               /*  Backup to the parent's scope  */
-
-                               this_node = acpi_ns_get_parent_object (current_node);
-                               if (!this_node) {
-                                       /* Current scope has no parent scope */
-
-                                       REPORT_ERROR (
-                                               ("Too many parent prefixes (^) - reached root\n"));
-                                       return (AE_NOT_FOUND);
-                               }
-
-                               current_node = this_node;
-                       }
-               }
-
-
-               /*
-                * Examine the name prefix opcode, if any,
-                * to determine the number of segments
-                */
-
-               if (*pathname == AML_DUAL_NAME_PREFIX) {
-                       num_segments = 2;
-
-                       /* point to first segment */
-
-                       pathname++;
-
-               }
-
-               else if (*pathname == AML_MULTI_NAME_PREFIX_OP) {
-                       num_segments = (u32)* (u8 *) ++pathname;
-
-                       /* point to first segment */
-
-                       pathname++;
-
-               }
-
-               else {
-                       /*
-                        * No Dual or Multi prefix, hence there is only one
-                        * segment and Pathname is already pointing to it.
-                        */
-                       num_segments = 1;
-
-               }
-
-       }
-
-
-       /*
-        * Search namespace for each segment of the name.
-        * Loop through and verify/add each name segment.
-        */
-
-
-       while (num_segments-- && current_node) {
-               /*
-                * Search for the current name segment under the current
-                * named object.  The Type is significant only at the last (topmost)
-                * level.  (We don't care about the types along the path, only
-                * the type of the final target object.)
-                */
-               this_search_type = ACPI_TYPE_ANY;
-               if (!num_segments) {
-                       this_search_type = type;
-                       local_flags = flags;
-               }
-
-               /* Pluck one ACPI name from the front of the pathname */
-
-               MOVE_UNALIGNED32_TO_32 (&simple_name, pathname);
-
-               /* Try to find the ACPI name */
-
-               status = acpi_ns_search_and_enter (simple_name, walk_state,
-                                  current_node, interpreter_mode,
-                                  this_search_type, local_flags,
-                                  &this_node);
-
-               if (ACPI_FAILURE (status)) {
-                       if (status == AE_NOT_FOUND) {
-                               /* Name not found in ACPI namespace  */
-
-                       }
-
-                       return (status);
-               }
-
-
-               /*
-                * If 1) This is the last segment (Num_segments == 0)
-                *    2) and looking for a specific type
-                *       (Not checking for TYPE_ANY)
-                *    3) Which is not an alias
-                *    4) which is not a local type (TYPE_DEF_ANY)
-                *    5) which is not a local type (TYPE_SCOPE)
-                *    6) which is not a local type (TYPE_INDEX_FIELD_DEFN)
-                *    7) and type of object is known (not TYPE_ANY)
-                *    8) and object does not match request
-                *
-                * Then we have a type mismatch.  Just warn and ignore it.
-                */
-               if ((num_segments       == 0)                               &&
-                       (type_to_check_for  != ACPI_TYPE_ANY)                   &&
-                       (type_to_check_for  != INTERNAL_TYPE_ALIAS)             &&
-                       (type_to_check_for  != INTERNAL_TYPE_DEF_ANY)           &&
-                       (type_to_check_for  != INTERNAL_TYPE_SCOPE)             &&
-                       (type_to_check_for  != INTERNAL_TYPE_INDEX_FIELD_DEFN)  &&
-                       (this_node->type    != ACPI_TYPE_ANY)                   &&
-                       (this_node->type    != type_to_check_for)) {
-                       /* Complain about a type mismatch */
-
-                       REPORT_WARNING (
-                               ("Ns_lookup: %4.4s, type %X, checking for type %X\n",
-                               &simple_name, this_node->type, type_to_check_for));
-               }
-
-               /*
-                * If this is the last name segment and we are not looking for a
-                * specific type, but the type of found object is known, use that type
-                * to see if it opens a scope.
-                */
-
-               if ((0 == num_segments) && (ACPI_TYPE_ANY == type)) {
-                       type = this_node->type;
-               }
-
-               if ((num_segments || acpi_ns_opens_scope (type)) &&
-                       (this_node->child == NULL)) {
-                       /*
-                        * More segments or the type implies enclosed scope,
-                        * and the next scope has not been allocated.
-                        */
-
-               }
-
-               current_node = this_node;
-
-               /* point to next name segment */
-
-               pathname += ACPI_NAME_SIZE;
-       }
-
-
-       /*
-        * Always check if we need to open a new scope
-        */
-
-check_for_new_scope_and_exit:
-
-       if (!(flags & NS_DONT_OPEN_SCOPE) && (walk_state)) {
-               /*
-                * If entry is a type which opens a scope,
-                * push the new scope on the scope stack.
-                */
-
-               if (acpi_ns_opens_scope (type_to_check_for)) {
-                       /*  8-12-98 ASL Grammar Update supports null Name_path  */
-
-                       if (null_name_path) {
-                               /* TBD: [Investigate] - is this the correct thing to do? */
-
-                               scope_to_push = NULL;
-                       }
-                       else {
-                               scope_to_push = this_node;
-                       }
-
-                       status = acpi_ds_scope_stack_push (scope_to_push, type,
-                                          walk_state);
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-               }
-       }
-
-       *return_node = this_node;
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/namespace/nsalloc.c b/reactos/drivers/bus/acpi/namespace/nsalloc.c
deleted file mode 100644 (file)
index 00f7988..0000000
+++ /dev/null
@@ -1,563 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: nsalloc - Namespace allocation and deletion utilities
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nsalloc")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_create_node
- *
- * PARAMETERS:
- *
- * RETURN:      None
- *
- * DESCRIPTION:
- *
- ******************************************************************************/
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_create_node (
-       u32                     acpi_name)
-{
-       ACPI_NAMESPACE_NODE     *node;
-
-
-       node = acpi_cm_callocate (sizeof (ACPI_NAMESPACE_NODE));
-       if (!node) {
-               return (NULL);
-       }
-
-       INCREMENT_NAME_TABLE_METRICS (sizeof (ACPI_NAMESPACE_NODE));
-
-       node->data_type      = ACPI_DESC_TYPE_NAMED;
-       node->name           = acpi_name;
-       node->reference_count = 1;
-
-       return (node);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_delete_node
- *
- * PARAMETERS:
- *
- * RETURN:      None
- *
- * DESCRIPTION:
- *
- ******************************************************************************/
-
-void
-acpi_ns_delete_node (
-       ACPI_NAMESPACE_NODE     *node)
-{
-       ACPI_NAMESPACE_NODE     *parent_node;
-       ACPI_NAMESPACE_NODE     *prev_node;
-       ACPI_NAMESPACE_NODE     *next_node;
-
-
-       parent_node = acpi_ns_get_parent_object (node);
-
-       prev_node = NULL;
-       next_node = parent_node->child;
-
-       while (next_node != node) {
-               prev_node = next_node;
-               next_node = prev_node->peer;
-       }
-
-       if (prev_node) {
-               prev_node->peer = next_node->peer;
-               if (next_node->flags & ANOBJ_END_OF_PEER_LIST) {
-                       prev_node->flags |= ANOBJ_END_OF_PEER_LIST;
-               }
-       }
-       else {
-               parent_node->child = next_node->peer;
-       }
-
-
-       DECREMENT_NAME_TABLE_METRICS (sizeof (ACPI_NAMESPACE_NODE));
-
-       /*
-        * Detach an object if there is one
-        */
-
-       if (node->object) {
-               acpi_ns_detach_object (node);
-       }
-
-       acpi_cm_free (node);
-
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_install_node
- *
- * PARAMETERS:  Walk_state      - Current state of the walk
- *              Parent_node     - The parent of the new Node
- *              Node        - The new Node to install
- *              Type            - ACPI object type of the new Node
- *
- * RETURN:      None
- *
- * DESCRIPTION: Initialize a new entry within a namespace table.
- *
- ******************************************************************************/
-
-void
-acpi_ns_install_node (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_NAMESPACE_NODE     *parent_node,   /* Parent */
-       ACPI_NAMESPACE_NODE     *node,      /* New Child*/
-       OBJECT_TYPE_INTERNAL    type)
-{
-       u16                     owner_id = TABLE_ID_DSDT;
-       ACPI_NAMESPACE_NODE     *child_node;
-
-
-       /*
-        * Get the owner ID from the Walk state
-        * The owner ID is used to track table deletion and
-        * deletion of objects created by methods
-        */
-       if (walk_state) {
-               owner_id = walk_state->owner_id;
-       }
-
-
-       /* link the new entry into the parent and existing children */
-
-       /* TBD: Could be first, last, or alphabetic */
-
-       child_node = parent_node->child;
-       if (!child_node) {
-               parent_node->child = node;
-       }
-
-       else {
-               while (!(child_node->flags & ANOBJ_END_OF_PEER_LIST)) {
-                       child_node = child_node->peer;
-               }
-
-               child_node->peer = node;
-
-               /* Clear end-of-list flag */
-
-               child_node->flags &= ~ANOBJ_END_OF_PEER_LIST;
-       }
-
-       /* Init the new entry */
-
-       node->owner_id  = owner_id;
-       node->flags     |= ANOBJ_END_OF_PEER_LIST;
-       node->peer      = parent_node;
-
-
-       /*
-        * If adding a name with unknown type, or having to
-        * add the region in order to define fields in it, we
-        * have a forward reference.
-        */
-
-       if ((ACPI_TYPE_ANY == type) ||
-               (INTERNAL_TYPE_DEF_FIELD_DEFN == type) ||
-               (INTERNAL_TYPE_BANK_FIELD_DEFN == type)) {
-               /*
-                * We don't want to abort here, however!
-                * We will fill in the actual type when the
-                * real definition is found later.
-                */
-
-       }
-
-       /*
-        * The Def_field_defn and Bank_field_defn cases are actually
-        * looking up the Region in which the field will be defined
-        */
-
-       if ((INTERNAL_TYPE_DEF_FIELD_DEFN == type) ||
-               (INTERNAL_TYPE_BANK_FIELD_DEFN == type)) {
-               type = ACPI_TYPE_REGION;
-       }
-
-       /*
-        * Scope, Def_any, and Index_field_defn are bogus "types" which do
-        * not actually have anything to do with the type of the name
-        * being looked up.  Save any other value of Type as the type of
-        * the entry.
-        */
-
-       if ((type != INTERNAL_TYPE_SCOPE) &&
-               (type != INTERNAL_TYPE_DEF_ANY) &&
-               (type != INTERNAL_TYPE_INDEX_FIELD_DEFN)) {
-               node->type = (u8) type;
-       }
-
-       /*
-        * Increment the reference count(s) of all parents up to
-        * the root!
-        */
-
-       while ((node = acpi_ns_get_parent_object (node)) != NULL) {
-               node->reference_count++;
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_delete_children
- *
- * PARAMETERS:  Parent_node     - Delete this objects children
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Delete all children of the parent object. Deletes a
- *              "scope".
- *
- ******************************************************************************/
-
-void
-acpi_ns_delete_children (
-       ACPI_NAMESPACE_NODE     *parent_node)
-{
-       ACPI_NAMESPACE_NODE     *child_node;
-       ACPI_NAMESPACE_NODE     *next_node;
-       u8                      flags;
-
-
-       if (!parent_node) {
-               return;
-       }
-
-       /* If no children, all done! */
-
-       child_node = parent_node->child;
-       if (!child_node) {
-               return;
-       }
-
-       /*
-        * Deallocate all children at this level
-        */
-       do {
-               /* Get the things we need */
-
-               next_node   = child_node->peer;
-               flags       = child_node->flags;
-
-               /* Grandchildren should have all been deleted already */
-
-
-               /* Now we can free this child object */
-
-               DECREMENT_NAME_TABLE_METRICS (sizeof (ACPI_NAMESPACE_NODE));
-
-               /*
-                * Detach an object if there is one
-                */
-
-               if (child_node->object) {
-                       acpi_ns_detach_object (child_node);
-               }
-
-               acpi_cm_free (child_node);
-
-               /* And move on to the next child in the list */
-
-               child_node = next_node;
-
-       } while (!(flags & ANOBJ_END_OF_PEER_LIST));
-
-
-       /* Clear the parent's child pointer */
-
-       parent_node->child = NULL;
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_delete_namespace_subtree
- *
- * PARAMETERS:  None.
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Delete a subtree of the namespace.  This includes all objects
- *              stored within the subtree.  Scope tables are deleted also
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_delete_namespace_subtree (
-       ACPI_NAMESPACE_NODE     *parent_node)
-{
-       ACPI_NAMESPACE_NODE     *child_node;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       u32                     level;
-
-
-       if (!parent_node) {
-               return (AE_OK);
-       }
-
-
-       child_node  = 0;
-       level       = 1;
-
-       /*
-        * Traverse the tree of objects until we bubble back up
-        * to where we started.
-        */
-
-       while (level > 0) {
-               /*
-                * Get the next typed object in this scope.
-                * Null returned if not found
-                */
-
-               child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, parent_node,
-                                child_node);
-               if (child_node) {
-                       /*
-                        * Found an object - delete the object within
-                        * the Value field
-                        */
-
-                       obj_desc = acpi_ns_get_attached_object (child_node);
-                       if (obj_desc) {
-                               acpi_ns_detach_object (child_node);
-                               acpi_cm_remove_reference (obj_desc);
-                       }
-
-
-                       /* Check if this object has any children */
-
-                       if (acpi_ns_get_next_object (ACPI_TYPE_ANY, child_node, 0)) {
-                               /*
-                                * There is at least one child of this object,
-                                * visit the object
-                                */
-
-                               level++;
-                               parent_node   = child_node;
-                               child_node    = 0;
-                       }
-               }
-
-               else {
-                       /*
-                        * No more children in this object.
-                        * We will move up to the grandparent.
-                        */
-                       level--;
-
-                       /*
-                        * Now delete all of the children of this parent
-                        * all at the same time.
-                        */
-                       acpi_ns_delete_children (parent_node);
-
-                       /* New "last child" is this parent object */
-
-                       child_node = parent_node;
-
-                       /* Now we can move up the tree to the grandparent */
-
-                       parent_node = acpi_ns_get_parent_object (parent_node);
-               }
-       }
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_remove_reference
- *
- * PARAMETERS:  Node           - Named object whose reference count is to be
- *                                decremented
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Remove a Node reference.  Decrements the reference count
- *              of all parent Nodes up to the root.  Any object along
- *              the way that reaches zero references is freed.
- *
- ******************************************************************************/
-
-static void
-acpi_ns_remove_reference (
-       ACPI_NAMESPACE_NODE     *node)
-{
-       ACPI_NAMESPACE_NODE     *next_node;
-
-
-       /*
-        * Decrement the reference count(s) of this object and all
-        * objects up to the root,  Delete anything with zero remaining references.
-        */
-       next_node = node;
-       while (next_node) {
-               /* Decrement the reference count on this object*/
-
-               next_node->reference_count--;
-
-               /* Delete the object if no more references */
-
-               if (!next_node->reference_count) {
-                       /* Delete all children and delete the object */
-
-                       acpi_ns_delete_children (next_node);
-                       acpi_ns_delete_node (next_node);
-               }
-
-               /* Move up to parent */
-
-               next_node = acpi_ns_get_parent_object (next_node);
-       }
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_delete_namespace_by_owner
- *
- * PARAMETERS:  None.
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Delete entries within the namespace that are owned by a
- *              specific ID.  Used to delete entire ACPI tables.  All
- *              reference counts are updated.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_delete_namespace_by_owner (
-       u16                     owner_id)
-{
-       ACPI_NAMESPACE_NODE     *child_node;
-       u32                     level;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_NAMESPACE_NODE     *parent_node;
-
-
-       parent_node = acpi_gbl_root_node;
-       child_node  = 0;
-       level       = 1;
-
-       /*
-        * Traverse the tree of objects until we bubble back up
-        * to where we started.
-        */
-
-       while (level > 0) {
-               /*
-                * Get the next typed object in this scope.
-                * Null returned if not found
-                */
-
-               child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, parent_node,
-                                child_node);
-
-               if (child_node) {
-                       if (child_node->owner_id == owner_id) {
-                               /*
-                                * Found an object - delete the object within
-                                * the Value field
-                                */
-
-                               obj_desc = acpi_ns_get_attached_object (child_node);
-                               if (obj_desc) {
-                                       acpi_ns_detach_object (child_node);
-                                       acpi_cm_remove_reference (obj_desc);
-                               }
-                       }
-
-                       /* Check if this object has any children */
-
-                       if (acpi_ns_get_next_object (ACPI_TYPE_ANY, child_node, 0)) {
-                               /*
-                                * There is at least one child of this object,
-                                * visit the object
-                                */
-
-                               level++;
-                               parent_node   = child_node;
-                               child_node    = 0;
-                       }
-
-                       else if (child_node->owner_id == owner_id) {
-                               acpi_ns_remove_reference (child_node);
-                       }
-               }
-
-               else {
-                       /*
-                        * No more children in this object.  Move up to grandparent.
-                        */
-                       level--;
-
-                       if (level != 0) {
-                               if (parent_node->owner_id == owner_id) {
-                                       acpi_ns_remove_reference (parent_node);
-                               }
-                       }
-
-                       /* New "last child" is this parent object */
-
-                       child_node = parent_node;
-
-                       /* Now we can move up the tree to the grandparent */
-
-                       parent_node = acpi_ns_get_parent_object (parent_node);
-               }
-       }
-
-
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/namespace/nseval.c b/reactos/drivers/bus/acpi/namespace/nseval.c
deleted file mode 100644 (file)
index 63647e0..0000000
+++ /dev/null
@@ -1,501 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: nseval - Object evaluation interfaces -- includes control
- *                       method lookup and execution.
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nseval")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_evaluate_relative
- *
- * PARAMETERS:  Handle              - The relative containing object
- *              *Pathname           - Name of method to execute, If NULL, the
- *                                    handle is the object to execute
- *              **Params            - List of parameters to pass to the method,
- *                                    terminated by NULL.  Params itself may be
- *                                    NULL if no parameters are being passed.
- *              *Return_object      - Where to put method's return value (if
- *                                    any).  If NULL, no value is returned.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Find and execute the requested method using the handle as a
- *              scope
- *
- * MUTEX:       Locks Namespace
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_evaluate_relative (
-       ACPI_NAMESPACE_NODE     *handle,
-       NATIVE_CHAR             *pathname,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_object)
-{
-       ACPI_NAMESPACE_NODE     *prefix_node;
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *node = NULL;
-       NATIVE_CHAR             *internal_path = NULL;
-       ACPI_GENERIC_STATE      scope_info;
-
-
-       /*
-        * Must have a valid object handle
-        */
-       if (!handle) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Build an internal name string for the method */
-
-       status = acpi_ns_internalize_name (pathname, &internal_path);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Get the prefix handle and Node */
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       prefix_node = acpi_ns_convert_handle_to_entry (handle);
-       if (!prefix_node) {
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-               status = AE_BAD_PARAMETER;
-               goto cleanup;
-       }
-
-       /* Lookup the name in the namespace */
-
-       scope_info.scope.node = prefix_node;
-       status = acpi_ns_lookup (&scope_info, internal_path, ACPI_TYPE_ANY,
-                        IMODE_EXECUTE, NS_NO_UPSEARCH, NULL,
-                        &node);
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       /*
-        * Now that we have a handle to the object, we can attempt
-        * to evaluate it.
-        */
-
-       status = acpi_ns_evaluate_by_handle (node, params, return_object);
-
-cleanup:
-
-       /* Cleanup */
-
-       acpi_cm_free (internal_path);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_evaluate_by_name
- *
- * PARAMETERS:  Pathname            - Fully qualified pathname to the object
- *              *Return_object      - Where to put method's return value (if
- *                                    any).  If NULL, no value is returned.
- *              **Params            - List of parameters to pass to the method,
- *                                    terminated by NULL.  Params itself may be
- *                                    NULL if no parameters are being passed.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Find and execute the requested method passing the given
- *              parameters
- *
- * MUTEX:       Locks Namespace
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_evaluate_by_name (
-       NATIVE_CHAR             *pathname,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_object)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *node = NULL;
-       NATIVE_CHAR             *internal_path = NULL;
-
-
-       /* Build an internal name string for the method */
-
-       status = acpi_ns_internalize_name (pathname, &internal_path);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /* Lookup the name in the namespace */
-
-       status = acpi_ns_lookup (NULL, internal_path, ACPI_TYPE_ANY,
-                        IMODE_EXECUTE, NS_NO_UPSEARCH, NULL,
-                        &node);
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       /*
-        * Now that we have a handle to the object, we can attempt
-        * to evaluate it.
-        */
-
-       status = acpi_ns_evaluate_by_handle (node, params, return_object);
-
-
-cleanup:
-
-       /* Cleanup */
-
-       if (internal_path) {
-               acpi_cm_free (internal_path);
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_evaluate_by_handle
- *
- * PARAMETERS:  Handle              - Method Node to execute
- *              **Params            - List of parameters to pass to the method,
- *                                    terminated by NULL.  Params itself may be
- *                                    NULL if no parameters are being passed.
- *              *Return_object      - Where to put method's return value (if
- *                                    any).  If NULL, no value is returned.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute the requested method passing the given parameters
- *
- * MUTEX:       Locks Namespace
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_evaluate_by_handle (
-       ACPI_NAMESPACE_NODE     *handle,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_object)
-{
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *local_return_object;
-
-
-       /* Check if namespace has been initialized */
-
-       if (!acpi_gbl_root_node) {
-               return (AE_NO_NAMESPACE);
-       }
-
-       /* Parameter Validation */
-
-       if (!handle) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       if (return_object) {
-               /* Initialize the return value to an invalid object */
-
-               *return_object = NULL;
-       }
-
-       /* Get the prefix handle and Node */
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       node = acpi_ns_convert_handle_to_entry (handle);
-       if (!node) {
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /*
-        * Two major cases here:
-        * 1) The object is an actual control method -- execute it.
-        * 2) The object is not a method -- just return it's current
-        *      value
-        *
-        * In both cases, the namespace is unlocked by the
-        *  Acpi_ns* procedure
-        */
-       if (acpi_ns_get_type (node) == ACPI_TYPE_METHOD) {
-               /*
-                * Case 1) We have an actual control method to execute
-                */
-               status = acpi_ns_execute_control_method (node, params,
-                                &local_return_object);
-       }
-
-       else {
-               /*
-                * Case 2) Object is NOT a method, just return its
-                * current value
-                */
-               status = acpi_ns_get_object_value (node, &local_return_object);
-       }
-
-
-       /*
-        * Check if there is a return value on the stack that must
-        * be dealt with
-        */
-       if (status == AE_CTRL_RETURN_VALUE) {
-               /*
-                * If the Method returned a value and the caller
-                * provided a place to store a returned value, Copy
-                * the returned value to the object descriptor provided
-                * by the caller.
-                */
-               if (return_object) {
-                       /*
-                        * Valid return object, copy the pointer to
-                        * the returned object
-                        */
-                       *return_object = local_return_object;
-               }
-
-
-               /* Map AE_RETURN_VALUE to AE_OK, we are done with it */
-
-               if (status == AE_CTRL_RETURN_VALUE) {
-                       status = AE_OK;
-               }
-       }
-
-       /*
-        * Namespace was unlocked by the handling Acpi_ns* function,
-        * so we just return
-        */
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_execute_control_method
- *
- * PARAMETERS:  Method_node     - The object/method
- *              **Params            - List of parameters to pass to the method,
- *                                    terminated by NULL.  Params itself may be
- *                                    NULL if no parameters are being passed.
- *              **Return_obj_desc   - List of result objects to be returned
- *                                    from the method.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute the requested method passing the given parameters
- *
- * MUTEX:       Assumes namespace is locked
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_execute_control_method (
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_obj_desc)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       /* Verify that there is a method associated with this object */
-
-       obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) method_node);
-       if (!obj_desc) {
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-               return (AE_ERROR);
-       }
-
-
-       /*
-        * Unlock the namespace before execution.  This allows namespace access
-        * via the external Acpi* interfaces while a method is being executed.
-        * However, any namespace deletion must acquire both the namespace and
-        * interpreter locks to ensure that no thread is using the portion of the
-        * namespace that is being deleted.
-        */
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       /*
-        * Execute the method via the interpreter
-        */
-       status = acpi_aml_execute_method (method_node, params, return_obj_desc);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_get_object_value
- *
- * PARAMETERS:  Node         - The object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Return the current value of the object
- *
- * MUTEX:       Assumes namespace is locked
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_get_object_value (
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_OPERAND_OBJECT     **return_obj_desc)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *val_desc;
-
-
-       /*
-        *  We take the value from certain objects directly
-        */
-
-       if ((node->type == ACPI_TYPE_PROCESSOR) ||
-               (node->type == ACPI_TYPE_POWER)) {
-               /*
-                *  Create a Reference object to contain the object
-                */
-               obj_desc = acpi_cm_create_internal_object (node->type);
-               if (!obj_desc) {
-                  status = AE_NO_MEMORY;
-                  goto unlock_and_exit;
-               }
-
-               /*
-                *  Get the attached object
-                */
-
-               val_desc = acpi_ns_get_attached_object (node);
-               if (!val_desc) {
-                       status = AE_NULL_OBJECT;
-                       goto unlock_and_exit;
-               }
-
-               /*
-                * Just copy from the original to the return object
-                *
-                * TBD: [Future] - need a low-level object copy that handles
-                * the reference count automatically.  (Don't want to copy it)
-                */
-
-               MEMCPY (obj_desc, val_desc, sizeof (ACPI_OPERAND_OBJECT));
-               obj_desc->common.reference_count = 1;
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       }
-
-
-       /*
-        * Other objects require a reference object wrapper which we
-        * then attempt to resolve.
-        */
-       else {
-               /* Create an Reference object to contain the object */
-
-               obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_REFERENCE);
-               if (!obj_desc) {
-                  status = AE_NO_MEMORY;
-                  goto unlock_and_exit;
-               }
-
-               /* Construct a descriptor pointing to the name */
-
-               obj_desc->reference.opcode = (u8) AML_NAME_OP;
-               obj_desc->reference.object = (void *) node;
-
-               /*
-                * Use Resolve_to_value() to get the associated value. This call
-                * always deletes Obj_desc (allocated above).
-                *
-                * NOTE: we can get away with passing in NULL for a walk state
-                * because Obj_desc is guaranteed to not be a reference to either
-                * a method local or a method argument
-                *
-                * Even though we do not directly invoke the interpreter
-                * for this, we must enter it because we could access an opregion.
-                * The opregion access code assumes that the interpreter
-                * is locked.
-                *
-                * We must release the namespace lock before entering the
-                * intepreter.
-                */
-
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-               status = acpi_aml_enter_interpreter ();
-               if (ACPI_SUCCESS (status)) {
-                       status = acpi_aml_resolve_to_value (&obj_desc, NULL);
-
-                       acpi_aml_exit_interpreter ();
-               }
-       }
-
-       /*
-        * If Acpi_aml_resolve_to_value() succeeded, the return value was
-        * placed in Obj_desc.
-        */
-
-       if (ACPI_SUCCESS (status)) {
-               status = AE_CTRL_RETURN_VALUE;
-
-               *return_obj_desc = obj_desc;
-       }
-
-       /* Namespace is unlocked */
-
-       return (status);
-
-
-unlock_and_exit:
-
-       /* Unlock the namespace */
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (status);
-}
diff --git a/reactos/drivers/bus/acpi/namespace/nsinit.c b/reactos/drivers/bus/acpi/namespace/nsinit.c
deleted file mode 100644 (file)
index 81ed0fe..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-/******************************************************************************
- *
- * Module Name: nsinit - namespace initialization
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nsinit")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_initialize_objects
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Walk the entire namespace and perform any necessary
- *              initialization on the objects found therein
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_initialize_objects (
-       void)
-{
-       ACPI_STATUS             status;
-       ACPI_INIT_WALK_INFO     info;
-
-
-       info.field_count = 0;
-       info.field_init = 0;
-       info.op_region_count = 0;
-       info.op_region_init = 0;
-       info.object_count = 0;
-
-
-       /* Walk entire namespace from the supplied root */
-
-       status = acpi_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
-                         ACPI_UINT32_MAX, acpi_ns_init_one_object,
-                         &info, NULL);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_initialize_devices
- *
- * PARAMETERS:  None
- *
- * RETURN:      ACPI_STATUS
- *
- * DESCRIPTION: Walk the entire namespace and initialize all ACPI devices.
- *              This means running _INI on all present devices.
- *
- *              Note: We install PCI config space handler on region access,
- *              not here.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_initialize_devices (
-       void)
-{
-       ACPI_STATUS             status;
-       ACPI_DEVICE_WALK_INFO   info;
-
-
-       info.device_count = 0;
-       info.num_STA = 0;
-       info.num_INI = 0;
-
-
-       status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
-                         ACPI_UINT32_MAX, FALSE, acpi_ns_init_one_device, &info, NULL);
-
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_init_one_object
- *
- * PARAMETERS:  Obj_handle      - Node
- *              Level           - Current nesting level
- *              Context         - Points to a init info struct
- *              Return_value    - Not used
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Callback from Acpi_walk_namespace. Invoked for every object
- *              within the  namespace.
- *
- *              Currently, the only objects that require initialization are:
- *              1) Methods
- *              2) Op Regions
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_init_one_object (
-       ACPI_HANDLE             obj_handle,
-       u32                     level,
-       void                    *context,
-       void                    **return_value)
-{
-       OBJECT_TYPE_INTERNAL    type;
-       ACPI_STATUS             status;
-       ACPI_INIT_WALK_INFO     *info = (ACPI_INIT_WALK_INFO *) context;
-       ACPI_NAMESPACE_NODE     *node = (ACPI_NAMESPACE_NODE *) obj_handle;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       info->object_count++;
-
-
-       /* And even then, we are only interested in a few object types */
-
-       type = acpi_ns_get_type (obj_handle);
-       obj_desc = node->object;
-       if (!obj_desc) {
-               return (AE_OK);
-       }
-
-       switch (type) {
-
-       case ACPI_TYPE_REGION:
-
-               info->op_region_count++;
-               if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
-                       break;
-               }
-
-               info->op_region_init++;
-               status = acpi_ds_get_region_arguments (obj_desc);
-
-
-               break;
-
-
-       case ACPI_TYPE_FIELD_UNIT:
-
-               info->field_count++;
-               if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
-                       break;
-               }
-
-               info->field_init++;
-               status = acpi_ds_get_field_unit_arguments (obj_desc);
-
-
-               break;
-
-       default:
-               break;
-       }
-
-       /*
-        * We ignore errors from above, and always return OK, since
-        * we don't want to abort the walk on a single error.
-        */
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_init_one_device
- *
- * PARAMETERS:  WALK_CALLBACK
- *
- * RETURN:      ACPI_STATUS
- *
- * DESCRIPTION: This is called once per device soon after ACPI is enabled
- *              to initialize each device. It determines if the device is
- *              present, and if so, calls _INI.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_init_one_device (
-       ACPI_HANDLE             obj_handle,
-       u32                     nesting_level,
-       void                    *context,
-       void                    **return_value)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE    *node;
-       u32                     flags;
-       ACPI_DEVICE_WALK_INFO  *info = (ACPI_DEVICE_WALK_INFO *) context;
-
-
-
-       info->device_count++;
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       node = acpi_ns_convert_handle_to_entry (obj_handle);
-       if (!node) {
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       /*
-        * Run _STA to determine if we can run _INI on the device.
-        */
-
-       status = acpi_cm_execute_STA (node, &flags);
-       if (ACPI_FAILURE (status)) {
-               /* Ignore error and move on to next device */
-
-               return (AE_OK);
-       }
-
-       info->num_STA++;
-
-       if (!(flags & 0x01)) {
-               /* don't look at children of a not present device */
-               return(AE_CTRL_DEPTH);
-       }
-
-
-       /*
-        * The device is present. Run _INI.
-        */
-
-       status = acpi_ns_evaluate_relative (obj_handle, "_INI", NULL, NULL);
-       if (AE_NOT_FOUND == status) {
-               /* No _INI means device requires no initialization */
-               status = AE_OK;
-       }
-
-       else if (ACPI_FAILURE (status)) {
-               /* Ignore error and move on to next device */
-
-       }
-
-       else {
-               /* Count of successful INIs */
-
-               info->num_INI++;
-       }
-
-       return (AE_OK);
-}
diff --git a/reactos/drivers/bus/acpi/namespace/nsload.c b/reactos/drivers/bus/acpi/namespace/nsload.c
deleted file mode 100644 (file)
index a74bf57..0000000
+++ /dev/null
@@ -1,521 +0,0 @@
-/******************************************************************************
- *
- * Module Name: nsload - namespace loading/expanding/contracting procedures
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nsload")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_load_namespace
- *
- * PARAMETERS:  Display_aml_during_load
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load the name space from what ever is pointed to by DSDT.
- *              (DSDT points to either the BIOS or a buffer.)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_load_namespace (
-       void)
-{
-       ACPI_STATUS             status;
-
-
-       /* There must be at least a DSDT installed */
-
-       if (acpi_gbl_DSDT == NULL) {
-               return (AE_NO_ACPI_TABLES);
-       }
-
-
-       /*
-        * Load the namespace.  The DSDT is required,
-        * but the SSDT and PSDT tables are optional.
-        */
-
-       status = acpi_ns_load_table_by_type (ACPI_TABLE_DSDT);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Ignore exceptions from these */
-
-       acpi_ns_load_table_by_type (ACPI_TABLE_SSDT);
-       acpi_ns_load_table_by_type (ACPI_TABLE_PSDT);
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_one_parse_pass
- *
- * PARAMETERS:
- *
- * RETURN:      Status
- *
- * DESCRIPTION:
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_one_complete_parse (
-       u32                     pass_number,
-       ACPI_TABLE_DESC         *table_desc)
-{
-       ACPI_PARSE_DOWNWARDS    descending_callback;
-       ACPI_PARSE_UPWARDS      ascending_callback;
-       ACPI_PARSE_OBJECT       *parse_root;
-       ACPI_STATUS             status;
-
-
-       switch (pass_number) {
-       case 1:
-               descending_callback = acpi_ds_load1_begin_op;
-               ascending_callback = acpi_ds_load1_end_op;
-               break;
-
-       case 2:
-               descending_callback = acpi_ds_load2_begin_op;
-               ascending_callback = acpi_ds_load2_end_op;
-               break;
-
-       case 3:
-               descending_callback = acpi_ds_exec_begin_op;
-               ascending_callback = acpi_ds_exec_end_op;
-               break;
-
-       default:
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Create and init a Root Node */
-
-       parse_root = acpi_ps_alloc_op (AML_SCOPE_OP);
-       if (!parse_root) {
-               return (AE_NO_MEMORY);
-       }
-
-       ((ACPI_PARSE2_OBJECT *) parse_root)->name = ACPI_ROOT_NAME;
-
-
-       /* Pass 1:  Parse everything except control method bodies */
-
-       status = acpi_ps_parse_aml (parse_root, table_desc->aml_pointer,
-                        table_desc->aml_length,
-                        ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE,
-                        NULL, NULL, NULL, descending_callback,
-                        ascending_callback);
-
-       acpi_ps_delete_parse_tree (parse_root);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_parse_table
- *
- * PARAMETERS:  Table_desc      - An ACPI table descriptor for table to parse
- *              Start_node      - Where to enter the table into the namespace
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Parse AML within an ACPI table and return a tree of ops
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_parse_table (
-       ACPI_TABLE_DESC         *table_desc,
-       ACPI_NAMESPACE_NODE     *start_node)
-{
-       ACPI_STATUS             status;
-
-
-       /*
-        * AML Parse, pass 1
-        *
-        * In this pass, we load most of the namespace.  Control methods
-        * are not parsed until later.  A parse tree is not created.  Instead,
-        * each Parser Op subtree is deleted when it is finished.  This saves
-        * a great deal of memory, and allows a small cache of parse objects
-        * to service the entire parse.  The second pass of the parse then
-        * performs another complete parse of the AML..
-        */
-
-       status = acpi_ns_one_complete_parse (1, table_desc);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /*
-        * AML Parse, pass 2
-        *
-        * In this pass, we resolve forward references and other things
-        * that could not be completed during the first pass.
-        * Another complete parse of the AML is performed, but the
-        * overhead of this is compensated for by the fact that the
-        * parse objects are all cached.
-        */
-
-       status = acpi_ns_one_complete_parse (2, table_desc);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_load_table
- *
- * PARAMETERS:  *Pcode_addr         - Address of pcode block
- *              Pcode_length        - Length of pcode block
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load one ACPI table into the namespace
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_load_table (
-       ACPI_TABLE_DESC         *table_desc,
-       ACPI_NAMESPACE_NODE     *node)
-{
-       ACPI_STATUS             status;
-
-
-       if (!table_desc->aml_pointer) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       if (!table_desc->aml_length) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /*
-        * Parse the table and load the namespace with all named
-        * objects found within.  Control methods are NOT parsed
-        * at this time.  In fact, the control methods cannot be
-        * parsed until the entire namespace is loaded, because
-        * if a control method makes a forward reference (call)
-        * to another control method, we can't continue parsing
-        * because we don't know how many arguments to parse next!
-        */
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-       status = acpi_ns_parse_table (table_desc, node->child);
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * Now we can parse the control methods.  We always parse
-        * them here for a sanity check, and if configured for
-        * just-in-time parsing, we delete the control method
-        * parse trees.
-        */
-
-       status = acpi_ds_initialize_objects (table_desc, node);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_load_table_by_type
- *
- * PARAMETERS:  Table_type          - Id of the table type to load
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load an ACPI table or tables into the namespace.  All tables
- *              of the given type are loaded.  The mechanism allows this
- *              routine to be called repeatedly.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_load_table_by_type (
-       ACPI_TABLE_TYPE         table_type)
-{
-       u32                     i;
-       ACPI_STATUS             status = AE_OK;
-       ACPI_TABLE_HEADER       *table_ptr;
-       ACPI_TABLE_DESC         *table_desc;
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_TABLES);
-
-
-       /*
-        * Table types supported are:
-        * DSDT (one), SSDT/PSDT (multiple)
-        */
-
-       switch (table_type) {
-
-       case ACPI_TABLE_DSDT:
-
-               table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_DSDT];
-
-               /* If table already loaded into namespace, just return */
-
-               if (table_desc->loaded_into_namespace) {
-                       goto unlock_and_exit;
-               }
-
-               table_desc->table_id = TABLE_ID_DSDT;
-
-               /* Now load the single DSDT */
-
-               status = acpi_ns_load_table (table_desc, acpi_gbl_root_node);
-               if (ACPI_SUCCESS (status)) {
-                       table_desc->loaded_into_namespace = TRUE;
-               }
-
-               break;
-
-
-       case ACPI_TABLE_SSDT:
-
-               /*
-                * Traverse list of SSDT tables
-                */
-
-               table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_SSDT];
-               for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_SSDT].count; i++) {
-                       table_ptr = table_desc->pointer;
-
-                       /*
-                        * Only attempt to load table if it is not
-                        * already loaded!
-                        */
-
-                       if (!table_desc->loaded_into_namespace) {
-                               status = acpi_ns_load_table (table_desc, acpi_gbl_root_node);
-                               if (ACPI_FAILURE (status)) {
-                                       break;
-                               }
-
-                               table_desc->loaded_into_namespace = TRUE;
-                       }
-
-                       table_desc = table_desc->next;
-               }
-               break;
-
-
-       case ACPI_TABLE_PSDT:
-
-               /*
-                * Traverse list of PSDT tables
-                */
-
-               table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_PSDT];
-
-               for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_PSDT].count; i++) {
-                       table_ptr = table_desc->pointer;
-
-                       /* Only attempt to load table if it is not already loaded! */
-
-                       if (!table_desc->loaded_into_namespace) {
-                               status = acpi_ns_load_table (table_desc, acpi_gbl_root_node);
-                               if (ACPI_FAILURE (status)) {
-                                       break;
-                               }
-
-                               table_desc->loaded_into_namespace = TRUE;
-                       }
-
-                       table_desc = table_desc->next;
-               }
-
-               break;
-
-
-       default:
-               status = AE_SUPPORT;
-               break;
-       }
-
-
-unlock_and_exit:
-
-       acpi_cm_release_mutex (ACPI_MTX_TABLES);
-
-       return (status);
-
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_delete_subtree
- *
- * PARAMETERS:  Start_handle        - Handle in namespace where search begins
- *
- * RETURNS      Status
- *
- * DESCRIPTION: Walks the namespace starting at the given handle and deletes
- *              all objects, entries, and scopes in the entire subtree.
- *
- *              TBD: [Investigate] What if any part of this subtree is in use?
- *              (i.e. on one of the object stacks?)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_delete_subtree (
-       ACPI_HANDLE             start_handle)
-{
-       ACPI_STATUS             status;
-       ACPI_HANDLE             child_handle;
-       ACPI_HANDLE             parent_handle;
-       ACPI_HANDLE             next_child_handle;
-       ACPI_HANDLE             dummy;
-       u32                     level;
-
-
-       parent_handle = start_handle;
-       child_handle = 0;
-       level        = 1;
-
-       /*
-        * Traverse the tree of objects until we bubble back up
-        * to where we started.
-        */
-
-       while (level > 0) {
-               /* Attempt to get the next object in this scope */
-
-               status = acpi_get_next_object (ACPI_TYPE_ANY, parent_handle,
-                                 child_handle, &next_child_handle);
-
-               child_handle = next_child_handle;
-
-
-               /* Did we get a new object? */
-
-               if (ACPI_SUCCESS (status)) {
-                       /* Check if this object has any children */
-
-                       if (ACPI_SUCCESS (acpi_get_next_object (ACPI_TYPE_ANY, child_handle,
-                                        0, &dummy))) {
-                               /*
-                                * There is at least one child of this object,
-                                * visit the object
-                                */
-
-                               level++;
-                               parent_handle = child_handle;
-                               child_handle = 0;
-                       }
-               }
-
-               else {
-                       /*
-                        * No more children in this object, go back up to
-                        * the object's parent
-                        */
-                       level--;
-
-                       /* Delete all children now */
-
-                       acpi_ns_delete_children (child_handle);
-
-                       child_handle = parent_handle;
-                       acpi_get_parent (parent_handle, &parent_handle);
-               }
-       }
-
-       /* Now delete the starting object, and we are done */
-
-       acpi_ns_delete_node (child_handle);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- *  FUNCTION:       Acpi_ns_unload_name_space
- *
- *  PARAMETERS:     Handle          - Root of namespace subtree to be deleted
- *
- *  RETURN:         Status
- *
- *  DESCRIPTION:    Shrinks the namespace, typically in response to an undocking
- *                  event.  Deletes an entire subtree starting from (and
- *                  including) the given handle.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_unload_namespace (
-       ACPI_HANDLE             handle)
-{
-       ACPI_STATUS             status;
-
-
-       /* Parameter validation */
-
-       if (!acpi_gbl_root_node) {
-               return (AE_NO_NAMESPACE);
-       }
-
-       if (!handle) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* This function does the real work */
-
-       status = acpi_ns_delete_subtree (handle);
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/namespace/nsnames.c b/reactos/drivers/bus/acpi/namespace/nsnames.c
deleted file mode 100644 (file)
index e39a344..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: nsnames - Name manipulation and search
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nsnames")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_get_table_pathname
- *
- * PARAMETERS:  Node        - Scope whose name is needed
- *
- * RETURN:      Pointer to storage containing the fully qualified name of
- *              the scope, in Label format (all segments strung together
- *              with no separators)
- *
- * DESCRIPTION: Used for debug printing in Acpi_ns_search_table().
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_ns_get_table_pathname (
-       ACPI_NAMESPACE_NODE     *node)
-{
-       NATIVE_CHAR             *name_buffer;
-       u32                     size;
-       ACPI_NAME               name;
-       ACPI_NAMESPACE_NODE     *child_node;
-       ACPI_NAMESPACE_NODE     *parent_node;
-
-
-       if (!acpi_gbl_root_node || !node) {
-               /*
-                * If the name space has not been initialized,
-                * this function should not have been called.
-                */
-               return (NULL);
-       }
-
-       child_node = node->child;
-
-
-       /* Calculate required buffer size based on depth below root */
-
-       size = 1;
-       parent_node = child_node;
-       while (parent_node) {
-               parent_node = acpi_ns_get_parent_object (parent_node);
-               if (parent_node) {
-                       size += ACPI_NAME_SIZE;
-               }
-       }
-
-
-       /* Allocate a buffer to be returned to caller */
-
-       name_buffer = acpi_cm_callocate (size + 1);
-       if (!name_buffer) {
-               REPORT_ERROR (("Ns_get_table_pathname: allocation failure\n"));
-               return (NULL);
-       }
-
-
-       /* Store terminator byte, then build name backwards */
-
-       name_buffer[size] = '\0';
-       while ((size > ACPI_NAME_SIZE) &&
-               acpi_ns_get_parent_object (child_node)) {
-               size -= ACPI_NAME_SIZE;
-               name = acpi_ns_find_parent_name (child_node);
-
-               /* Put the name into the buffer */
-
-               MOVE_UNALIGNED32_TO_32 ((name_buffer + size), &name);
-               child_node = acpi_ns_get_parent_object (child_node);
-       }
-
-       name_buffer[--size] = AML_ROOT_PREFIX;
-
-
-       return (name_buffer);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_get_pathname_length
- *
- * PARAMETERS:  Node        - Namespace node
- *
- * RETURN:      Length of path, including prefix
- *
- * DESCRIPTION: Get the length of the pathname string for this node
- *
- ******************************************************************************/
-
-u32
-acpi_ns_get_pathname_length (
-       ACPI_NAMESPACE_NODE     *node)
-{
-       u32                     size;
-       ACPI_NAMESPACE_NODE     *next_node;
-
-       /*
-        * Compute length of pathname as 5 * number of name segments.
-        * Go back up the parent tree to the root
-        */
-       for (size = 0, next_node = node;
-                 acpi_ns_get_parent_object (next_node);
-                 next_node = acpi_ns_get_parent_object (next_node)) {
-               size += PATH_SEGMENT_LENGTH;
-       }
-
-       /* Special case for size still 0 - no parent for "special" nodes */
-
-       if (!size) {
-               size = PATH_SEGMENT_LENGTH;
-       }
-
-       return (size + 1);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_handle_to_pathname
- *
- * PARAMETERS:  Target_handle           - Handle of named object whose name is
- *                                        to be found
- *              Buf_size                - Size of the buffer provided
- *              User_buffer             - Where the pathname is returned
- *
- * RETURN:      Status, Buffer is filled with pathname if status is AE_OK
- *
- * DESCRIPTION: Build and return a full namespace pathname
- *
- * MUTEX:       Locks Namespace
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_handle_to_pathname (
-       ACPI_HANDLE             target_handle,
-       u32                     *buf_size,
-       NATIVE_CHAR             *user_buffer)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_NAMESPACE_NODE     *node;
-       u32                     path_length;
-       u32                     user_buf_size;
-       ACPI_NAME               name;
-       u32                     size;
-
-
-       if (!acpi_gbl_root_node || !target_handle) {
-               /*
-                * If the name space has not been initialized,
-                * this function should not have been called.
-                */
-
-               return (AE_NO_NAMESPACE);
-       }
-
-       node = acpi_ns_convert_handle_to_entry (target_handle);
-       if (!node) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Set return length to the required path length */
-
-       path_length = acpi_ns_get_pathname_length (node);
-       size = path_length - 1;
-
-       user_buf_size = *buf_size;
-       *buf_size = path_length;
-
-       /* Check if the user buffer is sufficiently large */
-
-       if (path_length > user_buf_size) {
-               status = AE_BUFFER_OVERFLOW;
-               goto exit;
-       }
-
-       /* Store null terminator */
-
-       user_buffer[size] = 0;
-       size -= ACPI_NAME_SIZE;
-
-       /* Put the original ACPI name at the end of the path */
-
-       MOVE_UNALIGNED32_TO_32 ((user_buffer + size),
-                        &node->name);
-
-       user_buffer[--size] = PATH_SEPARATOR;
-
-       /* Build name backwards, putting "." between segments */
-
-       while ((size > ACPI_NAME_SIZE) && node) {
-               size -= ACPI_NAME_SIZE;
-               name = acpi_ns_find_parent_name (node);
-               MOVE_UNALIGNED32_TO_32 ((user_buffer + size), &name);
-
-               user_buffer[--size] = PATH_SEPARATOR;
-               node = acpi_ns_get_parent_object (node);
-       }
-
-       /*
-        * Overlay the "." preceding the first segment with
-        * the root name "\"
-        */
-
-       user_buffer[size] = '\\';
-
-exit:
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/namespace/nsobject.c b/reactos/drivers/bus/acpi/namespace/nsobject.c
deleted file mode 100644 (file)
index 0a114f6..0000000
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: nsobject - Utilities for objects attached to namespace
- *                         table entries
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nsobject")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_attach_object
- *
- * PARAMETERS:  Node            - Parent Node
- *              Object              - Object to be attached
- *              Type                - Type of object, or ACPI_TYPE_ANY if not
- *                                      known
- *
- * DESCRIPTION: Record the given object as the value associated with the
- *              name whose ACPI_HANDLE is passed.  If Object is NULL
- *              and Type is ACPI_TYPE_ANY, set the name as having no value.
- *
- * MUTEX:       Assumes namespace is locked
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_attach_object (
-       ACPI_NAMESPACE_NODE     *node,
-       ACPI_OPERAND_OBJECT     *object,
-       OBJECT_TYPE_INTERNAL    type)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_OPERAND_OBJECT     *previous_obj_desc;
-       OBJECT_TYPE_INTERNAL    obj_type = ACPI_TYPE_ANY;
-       u8                      flags;
-       u16                     opcode;
-
-
-       /*
-        * Parameter validation
-        */
-
-       if (!acpi_gbl_root_node) {
-               /* Name space not initialized  */
-
-               REPORT_ERROR (("Ns_attach_object: Namespace not initialized\n"));
-               return (AE_NO_NAMESPACE);
-       }
-
-       if (!node) {
-               /* Invalid handle */
-
-               REPORT_ERROR (("Ns_attach_object: Null Named_obj handle\n"));
-               return (AE_BAD_PARAMETER);
-       }
-
-       if (!object && (ACPI_TYPE_ANY != type)) {
-               /* Null object */
-
-               REPORT_ERROR (("Ns_attach_object: Null object, but type not ACPI_TYPE_ANY\n"));
-               return (AE_BAD_PARAMETER);
-       }
-
-       if (!VALID_DESCRIPTOR_TYPE (node, ACPI_DESC_TYPE_NAMED)) {
-               /* Not a name handle */
-
-               REPORT_ERROR (("Ns_attach_object: Invalid handle\n"));
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Check if this object is already attached */
-
-       if (node->object == object) {
-               return (AE_OK);
-       }
-
-
-       /* Get the current flags field of the Node */
-
-       flags = node->flags;
-       flags &= ~ANOBJ_AML_ATTACHMENT;
-
-
-       /* If null object, we will just install it */
-
-       if (!object) {
-               obj_desc = NULL;
-               obj_type = ACPI_TYPE_ANY;
-       }
-
-       /*
-        * If the object is an Node with an attached object,
-        * we will use that (attached) object
-        */
-
-       else if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED) &&
-                       ((ACPI_NAMESPACE_NODE *) object)->object) {
-               /*
-                * Value passed is a name handle and that name has a
-                * non-null value.  Use that name's value and type.
-                */
-
-               obj_desc = ((ACPI_NAMESPACE_NODE *) object)->object;
-               obj_type = ((ACPI_NAMESPACE_NODE *) object)->type;
-
-               /*
-                * Copy appropriate flags
-                */
-
-               if (((ACPI_NAMESPACE_NODE *) object)->flags & ANOBJ_AML_ATTACHMENT) {
-                       flags |= ANOBJ_AML_ATTACHMENT;
-               }
-       }
-
-
-       /*
-        * Otherwise, we will use the parameter object, but we must type
-        * it first
-        */
-
-       else {
-               obj_desc = (ACPI_OPERAND_OBJECT *) object;
-
-
-               /* If a valid type (non-ANY) was given, just use it */
-
-               if (ACPI_TYPE_ANY != type) {
-                       obj_type = type;
-               }
-
-
-               /*
-                * Type is TYPE_Any, we must try to determinte the
-                * actual type of the object
-                */
-
-               /*
-                * Check if value points into the AML code
-                */
-               else if (acpi_tb_system_table_pointer (object)) {
-                       /*
-                        * Object points into the AML stream.
-                        * Set a flag bit in the Node to indicate this
-                        */
-
-                       flags |= ANOBJ_AML_ATTACHMENT;
-
-                       /*
-                        * The next byte (perhaps the next two bytes)
-                        * will be the AML opcode
-                        */
-
-                       MOVE_UNALIGNED16_TO_16 (&opcode, object);
-
-                       /* Check for a recognized Opcode */
-
-                       switch (opcode) {
-
-                       case AML_OP_PREFIX:
-
-                               if (opcode != AML_REVISION_OP) {
-                                       /*
-                                        * Op_prefix is unrecognized unless part
-                                        * of Revision_op
-                                        */
-
-                                       break;
-                               }
-
-                               /* Else fall through to set type as Number */
-
-
-                       case AML_ZERO_OP: case AML_ONES_OP: case AML_ONE_OP:
-                       case AML_BYTE_OP: case AML_WORD_OP: case AML_DWORD_OP:
-
-                               obj_type = ACPI_TYPE_INTEGER;
-                               break;
-
-
-                       case AML_STRING_OP:
-
-                               obj_type = ACPI_TYPE_STRING;
-                               break;
-
-
-                       case AML_BUFFER_OP:
-
-                               obj_type = ACPI_TYPE_BUFFER;
-                               break;
-
-
-                       case AML_MUTEX_OP:
-
-                               obj_type = ACPI_TYPE_MUTEX;
-                               break;
-
-
-                       case AML_PACKAGE_OP:
-
-                               obj_type = ACPI_TYPE_PACKAGE;
-                               break;
-
-
-                       default:
-
-                               return (AE_TYPE);
-                               break;
-                       }
-               }
-
-               else {
-                       /*
-                        * Cannot figure out the type -- set to Def_any which
-                        * will print as an error in the name table dump
-                        */
-
-
-                       obj_type = INTERNAL_TYPE_DEF_ANY;
-               }
-       }
-
-
-       /*
-        * Must increment the new value's reference count
-        * (if it is an internal object)
-        */
-
-       acpi_cm_add_reference (obj_desc);
-
-       /* Save the existing object (if any) for deletion later */
-
-       previous_obj_desc = node->object;
-
-       /* Install the object and set the type, flags */
-
-       node->object   = obj_desc;
-       node->type     = (u8) obj_type;
-       node->flags    |= flags;
-
-
-       /*
-        * Delete an existing attached object.
-        */
-
-       if (previous_obj_desc) {
-               /* One for the attach to the Node */
-
-               acpi_cm_remove_reference (previous_obj_desc);
-
-               /* Now delete */
-
-               acpi_cm_remove_reference (previous_obj_desc);
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_detach_object
- *
- * PARAMETERS:  Node           - An object whose Value will be deleted
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Delete the Value associated with a namespace object.  If the
- *              Value is an allocated object, it is freed.  Otherwise, the
- *              field is simply cleared.
- *
- ******************************************************************************/
-
-void
-acpi_ns_detach_object (
-       ACPI_NAMESPACE_NODE     *node)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-
-
-       obj_desc = node->object;
-       if (!obj_desc) {
-               return;
-       }
-
-       /* Clear the entry in all cases */
-
-       node->object = NULL;
-
-       /* Found a valid value */
-
-       /*
-        * Not every value is an object allocated via Acpi_cm_callocate,
-        * - must check
-        */
-
-       if (!acpi_tb_system_table_pointer (obj_desc)) {
-               /* Attempt to delete the object (and all subobjects) */
-
-               acpi_cm_remove_reference (obj_desc);
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_get_attached_object
- *
- * PARAMETERS:  Handle              - Parent Node to be examined
- *
- * RETURN:      Current value of the object field from the Node whose
- *              handle is passed
- *
- ******************************************************************************/
-
-void *
-acpi_ns_get_attached_object (
-       ACPI_HANDLE             handle)
-{
-
-       if (!handle) {
-               /* handle invalid */
-
-               return (NULL);
-       }
-
-       return (((ACPI_NAMESPACE_NODE *) handle)->object);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/namespace/nssearch.c b/reactos/drivers/bus/acpi/namespace/nssearch.c
deleted file mode 100644 (file)
index 53d6f19..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: nssearch - Namespace search
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nssearch")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_search_node
- *
- * PARAMETERS:  *Target_name        - Ascii ACPI name to search for
- *              *Node               - Starting table where search will begin
- *              Type                - Object type to match
- *              **Return_node       - Where the matched Named obj is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Search a single namespace table.  Performs a simple search,
- *              does not add entries or search parents.
- *
- *
- *      Named object lists are built (and subsequently dumped) in the
- *      order in which the names are encountered during the namespace load;
- *
- *      All namespace searching is linear in this implementation, but
- *      could be easily modified to support any improved search
- *      algorithm.  However, the linear search was chosen for simplicity
- *      and because the trees are small and the other interpreter
- *      execution overhead is relatively high.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_search_node (
-       u32                     target_name,
-       ACPI_NAMESPACE_NODE     *node,
-       OBJECT_TYPE_INTERNAL    type,
-       ACPI_NAMESPACE_NODE     **return_node)
-{
-       ACPI_NAMESPACE_NODE     *next_node;
-
-
-       /*
-        * Search for name in this table, which is to say that we must search
-        * for the name among the children of this object
-        */
-
-       next_node = node->child;
-       while (next_node) {
-               /* Check for match against the name */
-
-               if (next_node->name == target_name) {
-                       /*
-                        * Found matching entry.  Capture the type if appropriate, before
-                        * returning the entry.
-                        *
-                        * The Def_field_defn and Bank_field_defn cases are actually looking up
-                        * the Region in which the field will be defined
-                        */
-
-                       if ((INTERNAL_TYPE_DEF_FIELD_DEFN == type) ||
-                               (INTERNAL_TYPE_BANK_FIELD_DEFN == type)) {
-                               type = ACPI_TYPE_REGION;
-                       }
-
-                       /*
-                        * Scope, Def_any, and Index_field_defn are bogus "types" which do not
-                        * actually have anything to do with the type of the name being
-                        * looked up.  For any other value of Type, if the type stored in
-                        * the entry is Any (i.e. unknown), save the actual type.
-                        */
-
-                       if (type != INTERNAL_TYPE_SCOPE &&
-                               type != INTERNAL_TYPE_DEF_ANY &&
-                               type != INTERNAL_TYPE_INDEX_FIELD_DEFN &&
-                               next_node->type == ACPI_TYPE_ANY) {
-                               next_node->type = (u8) type;
-                       }
-
-                       *return_node = next_node;
-                       return (AE_OK);
-               }
-
-
-               /*
-                * The last entry in the list points back to the parent,
-                * so a flag is used to indicate the end-of-list
-                */
-               if (next_node->flags & ANOBJ_END_OF_PEER_LIST) {
-                       /* Searched entire list, we are done */
-
-                       break;
-               }
-
-               /* Didn't match name, move on to the next peer object */
-
-               next_node = next_node->peer;
-       }
-
-
-       /* Searched entire table, not found */
-
-
-       return (AE_NOT_FOUND);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_search_parent_tree
- *
- * PARAMETERS:  *Target_name        - Ascii ACPI name to search for
- *              *Node               - Starting table where search will begin
- *              Type                - Object type to match
- *              **Return_node       - Where the matched Named Obj is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Called when a name has not been found in the current namespace
- *              table.  Before adding it or giving up, ACPI scope rules require
- *              searching enclosing scopes in cases identified by Acpi_ns_local().
- *
- *              "A name is located by finding the matching name in the current
- *              name space, and then in the parent name space. If the parent
- *              name space does not contain the name, the search continues
- *              recursively until either the name is found or the name space
- *              does not have a parent (the root of the name space).  This
- *              indicates that the name is not found" (From ACPI Specification,
- *              section 5.3)
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_ns_search_parent_tree (
-       u32                     target_name,
-       ACPI_NAMESPACE_NODE     *node,
-       OBJECT_TYPE_INTERNAL    type,
-       ACPI_NAMESPACE_NODE     **return_node)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *parent_node;
-
-
-       parent_node = acpi_ns_get_parent_object (node);
-
-       /*
-        * If there is no parent (at the root) or type is "local", we won't be
-        * searching the parent tree.
-        */
-       if ((acpi_ns_local (type))  ||
-               (!parent_node)) {
-
-
-               return (AE_NOT_FOUND);
-       }
-
-
-       /* Search the parent tree */
-
-       /*
-        * Search parents until found the target or we have backed up to
-        * the root
-        */
-
-       while (parent_node) {
-               /* Search parent scope */
-               /* TBD: [Investigate] Why ACPI_TYPE_ANY? */
-
-               status = acpi_ns_search_node (target_name, parent_node,
-                                  ACPI_TYPE_ANY, return_node);
-
-               if (ACPI_SUCCESS (status)) {
-                       return (status);
-               }
-
-               /*
-                * Not found here, go up another level
-                * (until we reach the root)
-                */
-
-               parent_node = acpi_ns_get_parent_object (parent_node);
-       }
-
-
-       /* Not found in parent tree */
-
-       return (AE_NOT_FOUND);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_search_and_enter
- *
- * PARAMETERS:  Target_name         - Ascii ACPI name to search for (4 chars)
- *              Walk_state          - Current state of the walk
- *              *Node               - Starting table where search will begin
- *              Interpreter_mode    - Add names only in MODE_Load_pass_x.
- *                                    Otherwise,search only.
- *              Type                - Object type to match
- *              Flags               - Flags describing the search restrictions
- *              **Return_node       - Where the Node is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Search for a name segment in a single name table,
- *              optionally adding it if it is not found.  If the passed
- *              Type is not Any and the type previously stored in the
- *              entry was Any (i.e. unknown), update the stored type.
- *
- *              In IMODE_EXECUTE, search only.
- *              In other modes, search and add if not found.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_search_and_enter (
-       u32                     target_name,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_NAMESPACE_NODE     *node,
-       OPERATING_MODE          interpreter_mode,
-       OBJECT_TYPE_INTERNAL    type,
-       u32                     flags,
-       ACPI_NAMESPACE_NODE     **return_node)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *new_node;
-
-
-       /* Parameter validation */
-
-       if (!node || !target_name || !return_node) {
-               REPORT_ERROR (("Ns_search_and_enter: bad (null) parameter\n"));
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Name must consist of printable characters */
-
-       if (!acpi_cm_valid_acpi_name (target_name)) {
-               REPORT_ERROR (("Ns_search_and_enter: Bad character in ACPI Name\n"));
-               return (AE_BAD_CHARACTER);
-       }
-
-
-       /* Try to find the name in the table specified by the caller */
-
-       *return_node = ENTRY_NOT_FOUND;
-       status = acpi_ns_search_node (target_name, node,
-                          type, return_node);
-       if (status != AE_NOT_FOUND) {
-               /*
-                * If we found it AND the request specifies that a find is an error,
-                * return the error
-                */
-               if ((status == AE_OK) &&
-                       (flags & NS_ERROR_IF_FOUND)) {
-                       status = AE_EXIST;
-               }
-
-               /*
-                * Either found it or there was an error
-                * -- finished either way
-                */
-               return (status);
-       }
-
-
-       /*
-        * Not found in the table.  If we are NOT performing the
-        * first pass (name entry) of loading the namespace, search
-        * the parent tree (all the way to the root if necessary.)
-        * We don't want to perform the parent search when the
-        * namespace is actually being loaded.  We want to perform
-        * the search when namespace references are being resolved
-        * (load pass 2) and during the execution phase.
-        */
-
-       if ((interpreter_mode != IMODE_LOAD_PASS1) &&
-               (flags & NS_SEARCH_PARENT)) {
-               /*
-                * Not found in table - search parent tree according
-                * to ACPI specification
-                */
-
-               status = acpi_ns_search_parent_tree (target_name, node,
-                                type, return_node);
-               if (ACPI_SUCCESS (status)) {
-                       return (status);
-               }
-       }
-
-
-       /*
-        * In execute mode, just search, never add names.  Exit now.
-        */
-       if (interpreter_mode == IMODE_EXECUTE) {
-               return (AE_NOT_FOUND);
-       }
-
-
-       /* Create the new named object */
-
-       new_node = acpi_ns_create_node (target_name);
-       if (!new_node) {
-               return (AE_NO_MEMORY);
-       }
-
-       /* Install the new object into the parent's list of children */
-
-       acpi_ns_install_node (walk_state, node, new_node, type);
-       *return_node = new_node;
-
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/namespace/nsutils.c b/reactos/drivers/bus/acpi/namespace/nsutils.c
deleted file mode 100644 (file)
index 2683520..0000000
+++ /dev/null
@@ -1,811 +0,0 @@
-/******************************************************************************
- *
- * Module Name: nsutils - Utilities for accessing ACPI namespace, accessing
- *                        parents and siblings and Scope manipulation
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nsutils")
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_valid_root_prefix
- *
- * PARAMETERS:  Prefix          - Character to be checked
- *
- * RETURN:      TRUE if a valid prefix
- *
- * DESCRIPTION: Check if a character is a valid ACPI Root prefix
- *
- ***************************************************************************/
-
-u8
-acpi_ns_valid_root_prefix (
-       NATIVE_CHAR             prefix)
-{
-
-       return ((u8) (prefix == '\\'));
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_valid_path_separator
- *
- * PARAMETERS:  Sep              - Character to be checked
- *
- * RETURN:      TRUE if a valid path separator
- *
- * DESCRIPTION: Check if a character is a valid ACPI path separator
- *
- ***************************************************************************/
-
-u8
-acpi_ns_valid_path_separator (
-       NATIVE_CHAR             sep)
-{
-
-       return ((u8) (sep == '.'));
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_get_type
- *
- * PARAMETERS:  Handle              - Parent Node to be examined
- *
- * RETURN:      Type field from Node whose handle is passed
- *
- ***************************************************************************/
-
-OBJECT_TYPE_INTERNAL
-acpi_ns_get_type (
-       ACPI_HANDLE             handle)
-{
-
-       if (!handle) {
-               REPORT_WARNING (("Ns_get_type: Null handle\n"));
-               return (ACPI_TYPE_ANY);
-       }
-
-       return (((ACPI_NAMESPACE_NODE *) handle)->type);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_local
- *
- * PARAMETERS:  Type            - A namespace object type
- *
- * RETURN:      LOCAL if names must be found locally in objects of the
- *              passed type, 0 if enclosing scopes should be searched
- *
- ***************************************************************************/
-
-u32
-acpi_ns_local (
-       OBJECT_TYPE_INTERNAL    type)
-{
-
-       if (!acpi_cm_valid_object_type (type)) {
-               /* Type code out of range  */
-
-               REPORT_WARNING (("Ns_local: Invalid Object Type\n"));
-               return (NSP_NORMAL);
-       }
-
-       return ((u32) acpi_gbl_ns_properties[type] & NSP_LOCAL);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_internalize_name
- *
- * PARAMETERS:  *External_name            - External representation of name
- *              **Converted Name        - Where to return the resulting
- *                                        internal represention of the name
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert an external representation (e.g. "\_PR_.CPU0")
- *              to internal form (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30)
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ns_internalize_name (
-       NATIVE_CHAR             *external_name,
-       NATIVE_CHAR             **converted_name)
-{
-       NATIVE_CHAR             *result = NULL;
-       NATIVE_CHAR             *internal_name;
-       u32                     num_segments = 0;
-       u8                      fully_qualified = FALSE;
-       u32                     i;
-       u32                     num_carats = 0;
-
-
-       if ((!external_name)     ||
-               (*external_name == 0) ||
-               (!converted_name)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /*
-        * For the internal name, the required length is 4 bytes
-        * per segment, plus 1 each for Root_prefix, Multi_name_prefix_op,
-        * segment count, trailing null (which is not really needed,
-        * but no there's harm in putting it there)
-        *
-        * strlen() + 1 covers the first Name_seg, which has no
-        * path separator
-        */
-
-       if (acpi_ns_valid_root_prefix (external_name[0])) {
-               fully_qualified = TRUE;
-               external_name++;
-       }
-
-       else {
-               /*
-                * Handle Carat prefixes
-                */
-
-               while (*external_name == '^') {
-                       num_carats++;
-                       external_name++;
-               }
-       }
-
-       /*
-        * Determine the number of ACPI name "segments" by counting
-        * the number of path separators within the string.  Start
-        * with one segment since the segment count is (# separators)
-        * + 1, and zero separators is ok.
-        */
-
-       if (*external_name) {
-               num_segments = 1;
-               for (i = 0; external_name[i]; i++) {
-                       if (acpi_ns_valid_path_separator (external_name[i])) {
-                               num_segments++;
-                       }
-               }
-       }
-
-
-       /* We need a segment to store the internal version of the name */
-
-       internal_name = acpi_cm_callocate ((ACPI_NAME_SIZE * num_segments) + 4 + num_carats);
-       if (!internal_name) {
-               return (AE_NO_MEMORY);
-       }
-
-
-       /* Setup the correct prefixes, counts, and pointers */
-
-       if (fully_qualified) {
-               internal_name[0] = '\\';
-
-               if (num_segments <= 1) {
-                       result = &internal_name[1];
-               }
-               else if (num_segments == 2) {
-                       internal_name[1] = AML_DUAL_NAME_PREFIX;
-                       result = &internal_name[2];
-               }
-               else {
-                       internal_name[1] = AML_MULTI_NAME_PREFIX_OP;
-                       internal_name[2] = (char) num_segments;
-                       result = &internal_name[3];
-               }
-
-       }
-
-       else {
-               /*
-                * Not fully qualified.
-                * Handle Carats first, then append the name segments
-                */
-
-               i = 0;
-               if (num_carats) {
-                       for (i = 0; i < num_carats; i++) {
-                               internal_name[i] = '^';
-                       }
-               }
-
-               if (num_segments == 1) {
-                       result = &internal_name[i];
-               }
-
-               else if (num_segments == 2) {
-                       internal_name[i] = AML_DUAL_NAME_PREFIX;
-                       result = &internal_name[i+1];
-               }
-
-               else {
-                       internal_name[i] = AML_MULTI_NAME_PREFIX_OP;
-                       internal_name[i+1] = (char) num_segments;
-                       result = &internal_name[i+2];
-               }
-       }
-
-
-       /* Build the name (minus path separators) */
-
-       for (; num_segments; num_segments--) {
-               for (i = 0; i < ACPI_NAME_SIZE; i++) {
-                       if (acpi_ns_valid_path_separator (*external_name) ||
-                          (*external_name == 0)) {
-                               /*
-                                * Pad the segment with underscore(s) if
-                                * segment is short
-                                */
-
-                               result[i] = '_';
-                       }
-
-                       else {
-                               /* Convert s8 to uppercase and save it */
-
-                               result[i] = (char) TOUPPER (*external_name);
-                               external_name++;
-                       }
-
-               }
-
-               /* Now we must have a path separator, or the pathname is bad */
-
-               if (!acpi_ns_valid_path_separator (*external_name) &&
-                       (*external_name != 0)) {
-                       acpi_cm_free (internal_name);
-                       return (AE_BAD_PARAMETER);
-               }
-
-               /* Move on the next segment */
-
-               external_name++;
-               result += ACPI_NAME_SIZE;
-       }
-
-
-       /* Return the completed name */
-
-       /* Terminate the string! */
-       *result = 0;
-       *converted_name = internal_name;
-
-
-
-       return (AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_externalize_name
- *
- * PARAMETERS:  *Internal_name         - Internal representation of name
- *              **Converted_name       - Where to return the resulting
- *                                        external representation of name
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert internal name (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30)
- *              to its external form (e.g. "\_PR_.CPU0")
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_ns_externalize_name (
-       u32                     internal_name_length,
-       char                    *internal_name,
-       u32                     *converted_name_length,
-       char                    **converted_name)
-{
-       u32                     prefix_length = 0;
-       u32                     names_index = 0;
-       u32                     names_count = 0;
-       u32                     i = 0;
-       u32                     j = 0;
-
-
-       if (!internal_name_length   ||
-               !internal_name          ||
-               !converted_name_length  ||
-               !converted_name) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /*
-        * Check for a prefix (one '\' | one or more '^').
-        */
-       switch (internal_name[0]) {
-       case '\\':
-               prefix_length = 1;
-               break;
-
-       case '^':
-               for (i = 0; i < internal_name_length; i++) {
-                       if (internal_name[i] != '^') {
-                               prefix_length = i + 1;
-                       }
-               }
-
-               if (i == internal_name_length) {
-                       prefix_length = i;
-               }
-
-               break;
-       }
-
-       /*
-        * Check for object names.  Note that there could be 0-255 of these
-        * 4-byte elements.
-        */
-       if (prefix_length < internal_name_length) {
-               switch (internal_name[prefix_length]) {
-
-               /* <count> 4-byte names */
-
-               case AML_MULTI_NAME_PREFIX_OP:
-                       names_index = prefix_length + 2;
-                       names_count = (u32) internal_name[prefix_length + 1];
-                       break;
-
-
-               /* two 4-byte names */
-
-               case AML_DUAL_NAME_PREFIX:
-                       names_index = prefix_length + 1;
-                       names_count = 2;
-                       break;
-
-
-               /* Null_name */
-
-               case 0:
-                       names_index = 0;
-                       names_count = 0;
-                       break;
-
-
-               /* one 4-byte name */
-
-               default:
-                       names_index = prefix_length;
-                       names_count = 1;
-                       break;
-               }
-       }
-
-       /*
-        * Calculate the length of Converted_name, which equals the length
-        * of the prefix, length of all object names, length of any required
-        * punctuation ('.') between object names, plus the NULL terminator.
-        */
-       *converted_name_length = prefix_length + (4 * names_count) +
-                          ((names_count > 0) ? (names_count - 1) : 0) + 1;
-
-       /*
-        * Check to see if we're still in bounds.  If not, there's a problem
-        * with Internal_name (invalid format).
-        */
-       if (*converted_name_length > internal_name_length) {
-               REPORT_ERROR (("Ns_externalize_name: Invalid internal name\n"));
-               return (AE_BAD_PATHNAME);
-       }
-
-       /*
-        * Build Converted_name...
-        */
-
-       (*converted_name) = acpi_cm_callocate (*converted_name_length);
-       if (!(*converted_name)) {
-               return (AE_NO_MEMORY);
-       }
-
-       j = 0;
-
-       for (i = 0; i < prefix_length; i++) {
-               (*converted_name)[j++] = internal_name[i];
-       }
-
-       if (names_count > 0) {
-               for (i = 0; i < names_count; i++) {
-                       if (i > 0) {
-                               (*converted_name)[j++] = '.';
-                       }
-
-                       (*converted_name)[j++] = internal_name[names_index++];
-                       (*converted_name)[j++] = internal_name[names_index++];
-                       (*converted_name)[j++] = internal_name[names_index++];
-                       (*converted_name)[j++] = internal_name[names_index++];
-               }
-       }
-
-       return (AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_convert_handle_to_entry
- *
- * PARAMETERS:  Handle          - Handle to be converted to an Node
- *
- * RETURN:      A Name table entry pointer
- *
- * DESCRIPTION: Convert a namespace handle to a real Node
- *
- ****************************************************************************/
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_convert_handle_to_entry (
-       ACPI_HANDLE             handle)
-{
-
-       /*
-        * Simple implementation for now;
-        * TBD: [Future] Real integer handles allow for more verification
-        * and keep all pointers within this subsystem!
-        */
-
-       if (!handle) {
-               return (NULL);
-       }
-
-       if (handle == ACPI_ROOT_OBJECT) {
-               return (acpi_gbl_root_node);
-       }
-
-
-       /* We can at least attempt to verify the handle */
-
-       if (!VALID_DESCRIPTOR_TYPE (handle, ACPI_DESC_TYPE_NAMED)) {
-               return (NULL);
-       }
-
-       return ((ACPI_NAMESPACE_NODE *) handle);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_convert_entry_to_handle
- *
- * PARAMETERS:  Node          - Node to be converted to a Handle
- *
- * RETURN:      An USER ACPI_HANDLE
- *
- * DESCRIPTION: Convert a real Node to a namespace handle
- *
- ****************************************************************************/
-
-ACPI_HANDLE
-acpi_ns_convert_entry_to_handle (
-       ACPI_NAMESPACE_NODE         *node)
-{
-
-
-       /*
-        * Simple implementation for now;
-        * TBD: [Future] Real integer handles allow for more verification
-        * and keep all pointers within this subsystem!
-        */
-
-       return ((ACPI_HANDLE) node);
-
-
-/* ---------------------------------------------------
-
-       if (!Node)
-       {
-               return (NULL);
-       }
-
-       if (Node == Acpi_gbl_Root_node)
-       {
-               return (ACPI_ROOT_OBJECT);
-       }
-
-
-       return ((ACPI_HANDLE) Node);
-------------------------------------------------------*/
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ns_terminate
- *
- * PARAMETERS:  none
- *
- * RETURN:      none
- *
- * DESCRIPTION: free memory allocated for table storage.
- *
- ******************************************************************************/
-
-void
-acpi_ns_terminate (void)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_NAMESPACE_NODE     *this_node;
-
-
-       this_node = acpi_gbl_root_node;
-
-       /*
-        * 1) Free the entire namespace -- all objects, tables, and stacks
-        */
-       /*
-        * Delete all objects linked to the root
-        * (additional table descriptors)
-        */
-
-       acpi_ns_delete_namespace_subtree (this_node);
-
-       /* Detach any object(s) attached to the root */
-
-       obj_desc = acpi_ns_get_attached_object (this_node);
-       if (obj_desc) {
-               acpi_ns_detach_object (this_node);
-               acpi_cm_remove_reference (obj_desc);
-       }
-
-       acpi_ns_delete_children (this_node);
-
-
-       /*
-        * 2) Now we can delete the ACPI tables
-        */
-
-       acpi_tb_delete_acpi_tables ();
-
-       return;
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_opens_scope
- *
- * PARAMETERS:  Type        - A valid namespace type
- *
- * RETURN:      NEWSCOPE if the passed type "opens a name scope" according
- *              to the ACPI specification, else 0
- *
- ***************************************************************************/
-
-u32
-acpi_ns_opens_scope (
-       OBJECT_TYPE_INTERNAL    type)
-{
-
-       if (!acpi_cm_valid_object_type (type)) {
-               /* type code out of range  */
-
-               REPORT_WARNING (("Ns_opens_scope: Invalid Object Type\n"));
-               return (NSP_NORMAL);
-       }
-
-       return (((u32) acpi_gbl_ns_properties[type]) & NSP_NEWSCOPE);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_get_node
- *
- * PARAMETERS:  *Pathname   - Name to be found, in external (ASL) format. The
- *                            \ (backslash) and ^ (carat) prefixes, and the
- *                            . (period) to separate segments are supported.
- *              Start_node  - Root of subtree to be searched, or NS_ALL for the
- *                            root of the name space.  If Name is fully
- *                            qualified (first s8 is '\'), the passed value
- *                            of Scope will not be accessed.
- *              Return_node - Where the Node is returned
- *
- * DESCRIPTION: Look up a name relative to a given scope and return the
- *              corresponding Node.  NOTE: Scope can be null.
- *
- * MUTEX:       Locks namespace
- *
- ***************************************************************************/
-
-ACPI_STATUS
-acpi_ns_get_node (
-       NATIVE_CHAR             *pathname,
-       ACPI_NAMESPACE_NODE     *start_node,
-       ACPI_NAMESPACE_NODE     **return_node)
-{
-       ACPI_GENERIC_STATE      scope_info;
-       ACPI_STATUS             status;
-       NATIVE_CHAR             *internal_path = NULL;
-
-
-       /* Ensure that the namespace has been initialized */
-
-       if (!acpi_gbl_root_node) {
-               return (AE_NO_NAMESPACE);
-       }
-
-       if (!pathname) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Convert path to internal representation */
-
-       status = acpi_ns_internalize_name (pathname, &internal_path);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /* Setup lookup scope (search starting point) */
-
-       scope_info.scope.node = start_node;
-
-       /* Lookup the name in the namespace */
-
-       status = acpi_ns_lookup (&scope_info, internal_path,
-                        ACPI_TYPE_ANY, IMODE_EXECUTE,
-                        NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
-                        NULL, return_node);
-
-
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       /* Cleanup */
-
-       acpi_cm_free (internal_path);
-
-       return (status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_find_parent_name
- *
- * PARAMETERS:  *Child_node            - Named Obj whose name is to be found
- *
- * RETURN:      The ACPI name
- *
- * DESCRIPTION: Search for the given obj in its parent scope and return the
- *              name segment, or "????" if the parent name can't be found
- *              (which "should not happen").
- *
- ***************************************************************************/
-
-ACPI_NAME
-acpi_ns_find_parent_name (
-       ACPI_NAMESPACE_NODE     *child_node)
-{
-       ACPI_NAMESPACE_NODE     *parent_node;
-
-
-       if (child_node) {
-               /* Valid entry.  Get the parent Node */
-
-               parent_node = acpi_ns_get_parent_object (child_node);
-               if (parent_node) {
-                       if (parent_node->name) {
-                               return (parent_node->name);
-                       }
-               }
-
-       }
-
-
-       return (ACPI_UNKNOWN_NAME);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_get_parent_object
- *
- * PARAMETERS:  Node       - Current table entry
- *
- * RETURN:      Parent entry of the given entry
- *
- * DESCRIPTION: Obtain the parent entry for a given entry in the namespace.
- *
- ***************************************************************************/
-
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_get_parent_object (
-       ACPI_NAMESPACE_NODE     *node)
-{
-
-
-       if (!node) {
-               return (NULL);
-       }
-
-       /*
-        * Walk to the end of this peer list.
-        * The last entry is marked with a flag and the peer
-        * pointer is really a pointer back to the parent.
-        * This saves putting a parent back pointer in each and
-        * every named object!
-        */
-
-       while (!(node->flags & ANOBJ_END_OF_PEER_LIST)) {
-               node = node->peer;
-       }
-
-
-       return (node->peer);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_ns_get_next_valid_object
- *
- * PARAMETERS:  Node       - Current table entry
- *
- * RETURN:      Next valid object in the table.  NULL if no more valid
- *              objects
- *
- * DESCRIPTION: Find the next valid object within a name table.
- *              Useful for implementing NULL-end-of-list loops.
- *
- ***************************************************************************/
-
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_get_next_valid_object (
-       ACPI_NAMESPACE_NODE     *node)
-{
-
-       /* If we are at the end of this peer list, return NULL */
-
-       if (node->flags & ANOBJ_END_OF_PEER_LIST) {
-               return NULL;
-       }
-
-       /* Otherwise just return the next peer */
-
-       return (node->peer);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/namespace/nswalk.c b/reactos/drivers/bus/acpi/namespace/nswalk.c
deleted file mode 100644 (file)
index ddfdecd..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-/******************************************************************************
- *
- * Module Name: nswalk - Functions for walking the APCI namespace
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nswalk")
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_get_next_object
- *
- * PARAMETERS:  Type                - Type of object to be searched for
- *              Parent              - Parent object whose children we are
- *                                      getting
- *              Last_child          - Previous child that was found.
- *                                    The NEXT child will be returned
- *
- * RETURN:      ACPI_NAMESPACE_NODE - Pointer to the NEXT child or NULL if
- *                                      none is found.
- *
- * DESCRIPTION: Return the next peer object within the namespace.  If Handle
- *              is valid, Scope is ignored.  Otherwise, the first object
- *              within Scope is returned.
- *
- ****************************************************************************/
-
-ACPI_NAMESPACE_NODE *
-acpi_ns_get_next_object (
-       OBJECT_TYPE_INTERNAL    type,
-       ACPI_NAMESPACE_NODE     *parent_node,
-       ACPI_NAMESPACE_NODE     *child_node)
-{
-       ACPI_NAMESPACE_NODE     *next_node = NULL;
-
-
-       if (!child_node) {
-
-               /* It's really the parent's _scope_ that we want */
-
-               if (parent_node->child) {
-                       next_node = parent_node->child;
-               }
-       }
-
-       else {
-               /* Start search at the NEXT object */
-
-               next_node = acpi_ns_get_next_valid_object (child_node);
-       }
-
-
-       /* If any type is OK, we are done */
-
-       if (type == ACPI_TYPE_ANY) {
-               /* Next_node is NULL if we are at the end-of-list */
-
-               return (next_node);
-       }
-
-
-       /* Must search for the object -- but within this scope only */
-
-       while (next_node) {
-               /* If type matches, we are done */
-
-               if (next_node->type == type) {
-                       return (next_node);
-               }
-
-               /* Otherwise, move on to the next object */
-
-               next_node = acpi_ns_get_next_valid_object (next_node);
-       }
-
-
-       /* Not found */
-
-       return (NULL);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_ns_walk_namespace
- *
- * PARAMETERS:  Type                - ACPI_OBJECT_TYPE to search for
- *              Start_node          - Handle in namespace where search begins
- *              Max_depth           - Depth to which search is to reach
- *              Unlock_before_callback- Whether to unlock the NS before invoking
- *                                    the callback routine
- *              User_function       - Called when an object of "Type" is found
- *              Context             - Passed to user function
- *
- * RETURNS      Return value from the User_function if terminated early.
- *              Otherwise, returns NULL.
- *
- * DESCRIPTION: Performs a modified depth-first walk of the namespace tree,
- *              starting (and ending) at the object specified by Start_handle.
- *              The User_function is called whenever an object that matches
- *              the type parameter is found.  If the user function returns
- *              a non-zero value, the search is terminated immediately and this
- *              value is returned to the caller.
- *
- *              The point of this procedure is to provide a generic namespace
- *              walk routine that can be called from multiple places to
- *              provide multiple services;  the User Function can be tailored
- *              to each task, whether it is a print function, a compare
- *              function, etc.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ns_walk_namespace (
-       OBJECT_TYPE_INTERNAL    type,
-       ACPI_HANDLE             start_node,
-       u32                     max_depth,
-       u8                      unlock_before_callback,
-       WALK_CALLBACK           user_function,
-       void                    *context,
-       void                    **return_value)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *child_node;
-       ACPI_NAMESPACE_NODE     *parent_node;
-       OBJECT_TYPE_INTERNAL    child_type;
-       u32                     level;
-
-
-       /* Special case for the namespace Root Node */
-
-       if (start_node == ACPI_ROOT_OBJECT) {
-               start_node = acpi_gbl_root_node;
-       }
-
-
-       /* Null child means "get first object" */
-
-       parent_node = start_node;
-       child_node = 0;
-       child_type  = ACPI_TYPE_ANY;
-       level       = 1;
-
-       /*
-        * Traverse the tree of objects until we bubble back up to where we
-        * started. When Level is zero, the loop is done because we have
-        * bubbled up to (and passed) the original parent handle (Start_entry)
-        */
-
-       while (level > 0) {
-               /*
-                * Get the next typed object in this scope.  Null returned
-                * if not found
-                */
-
-               status = AE_OK;
-               child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY,
-                                parent_node,
-                                child_node);
-
-               if (child_node) {
-                       /*
-                        * Found an object, Get the type if we are not
-                        * searching for ANY
-                        */
-
-                       if (type != ACPI_TYPE_ANY) {
-                               child_type = child_node->type;
-                       }
-
-                       if (child_type == type) {
-                               /*
-                                * Found a matching object, invoke the user
-                                * callback function
-                                */
-
-                               if (unlock_before_callback) {
-                                       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-                               }
-
-                               status = user_function (child_node, level,
-                                                context, return_value);
-
-                               if (unlock_before_callback) {
-                                       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-                               }
-
-                               switch (status) {
-                               case AE_OK:
-                               case AE_CTRL_DEPTH:
-                                       /* Just keep going */
-                                       break;
-
-                               case AE_CTRL_TERMINATE:
-                                       /* Exit now, with OK status */
-                                       return (AE_OK);
-                                       break;
-
-                               default:
-                                       /* All others are valid exceptions */
-                                       return (status);
-                                       break;
-                               }
-                       }
-
-                       /*
-                        * Depth first search:
-                        * Attempt to go down another level in the namespace
-                        * if we are allowed to.  Don't go any further if we
-                        * have reached the caller specified maximum depth
-                        * or if the user function has specified that the
-                        * maximum depth has been reached.
-                        */
-
-                       if ((level < max_depth) && (status != AE_CTRL_DEPTH)) {
-                               if (acpi_ns_get_next_object (ACPI_TYPE_ANY,
-                                                child_node, 0)) {
-                                       /*
-                                        * There is at least one child of this
-                                        * object, visit the object
-                                        */
-                                       level++;
-                                       parent_node   = child_node;
-                                       child_node    = 0;
-                               }
-                       }
-               }
-
-               else {
-                       /*
-                        * No more children in this object (Acpi_ns_get_next_object
-                        * failed), go back upwards in the namespace tree to
-                        * the object's parent.
-                        */
-                       level--;
-                       child_node = parent_node;
-                       parent_node = acpi_ns_get_parent_object (parent_node);
-               }
-       }
-
-       /* Complete walk, not terminated by user function */
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/namespace/nsxfname.c b/reactos/drivers/bus/acpi/namespace/nsxfname.c
deleted file mode 100644 (file)
index 780919c..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-/******************************************************************************
- *
- * Module Name: nsxfname - Public interfaces to the ACPI subsystem
- *                         ACPI Namespace oriented interfaces
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nsxfname")
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_get_handle
- *
- * PARAMETERS:  Parent          - Object to search under (search scope).
- *              Path_name       - Pointer to an asciiz string containing the
- *                                  name
- *              Ret_handle      - Where the return handle is placed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This routine will search for a caller specified name in the
- *              name space.  The caller can restrict the search region by
- *              specifying a non NULL parent.  The parent value is itself a
- *              namespace handle.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_handle (
-       ACPI_HANDLE             parent,
-       ACPI_STRING             pathname,
-       ACPI_HANDLE             *ret_handle)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *node = NULL;
-       ACPI_NAMESPACE_NODE     *prefix_node = NULL;
-
-
-       if (!ret_handle || !pathname) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Convert a parent handle to a prefix node */
-
-       if (parent) {
-               acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-               prefix_node = acpi_ns_convert_handle_to_entry (parent);
-               if (!prefix_node) {
-                       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-                       return (AE_BAD_PARAMETER);
-               }
-
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       }
-
-       /* Special case for root, since we can't search for it */
-
-       if (STRCMP (pathname, NS_ROOT_PATH) == 0) {
-               *ret_handle = acpi_ns_convert_entry_to_handle (acpi_gbl_root_node);
-               return (AE_OK);
-       }
-
-       /*
-        *  Find the Node and convert to a handle
-        */
-       status = acpi_ns_get_node (pathname, prefix_node, &node);
-
-       *ret_handle = NULL;
-       if (ACPI_SUCCESS (status)) {
-               *ret_handle = acpi_ns_convert_entry_to_handle (node);
-       }
-
-       return (status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_get_pathname
- *
- * PARAMETERS:  Handle          - Handle to be converted to a pathname
- *              Name_type       - Full pathname or single segment
- *              Ret_path_ptr    - Buffer for returned path
- *
- * RETURN:      Pointer to a string containing the fully qualified Name.
- *
- * DESCRIPTION: This routine returns the fully qualified name associated with
- *              the Handle parameter.  This and the Acpi_pathname_to_handle are
- *              complementary functions.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_name (
-       ACPI_HANDLE             handle,
-       u32                     name_type,
-       ACPI_BUFFER             *ret_path_ptr)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *node;
-
-
-       /* Buffer pointer must be valid always */
-
-       if (!ret_path_ptr || (name_type > ACPI_NAME_TYPE_MAX)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Allow length to be zero and ignore the pointer */
-
-       if ((ret_path_ptr->length) &&
-          (!ret_path_ptr->pointer)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       if (name_type == ACPI_FULL_PATHNAME) {
-               /* Get the full pathname (From the namespace root) */
-
-               status = acpi_ns_handle_to_pathname (handle, &ret_path_ptr->length,
-                                  ret_path_ptr->pointer);
-               return (status);
-       }
-
-       /*
-        * Wants the single segment ACPI name.
-        * Validate handle and convert to an Node
-        */
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-       node = acpi_ns_convert_handle_to_entry (handle);
-       if (!node) {
-               status = AE_BAD_PARAMETER;
-               goto unlock_and_exit;
-       }
-
-       /* Check if name will fit in buffer */
-
-       if (ret_path_ptr->length < PATH_SEGMENT_LENGTH) {
-               ret_path_ptr->length = PATH_SEGMENT_LENGTH;
-               status = AE_BUFFER_OVERFLOW;
-               goto unlock_and_exit;
-       }
-
-       /* Just copy the ACPI name from the Node and zero terminate it */
-
-       STRNCPY (ret_path_ptr->pointer, (NATIVE_CHAR *) &node->name,
-                        ACPI_NAME_SIZE);
-       ((NATIVE_CHAR *) ret_path_ptr->pointer) [ACPI_NAME_SIZE] = 0;
-       status = AE_OK;
-
-
-unlock_and_exit:
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_get_object_info
- *
- * PARAMETERS:  Handle          - Object Handle
- *              Info            - Where the info is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Returns information about an object as gleaned from the
- *              namespace node and possibly by running several standard
- *              control methods (Such as in the case of a device.)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_object_info (
-       ACPI_HANDLE             handle,
-       ACPI_DEVICE_INFO        *info)
-{
-       DEVICE_ID               hid;
-       DEVICE_ID               uid;
-       ACPI_STATUS             status;
-       u32                     device_status = 0;
-       ACPI_INTEGER            address = 0;
-       ACPI_NAMESPACE_NODE     *node;
-
-
-       /* Parameter validation */
-
-       if (!handle || !info) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       node = acpi_ns_convert_handle_to_entry (handle);
-       if (!node) {
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-               return (AE_BAD_PARAMETER);
-       }
-
-       info->type      = node->type;
-       info->name      = node->name;
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       /*
-        * If not a device, we are all done.
-        */
-       if (info->type != ACPI_TYPE_DEVICE) {
-               return (AE_OK);
-       }
-
-
-       /*
-        * Get extra info for ACPI devices only.  Run the
-        * _HID, _UID, _STA, and _ADR methods.  Note: none
-        * of these methods are required, so they may or may
-        * not be present.  The Info->Valid bits are used
-        * to indicate which methods ran successfully.
-        */
-
-       info->valid = 0;
-
-       /* Execute the _HID method and save the result */
-
-       status = acpi_cm_execute_HID (node, &hid);
-       if (ACPI_SUCCESS (status)) {
-               STRNCPY (info->hardware_id, hid.buffer, sizeof(info->hardware_id));
-
-               info->valid |= ACPI_VALID_HID;
-       }
-
-       /* Execute the _UID method and save the result */
-
-       status = acpi_cm_execute_UID (node, &uid);
-       if (ACPI_SUCCESS (status)) {
-               STRCPY (info->unique_id, uid.buffer);
-
-               info->valid |= ACPI_VALID_UID;
-       }
-
-       /*
-        * Execute the _STA method and save the result
-        * _STA is not always present
-        */
-
-       status = acpi_cm_execute_STA (node, &device_status);
-       if (ACPI_SUCCESS (status)) {
-               info->current_status = device_status;
-               info->valid |= ACPI_VALID_STA;
-       }
-
-       /*
-        * Execute the _ADR method and save result if successful
-        * _ADR is not always present
-        */
-
-       status = acpi_cm_evaluate_numeric_object (METHOD_NAME__ADR,
-                         node, &address);
-
-       if (ACPI_SUCCESS (status)) {
-               info->address = address;
-               info->valid |= ACPI_VALID_ADR;
-       }
-
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/namespace/nsxfobj.c b/reactos/drivers/bus/acpi/namespace/nsxfobj.c
deleted file mode 100644 (file)
index 1eaaedf..0000000
+++ /dev/null
@@ -1,690 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: nsxfobj - Public interfaces to the ACPI subsystem
- *                         ACPI Object oriented interfaces
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_NAMESPACE
-        MODULE_NAME         ("nsxfobj")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_evaluate_object
- *
- * PARAMETERS:  Handle              - Object handle (optional)
- *              *Pathname           - Object pathname (optional)
- *              **Params            - List of parameters to pass to
- *                                    method, terminated by NULL.
- *                                    Params itself may be NULL
- *                                    if no parameters are being
- *                                    passed.
- *              *Return_object      - Where to put method's return value (if
- *                                    any).  If NULL, no value is returned.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Find and evaluate the given object, passing the given
- *              parameters if necessary.  One of "Handle" or "Pathname" must
- *              be valid (non-null)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_evaluate_object (
-       ACPI_HANDLE             handle,
-       ACPI_STRING             pathname,
-       ACPI_OBJECT_LIST        *param_objects,
-       ACPI_BUFFER             *return_buffer)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     **param_ptr = NULL;
-       ACPI_OPERAND_OBJECT     *return_obj = NULL;
-       ACPI_OPERAND_OBJECT     *object_ptr = NULL;
-       u32                     buffer_space_needed;
-       u32                     user_buffer_length;
-       u32                     count;
-       u32                     i;
-       u32                     param_length;
-       u32                     object_length;
-
-
-       /*
-        * If there are parameters to be passed to the object
-        * (which must be a control method), the external objects
-        * must be converted to internal objects
-        */
-
-       if (param_objects && param_objects->count) {
-               /*
-                * Allocate a new parameter block for the internal objects
-                * Add 1 to count to allow for null terminated internal list
-                */
-
-               count           = param_objects->count;
-               param_length    = (count + 1) * sizeof (void *);
-               object_length   = count * sizeof (ACPI_OPERAND_OBJECT);
-
-               param_ptr = acpi_cm_callocate (param_length + /* Parameter List part */
-                                 object_length); /* Actual objects */
-               if (!param_ptr) {
-                       return (AE_NO_MEMORY);
-               }
-
-               object_ptr = (ACPI_OPERAND_OBJECT *) ((u8 *) param_ptr +
-                                 param_length);
-
-               /*
-                * Init the param array of pointers and NULL terminate
-                * the list
-                */
-
-               for (i = 0; i < count; i++) {
-                       param_ptr[i] = &object_ptr[i];
-                       acpi_cm_init_static_object (&object_ptr[i]);
-               }
-               param_ptr[count] = NULL;
-
-               /*
-                * Convert each external object in the list to an
-                * internal object
-                */
-               for (i = 0; i < count; i++) {
-                       status = acpi_cm_copy_eobject_to_iobject (&param_objects->pointer[i],
-                                        param_ptr[i]);
-
-                       if (ACPI_FAILURE (status)) {
-                               acpi_cm_delete_internal_object_list (param_ptr);
-                               return (status);
-                       }
-               }
-       }
-
-
-       /*
-        * Three major cases:
-        * 1) Fully qualified pathname
-        * 2) No handle, not fully qualified pathname (error)
-        * 3) Valid handle
-        */
-
-       if ((pathname) &&
-               (acpi_ns_valid_root_prefix (pathname[0]))) {
-               /*
-                *  The path is fully qualified, just evaluate by name
-                */
-               status = acpi_ns_evaluate_by_name (pathname, param_ptr, &return_obj);
-       }
-
-       else if (!handle) {
-               /*
-                * A handle is optional iff a fully qualified pathname
-                * is specified.  Since we've already handled fully
-                * qualified names above, this is an error
-                */
-
-
-
-               status = AE_BAD_PARAMETER;
-       }
-
-       else {
-               /*
-                * We get here if we have a handle -- and if we have a
-                * pathname it is relative.  The handle will be validated
-                * in the lower procedures
-                */
-
-               if (!pathname) {
-                       /*
-                        * The null pathname case means the handle is for
-                        * the actual object to be evaluated
-                        */
-                       status = acpi_ns_evaluate_by_handle (handle, param_ptr, &return_obj);
-               }
-
-               else {
-                  /*
-                       * Both a Handle and a relative Pathname
-                       */
-                       status = acpi_ns_evaluate_relative (handle, pathname, param_ptr,
-                                        &return_obj);
-               }
-       }
-
-
-       /*
-        * If we are expecting a return value, and all went well above,
-        * copy the return value to an external object.
-        */
-
-       if (return_buffer) {
-               user_buffer_length = return_buffer->length;
-               return_buffer->length = 0;
-
-               if (return_obj) {
-                       if (VALID_DESCRIPTOR_TYPE (return_obj, ACPI_DESC_TYPE_NAMED)) {
-                               /*
-                                * If we got an Node as a return object,
-                                * this means the object we are evaluating
-                                * has nothing interesting to return (such
-                                * as a mutex, etc.)  We return an error
-                                * because these types are essentially
-                                * unsupported by this interface.  We
-                                * don't check up front because this makes
-                                * it easier to add support for various
-                                * types at a later date if necessary.
-                                */
-                               status = AE_TYPE;
-                               return_obj = NULL;  /* No need to delete an Node */
-                       }
-
-                       if (ACPI_SUCCESS (status)) {
-                               /*
-                                * Find out how large a buffer is needed
-                                * to contain the returned object
-                                */
-                               status = acpi_cm_get_object_size (return_obj,
-                                                  &buffer_space_needed);
-                               if (ACPI_SUCCESS (status)) {
-                                       /*
-                                        * Check if there is enough room in the
-                                        * caller's buffer
-                                        */
-
-                                       if (user_buffer_length < buffer_space_needed) {
-                                               /*
-                                                * Caller's buffer is too small, can't
-                                                * give him partial results fail the call
-                                                * but return the buffer size needed
-                                                */
-
-                                               return_buffer->length = buffer_space_needed;
-                                               status = AE_BUFFER_OVERFLOW;
-                                       }
-
-                                       else {
-                                               /*
-                                                *  We have enough space for the object, build it
-                                                */
-                                               status = acpi_cm_copy_iobject_to_eobject (return_obj,
-                                                                 return_buffer);
-                                               return_buffer->length = buffer_space_needed;
-                                       }
-                               }
-                       }
-               }
-       }
-
-
-       /* Delete the return and parameter objects */
-
-       if (return_obj) {
-               /*
-                * Delete the internal return object. (Or at least
-                * decrement the reference count by one)
-                */
-               acpi_cm_remove_reference (return_obj);
-       }
-
-       /*
-        * Free the input parameter list (if we created one),
-        */
-
-       if (param_ptr) {
-               /* Free the allocated parameter block */
-
-               acpi_cm_delete_internal_object_list (param_ptr);
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_get_next_object
- *
- * PARAMETERS:  Type            - Type of object to be searched for
- *              Parent          - Parent object whose children we are getting
- *              Last_child      - Previous child that was found.
- *                                The NEXT child will be returned
- *              Ret_handle      - Where handle to the next object is placed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Return the next peer object within the namespace.  If Handle is
- *              valid, Scope is ignored.  Otherwise, the first object within
- *              Scope is returned.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_next_object (
-       ACPI_OBJECT_TYPE        type,
-       ACPI_HANDLE             parent,
-       ACPI_HANDLE             child,
-       ACPI_HANDLE             *ret_handle)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_NAMESPACE_NODE     *parent_node = NULL;
-       ACPI_NAMESPACE_NODE     *child_node = NULL;
-
-
-       /* Parameter validation */
-
-       if (type > ACPI_TYPE_MAX) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /* If null handle, use the parent */
-
-       if (!child) {
-               /* Start search at the beginning of the specified scope */
-
-               parent_node = acpi_ns_convert_handle_to_entry (parent);
-               if (!parent_node) {
-                       status = AE_BAD_PARAMETER;
-                       goto unlock_and_exit;
-               }
-       }
-
-       /* Non-null handle, ignore the parent */
-
-       else {
-               /* Convert and validate the handle */
-
-               child_node = acpi_ns_convert_handle_to_entry (child);
-               if (!child_node) {
-                       status = AE_BAD_PARAMETER;
-                       goto unlock_and_exit;
-               }
-       }
-
-
-       /* Internal function does the real work */
-
-       node = acpi_ns_get_next_object ((OBJECT_TYPE_INTERNAL) type,
-                          parent_node, child_node);
-       if (!node) {
-               status = AE_NOT_FOUND;
-               goto unlock_and_exit;
-       }
-
-       if (ret_handle) {
-               *ret_handle = acpi_ns_convert_entry_to_handle (node);
-       }
-
-
-unlock_and_exit:
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_get_type
- *
- * PARAMETERS:  Handle          - Handle of object whose type is desired
- *              *Ret_type       - Where the type will be placed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This routine returns the type associatd with a particular handle
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_type (
-       ACPI_HANDLE             handle,
-       ACPI_OBJECT_TYPE        *ret_type)
-{
-       ACPI_NAMESPACE_NODE     *node;
-
-
-       /* Parameter Validation */
-
-       if (!ret_type) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Special case for the predefined Root Node
-        * (return type ANY)
-        */
-       if (handle == ACPI_ROOT_OBJECT) {
-               *ret_type = ACPI_TYPE_ANY;
-               return (AE_OK);
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /* Convert and validate the handle */
-
-       node = acpi_ns_convert_handle_to_entry (handle);
-       if (!node) {
-               acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-               return (AE_BAD_PARAMETER);
-       }
-
-       *ret_type = node->type;
-
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_get_parent
- *
- * PARAMETERS:  Handle          - Handle of object whose parent is desired
- *              Ret_handle      - Where the parent handle will be placed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Returns a handle to the parent of the object represented by
- *              Handle.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_parent (
-       ACPI_HANDLE             handle,
-       ACPI_HANDLE             *ret_handle)
-{
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* No trace macro, too verbose */
-
-
-       if (!ret_handle) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Special case for the predefined Root Node (no parent) */
-
-       if (handle == ACPI_ROOT_OBJECT) {
-               return (AE_NULL_ENTRY);
-       }
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       /* Convert and validate the handle */
-
-       node = acpi_ns_convert_handle_to_entry (handle);
-       if (!node) {
-               status = AE_BAD_PARAMETER;
-               goto unlock_and_exit;
-       }
-
-
-       /* Get the parent entry */
-
-       *ret_handle =
-               acpi_ns_convert_entry_to_handle (acpi_ns_get_parent_object (node));
-
-       /* Return exeption if parent is null */
-
-       if (!acpi_ns_get_parent_object (node)) {
-               status = AE_NULL_ENTRY;
-       }
-
-
-unlock_and_exit:
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_walk_namespace
- *
- * PARAMETERS:  Type                - ACPI_OBJECT_TYPE to search for
- *              Start_object        - Handle in namespace where search begins
- *              Max_depth           - Depth to which search is to reach
- *              User_function       - Called when an object of "Type" is found
- *              Context             - Passed to user function
- *              Return_value        - Location where return value of
- *                                    User_function is put if terminated early
- *
- * RETURNS      Return value from the User_function if terminated early.
- *              Otherwise, returns NULL.
- *
- * DESCRIPTION: Performs a modified depth-first walk of the namespace tree,
- *              starting (and ending) at the object specified by Start_handle.
- *              The User_function is called whenever an object that matches
- *              the type parameter is found.  If the user function returns
- *              a non-zero value, the search is terminated immediately and this
- *              value is returned to the caller.
- *
- *              The point of this procedure is to provide a generic namespace
- *              walk routine that can be called from multiple places to
- *              provide multiple services;  the User Function can be tailored
- *              to each task, whether it is a print function, a compare
- *              function, etc.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_walk_namespace (
-       ACPI_OBJECT_TYPE        type,
-       ACPI_HANDLE             start_object,
-       u32                     max_depth,
-       WALK_CALLBACK           user_function,
-       void                    *context,
-       void                    **return_value)
-{
-       ACPI_STATUS             status;
-
-
-       /* Parameter validation */
-
-       if ((type > ACPI_TYPE_MAX)  ||
-               (!max_depth)            ||
-               (!user_function)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Lock the namespace around the walk.
-        * The namespace will be unlocked/locked around each call
-        * to the user function - since this function
-        * must be allowed to make Acpi calls itself.
-        */
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-       status = acpi_ns_walk_namespace ((OBJECT_TYPE_INTERNAL) type,
-                          start_object, max_depth,
-                          NS_WALK_UNLOCK,
-                          user_function, context,
-                          return_value);
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ns_get_device_callback
- *
- * PARAMETERS:  Callback from Acpi_get_device
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Takes callbacks from Walk_namespace and filters out all non-
- *              present devices, or if they specified a HID, it filters based
- *              on that.
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_ns_get_device_callback (
-       ACPI_HANDLE             obj_handle,
-       u32                     nesting_level,
-       void                    *context,
-       void                    **return_value)
-{
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *node;
-       u32                     flags;
-       DEVICE_ID               device_id;
-       ACPI_GET_DEVICES_INFO   *info;
-
-
-       info = context;
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-
-       node = acpi_ns_convert_handle_to_entry (obj_handle);
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       if (!node) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Run _STA to determine if device is present
-        */
-
-       status = acpi_cm_execute_STA (node, &flags);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       if (!(flags & 0x01)) {
-               /* don't return at the device or children of the device if not there */
-
-               return (AE_CTRL_DEPTH);
-       }
-
-       /*
-        * Filter based on device HID
-        */
-       if (info->hid != NULL) {
-               status = acpi_cm_execute_HID (node, &device_id);
-
-               if (status == AE_NOT_FOUND) {
-                       return (AE_OK);
-               }
-
-               else if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               if (STRNCMP (device_id.buffer, info->hid, sizeof (device_id.buffer)) != 0) {
-                       return (AE_OK);
-               }
-       }
-
-       info->user_function (obj_handle, nesting_level, info->context, return_value);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_get_devices
- *
- * PARAMETERS:  HID                 - HID to search for. Can be NULL.
- *              User_function       - Called when a matching object is found
- *              Context             - Passed to user function
- *              Return_value        - Location where return value of
- *                                    User_function is put if terminated early
- *
- * RETURNS      Return value from the User_function if terminated early.
- *              Otherwise, returns NULL.
- *
- * DESCRIPTION: Performs a modified depth-first walk of the namespace tree,
- *              starting (and ending) at the object specified by Start_handle.
- *              The User_function is called whenever an object that matches
- *              the type parameter is found.  If the user function returns
- *              a non-zero value, the search is terminated immediately and this
- *              value is returned to the caller.
- *
- *              This is a wrapper for Walk_namespace, but the callback performs
- *              additional filtering. Please see Acpi_get_device_callback.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_devices (
-       NATIVE_CHAR             *HID,
-       WALK_CALLBACK           user_function,
-       void                    *context,
-       void                    **return_value)
-{
-       ACPI_STATUS             status;
-       ACPI_GET_DEVICES_INFO   info;
-
-
-       /* Parameter validation */
-
-       if (!user_function) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * We're going to call their callback from OUR callback, so we need
-        * to know what it is, and their context parameter.
-        */
-       info.context      = context;
-       info.user_function = user_function;
-       info.hid          = HID;
-
-       /*
-        * Lock the namespace around the walk.
-        * The namespace will be unlocked/locked around each call
-        * to the user function - since this function
-        * must be allowed to make Acpi calls itself.
-        */
-
-       acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE);
-       status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE,
-                          ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
-                          NS_WALK_UNLOCK,
-                          acpi_ns_get_device_callback, &info,
-                          return_value);
-
-       acpi_cm_release_mutex (ACPI_MTX_NAMESPACE);
-
-       return (status);
-}
diff --git a/reactos/drivers/bus/acpi/ospm/acpienum.c b/reactos/drivers/bus/acpi/ospm/acpienum.c
deleted file mode 100644 (file)
index 6edac4e..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-/* $Id$
- *
- * PROJECT:         ReactOS ACPI bus driver
- * FILE:            acpi/ospm/acpienum.c
- * PURPOSE:         ACPI namespace enumerator
- * PROGRAMMERS:     Casper S. Hornstrup (chorns@users.sourceforge.net)
- * UPDATE HISTORY:
- *      01-05-2001  CSH  Created
- */
-#include <acpi.h>
-
-#define NDEBUG
-#include <debug.h>
-
-
-#ifndef NDEBUG
-static void
-bm_print1 (
-  BM_NODE *node,
-  u32     flags)
-{
-  ACPI_BUFFER buffer;
-  BM_DEVICE *device = NULL;
-  char *type_string = NULL;
-
-  if (!node)
-  {
-    return;
-  }
-
-  device = &(node->device);
-
-  if (flags & BM_PRINT_PRESENT)
-  {
-    if (!BM_DEVICE_PRESENT(device))
-    {
-      return;
-    }
-  }
-
-  buffer.length = 256;
-  buffer.pointer = acpi_os_callocate(buffer.length);
-  if (!buffer.pointer)
-  {
-    return;
-  }
-
-  acpi_get_name(device->acpi_handle, ACPI_FULL_PATHNAME, &buffer);
-
-  switch(device->id.type)
-  {
-    case BM_TYPE_SYSTEM:
-      type_string = "System";
-      break;
-
-    case BM_TYPE_SCOPE:
-      type_string = "Scope";
-      break;
-
-    case BM_TYPE_PROCESSOR:
-      type_string = "Processor";
-      break;
-
-    case BM_TYPE_THERMAL_ZONE:
-      type_string = "ThermalZone";
-      break;
-
-    case BM_TYPE_POWER_RESOURCE:
-      type_string = "PowerResource";
-      break;
-
-    case BM_TYPE_FIXED_BUTTON:
-      type_string = "Button";
-      break;
-
-    case BM_TYPE_DEVICE:
-      type_string = "Device";
-      break;
-
-    default:
-      type_string = "Unknown";
-      break;
-  }
-
-  if (!(flags & BM_PRINT_GROUP))
-  {
-    DbgPrint("+------------------------------------------------------------\n");
-  }
-
-  DbgPrint("%s[0x%02x] hid[%s] %s\n", type_string, device->handle, device->id.hid, buffer.pointer);
-  DbgPrint("  acpi_handle[0x%08x] flags[0x%02x] status[0x%02x]\n", device->acpi_handle, device->flags, device->status);
-
-  if (flags & BM_PRINT_IDENTIFICATION)
-  {
-    DbgPrint("  identification: uid[%s] adr[0x%08x]\n", device->id.uid, device->id.adr);
-  }
-
-  if (flags & BM_PRINT_LINKAGE)
-  {
-    DbgPrint("  linkage: this[%p] parent[%p] next[%p]\n", node, node->parent, node->next);
-    DbgPrint("    scope.head[%p] scope.tail[%p]\n", node->scope.head, node->scope.tail);
-  }
-
-  if (flags & BM_PRINT_POWER)
-  {
-    DbgPrint("  power: state[D%d] flags[0x%08X]\n", device->power.state, device->power.flags);
-    DbgPrint("    S0[0x%02x] S1[0x%02x] S2[0x%02x]\n", device->power.dx_supported[0], device->power.dx_supported[1], device->power.dx_supported[2]);
-    DbgPrint("    S3[0x%02x] S4[0x%02x] S5[0x%02x]\n", device->power.dx_supported[3], device->power.dx_supported[4], device->power.dx_supported[5]);
-  }
-
-  if (!(flags & BM_PRINT_GROUP))
-  {
-    DbgPrint("+------------------------------------------------------------\n");
-  }
-
-  acpi_os_free(buffer.pointer);
-
-  return;
-}
-#endif
-
-
-NTSTATUS
-ACPIEnumerateDevices(PFDO_DEVICE_EXTENSION DeviceExtension)
-{
-  BM_HANDLE_LIST HandleList;
-  PACPI_DEVICE AcpiDevice;
-  ACPI_STATUS AcpiStatus;
-  BM_DEVICE_ID Criteria;
-  BM_NODE *Node;
-  KIRQL OldIrql;
-  ULONG i;
-
-  DPRINT("Called\n");
-
-  RtlZeroMemory(&Criteria, sizeof(BM_DEVICE_ID));
-  Criteria.type = BM_TYPE_ALL;
-
-  AcpiStatus = bm_search(BM_HANDLE_ROOT, &Criteria, &HandleList);
-  if (ACPI_SUCCESS(AcpiStatus))
-  {
-    DPRINT("Got %d devices\n", HandleList.count);
-
-    for (i = 0; i < HandleList.count; i++)
-    {
-      AcpiStatus = bm_get_node(HandleList.handles[i], 0, &Node);
-      if (ACPI_SUCCESS(AcpiStatus))
-      {
-        DPRINT("Got BM node information: (Node 0x%X)\n", Node);
-
-        if ((Node->device.flags & BM_FLAGS_IDENTIFIABLE) &&
-            (Node->device.id.hid[0] != 0))
-        {
-#ifndef NDEBUG
-          bm_print1(Node, BM_PRINT_ALL - BM_PRINT_PRESENT);
-#endif
-
-          AcpiDevice = (PACPI_DEVICE)ExAllocatePool(NonPagedPool,
-                                                    sizeof(ACPI_DEVICE));
-          if (AcpiDevice == NULL)
-          {
-            return STATUS_INSUFFICIENT_RESOURCES;
-          }
-
-          RtlZeroMemory(AcpiDevice, sizeof(ACPI_DEVICE));
-
-          AcpiDevice->Pdo = NULL;
-          AcpiDevice->BmHandle = HandleList.handles[i];
-
-          KeAcquireSpinLock(&DeviceExtension->DeviceListLock, &OldIrql);
-          InsertHeadList(&DeviceExtension->DeviceListHead,
-                         &AcpiDevice->DeviceListEntry);
-          DeviceExtension->DeviceListCount++;
-          KeReleaseSpinLock(&DeviceExtension->DeviceListLock, OldIrql);
-        }
-      }
-      else
-      {
-        DPRINT("Could not get BM node\n");
-      }
-    }
-  }
-  else
-  {
-    DPRINT("Got no devices (Status 0x%X)\n", AcpiStatus);
-  }
-
-  return STATUS_SUCCESS;
-}
-
-/* EOF */
diff --git a/reactos/drivers/bus/acpi/ospm/acpisys.c b/reactos/drivers/bus/acpi/ospm/acpisys.c
deleted file mode 100644 (file)
index 148209d..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/* $Id$
- *
- * PROJECT:         ReactOS ACPI bus driver
- * FILE:            acpi/ospm/acpisys.c
- * PURPOSE:         Driver entry
- * PROGRAMMERS:     Casper S. Hornstrup (chorns@users.sourceforge.net)
- * UPDATE HISTORY:
- *      01-05-2001  CSH  Created
- */
-#include <acpi.h>
-
-#define NDEBUG
-#include <debug.h>
-
-NTSTATUS
-NTAPI
-DriverEntry(
-  IN PDRIVER_OBJECT DriverObject,
-  IN PUNICODE_STRING RegistryPath
-);
-
-#ifdef  ALLOC_PRAGMA
-
-// Make the initialization routines discardable, so that they
-// don't waste space
-
-#pragma  alloc_text(init, DriverEntry)
-
-#endif  /*  ALLOC_PRAGMA  */
-
-
-NTSTATUS
-NTAPI
-ACPIDispatchDeviceControl(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp)
-{
-  PIO_STACK_LOCATION IrpSp;
-  NTSTATUS Status;
-
-  DPRINT("Called. IRP is at (0x%X)\n", Irp);
-
-  Irp->IoStatus.Information = 0;
-
-  IrpSp  = IoGetCurrentIrpStackLocation(Irp);
-  switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) {
-  default:
-    DPRINT("Unknown IOCTL 0x%X\n", IrpSp->Parameters.DeviceIoControl.IoControlCode);
-    Status = STATUS_NOT_IMPLEMENTED;
-    break;
-  }
-
-  if (Status != STATUS_PENDING) {
-    Irp->IoStatus.Status = Status;
-
-    DPRINT("Completing IRP at 0x%X\n", Irp);
-
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-  }
-
-  DPRINT("Leaving. Status 0x%X\n", Status);
-
-  return Status;
-}
-
-
-NTSTATUS
-NTAPI
-ACPIPnpControl(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp)
-/*
- * FUNCTION: Handle Plug and Play IRPs
- * ARGUMENTS:
- *     DeviceObject = Pointer to PDO or FDO
- *     Irp          = Pointer to IRP that should be handled
- * RETURNS:
- *     Status
- */
-{
-  PCOMMON_DEVICE_EXTENSION DeviceExtension;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  if (DeviceExtension->IsFDO) {
-    Status = FdoPnpControl(DeviceObject, Irp);
-  } else {
-    Status = PdoPnpControl(DeviceObject, Irp);
-  }
-
-  return Status;
-}
-
-
-NTSTATUS
-NTAPI
-ACPIPowerControl(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp)
-{
-  PCOMMON_DEVICE_EXTENSION DeviceExtension;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  if (DeviceExtension->IsFDO) {
-    Status = FdoPowerControl(DeviceObject, Irp);
-  } else {
-    Status = PdoPowerControl(DeviceObject, Irp);
-  }
-
-  return Status;
-}
-
-
-NTSTATUS
-NTAPI
-ACPIAddDevice(
-  IN PDRIVER_OBJECT DriverObject,
-  IN PDEVICE_OBJECT PhysicalDeviceObject)
-{
-  PFDO_DEVICE_EXTENSION DeviceExtension;
-  PDEVICE_OBJECT Fdo;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  if (PhysicalDeviceObject == NULL)
-    return STATUS_SUCCESS;
-
-  Status = IoCreateDevice(DriverObject,
-                          sizeof(FDO_DEVICE_EXTENSION),
-                          NULL,
-                          FILE_DEVICE_ACPI,
-                          FILE_DEVICE_SECURE_OPEN,
-                          TRUE,
-                          &Fdo);
-  if (!NT_SUCCESS(Status))
-  {
-    DPRINT("IoCreateDevice() failed with status 0x%X\n", Status);
-    return Status;
-  }
-
-  DeviceExtension = (PFDO_DEVICE_EXTENSION)Fdo->DeviceExtension;
-
-  DeviceExtension->Pdo = PhysicalDeviceObject;
-  DeviceExtension->Common.IsFDO = TRUE;
-
-  DeviceExtension->Common.Ldo =
-    IoAttachDeviceToDeviceStack(Fdo, PhysicalDeviceObject);
-
-  DeviceExtension->State = dsStopped;
-
-  Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
-
-  DPRINT("Done AddDevice\n");
-
-  return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-NTAPI
-DriverEntry(
-  IN PDRIVER_OBJECT DriverObject,
-  IN PUNICODE_STRING RegistryPath)
-{
-  DPRINT("Advanced Configuration and Power Interface Bus Driver\n");
-
-  DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH) ACPIDispatchDeviceControl;
-  DriverObject->MajorFunction[IRP_MJ_PNP] = (PDRIVER_DISPATCH) ACPIPnpControl;
-  DriverObject->MajorFunction[IRP_MJ_POWER] = (PDRIVER_DISPATCH) ACPIPowerControl;
-  DriverObject->DriverExtension->AddDevice = ACPIAddDevice;
-
-  return STATUS_SUCCESS;
-}
-
-/* EOF */
diff --git a/reactos/drivers/bus/acpi/ospm/bn.c b/reactos/drivers/bus/acpi/ospm/bn.c
deleted file mode 100644 (file)
index 6df7113..0000000
+++ /dev/null
@@ -1,599 +0,0 @@
-/*****************************************************************************
- *
- * Module Name: bn.c
- *   $Revision: 1.2 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Plxxe, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <acpi.h>
-
-#define _COMPONENT             ACPI_BUTTON
-       MODULE_NAME             ("bn")
-
-
-static struct proc_dir_entry   *bn_proc_root = NULL;
-
-
-/*****************************************************************************
- *                            Internal Functions
- *****************************************************************************/
-
-/*****************************************************************************
- *
- * FUNCTION:   bn_print
- *
- * PARAMETERS: <TBD>
- *
- * RETURN:     <TBD>
- *
- * DESCRIPTION: Prints out information on a specific button.
- *
- ****************************************************************************/
-
-void
-bn_print (
-       BN_CONTEXT              *button)
-{
-#ifdef ACPI_DEBUG
-       ACPI_BUFFER             buffer;
-#endif /*ACPI_DEBUG*/
-
-       if (!button) {
-               return;
-       }
-
-       switch (button->type) {
-
-       case BN_TYPE_POWER_BUTTON:
-       case BN_TYPE_POWER_BUTTON_FIXED:
-               acpi_os_printf("Power Button: found\n");
-               break;
-
-       case BN_TYPE_SLEEP_BUTTON:
-       case BN_TYPE_SLEEP_BUTTON_FIXED:
-               acpi_os_printf("Sleep Button: found\n");
-               break;
-
-       case BN_TYPE_LID_SWITCH:
-               acpi_os_printf("Lid Switch: found\n");
-               break;
-       }
-
-#ifdef ACPI_DEBUG
-       buffer.length = 256;
-       buffer.pointer = acpi_os_callocate(buffer.length);
-       if (!buffer.pointer) {
-               return;
-       }
-
-       /*
-        * Get the full pathname for this ACPI object.
-        */
-       acpi_get_name(button->acpi_handle, ACPI_FULL_PATHNAME, &buffer);
-
-       /*
-        * Print out basic button information.
-        */
-       DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n"));
-
-       switch (button->type) {
-
-       case BN_TYPE_POWER_BUTTON:
-       case BN_TYPE_POWER_BUTTON_FIXED:
-               DEBUG_PRINT(ACPI_INFO, ("| PowerButton[0x%02x]|[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer));
-               break;
-
-       case BN_TYPE_SLEEP_BUTTON:
-       case BN_TYPE_SLEEP_BUTTON_FIXED:
-               DEBUG_PRINT(ACPI_INFO, ("| SleepButton[0x%02x]|[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer));
-               break;
-
-       case BN_TYPE_LID_SWITCH:
-               DEBUG_PRINT(ACPI_INFO, ("| LidSwitch[0x%02x]|[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer));
-               break;
-       }
-
-       DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n"));
-
-       acpi_os_free(buffer.pointer);
-#endif /*ACPI_DEBUG*/
-
-       return;
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:   bn_add_device
- *
- * PARAMETERS: <TBD>
- *
- * RETURN:     <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bn_add_device(
-       BM_HANDLE               device_handle,
-       void                    **context)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE               *device = NULL;
-       BN_CONTEXT              *button = NULL;
-
-       FUNCTION_TRACE("bn_add_device");
-
-       DEBUG_PRINT(ACPI_INFO, ("Adding button device [0x%02x].\n", device_handle));
-
-       if (!context || *context) {
-               DEBUG_PRINT(ACPI_ERROR, ("Invalid context.\n"));
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Get information on this device.
-        */
-       status = bm_get_device_info( device_handle, &device );
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Allocate a new BN_CONTEXT structure.
-        */
-       button = acpi_os_callocate(sizeof(BN_CONTEXT));
-       if (!button) {
-               return_ACPI_STATUS(AE_NO_MEMORY);
-       }
-
-       button->device_handle = device->handle;
-       button->acpi_handle = device->acpi_handle;
-
-       /*
-        * Power Button?
-        * -------------
-        * Either fixed-feature or generic (namespace) types.
-        */
-       if (strncmp(device->id.hid, BN_HID_POWER_BUTTON,
-               sizeof(BM_DEVICE_HID)) == 0) {
-
-               if (device->id.type == BM_TYPE_FIXED_BUTTON) {
-
-                       button->type = BN_TYPE_POWER_BUTTON_FIXED;
-
-                       /* Register for fixed-feature events. */
-                       status = acpi_install_fixed_event_handler(
-                               ACPI_EVENT_POWER_BUTTON, bn_notify_fixed,
-                               (void*)button);
-               }
-               else {
-                       button->type = BN_TYPE_POWER_BUTTON;
-               }
-
-               //proc_mkdir(BN_PROC_POWER_BUTTON, bn_proc_root);
-
-       }
-
-       /*
-        * Sleep Button?
-        * -------------
-        * Either fixed-feature or generic (namespace) types.
-        */
-       else if (strncmp( device->id.hid, BN_HID_SLEEP_BUTTON,
-               sizeof(BM_DEVICE_HID)) == 0) {
-
-               if (device->id.type == BM_TYPE_FIXED_BUTTON) {
-
-                       button->type = BN_TYPE_SLEEP_BUTTON_FIXED;
-
-                       /* Register for fixed-feature events. */
-                       status = acpi_install_fixed_event_handler(
-                               ACPI_EVENT_SLEEP_BUTTON, bn_notify_fixed,
-                               (void*)button);
-               }
-               else {
-                       button->type = BN_TYPE_SLEEP_BUTTON;
-               }
-
-               //proc_mkdir(BN_PROC_SLEEP_BUTTON, bn_proc_root);
-       }
-
-       /*
-        * LID Switch?
-        * -----------
-        */
-       else if (strncmp( device->id.hid, BN_HID_LID_SWITCH,
-               sizeof(BM_DEVICE_HID)) == 0) {
-
-               button->type = BN_TYPE_LID_SWITCH;
-
-               //proc_mkdir(BN_PROC_LID_SWITCH, bn_proc_root);
-       }
-
-       *context = button;
-
-       bn_print(button);
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:   bn_remove_device
- *
- * PARAMETERS: <TBD>
- *
- * RETURN:     <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bn_remove_device(
-       void                    **context)
-{
-       ACPI_STATUS             status = AE_OK;
-       BN_CONTEXT              *button = NULL;
-
-       FUNCTION_TRACE("bn_remove_device");
-
-       if (!context || !*context) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       button = (BN_CONTEXT*)*context;
-
-       DEBUG_PRINT(ACPI_INFO, ("Removing button device [0x%02x].\n", button->device_handle));
-
-       /*
-        * Remove the /proc entry for this button.
-        */
-       switch (button->type) {
-
-       case BN_TYPE_POWER_BUTTON:
-       case BN_TYPE_POWER_BUTTON_FIXED:
-               /* Unregister for fixed-feature events. */
-               status = acpi_remove_fixed_event_handler(
-                       ACPI_EVENT_POWER_BUTTON, bn_notify_fixed);
-               //remove_proc_entry(BN_PROC_POWER_BUTTON, bn_proc_root);
-               break;
-
-       case BN_TYPE_SLEEP_BUTTON:
-       case BN_TYPE_SLEEP_BUTTON_FIXED:
-               /* Unregister for fixed-feature events. */
-               status = acpi_remove_fixed_event_handler(
-                       ACPI_EVENT_SLEEP_BUTTON, bn_notify_fixed);
-               //remove_proc_entry(BN_PROC_SLEEP_BUTTON, bn_proc_root);
-               break;
-
-       case BN_TYPE_LID_SWITCH:
-               //remove_proc_entry(BN_PROC_LID_SWITCH, bn_proc_root);
-               break;
-       }
-
-       acpi_os_free(button);
-
-       *context = NULL;
-
-       return_ACPI_STATUS(status);
-}
-
-
-/*****************************************************************************
- *                           External Functions
- *****************************************************************************/
-
-/*****************************************************************************
- *
- * FUNCTION:   bn_initialize
- *
- * PARAMETERS: <none>
- *
- * RETURN:
- *
- * DESCRIPTION: <TBD>
- *
-
- ****************************************************************************/
-
-ACPI_STATUS
-bn_initialize (void)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE_ID            criteria;
-       BM_DRIVER               driver;
-
-       FUNCTION_TRACE("bn_initialize");
-
-       MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID));
-       MEMSET(&driver, 0, sizeof(BM_DRIVER));
-
-       driver.notify = &bn_notify;
-       driver.request = &bn_request;
-
-       /*
-        * Create button's root /proc entry.
-        */
-       //bn_proc_root = proc_mkdir(BN_PROC_ROOT, bm_proc_root);
-       //if (!bn_proc_root) {
-//             return_ACPI_STATUS(AE_ERROR);
-//     }
-
-       /*
-        * Register for power buttons.
-        */
-       MEMCPY(criteria.hid, BN_HID_POWER_BUTTON, sizeof(BN_HID_POWER_BUTTON));
-       status = bm_register_driver(&criteria, &driver);
-
-       /*
-        * Register for sleep buttons.
-        */
-       MEMCPY(criteria.hid, BN_HID_SLEEP_BUTTON, sizeof(BN_HID_SLEEP_BUTTON));
-       status = bm_register_driver(&criteria, &driver);
-
-       /*
-        * Register for LID switches.
-        */
-       MEMCPY(criteria.hid, BN_HID_LID_SWITCH, sizeof(BN_HID_LID_SWITCH));
-       status = bm_register_driver(&criteria, &driver);
-
-       if (status == AE_NOT_FOUND)
-               status = AE_OK;
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:   bn_terminate
- *
- * PARAMETERS: <none>
- *
- * RETURN:     <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bn_terminate (void)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE_ID            criteria;
-       BM_DRIVER               driver;
-
-       FUNCTION_TRACE("bn_terminate");
-
-       MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID));
-       MEMSET(&driver, 0, sizeof(BM_DRIVER));
-
-       driver.notify = &bn_notify;
-       driver.request = &bn_request;
-
-       /*
-        * Unregister for power buttons.
-        */
-       MEMCPY(criteria.hid, BN_HID_POWER_BUTTON, sizeof(BN_HID_POWER_BUTTON));
-       status = bm_unregister_driver(&criteria, &driver);
-
-       /*
-        * Unregister for sleep buttons.
-        */
-       MEMCPY(criteria.hid, BN_HID_SLEEP_BUTTON, sizeof(BN_HID_SLEEP_BUTTON));
-       status = bm_unregister_driver(&criteria, &driver);
-
-       /*
-        * Unregister for LID switches.
-        */
-       MEMCPY(criteria.hid, BN_HID_LID_SWITCH, sizeof(BN_HID_LID_SWITCH));
-       status = bm_unregister_driver(&criteria, &driver);
-
-       /*
-        * Remove button's root /proc entry.
-        */
-       if (bn_proc_root) {
-               //remove_proc_entry(BN_PROC_ROOT, bm_proc_root);
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:   bn_notify_fixed
- *
- * PARAMETERS: <none>
- *
- * RETURN:
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bn_notify_fixed (
-       void                    *context)
-{
-       ACPI_STATUS             status = AE_OK;
-       BN_CONTEXT              *button = NULL;
-
-       FUNCTION_TRACE("bn_notify_fixed");
-
-       if (!context) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       button = (BN_CONTEXT*)context;
-
-  DbgPrint("Fixed button status change event detected.\n");
-
-       switch (button->type) {
-
-       case BN_TYPE_POWER_BUTTON_FIXED:
-               DEBUG_PRINT(ACPI_INFO, ("Fixed-feature button status change event detected.\n"));
-               /*bm_generate_event(button->device_handle, BN_PROC_ROOT,
-                       BN_PROC_POWER_BUTTON, BN_NOTIFY_STATUS_CHANGE, 0);*/
-               break;
-
-       case BN_TYPE_SLEEP_BUTTON_FIXED:
-               DEBUG_PRINT(ACPI_INFO, ("Fixed-feature button status change event detected.\n"));
-               /*bm_generate_event(button->device_handle, BN_PROC_ROOT,
-                       BN_PROC_SLEEP_BUTTON, BN_NOTIFY_STATUS_CHANGE, 0);*/
-               break;
-
-       default:
-               DEBUG_PRINT(ACPI_INFO, ("Unsupported fixed-feature event detected.\n"));
-               status = AE_SUPPORT;
-               break;
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:   bn_notify
- *
- * PARAMETERS: <none>
- *
- * RETURN:
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bn_notify (
-       BM_NOTIFY               notify_type,
-       BM_HANDLE               device_handle,
-       void                    **context)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       FUNCTION_TRACE("bn_notify");
-
-       if (!context) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       switch (notify_type) {
-       case BM_NOTIFY_DEVICE_ADDED:
-               status = bn_add_device(device_handle, context);
-               break;
-
-       case BM_NOTIFY_DEVICE_REMOVED:
-               status = bn_remove_device(context);
-               break;
-
-       case BN_NOTIFY_STATUS_CHANGE:
-               DEBUG_PRINT(ACPI_INFO, ("Button status change event detected.\n"));
-
-    DbgPrint("Button status change event detected.\n");
-
-               if (!context || !*context) {
-                       return_ACPI_STATUS(AE_BAD_PARAMETER);
-               }
-
-               switch(((BN_CONTEXT*)*context)->type) {
-
-               case BN_TYPE_POWER_BUTTON:
-               case BN_TYPE_POWER_BUTTON_FIXED:
-                       /*bm_generate_event(device_handle, BN_PROC_ROOT,
-                               BN_PROC_POWER_BUTTON, notify_type, 0);*/
-                       break;
-
-               case BN_TYPE_SLEEP_BUTTON:
-               case BN_TYPE_SLEEP_BUTTON_FIXED:
-                       /*bm_generate_event(device_handle, BN_PROC_ROOT,
-                               BN_PROC_SLEEP_BUTTON, notify_type, 0);*/
-                       break;
-
-               case BN_TYPE_LID_SWITCH:
-                       /*bm_generate_event(device_handle, BN_PROC_ROOT,
-                               BN_PROC_LID_SWITCH, notify_type, 0);*/
-                       break;
-
-               default:
-                       status = AE_SUPPORT;
-                       break;
-               }
-
-               break;
-
-       default:
-               status = AE_SUPPORT;
-               break;
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:   bn_request
- *
- * PARAMETERS: <TBD>
- *
- * RETURN:     <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bn_request (
-       BM_REQUEST              *request,
-       void                    *context)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       FUNCTION_TRACE("bn_request");
-
-       /*
-        * Must have a valid request structure and context.
-        */
-       if (!request || !context) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Handle Request:
-        * ---------------
-        */
-       switch (request->command) {
-
-       default:
-               status = AE_SUPPORT;
-               break;
-       }
-
-       request->status = status;
-
-       return_ACPI_STATUS(status);
-}
diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bm.c b/reactos/drivers/bus/acpi/ospm/busmgr/bm.c
deleted file mode 100644 (file)
index 42253ae..0000000
+++ /dev/null
@@ -1,1047 +0,0 @@
-/******************************************************************************
- *
- * Module Name: bm.c
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT             ACPI_BUS_MANAGER
-       MODULE_NAME             ("bm")
-
-
-/****************************************************************************
- *                                  Globals
- ****************************************************************************/
-
-extern FADT_DESCRIPTOR_REV2    acpi_fadt;
-/* TODO: Make dynamically sizeable. */
-static BM_NODE_LIST            node_list;
-
-
-/****************************************************************************
- *                            Internal Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_print
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-void
-bm_print (
-       BM_NODE                 *node,
-       u32                     flags)
-{
-       ACPI_BUFFER             buffer;
-       BM_DEVICE               *device = NULL;
-       char                    *type_string = NULL;
-
-       if (!node) {
-               return;
-       }
-
-       device = &(node->device);
-
-       if (flags & BM_PRINT_PRESENT) {
-               if (!BM_DEVICE_PRESENT(device)) {
-                       return;
-               }
-       }
-
-       buffer.length = 256;
-       buffer.pointer = acpi_os_callocate(buffer.length);
-       if (!buffer.pointer) {
-               return;
-       }
-
-       acpi_get_name(device->acpi_handle, ACPI_FULL_PATHNAME, &buffer);
-
-       switch(device->id.type) {
-       case BM_TYPE_SYSTEM:
-               type_string = "System";
-               break;
-       case BM_TYPE_SCOPE:
-               type_string = "Scope";
-               break;
-       case BM_TYPE_PROCESSOR:
-               type_string = "Processor";
-               break;
-       case BM_TYPE_THERMAL_ZONE:
-               type_string = "ThermalZone";
-               break;
-       case BM_TYPE_POWER_RESOURCE:
-               type_string = "PowerResource";
-               break;
-       case BM_TYPE_FIXED_BUTTON:
-               type_string = "Button";
-               break;
-       case BM_TYPE_DEVICE:
-               type_string = "Device";
-               break;
-       default:
-               type_string = "Unknown";
-               break;
-       }
-
-       if (!(flags & BM_PRINT_GROUP)) {
-               DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n"));
-       }
-
-               DEBUG_PRINT(ACPI_INFO, ("%s[0x%02x] hid[%s] %s\n", type_string, device->handle, device->id.hid, buffer.pointer));
-               DEBUG_PRINT(ACPI_INFO, ("  acpi_handle[0x%08x] flags[0x%02x] status[0x%02x]\n", device->acpi_handle, device->flags, device->status));
-
-       if (flags & BM_PRINT_IDENTIFICATION) {
-               DEBUG_PRINT(ACPI_INFO, ("  identification: uid[%s] adr[0x%08x]\n", device->id.uid, device->id.adr));
-       }
-
-       if (flags & BM_PRINT_LINKAGE) {
-               DEBUG_PRINT(ACPI_INFO, ("  linkage: this[%p] parent[%p] next[%p]\n", node, node->parent, node->next));
-               DEBUG_PRINT(ACPI_INFO, ("    scope.head[%p] scope.tail[%p]\n", node->scope.head, node->scope.tail));
-       }
-
-       if (flags & BM_PRINT_POWER) {
-               DEBUG_PRINT(ACPI_INFO, ("  power: state[D%d] flags[0x%08X]\n", device->power.state, device->power.flags));
-               DEBUG_PRINT(ACPI_INFO, ("    S0[0x%02x] S1[0x%02x] S2[0x%02x]\n", device->power.dx_supported[0], device->power.dx_supported[1], device->power.dx_supported[2]));
-               DEBUG_PRINT(ACPI_INFO, ("    S3[0x%02x] S4[0x%02x] S5[0x%02x]\n", device->power.dx_supported[3], device->power.dx_supported[4], device->power.dx_supported[5]));
-       }
-
-       if (!(flags & BM_PRINT_GROUP)) {
-               DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n"));
-       }
-
-       acpi_os_free(buffer.pointer);
-
-       return;
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_print_hierarchy
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-void
-bm_print_hierarchy (void)
-{
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_print_hierarchy");
-
-       DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n"));
-
-       for (i = 0; i < node_list.count; i++) {
-               bm_print(node_list.nodes[i], BM_PRINT_GROUP | BM_PRINT_PRESENT);
-       }
-
-       DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n"));
-
-       return_VOID;
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_status
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_get_status (
-       BM_DEVICE               *device)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       if (!device) {
-               return AE_BAD_PARAMETER;
-       }
-
-       device->status = BM_STATUS_UNKNOWN;
-
-       /*
-        * Dynamic Status?
-        * ---------------
-        * If _STA isn't present we just return the default status.
-        */
-       if (!(device->flags & BM_FLAGS_DYNAMIC_STATUS)) {
-               device->status = BM_STATUS_DEFAULT;
-               return AE_OK;
-       }
-
-       /*
-        * Evaluate _STA:
-        * --------------
-        */
-       status = bm_evaluate_simple_integer(device->acpi_handle, "_STA",
-               &(device->status));
-
-       return status;
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_identification
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_get_identification (
-       BM_DEVICE               *device)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_DEVICE_INFO        info;
-
-       if (!device) {
-               return AE_BAD_PARAMETER;
-       }
-
-       if (!(device->flags & BM_FLAGS_IDENTIFIABLE)) {
-               return AE_OK;
-       }
-
-       MEMSET(&(device->id.uid), 0, sizeof(device->id.uid));
-       MEMSET(&(device->id.hid), 0, sizeof(device->id.hid));
-       device->id.adr = BM_ADDRESS_UNKNOWN;
-
-       /*
-        * Get Object Info:
-        * ----------------
-        * Evalute _UID, _HID, _ADR, and _STA...
-        */
-       status = acpi_get_object_info(device->acpi_handle, &info);
-       if (ACPI_FAILURE(status)) {
-               return status;
-       }
-
-       if (info.valid & ACPI_VALID_UID) {
-               MEMCPY((void*)device->id.uid, (void*)info.unique_id,
-                       sizeof(BM_DEVICE_UID));
-       }
-
-       if (info.valid & ACPI_VALID_HID) {
-               MEMCPY((void*)device->id.hid, (void*)info.hardware_id,
-                       sizeof(BM_DEVICE_HID));
-       }
-
-       if (info.valid & ACPI_VALID_ADR) {
-               device->id.adr = info.address;
-       }
-
-       return status;
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_flags
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_get_flags (
-       BM_DEVICE               *device)
-{
-       ACPI_HANDLE             acpi_handle = NULL;
-
-       if (!device) {
-               return AE_BAD_PARAMETER;
-       }
-
-       device->flags = BM_FLAGS_UNKNOWN;
-
-       switch (device->id.type) {
-
-       case BM_TYPE_DEVICE:
-
-               /*
-                * Presence of _DCK indicates a docking station.
-                */
-               if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle,
-                       "_DCK", &acpi_handle))) {
-                       device->flags |= BM_FLAGS_DOCKING_STATION;
-               }
-
-               /*
-                * Presence of _EJD and/or _EJx indicates 'ejectable'.
-                * TODO: _EJx...
-                */
-               if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle,
-                       "_EJD", &acpi_handle))) {
-                       device->flags |= BM_FLAGS_EJECTABLE;
-               }
-
-               /*
-                * Presence of _PR0 or _PS0 indicates 'power manageable'.
-                */
-               if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle,
-                       "_PR0", &acpi_handle)) ||
-                       ACPI_SUCCESS(acpi_get_handle(device->acpi_handle,
-                       "_PS0", &acpi_handle))) {
-                       device->flags |= BM_FLAGS_POWER_CONTROL;
-               }
-
-               /*
-                * Presence of _CRS indicates 'configurable'.
-                */
-               if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle,
-                       "_CRS", &acpi_handle))) {
-                       device->flags |= BM_FLAGS_CONFIGURABLE;
-               }
-
-               /* Fall through to next case statement. */
-
-       case BM_TYPE_PROCESSOR:
-       case BM_TYPE_THERMAL_ZONE:
-       case BM_TYPE_POWER_RESOURCE:
-               /*
-                * Presence of _HID or _ADR indicates 'identifiable'.
-                */
-               if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle,
-                       "_HID", &acpi_handle)) ||
-                  ACPI_SUCCESS(acpi_get_handle(device->acpi_handle,
-                  "_ADR", &acpi_handle))) {
-                       device->flags |= BM_FLAGS_IDENTIFIABLE;
-               }
-
-               /*
-                * Presence of _STA indicates 'dynamic status'.
-                */
-               if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle,
-                       "_STA", &acpi_handle))) {
-                       device->flags |= BM_FLAGS_DYNAMIC_STATUS;
-               }
-
-               break;
-       }
-
-       return AE_OK;
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_add_namespace_device
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_add_namespace_device (
-       ACPI_HANDLE             acpi_handle,
-       ACPI_OBJECT_TYPE        acpi_type,
-       BM_NODE                 *parent,
-       BM_NODE                 **child)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_NODE                 *node = NULL;
-       BM_DEVICE               *device = NULL;
-
-       FUNCTION_TRACE("bm_add_namespace_device");
-
-       if (!parent || !child) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       if (node_list.count > BM_HANDLES_MAX) {
-               return_ACPI_STATUS(AE_NO_MEMORY);
-       }
-
-       (*child) = NULL;
-
-       /*
-        * Create Node:
-        * ------------
-        */
-       node = acpi_os_callocate(sizeof(BM_NODE));
-       if (!node) {
-               return_ACPI_STATUS(AE_NO_MEMORY);
-       }
-
-       node->parent = parent;
-       node->next = NULL;
-
-       device = &(node->device);
-
-       device->handle = node_list.count;
-       device->acpi_handle = acpi_handle;
-
-       /*
-        * Device Type:
-        * ------------
-        */
-       switch (acpi_type) {
-       case INTERNAL_TYPE_SCOPE:
-               device->id.type = BM_TYPE_SCOPE;
-               break;
-       case ACPI_TYPE_PROCESSOR:
-               device->id.type = BM_TYPE_PROCESSOR;
-               break;
-       case ACPI_TYPE_THERMAL:
-               device->id.type = BM_TYPE_THERMAL_ZONE;
-               break;
-       case ACPI_TYPE_POWER:
-               device->id.type = BM_TYPE_POWER_RESOURCE;
-               break;
-       case ACPI_TYPE_DEVICE:
-               device->id.type = BM_TYPE_DEVICE;
-               break;
-       }
-
-       /*
-        * Get Other Device Info:
-        * ----------------------
-        * But only if this device's parent is present (which implies
-        * this device MAY be present).
-        */
-       if (BM_NODE_PRESENT(node->parent)) {
-               /*
-                * Device Flags
-                */
-               status = bm_get_flags(device);
-               if (ACPI_FAILURE(status)) {
-                       goto end;
-               }
-
-               /*
-                * Device Identification
-                */
-               status = bm_get_identification(device);
-               if (ACPI_FAILURE(status)) {
-                       goto end;
-               }
-
-               /*
-                * Device Status
-                */
-               status = bm_get_status(device);
-               if (ACPI_FAILURE(status)) {
-                       goto end;
-               }
-
-               /*
-                * Power Management:
-                * -----------------
-                * If this node doesn't provide direct power control
-                * then we inherit PM capabilities from its parent.
-                *
-                * TODO: Inherit!
-                */
-               if (device->flags & BM_FLAGS_POWER_CONTROL) {
-                       status = bm_get_pm_capabilities(node);
-                       if (ACPI_FAILURE(status)) {
-                               goto end;
-                       }
-               }
-       }
-
-end:
-       if (ACPI_FAILURE(status)) {
-               acpi_os_free(node);
-       }
-       else {
-               /*
-                * Add to the node_list.
-                */
-               node_list.nodes[node_list.count++] = node;
-
-               /*
-                * Formulate Hierarchy:
-                * --------------------
-                * Arrange within the namespace by assigning the parent and
-                * adding to the parent device's list of children (scope).
-                */
-               if (!parent->scope.head) {
-                       parent->scope.head = node;
-               }
-               else {
-                       if (!parent->scope.tail) {
-                               (parent->scope.head)->next = node;
-                       }
-                       else {
-                               (parent->scope.tail)->next = node;
-                       }
-               }
-               parent->scope.tail = node;
-
-               (*child) = node;
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_enumerate_namespace
- *
- * PARAMETERS:  <none>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_enumerate_namespace (void)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_HANDLE             parent_handle = ACPI_ROOT_OBJECT;
-       ACPI_HANDLE             child_handle = NULL;
-       BM_NODE                 *parent = NULL;
-       BM_NODE                 *child = NULL;
-       ACPI_OBJECT_TYPE        acpi_type = 0;
-       u32                     level = 1;
-
-       FUNCTION_TRACE("bm_enumerate_namespace");
-
-       parent = node_list.nodes[0];
-
-       /*
-        * Enumerate ACPI Namespace:
-        * -------------------------
-        * Parse through the ACPI namespace, identify all 'devices',
-        * and create a new entry for each in our collection.
-        */
-       while (level > 0) {
-
-               /*
-                * Get the next object at this level.
-                */
-               status = acpi_get_next_object(ACPI_TYPE_ANY, parent_handle, child_handle, &child_handle);
-               if (ACPI_SUCCESS(status)) {
-
-                       /*
-                        * TODO: This is a hack to get around the problem
-                        *       identifying scope objects.  Scopes
-                        *       somehow need to be uniquely identified.
-                        */
-                       status = acpi_get_type(child_handle, &acpi_type);
-                       if (ACPI_SUCCESS(status) && (acpi_type == ACPI_TYPE_ANY)) {
-                               status = acpi_get_next_object(ACPI_TYPE_ANY, child_handle, 0, NULL);
-                               if (ACPI_SUCCESS(status)) {
-                                       acpi_type = INTERNAL_TYPE_SCOPE;
-                               }
-                       }
-
-                       /*
-                        * Device?
-                        * -------
-                        * If this object is a 'device', insert into the
-                        * ACPI Bus Manager's local hierarchy and search
-                        * the object's scope for any child devices (a
-                        * depth-first search).
-                        */
-                       switch (acpi_type) {
-                       case INTERNAL_TYPE_SCOPE:
-                       case ACPI_TYPE_DEVICE:
-                       case ACPI_TYPE_PROCESSOR:
-                       case ACPI_TYPE_THERMAL:
-                       case ACPI_TYPE_POWER:
-                               status = bm_add_namespace_device(child_handle, acpi_type, parent, &child);
-                               if (ACPI_SUCCESS(status)) {
-                                       status = acpi_get_next_object(ACPI_TYPE_ANY, child_handle, 0, NULL);
-                                       if (ACPI_SUCCESS(status)) {
-                                               level++;
-                                               parent_handle = child_handle;
-                                               child_handle = 0;
-                                               parent = child;
-                                       }
-                               }
-                               break;
-                       }
-               }
-
-               /*
-                * Scope Exhausted:
-                * ----------------
-                * No more children in this object's scope, Go back up
-                * in the namespace tree to the object's parent.
-                */
-               else {
-                       level--;
-                       child_handle = parent_handle;
-                       acpi_get_parent(parent_handle,
-                               &parent_handle);
-
-                       if (parent) {
-                               parent = parent->parent;
-                       }
-                       else {
-                               return_ACPI_STATUS(AE_NULL_ENTRY);
-                       }
-               }
-       }
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_add_fixed_feature_device
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_add_fixed_feature_device (
-       BM_NODE                 *parent,
-       BM_DEVICE_TYPE          device_type,
-       char                    *device_hid)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_NODE                 *node = NULL;
-
-       FUNCTION_TRACE("bm_add_fixed_feature_device");
-
-       if (!parent) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       if (node_list.count > BM_HANDLES_MAX) {
-               return_ACPI_STATUS(AE_NO_MEMORY);
-       }
-
-       /*
-        * Allocate the new device and add to the device array.
-        */
-       node = acpi_os_callocate(sizeof(BM_NODE));
-       if (!node) {
-               return_ACPI_STATUS(AE_NO_MEMORY);
-       }
-
-       /*
-        * Get device info.
-        */
-       node->device.handle = node_list.count;
-       node->device.acpi_handle = ACPI_ROOT_OBJECT;
-       node->device.id.type = BM_TYPE_FIXED_BUTTON;
-       if (device_hid) {
-               MEMCPY((void*)node->device.id.hid, device_hid,
-                       sizeof(node->device.id.hid));
-       }
-       node->device.flags = BM_FLAGS_FIXED_FEATURE;
-       node->device.status = BM_STATUS_DEFAULT;
-       /* TODO: Device PM capabilities */
-
-       /*
-        * Add to the node_list.
-        */
-       node_list.nodes[node_list.count++] = node;
-
-       /*
-        * Formulate Hierarchy:
-        * --------------------
-        * Arrange within the namespace by assigning the parent and
-        * adding to the parent device's list of children (scope).
-        */
-       node->parent = parent;
-       node->next = NULL;
-
-       if (parent) {
-               if (!parent->scope.head) {
-                       parent->scope.head = node;
-               }
-               else {
-                       if (!parent->scope.tail) {
-                               (parent->scope.head)->next = node;
-                       }
-                       else {
-                               (parent->scope.tail)->next = node;
-                       }
-               }
-               parent->scope.tail = node;
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_enumerate_fixed_features
- *
- * PARAMETERS:  <none>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_enumerate_fixed_features (void)
-{
-       FUNCTION_TRACE("bm_enumerate_fixed_features");
-
-       /*
-        * Root Object:
-        * ------------
-        * Fabricate the root object, which happens to always get a
-        * device_handle of zero.
-        */
-       node_list.nodes[0] = acpi_os_callocate(sizeof(BM_NODE));
-       if (NULL == (node_list.nodes[0])) {
-               return_ACPI_STATUS(AE_NO_MEMORY);
-       }
-
-       node_list.nodes[0]->device.handle = BM_HANDLE_ROOT;
-       node_list.nodes[0]->device.acpi_handle = ACPI_ROOT_OBJECT;
-       node_list.nodes[0]->device.flags = BM_FLAGS_UNKNOWN;
-       node_list.nodes[0]->device.status = BM_STATUS_DEFAULT;
-       node_list.nodes[0]->device.id.type = BM_TYPE_SYSTEM;
-       /* TODO: Get system PM capabilities (Sx states?) */
-
-       node_list.count++;
-
-       /*
-        * Fixed Features:
-        * ---------------
-        * Enumerate fixed-feature devices (e.g. power and sleep buttons).
-        */
-       if (acpi_fadt.pwr_button == 0) {
-               bm_add_fixed_feature_device(node_list.nodes[0],
-                       BM_TYPE_FIXED_BUTTON, BM_HID_POWER_BUTTON);
-       }
-
-       if (acpi_fadt.sleep_button == 0) {
-               bm_add_fixed_feature_device(node_list.nodes[0],
-                       BM_TYPE_FIXED_BUTTON, BM_HID_SLEEP_BUTTON);
-       }
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_handle
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_get_handle (
-       ACPI_HANDLE             acpi_handle,
-       BM_HANDLE               *device_handle)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_get_handle");
-
-       if (!device_handle) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       *device_handle = BM_HANDLE_UNKNOWN;
-
-       /*
-        * Search all devices for a match on the ACPI handle.
-        */
-       for (i=0; i<node_list.count; i++) {
-
-               if (!node_list.nodes[i]) {
-                       DEBUG_PRINT(ACPI_ERROR, ("Invalid (NULL) node entry [0x%02x] detected.\n", device_handle));
-                       status = AE_NULL_ENTRY;
-                       break;
-               }
-
-               if (node_list.nodes[i]->device.acpi_handle == acpi_handle) {
-                       *device_handle = node_list.nodes[i]->device.handle;
-                       break;
-               }
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_node
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_get_node (
-       BM_HANDLE               device_handle,
-       ACPI_HANDLE             acpi_handle,
-       BM_NODE                 **node)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       FUNCTION_TRACE("bm_get_node");
-
-       if (!node) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       /*
-        * If no device handle, resolve acpi handle to device handle.
-        */
-       if (!device_handle && acpi_handle) {
-               status = bm_get_handle(acpi_handle, &device_handle);
-               if (ACPI_FAILURE(status))
-                       return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Valid device handle?
-        */
-       if (device_handle > BM_HANDLES_MAX) {
-               DEBUG_PRINT(ACPI_ERROR, ("Invalid node handle [0x%02x] detected.\n", device_handle));
-               return_ACPI_STATUS(AE_ERROR);
-       }
-
-       *node = node_list.nodes[device_handle];
-
-       /*
-        * Valid node?
-        */
-       if (!(*node)) {
-               DEBUG_PRINT(ACPI_ERROR, ("Invalid (NULL) node entry [0x%02x] detected.\n", device_handle));
-               return_ACPI_STATUS(AE_NULL_ENTRY);
-       }
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *                            External Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_initialize
- *
- * PARAMETERS:  <none>
- *
- * RETURN:      Exception code.
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_initialize (void)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     start = 0;
-       u32                     stop = 0;
-       u32                     elapsed = 0;
-
-       FUNCTION_TRACE("bm_initialize");
-
-       MEMSET(&node_list, 0, sizeof(BM_HANDLE_LIST));
-
-       acpi_get_timer(&start);
-
-       DEBUG_PRINT(ACPI_INFO, ("Building device hierarchy.\n"));
-
-       /*
-        * Enumerate ACPI fixed-feature devices.
-        */
-       status = bm_enumerate_fixed_features();
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Enumerate the ACPI namespace.
-        */
-       status = bm_enumerate_namespace();
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       acpi_get_timer(&stop);
-       acpi_get_timer_duration(start, stop, &elapsed);
-
-       DEBUG_PRINT(ACPI_INFO, ("Device heirarchy build took [%d] microseconds.\n", elapsed));
-
-       /*
-        * Display hierarchy.
-        */
-#ifdef ACPI_DEBUG
-       bm_print_hierarchy();
-#endif /*ACPI_DEBUG*/
-
-       /*
-        * Register for all standard and device-specific notifications.
-        */
-       DEBUG_PRINT(ACPI_INFO, ("Registering for all device notifications.\n"));
-
-       status = acpi_install_notify_handler(ACPI_ROOT_OBJECT,
-               ACPI_SYSTEM_NOTIFY, &bm_notify, NULL);
-       if (ACPI_FAILURE(status)) {
-               DEBUG_PRINT(ACPI_ERROR, ("Unable to register for standard notifications.\n"));
-               return_ACPI_STATUS(status);
-       }
-
-       status = acpi_install_notify_handler(ACPI_ROOT_OBJECT,
-               ACPI_DEVICE_NOTIFY, &bm_notify, NULL);
-       if (ACPI_FAILURE(status)) {
-               DEBUG_PRINT(ACPI_ERROR, ("Unable to register for device-specific notifications.\n"));
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Initialize /proc interface.
-        */
-       //DEBUG_PRINT(ACPI_INFO, ("Initializing /proc interface.\n"));
-       //status = bm_proc_initialize();
-
-       DEBUG_PRINT(ACPI_INFO, ("ACPI Bus Manager enabled.\n"));
-
-       /*
-        * Initialize built-in power resource driver.
-        */
-       bm_pr_initialize();
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_terminate
- *
- * PARAMETERS:  <none>
- *
- * RETURN:      Exception code.
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_terminate (void)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_terminate");
-
-       /*
-        * Terminate built-in power resource driver.
-        */
-       bm_pr_terminate();
-
-       /*
-        * Remove the /proc interface.
-        */
-       //DEBUG_PRINT(ACPI_INFO, ("Removing /proc interface.\n"));
-       //status = bm_proc_terminate();
-
-
-       /*
-        * Unregister for all notifications.
-        */
-
-       DEBUG_PRINT(ACPI_INFO, ("Unregistering for device notifications.\n"));
-
-       status = acpi_remove_notify_handler(ACPI_ROOT_OBJECT,
-               ACPI_SYSTEM_NOTIFY, &bm_notify);
-       if (ACPI_FAILURE(status)) {
-               DEBUG_PRINT(ACPI_ERROR, ("Unable to un-register for standard notifications.\n"));
-       }
-
-       status = acpi_remove_notify_handler(ACPI_ROOT_OBJECT,
-               ACPI_DEVICE_NOTIFY, &bm_notify);
-       if (ACPI_FAILURE(status)) {
-               DEBUG_PRINT(ACPI_ERROR, ("Unable to un-register for device-specific notifications.\n"));
-       }
-
-       /*
-        * Parse through the device array, freeing all entries.
-        */
-       DEBUG_PRINT(ACPI_INFO, ("Removing device hierarchy.\n"));
-       for (i = 0; i < node_list.count; i++) {
-               if (node_list.nodes[i]) {
-                       acpi_os_free(node_list.nodes[i]);
-               }
-       }
-
-       DEBUG_PRINT(ACPI_INFO, ("ACPI Bus Manager disabled.\n"));
-
-       return_ACPI_STATUS(AE_OK);
-}
diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmnotify.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmnotify.c
deleted file mode 100644 (file)
index 1f6e417..0000000
+++ /dev/null
@@ -1,310 +0,0 @@
-/*****************************************************************************
- *
- * Module Name: bmnotify.c
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-
-#define _COMPONENT             ACPI_BUS_MANAGER
-        MODULE_NAME            ("bmnotify")
-
-
-/****************************************************************************
- *                            Internal Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_generate_notify
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_generate_notify (
-       BM_NODE                 *node,
-       u32                     notify_type)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       FUNCTION_TRACE("bm_generate_notify");
-
-       if (!node) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       DEBUG_PRINT(ACPI_INFO, ("Sending notify [0x%02x] to device [0x%02x].\n", notify_type, node->device.handle));
-
-       if (!(node->device.flags & BM_FLAGS_DRIVER_CONTROL) ||
-               !(node->driver.notify)) {
-               DEBUG_PRINT(ACPI_WARN, ("No driver installed for device [0x%02x].\n", node->device.handle));
-               return_ACPI_STATUS(AE_NOT_EXIST);
-       }
-
-       status = node->driver.notify(notify_type, node->device.handle,
-               &(node->driver.context));
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_device_check
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_device_check (
-       BM_NODE                 *node,
-       u32                     *status_change)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE               *device = NULL;
-       BM_DEVICE_STATUS        old_status = BM_STATUS_UNKNOWN;
-
-       FUNCTION_TRACE("bm_device_check");
-
-       if (!node) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       device = &(node->device);
-
-       if (status_change) {
-               *status_change = FALSE;
-       }
-
-       old_status = device->status;
-
-       /*
-        * Parent Present?
-        * ---------------
-        * Only check this device if its parent is present (which implies
-        * this device MAY be present).
-        */
-       if (!BM_NODE_PRESENT(node->parent)) {
-               return_ACPI_STATUS(AE_OK);
-       }
-
-       /*
-        * Get Status:
-        * -----------
-        * And see if the status has changed.
-        */
-       status = bm_get_status(device);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       if (old_status == node->device.status) {
-               return_ACPI_STATUS(AE_OK);
-       }
-
-       if (status_change) {
-               *status_change = TRUE;
-       }
-
-       /*
-        * Device Insertion?
-        * -----------------
-        */
-       if ((device->status & BM_STATUS_PRESENT) &&
-               !(old_status & BM_STATUS_PRESENT)) {
-               /* TODO: Make sure driver is loaded, and if not, load. */
-               status = bm_generate_notify(node, BM_NOTIFY_DEVICE_ADDED);
-       }
-
-       /*
-        * Device Removal?
-        * ---------------
-        */
-       else if (!(device->status & BM_STATUS_PRESENT) &&
-               (old_status & BM_STATUS_PRESENT)) {
-               /* TODO: Unload driver if last device instance. */
-               status = bm_generate_notify(node, BM_NOTIFY_DEVICE_REMOVED);
-       }
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_bus_check
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_bus_check (
-       BM_NODE                 *parent_node)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     status_change = FALSE;
-
-       FUNCTION_TRACE("bm_bus_check");
-
-       if (!parent_node) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Status Change?
-        * --------------
-        */
-       status = bm_device_check(parent_node, &status_change);
-       if (ACPI_FAILURE(status) || !status_change) {
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Enumerate Scope:
-        * ----------------
-        * TODO: Enumerate child devices within this device's scope and
-        *       run bm_device_check()'s on them...
-        */
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *                            External Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_notify
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-void
-bm_notify (
-       ACPI_HANDLE             acpi_handle,
-       u32                     notify_value,
-       void                    *context)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_NODE                 *node = NULL;
-
-       FUNCTION_TRACE("bm_notify");
-
-       /*
-        * Resolve the ACPI handle.
-        */
-       status = bm_get_node(0, acpi_handle, &node);
-       if (ACPI_FAILURE(status)) {
-               DEBUG_PRINT(ACPI_INFO, ("Recieved notify [0x%02x] for unknown device [%p].\n", notify_value, acpi_handle));
-               return_VOID;
-       }
-
-       /*
-        * Device-Specific or Standard?
-        * ----------------------------
-        * Device-specific notifies are forwarded to the control module's
-        * notify() function for processing.  Standard notifies are handled
-        * internally.
-        */
-       if (notify_value > 0x7F) {
-               status = bm_generate_notify(node, notify_value);
-       }
-       else {
-               switch (notify_value) {
-
-               case BM_NOTIFY_BUS_CHECK:
-                       DEBUG_PRINT(ACPI_INFO, ("Received BUS CHECK notification.\n"));
-                       status = bm_bus_check(node);
-                       break;
-
-               case BM_NOTIFY_DEVICE_CHECK:
-                       DEBUG_PRINT(ACPI_INFO, ("Received DEVICE CHECK notification.\n"));
-                       status = bm_device_check(node, NULL);
-                       break;
-
-               case BM_NOTIFY_DEVICE_WAKE:
-                       DEBUG_PRINT(ACPI_INFO, ("Received DEVICE WAKE notification.\n"));
-                       /* TODO */
-                       break;
-
-               case BM_NOTIFY_EJECT_REQUEST:
-                       DEBUG_PRINT(ACPI_INFO, ("Received EJECT REQUEST notification.\n"));
-                       /* TODO */
-                       break;
-
-               case BM_NOTIFY_DEVICE_CHECK_LIGHT:
-                       DEBUG_PRINT(ACPI_INFO, ("Received DEVICE CHECK LIGHT notification.\n"));
-                       /* TODO: Exactly what does the 'light' mean? */
-                       status = bm_device_check(node, NULL);
-                       break;
-
-               case BM_NOTIFY_FREQUENCY_MISMATCH:
-                       DEBUG_PRINT(ACPI_INFO, ("Received FREQUENCY MISMATCH notification.\n"));
-                       /* TODO */
-                       break;
-
-               case BM_NOTIFY_BUS_MODE_MISMATCH:
-                       DEBUG_PRINT(ACPI_INFO, ("Received BUS MODE MISMATCH notification.\n"));
-                       /* TODO */
-                       break;
-
-               case BM_NOTIFY_POWER_FAULT:
-                       DEBUG_PRINT(ACPI_INFO, ("Received POWER FAULT notification.\n"));
-                       /* TODO */
-                       break;
-
-               default:
-                       DEBUG_PRINT(ACPI_INFO, ("Received unknown/unsupported notification.\n"));
-                       break;
-               }
-       }
-
-       return_VOID;
-}
-
-
diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmpm.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmpm.c
deleted file mode 100644 (file)
index 61d65ae..0000000
+++ /dev/null
@@ -1,395 +0,0 @@
-/*****************************************************************************
- *
- * Module Name: bmpm.c
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT             ACPI_POWER_CONTROL
-       MODULE_NAME             ("bmpm")
-
-
-/****************************************************************************
- *                             Internal Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_inferred_power_state
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_get_inferred_power_state (
-       BM_DEVICE               *device)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_HANDLE_LIST          pr_list;
-       BM_POWER_STATE          list_state = ACPI_STATE_UNKNOWN;
-       char                    object_name[5] = {'_','P','R','0','\0'};
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_get_inferred_power_state");
-
-       if (!device) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       MEMSET(&pr_list, 0, sizeof(BM_HANDLE_LIST));
-
-       device->power.state = ACPI_STATE_D3;
-
-       /*
-        * Calculate Power State:
-        * ----------------------
-        * Try to infer the devices's power state by checking the state of
-        * the devices's power resources.  We start by evaluating _PR0
-        * (resource requirements at D0) and work through _PR1 and _PR2.
-        * We know the current devices power state when all resources (for
-        * a give Dx state) are ON.  If no power resources are on then the
-        * device is assumed to be off (D3).
-        */
-       for (i=ACPI_STATE_D0; i<ACPI_STATE_D3; i++) {
-
-               status = bm_evaluate_reference_list(device->acpi_handle,
-                       object_name, &pr_list);
-
-               if (ACPI_SUCCESS(status)) {
-
-                       status = bm_pr_list_get_state(&pr_list,
-                               &list_state);
-
-                       if (ACPI_SUCCESS(status)) {
-
-                               if (list_state == ACPI_STATE_D0) {
-                                       device->power.state = i;
-                                       break;
-                               }
-                       }
-               }
-       }
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *                             External Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_power_state
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_get_power_state (
-       BM_NODE                 *node)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE               *device = NULL;
-
-       FUNCTION_TRACE("bm_get_power_state");
-
-       if (!node) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       device = &(node->device);
-
-       device->power.state = ACPI_STATE_UNKNOWN;
-
-       if (device->flags & BM_FLAGS_POWER_STATE) {
-               status = bm_evaluate_simple_integer(device->acpi_handle,
-                       "_PSC", &(device->power.state));
-       }
-       else {
-               status = bm_get_inferred_power_state(device);
-       }
-
-       if (ACPI_SUCCESS(status)) {
-               DEBUG_PRINT(ACPI_INFO, ("Device [0x%02x] is at power state [D%d].\n", device->handle, device->power.state));
-       }
-       else {
-               DEBUG_PRINT(ACPI_INFO, ("Error getting power state for device [0x%02x]\n", device->handle));
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_set_power_state
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_set_power_state (
-       BM_NODE                 *node,
-       BM_POWER_STATE          state)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE               *device = NULL;
-       BM_DEVICE               *parent_device = NULL;
-       BM_HANDLE_LIST          current_list;
-       BM_HANDLE_LIST          target_list;
-       char                    object_name[5] = {'_','P','R','0','\0'};
-
-       FUNCTION_TRACE("bm_set_power_state");
-
-       if (!node || !node->parent || (state > ACPI_STATE_D3)) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       MEMSET(&current_list, 0, sizeof(BM_HANDLE_LIST));
-       MEMSET(&target_list, 0, sizeof(BM_HANDLE_LIST));
-
-       device = &(node->device);
-       parent_device = &(node->parent->device);
-
-       /*
-        * Check Parent's Power State:
-        * ---------------------------
-        * Can't be in a higher power state (lower Dx value) than parent.
-        */
-       if (state < parent_device->power.state) {
-               DEBUG_PRINT(ACPI_WARN, ("Cannot set device [0x%02x] to a higher-powered state than parent_device.\n", device->handle));
-               return_ACPI_STATUS(AE_ERROR);
-       }
-
-       /*
-        * Get Resources:
-        * --------------
-        * Get the power resources associated with the device's current
-        * and target power states.
-        */
-       if (device->power.state != ACPI_STATE_UNKNOWN) {
-               object_name[3] = '0' + device->power.state;
-               bm_evaluate_reference_list(device->acpi_handle,
-                       object_name, &current_list);
-       }
-
-       object_name[3] = '0' + state;
-       bm_evaluate_reference_list(device->acpi_handle, object_name,
-               &target_list);
-
-       /*
-        * Transition Resources:
-        * ---------------------
-        * Transition all power resources referenced by this device to
-        * the correct power state (taking into consideration sequencing
-        * and dependencies to other devices).
-        */
-       if (current_list.count || target_list.count) {
-               status = bm_pr_list_transition(&current_list, &target_list);
-       }
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Execute _PSx:
-        * -------------
-        * Execute the _PSx method corresponding to the target Dx state,
-        * if it exists.
-        */
-       object_name[2] = 'S';
-       object_name[3] = '0' + state;
-       bm_evaluate_object(device->acpi_handle, object_name, NULL, NULL);
-
-       if (ACPI_SUCCESS(status)) {
-               DEBUG_PRINT(ACPI_INFO, ("Device [0x%02x] is now at [D%d].\n", device->handle, state));
-               device->power.state = state;
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_pm_capabilities
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_get_pm_capabilities (
-       BM_NODE                 *node)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE               *device = NULL;
-       BM_DEVICE               *parent_device = NULL;
-       ACPI_HANDLE             acpi_handle = NULL;
-       BM_POWER_STATE          dx_supported = ACPI_STATE_UNKNOWN;
-       char                    object_name[5] = {'_','S','0','D','\0'};
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_get_pm_capabilities");
-
-       if (!node || !node->parent) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       device = &(node->device);
-       parent_device = &(node->parent->device);
-
-       /*
-        * Power Management Flags:
-        * -----------------------
-        */
-       if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PSC",
-               &acpi_handle))) {
-               device->power.flags |= BM_FLAGS_POWER_STATE;
-       }
-
-       if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_IRC",
-               &acpi_handle))) {
-               device->power.flags |= BM_FLAGS_INRUSH_CURRENT;
-       }
-
-       if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PRW",
-               &acpi_handle))) {
-               device->power.flags |= BM_FLAGS_WAKE_CAPABLE;
-       }
-
-       /*
-        * Device Power State:
-        * -------------------
-        * Note that we can't get the device's power state until we've
-        * initialized all power resources, so for now we just set to
-        * unknown.
-        */
-       device->power.state = ACPI_STATE_UNKNOWN;
-
-       /*
-        * Dx Supported in S0:
-        * -------------------
-        * Figure out which Dx states are supported by this device for the
-        * S0 (working) state.  Note that D0 and D3 are required (assumed).
-        */
-       device->power.dx_supported[ACPI_STATE_S0] = BM_FLAGS_D0_SUPPORT |
-               BM_FLAGS_D3_SUPPORT;
-
-       if ((ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PR1",
-               &acpi_handle))) ||
-               (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PS1",
-               &acpi_handle)))) {
-               device->power.dx_supported[ACPI_STATE_S0] |=
-                       BM_FLAGS_D1_SUPPORT;
-       }
-
-       if ((ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PR2",
-               &acpi_handle))) ||
-               (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PS2",
-               &acpi_handle)))) {
-               device->power.dx_supported[ACPI_STATE_S0] |=
-                       BM_FLAGS_D2_SUPPORT;
-       }
-
-       /*
-        * Dx Supported in S1-S5:
-        * ----------------------
-        * Figure out which Dx states are supported by this device for
-        * all other Sx states.
-        */
-       for (i = ACPI_STATE_S1; i <= ACPI_STATE_S5; i++) {
-
-               /*
-                * D3 support is assumed (off is always possible!).
-                */
-               device->power.dx_supported[i] = BM_FLAGS_D3_SUPPORT;
-
-               /*
-                * Evalute _SxD:
-                * -------------
-                * Which returns the highest (power) Dx state supported in
-                * this system (Sx) state.  We convert this value to a bit
-                * mask of supported states (conceptually simpler).
-                */
-               status = bm_evaluate_simple_integer(device->acpi_handle,
-                       object_name, &dx_supported);
-               if (ACPI_SUCCESS(status)) {
-                       switch (dx_supported) {
-                       case 0:
-                               device->power.dx_supported[i] |=
-                                       BM_FLAGS_D0_SUPPORT;
-                               /* fall through */
-                       case 1:
-                               device->power.dx_supported[i] |=
-                                       BM_FLAGS_D1_SUPPORT;
-                               /* fall through */
-                       case 2:
-                               device->power.dx_supported[i] |=
-                                       BM_FLAGS_D2_SUPPORT;
-                               /* fall through */
-                       case 3:
-                               device->power.dx_supported[i] |=
-                                       BM_FLAGS_D3_SUPPORT;
-                               break;
-                       }
-
-                       /*
-                        * Validate:
-                        * ---------
-                        * Mask of any states that _Sx_d falsely advertises
-                        * (e.g.claims D1 support but neither _PR2 or _PS2
-                        * exist).  In other words, S1-S5 can't offer a Dx
-                        * state that isn't supported by S0.
-                        */
-                       device->power.dx_supported[i] &=
-                               device->power.dx_supported[ACPI_STATE_S0];
-               }
-
-               object_name[2]++;
-       }
-
-       return_ACPI_STATUS(status);
-}
diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmpower.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmpower.c
deleted file mode 100644 (file)
index 759c6d7..0000000
+++ /dev/null
@@ -1,666 +0,0 @@
-/****************************************************************************
- *
- * Module Name: bmpower.c - Driver for ACPI Power Resource 'devices'
- *   $Revision: 1.1 $
- *
- ****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/*
- * TODO:
- * -----
- *     1. Sequencing of power resource list transitions.
- *     2. Global serialization of power resource transtions (see ACPI
- *         spec section 7.1.2/7.1.3).
- *      3. Better error handling.
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT             ACPI_POWER_CONTROL
-       MODULE_NAME             ("bmpower")
-
-
-/****************************************************************************
- *                             Function Prototypes
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_notify (
-       BM_NOTIFY               notify_type,
-       BM_HANDLE               device_handle,
-       void                    **context);
-
-ACPI_STATUS
-bm_pr_request (
-       BM_REQUEST              *request,
-       void                    *context);
-
-
-/****************************************************************************
- *                             Internal Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_print
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_print (
-       BM_POWER_RESOURCE       *pr)
-{
-       ACPI_BUFFER             buffer;
-
-       if (!pr) {
-               return(AE_BAD_PARAMETER);
-       }
-
-       buffer.length = 256;
-       buffer.pointer = acpi_os_callocate(buffer.length);
-       if (!buffer.pointer) {
-               return(AE_NO_MEMORY);
-       }
-
-       acpi_get_name(pr->acpi_handle, ACPI_FULL_PATHNAME, &buffer);
-
-       acpi_os_printf("Power Resource: found\n");
-
-       DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n"));
-       DEBUG_PRINT(ACPI_INFO, ("PowerResource[0x%02X]|[0x%08X] %s\n", pr->device_handle, pr->acpi_handle, buffer.pointer));
-       DEBUG_PRINT(ACPI_INFO, ("  system_level[S%d] resource_order[%d]\n", pr->system_level, pr->resource_order));
-       DEBUG_PRINT(ACPI_INFO, ("  state[D%d] reference_count[%d]\n", pr->state, pr->reference_count));
-       DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n"));
-
-       acpi_os_free(buffer.pointer);
-
-       return(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_get_state
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_get_state (
-       BM_POWER_RESOURCE       *pr)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE_STATUS        device_status = BM_STATUS_UNKNOWN;
-
-       FUNCTION_TRACE("bm_pr_get_state");
-
-       if (!pr) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       pr->state = ACPI_STATE_UNKNOWN;
-
-       /*
-        * Evaluate _STA:
-        * --------------
-        * Evalute _STA to determine whether the power resource is ON or OFF.
-        * Note that if the power resource isn't present we'll get AE_OK but
-        * an unknown status.
-        */
-       status = bm_get_device_status(pr->device_handle, &device_status);
-       if (ACPI_FAILURE(status)) {
-               DEBUG_PRINT(ACPI_ERROR, ("Error reading status for power resource [0x%02x].\n", pr->device_handle));
-               return_ACPI_STATUS(status);
-       }
-       if (device_status == BM_STATUS_UNKNOWN) {
-               DEBUG_PRINT(ACPI_ERROR, ("Error reading status for power resource [0x%02x].\n", pr->device_handle));
-               return_ACPI_STATUS(AE_NOT_EXIST);
-       }
-
-       /*
-        * Mask off all bits but the first as some systems return non-standard
-        * values (e.g. 0x51).
-        */
-       switch (device_status & 0x01) {
-       case 0:
-               DEBUG_PRINT(ACPI_INFO, ("Power resource [0x%02x] is OFF.\n", pr->device_handle));
-               pr->state = ACPI_STATE_D3;
-               break;
-       case 1:
-               DEBUG_PRINT(ACPI_INFO, ("Power resource [0x%02x] is ON.\n", pr->device_handle));
-               pr->state = ACPI_STATE_D0;
-               break;
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_set_state
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_set_state (
-       BM_POWER_RESOURCE       *pr,
-       BM_POWER_STATE          target_state)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       FUNCTION_TRACE("bm_pr_set_state");
-
-       if (!pr) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       status = bm_pr_get_state(pr);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       if (target_state == pr->state) {
-               DEBUG_PRINT(ACPI_INFO, ("Power resource [0x%02X] already at target power state [D%d].\n", pr->device_handle, pr->state));
-               return_ACPI_STATUS(AE_OK);
-       }
-
-       switch (target_state) {
-
-       case ACPI_STATE_D0:
-               DEBUG_PRINT(ACPI_INFO, ("Turning power resource [0x%02X] ON.\n", pr->device_handle));
-               status = bm_evaluate_object(pr->acpi_handle, "_ON", NULL, NULL);
-               break;
-
-       case ACPI_STATE_D3:
-               DEBUG_PRINT(ACPI_INFO, ("Turning power resource [0x%02X] OFF.\n", pr->device_handle));
-               status = bm_evaluate_object(pr->acpi_handle, "_OFF", NULL, NULL);
-               break;
-
-       default:
-               status = AE_BAD_PARAMETER;
-               break;
-       }
-
-       status = bm_pr_get_state(pr);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_list_get_state
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_list_get_state (
-       BM_HANDLE_LIST          *pr_list,
-       BM_POWER_STATE          *power_state)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_POWER_RESOURCE       *pr = NULL;
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_pr_list_get_state");
-
-       if (!pr_list || !power_state) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       if (pr_list->count < 1) {
-               pr->state = ACPI_STATE_UNKNOWN;
-               return_ACPI_STATUS(AE_ERROR);
-       }
-
-       (*power_state) = ACPI_STATE_D0;
-
-       /*
-        * Calculate Current power_state:
-        * -----------------------------
-        * The current state of a list of power resources is ON if all
-        * power resources are currently in the ON state.  In other words,
-        * if any power resource in the list is OFF then the collection
-        * isn't fully ON.
-        */
-       for (i = 0; i < pr_list->count; i++) {
-
-               status = bm_get_device_context(pr_list->handles[i],
-                       (BM_DRIVER_CONTEXT*)(&pr));
-               if (ACPI_FAILURE(status)) {
-                       DEBUG_PRINT(ACPI_WARN, ("Invalid reference to power resource [0x%02X].\n", pr_list->handles[i]));
-                       (*power_state) = ACPI_STATE_UNKNOWN;
-                       break;
-               }
-
-               status = bm_pr_get_state(pr);
-               if (ACPI_FAILURE(status)) {
-                       (*power_state) = ACPI_STATE_UNKNOWN;
-                       break;
-               }
-
-               if (pr->state != ACPI_STATE_D0) {
-                       (*power_state) = pr->state;
-                       break;
-               }
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_list_transition
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_list_transition (
-       BM_HANDLE_LIST          *current_list,
-       BM_HANDLE_LIST          *target_list)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_POWER_RESOURCE       *pr = NULL;
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_pr_list_transition");
-
-       if (!current_list || !target_list) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Reference Target:
-        * -----------------
-        * Reference all resources for the target power state first (so
-        * the device doesn't get turned off while transitioning).  Power
-        * resources that aren't on (new reference count of 1) are turned on.
-        */
-       for (i = 0; i < target_list->count; i++) {
-
-               status = bm_get_device_context(target_list->handles[i],
-                       (BM_DRIVER_CONTEXT*)(&pr));
-               if (ACPI_FAILURE(status)) {
-                       DEBUG_PRINT(ACPI_WARN, ("Invalid reference to power resource [0x%02X].\n", target_list->handles[i]));
-                       continue;
-               }
-
-               if (++pr->reference_count == 1) {
-                       /* TODO: Need ordering based upon resource_order */
-                       status = bm_pr_set_state(pr, ACPI_STATE_D0);
-                       if (ACPI_FAILURE(status)) {
-                               /* TODO: How do we handle this? */
-                               DEBUG_PRINT(ACPI_WARN, ("Unable to change power state for power resource [0x%02X].\n", target_list->handles[i]));
-                       }
-               }
-       }
-
-       /*
-        * Dereference Current:
-        * --------------------
-        * Dereference all resources for the current power state.  Power
-        * resources no longer referenced (new reference count of 0) are
-        * turned off.
-        */
-       for (i = 0; i < current_list->count; i++) {
-
-               status = bm_get_device_context(current_list->handles[i],
-                       (BM_DRIVER_CONTEXT*)(&pr));
-               if (ACPI_FAILURE(status)) {
-                       DEBUG_PRINT(ACPI_WARN, ("Invalid reference to power resource [0x%02X].\n", target_list->handles[i]));
-                       continue;
-               }
-
-               if (--pr->reference_count == 0) {
-                       /* TODO: Need ordering based upon resource_order */
-                       status = bm_pr_set_state(pr, ACPI_STATE_D3);
-                       if (ACPI_FAILURE(status)) {
-                               /* TODO: How do we handle this? */
-                               DEBUG_PRINT(ACPI_ERROR, ("Unable to change power state for power resource [0x%02X].\n", current_list->handles[i]));
-                       }
-               }
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_add_device
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_add_device (
-       BM_HANDLE               device_handle,
-       void                    **context)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_POWER_RESOURCE       *pr = NULL;
-       BM_DEVICE               *device = NULL;
-       ACPI_BUFFER             buffer;
-       ACPI_OBJECT             acpi_object;
-
-       FUNCTION_TRACE("bm_pr_add_device");
-
-       DEBUG_PRINT(ACPI_INFO, ("Adding power resource [0x%02X].\n", device_handle));
-
-       if (!context || *context) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       buffer.length = sizeof(ACPI_OBJECT);
-       buffer.pointer = &acpi_object;
-
-       /*
-        * Get information on this device.
-        */
-       status = bm_get_device_info(device_handle, &device);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Allocate a new BM_POWER_RESOURCE structure.
-        */
-       pr = acpi_os_callocate(sizeof(BM_POWER_RESOURCE));
-       if (!pr) {
-               return_ACPI_STATUS(AE_NO_MEMORY);
-       }
-
-       pr->device_handle = device->handle;
-       pr->acpi_handle = device->acpi_handle;
-
-       /*
-        * Get information on this power resource.
-        */
-       status = acpi_evaluate_object(pr->acpi_handle, NULL, NULL, &buffer);
-       if (ACPI_FAILURE(status)) {
-               goto end;
-       }
-
-       pr->system_level = acpi_object.power_resource.system_level;
-       pr->resource_order = acpi_object.power_resource.resource_order;
-       pr->state = ACPI_STATE_UNKNOWN;
-       pr->reference_count = 0;
-
-       /*
-        * Get the power resource's current state (ON|OFF).
-        */
-       status = bm_pr_get_state(pr);
-
-end:
-       if (ACPI_FAILURE(status)) {
-               acpi_os_free(pr);
-       }
-       else {
-               *context = pr;
-               bm_pr_print(pr);
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_remove_device
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_remove_device (
-       void                    **context)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_POWER_RESOURCE       *pr = NULL;
-
-       FUNCTION_TRACE("bm_pr_remove_device");
-
-       if (!context || !*context) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       pr = (BM_POWER_RESOURCE*)*context;
-
-       DEBUG_PRINT(ACPI_INFO, ("Removing power resource [0x%02X].\n", pr->device_handle));
-
-       acpi_os_free(pr);
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *                             External Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_initialize
- *
- * PARAMETERS:  <none>
- *
- * RETURN:
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_initialize (void)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE_ID            criteria;
-       BM_DRIVER               driver;
-
-       FUNCTION_TRACE("bm_pr_initialize");
-
-       MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID));
-       MEMSET(&driver, 0, sizeof(BM_DRIVER));
-
-       criteria.type = BM_TYPE_POWER_RESOURCE;
-
-       driver.notify = &bm_pr_notify;
-       driver.request = &bm_pr_request;
-
-       status = bm_register_driver(&criteria, &driver);
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_terminate
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:     <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_terminate (void)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_DEVICE_ID            criteria;
-       BM_DRIVER               driver;
-
-       FUNCTION_TRACE("bm_pr_terminate");
-
-       MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID));
-       MEMSET(&driver, 0, sizeof(BM_DRIVER));
-
-       criteria.type = BM_TYPE_POWER_RESOURCE;
-
-       driver.notify = &bm_pr_notify;
-       driver.request = &bm_pr_request;
-
-       status = bm_unregister_driver(&criteria, &driver);
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_notify
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:     <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_notify (
-       BM_NOTIFY               notify_type,
-       BM_HANDLE               device_handle,
-       void                    **context)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       FUNCTION_TRACE("bm_pr_notify");
-
-       switch (notify_type) {
-
-       case BM_NOTIFY_DEVICE_ADDED:
-               status = bm_pr_add_device(device_handle, context);
-               break;
-
-       case BM_NOTIFY_DEVICE_REMOVED:
-               status = bm_pr_remove_device(context);
-               break;
-
-       default:
-               status = AE_SUPPORT;
-               break;
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_pr_request
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_pr_request (
-       BM_REQUEST              *request,
-       void                    *context)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_POWER_RESOURCE       *pr = NULL;
-
-       FUNCTION_TRACE("bm_pr_request");
-
-       /*
-        * Must have a valid request structure and context.
-        */
-       if (!request || !context) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       /*
-        * context contains information specific to this power resource.
-        */
-       pr = (BM_POWER_RESOURCE*)context;
-
-       /*
-        * Handle request:
-        * ---------------
-        */
-       switch (request->command) {
-
-       default:
-               status = AE_SUPPORT;
-               break;
-       }
-
-       request->status = status;
-
-       return_ACPI_STATUS(status);
-}
-
-
-
diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmrequest.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmrequest.c
deleted file mode 100644 (file)
index d02ee94..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/******************************************************************************
- *
- * Module Name: bmrequest.c
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT             ACPI_BUS_MANAGER
-       MODULE_NAME             ("bmrequest")
-
-
-/****************************************************************************
- *                            External Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_generate_request
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_generate_request (
-       BM_NODE                 *node,
-       BM_REQUEST              *request)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       FUNCTION_TRACE("bm_generate_request");
-
-       if (!node || !request) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       DEBUG_PRINT(ACPI_INFO, ("Sending request [0x%02x] to device [0x%02x].\n", request->command, node->device.handle));
-
-       if (!(node->device.flags & BM_FLAGS_DRIVER_CONTROL) ||
-               !(node->driver.request)) {
-               DEBUG_PRINT(ACPI_WARN, ("No driver installed for device [0x%02x].\n", node->device.handle));
-               return_ACPI_STATUS(AE_NOT_EXIST);
-       }
-
-       status = node->driver.request(request, node->driver.context);
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_request
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_request (
-       BM_REQUEST              *request)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_NODE                 *node = NULL;
-       BM_DEVICE               *device = NULL;
-
-       FUNCTION_TRACE("bm_request");
-
-       /*
-        * Must have a valid request structure.
-        */
-       if (!request) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       DEBUG_PRINT(ACPI_INFO, ("Received request for device [0x%02x] command [0x%08x].\n", request->handle, request->command));
-
-       /*
-        * Resolve the node.
-        */
-       status = bm_get_node(request->handle, 0, &node);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       device = &(node->device);
-
-       /*
-        * Device-Specific Request?
-        * ------------------------
-        * If a device-specific command (>=0x80) forward this request to
-        * the appropriate driver.
-        */
-       if (request->command & BM_COMMAND_DEVICE_SPECIFIC) {
-               status = bm_generate_request(node, request);
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Bus-Specific Requests:
-        * ----------------------
-        */
-       switch (request->command) {
-
-       case BM_COMMAND_GET_POWER_STATE:
-               status = bm_get_power_state(node);
-               if (ACPI_FAILURE(status)) {
-                       break;
-               }
-               status = bm_copy_to_buffer(&(request->buffer),
-                       &(device->power.state), sizeof(BM_POWER_STATE));
-               break;
-
-       case BM_COMMAND_SET_POWER_STATE:
-       {
-               BM_POWER_STATE *power_state = NULL;
-
-               status = bm_cast_buffer(&(request->buffer),
-                       (void**)&power_state, sizeof(BM_POWER_STATE));
-               if (ACPI_FAILURE(status)) {
-                       break;
-               }
-               status = bm_set_power_state(node, *power_state);
-       }
-               break;
-
-       default:
-               status = AE_SUPPORT;
-               request->status = AE_SUPPORT;
-               break;
-       }
-
-       return_ACPI_STATUS(status);
-}
diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmsearch.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmsearch.c
deleted file mode 100644 (file)
index ed37149..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-/******************************************************************************
- *
- * Module Name: bmsearch.c
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT             ACPI_BUS_MANAGER
-       MODULE_NAME             ("bmsearch")
-
-
-/****************************************************************************
- *                            External Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_compare
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_compare (
-       BM_DEVICE               *device,
-       BM_DEVICE_ID            *criteria)
-{
-       if (!device || !criteria) {
-               return AE_BAD_PARAMETER;
-       }
-
-       /*
-        * Present?
-        * --------
-        * We're only going to match on devices that are present.
-        * TODO: Optimize in bm_search (don't have to call here).
-        */
-       if (!BM_DEVICE_PRESENT(device)) {
-               return AE_NOT_FOUND;
-       }
-
-       /*
-        * type?
-        */
-       if (criteria->type && !(criteria->type & device->id.type)) {
-               return AE_NOT_FOUND;
-       }
-
-       /*
-        * hid?
-        */
-       if ((criteria->hid[0]) && (0 != STRNCMP(criteria->hid,
-               device->id.hid, sizeof(BM_DEVICE_HID)))) {
-               return AE_NOT_FOUND;
-       }
-
-       /*
-        * adr?
-        */
-       if ((criteria->adr) && (criteria->adr != device->id.adr)) {
-               return AE_NOT_FOUND;
-       }
-
-       return AE_OK;
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_search
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      AE_BAD_PARAMETER- invalid input parameter
- *              AE_NOT_EXIST    - start_device_handle doesn't exist
- *              AE_NOT_FOUND    - no matches to Search_info.criteria found
- *              AE_OK           - success
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_search(
-       BM_HANDLE               device_handle,
-       BM_DEVICE_ID            *criteria,
-       BM_HANDLE_LIST          *results)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_NODE                 *node = NULL;
-
-       FUNCTION_TRACE("bm_search");
-
-       if (!criteria || !results) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       results->count = 0;
-
-       /*
-        * Locate Starting Point:
-        * ----------------------
-        * Locate the node in the hierarchy where we'll begin our search.
-        */
-       status = bm_get_node(device_handle, 0, &node);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Parse Hierarchy:
-        * ----------------
-        * Parse through the node hierarchy looking for matches.
-        */
-       while (node && (results->count<=BM_HANDLES_MAX)) {
-               /*
-                * Depth-first:
-                * ------------
-                * Searches are always performed depth-first.
-                */
-               if (node->scope.head) {
-                       status = bm_compare(&(node->device), criteria);
-                       if (ACPI_SUCCESS(status)) {
-                               results->handles[results->count++] =
-                                       node->device.handle;
-                       }
-                       node = node->scope.head;
-               }
-
-               /*
-                * Now Breadth:
-                * ------------
-                * Search all peers until scope is exhausted.
-                */
-               else {
-                       status = bm_compare(&(node->device), criteria);
-                       if (ACPI_SUCCESS(status)) {
-                               results->handles[results->count++] =
-                                       node->device.handle;
-                       }
-
-                       /*
-                        * Locate Next Device:
-                        * -------------------
-                        * The next node is either a peer at this level
-                        * (node->next is valid), or we work are way back
-                        * up the tree until we either find a non-parsed
-                        * peer or hit the top (node->parent is NULL).
-                        */
-                       while (!node->next && node->parent) {
-                               node = node->parent;
-                       }
-                       node = node->next;
-               }
-       }
-
-       if (results->count == 0) {
-               return_ACPI_STATUS(AE_NOT_FOUND);
-       }
-       else {
-               return_ACPI_STATUS(AE_OK);
-       }
-}
diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmutils.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmutils.c
deleted file mode 100644 (file)
index 5eda070..0000000
+++ /dev/null
@@ -1,604 +0,0 @@
-/*****************************************************************************
- *
- * Module Name: bmutils.c
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT             ACPI_BUS_MANAGER
-       MODULE_NAME             ("bmutils")
-
-
-#ifdef ACPI_DEBUG
-#define DEBUG_EVAL_ERROR(l,h,p,s)    bm_print_eval_error(l,h,p,s)
-#else
-#define DEBUG_EVAL_ERROR(l,h,p,s)
-#endif
-
-
-/****************************************************************************
- *                            External Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_print_eval_error
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-void
-bm_print_eval_error (
-       u32                     debug_level,
-       ACPI_HANDLE             acpi_handle,
-       ACPI_STRING             pathname,
-       ACPI_STATUS             status)
-{
-       ACPI_BUFFER             buffer;
-       ACPI_STRING             status_string = NULL;
-
-       buffer.length = 256;
-       buffer.pointer = acpi_os_callocate(buffer.length);
-       if (!buffer.pointer) {
-               return;
-       }
-
-       status_string = acpi_cm_format_exception(status);
-
-       status = acpi_get_name(acpi_handle, ACPI_FULL_PATHNAME, &buffer);
-       if (ACPI_FAILURE(status)) {
-               DEBUG_PRINT(debug_level, ("Evaluate object [0x%08x], %s\n", acpi_handle, status_string));
-               return;
-       }
-
-       if (pathname) {
-               DEBUG_PRINT(ACPI_INFO, ("Evaluate object [%s.%s], %s\n", buffer.pointer, pathname, status_string));
-       }
-       else {
-               DEBUG_PRINT(ACPI_INFO, ("Evaluate object [%s], %s\n", buffer.pointer, status_string));
-       }
-
-       acpi_os_free(buffer.pointer);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_copy_to_buffer
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_copy_to_buffer (
-       ACPI_BUFFER             *buffer,
-       void                    *data,
-       u32                     length)
-{
-       FUNCTION_TRACE("bm_copy_to_buffer");
-
-       if (!buffer || (!buffer->pointer) || !data || (length == 0)) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       if (length > buffer->length) {
-               buffer->length = length;
-               return_ACPI_STATUS(AE_BUFFER_OVERFLOW);
-       }
-
-       buffer->length = length;
-       MEMCPY(buffer->pointer, data, length);
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_cast_buffer
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_cast_buffer (
-       ACPI_BUFFER             *buffer,
-       void                    **pointer,
-       u32                     length)
-{
-       FUNCTION_TRACE("bm_cast_buffer");
-
-       if (!buffer || !buffer->pointer || !pointer || length == 0) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       if (length > buffer->length) {
-               return_ACPI_STATUS(AE_BAD_DATA);
-       }
-
-       *pointer = buffer->pointer;
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_extract_package_data
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-/*
-  TODO: Don't assume numbers (in ASL) are 32-bit values!!!!  (IA64)
-  TODO: Issue with 'assumed' types coming out of interpreter...
-        (e.g. toshiba _BIF)
-*/
-
-ACPI_STATUS
-bm_extract_package_data (
-       ACPI_OBJECT             *package,
-       ACPI_BUFFER             *package_format,
-       ACPI_BUFFER             *buffer)
-{
-       ACPI_STATUS             status = AE_OK;
-       u8                      *head = NULL;
-       u8                      *tail = NULL;
-       u8                      **pointer = NULL;
-       u32                     tail_offset = 0;
-       ACPI_OBJECT             *element = NULL;
-       u32                     size_required = 0;
-       char*                   format = NULL;
-       u32                     format_count = 0;
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_extract_package_data");
-
-       if (!package || (package->type != ACPI_TYPE_PACKAGE) ||
-               (package->package.count == 0) || !package_format ||
-               (package_format->length < 1) ||
-               (!package_format->pointer) || !buffer) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       format_count = package_format->length - 1;
-
-       if (format_count > package->package.count) {
-               DEBUG_PRINT(ACPI_WARN, ("Format specifies more objects [%d] than exist in package [%d].", format_count, package->package.count));
-               return_ACPI_STATUS(AE_BAD_DATA);
-       }
-
-       format = (char*)package_format->pointer;
-
-       /*
-        * Calculate size_required.
-        */
-       for (i=0; i<format_count; i++) {
-               element = &(package->package.elements[i]);
-
-               switch (element->type) {
-
-               case ACPI_TYPE_INTEGER:
-                       switch (format[i]) {
-                       case 'N':
-                               size_required += sizeof(ACPI_INTEGER);
-                               tail_offset += sizeof(ACPI_INTEGER);
-                               break;
-                       case 'S':
-                               size_required += sizeof(u8*) +
-                                       sizeof(ACPI_INTEGER) + 1;
-                               tail_offset += sizeof(ACPI_INTEGER);
-                               break;
-                       default:
-                               DEBUG_PRINT(ACPI_WARN, ("Invalid package element [%d]: got number, expecing [%c].\n", i, format[i]));
-                               return_ACPI_STATUS(AE_BAD_DATA);
-                               break;
-                       }
-                       break;
-
-               case ACPI_TYPE_STRING:
-               case ACPI_TYPE_BUFFER:
-                       switch (format[i]) {
-                       case 'S':
-                               size_required += sizeof(u8*) +
-                                       element->string.length + 1;
-                               tail_offset += sizeof(u8*);
-                               break;
-                       case 'B':
-                               size_required += sizeof(u8*) +
-                                       element->buffer.length;
-                               tail_offset += sizeof(u8*);
-                               break;
-                       default:
-                               DEBUG_PRINT(ACPI_WARN, ("Invalid package element [%d] got string/buffer, expecing [%c].\n", i, format[i]));
-                               return_ACPI_STATUS(AE_BAD_DATA);
-                               break;
-                       }
-                       break;
-
-               case ACPI_TYPE_PACKAGE:
-               default:
-                       /* TODO: handle nested packages... */
-                       return_ACPI_STATUS(AE_SUPPORT);
-                       break;
-               }
-       }
-
-       if (size_required > buffer->length) {
-               buffer->length = size_required;
-               return_ACPI_STATUS(AE_BUFFER_OVERFLOW);
-       }
-
-       buffer->length = size_required;
-
-       if (!buffer->pointer) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       head = buffer->pointer;
-       tail = head + tail_offset;
-
-       /*
-        * Extract package data:
-        */
-       for (i=0; i<format_count; i++) {
-
-               element = &(package->package.elements[i]);
-
-               switch (element->type) {
-
-               case ACPI_TYPE_INTEGER:
-                       switch (format[i]) {
-                       case 'N':
-                               *((ACPI_INTEGER*)head) =
-                                       element->integer.value;
-                               head += sizeof(ACPI_INTEGER);
-                               break;
-                       case 'S':
-                               pointer = (u8**)head;
-                               *pointer = tail;
-                               *((ACPI_INTEGER*)tail) =
-                                       element->integer.value;
-                               head += sizeof(ACPI_INTEGER*);
-                               tail += sizeof(ACPI_INTEGER);
-                               /* NULL terminate string */
-                               *tail = 0;
-                               tail++;
-                               break;
-                       default:
-                               /* Should never get here */
-                               break;
-                       }
-                       break;
-
-               case ACPI_TYPE_STRING:
-               case ACPI_TYPE_BUFFER:
-                       switch (format[i]) {
-                       case 'S':
-                               pointer = (u8**)head;
-                               *pointer = tail;
-                               memcpy(tail, element->string.pointer,
-                                       element->string.length);
-                               head += sizeof(u8*);
-                               tail += element->string.length;
-                               /* NULL terminate string */
-                               *tail = 0;
-                               tail++;
-                               break;
-                       case 'B':
-                               pointer = (u8**)head;
-                               *pointer = tail;
-                               memcpy(tail, element->buffer.pointer,
-                                       element->buffer.length);
-                               head += sizeof(u8*);
-                               tail += element->buffer.length;
-                               break;
-                       default:
-                               /* Should never get here */
-                               break;
-                       }
-                       break;
-
-               case ACPI_TYPE_PACKAGE:
-                       /* TODO: handle nested packages... */
-               default:
-                       /* Should never get here */
-                       break;
-               }
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_evaluate_object
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      AE_OK
- *              AE_BUFFER_OVERFLOW  Evaluated object returned data, but
- *                                  caller did not provide buffer.
- *
- * DESCRIPTION: Helper for acpi_evaluate_object that handles buffer
- *              allocation.  Note that the caller is responsible for
- *              freeing buffer->pointer!
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_evaluate_object (
-       ACPI_HANDLE             acpi_handle,
-       ACPI_STRING             pathname,
-       ACPI_OBJECT_LIST        *arguments,
-       ACPI_BUFFER             *buffer)
-{
-       ACPI_STATUS             status = AE_OK;
-
-       FUNCTION_TRACE("bm_evaluate_object");
-
-       /* If caller provided a buffer it must be unallocated/zero'd. */
-       if ((buffer) && (buffer->length != 0 || buffer->pointer)) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Evalute Object:
-        * ---------------
-        * The first attempt is just to get the size of the object data
-        * (that is unless there's no return data, e.g. _INI); the second
-        * gets the data.
-        */
-       status = acpi_evaluate_object(acpi_handle, pathname, arguments, buffer);
-       if (ACPI_SUCCESS(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       else if ((buffer) && (status == AE_BUFFER_OVERFLOW)) {
-
-               /* Gotta allocate -- CALLER MUST FREE! */
-               buffer->pointer = acpi_os_callocate(buffer->length);
-               if (!buffer->pointer) {
-                       return_ACPI_STATUS(AE_NO_MEMORY);
-               }
-
-               /* Re-evaluate -- this time it should work */
-               status = acpi_evaluate_object(acpi_handle, pathname,
-                       arguments, buffer);
-       }
-
-       if (ACPI_FAILURE(status)) {
-               DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status);
-               if (buffer && buffer->pointer) {
-                       acpi_os_free(buffer->pointer);
-                       buffer->pointer = NULL;
-                       buffer->length = 0;
-               }
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_evaluate_simple_integer
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_evaluate_simple_integer (
-       ACPI_HANDLE             acpi_handle,
-       ACPI_STRING             pathname,
-       u32                     *data)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OBJECT             *element = NULL;
-       ACPI_BUFFER             buffer;
-
-       FUNCTION_TRACE("bm_evaluate_simple_integer");
-
-       if (!data) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       MEMSET(&buffer, 0, sizeof(ACPI_BUFFER));
-
-       /*
-        * Evaluate Object:
-        * ----------------
-        */
-       status = bm_evaluate_object(acpi_handle, pathname, NULL, &buffer);
-       if (ACPI_FAILURE(status)) {
-               goto end;
-       }
-
-       /*
-        * Validate Data:
-        * --------------
-        */
-       status = bm_cast_buffer(&buffer, (void**)&element,
-               sizeof(ACPI_OBJECT));
-       if (ACPI_FAILURE(status)) {
-               DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status);
-               goto end;
-       }
-
-       if (element->type != ACPI_TYPE_INTEGER) {
-               status = AE_BAD_DATA;
-               DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status);
-               goto end;
-       }
-
-       *data = element->integer.value;
-
-end:
-       acpi_os_free(buffer.pointer);
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_evaluate_reference_list
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_evaluate_reference_list (
-       ACPI_HANDLE             acpi_handle,
-       ACPI_STRING             pathname,
-       BM_HANDLE_LIST          *reference_list)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_OBJECT             *package = NULL;
-       ACPI_OBJECT             *element = NULL;
-       ACPI_HANDLE             reference_handle = NULL;
-       ACPI_BUFFER             buffer;
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_evaluate_reference_list");
-
-       if (!reference_list) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       MEMSET(&buffer, 0, sizeof(ACPI_BUFFER));
-
-       /*
-        * Evaluate Object:
-        * ----------------
-        */
-       status = bm_evaluate_object(acpi_handle, pathname, NULL, &buffer);
-       if (ACPI_FAILURE(status)) {
-               goto end;
-       }
-
-       /*
-        * Validate Package:
-        * -----------------
-        */
-       status = bm_cast_buffer(&buffer, (void**)&package,
-               sizeof(ACPI_OBJECT));
-       if (ACPI_FAILURE(status)) {
-               DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status);
-               goto end;
-       }
-
-       if (package->type != ACPI_TYPE_PACKAGE) {
-               status = AE_BAD_DATA;
-               DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status);
-               goto end;
-       }
-
-       if (package->package.count > BM_HANDLES_MAX) {
-               package->package.count = BM_HANDLES_MAX;
-       }
-
-       /*
-        * Parse Package Data:
-        * -------------------
-        */
-       for (i = 0; i < package->package.count; i++) {
-
-               element = &(package->package.elements[i]);
-
-               if (!element || (element->type != ACPI_TYPE_STRING)) {
-                       status = AE_BAD_DATA;
-                       DEBUG_PRINT(ACPI_WARN, ("Invalid element in package (not a device reference).\n"));
-                       DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status);
-                       break;
-               }
-
-               /*
-                * Resolve reference string (e.g. "\_PR_.CPU_") to an
-                * ACPI_HANDLE.
-                */
-               status = acpi_get_handle(acpi_handle,
-                       element->string.pointer, &reference_handle);
-               if (ACPI_FAILURE(status)) {
-                       status = AE_BAD_DATA;
-                       DEBUG_PRINT(ACPI_WARN, ("Unable to resolve device reference [%s].\n", element->string.pointer));
-                       DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status);
-                       break;
-               }
-
-               /*
-                * Resolve ACPI_HANDLE to BM_HANDLE.
-                */
-               status = bm_get_handle(reference_handle,
-                       &(reference_list->handles[i]));
-               if (ACPI_FAILURE(status)) {
-                       status = AE_BAD_DATA;
-                       DEBUG_PRINT(ACPI_WARN, ("Unable to resolve device reference for [0x%08x].\n", reference_handle));
-                       DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status);
-                       break;
-               }
-
-               DEBUG_PRINT(ACPI_INFO, ("Resolved reference [%s]->[0x%08x]->[0x%02x]\n", element->string.pointer, reference_handle, reference_list->handles[i]));
-
-               (reference_list->count)++;
-       }
-
-end:
-       acpi_os_free(buffer.pointer);
-
-       return_ACPI_STATUS(status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmxface.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmxface.c
deleted file mode 100644 (file)
index 34b86fa..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-/*****************************************************************************
- *
- * Module Name: bmxface.c
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT             ACPI_BUS_MANAGER
-       MODULE_NAME             ("bmxface")
-
-
-/****************************************************************************
- *                            External Functions
- ****************************************************************************/
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_device_status
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-ACPI_STATUS
-bm_get_device_status (
-       BM_HANDLE               device_handle,
-       BM_DEVICE_STATUS        *device_status)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_NODE                 *node = NULL;
-
-       FUNCTION_TRACE("bm_get_device_status");
-
-       if (!device_status) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       *device_status = BM_STATUS_UNKNOWN;
-
-       /*
-        * Resolve device handle to node.
-        */
-       status = bm_get_node(device_handle, 0, &node);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Parent Present?
-        * ---------------
-        * If the parent isn't present we can't evalute _STA on the child.
-        * Return an unknown status.
-        */
-       if (!BM_NODE_PRESENT(node->parent)) {
-               return_ACPI_STATUS(AE_OK);
-       }
-
-       /*
-        * Dynamic Status?
-        * ---------------
-        * If _STA isn't present we just return the default status.
-        */
-       if (!(node->device.flags & BM_FLAGS_DYNAMIC_STATUS)) {
-               *device_status = BM_STATUS_DEFAULT;
-               return_ACPI_STATUS(AE_OK);
-       }
-
-       /*
-        * Evaluate _STA:
-        * --------------
-        */
-       status = bm_evaluate_simple_integer(node->device.acpi_handle, "_STA",
-               &(node->device.status));
-       if (ACPI_SUCCESS(status)) {
-               *device_status = node->device.status;
-       }
-
-       return_ACPI_STATUS(status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_device_info
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-ACPI_STATUS
-bm_get_device_info (
-       BM_HANDLE               device_handle,
-       BM_DEVICE               **device)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_NODE                 *node = NULL;
-
-       FUNCTION_TRACE("bm_get_device_info");
-
-       if (!device) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Resolve device handle to internal device.
-        */
-       status = bm_get_node(device_handle, 0, &node);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       *device = &(node->device);
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_get_device_context
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-ACPI_STATUS
-bm_get_device_context (
-       BM_HANDLE               device_handle,
-       BM_DRIVER_CONTEXT       *context)
-{
-       ACPI_STATUS             status = AE_OK;
-       BM_NODE                 *node = NULL;
-
-       FUNCTION_TRACE("bm_get_device_context");
-
-       if (!context) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       *context = NULL;
-
-       /*
-        * Resolve device handle to internal device.
-        */
-       status = bm_get_node(device_handle, 0, &node);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       if (!node->driver.context) {
-               return_ACPI_STATUS(AE_NULL_ENTRY);
-       }
-
-       *context = node->driver.context;
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_register_driver
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_register_driver (
-       BM_DEVICE_ID            *criteria,
-       BM_DRIVER               *driver)
-{
-       ACPI_STATUS             status = AE_NOT_FOUND;
-       BM_HANDLE_LIST          device_list;
-       BM_NODE                 *node = NULL;
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_register_driver");
-
-       if (!criteria || !driver || !driver->notify || !driver->request) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       MEMSET(&device_list, 0, sizeof(BM_HANDLE_LIST));
-
-       /*
-        * Find Matches:
-        * -------------
-        * Search through the entire device hierarchy for matches against
-        * the given device criteria.
-        */
-       status = bm_search(BM_HANDLE_ROOT, criteria, &device_list);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Install driver:
-        * ----------------
-        * For each match, record the driver information and execute the
-        * driver's Notify() funciton (if present) to notify the driver
-        * of the device's presence.
-        */
-       for (i = 0; i < device_list.count; i++) {
-
-               /* Resolve the device handle. */
-               status = bm_get_node(device_list.handles[i], 0, &node);
-               if (ACPI_FAILURE(status)) {
-                       continue;
-               }
-
-               DEBUG_PRINT(ACPI_INFO, ("Registering driver for device [0x%02x].\n", node->device.handle));
-
-               /* Notify driver of new device. */
-               status = driver->notify(BM_NOTIFY_DEVICE_ADDED,
-                       node->device.handle, &(node->driver.context));
-               if (ACPI_SUCCESS(status)) {
-                       node->driver.notify = driver->notify;
-                       node->driver.request = driver->request;
-                       node->device.flags |= BM_FLAGS_DRIVER_CONTROL;
-               }
-       }
-
-       return_ACPI_STATUS(AE_OK);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    bm_unregister_driver
- *
- * PARAMETERS:  <TBD>
- *
- * RETURN:      <TBD>
- *
- * DESCRIPTION: <TBD>
- *
- ****************************************************************************/
-
-ACPI_STATUS
-bm_unregister_driver (
-       BM_DEVICE_ID            *criteria,
-       BM_DRIVER               *driver)
-{
-       ACPI_STATUS             status = AE_NOT_FOUND;
-       BM_HANDLE_LIST          device_list;
-       BM_NODE                 *node = NULL;
-       u32                     i = 0;
-
-       FUNCTION_TRACE("bm_unregister_driver");
-
-       if (!criteria || !driver || !driver->notify || !driver->request) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       MEMSET(&device_list, 0, sizeof(BM_HANDLE_LIST));
-
-       /*
-        * Find Matches:
-        * -------------
-        * Search through the entire device hierarchy for matches against
-        * the given device criteria.
-        */
-       status = bm_search(BM_HANDLE_ROOT, criteria, &device_list);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /*
-        * Remove driver:
-        * ---------------
-        * For each match, execute the driver's Notify() function to allow
-        * the driver to cleanup each device instance.
-        */
-       for (i = 0; i < device_list.count; i++) {
-               /*
-                * Resolve the device handle.
-                */
-               status = bm_get_node(device_list.handles[i], 0, &node);
-               if (ACPI_FAILURE(status)) {
-                       continue;
-               }
-
-               DEBUG_PRINT(ACPI_INFO, ("Unregistering driver for device [0x%02x].\n", node->device.handle));
-
-               /* Notify driver of device removal. */
-               status = node->driver.notify(BM_NOTIFY_DEVICE_REMOVED,
-                       node->device.handle, &(node->driver.context));
-
-               node->device.flags &= ~BM_FLAGS_DRIVER_CONTROL;
-
-               MEMSET(&(node->driver), 0, sizeof(BM_DRIVER));
-       }
-
-       return_ACPI_STATUS(AE_OK);
-}
diff --git a/reactos/drivers/bus/acpi/ospm/fdo.c b/reactos/drivers/bus/acpi/ospm/fdo.c
deleted file mode 100644 (file)
index df2f3e4..0000000
+++ /dev/null
@@ -1,983 +0,0 @@
-/* $Id$
- *
- * PROJECT:         ReactOS ACPI bus driver
- * FILE:            acpi/ospm/fdo.c
- * PURPOSE:         ACPI device object dispatch routines
- * PROGRAMMERS:     Casper S. Hornstrup (chorns@users.sourceforge.net)
- *                  Hervé Poussineau (hpoussin@reactos.com)
- * UPDATE HISTORY:
- *      08-08-2001  CSH  Created
- */
-#include <acpi.h>
-
-#define NDEBUG
-#include <debug.h>
-
-FADT_DESCRIPTOR_REV2 acpi_fadt;
-
-/*** PRIVATE *****************************************************************/
-
-
-BOOLEAN
-AcpiCreateUnicodeString(
-  PUNICODE_STRING Destination,
-  PWSTR Source,
-  POOL_TYPE PoolType)
-{
-  ULONG Length;
-
-  if (!Source)
-  {
-    RtlInitUnicodeString(Destination, NULL);
-    return TRUE;
-  }
-
-  Length = (wcslen(Source) + 1) * sizeof(WCHAR);
-
-  Destination->Buffer = ExAllocatePool(PoolType, Length);
-  if (Destination->Buffer == NULL)
-  {
-    return FALSE;
-  }
-
-  RtlCopyMemory(Destination->Buffer, Source, Length);
-
-  Destination->MaximumLength = Length;
-
-  Destination->Length = Length - sizeof(WCHAR);
-
-  return TRUE;
-}
-
-BOOLEAN
-AcpiCreateDeviceIDString(PUNICODE_STRING DeviceID,
-                         BM_NODE *Node)
-{
-  WCHAR Buffer[256];
-
-  swprintf(Buffer,
-           L"ACPI\\%S",
-           Node->device.id.hid);
-
-  return AcpiCreateUnicodeString(DeviceID, Buffer, PagedPool);
-}
-
-
-BOOLEAN
-AcpiCreateHardwareIDsString(PUNICODE_STRING HardwareIDs,
-                            BM_NODE *Node)
-{
-  WCHAR Buffer[256];
-  ULONG Length;
-  ULONG Index;
-
-  Index = 0;
-  Index += swprintf(&Buffer[Index],
-                    L"ACPI\\%S",
-                    Node->device.id.hid);
-  Index++;
-
-  Index += swprintf(&Buffer[Index],
-                    L"*%S",
-                    Node->device.id.hid);
-  Index++;
-  Buffer[Index] = UNICODE_NULL;
-
-  Length = (Index + 1) * sizeof(WCHAR);
-  HardwareIDs->Buffer = ExAllocatePool(PagedPool, Length);
-  if (HardwareIDs->Buffer == NULL)
-  {
-    return FALSE;
-  }
-
-  HardwareIDs->Length = Length - sizeof(WCHAR);
-  HardwareIDs->MaximumLength = Length;
-  RtlCopyMemory(HardwareIDs->Buffer, Buffer, Length);
-
-  return TRUE;
-}
-
-
-BOOLEAN
-AcpiCreateInstanceIDString(PUNICODE_STRING InstanceID,
-                           BM_NODE *Node)
-{
-  WCHAR Buffer[10];
-
-  if (Node->device.id.uid[0])
-    swprintf(Buffer, L"%S", Node->device.id.uid);
-  else
-    /* FIXME: Generate unique id! */
-    swprintf(Buffer, L"%S", L"0000");
-
-  return AcpiCreateUnicodeString(InstanceID, Buffer, PagedPool);
-}
-
-
-BOOLEAN
-AcpiCreateDeviceDescriptionString(PUNICODE_STRING DeviceDescription,
-                                  BM_NODE *Node)
-{
-  PWSTR Buffer;
-
-  if (RtlCompareMemory(Node->device.id.hid, "PNP000", 6) == 6)
-    Buffer = L"Programmable interrupt controller";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP010", 6) == 6)
-    Buffer = L"System timer";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP020", 6) == 6)
-    Buffer = L"DMA controller";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP03", 5) == 5)
-    Buffer = L"Keyboard";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP040", 6) == 6)
-    Buffer = L"Parallel port";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP05", 5) == 5)
-    Buffer = L"Serial port";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP06", 5) ==5)
-    Buffer = L"Disk controller";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP07", 5) == 5)
-    Buffer = L"Disk controller";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP09", 5) == 5)
-    Buffer = L"Display adapter";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP0A0", 6) == 6)
-    Buffer = L"Bus controller";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP0E0", 6) == 6)
-    Buffer = L"PCMCIA controller";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP0F", 5) == 5)
-    Buffer = L"Mouse device";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNP8", 4) == 4)
-    Buffer = L"Network adapter";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNPA0", 5) == 5)
-    Buffer = L"SCSI controller";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNPB0", 5) == 5)
-    Buffer = L"Multimedia device";
-  else if (RtlCompareMemory(Node->device.id.hid, "PNPC00", 6) == 6)
-    Buffer = L"Modem";
-  else
-    Buffer = L"Other ACPI device";
-
-  return AcpiCreateUnicodeString(DeviceDescription, Buffer, PagedPool);
-}
-
-
-static BOOLEAN
-AcpiCreateResourceList(PCM_RESOURCE_LIST* pResourceList,
-                       PULONG ResourceListSize,
-                       PIO_RESOURCE_REQUIREMENTS_LIST* pRequirementsList,
-                       PULONG RequirementsListSize,
-                       RESOURCE* resources)
-{
-  BOOLEAN Done;
-  ULONG NumberOfResources = 0;
-  PCM_RESOURCE_LIST ResourceList;
-  PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
-  PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor;
-  PIO_RESOURCE_DESCRIPTOR RequirementDescriptor;
-  RESOURCE* resource;
-  ULONG i;
-
-  /* Count number of resources */
-  Done = FALSE;
-  resource = resources;
-  while (!Done)
-  {
-    switch (resource->id)
-    {
-      case irq:
-      {
-        IRQ_RESOURCE *irq_data = (IRQ_RESOURCE*) &resource->data;
-        NumberOfResources += irq_data->number_of_interrupts;
-        break;
-      }
-      case dma:
-      {
-        DMA_RESOURCE *dma_data = (DMA_RESOURCE*) &resource->data;
-        NumberOfResources += dma_data->number_of_channels;
-        break;
-      }
-      case io:
-      {
-        NumberOfResources++;
-        break;
-      }
-      case end_tag:
-      {
-        Done = TRUE;
-        break;
-      }
-      default:
-      {
-        break;
-      }
-    }
-    resource = NEXT_RESOURCE(resource);
-  }
-
-  /* Allocate memory */
-  *ResourceListSize = sizeof(CM_RESOURCE_LIST) + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
-  ResourceList = (PCM_RESOURCE_LIST)ExAllocatePool(PagedPool, *ResourceListSize);
-  *pResourceList = ResourceList;
-  if (!ResourceList)
-    return FALSE;
-  ResourceList->Count = 1;
-  ResourceList->List[0].InterfaceType = Internal; /* FIXME */
-  ResourceList->List[0].BusNumber = 0; /* We're the only ACPI bus device in the system */
-  ResourceList->List[0].PartialResourceList.Version = 1;
-  ResourceList->List[0].PartialResourceList.Revision = 1;
-  ResourceList->List[0].PartialResourceList.Count = NumberOfResources;
-  ResourceDescriptor = ResourceList->List[0].PartialResourceList.PartialDescriptors;
-
-  *RequirementsListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1);
-  RequirementsList = (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePool(PagedPool, *RequirementsListSize);
-  *pRequirementsList = RequirementsList;
-  if (!RequirementsList)
-  {
-    ExFreePool(ResourceList);
-    return FALSE;
-  }
-  RequirementsList->ListSize = *RequirementsListSize;
-  RequirementsList->InterfaceType = ResourceList->List[0].InterfaceType;
-  RequirementsList->BusNumber = ResourceList->List[0].BusNumber;
-  RequirementsList->SlotNumber = 0; /* Not used by WDM drivers */
-  RequirementsList->AlternativeLists = 1;
-  RequirementsList->List[0].Version = 1;
-  RequirementsList->List[0].Revision = 1;
-  RequirementsList->List[0].Count = NumberOfResources;
-  RequirementDescriptor = RequirementsList->List[0].Descriptors;
-
-  /* Fill resources list structure */
-  Done = FALSE;
-  resource = resources;
-  while (!Done)
-  {
-    switch (resource->id)
-    {
-      case irq:
-      {
-        IRQ_RESOURCE *irq_data = (IRQ_RESOURCE*) &resource->data;
-        for (i = 0; i < irq_data->number_of_interrupts; i++)
-        {
-          ResourceDescriptor->Type = CmResourceTypeInterrupt;
-
-          ResourceDescriptor->ShareDisposition =
-            (irq_data->shared_exclusive == SHARED ? CmResourceShareShared : CmResourceShareDeviceExclusive);
-          ResourceDescriptor->Flags =
-            (irq_data->edge_level == LEVEL_SENSITIVE ? CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE : CM_RESOURCE_INTERRUPT_LATCHED);
-          ResourceDescriptor->u.Interrupt.Level = irq_data->interrupts[i];
-          ResourceDescriptor->u.Interrupt.Vector = 0;
-          ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
-
-          RequirementDescriptor->Option = 0; /* Required */
-          RequirementDescriptor->Type = ResourceDescriptor->Type;
-          RequirementDescriptor->ShareDisposition = ResourceDescriptor->ShareDisposition;
-          RequirementDescriptor->Flags = ResourceDescriptor->Flags;
-          RequirementDescriptor->u.Interrupt.MinimumVector = RequirementDescriptor->u.Interrupt.MaximumVector
-            = irq_data->interrupts[i];
-
-          ResourceDescriptor++;
-          RequirementDescriptor++;
-        }
-        break;
-      }
-      case dma:
-      {
-        DMA_RESOURCE *dma_data = (DMA_RESOURCE*) &resource->data;
-        for (i = 0; i < dma_data->number_of_channels; i++)
-        {
-          ResourceDescriptor->Type = CmResourceTypeDma;
-          ResourceDescriptor->Flags = 0;
-          switch (dma_data->type)
-          {
-            case TYPE_A: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break;
-            case TYPE_B: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break;
-            case TYPE_F: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break;
-          }
-          if (dma_data->bus_master == BUS_MASTER)
-            ResourceDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER;
-          switch (dma_data->transfer)
-          {
-            case TRANSFER_8: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8; break;
-            case TRANSFER_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_16; break;
-            case TRANSFER_8_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break;
-          }
-          ResourceDescriptor->u.Dma.Channel = dma_data->channels[i];
-
-          RequirementDescriptor->Option = 0; /* Required */
-          RequirementDescriptor->Type = ResourceDescriptor->Type;
-          RequirementDescriptor->ShareDisposition = ResourceDescriptor->ShareDisposition;
-          RequirementDescriptor->Flags = ResourceDescriptor->Flags;
-          RequirementDescriptor->u.Dma.MinimumChannel = RequirementDescriptor->u.Dma.MaximumChannel
-            = ResourceDescriptor->u.Dma.Channel;
-
-          ResourceDescriptor++;
-          RequirementDescriptor++;
-        }
-        break;
-      }
-      case io:
-      {
-        IO_RESOURCE *io_data = (IO_RESOURCE*) &resource->data;
-        ResourceDescriptor->Type = CmResourceTypePort;
-        ResourceDescriptor->ShareDisposition = CmResourceShareDriverExclusive;
-        ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO;
-        if (io_data->io_decode == DECODE_16)
-          ResourceDescriptor->Flags |= CM_RESOURCE_PORT_16_BIT_DECODE;
-        else
-          ResourceDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
-        ResourceDescriptor->u.Port.Start.u.HighPart = 0;
-        ResourceDescriptor->u.Port.Start.u.LowPart = io_data->min_base_address;
-        ResourceDescriptor->u.Port.Length = io_data->range_length;
-
-        RequirementDescriptor->Option = 0; /* Required */
-        RequirementDescriptor->Type = ResourceDescriptor->Type;
-        RequirementDescriptor->ShareDisposition = ResourceDescriptor->ShareDisposition;
-        RequirementDescriptor->Flags = ResourceDescriptor->Flags;
-        RequirementDescriptor->u.Port.Length = ResourceDescriptor->u.Port.Length;
-        RequirementDescriptor->u.Port.Alignment = 1; /* Start address is specified, so it doesn't matter */
-        RequirementDescriptor->u.Port.MinimumAddress = RequirementDescriptor->u.Port.MaximumAddress
-          = ResourceDescriptor->u.Port.Start;
-
-        ResourceDescriptor++;
-        RequirementDescriptor++;
-        break;
-      }
-      case end_tag:
-      {
-        Done = TRUE;
-        break;
-      }
-      default:
-      {
-        break;
-      }
-    }
-    resource = NEXT_RESOURCE(resource);
-  }
-
-  acpi_rs_dump_resource_list(resource);
-  return TRUE;
-}
-
-
-static BOOLEAN
-AcpiCheckIfIsSerialDebugPort(
-  IN PACPI_DEVICE Device)
-{
-  ACPI_STATUS AcpiStatus;
-  BM_NODE *Node;
-  ACPI_BUFFER Buffer;
-  BOOLEAN Done;
-  RESOURCE* resource;
-
-  AcpiStatus = bm_get_node(Device->BmHandle, 0, &Node);
-  if (!ACPI_SUCCESS(AcpiStatus))
-    return FALSE;
-
-  /* Get current resources */
-  Buffer.length = 0;
-  AcpiStatus = acpi_get_current_resources(Node->device.acpi_handle, &Buffer);
-  if ((AcpiStatus & ACPI_OK) == 0)
-    return FALSE;
-  if (Buffer.length == 0)
-    return FALSE;
-
-  Buffer.pointer = ExAllocatePool(PagedPool, Buffer.length);
-  if (!Buffer.pointer)
-    return FALSE;
-  AcpiStatus = acpi_get_current_resources(Node->device.acpi_handle, &Buffer);
-  if (!ACPI_SUCCESS(AcpiStatus))
-  {
-    ExFreePool(Buffer.pointer);
-    return FALSE;
-  }
-
-  /* Loop through the list of resources to see if the
-   * device is using the serial port address
-   */
-  Done = FALSE;
-  resource = (RESOURCE*)Buffer.pointer;
-  while (!Done)
-  {
-    switch (resource->id)
-    {
-      case io:
-      {
-        IO_RESOURCE *io_data = (IO_RESOURCE*) &resource->data;
-        if (KdComPortInUse == UlongToPtr(io_data->min_base_address))
-        {
-          ExFreePool(Buffer.pointer);
-          return TRUE;
-        }
-        break;
-      }
-      case end_tag:
-      {
-        Done = TRUE;
-        break;
-      }
-      default:
-      {
-        break;
-      }
-    }
-    resource = (RESOURCE *) ((NATIVE_UINT) resource + (NATIVE_UINT) resource->length);
-  }
-
-  ExFreePool(Buffer.pointer);
-  return FALSE;
-}
-
-static NTSTATUS
-FdoQueryBusRelations(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp,
-  PIO_STACK_LOCATION IrpSp)
-{
-  PPDO_DEVICE_EXTENSION PdoDeviceExtension;
-  PFDO_DEVICE_EXTENSION DeviceExtension;
-  PDEVICE_RELATIONS Relations;
-  PLIST_ENTRY CurrentEntry;
-  ACPI_STATUS AcpiStatus;
-  PACPI_DEVICE Device;
-  NTSTATUS Status = STATUS_SUCCESS;
-  BM_NODE *Node;
-  ULONG Size;
-  ULONG i;
-
-  DPRINT("Called\n");
-
-  DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  Size = sizeof(DEVICE_RELATIONS) + sizeof(Relations->Objects) *
-    (DeviceExtension->DeviceListCount - 1);
-  Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, Size);
-  if (!Relations)
-    return STATUS_INSUFFICIENT_RESOURCES;
-
-  Relations->Count = DeviceExtension->DeviceListCount;
-
-  i = 0;
-  CurrentEntry = DeviceExtension->DeviceListHead.Flink;
-  while (CurrentEntry != &DeviceExtension->DeviceListHead)
-  {
-    ACPI_BUFFER Buffer;
-    Device = CONTAINING_RECORD(CurrentEntry, ACPI_DEVICE, DeviceListEntry);
-
-    if (AcpiCheckIfIsSerialDebugPort(Device))
-    {
-      /* Skip this device */
-      DPRINT("Found debug serial port ; skipping it\n");
-      Relations->Count--;
-      CurrentEntry = CurrentEntry->Flink;
-      continue;
-    }
-
-    /* FIXME: For ACPI namespace devices on the motherboard create filter DOs
-       and attach them just above the ACPI bus device object (PDO) */
-
-    /* FIXME: For other devices in ACPI namespace, but not on motherboard,
-       create PDOs */
-
-    if (!Device->Pdo)
-    {
-      /* Create a physical device object for the
-         device as it does not already have one */
-      Status = IoCreateDevice(DeviceObject->DriverObject,
-                              sizeof(PDO_DEVICE_EXTENSION),
-                              NULL,
-                              FILE_DEVICE_CONTROLLER,
-                              FILE_AUTOGENERATED_DEVICE_NAME,
-                              FALSE,
-                              &Device->Pdo);
-      if (!NT_SUCCESS(Status))
-      {
-        DPRINT("IoCreateDevice() failed with status 0x%X\n", Status);
-        /* FIXME: Cleanup all new PDOs created in this call */
-        ExFreePool(Relations);
-        return Status;
-      }
-
-      PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Device->Pdo->DeviceExtension;
-
-      RtlZeroMemory(PdoDeviceExtension, sizeof(PDO_DEVICE_EXTENSION));
-
-      Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
-
-      Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
-
-      //Device->Pdo->Flags |= DO_POWER_PAGABLE;
-
-      PdoDeviceExtension->Common.DeviceObject = Device->Pdo;
-
-      PdoDeviceExtension->Common.DevicePowerState = PowerDeviceD0;
-
-//      PdoDeviceExtension->Common.Ldo = IoAttachDeviceToDeviceStack(DeviceObject,
-//                                                                   Device->Pdo);
-
-      RtlInitUnicodeString(&PdoDeviceExtension->DeviceID, NULL);
-      RtlInitUnicodeString(&PdoDeviceExtension->InstanceID, NULL);
-      RtlInitUnicodeString(&PdoDeviceExtension->HardwareIDs, NULL);
-
-      AcpiStatus = bm_get_node(Device->BmHandle, 0, &Node);
-      if (ACPI_SUCCESS(AcpiStatus))
-      {
-        /* Get current resources */
-        Buffer.length = 0;
-        Status = acpi_get_current_resources(Node->device.acpi_handle, &Buffer);
-        if ((Status & ACPI_OK) == 0)
-        {
-          ASSERT(FALSE);
-        }
-        if (Buffer.length > 0)
-        {
-          Buffer.pointer = ExAllocatePool(PagedPool, Buffer.length);
-          if (!Buffer.pointer)
-          {
-            ASSERT(FALSE);
-          }
-          Status = acpi_get_current_resources(Node->device.acpi_handle, &Buffer);
-          if (ACPI_FAILURE(Status))
-          {
-            ASSERT(FALSE);
-          }
-          if (!AcpiCreateResourceList(&PdoDeviceExtension->ResourceList,
-                                      &PdoDeviceExtension->ResourceListSize,
-                                      &PdoDeviceExtension->ResourceRequirementsList,
-                                      &PdoDeviceExtension->ResourceRequirementsListSize,
-                                      (RESOURCE*)Buffer.pointer))
-          {
-            ASSERT(FALSE);
-          }
-          ExFreePool(Buffer.pointer);
-        }
-
-        /* Add Device ID string */
-        if (!AcpiCreateDeviceIDString(&PdoDeviceExtension->DeviceID,
-                                      Node))
-        {
-          ASSERT(FALSE);
-//          ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
-//          ErrorOccurred = TRUE;
-//          break;
-        }
-
-        if (!AcpiCreateInstanceIDString(&PdoDeviceExtension->InstanceID,
-                                        Node))
-        {
-          ASSERT(FALSE);
-//          ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
-//          ErrorOccurred = TRUE;
-//          break;
-        }
-
-        if (!AcpiCreateHardwareIDsString(&PdoDeviceExtension->HardwareIDs,
-                                         Node))
-        {
-          ASSERT(FALSE);
-//          ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
-//          ErrorOccurred = TRUE;
-//          break;
-        }
-
-        if (!AcpiCreateDeviceDescriptionString(&PdoDeviceExtension->DeviceDescription,
-                                            Node))
-        {
-          ASSERT(FALSE);
-//          ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
-//          ErrorOccurred = TRUE;
-//          break;
-        }
-      }
-    }
-
-    /* Reference the physical device object. The PnP manager
-       will dereference it again when it is no longer needed */
-    ObReferenceObject(Device->Pdo);
-
-    Relations->Objects[i] = Device->Pdo;
-
-    i++;
-
-    CurrentEntry = CurrentEntry->Flink;
-  }
-
-  Irp->IoStatus.Information = (ULONG_PTR)Relations;
-
-  return Status;
-}
-
-#ifndef NDEBUG
-static VOID
-ACPIPrintInfo(
-  PFDO_DEVICE_EXTENSION DeviceExtension)
-{
-  DbgPrint("ACPI: System firmware supports:\n");
-
-  /*
-   * Print out basic system information
-   */
-  DbgPrint("+------------------------------------------------------------\n");
-  DbgPrint("| Sx states: %cS0 %cS1 %cS2 %cS3 %cS4 %cS5\n",
-           (DeviceExtension->SystemStates[0]?'+':'-'),
-           (DeviceExtension->SystemStates[1]?'+':'-'),
-           (DeviceExtension->SystemStates[2]?'+':'-'),
-           (DeviceExtension->SystemStates[3]?'+':'-'),
-           (DeviceExtension->SystemStates[4]?'+':'-'),
-           (DeviceExtension->SystemStates[5]?'+':'-'));
-  DbgPrint("+------------------------------------------------------------\n");
-}
-#endif
-
-static NTSTATUS
-ACPIInitializeInternalDriver(
-  PFDO_DEVICE_EXTENSION DeviceExtension,
-  ACPI_DRIVER_FUNCTION Initialize,
-  ACPI_DRIVER_FUNCTION Terminate)
-{
-  ACPI_STATUS AcpiStatus;
-
-  AcpiStatus = Initialize();
-  if (!ACPI_SUCCESS(AcpiStatus)) {
-    DPRINT("BN init status 0x%X\n", AcpiStatus);
-    return STATUS_UNSUCCESSFUL;
-  }
-#if 0
-  AcpiDevice = (PACPI_DEVICE)ExAllocatePool(
-    NonPagedPool, sizeof(ACPI_DEVICE));
-  if (!AcpiDevice) {
-    return STATUS_INSUFFICIENT_RESOURCES;
-  }
-
-  AcpiDevice->Initialize = Initialize;
-  AcpiDevice->Terminate = Terminate;
-
-  /* FIXME: Create PDO */
-
-  AcpiDevice->Pdo = NULL;
-  //AcpiDevice->BmHandle = HandleList.handles[i];
-
-  ExInterlockedInsertHeadList(&DeviceExtension->DeviceListHead,
-    &AcpiDevice->ListEntry, &DeviceExtension->DeviceListLock);
-#endif
-  return STATUS_SUCCESS;
-}
-
-
-static NTSTATUS
-ACPIInitializeInternalDrivers(
-  PFDO_DEVICE_EXTENSION DeviceExtension)
-{
-  NTSTATUS Status;
-
-  Status = ACPIInitializeInternalDriver(DeviceExtension,
-    bn_initialize, bn_terminate);
-
-  return STATUS_SUCCESS;
-}
-
-
-static NTSTATUS
-FdoStartDevice(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp)
-{
-  PFDO_DEVICE_EXTENSION DeviceExtension;
-       ACPI_PHYSICAL_ADDRESS rsdp;
-       ACPI_SYSTEM_INFO SysInfo;
-  ACPI_STATUS AcpiStatus;
-  ACPI_BUFFER  Buffer;
-       UCHAR TypeA, TypeB;
-  ULONG i;
-
-  DPRINT("Called\n");
-
-  DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  ASSERT(DeviceExtension->State == dsStopped);
-
-  AcpiStatus = acpi_initialize_subsystem();
-  if (!ACPI_SUCCESS(AcpiStatus)) {
-    DPRINT("acpi_initialize_subsystem() failed with status 0x%X\n", AcpiStatus);
-    return STATUS_UNSUCCESSFUL;
-  }
-
-  AcpiStatus = acpi_find_root_pointer(&rsdp);
-  if (!ACPI_SUCCESS(AcpiStatus)) {
-    DPRINT("acpi_find_root_pointer() failed with status 0x%X\n", AcpiStatus);
-    return STATUS_UNSUCCESSFUL;
-  }
-
-  /* From this point on, on error we must call acpi_terminate() */
-
-  AcpiStatus = acpi_load_tables(rsdp);
-  if (!ACPI_SUCCESS(AcpiStatus)) {
-    DPRINT("acpi_load_tables() failed with status 0x%X\n", AcpiStatus);
-    acpi_terminate();
-    return STATUS_UNSUCCESSFUL;
-  }
-
-  Buffer.length  = sizeof(SysInfo);
-  Buffer.pointer = &SysInfo;
-
-  AcpiStatus = acpi_get_system_info(&Buffer);
-  if (!ACPI_SUCCESS(AcpiStatus)) {
-    DPRINT("acpi_get_system_info() failed with status 0x%X\n", AcpiStatus);
-    acpi_terminate();
-    return STATUS_UNSUCCESSFUL;
-  }
-
-  DPRINT("ACPI CA Core Subsystem version 0x%X\n", SysInfo.acpi_ca_version);
-
-  ASSERT(SysInfo.num_table_types > ACPI_TABLE_FADT);
-
-  RtlMoveMemory(&acpi_fadt,
-    &SysInfo.table_info[ACPI_TABLE_FADT],
-    sizeof(FADT_DESCRIPTOR_REV2));
-
-  AcpiStatus = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION);
-  if (!ACPI_SUCCESS(AcpiStatus)) {
-    DPRINT("acpi_enable_subsystem() failed with status 0x%X\n", AcpiStatus);
-    acpi_terminate();
-    return STATUS_UNSUCCESSFUL;
-  }
-
-  DPRINT("ACPI CA Core Subsystem enabled\n");
-
-  /*
-   * Sx States:
-   * ----------
-   * Figure out which Sx states are supported
-   */
-  for (i=0; i<=ACPI_S_STATES_MAX; i++) {
-    AcpiStatus = acpi_hw_obtain_sleep_type_register_data(
-                       i,
-                       &TypeA,
-                       &TypeB);
-    DPRINT("acpi_hw_obtain_sleep_type_register_data (%d) status 0x%X\n",
-      i, AcpiStatus);
-    if (ACPI_SUCCESS(AcpiStatus)) {
-      DeviceExtension->SystemStates[i] = TRUE;
-    }
-  }
-
-#ifndef NDEBUG
-  ACPIPrintInfo(DeviceExtension);
-#endif
-
-  /* Initialize ACPI bus manager */
-  AcpiStatus = bm_initialize();
-  if (!ACPI_SUCCESS(AcpiStatus)) {
-    DPRINT("bm_initialize() failed with status 0x%X\n", AcpiStatus);
-    acpi_terminate();
-    return STATUS_UNSUCCESSFUL;
-  }
-
-  InitializeListHead(&DeviceExtension->DeviceListHead);
-  KeInitializeSpinLock(&DeviceExtension->DeviceListLock);
-  DeviceExtension->DeviceListCount = 0;
-
-#if 0
-  ACPIEnumerateDevices(DeviceExtension);
-#endif
-
-  ACPIInitializeInternalDrivers(DeviceExtension);
-
-  DeviceExtension->State = dsStarted;
-
-  return STATUS_SUCCESS;
-}
-
-
-static NTSTATUS
-FdoSetPower(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp,
-  PIO_STACK_LOCATION IrpSp)
-{
-  PFDO_DEVICE_EXTENSION DeviceExtension;
-  ACPI_STATUS AcpiStatus;
-  NTSTATUS Status;
-  ULONG AcpiState;
-
-  DPRINT("Called\n");
-
-  DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  if (IrpSp->Parameters.Power.Type == SystemPowerState) {
-    Status = STATUS_SUCCESS;
-    switch (IrpSp->Parameters.Power.State.SystemState) {
-    case PowerSystemSleeping1:
-      AcpiState = ACPI_STATE_S1;
-      break;
-    case PowerSystemSleeping2:
-      AcpiState = ACPI_STATE_S2;
-      break;
-    case PowerSystemSleeping3:
-      AcpiState = ACPI_STATE_S3;
-      break;
-    case PowerSystemHibernate:
-      AcpiState = ACPI_STATE_S4;
-      break;
-    case PowerSystemShutdown:
-      AcpiState = ACPI_STATE_S5;
-      break;
-    default:
-      Status = STATUS_UNSUCCESSFUL;
-      return Status;
-    }
-    if (!DeviceExtension->SystemStates[AcpiState]) {
-      DPRINT("System sleep state S%d is not supported by hardware\n", AcpiState);
-      Status = STATUS_UNSUCCESSFUL;
-    }
-
-    if (NT_SUCCESS(Status)) {
-      DPRINT("Trying to enter sleep state %d\n", AcpiState);
-
-      AcpiStatus = acpi_enter_sleep_state(AcpiState);
-      if (!ACPI_SUCCESS(AcpiStatus)) {
-        DPRINT("Failed to enter sleep state %d (Status 0x%X)\n",
-          AcpiState, AcpiStatus);
-        Status = STATUS_UNSUCCESSFUL;
-      }
-    }
-  } else {
-    Status = STATUS_UNSUCCESSFUL;
-  }
-
-  return Status;
-}
-
-
-/*** PUBLIC ******************************************************************/
-
-NTSTATUS
-NTAPI
-FdoPnpControl(
-  PDEVICE_OBJECT DeviceObject,
-  PIRP Irp)
-/*
- * FUNCTION: Handle Plug and Play IRPs for the ACPI device
- * ARGUMENTS:
- *     DeviceObject = Pointer to functional device object of the ACPI driver
- *     Irp          = Pointer to IRP that should be handled
- * RETURNS:
- *     Status
- */
-{
-  PIO_STACK_LOCATION IrpSp;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  IrpSp = IoGetCurrentIrpStackLocation(Irp);
-  switch (IrpSp->MinorFunction) {
-  //case IRP_MN_CANCEL_REMOVE_DEVICE:
-  //  Status = STATUS_NOT_IMPLEMENTED;
-  //  break;
-
-  //case IRP_MN_CANCEL_STOP_DEVICE:
-  //  Status = STATUS_NOT_IMPLEMENTED;
-  //  break;
-
-  //case IRP_MN_DEVICE_USAGE_NOTIFICATION:
-  //  Status = STATUS_NOT_IMPLEMENTED;
-  //  break;
-
-  //case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
-  //  Status = STATUS_NOT_IMPLEMENTED;
-  //  break;
-
-  case IRP_MN_QUERY_DEVICE_RELATIONS:
-    Status = FdoQueryBusRelations(DeviceObject, Irp, IrpSp);
-    break;
-
-  //case IRP_MN_QUERY_PNP_DEVICE_STATE:
-  //  Status = STATUS_NOT_IMPLEMENTED;
-  //  break;
-
-  //case IRP_MN_QUERY_REMOVE_DEVICE:
-  //  Status = STATUS_NOT_IMPLEMENTED;
-  //  break;
-
-  //case IRP_MN_QUERY_STOP_DEVICE:
-  //  Status = STATUS_NOT_IMPLEMENTED;
-  //  break;
-
-  //case IRP_MN_REMOVE_DEVICE:
-  //  Status = STATUS_NOT_IMPLEMENTED;
-  //  break;
-
-  case IRP_MN_START_DEVICE:
-    DPRINT("IRP_MN_START_DEVICE received\n");
-    Status = FdoStartDevice(DeviceObject, Irp);
-    break;
-
-  case IRP_MN_STOP_DEVICE:
-    /* Currently not supported */
-    //bm_terminate();
-    Status = STATUS_UNSUCCESSFUL;
-    break;
-
-  //case IRP_MN_SURPRISE_REMOVAL:
-  //  Status = STATUS_NOT_IMPLEMENTED;
-  //  break;
-
-  default:
-    DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
-    Status = Irp->IoStatus.Status;
-    break;
-  }
-
-  if (Status != STATUS_PENDING) {
-    Irp->IoStatus.Status = Status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-  }
-
-  DPRINT("Leaving. Status 0x%X\n", Status);
-
-  return Status;
-}
-
-
-NTSTATUS
-NTAPI
-FdoPowerControl(
-  PDEVICE_OBJECT DeviceObject,
-  PIRP Irp)
-/*
- * FUNCTION: Handle power management IRPs for the ACPI device
- * ARGUMENTS:
- *     DeviceObject = Pointer to functional device object of the ACPI driver
- *     Irp          = Pointer to IRP that should be handled
- * RETURNS:
- *     Status
- */
-{
-  PIO_STACK_LOCATION IrpSp;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  IrpSp = IoGetCurrentIrpStackLocation(Irp);
-
-  switch (IrpSp->MinorFunction) {
-  case IRP_MN_SET_POWER:
-    Status = FdoSetPower(DeviceObject, Irp, IrpSp);
-    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;
-}
-
-/* EOF */
diff --git a/reactos/drivers/bus/acpi/ospm/include/acpisys.h b/reactos/drivers/bus/acpi/ospm/include/acpisys.h
deleted file mode 100644 (file)
index 5e21d6a..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * PROJECT: ReactOS ACPI bus driver
- * FILE:    acpi/ospm/include/acpisys.h
- * PURPOSE: ACPI bus driver definitions
- */
-#define ACPI_DEBUG
-
-typedef ACPI_STATUS (*ACPI_DRIVER_FUNCTION)(VOID);
-
-
-typedef enum
-{
-  dsStopped,
-  dsStarted,
-  dsPaused,
-  dsRemoved,
-  dsSurpriseRemoved
-} ACPI_DEVICE_STATE;
-
-
-typedef struct _COMMON_DEVICE_EXTENSION
-{
-  // Pointer to device object, this device extension is associated with
-  PDEVICE_OBJECT DeviceObject;
-  // Wether this device extension is for an FDO or PDO
-  BOOLEAN IsFDO;
-  // Wether the device is removed
-  BOOLEAN Removed;
-  // Current device power state for the device
-  DEVICE_POWER_STATE DevicePowerState;
-  // Lower device object
-  PDEVICE_OBJECT Ldo;
-} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
-
-
-/* Physical Device Object device extension for a child device */
-typedef struct _PDO_DEVICE_EXTENSION
-{
-  // Common device data
-  COMMON_DEVICE_EXTENSION Common;
-  // Device ID
-  UNICODE_STRING DeviceID;
-  // Instance ID
-  UNICODE_STRING InstanceID;
-  // Hardware IDs
-  UNICODE_STRING HardwareIDs;
-  // Textual description of device
-  UNICODE_STRING DeviceDescription;
-  // Resource list
-  PCM_RESOURCE_LIST ResourceList;
-  ULONG ResourceListSize;
-  // Requirement list
-  PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList;
-  ULONG ResourceRequirementsListSize;
-} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
-
-
-typedef struct _FDO_DEVICE_EXTENSION
-{
-  // Common device data
-  COMMON_DEVICE_EXTENSION Common;
-  // Physical Device Object
-  PDEVICE_OBJECT Pdo;
-  // Current state of the driver
-  ACPI_DEVICE_STATE State;
-  // Supported system states
-  BOOLEAN SystemStates[ACPI_S_STATE_COUNT];
-  // Namespace device list
-  LIST_ENTRY DeviceListHead;
-  // Number of devices in device list
-  ULONG DeviceListCount;
-  // Lock for namespace device list
-  KSPIN_LOCK DeviceListLock;
-} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
-
-
-typedef struct _ACPI_DEVICE
-{
-  // Entry on device list
-  LIST_ENTRY DeviceListEntry;
-  // Bus manager handle
-  BM_HANDLE BmHandle;
-  // Physical Device Object
-  PDEVICE_OBJECT Pdo;
-  // Initialization function
-  ACPI_DRIVER_FUNCTION Initialize;
-  // Cleanup function
-  ACPI_DRIVER_FUNCTION Terminate;
-} ACPI_DEVICE, *PACPI_DEVICE;
-
-
-/* acpienum.c */
-
-NTSTATUS
-ACPIEnumerateDevices(
-  PFDO_DEVICE_EXTENSION DeviceExtension);
-
-
-/* fdo.c */
-
-NTSTATUS
-NTAPI
-FdoPnpControl(
-  PDEVICE_OBJECT DeviceObject,
-  PIRP Irp);
-
-NTSTATUS
-NTAPI
-FdoPowerControl(
-  PDEVICE_OBJECT DeviceObject,
-  PIRP Irp);
-
-/* pdo.c */
-
-NTSTATUS
-NTAPI
-PdoPnpControl(
-  PDEVICE_OBJECT DeviceObject,
-  PIRP Irp);
-
-NTSTATUS
-NTAPI
-PdoPowerControl(
-  PDEVICE_OBJECT DeviceObject,
-  PIRP Irp);
-
-/* EOF */
diff --git a/reactos/drivers/bus/acpi/ospm/include/bm.h b/reactos/drivers/bus/acpi/ospm/include/bm.h
deleted file mode 100644 (file)
index 342e628..0000000
+++ /dev/null
@@ -1,624 +0,0 @@
-/*****************************************************************************
- *
- * Module name: bm.h
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __BM_H__
-#define __BM_H__
-
-#include <actypes.h>
-#include <acexcep.h>
-
-
-/*****************************************************************************
- *                               Types & Defines
- *****************************************************************************/
-
-/*
- * Output Flags (Debug):
- * ---------------------
- */
-#define BM_PRINT_ALL                    (0x00000000)
-#define BM_PRINT_GROUP                  (0x00000001)
-#define BM_PRINT_LINKAGE                (0x00000002)
-#define BM_PRINT_IDENTIFICATION                (0x00000004)
-#define BM_PRINT_POWER                 (0x00000008)
-#define BM_PRINT_PRESENT               (0x00000010)
-
-
-/*
- * /proc Interface:
- * ----------------
- */
-#define BM_PROC_ROOT                   "acpi"
-#define BM_PROC_EVENT                  "event"
-
-extern struct proc_dir_entry           *bm_proc_root;
-
-
-/*
- * BM_COMMAND:
- * -----------
- */
-typedef u32                             BM_COMMAND;
-
-#define BM_COMMAND_UNKNOWN              ((BM_COMMAND) 0x00)
-
-#define BM_COMMAND_GET_POWER_STATE     ((BM_COMMAND) 0x01)
-#define BM_COMMAND_SET_POWER_STATE     ((BM_COMMAND) 0x02)
-
-#define BM_COMMAND_DEVICE_SPECIFIC      ((BM_COMMAND) 0x80)
-
-/*
- * BM_NOTIFY:
- * ----------
- * Standard ACPI notification values, from section 5.6.3 of the ACPI 2.0
- * specification.  Note that the Bus Manager internally handles all
- * standard ACPI notifications -- driver modules are never sent these
- * values (see "Bus Manager Notifications", below).
- */
-typedef u32                             BM_NOTIFY;
-
-#define BM_NOTIFY_BUS_CHECK             ((BM_NOTIFY) 0x00)
-#define BM_NOTIFY_DEVICE_CHECK          ((BM_NOTIFY) 0x01)
-#define BM_NOTIFY_DEVICE_WAKE           ((BM_NOTIFY) 0x02)
-#define BM_NOTIFY_EJECT_REQUEST         ((BM_NOTIFY) 0x03)
-#define BM_NOTIFY_DEVICE_CHECK_LIGHT    ((BM_NOTIFY) 0x04)
-#define BM_NOTIFY_FREQUENCY_MISMATCH    ((BM_NOTIFY) 0x05)
-#define BM_NOTIFY_BUS_MODE_MISMATCH     ((BM_NOTIFY) 0x06)
-#define BM_NOTIFY_POWER_FAULT           ((BM_NOTIFY) 0x07)
-
-/*
- * These are a higher-level abstraction of ACPI notifications, intended
- * for consumption by driver modules to facilitate PnP.
- */
-#define BM_NOTIFY_UNKNOWN               ((BM_NOTIFY) 0x00)
-#define BM_NOTIFY_DEVICE_ADDED          ((BM_NOTIFY) 0x01)
-#define BM_NOTIFY_DEVICE_REMOVED        ((BM_NOTIFY) 0x02)
-
-
-/*
- * BM_HANDLE:
- * ----------
- */
-typedef u32                             BM_HANDLE;
-
-#define BM_HANDLE_UNKNOWN               ((BM_HANDLE) 0x00)
-#define BM_HANDLE_ROOT                  ((BM_HANDLE) 0x00)
-#define BM_HANDLES_MAX                  256
-
-
-
-/*
- * BM_HANDLE_LIST:
- * ---------------
- */
-typedef struct
-{
-       u32                             count;
-       BM_HANDLE                       handles[BM_HANDLES_MAX];
-} BM_HANDLE_LIST;
-
-
-/*
- * BM_DEVICE_TYPE:
- * ---------------
- */
-typedef u32                             BM_DEVICE_TYPE;
-
-#define BM_TYPE_UNKNOWN                        ((BM_DEVICE_TYPE) 0x00000000)
-
-#define BM_TYPE_SCOPE                  ((BM_DEVICE_TYPE) 0x00000001)
-#define BM_TYPE_PROCESSOR              ((BM_DEVICE_TYPE) 0x00000002)
-#define BM_TYPE_THERMAL_ZONE           ((BM_DEVICE_TYPE) 0x00000004)
-#define BM_TYPE_POWER_RESOURCE         ((BM_DEVICE_TYPE) 0x00000008)
-#define BM_TYPE_DEVICE                 ((BM_DEVICE_TYPE) 0x00000010)
-#define BM_TYPE_FIXED_BUTTON           ((BM_DEVICE_TYPE) 0x00000020)
-#define BM_TYPE_SYSTEM                 ((BM_DEVICE_TYPE) 0x80000000)
-#define BM_TYPE_ALL                    ((BM_DEVICE_TYPE) 0xFFFFFFFF)
-
-
-/*
- * BM_DEVICE_UID:
- * --------------
- */
-typedef char                           BM_DEVICE_UID[9];
-
-#define BM_UID_UNKNOWN                  '0'
-
-
-/*
- * BM_DEVICE_HID:
- * --------------
- */
-typedef char                           BM_DEVICE_HID[9];
-
-#define BM_HID_UNKNOWN                  '\0'
-#define BM_HID_POWER_BUTTON            "PNP0C0C"
-#define BM_HID_SLEEP_BUTTON            "PNP0C0E"
-
-/*
- * BM_DEVICE_CID:
- *     The compatibility ID can be a string with 44 characters
- *     The extra pad is in case there is a change.  It also
- *     provides 8 byte alignment for the BM_DEVICE_ID structure.
- * -------------------------------------------------------------
- */
-typedef char                           BM_DEVICE_CID[46];
-
-
-/*
- * BM_DEVICE_ADR:
- * --------------
- */
-typedef u32                            BM_DEVICE_ADR;
-
-#define BM_ADDRESS_UNKNOWN             0
-
-
-/*
- * BM_DEVICE_FLAGS:
- * ----------------
- * The encoding of BM_DEVICE_FLAGS is illustrated below.
- * Note that a set bit (1) indicates the property is TRUE
- * (e.g. if bit 0 is set then the device has dynamic status).
- * +--+------------+-+-+-+-+-+-+-+
- * |31| Bits 31:11 |6|5|4|3|2|1|0|
- * +--+------------+-+-+-+-+-+-+-+
- *   |       |      | | | | | | |
- *   |       |      | | | | | | +- Dynamic status?
- *   |       |      | | | | | +--- Identifiable?
- *   |       |      | | | | +----- Configurable?
- *   |       |      | | | +------- Power Manageable?
- *   |       |      | | +--------- Ejectable?
- *   |       |      | +----------- Docking Station?
- *   |       |      +------------- Fixed-Feature?
- *   |       +-------------------- <Reserved>
- *   +---------------------------- Driver Control?
- *
- * Dynamic status:  Device has a _STA object.
- * Identifiable:    Device has a _HID and/or _ADR and possibly other
- *                  identification objects defined.
- * Configurable:    Device has a _CRS and possibly other configuration
- *                  objects defined.
- * Power Control:   Device has a _PR0 and/or _PS0 and possibly other
- *                  power management objects defined.
- * Ejectable:       Device has an _EJD and/or _EJx and possibly other
- *                  dynamic insertion/removal objects defined.
- * Docking Station: Device has a _DCK object defined.
- * Fixed-Feature:   Device does not exist in the namespace; was
- *                  enumerated as a fixed-feature (e.g. power button).
- * Power Manageable:Can change device's power consumption behavior.
- * Has a HID:       In the BIOS ASL this device has a hardware ID as
- *                  defined in section 6.1.4 of ACPI Spec 2.0
- * Has a CID:       In the BIOS ASL this device has a compatible ID as
- *                  defined in section 6.1.2 of ACPI Spec 2.0
- * Has a ADR:       In the BIOS ASL this device has an address ID as
- *                  defined in section 6.1.1 of ACPI Spec 2.0
- * Is a bridge:     This device is recognized as a bridge to another bus.
- * Is on PCI bus:   This device is on a PCI bus or within PCI configuration
- *                  address space.
- * Is on USB bus:   This device is on or within USB address space.
- * Is on SCSI bus:  This device is on or within SCSI address space.
- * Driver Control:  A driver has been installed for this device.
- */
-typedef u32                             BM_DEVICE_FLAGS;
-
-#define BM_FLAGS_UNKNOWN                ((BM_DEVICE_FLAGS) 0x00000000)
-
-#define BM_FLAGS_DYNAMIC_STATUS         ((BM_DEVICE_FLAGS) 0x00000001)
-#define BM_FLAGS_IDENTIFIABLE           ((BM_DEVICE_FLAGS) 0x00000002)
-#define BM_FLAGS_CONFIGURABLE           ((BM_DEVICE_FLAGS) 0x00000004)
-#define BM_FLAGS_POWER_CONTROL          ((BM_DEVICE_FLAGS) 0x00000008)
-#define BM_FLAGS_EJECTABLE              ((BM_DEVICE_FLAGS) 0x00000010)
-#define BM_FLAGS_DOCKING_STATION        ((BM_DEVICE_FLAGS) 0x00000020)
-#define BM_FLAGS_FIXED_FEATURE          ((BM_DEVICE_FLAGS) 0x00000040)
-#define BM_FLAGS_IS_POWER_MANAGEABLE    ((BM_DEVICE_FLAGS) 0x00000080)
-#define BM_FLAGS_HAS_A_HID              ((BM_DEVICE_FLAGS) 0x00000100)
-#define BM_FLAGS_HAS_A_CID              ((BM_DEVICE_FLAGS) 0x00000200)
-#define BM_FLAGS_HAS_A_ADR              ((BM_DEVICE_FLAGS) 0x00000400)
-#define BM_FLAGS_IS_A_BRIDGE            ((BM_DEVICE_FLAGS) 0x00000800)
-#define BM_FLAGS_IS_ON_PCI_BUS          ((BM_DEVICE_FLAGS) 0x00001000)
-#define BM_FLAGS_IS_ON_USB_BUS          ((BM_DEVICE_FLAGS) 0x00002000)
-#define BM_FLAGS_IS_ON_SCSI_BUS         ((BM_DEVICE_FLAGS) 0x00004000)
-#define BM_FLAGS_DRIVER_CONTROL         ((BM_DEVICE_FLAGS) 0x80000000)
-
-/*
- * Device PM Flags:
- * ----------------
- * +-----------+-+-+-+-+-+-+-+
- * | Bits 31:7 |6|5|4|3|2|1|0|
- * +-----------+-+-+-+-+-+-+-+
- *       |      | | | | | | |
- *       |      | | | | | | +- D0 Support?
- *       |      | | | | | +--- D1 Support?
- *       |      | | | | +----- D2 Support?
- *       |      | | | +------- D3 Support?
- *       |      | | +--------- Power State Queriable?
- *       |      | +----------- Inrush Current?
- *       |      +------------- Wake Capable?
- *       +-------------------- <Reserved>
- *
- * D0-D3 Support:   Device supports corresponding Dx state.
- * Power State:     Device has a _PSC (current power state) object defined.
- * Inrush Current:  Device has an _IRC (inrush current) object defined.
- * Wake Capable:    Device has a _PRW (wake-capable) object defined.
- */
-#define BM_FLAGS_D0_SUPPORT            ((BM_DEVICE_FLAGS) 0x00000001)
-#define BM_FLAGS_D1_SUPPORT            ((BM_DEVICE_FLAGS) 0x00000002)
-#define BM_FLAGS_D2_SUPPORT            ((BM_DEVICE_FLAGS) 0x00000004)
-#define BM_FLAGS_D3_SUPPORT            ((BM_DEVICE_FLAGS) 0x00000008)
-#define BM_FLAGS_POWER_STATE           ((BM_DEVICE_FLAGS) 0x00000010)
-#define BM_FLAGS_INRUSH_CURRENT                ((BM_DEVICE_FLAGS) 0x00000020)
-#define BM_FLAGS_WAKE_CAPABLE          ((BM_DEVICE_FLAGS) 0x00000040)
-
-
-/*
- * BM_DEVICE_STATUS:
- * -----------------
- * The encoding of BM_DEVICE_STATUS is illustrated below.
- * Note that a set bit (1) indicates the property is TRUE
- * (e.g. if bit 0 is set then the device is present).
- * +-----------+-+-+-+-+-+
- * | Bits 31:4 |4|3|2|1|0|
- * +-----------+-+-+-+-+-+
- *       |      | | | | |
- *       |      | | | | +- Present?
- *       |      | | | +--- Enabled?
- *       |      | | +----- Show in UI?
- *       |      | +------- Functioning?
- *       |      +--------- Battery Present?
- *       +---------------- <Reserved>
- */
-typedef u32                             BM_DEVICE_STATUS;
-
-#define BM_STATUS_UNKNOWN               ((BM_DEVICE_STATUS) 0x00000000)
-#define BM_STATUS_PRESENT               ((BM_DEVICE_STATUS) 0x00000001)
-#define BM_STATUS_ENABLED               ((BM_DEVICE_STATUS) 0x00000002)
-#define BM_STATUS_SHOW_UI               ((BM_DEVICE_STATUS) 0x00000004)
-#define BM_STATUS_FUNCTIONING           ((BM_DEVICE_STATUS) 0x00000008)
-#define BM_STATUS_BATTERY_PRESENT       ((BM_DEVICE_STATUS) 0x00000010)
-#define BM_STATUS_DEFAULT               ((BM_DEVICE_STATUS) 0x0000000F)
-
-
-typedef u32                             BM_POWER_STATE;
-
-typedef u8                             BM_PCI_BUS_NUM;
-typedef u8                             BM_PCI_DEVICE_NUM;
-typedef u8                             BM_PCI_FUNCTION_NUM;
-typedef u8                             BM_U8_RESERVED;
-typedef u8                             BM_PCI_DEVICE_CLASS_ID;
-typedef u8                             BM_PCI_DEVICE_SUBCLASS_ID;
-typedef u8                             BM_PCI_DEVICE_PROG_IF;
-typedef u8                             BM_PCI_DEVICE_REVISION;
-typedef u16                            BM_PCI_VENDOR_ID;
-typedef u16                            BM_PCI_DEVICE_ID;
-typedef u32                            BM_U32_RESERVED;
-
-
-/*
- * BM_DEVICE_ID:
- *     This structure, when filled in for a device, provides
- *     an "association" between hardware space and ACPI.
- * -----------------------------------------------------------
- */
-typedef struct
-{
-       BM_DEVICE_CID                   cid;
-       BM_DEVICE_HID                   hid;
-       BM_DEVICE_UID                   uid;
-       BM_DEVICE_TYPE                  type;
-       BM_DEVICE_ADR                   adr;
-       BM_PCI_BUS_NUM                  pci_bus_num;
-       BM_PCI_DEVICE_NUM               pci_device_num;
-       BM_PCI_FUNCTION_NUM             pci_func_num;
-       BM_U8_RESERVED                  u8_reserved;
-       BM_PCI_DEVICE_CLASS_ID          pci_device_class_id;
-       BM_PCI_DEVICE_SUBCLASS_ID       pci_device_subclass_id;
-       BM_PCI_DEVICE_PROG_IF           pci_device_prog_if;
-       BM_PCI_DEVICE_REVISION          pci_device_rev_num;
-       BM_PCI_VENDOR_ID                pci_vendor_id;
-       BM_PCI_DEVICE_ID                pci_device_id;
-       BM_U32_RESERVED                 u32_reserved;
-} BM_DEVICE_ID;
-
-
-/*
- * BM_DEVICE_POWER:
- * ----------------
- * Structure containing basic device power management information.
- */
-typedef struct
-{
-       BM_DEVICE_FLAGS                 flags;
-       BM_POWER_STATE                  state;
-       BM_DEVICE_FLAGS                 dx_supported[ACPI_S_STATE_COUNT];
-} BM_DEVICE_POWER;
-
-
-/*
- * BM_DEVICE:
- * ----------
- */
-typedef struct
-{
-       BM_HANDLE                       handle;
-       ACPI_HANDLE                     acpi_handle;
-       BM_DEVICE_FLAGS                 flags;
-       BM_DEVICE_STATUS                status;
-       BM_DEVICE_ID                    id;
-       BM_DEVICE_POWER                 power;
-} BM_DEVICE;
-
-
-/*
- * BM_SEARCH:
- * ----------
- * Structure used for searching the ACPI Bus Manager's device hierarchy.
- */
-typedef struct
-{
-       BM_DEVICE_ID                    criteria;
-       BM_HANDLE_LIST                  results;
-} BM_SEARCH;
-
-
-/*
- * BM_REQUEST:
- * -----------
- * Structure used for sending requests to/through the ACPI Bus Manager.
- */
-typedef struct
-{
-       ACPI_STATUS                     status;
-       BM_COMMAND                      command;
-       BM_HANDLE                       handle;
-       ACPI_BUFFER                     buffer;
-} BM_REQUEST;
-
-
-/*
- * Driver Registration:
- * --------------------
- */
-
-/* Driver Context */
-typedef void *                         BM_DRIVER_CONTEXT;
-
-/* Notification Callback Function */
-typedef
-ACPI_STATUS (*BM_DRIVER_NOTIFY) (
-       BM_NOTIFY                       notify_type,
-       BM_HANDLE                       device_handle,
-       BM_DRIVER_CONTEXT               *context);
-
-/* Request Callback Function */
-typedef
-ACPI_STATUS (*BM_DRIVER_REQUEST) (
-       BM_REQUEST                      *request,
-       BM_DRIVER_CONTEXT               context);
-
-/* Driver Registration */
-typedef struct
-{
-       BM_DRIVER_NOTIFY                notify;
-       BM_DRIVER_REQUEST               request;
-       BM_DRIVER_CONTEXT               context;
-} BM_DRIVER;
-
-
-/*
- * BM_NODE:
- * --------
- * Structure used to maintain the device hierarchy.
- */
-typedef struct _BM_NODE
-{
-       BM_DEVICE                       device;
-       BM_DRIVER                       driver;
-       struct _BM_NODE                 *parent;
-       struct _BM_NODE                 *next;
-       struct
-       {
-               struct _BM_NODE                 *head;
-               struct _BM_NODE                 *tail;
-       }                               scope;
-} BM_NODE;
-
-
-/*
- * BM_NODE_LIST:
- * -------------
- * Structure used to maintain an array of node pointers.
- */
-typedef struct
-{
-       u32                             count;
-       BM_NODE                         *nodes[BM_HANDLES_MAX];
-} BM_NODE_LIST;
-
-
-/*****************************************************************************
- *                                  Macros
- *****************************************************************************/
-
-#define BM_DEVICE_PRESENT(d)           (d->status & BM_STATUS_PRESENT)
-#define BM_NODE_PRESENT(n)             (n->device.status & BM_STATUS_PRESENT)
-
-
-/*****************************************************************************
- *                             Function Prototypes
- *****************************************************************************/
-
-/* bm.c */
-
-ACPI_STATUS
-bm_initialize (void);
-
-ACPI_STATUS
-bm_terminate (void);
-
-ACPI_STATUS
-bm_get_status (
-       BM_DEVICE               *device);
-
-ACPI_STATUS
-bm_get_handle (
-       ACPI_HANDLE             acpi_handle,
-       BM_HANDLE               *device_handle);
-
-ACPI_STATUS
-bm_get_node (
-       BM_HANDLE               device_handle,
-       ACPI_HANDLE             acpi_handle,
-       BM_NODE                 **node);
-
-/* bmsearch.c */
-
-ACPI_STATUS
-bm_search(
-       BM_HANDLE               device_handle,
-       BM_DEVICE_ID            *criteria,
-       BM_HANDLE_LIST          *results);
-
-/* bmnotify.c */
-
-void
-bm_notify (
-       ACPI_HANDLE             acpi_handle,
-       u32                     notify_value,
-       void                    *context);
-
-/* bm_request.c */
-
-ACPI_STATUS
-bm_request (
-       BM_REQUEST              *request_info);
-
-/* bmxface.c */
-
-ACPI_STATUS
-bm_get_device_status (
-       BM_HANDLE               device_handle,
-       BM_DEVICE_STATUS        *device_status);
-
-ACPI_STATUS
-bm_get_device_info (
-       BM_HANDLE               device_handle,
-       BM_DEVICE               **device_info);
-
-ACPI_STATUS
-bm_get_device_context (
-       BM_HANDLE               device_handle,
-       BM_DRIVER_CONTEXT       *context);
-
-ACPI_STATUS
-bm_register_driver (
-       BM_DEVICE_ID            *criteria,
-       BM_DRIVER               *driver);
-
-ACPI_STATUS
-bm_unregister_driver (
-       BM_DEVICE_ID            *criteria,
-       BM_DRIVER               *driver);
-
-/* bmpm.c */
-
-ACPI_STATUS
-bm_get_pm_capabilities (
-       BM_NODE                 *node);
-
-ACPI_STATUS
-bm_get_power_state (
-       BM_NODE                 *node);
-
-ACPI_STATUS
-bm_set_power_state (
-       BM_NODE                 *node,
-       BM_POWER_STATE          target_state);
-
-/* bmpower.c */
-
-ACPI_STATUS
-bm_pr_initialize (void);
-
-ACPI_STATUS
-bm_pr_terminate (void);
-
-/* bmutils.c */
-
-ACPI_STATUS
-bm_cast_buffer (
-       ACPI_BUFFER             *buffer,
-       void                    **pointer,
-       u32                     length);
-
-ACPI_STATUS
-bm_copy_to_buffer (
-       ACPI_BUFFER             *buffer,
-       void                    *data,
-       u32                     length);
-
-ACPI_STATUS
-bm_extract_package_data (
-       ACPI_OBJECT             *package,
-       ACPI_BUFFER             *format,
-       ACPI_BUFFER             *buffer);
-
-ACPI_STATUS
-bm_evaluate_object (
-       ACPI_HANDLE             acpi_handle,
-       ACPI_STRING             pathname,
-       ACPI_OBJECT_LIST        *arguments,
-       ACPI_BUFFER             *buffer);
-
-ACPI_STATUS
-bm_evaluate_simple_integer (
-       ACPI_HANDLE             acpi_handle,
-       ACPI_STRING             pathname,
-       u32                     *data);
-
-ACPI_STATUS
-bm_evaluate_reference_list (
-       ACPI_HANDLE             acpi_handle,
-       ACPI_STRING             pathname,
-       BM_HANDLE_LIST          *reference_list);
-
-/* bm_proc.c */
-
-ACPI_STATUS
-bm_proc_initialize (void);
-
-ACPI_STATUS
-bm_proc_terminate (void);
-
-ACPI_STATUS
-bm_generate_event (
-       BM_HANDLE               device_handle,
-       char                    *device_type,
-       char                    *device_instance,
-       u32                     event_type,
-       u32                     event_data);
-
-
-#endif  /* __BM_H__ */
diff --git a/reactos/drivers/bus/acpi/ospm/include/bmpower.h b/reactos/drivers/bus/acpi/ospm/include/bmpower.h
deleted file mode 100644 (file)
index 2fcbedf..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************************
- *
- * Module name: bmpower.h
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __BMPOWER_H__
-#define __BMPOWER_H__
-
-#include "bm.h"
-
-
-/*****************************************************************************
- *                               Types & Defines
- *****************************************************************************/
-
-
-/*
- * BM_POWER_RESOURCE:
- * ------------------
- */
-typedef struct
-{
-       BM_HANDLE           device_handle;
-       ACPI_HANDLE         acpi_handle;
-       BM_POWER_STATE      system_level;
-       u32                 resource_order;
-       BM_POWER_STATE      state;
-       u32                 reference_count;
-} BM_POWER_RESOURCE;
-
-
-/*****************************************************************************
- *                             Function Prototypes
- *****************************************************************************/
-
-/* bmpower.c */
-
-ACPI_STATUS
-bm_pr_initialize (void);
-
-ACPI_STATUS
-bm_pr_terminate (void);
-
-ACPI_STATUS
-bm_pr_list_get_state (
-       BM_HANDLE_LIST          *resource_list,
-       BM_POWER_STATE          *power_state);
-
-ACPI_STATUS
-bm_pr_list_transition (
-       BM_HANDLE_LIST          *current_list,
-       BM_HANDLE_LIST          *target_list);
-
-
-#endif  /* __BMPOWER_H__ */
diff --git a/reactos/drivers/bus/acpi/ospm/include/bn.h b/reactos/drivers/bus/acpi/ospm/include/bn.h
deleted file mode 100644 (file)
index 94f0e8b..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/******************************************************************************
- *
- * Module Name: bn.h
- *   $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#ifndef __BN_H__
-#define __BN_H__
-
-#include <actypes.h>
-#include <acexcep.h>
-#include <bm.h>
-
-
-/*****************************************************************************
- *                            Types & Other Defines
- *****************************************************************************/
-
-/*
- * Notifications:
- * ---------------------
- */
-#define BN_NOTIFY_STATUS_CHANGE                ((BM_NOTIFY) 0x80)
-
-/*
- * Types:
- * ------
- */
-#define BN_TYPE_POWER_BUTTON           (0x01)
-#define BN_TYPE_POWER_BUTTON_FIXED     (0x02)
-#define BN_TYPE_SLEEP_BUTTON           (0x03)
-#define BN_TYPE_SLEEP_BUTTON_FIXED     (0x04)
-#define BN_TYPE_LID_SWITCH             (0x05)
-
-/*
- * Hardware IDs:
- * -------------
- * TODO: Power and Sleep button HIDs also exist in <bm.h>.  Should all
- *       HIDs (ACPI well-known devices) exist in one place (e.g.
- *       acpi_hid.h)?
- */
-#define BN_HID_POWER_BUTTON            "PNP0C0C"
-#define BN_HID_SLEEP_BUTTON            "PNP0C0E"
-#define BN_HID_LID_SWITCH              "PNP0C0D"
-
-/*
- * /proc Entries:
- * --------------
- */
-#define BN_PROC_ROOT                   "button"
-#define BN_PROC_POWER_BUTTON           "power"
-#define BN_PROC_SLEEP_BUTTON           "sleep"
-#define BN_PROC_LID_SWITCH             "lid"
-
-/*
- * Device Context:
- * ---------------
- */
-typedef struct
-{
-       BM_HANDLE               device_handle;
-       ACPI_HANDLE             acpi_handle;
-       u32                     type;
-} BN_CONTEXT;
-
-
-/******************************************************************************
- *                              Function Prototypes
- *****************************************************************************/
-
-ACPI_STATUS
-bn_initialize (void);
-
-ACPI_STATUS
-bn_terminate (void);
-
-ACPI_STATUS
-bn_notify_fixed (
-       void                    *context);
-
-ACPI_STATUS
-bn_notify (
-       u32                     notify_type,
-       u32                     device,
-       void                    **context);
-
-ACPI_STATUS
-bn_request(
-       BM_REQUEST              *request_info,
-       void                    *context);
-
-
-#endif /* __BN_H__ */
diff --git a/reactos/drivers/bus/acpi/ospm/osl.c b/reactos/drivers/bus/acpi/ospm/osl.c
deleted file mode 100644 (file)
index 7c0731a..0000000
+++ /dev/null
@@ -1,706 +0,0 @@
-/*******************************************************************************
-*                                                                              *
-* ACPI Component Architecture Operating System Layer (OSL) for ReactOS         *
-*                                                                              *
-*******************************************************************************/
-
-/*
- *  Copyright (C) 2000 Andrew Henroid
- *  Copyright (C) 2001 Andrew Grover
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#include <acpi.h>
-
-#define NDEBUG
-#include <debug.h>
-
-static PKINTERRUPT AcpiInterrupt;
-static BOOLEAN AcpiInterruptHandlerRegistered = FALSE;
-static OSD_HANDLER AcpiIrqHandler = NULL;
-static PVOID AcpiIrqContext = NULL;
-static ULONG AcpiIrqNumber = 0;
-static KDPC AcpiDpc;
-static PVOID IVTVirtualAddress = NULL;
-
-
-VOID NTAPI
-OslDpcStub(
-  IN PKDPC Dpc,
-  IN PVOID DeferredContext,
-  IN PVOID SystemArgument1,
-  IN PVOID SystemArgument2)
-{
-  OSD_EXECUTION_CALLBACK Routine = (OSD_EXECUTION_CALLBACK)SystemArgument1;
-
-  DPRINT("OslDpcStub()\n");
-
-  DPRINT("Calling [%p]([%p])\n", Routine, SystemArgument2);
-
-  (*Routine)(SystemArgument2);
-}
-
-
-ACPI_STATUS
-acpi_os_remove_interrupt_handler(
-  u32 irq,
-  OSD_HANDLER handler);
-
-
-ACPI_STATUS
-acpi_os_initialize(void)
-{
-  DPRINT("acpi_os_initialize()\n");
-
-  KeInitializeDpc(&AcpiDpc, OslDpcStub, NULL);
-
-       return AE_OK;
-}
-
-ACPI_STATUS
-acpi_os_terminate(void)
-{
-  DPRINT("acpi_os_terminate()\n");
-
-  if (AcpiInterruptHandlerRegistered) {
-    acpi_os_remove_interrupt_handler(AcpiIrqNumber, AcpiIrqHandler);
-  }
-
-  return AE_OK;
-}
-
-s32
-acpi_os_printf(const NATIVE_CHAR *fmt,...)
-{
-       LONG Size;
-       va_list args;
-       va_start(args, fmt);
-       Size = acpi_os_vprintf(fmt, args);
-       va_end(args);
-       return Size;
-}
-
-s32
-acpi_os_vprintf(const NATIVE_CHAR *fmt, va_list args)
-{
-       static char Buffer[512];
-  LONG Size = vsprintf(Buffer, fmt, args);
-
-       DPRINT("%s", Buffer);
-       return Size;
-}
-
-void *
-acpi_os_allocate(u32 size)
-{
-  return ExAllocatePool(NonPagedPool, size);
-}
-
-void *
-acpi_os_callocate(u32 size)
-{
-  PVOID ptr = ExAllocatePool(NonPagedPool, size);
-  if (ptr)
-    memset(ptr, 0, size);
-  return ptr;
-}
-
-void
-acpi_os_free(void *ptr)
-{
-  if (ptr) {
-    /* FIXME: There is at least one bug somewhere that
-              results in an attempt to release a null pointer */
-    ExFreePool(ptr);
-  }
-}
-
-ACPI_STATUS
-acpi_os_map_memory(ACPI_PHYSICAL_ADDRESS phys, u32 size, void **virt)
-{
-  PHYSICAL_ADDRESS Address;
-  PVOID Virtual;
-
-  DPRINT("acpi_os_map_memory(phys 0x%X  size 0x%X)\n", (ULONG)phys, size);
-
-  if (phys == 0x0) {
-    /* Real mode Interrupt Vector Table */
-    Virtual = ExAllocatePool(NonPagedPool, size);
-      IVTVirtualAddress = Virtual;
-      *virt = Virtual;
-      return AE_OK;
-  }
-
-  Address.QuadPart = (ULONG)phys;
-  *virt = MmMapIoSpace(Address, size, MmNonCached);
-  if (!*virt)
-    return AE_ERROR;
-
-  return AE_OK;
-}
-
-void
-acpi_os_unmap_memory(void *virt, u32 size)
-{
-  DPRINT("acpi_os_unmap_memory()\n");
-
-  if (virt == IVTVirtualAddress) {
-    /* Real mode Interrupt Vector Table */
-    ExFreePool(IVTVirtualAddress);
-    IVTVirtualAddress = NULL;
-    return;
-  }
-  MmUnmapIoSpace(virt, size);
-}
-
-ACPI_STATUS
-acpi_os_get_physical_address(void *virt, ACPI_PHYSICAL_ADDRESS *phys)
-{
-  PHYSICAL_ADDRESS Address;
-
-  DPRINT("acpi_os_get_physical_address()\n");
-
-  if (!phys || !virt)
-    return AE_BAD_PARAMETER;
-
-  Address = MmGetPhysicalAddress(virt);
-
-  *phys = (ULONG)Address.QuadPart;
-
-  return AE_OK;
-}
-
-BOOLEAN NTAPI
-OslIsrStub(
-  PKINTERRUPT Interrupt,
-  PVOID ServiceContext)
-{
-  INT32 Status;
-
-  Status = (*AcpiIrqHandler)(AcpiIrqContext);
-
-  if (Status == INTERRUPT_HANDLED)
-    return TRUE;
-  else
-    return FALSE;
-}
-
-ACPI_STATUS
-acpi_os_install_interrupt_handler(u32 irq, OSD_HANDLER handler, void *context)
-{
-  ULONG Vector;
-  KIRQL DIrql;
-  KAFFINITY Affinity;
-  NTSTATUS Status;
-
-  DPRINT("acpi_os_install_interrupt_handler()\n");
-
-  Vector = HalGetInterruptVector(
-    Internal,
-    0,
-    irq,
-    0,
-    &DIrql,
-    &Affinity);
-
-  AcpiIrqNumber = irq;
-  AcpiIrqHandler = handler;
-  AcpiIrqContext = context;
-  AcpiInterruptHandlerRegistered = TRUE;
-
-  Status = IoConnectInterrupt(
-    &AcpiInterrupt,
-    OslIsrStub,
-    NULL,
-    NULL,
-    Vector,
-    DIrql,
-    DIrql,
-    LevelSensitive, /* FIXME: LevelSensitive or Latched? */
-    TRUE,
-    Affinity,
-    FALSE);
-  if (!NT_SUCCESS(Status)) {
-    DPRINT("Could not connect to interrupt %d\n", Vector);
-    return AE_ERROR;
-  }
-
-       return AE_OK;
-}
-
-ACPI_STATUS
-acpi_os_remove_interrupt_handler(u32 irq, OSD_HANDLER handler)
-{
-  DPRINT("acpi_os_remove_interrupt_handler()\n");
-
-  if (AcpiInterruptHandlerRegistered) {
-    IoDisconnectInterrupt(AcpiInterrupt);
-    AcpiInterrupt = NULL;
-    AcpiInterruptHandlerRegistered = FALSE;
-  }
-
-  return AE_OK;
-}
-
-void
-acpi_os_sleep(u32 sec, u32 ms)
-{
-  /* FIXME: Wait */
-}
-
-void
-acpi_os_sleep_usec(u32 us)
-{
-  KeStallExecutionProcessor(us);
-}
-
-u8
-acpi_os_in8(ACPI_IO_ADDRESS port)
-{
-  return READ_PORT_UCHAR((PUCHAR)port);
-}
-
-u16
-acpi_os_in16(ACPI_IO_ADDRESS port)
-{
-  return READ_PORT_USHORT((PUSHORT)port);
-}
-
-u32
-acpi_os_in32(ACPI_IO_ADDRESS port)
-{
-  return READ_PORT_ULONG((PULONG)port);
-}
-
-void
-acpi_os_out8(ACPI_IO_ADDRESS port, u8 val)
-{
-  WRITE_PORT_UCHAR((PUCHAR)port, val);
-}
-
-void
-acpi_os_out16(ACPI_IO_ADDRESS port, u16 val)
-{
-  WRITE_PORT_USHORT((PUSHORT)port, val);
-}
-
-void
-acpi_os_out32(ACPI_IO_ADDRESS port, u32 val)
-{
-  WRITE_PORT_ULONG((PULONG)port, val);
-}
-
-u8
-acpi_os_mem_in8 (ACPI_PHYSICAL_ADDRESS phys_addr)
-{
-  return (*(PUCHAR)(ULONG_PTR)phys_addr);
-}
-
-u16
-acpi_os_mem_in16 (ACPI_PHYSICAL_ADDRESS phys_addr)
-{
-  return (*(PUSHORT)(ULONG_PTR)phys_addr);
-}
-
-u32
-acpi_os_mem_in32 (ACPI_PHYSICAL_ADDRESS phys_addr)
-{
-  return (*(PULONG)(ULONG_PTR)phys_addr);
-}
-
-void
-acpi_os_mem_out8 (ACPI_PHYSICAL_ADDRESS phys_addr, u8 value)
-{
-  *(PUCHAR)(ULONG_PTR)phys_addr = value;
-}
-
-void
-acpi_os_mem_out16 (ACPI_PHYSICAL_ADDRESS phys_addr, u16 value)
-{
-  *(PUSHORT)(ULONG_PTR)phys_addr = value;
-}
-
-void
-acpi_os_mem_out32 (ACPI_PHYSICAL_ADDRESS phys_addr, u32 value)
-{
-  *(PULONG)(ULONG_PTR)phys_addr = value;
-}
-
-ACPI_STATUS
-acpi_os_read_pci_cfg_byte(
-       u32 bus,
-       u32 func,
-       u32 addr,
-       u8 * val)
-{
-  NTSTATUS ret;
-  PCI_SLOT_NUMBER slot;
-
-  if (func == 0)
-    return AE_ERROR;
-
-  slot.u.AsULONG = 0;
-  slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF;
-  slot.u.bits.FunctionNumber = func & 0xFFFF;
-
-  DPRINT("acpi_os_read_pci_cfg_byte, slot=0x%X, func=0x%X\n", slot.u.AsULONG, func);
-  ret = HalGetBusDataByOffset(PCIConfiguration,
-           bus,
-           slot.u.AsULONG,
-           val,
-           addr,
-           sizeof(UCHAR));
-
-  if (NT_SUCCESS(ret))
-    return AE_OK;
-  else
-    return AE_ERROR;
-}
-
-ACPI_STATUS
-acpi_os_read_pci_cfg_word(
-       u32 bus,
-       u32 func,
-       u32 addr,
-       u16 * val)
-{
-  NTSTATUS ret;
-  PCI_SLOT_NUMBER slot;
-
-  if (func == 0)
-    return AE_ERROR;
-
-  slot.u.AsULONG = 0;
-  slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF;
-  slot.u.bits.FunctionNumber = func & 0xFFFF;
-
-  DPRINT("acpi_os_read_pci_cfg_word, slot=0x%x\n", slot.u.AsULONG);
-  ret = HalGetBusDataByOffset(PCIConfiguration,
-           bus,
-           slot.u.AsULONG,
-           val,
-           addr,
-           sizeof(USHORT));
-
-  if (NT_SUCCESS(ret))
-    return AE_OK;
-  else
-       return AE_ERROR;
-}
-
-ACPI_STATUS
-acpi_os_read_pci_cfg_dword(
-       u32 bus,
-       u32 func,
-       u32 addr,
-       u32 * val)
-{
-  NTSTATUS ret;
-  PCI_SLOT_NUMBER slot;
-
-  if (func == 0)
-    return AE_ERROR;
-
-  slot.u.AsULONG = 0;
-  slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF;
-  slot.u.bits.FunctionNumber = func & 0xFFFF;
-
-  DPRINT("acpi_os_read_pci_cfg_dword, slot=0x%x\n", slot.u.AsULONG);
-  ret = HalGetBusDataByOffset(PCIConfiguration,
-           bus,
-           slot.u.AsULONG,
-           val,
-           addr,
-           sizeof(ULONG));
-
-  if (NT_SUCCESS(ret))
-    return AE_OK;
-  else
-       return AE_ERROR;
-}
-
-ACPI_STATUS
-acpi_os_write_pci_cfg_byte(
-       u32 bus,
-       u32 func,
-       u32 addr,
-       u8 val)
-{
-  NTSTATUS ret;
-  UCHAR buf = val;
-  PCI_SLOT_NUMBER slot;
-
-  if (func == 0)
-    return AE_ERROR;
-
-  slot.u.AsULONG = 0;
-  slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF;
-  slot.u.bits.FunctionNumber = func & 0xFFFF;
-
-  DPRINT("acpi_os_write_pci_cfg_byte, slot=0x%x\n", slot.u.AsULONG);
-  ret = HalSetBusDataByOffset(PCIConfiguration,
-           bus,
-           slot.u.AsULONG,
-           &buf,
-           addr,
-           sizeof(UCHAR));
-
-  if (NT_SUCCESS(ret))
-    return AE_OK;
-  else
-       return AE_ERROR;
-}
-
-ACPI_STATUS
-acpi_os_write_pci_cfg_word(
-       u32 bus,
-       u32 func,
-       u32 addr,
-       u16 val)
-{
-  NTSTATUS ret;
-  USHORT buf = val;
-  PCI_SLOT_NUMBER slot;
-
-  if (func == 0)
-    return AE_ERROR;
-
-  slot.u.AsULONG = 0;
-  slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF;
-  slot.u.bits.FunctionNumber = func & 0xFFFF;
-
-  DPRINT("acpi_os_write_pci_cfg_byte, slot=0x%x\n", slot.u.AsULONG);
-  ret = HalSetBusDataByOffset(PCIConfiguration,
-           bus,
-           slot.u.AsULONG,
-           &buf,
-           addr,
-           sizeof(USHORT));
-
-  if (NT_SUCCESS(ret))
-    return AE_OK;
-  else
-       return AE_ERROR;
-}
-
-ACPI_STATUS
-acpi_os_write_pci_cfg_dword(
-       u32 bus,
-       u32 func,
-       u32 addr,
-       u32 val)
-{
-  NTSTATUS ret;
-  ULONG buf = val;
-  PCI_SLOT_NUMBER slot;
-
-  if (func == 0)
-    return AE_ERROR;
-
-  slot.u.AsULONG = 0;
-  slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF;
-  slot.u.bits.FunctionNumber = func & 0xFFFF;
-
-  DPRINT("acpi_os_write_pci_cfg_byte, slot=0x%x\n", slot.u.AsULONG);
-  ret = HalSetBusDataByOffset(PCIConfiguration,
-           bus,
-           slot.u.AsULONG,
-           &buf,
-           addr,
-           sizeof(ULONG));
-
-  if (NT_SUCCESS(ret))
-    return AE_OK;
-  else
-       return AE_ERROR;
-}
-
-ACPI_STATUS
-acpi_os_load_module (
-       char *module_name)
-{
-  DPRINT("acpi_os_load_module()\n");
-
-  if (!module_name)
-    return AE_BAD_PARAMETER;
-
-  return AE_OK;
-}
-
-ACPI_STATUS
-acpi_os_unload_module (
-       char *module_name)
-{
-  DPRINT("acpi_os_unload_module()\n");
-
-  if (!module_name)
-    return AE_BAD_PARAMETER;
-
-  return AE_OK;
-}
-
-ACPI_STATUS
-acpi_os_queue_for_execution(
-       u32                     priority,
-       OSD_EXECUTION_CALLBACK  function,
-       void                    *context)
-{
-  ACPI_STATUS Status = AE_OK;
-
-  DPRINT("acpi_os_queue_for_execution()\n");
-
-  if (!function)
-    return AE_BAD_PARAMETER;
-
-  DPRINT("Scheduling task [%p](%p) for execution.\n", function, context);
-
-#if 0
-  switch (priority) {
-  case OSD_PRIORITY_MED:
-    KeSetImportanceDpc(&AcpiDpc, MediumImportance);
-  case OSD_PRIORITY_LO:
-    KeSetImportanceDpc(&AcpiDpc, LowImportance);
-  case OSD_PRIORITY_HIGH:
-  default:
-    KeSetImportanceDpc(&AcpiDpc, HighImportance);
-  }
-#endif
-
-  KeInsertQueueDpc(&AcpiDpc, (PVOID)function, (PVOID)context);
-
-  return Status;
-}
-
-ACPI_STATUS
-acpi_os_create_semaphore(
-       u32             max_units,
-       u32             initial_units,
-       ACPI_HANDLE     *handle)
-{
-  PFAST_MUTEX Mutex;
-
-  Mutex = ExAllocatePool(NonPagedPool, sizeof(FAST_MUTEX));
-  if (!Mutex)
-    return AE_NO_MEMORY;
-
-  DPRINT("acpi_os_create_semaphore() at 0x%X\n", Mutex);
-
-  ExInitializeFastMutex(Mutex);
-
-  *handle = Mutex;
-  return AE_OK;
-}
-
-ACPI_STATUS
-acpi_os_delete_semaphore(
-       ACPI_HANDLE handle)
-{
-  PFAST_MUTEX Mutex = (PFAST_MUTEX)handle;
-
-  DPRINT("acpi_os_delete_semaphore(handle 0x%X)\n", handle);
-
-  if (!Mutex)
-    return AE_BAD_PARAMETER;
-
-  ExFreePool(Mutex);
-
-  return AE_OK;
-}
-
-ACPI_STATUS
-acpi_os_wait_semaphore(
-       ACPI_HANDLE     handle,
-       u32                     units,
-       u32                     timeout)
-{
-  PFAST_MUTEX Mutex = (PFAST_MUTEX)handle;
-
-  if (!Mutex || (units < 1)) {
-    DPRINT("acpi_os_wait_semaphore(handle 0x%X, units %d) Bad parameters\n",
-      handle, units);
-    return AE_BAD_PARAMETER;
-  }
-
-  DPRINT("Waiting for semaphore[%p|%d|%d]\n", handle, units, timeout);
-
-  ExAcquireFastMutex(Mutex);
-
-  return AE_OK;
-}
-
-ACPI_STATUS
-acpi_os_signal_semaphore(
-    ACPI_HANDLE             handle,
-    u32                     units)
-{
-  PFAST_MUTEX Mutex = (PFAST_MUTEX)handle;
-
-  if (!Mutex || (units < 1)) {
-    DPRINT("acpi_os_signal_semaphore(handle 0x%X) Bad parameter\n", handle);
-    return AE_BAD_PARAMETER;
-  }
-
-  DPRINT("Signaling semaphore[%p|%d]\n", handle, units);
-
-  ExReleaseFastMutex(Mutex);
-
-  return AE_OK;
-}
-
-ACPI_STATUS
-acpi_os_breakpoint(NATIVE_CHAR *msg)
-{
-       DPRINT1("BREAKPOINT: %s", msg);
-       return AE_OK;
-}
-
-void
-acpi_os_dbg_trap(char *msg)
-
-{
-  DPRINT1("TRAP: %s", msg);
-}
-
-void
-acpi_os_dbg_assert(void *failure, void *file, u32 line, NATIVE_CHAR *msg)
-{
-  DPRINT1("ASSERT: %s\n", msg);
-}
-
-u32
-acpi_os_get_line(NATIVE_CHAR *buffer)
-{
-       return 0;
-}
-
-u8
-acpi_os_readable(void *ptr, u32 len)
-{
-  /* Always readable */
-       return TRUE;
-}
-
-u8
-acpi_os_writable(void *ptr, u32 len)
-{
-  /* Always writable */
-       return TRUE;
-}
-
-u32
-acpi_os_get_thread_id (void)
-{
-  return (ULONG_PTR)PsGetCurrentThreadId() + 1;
-}
diff --git a/reactos/drivers/bus/acpi/ospm/pdo.c b/reactos/drivers/bus/acpi/ospm/pdo.c
deleted file mode 100644 (file)
index 9834ee0..0000000
+++ /dev/null
@@ -1,385 +0,0 @@
-/* $Id$
- *
- * PROJECT:         ReactOS ACPI bus driver
- * FILE:            acpi/ospm/pdo.c
- * PURPOSE:         Child device object dispatch routines
- * PROGRAMMERS:     Casper S. Hornstrup (chorns@users.sourceforge.net)
- * UPDATE HISTORY:
- *      08-08-2001  CSH  Created
- */
-#include <acpi.h>
-
-#define NDEBUG
-#include <debug.h>
-
-/*** PRIVATE *****************************************************************/
-
-static NTSTATUS
-AcpiDuplicateUnicodeString(
-  PUNICODE_STRING Destination,
-  PUNICODE_STRING Source,
-  POOL_TYPE PoolType)
-{
-  if (Source == NULL)
-  {
-    RtlInitUnicodeString(Destination, NULL);
-    return STATUS_SUCCESS;
-  }
-
-  Destination->Buffer = ExAllocatePool(PoolType, Source->MaximumLength);
-  if (Destination->Buffer == NULL)
-  {
-    return STATUS_INSUFFICIENT_RESOURCES;
-  }
-
-  Destination->MaximumLength = Source->MaximumLength;
-  Destination->Length = Source->Length;
-  RtlCopyMemory(Destination->Buffer, Source->Buffer, Source->MaximumLength);
-
-  return STATUS_SUCCESS;
-}
-
-
-static NTSTATUS
-PdoQueryDeviceText(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp,
-  PIO_STACK_LOCATION IrpSp)
-{
-  PPDO_DEVICE_EXTENSION DeviceExtension;
-  PWSTR Buffer;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  Status = STATUS_SUCCESS;
-
-  switch (IrpSp->Parameters.QueryDeviceText.DeviceTextType)
-  {
-    case DeviceTextDescription:
-      DPRINT("DeviceTextDescription\n");
-      Buffer = (PWSTR)ExAllocatePool(PagedPool, DeviceExtension->DeviceDescription.Length + sizeof(UNICODE_NULL));
-      if (Buffer == NULL)
-          Status = STATUS_INSUFFICIENT_RESOURCES;
-      else
-      {
-          RtlCopyMemory(Buffer, DeviceExtension->DeviceDescription.Buffer, DeviceExtension->DeviceDescription.Length);
-          Buffer[DeviceExtension->DeviceDescription.Length / sizeof(WCHAR)] = UNICODE_NULL;
-          Irp->IoStatus.Information = (ULONG_PTR)Buffer;
-      }
-      break;
-
-    default:
-      Irp->IoStatus.Information = 0;
-      Status = STATUS_INVALID_PARAMETER;
-  }
-
-  return Status;
-}
-
-
-static NTSTATUS
-PdoQueryId(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp,
-  PIO_STACK_LOCATION IrpSp)
-{
-  PPDO_DEVICE_EXTENSION DeviceExtension;
-  UNICODE_STRING String;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  RtlInitUnicodeString(&String, NULL);
-
-//  Irp->IoStatus.Information = 0;
-
-  switch (IrpSp->Parameters.QueryId.IdType)
-  {
-    case BusQueryDeviceID:
-      DPRINT("BusQueryDeviceID\n");
-      Status = AcpiDuplicateUnicodeString(&String,
-                                          &DeviceExtension->DeviceID,
-                                          PagedPool);
-      DPRINT("DeviceID: %S\n", String.Buffer);
-      Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
-      break;
-
-    case BusQueryHardwareIDs:
-      DPRINT("BusQueryHardwareIDs\n");
-      Status = AcpiDuplicateUnicodeString(&String,
-                                          &DeviceExtension->HardwareIDs,
-                                          PagedPool);
-      Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
-      break;
-
-    case BusQueryCompatibleIDs:
-      DPRINT("BusQueryCompatibleIDs\n");
-      Status = STATUS_NOT_IMPLEMENTED;
-      break;
-
-    case BusQueryInstanceID:
-      DPRINT("BusQueryInstanceID\n");
-      Status = AcpiDuplicateUnicodeString(&String,
-                                          &DeviceExtension->InstanceID,
-                                          PagedPool);
-      DPRINT("InstanceID: %S\n", String.Buffer);
-      Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
-      break;
-
-    case BusQueryDeviceSerialNumber:
-      DPRINT("BusQueryDeviceSerialNumber\n");
-      Status = STATUS_NOT_IMPLEMENTED;
-      break;
-
-    default:
-      DPRINT("Unknown id type: %lx\n", IrpSp->Parameters.QueryId.IdType);
-      Status = STATUS_NOT_IMPLEMENTED;
-  }
-
-  return Status;
-}
-
-
-static NTSTATUS
-PdoQueryResourceRequirements(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp,
-  PIO_STACK_LOCATION IrpSp)
-{
-  PPDO_DEVICE_EXTENSION DeviceExtension;
-  PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList;
-
-  DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  if (DeviceExtension->ResourceRequirementsListSize == 0)
-  {
-    return Irp->IoStatus.Status;
-  }
-
-  ResourceRequirementsList = ExAllocatePool(PagedPool, DeviceExtension->ResourceRequirementsListSize);
-  if (!ResourceRequirementsList)
-  {
-    Irp->IoStatus.Information = 0;
-    return STATUS_INSUFFICIENT_RESOURCES;
-  }
-
-  RtlCopyMemory(ResourceRequirementsList, DeviceExtension->ResourceRequirementsList, DeviceExtension->ResourceRequirementsListSize);
-  Irp->IoStatus.Information = (ULONG_PTR)ResourceRequirementsList;
-  return STATUS_SUCCESS;
-}
-
-
-static NTSTATUS
-PdoQueryResources(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp,
-  PIO_STACK_LOCATION IrpSp)
-{
-  PPDO_DEVICE_EXTENSION DeviceExtension;
-  PCM_RESOURCE_LIST ResourceList;
-
-  DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  if (DeviceExtension->ResourceListSize == 0)
-  {
-    return Irp->IoStatus.Status;
-  }
-
-  ResourceList = ExAllocatePool(PagedPool, DeviceExtension->ResourceListSize);
-  if (!ResourceList)
-  {
-    Irp->IoStatus.Information = 0;
-    return STATUS_INSUFFICIENT_RESOURCES;
-  }
-
-  RtlCopyMemory(ResourceList, DeviceExtension->ResourceList, DeviceExtension->ResourceListSize);
-  Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
-  return STATUS_SUCCESS;
-}
-
-
-static NTSTATUS
-PdoSetPower(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN PIRP Irp,
-  PIO_STACK_LOCATION IrpSp)
-{
-  PPDO_DEVICE_EXTENSION DeviceExtension;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-  if (IrpSp->Parameters.Power.Type == DevicePowerState) {
-    Status = STATUS_SUCCESS;
-    switch (IrpSp->Parameters.Power.State.SystemState) {
-    default:
-      Status = STATUS_UNSUCCESSFUL;
-    }
-  } else {
-    Status = STATUS_UNSUCCESSFUL;
-  }
-
-  return Status;
-}
-
-
-/*** PUBLIC ******************************************************************/
-
-NTSTATUS
-NTAPI
-PdoPnpControl(
-  PDEVICE_OBJECT DeviceObject,
-  PIRP Irp)
-/*
- * FUNCTION: Handle Plug and Play IRPs for the child device
- * ARGUMENTS:
- *     DeviceObject = Pointer to physical device object of the child device
- *     Irp          = Pointer to IRP that should be handled
- * RETURNS:
- *     Status
- */
-{
-  PIO_STACK_LOCATION IrpSp;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  Status = Irp->IoStatus.Status;
-
-  IrpSp = IoGetCurrentIrpStackLocation(Irp);
-
-  switch (IrpSp->MinorFunction) {
-  case IRP_MN_CANCEL_REMOVE_DEVICE:
-    break;
-
-  case IRP_MN_CANCEL_STOP_DEVICE:
-    break;
-
-  case IRP_MN_DEVICE_USAGE_NOTIFICATION:
-    break;
-
-  case IRP_MN_EJECT:
-    break;
-
-  case IRP_MN_QUERY_BUS_INFORMATION:
-    break;
-
-  case IRP_MN_QUERY_CAPABILITIES:
-    break;
-
-  case IRP_MN_QUERY_DEVICE_RELATIONS:
-    /* FIXME: Possibly handle for RemovalRelations */
-    break;
-
-  case IRP_MN_QUERY_DEVICE_TEXT:
-    Status = PdoQueryDeviceText(DeviceObject, Irp, IrpSp);
-    break;
-
-  case IRP_MN_QUERY_ID:
-    Status = PdoQueryId(DeviceObject,
-                        Irp,
-                        IrpSp);
-    break;
-
-  case IRP_MN_QUERY_PNP_DEVICE_STATE:
-    break;
-
-  case IRP_MN_QUERY_REMOVE_DEVICE:
-    break;
-
-  case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
-    Status = PdoQueryResourceRequirements(DeviceObject,
-                                          Irp,
-                                          IrpSp);
-    break;
-
-  case IRP_MN_QUERY_RESOURCES:
-    Status = PdoQueryResources(DeviceObject,
-                               Irp,
-                               IrpSp);
-    break;
-
-  case IRP_MN_QUERY_STOP_DEVICE:
-    break;
-
-  case IRP_MN_REMOVE_DEVICE:
-    break;
-
-  case IRP_MN_SET_LOCK:
-    break;
-
-  case IRP_MN_START_DEVICE:
-    Status = STATUS_SUCCESS;
-    break;
-
-  case IRP_MN_STOP_DEVICE:
-    break;
-
-  case IRP_MN_SURPRISE_REMOVAL:
-    break;
-
-  default:
-    DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction);
-    break;
-  }
-
-  if (Status != STATUS_PENDING) {
-    Irp->IoStatus.Status = Status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-  }
-
-  DPRINT("Leaving. Status 0x%X\n", Status);
-
-  return Status;
-}
-
-NTSTATUS
-NTAPI
-PdoPowerControl(
-  PDEVICE_OBJECT DeviceObject,
-  PIRP Irp)
-/*
- * FUNCTION: Handle power management IRPs for the child device
- * ARGUMENTS:
- *     DeviceObject = Pointer to physical device object of the child device
- *     Irp          = Pointer to IRP that should be handled
- * RETURNS:
- *     Status
- */
-{
-  PIO_STACK_LOCATION IrpSp;
-  NTSTATUS Status;
-
-  DPRINT("Called\n");
-
-  IrpSp = IoGetCurrentIrpStackLocation(Irp);
-
-  switch (IrpSp->MinorFunction) {
-  case IRP_MN_SET_POWER:
-    Status = PdoSetPower(DeviceObject, Irp, IrpSp);
-    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;
-}
-
-/* EOF */
diff --git a/reactos/drivers/bus/acpi/parser/psargs.c b/reactos/drivers/bus/acpi/parser/psargs.c
deleted file mode 100644 (file)
index 1eaa016..0000000
+++ /dev/null
@@ -1,730 +0,0 @@
-/******************************************************************************
- *
- * Module Name: psargs - Parse AML opcode arguments
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_PARSER
-        MODULE_NAME         ("psargs")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_next_package_length
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *
- * RETURN:      Decoded package length.  On completion, the AML pointer points
- *              past the length byte or bytes.
- *
- * DESCRIPTION: Decode and return a package length field
- *
- ******************************************************************************/
-
-u32
-acpi_ps_get_next_package_length (
-       ACPI_PARSE_STATE        *parser_state)
-{
-       u32                     encoded_length;
-       u32                     length = 0;
-
-
-       encoded_length = (u32) GET8 (parser_state->aml);
-       parser_state->aml++;
-
-
-       switch (encoded_length >> 6) /* bits 6-7 contain encoding scheme */ {
-       case 0: /* 1-byte encoding (bits 0-5) */
-
-               length = (encoded_length & 0x3F);
-               break;
-
-
-       case 1: /* 2-byte encoding (next byte + bits 0-3) */
-
-               length = ((GET8 (parser_state->aml) << 04) |
-                                (encoded_length & 0x0F));
-               parser_state->aml++;
-               break;
-
-
-       case 2: /* 3-byte encoding (next 2 bytes + bits 0-3) */
-
-               length = ((GET8 (parser_state->aml + 1) << 12) |
-                                 (GET8 (parser_state->aml)    << 04) |
-                                 (encoded_length & 0x0F));
-               parser_state->aml += 2;
-               break;
-
-
-       case 3: /* 4-byte encoding (next 3 bytes + bits 0-3) */
-
-               length = ((GET8 (parser_state->aml + 2) << 20) |
-                                 (GET8 (parser_state->aml + 1) << 12) |
-                                 (GET8 (parser_state->aml)    << 04) |
-                                 (encoded_length & 0x0F));
-               parser_state->aml += 3;
-               break;
-       }
-
-       return (length);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_next_package_end
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *
- * RETURN:      Pointer to end-of-package +1
- *
- * DESCRIPTION: Get next package length and return a pointer past the end of
- *              the package.  Consumes the package length field
- *
- ******************************************************************************/
-
-u8 *
-acpi_ps_get_next_package_end (
-       ACPI_PARSE_STATE        *parser_state)
-{
-       u8                      *start = parser_state->aml;
-       NATIVE_UINT             length;
-
-
-       length = (NATIVE_UINT) acpi_ps_get_next_package_length (parser_state);
-
-       return (start + length); /* end of package */
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_next_namestring
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *
- * RETURN:      Pointer to the start of the name string (pointer points into
- *              the AML.
- *
- * DESCRIPTION: Get next raw namestring within the AML stream.  Handles all name
- *              prefix characters.  Set parser state to point past the string.
- *              (Name is consumed from the AML.)
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_ps_get_next_namestring (
-       ACPI_PARSE_STATE        *parser_state)
-{
-       u8                       *start = parser_state->aml;
-       u8                       *end = parser_state->aml;
-       u32                     length;
-
-
-       /* Handle multiple prefix characters */
-
-       while (acpi_ps_is_prefix_char (GET8 (end))) {
-               /* include prefix '\\' or '^' */
-
-               end++;
-       }
-
-       /* Decode the path */
-
-       switch (GET8 (end)) {
-       case 0:
-
-               /* Null_name */
-
-               if (end == start) {
-                       start = NULL;
-               }
-               end++;
-               break;
-
-
-       case AML_DUAL_NAME_PREFIX:
-
-               /* two name segments */
-
-               end += 9;
-               break;
-
-
-       case AML_MULTI_NAME_PREFIX_OP:
-
-               /* multiple name segments */
-
-               length = (u32) GET8 (end + 1) * 4;
-               end += 2 + length;
-               break;
-
-
-       default:
-
-               /* single name segment */
-               /* assert (Acpi_ps_is_lead (GET8 (End))); */
-
-               end += 4;
-               break;
-       }
-
-       parser_state->aml = (u8*) end;
-
-       return ((NATIVE_CHAR *) start);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_next_namepath
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *              Arg                 - Where the namepath will be stored
- *              Arg_count           - If the namepath points to a control method
- *                                    the method's argument is returned here.
- *              Method_call         - Whether the namepath can be the start
- *                                    of a method call
- *
- * RETURN:      None
- *
- * DESCRIPTION: Get next name (if method call, push appropriate # args).  Names
- *              are looked up in either the parsed or internal namespace to
- *              determine if the name represents a control method.  If a method
- *              is found, the number of arguments to the method is returned.
- *              This information is critical for parsing to continue correctly.
- *
- ******************************************************************************/
-
-
-#ifdef PARSER_ONLY
-
-void
-acpi_ps_get_next_namepath (
-       ACPI_PARSE_STATE        *parser_state,
-       ACPI_PARSE_OBJECT       *arg,
-       u32                     *arg_count,
-       u8                      method_call)
-{
-       NATIVE_CHAR             *path;
-       ACPI_PARSE_OBJECT       *name_op;
-       ACPI_PARSE_OBJECT       *op;
-       ACPI_PARSE_OBJECT       *count;
-
-
-       path = acpi_ps_get_next_namestring (parser_state);
-       if (!path || !method_call) {
-               /* Null name case, create a null namepath object */
-
-               acpi_ps_init_op (arg, AML_NAMEPATH_OP);
-               arg->value.name = path;
-               return;
-       }
-
-
-       if (acpi_gbl_parsed_namespace_root) {
-               /*
-                * Lookup the name in the parsed namespace
-                */
-
-               op = NULL;
-               if (method_call) {
-                       op = acpi_ps_find (acpi_ps_get_parent_scope (parser_state),
-                                          path, AML_METHOD_OP, 0);
-               }
-
-               if (op) {
-                       if (op->opcode == AML_METHOD_OP) {
-                               /*
-                                * The name refers to a control method, so this namepath is a
-                                * method invocation.  We need to 1) Get the number of arguments
-                                * associated with this method, and 2) Change the NAMEPATH
-                                * object into a METHODCALL object.
-                                */
-
-                               count = acpi_ps_get_arg (op, 0);
-                               if (count && count->opcode == AML_BYTE_OP) {
-                                       name_op = acpi_ps_alloc_op (AML_NAMEPATH_OP);
-                                       if (name_op) {
-                                               /* Change arg into a METHOD CALL and attach the name */
-
-                                               acpi_ps_init_op (arg, AML_METHODCALL_OP);
-
-                                               name_op->value.name = path;
-
-                                               /* Point METHODCALL/NAME to the METHOD Node */
-
-                                               name_op->node = (ACPI_NAMESPACE_NODE *) op;
-                                               acpi_ps_append_arg (arg, name_op);
-
-                                               *arg_count = count->value.integer &
-                                                                METHOD_FLAGS_ARG_COUNT;
-                                       }
-                               }
-
-                               return;
-                       }
-
-                       /*
-                        * Else this is normal named object reference.
-                        * Just init the NAMEPATH object with the pathname.
-                        * (See code below)
-                        */
-               }
-       }
-
-
-       /*
-        * Either we didn't find the object in the namespace, or the object is
-        * something other than a control method.  Just initialize the Op with the
-        * pathname
-        */
-
-       acpi_ps_init_op (arg, AML_NAMEPATH_OP);
-       arg->value.name = path;
-
-
-       return;
-}
-
-
-#else
-
-
-void
-acpi_ps_get_next_namepath (
-       ACPI_PARSE_STATE        *parser_state,
-       ACPI_PARSE_OBJECT       *arg,
-       u32                     *arg_count,
-       u8                      method_call)
-{
-       NATIVE_CHAR             *path;
-       ACPI_PARSE_OBJECT       *name_op;
-       ACPI_STATUS             status;
-       ACPI_NAMESPACE_NODE     *method_node = NULL;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_GENERIC_STATE      scope_info;
-
-
-       path = acpi_ps_get_next_namestring (parser_state);
-       if (!path || !method_call) {
-               /* Null name case, create a null namepath object */
-
-               acpi_ps_init_op (arg, AML_NAMEPATH_OP);
-               arg->value.name = path;
-               return;
-       }
-
-
-       if (method_call) {
-               /*
-                * Lookup the name in the internal namespace
-                */
-               scope_info.scope.node = NULL;
-               node = parser_state->start_node;
-               if (node) {
-                       scope_info.scope.node = node;
-               }
-
-               /*
-                * Lookup object.  We don't want to add anything new to the namespace
-                * here, however.  So we use MODE_EXECUTE.  Allow searching of the
-                * parent tree, but don't open a new scope -- we just want to lookup the
-                * object  (MUST BE mode EXECUTE to perform upsearch)
-                */
-
-               status = acpi_ns_lookup (&scope_info, path, ACPI_TYPE_ANY, IMODE_EXECUTE,
-                                NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, NULL,
-                                &node);
-               if (ACPI_SUCCESS (status)) {
-                       if (node->type == ACPI_TYPE_METHOD) {
-                               method_node = node;
-                               name_op = acpi_ps_alloc_op (AML_NAMEPATH_OP);
-                               if (name_op) {
-                                       /* Change arg into a METHOD CALL and attach name to it */
-
-                                       acpi_ps_init_op (arg, AML_METHODCALL_OP);
-
-                                       name_op->value.name = path;
-
-                                       /* Point METHODCALL/NAME to the METHOD Node */
-
-                                       name_op->node = method_node;
-                                       acpi_ps_append_arg (arg, name_op);
-
-                                       if (!(ACPI_OPERAND_OBJECT  *) method_node->object) {
-                                               return;
-                                       }
-
-                                       *arg_count = ((ACPI_OPERAND_OBJECT *) method_node->object)->method.param_count;
-                               }
-
-                               return;
-                       }
-
-                       /*
-                        * Else this is normal named object reference.
-                        * Just init the NAMEPATH object with the pathname.
-                        * (See code below)
-                        */
-               }
-       }
-
-       /*
-        * Either we didn't find the object in the namespace, or the object is
-        * something other than a control method.  Just initialize the Op with the
-        * pathname.
-        */
-
-       acpi_ps_init_op (arg, AML_NAMEPATH_OP);
-       arg->value.name = path;
-
-
-       return;
-}
-
-#endif
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_next_simple_arg
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *              Arg_type            - The argument type (AML_*_ARG)
- *              Arg                 - Where the argument is returned
- *
- * RETURN:      None
- *
- * DESCRIPTION: Get the next simple argument (constant, string, or namestring)
- *
- ******************************************************************************/
-
-void
-acpi_ps_get_next_simple_arg (
-       ACPI_PARSE_STATE        *parser_state,
-       u32                     arg_type,
-       ACPI_PARSE_OBJECT       *arg)
-{
-
-
-       switch (arg_type) {
-
-       case ARGP_BYTEDATA:
-
-               acpi_ps_init_op (arg, AML_BYTE_OP);
-               arg->value.integer = (u32) GET8 (parser_state->aml);
-               parser_state->aml++;
-               break;
-
-
-       case ARGP_WORDDATA:
-
-               acpi_ps_init_op (arg, AML_WORD_OP);
-
-               /* Get 2 bytes from the AML stream */
-
-               MOVE_UNALIGNED16_TO_32 (&arg->value.integer, parser_state->aml);
-               parser_state->aml += 2;
-               break;
-
-
-       case ARGP_DWORDDATA:
-
-               acpi_ps_init_op (arg, AML_DWORD_OP);
-
-               /* Get 4 bytes from the AML stream */
-
-               MOVE_UNALIGNED32_TO_32 (&arg->value.integer, parser_state->aml);
-               parser_state->aml += 4;
-               break;
-
-
-       case ARGP_CHARLIST:
-
-               acpi_ps_init_op (arg, AML_STRING_OP);
-               arg->value.string = (char*) parser_state->aml;
-
-               while (GET8 (parser_state->aml) != '\0') {
-                       parser_state->aml++;
-               }
-               parser_state->aml++;
-               break;
-
-
-       case ARGP_NAME:
-       case ARGP_NAMESTRING:
-
-               acpi_ps_init_op (arg, AML_NAMEPATH_OP);
-               arg->value.name = acpi_ps_get_next_namestring (parser_state);
-               break;
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_next_field
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *
- * RETURN:      A newly allocated FIELD op
- *
- * DESCRIPTION: Get next field (Named_field, Reserved_field, or Access_field)
- *
- ******************************************************************************/
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_next_field (
-       ACPI_PARSE_STATE        *parser_state)
-{
-       ACPI_PTRDIFF            aml_offset = parser_state->aml -
-                        parser_state->aml_start;
-       ACPI_PARSE_OBJECT       *field;
-       u16                     opcode;
-       u32                     name;
-
-
-       /* determine field type */
-
-       switch (GET8 (parser_state->aml)) {
-
-       default:
-
-               opcode = AML_NAMEDFIELD_OP;
-               break;
-
-
-       case 0x00:
-
-               opcode = AML_RESERVEDFIELD_OP;
-               parser_state->aml++;
-               break;
-
-
-       case 0x01:
-
-               opcode = AML_ACCESSFIELD_OP;
-               parser_state->aml++;
-               break;
-       }
-
-
-       /* Allocate a new field op */
-
-       field = acpi_ps_alloc_op (opcode);
-       if (field) {
-               field->aml_offset = aml_offset;
-
-               /* Decode the field type */
-
-               switch (opcode) {
-               case AML_NAMEDFIELD_OP:
-
-                       /* Get the 4-character name */
-
-                       MOVE_UNALIGNED32_TO_32 (&name, parser_state->aml);
-                       acpi_ps_set_name (field, name);
-                       parser_state->aml += 4;
-
-                       /* Get the length which is encoded as a package length */
-
-                       field->value.size = acpi_ps_get_next_package_length (parser_state);
-                       break;
-
-
-               case AML_RESERVEDFIELD_OP:
-
-                       /* Get the length which is encoded as a package length */
-
-                       field->value.size = acpi_ps_get_next_package_length (parser_state);
-                       break;
-
-
-               case AML_ACCESSFIELD_OP:
-
-                       /* Get Access_type and Access_atrib and merge into the field Op */
-
-                       field->value.integer = ((GET8 (parser_state->aml) << 8) |
-                                         GET8 (parser_state->aml));
-                       parser_state->aml += 2;
-                       break;
-               }
-       }
-
-       return (field);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_next_arg
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *              Arg_type            - The argument type (AML_*_ARG)
- *              Arg_count           - If the argument points to a control method
- *                                    the method's argument is returned here.
- *
- * RETURN:      An op object containing the next argument.
- *
- * DESCRIPTION: Get next argument (including complex list arguments that require
- *              pushing the parser stack)
- *
- ******************************************************************************/
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_next_arg (
-       ACPI_PARSE_STATE        *parser_state,
-       u32                     arg_type,
-       u32                     *arg_count)
-{
-       ACPI_PARSE_OBJECT       *arg = NULL;
-       ACPI_PARSE_OBJECT       *prev = NULL;
-       ACPI_PARSE_OBJECT       *field;
-       u32                     subop;
-
-
-       switch (arg_type) {
-       case ARGP_BYTEDATA:
-       case ARGP_WORDDATA:
-       case ARGP_DWORDDATA:
-       case ARGP_CHARLIST:
-       case ARGP_NAME:
-       case ARGP_NAMESTRING:
-
-               /* constants, strings, and namestrings are all the same size */
-
-               arg = acpi_ps_alloc_op (AML_BYTE_OP);
-               if (arg) {
-                       acpi_ps_get_next_simple_arg (parser_state, arg_type, arg);
-               }
-               break;
-
-
-       case ARGP_PKGLENGTH:
-
-               /* package length, nothing returned */
-
-               parser_state->pkg_end = acpi_ps_get_next_package_end (parser_state);
-               break;
-
-
-       case ARGP_FIELDLIST:
-
-               if (parser_state->aml < parser_state->pkg_end) {
-                       /* non-empty list */
-
-                       while (parser_state->aml < parser_state->pkg_end) {
-                               field = acpi_ps_get_next_field (parser_state);
-                               if (!field) {
-                                       break;
-                               }
-
-                               if (prev) {
-                                       prev->next = field;
-                               }
-
-                               else {
-                                       arg = field;
-                               }
-
-                               prev = field;
-                       }
-
-                       /* skip to End of byte data */
-
-                       parser_state->aml = parser_state->pkg_end;
-               }
-               break;
-
-
-       case ARGP_BYTELIST:
-
-               if (parser_state->aml < parser_state->pkg_end) {
-                       /* non-empty list */
-
-                       arg = acpi_ps_alloc_op (AML_BYTELIST_OP);
-                       if (arg) {
-                               /* fill in bytelist data */
-
-                               arg->value.size = (parser_state->pkg_end - parser_state->aml);
-                               ((ACPI_PARSE2_OBJECT *) arg)->data = parser_state->aml;
-                       }
-
-                       /* skip to End of byte data */
-
-                       parser_state->aml = parser_state->pkg_end;
-               }
-               break;
-
-
-       case ARGP_TARGET:
-       case ARGP_SUPERNAME: {
-                       subop = acpi_ps_peek_opcode (parser_state);
-                       if (subop == 0              ||
-                               acpi_ps_is_leading_char (subop) ||
-                               acpi_ps_is_prefix_char (subop)) {
-                               /* Null_name or Name_string */
-
-                               arg = acpi_ps_alloc_op (AML_NAMEPATH_OP);
-                               if (arg) {
-                                       acpi_ps_get_next_namepath (parser_state, arg, arg_count, 0);
-                               }
-                       }
-
-                       else {
-                               /* single complex argument, nothing returned */
-
-                               *arg_count = 1;
-                       }
-               }
-               break;
-
-
-       case ARGP_DATAOBJ:
-       case ARGP_TERMARG:
-
-               /* single complex argument, nothing returned */
-
-               *arg_count = 1;
-               break;
-
-
-       case ARGP_DATAOBJLIST:
-       case ARGP_TERMLIST:
-       case ARGP_OBJLIST:
-
-               if (parser_state->aml < parser_state->pkg_end) {
-                       /* non-empty list of variable arguments, nothing returned */
-
-                       *arg_count = ACPI_VAR_ARGS;
-               }
-               break;
-       }
-
-       return (arg);
-}
diff --git a/reactos/drivers/bus/acpi/parser/psopcode.c b/reactos/drivers/bus/acpi/parser/psopcode.c
deleted file mode 100644 (file)
index 5620157..0000000
+++ /dev/null
@@ -1,648 +0,0 @@
-/******************************************************************************
- *
- * Module Name: psopcode - Parser opcode information table
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_PARSER
-        MODULE_NAME         ("psopcode")
-
-
-#define _UNK                        0x6B
-/*
- * Reserved ASCII characters.  Do not use any of these for
- * internal opcodes, since they are used to differentiate
- * name strings from AML opcodes
- */
-#define _ASC                        0x6C
-#define _NAM                        0x6C
-#define _PFX                        0x6D
-#define _UNKNOWN_OPCODE             0x02    /* An example unknown opcode */
-
-#define MAX_EXTENDED_OPCODE         0x88
-#define NUM_EXTENDED_OPCODE         MAX_EXTENDED_OPCODE + 1
-#define MAX_INTERNAL_OPCODE
-#define NUM_INTERNAL_OPCODE         MAX_INTERNAL_OPCODE + 1
-
-
-/*******************************************************************************
- *
- * NAME:        Acpi_gbl_Aml_op_info
- *
- * DESCRIPTION: Opcode table. Each entry contains <opcode, type, name, operands>
- *              The name is a simple ascii string, the operand specifier is an
- *              ascii string with one letter per operand.  The letter specifies
- *              the operand type.
- *
- ******************************************************************************/
-
-
-/*
- * Flags byte: 0-4 (5 bits) = Opcode Type
- *             5   (1 bit)  = Has arguments flag
- *             6-7 (2 bits) = Reserved
- */
-#define AML_NO_ARGS         0
-#define AML_HAS_ARGS        ACPI_OP_ARGS_MASK
-
-/*
- * All AML opcodes and the parse-time arguments for each.  Used by the AML parser  Each list is compressed
- * into a 32-bit number and stored in the master opcode table at the end of this file.
- */
-
-#define ARGP_ZERO_OP                    ARG_NONE
-#define ARGP_ONE_OP                     ARG_NONE
-#define ARGP_ALIAS_OP                   ARGP_LIST2 (ARGP_NAMESTRING, ARGP_NAME)
-#define ARGP_NAME_OP                    ARGP_LIST2 (ARGP_NAME,       ARGP_DATAOBJ)
-#define ARGP_BYTE_OP                    ARGP_LIST1 (ARGP_BYTEDATA)
-#define ARGP_WORD_OP                    ARGP_LIST1 (ARGP_WORDDATA)
-#define ARGP_DWORD_OP                   ARGP_LIST1 (ARGP_DWORDDATA)
-#define ARGP_STRING_OP                  ARGP_LIST1 (ARGP_CHARLIST)
-#define ARGP_QWORD_OP                   ARGP_LIST1 (ARGP_QWORDDATA)
-#define ARGP_SCOPE_OP                   ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_TERMLIST)
-#define ARGP_BUFFER_OP                  ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_TERMARG,       ARGP_BYTELIST)
-#define ARGP_PACKAGE_OP                 ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_BYTEDATA,      ARGP_DATAOBJLIST)
-#define ARGP_VAR_PACKAGE_OP             ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_BYTEDATA,      ARGP_DATAOBJLIST)
-#define ARGP_METHOD_OP                  ARGP_LIST4 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_BYTEDATA,      ARGP_TERMLIST)
-#define ARGP_LOCAL0                     ARG_NONE
-#define ARGP_LOCAL1                     ARG_NONE
-#define ARGP_LOCAL2                     ARG_NONE
-#define ARGP_LOCAL3                     ARG_NONE
-#define ARGP_LOCAL4                     ARG_NONE
-#define ARGP_LOCAL5                     ARG_NONE
-#define ARGP_LOCAL6                     ARG_NONE
-#define ARGP_LOCAL7                     ARG_NONE
-#define ARGP_ARG0                       ARG_NONE
-#define ARGP_ARG1                       ARG_NONE
-#define ARGP_ARG2                       ARG_NONE
-#define ARGP_ARG3                       ARG_NONE
-#define ARGP_ARG4                       ARG_NONE
-#define ARGP_ARG5                       ARG_NONE
-#define ARGP_ARG6                       ARG_NONE
-#define ARGP_STORE_OP                   ARGP_LIST2 (ARGP_TERMARG,    ARGP_SUPERNAME)
-#define ARGP_REF_OF_OP                  ARGP_LIST1 (ARGP_SUPERNAME)
-#define ARGP_ADD_OP                     ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_CONCAT_OP                  ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_SUBTRACT_OP                ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_INCREMENT_OP               ARGP_LIST1 (ARGP_SUPERNAME)
-#define ARGP_DECREMENT_OP               ARGP_LIST1 (ARGP_SUPERNAME)
-#define ARGP_MULTIPLY_OP                ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_DIVIDE_OP                  ARGP_LIST4 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET,    ARGP_TARGET)
-#define ARGP_SHIFT_LEFT_OP              ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_SHIFT_RIGHT_OP             ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_BIT_AND_OP                 ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_BIT_NAND_OP                ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_BIT_OR_OP                  ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_BIT_NOR_OP                 ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_BIT_XOR_OP                 ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_BIT_NOT_OP                 ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
-#define ARGP_FIND_SET_LEFT_BIT_OP       ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
-#define ARGP_FIND_SET_RIGHT_BIT_OP      ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
-#define ARGP_DEREF_OF_OP                ARGP_LIST1 (ARGP_TERMARG)
-#define ARGP_CONCAT_RES_OP              ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_MOD_OP                     ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_NOTIFY_OP                  ARGP_LIST2 (ARGP_SUPERNAME,  ARGP_TERMARG)
-#define ARGP_SIZE_OF_OP                 ARGP_LIST1 (ARGP_SUPERNAME)
-#define ARGP_INDEX_OP                   ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_MATCH_OP                   ARGP_LIST6 (ARGP_TERMARG,    ARGP_BYTEDATA,      ARGP_TERMARG,   ARGP_BYTEDATA,  ARGP_TERMARG,   ARGP_TERMARG)
-#define ARGP_DWORD_FIELD_OP             ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_NAME)
-#define ARGP_WORD_FIELD_OP              ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_NAME)
-#define ARGP_BYTE_FIELD_OP              ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_NAME)
-#define ARGP_BIT_FIELD_OP               ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_NAME)
-#define ARGP_TYPE_OP                    ARGP_LIST1 (ARGP_SUPERNAME)
-#define ARGP_QWORD_FIELD_OP             ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_NAME)
-#define ARGP_LAND_OP                    ARGP_LIST2 (ARGP_TERMARG,    ARGP_TERMARG)
-#define ARGP_LOR_OP                     ARGP_LIST2 (ARGP_TERMARG,    ARGP_TERMARG)
-#define ARGP_LNOT_OP                    ARGP_LIST1 (ARGP_TERMARG)
-#define ARGP_LEQUAL_OP                  ARGP_LIST2 (ARGP_TERMARG,    ARGP_TERMARG)
-#define ARGP_LGREATER_OP                ARGP_LIST2 (ARGP_TERMARG,    ARGP_TERMARG)
-#define ARGP_LLESS_OP                   ARGP_LIST2 (ARGP_TERMARG,    ARGP_TERMARG)
-#define ARGP_TO_BUFFER_OP               ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
-#define ARGP_TO_DEC_STR_OP              ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
-#define ARGP_TO_HEX_STR_OP              ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
-#define ARGP_TO_INTEGER_OP              ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
-#define ARGP_TO_STRING_OP               ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_COPY_OP                    ARGP_LIST2 (ARGP_SUPERNAME,  ARGP_SIMPLENAME)
-#define ARGP_MID_OP                     ARGP_LIST4 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TERMARG,   ARGP_TARGET)
-#define ARGP_CONTINUE_OP                ARG_NONE
-#define ARGP_IF_OP                      ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_TERMARG, ARGP_TERMLIST)
-#define ARGP_ELSE_OP                    ARGP_LIST2 (ARGP_PKGLENGTH,  ARGP_TERMLIST)
-#define ARGP_WHILE_OP                   ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_TERMARG, ARGP_TERMLIST)
-#define ARGP_NOOP_OP                    ARG_NONE
-#define ARGP_RETURN_OP                  ARGP_LIST1 (ARGP_TERMARG)
-#define ARGP_BREAK_OP                   ARG_NONE
-#define ARGP_BREAK_POINT_OP             ARG_NONE
-#define ARGP_ONES_OP                    ARG_NONE
-#define ARGP_MUTEX_OP                   ARGP_LIST2 (ARGP_NAME,       ARGP_BYTEDATA)
-#define ARGP_EVENT_OP                   ARGP_LIST1 (ARGP_NAME)
-#define ARGP_COND_REF_OF_OP             ARGP_LIST2 (ARGP_SUPERNAME,  ARGP_SUPERNAME)
-#define ARGP_CREATE_FIELD_OP            ARGP_LIST4 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TERMARG,   ARGP_NAME)
-#define ARGP_LOAD_TABLE_OP              ARGP_LIST6 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TERMARG,   ARGP_TERMARG,  ARGP_TERMARG,   ARGP_TERMARG)
-#define ARGP_LOAD_OP                    ARGP_LIST2 (ARGP_NAMESTRING, ARGP_SUPERNAME)
-#define ARGP_STALL_OP                   ARGP_LIST1 (ARGP_TERMARG)
-#define ARGP_SLEEP_OP                   ARGP_LIST1 (ARGP_TERMARG)
-#define ARGP_ACQUIRE_OP                 ARGP_LIST2 (ARGP_SUPERNAME,  ARGP_WORDDATA)
-#define ARGP_SIGNAL_OP                  ARGP_LIST1 (ARGP_SUPERNAME)
-#define ARGP_WAIT_OP                    ARGP_LIST2 (ARGP_SUPERNAME,  ARGP_TERMARG)
-#define ARGP_RESET_OP                   ARGP_LIST1 (ARGP_SUPERNAME)
-#define ARGP_RELEASE_OP                 ARGP_LIST1 (ARGP_SUPERNAME)
-#define ARGP_FROM_BCD_OP                ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
-#define ARGP_TO_BCD_OP                  ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
-#define ARGP_UNLOAD_OP                  ARGP_LIST1 (ARGP_SUPERNAME)
-#define ARGP_REVISION_OP                ARG_NONE
-#define ARGP_DEBUG_OP                   ARG_NONE
-#define ARGP_FATAL_OP                   ARGP_LIST3 (ARGP_BYTEDATA,   ARGP_DWORDDATA,     ARGP_TERMARG)
-#define ARGP_REGION_OP                  ARGP_LIST4 (ARGP_NAME,       ARGP_BYTEDATA,      ARGP_TERMARG,   ARGP_TERMARG)
-#define ARGP_DEF_FIELD_OP               ARGP_LIST4 (ARGP_PKGLENGTH,  ARGP_NAMESTRING,    ARGP_BYTEDATA,  ARGP_FIELDLIST)
-#define ARGP_DEVICE_OP                  ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_OBJLIST)
-#define ARGP_PROCESSOR_OP               ARGP_LIST6 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_BYTEDATA,  ARGP_DWORDDATA, ARGP_BYTEDATA,  ARGP_OBJLIST)
-#define ARGP_POWER_RES_OP               ARGP_LIST5 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_BYTEDATA,  ARGP_WORDDATA,  ARGP_OBJLIST)
-#define ARGP_THERMAL_ZONE_OP            ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_OBJLIST)
-#define ARGP_INDEX_FIELD_OP             ARGP_LIST5 (ARGP_PKGLENGTH,  ARGP_NAMESTRING,    ARGP_NAMESTRING,ARGP_BYTEDATA,  ARGP_FIELDLIST)
-#define ARGP_BANK_FIELD_OP              ARGP_LIST6 (ARGP_PKGLENGTH,  ARGP_NAMESTRING,    ARGP_NAMESTRING,ARGP_TERMARG,   ARGP_BYTEDATA,  ARGP_FIELDLIST)
-#define ARGP_DATA_REGION_OP             ARGP_LIST4 (ARGP_NAMESTRING, ARGP_TERMARG,       ARGP_TERMARG,   ARGP_TERMARG)
-#define ARGP_LNOTEQUAL_OP               ARGP_LIST2 (ARGP_TERMARG,    ARGP_TERMARG)
-#define ARGP_LLESSEQUAL_OP              ARGP_LIST2 (ARGP_TERMARG,    ARGP_TERMARG)
-#define ARGP_LGREATEREQUAL_OP           ARGP_LIST2 (ARGP_TERMARG,    ARGP_TERMARG)
-#define ARGP_NAMEPATH_OP                ARGP_LIST1 (ARGP_NAMESTRING)
-#define ARGP_METHODCALL_OP              ARGP_LIST1 (ARGP_NAMESTRING)
-#define ARGP_BYTELIST_OP                ARGP_LIST1 (ARGP_NAMESTRING)
-#define ARGP_RESERVEDFIELD_OP           ARGP_LIST1 (ARGP_NAMESTRING)
-#define ARGP_NAMEDFIELD_OP              ARGP_LIST1 (ARGP_NAMESTRING)
-#define ARGP_ACCESSFIELD_OP             ARGP_LIST1 (ARGP_NAMESTRING)
-#define ARGP_STATICSTRING_OP            ARGP_LIST1 (ARGP_NAMESTRING)
-
-
-/*
- * All AML opcodes and the runtime arguments for each.  Used by the AML interpreter  Each list is compressed
- * into a 32-bit number and stored in the master opcode table at the end of this file.
- *
- * (Used by Acpi_aml_prep_operands procedure and the ASL Compiler)
- */
-
-#define ARGI_ZERO_OP                    ARG_NONE
-#define ARGI_ONE_OP                     ARG_NONE
-#define ARGI_ALIAS_OP                   ARGI_INVALID_OPCODE
-#define ARGI_NAME_OP                    ARGI_INVALID_OPCODE
-#define ARGI_BYTE_OP                    ARGI_INVALID_OPCODE
-#define ARGI_WORD_OP                    ARGI_INVALID_OPCODE
-#define ARGI_DWORD_OP                   ARGI_INVALID_OPCODE
-#define ARGI_STRING_OP                  ARGI_INVALID_OPCODE
-#define ARGI_QWORD_OP                   ARGI_INVALID_OPCODE
-#define ARGI_SCOPE_OP                   ARGI_INVALID_OPCODE
-#define ARGI_BUFFER_OP                  ARGI_INVALID_OPCODE
-#define ARGI_PACKAGE_OP                 ARGI_INVALID_OPCODE
-#define ARGI_VAR_PACKAGE_OP             ARGI_INVALID_OPCODE
-#define ARGI_METHOD_OP                  ARGI_INVALID_OPCODE
-#define ARGI_LOCAL0                     ARG_NONE
-#define ARGI_LOCAL1                     ARG_NONE
-#define ARGI_LOCAL2                     ARG_NONE
-#define ARGI_LOCAL3                     ARG_NONE
-#define ARGI_LOCAL4                     ARG_NONE
-#define ARGI_LOCAL5                     ARG_NONE
-#define ARGI_LOCAL6                     ARG_NONE
-#define ARGI_LOCAL7                     ARG_NONE
-#define ARGI_ARG0                       ARG_NONE
-#define ARGI_ARG1                       ARG_NONE
-#define ARGI_ARG2                       ARG_NONE
-#define ARGI_ARG3                       ARG_NONE
-#define ARGI_ARG4                       ARG_NONE
-#define ARGI_ARG5                       ARG_NONE
-#define ARGI_ARG6                       ARG_NONE
-#define ARGI_STORE_OP                   ARGI_LIST2 (ARGI_ANYTYPE,    ARGI_TARGETREF)
-#define ARGI_REF_OF_OP                  ARGI_LIST1 (ARGI_OBJECT_REF)
-#define ARGI_ADD_OP                     ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_CONCAT_OP                  ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA,   ARGI_TARGETREF)
-#define ARGI_SUBTRACT_OP                ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_INCREMENT_OP               ARGI_LIST1 (ARGI_INTEGER_REF)
-#define ARGI_DECREMENT_OP               ARGI_LIST1 (ARGI_INTEGER_REF)
-#define ARGI_MULTIPLY_OP                ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_DIVIDE_OP                  ARGI_LIST4 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF,    ARGI_TARGETREF)
-#define ARGI_SHIFT_LEFT_OP              ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_SHIFT_RIGHT_OP             ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_BIT_AND_OP                 ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_BIT_NAND_OP                ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_BIT_OR_OP                  ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_BIT_NOR_OP                 ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_BIT_XOR_OP                 ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_BIT_NOT_OP                 ARGI_LIST2 (ARGI_INTEGER,    ARGI_TARGETREF)
-#define ARGI_FIND_SET_LEFT_BIT_OP       ARGI_LIST2 (ARGI_INTEGER,    ARGI_TARGETREF)
-#define ARGI_FIND_SET_RIGHT_BIT_OP      ARGI_LIST2 (ARGI_INTEGER,    ARGI_TARGETREF)
-#define ARGI_DEREF_OF_OP                ARGI_LIST1 (ARGI_REFERENCE)
-#define ARGI_CONCAT_RES_OP              ARGI_LIST3 (ARGI_BUFFER,     ARGI_BUFFER,        ARGI_TARGETREF)
-#define ARGI_MOD_OP                     ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_NOTIFY_OP                  ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER)
-#define ARGI_SIZE_OF_OP                 ARGI_LIST1 (ARGI_DATAOBJECT)
-#define ARGI_INDEX_OP                   ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER,       ARGI_TARGETREF)
-#define ARGI_MATCH_OP                   ARGI_LIST6 (ARGI_PACKAGE,    ARGI_INTEGER,       ARGI_INTEGER,      ARGI_INTEGER,   ARGI_INTEGER,   ARGI_INTEGER)
-#define ARGI_DWORD_FIELD_OP             ARGI_LIST3 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_REFERENCE)
-#define ARGI_WORD_FIELD_OP              ARGI_LIST3 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_REFERENCE)
-#define ARGI_BYTE_FIELD_OP              ARGI_LIST3 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_REFERENCE)
-#define ARGI_BIT_FIELD_OP               ARGI_LIST3 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_REFERENCE)
-#define ARGI_TYPE_OP                    ARGI_LIST1 (ARGI_ANYTYPE)
-#define ARGI_QWORD_FIELD_OP             ARGI_LIST3 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_REFERENCE)
-#define ARGI_LAND_OP                    ARGI_LIST2 (ARGI_INTEGER,    ARGI_INTEGER)
-#define ARGI_LOR_OP                     ARGI_LIST2 (ARGI_INTEGER,    ARGI_INTEGER)
-#define ARGI_LNOT_OP                    ARGI_LIST1 (ARGI_INTEGER)
-#define ARGI_LEQUAL_OP                  ARGI_LIST2 (ARGI_INTEGER,    ARGI_INTEGER)
-#define ARGI_LGREATER_OP                ARGI_LIST2 (ARGI_INTEGER,    ARGI_INTEGER)
-#define ARGI_LLESS_OP                   ARGI_LIST2 (ARGI_INTEGER,    ARGI_INTEGER)
-#define ARGI_TO_BUFFER_OP               ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
-#define ARGI_TO_DEC_STR_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
-#define ARGI_TO_HEX_STR_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
-#define ARGI_TO_INTEGER_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
-#define ARGI_TO_STRING_OP               ARGI_LIST3 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_FIXED_TARGET)
-#define ARGI_COPY_OP                    ARGI_LIST2 (ARGI_ANYTYPE,    ARGI_SIMPLE_TARGET)
-#define ARGI_MID_OP                     ARGI_LIST4 (ARGI_BUFFERSTRING,ARGI_INTEGER,      ARGI_INTEGER,      ARGI_TARGETREF)
-#define ARGI_CONTINUE_OP                ARGI_INVALID_OPCODE
-#define ARGI_IF_OP                      ARGI_INVALID_OPCODE
-#define ARGI_ELSE_OP                    ARGI_INVALID_OPCODE
-#define ARGI_WHILE_OP                   ARGI_INVALID_OPCODE
-#define ARGI_NOOP_OP                    ARG_NONE
-#define ARGI_RETURN_OP                  ARGI_INVALID_OPCODE
-#define ARGI_BREAK_OP                   ARG_NONE
-#define ARGI_BREAK_POINT_OP             ARG_NONE
-#define ARGI_ONES_OP                    ARG_NONE
-#define ARGI_MUTEX_OP                   ARGI_INVALID_OPCODE
-#define ARGI_EVENT_OP                   ARGI_INVALID_OPCODE
-#define ARGI_COND_REF_OF_OP             ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF)
-#define ARGI_CREATE_FIELD_OP            ARGI_LIST4 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_INTEGER,      ARGI_REFERENCE)
-#define ARGI_LOAD_TABLE_OP              ARGI_LIST6 (ARGI_STRING,     ARGI_STRING,        ARGI_STRING,       ARGI_STRING,    ARGI_STRING, ARGI_TARGETREF)
-#define ARGI_LOAD_OP                    ARGI_LIST2 (ARGI_REGION,     ARGI_TARGETREF)
-#define ARGI_STALL_OP                   ARGI_LIST1 (ARGI_INTEGER)
-#define ARGI_SLEEP_OP                   ARGI_LIST1 (ARGI_INTEGER)
-#define ARGI_ACQUIRE_OP                 ARGI_LIST2 (ARGI_MUTEX,      ARGI_INTEGER)
-#define ARGI_SIGNAL_OP                  ARGI_LIST1 (ARGI_EVENT)
-#define ARGI_WAIT_OP                    ARGI_LIST2 (ARGI_EVENT,      ARGI_INTEGER)
-#define ARGI_RESET_OP                   ARGI_LIST1 (ARGI_EVENT)
-#define ARGI_RELEASE_OP                 ARGI_LIST1 (ARGI_MUTEX)
-#define ARGI_FROM_BCD_OP                ARGI_LIST2 (ARGI_INTEGER,    ARGI_TARGETREF)
-#define ARGI_TO_BCD_OP                  ARGI_LIST2 (ARGI_INTEGER,    ARGI_FIXED_TARGET)
-#define ARGI_UNLOAD_OP                  ARGI_LIST1 (ARGI_DDBHANDLE)
-#define ARGI_REVISION_OP                ARG_NONE
-#define ARGI_DEBUG_OP                   ARG_NONE
-#define ARGI_FATAL_OP                   ARGI_LIST3 (ARGI_INTEGER,    ARGI_INTEGER,       ARGI_INTEGER)
-#define ARGI_REGION_OP                  ARGI_LIST2 (ARGI_INTEGER,    ARGI_INTEGER)
-#define ARGI_DEF_FIELD_OP               ARGI_INVALID_OPCODE
-#define ARGI_DEVICE_OP                  ARGI_INVALID_OPCODE
-#define ARGI_PROCESSOR_OP               ARGI_INVALID_OPCODE
-#define ARGI_POWER_RES_OP               ARGI_INVALID_OPCODE
-#define ARGI_THERMAL_ZONE_OP            ARGI_INVALID_OPCODE
-#define ARGI_INDEX_FIELD_OP             ARGI_INVALID_OPCODE
-#define ARGI_BANK_FIELD_OP              ARGI_INVALID_OPCODE
-#define ARGI_DATA_REGION_OP             ARGI_LIST3 (ARGI_STRING,     ARGI_STRING,       ARGI_STRING)
-#define ARGI_LNOTEQUAL_OP               ARGI_INVALID_OPCODE
-#define ARGI_LLESSEQUAL_OP              ARGI_INVALID_OPCODE
-#define ARGI_LGREATEREQUAL_OP           ARGI_INVALID_OPCODE
-#define ARGI_NAMEPATH_OP                ARGI_INVALID_OPCODE
-#define ARGI_METHODCALL_OP              ARGI_INVALID_OPCODE
-#define ARGI_BYTELIST_OP                ARGI_INVALID_OPCODE
-#define ARGI_RESERVEDFIELD_OP           ARGI_INVALID_OPCODE
-#define ARGI_NAMEDFIELD_OP              ARGI_INVALID_OPCODE
-#define ARGI_ACCESSFIELD_OP             ARGI_INVALID_OPCODE
-#define ARGI_STATICSTRING_OP            ARGI_INVALID_OPCODE
-
-
-/*
- * Master Opcode information table.  A summary of everything we know about each opcode, all in one place.
- */
-
-
-static ACPI_OPCODE_INFO    aml_op_info[] =
-{
-/* Index          Opcode                                   Type                   Class                 Has Arguments?   Name                 Parser Args             Interpreter Args */
-
-/*  00 */   /* AML_ZERO_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT|        AML_NO_ARGS,  "Zero",               ARGP_ZERO_OP,           ARGI_ZERO_OP),
-/*  01 */   /* AML_ONE_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT|        AML_NO_ARGS,  "One",                ARGP_ONE_OP,            ARGI_ONE_OP),
-/*  02 */   /* AML_ALIAS_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Alias",              ARGP_ALIAS_OP,          ARGI_ALIAS_OP),
-/*  03 */   /* AML_NAME_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Name",               ARGP_NAME_OP,           ARGI_NAME_OP),
-/*  04 */   /* AML_BYTE_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL|         AML_NO_ARGS,  "Byte_const",         ARGP_BYTE_OP,           ARGI_BYTE_OP),
-/*  05 */   /* AML_WORD_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL|         AML_NO_ARGS,  "Word_const",         ARGP_WORD_OP,           ARGI_WORD_OP),
-/*  06 */   /* AML_DWORD_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL|         AML_NO_ARGS,  "Dword_const",        ARGP_DWORD_OP,          ARGI_DWORD_OP),
-/*  07 */   /* AML_STRING_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL|         AML_NO_ARGS,  "String",             ARGP_STRING_OP,         ARGI_STRING_OP),
-/*  08 */   /* AML_SCOPE_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Scope",              ARGP_SCOPE_OP,          ARGI_SCOPE_OP),
-/*  09 */   /* AML_BUFFER_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM|       AML_HAS_ARGS, "Buffer",             ARGP_BUFFER_OP,         ARGI_BUFFER_OP),
-/*  0A */   /* AML_PACKAGE_OP */         OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM|       AML_HAS_ARGS, "Package",            ARGP_PACKAGE_OP,        ARGI_PACKAGE_OP),
-/*  0B */   /* AML_METHOD_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Method",             ARGP_METHOD_OP,         ARGI_METHOD_OP),
-/*  0C */   /* AML_LOCAL0 */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE|  AML_NO_ARGS,  "Local0",             ARGP_LOCAL0,            ARGI_LOCAL0),
-/*  0D */   /* AML_LOCAL1 */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE|  AML_NO_ARGS,  "Local1",             ARGP_LOCAL1,            ARGI_LOCAL1),
-/*  0E */   /* AML_LOCAL2 */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE|  AML_NO_ARGS,  "Local2",             ARGP_LOCAL2,            ARGI_LOCAL2),
-/*  0F */   /* AML_LOCAL3 */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE|  AML_NO_ARGS,  "Local3",             ARGP_LOCAL3,            ARGI_LOCAL3),
-/*  10 */   /* AML_LOCAL4 */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE|  AML_NO_ARGS,  "Local4",             ARGP_LOCAL4,            ARGI_LOCAL4),
-/*  11 */   /* AML_LOCAL5 */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE|  AML_NO_ARGS,  "Local5",             ARGP_LOCAL5,            ARGI_LOCAL5),
-/*  12 */   /* AML_LOCAL6 */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE|  AML_NO_ARGS,  "Local6",             ARGP_LOCAL6,            ARGI_LOCAL6),
-/*  13 */   /* AML_LOCAL7 */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE|  AML_NO_ARGS,  "Local7",             ARGP_LOCAL7,            ARGI_LOCAL7),
-/*  14 */   /* AML_ARG0 */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS,  "Arg0",               ARGP_ARG0,              ARGI_ARG0),
-/*  15 */   /* AML_ARG1 */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS,  "Arg1",               ARGP_ARG1,              ARGI_ARG1),
-/*  16 */   /* AML_ARG2 */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS,  "Arg2",               ARGP_ARG2,              ARGI_ARG2),
-/*  17 */   /* AML_ARG3 */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS,  "Arg3",               ARGP_ARG3,              ARGI_ARG3),
-/*  18 */   /* AML_ARG4 */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS,  "Arg4",               ARGP_ARG4,              ARGI_ARG4),
-/*  19 */   /* AML_ARG5 */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS,  "Arg5",               ARGP_ARG5,              ARGI_ARG5),
-/*  1_a */  /* AML_ARG6 */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS,  "Arg6",               ARGP_ARG6,              ARGI_ARG6),
-/*  1_b */  /* AML_STORE_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "Store",              ARGP_STORE_OP,          ARGI_STORE_OP),
-/*  1_c */  /* AML_REF_OF_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2|        AML_HAS_ARGS, "Ref_of",             ARGP_REF_OF_OP,         ARGI_REF_OF_OP),
-/*  1_d */  /* AML_ADD_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Add",                ARGP_ADD_OP,            ARGI_ADD_OP),
-/*  1_e */  /* AML_CONCAT_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Concatenate",        ARGP_CONCAT_OP,         ARGI_CONCAT_OP),
-/*  1_f */  /* AML_SUBTRACT_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Subtract",           ARGP_SUBTRACT_OP,       ARGI_SUBTRACT_OP),
-/*  20 */   /* AML_INCREMENT_OP */        OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2|        AML_HAS_ARGS, "Increment",          ARGP_INCREMENT_OP,      ARGI_INCREMENT_OP),
-/*  21 */   /* AML_DECREMENT_OP */        OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2|        AML_HAS_ARGS, "Decrement",          ARGP_DECREMENT_OP,      ARGI_DECREMENT_OP),
-/*  22 */   /* AML_MULTIPLY_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Multiply",           ARGP_MULTIPLY_OP,       ARGI_MULTIPLY_OP),
-/*  23 */   /* AML_DIVIDE_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Divide",             ARGP_DIVIDE_OP,         ARGI_DIVIDE_OP),
-/*  24 */   /* AML_SHIFT_LEFT_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Shift_left",         ARGP_SHIFT_LEFT_OP,     ARGI_SHIFT_LEFT_OP),
-/*  25 */   /* AML_SHIFT_RIGHT_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Shift_right",        ARGP_SHIFT_RIGHT_OP,    ARGI_SHIFT_RIGHT_OP),
-/*  26 */   /* AML_BIT_AND_OP */         OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "And",                ARGP_BIT_AND_OP,        ARGI_BIT_AND_OP),
-/*  27 */   /* AML_BIT_NAND_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "NAnd",               ARGP_BIT_NAND_OP,       ARGI_BIT_NAND_OP),
-/*  28 */   /* AML_BIT_OR_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Or",                 ARGP_BIT_OR_OP,         ARGI_BIT_OR_OP),
-/*  29 */   /* AML_BIT_NOR_OP */         OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "NOr",                ARGP_BIT_NOR_OP,        ARGI_BIT_NOR_OP),
-/*  2_a */  /* AML_BIT_XOR_OP */         OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "XOr",                ARGP_BIT_XOR_OP,        ARGI_BIT_XOR_OP),
-/*  2_b */  /* AML_BIT_NOT_OP */         OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "Not",                ARGP_BIT_NOT_OP,        ARGI_BIT_NOT_OP),
-/*  2_c */  /* AML_FIND_SET_LEFT_BIT_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "Find_set_left_bit",  ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP),
-/*  2_d */  /* AML_FIND_SET_RIGHT_BIT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "Find_set_right_bit", ARGP_FIND_SET_RIGHT_BIT_OP, ARGI_FIND_SET_RIGHT_BIT_OP),
-/*  2_e */  /* AML_DEREF_OF_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2|        AML_HAS_ARGS, "Deref_of",           ARGP_DEREF_OF_OP,       ARGI_DEREF_OF_OP),
-/*  2_f */  /* AML_NOTIFY_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC1|         AML_HAS_ARGS, "Notify",             ARGP_NOTIFY_OP,         ARGI_NOTIFY_OP),
-/*  30 */   /* AML_SIZE_OF_OP */         OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2|        AML_HAS_ARGS, "Size_of",            ARGP_SIZE_OF_OP,        ARGI_SIZE_OF_OP),
-/*  31 */   /* AML_INDEX_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_INDEX|           AML_HAS_ARGS, "Index",              ARGP_INDEX_OP,          ARGI_INDEX_OP),
-/*  32 */   /* AML_MATCH_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MATCH|           AML_HAS_ARGS, "Match",              ARGP_MATCH_OP,          ARGI_MATCH_OP),
-/*  33 */   /* AML_DWORD_FIELD_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD|    AML_HAS_ARGS, "Create_dWord_field", ARGP_DWORD_FIELD_OP,    ARGI_DWORD_FIELD_OP),
-/*  34 */   /* AML_WORD_FIELD_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD|    AML_HAS_ARGS, "Create_word_field",  ARGP_WORD_FIELD_OP,     ARGI_WORD_FIELD_OP),
-/*  35 */   /* AML_BYTE_FIELD_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD|    AML_HAS_ARGS, "Create_byte_field",  ARGP_BYTE_FIELD_OP,     ARGI_BYTE_FIELD_OP),
-/*  36 */   /* AML_BIT_FIELD_OP */        OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD|    AML_HAS_ARGS, "Create_bit_field",   ARGP_BIT_FIELD_OP,      ARGI_BIT_FIELD_OP),
-/*  37 */   /* AML_TYPE_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2|        AML_HAS_ARGS, "Object_type",        ARGP_TYPE_OP,           ARGI_TYPE_OP),
-/*  38 */   /* AML_LAND_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2|         AML_HAS_ARGS, "LAnd",               ARGP_LAND_OP,           ARGI_LAND_OP),
-/*  39 */   /* AML_LOR_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2|         AML_HAS_ARGS, "LOr",                ARGP_LOR_OP,            ARGI_LOR_OP),
-/*  3_a */  /* AML_LNOT_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2|        AML_HAS_ARGS, "LNot",               ARGP_LNOT_OP,           ARGI_LNOT_OP),
-/*  3_b */  /* AML_LEQUAL_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2|         AML_HAS_ARGS, "LEqual",             ARGP_LEQUAL_OP,         ARGI_LEQUAL_OP),
-/*  3_c */  /* AML_LGREATER_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2|         AML_HAS_ARGS, "LGreater",           ARGP_LGREATER_OP,       ARGI_LGREATER_OP),
-/*  3_d */  /* AML_LLESS_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2|         AML_HAS_ARGS, "LLess",              ARGP_LLESS_OP,          ARGI_LLESS_OP),
-/*  3_e */  /* AML_IF_OP */     OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL|         AML_HAS_ARGS, "If",                 ARGP_IF_OP,             ARGI_IF_OP),
-/*  3_f */  /* AML_ELSE_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL|         AML_HAS_ARGS, "Else",               ARGP_ELSE_OP,           ARGI_ELSE_OP),
-/*  40 */   /* AML_WHILE_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL|         AML_HAS_ARGS, "While",              ARGP_WHILE_OP,          ARGI_WHILE_OP),
-/*  41 */   /* AML_NOOP_OP   */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL|         AML_NO_ARGS,  "Noop",               ARGP_NOOP_OP,           ARGI_NOOP_OP),
-/*  42 */   /* AML_RETURN_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL|         AML_HAS_ARGS, "Return",             ARGP_RETURN_OP,         ARGI_RETURN_OP),
-/*  43 */   /* AML_BREAK_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL|         AML_NO_ARGS,  "Break",              ARGP_BREAK_OP,          ARGI_BREAK_OP),
-/*  44 */   /* AML_BREAK_POINT_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL|         AML_NO_ARGS,  "Break_point",        ARGP_BREAK_POINT_OP,    ARGI_BREAK_POINT_OP),
-/*  45 */   /* AML_ONES_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT|        AML_NO_ARGS,  "Ones",               ARGP_ONES_OP,           ARGI_ONES_OP),
-
-/* Prefixed opcodes (Two-byte opcodes with a prefix op) */
-
-/*  46 */   /* AML_MUTEX_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Mutex",              ARGP_MUTEX_OP,          ARGI_MUTEX_OP),
-/*  47 */   /* AML_EVENT_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_NO_ARGS,  "Event",              ARGP_EVENT_OP,          ARGI_EVENT_OP),
-/*  48 */   /* AML_COND_REF_OF_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "Cond_ref_of",        ARGP_COND_REF_OF_OP,    ARGI_COND_REF_OF_OP),
-/*  49 */   /* AML_CREATE_FIELD_OP */     OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD|    AML_HAS_ARGS, "Create_field",       ARGP_CREATE_FIELD_OP,   ARGI_CREATE_FIELD_OP),
-/*  4_a */  /* AML_LOAD_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_RECONFIGURATION| AML_HAS_ARGS, "Load",               ARGP_LOAD_OP,           ARGI_LOAD_OP),
-/*  4_b */  /* AML_STALL_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1|        AML_HAS_ARGS, "Stall",              ARGP_STALL_OP,          ARGI_STALL_OP),
-/*  4_c */  /* AML_SLEEP_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1|        AML_HAS_ARGS, "Sleep",              ARGP_SLEEP_OP,          ARGI_SLEEP_OP),
-/*  4_d */  /* AML_ACQUIRE_OP */         OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_s|       AML_HAS_ARGS, "Acquire",            ARGP_ACQUIRE_OP,        ARGI_ACQUIRE_OP),
-/*  4_e */  /* AML_SIGNAL_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1|        AML_HAS_ARGS, "Signal",             ARGP_SIGNAL_OP,         ARGI_SIGNAL_OP),
-/*  4_f */  /* AML_WAIT_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_s|       AML_HAS_ARGS, "Wait",               ARGP_WAIT_OP,           ARGI_WAIT_OP),
-/*  50 */   /* AML_RESET_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1|        AML_HAS_ARGS, "Reset",              ARGP_RESET_OP,          ARGI_RESET_OP),
-/*  51 */   /* AML_RELEASE_OP */         OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1|        AML_HAS_ARGS, "Release",            ARGP_RELEASE_OP,        ARGI_RELEASE_OP),
-/*  52 */   /* AML_FROM_BCD_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "From_bCD",           ARGP_FROM_BCD_OP,       ARGI_FROM_BCD_OP),
-/*  53 */   /* AML_TO_BCD_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "To_bCD",             ARGP_TO_BCD_OP,         ARGI_TO_BCD_OP),
-/*  54 */   /* AML_UNLOAD_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_RECONFIGURATION| AML_HAS_ARGS, "Unload",             ARGP_UNLOAD_OP,         ARGI_UNLOAD_OP),
-/*  55 */   /* AML_REVISION_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT|        AML_NO_ARGS,  "Revision",           ARGP_REVISION_OP,       ARGI_REVISION_OP),
-/*  56 */   /* AML_DEBUG_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT|        AML_NO_ARGS,  "Debug",              ARGP_DEBUG_OP,          ARGI_DEBUG_OP),
-/*  57 */   /* AML_FATAL_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_FATAL|           AML_HAS_ARGS, "Fatal",              ARGP_FATAL_OP,          ARGI_FATAL_OP),
-/*  58 */   /* AML_REGION_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Op_region",          ARGP_REGION_OP,         ARGI_REGION_OP),
-/*  59 */   /* AML_DEF_FIELD_OP */        OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Field",              ARGP_DEF_FIELD_OP,      ARGI_DEF_FIELD_OP),
-/*  5_a */  /* AML_DEVICE_OP */           OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Device",             ARGP_DEVICE_OP,         ARGI_DEVICE_OP),
-/*  5_b */  /* AML_PROCESSOR_OP */        OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Processor",          ARGP_PROCESSOR_OP,      ARGI_PROCESSOR_OP),
-/*  5_c */  /* AML_POWER_RES_OP */        OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Power_resource",     ARGP_POWER_RES_OP,      ARGI_POWER_RES_OP),
-/*  5_d */  /* AML_THERMAL_ZONE_OP */     OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Thermal_zone",       ARGP_THERMAL_ZONE_OP,   ARGI_THERMAL_ZONE_OP),
-/*  5_e */  /* AML_INDEX_FIELD_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Index_field",        ARGP_INDEX_FIELD_OP,    ARGI_INDEX_FIELD_OP),
-/*  5_f */  /* AML_BANK_FIELD_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT|    AML_HAS_ARGS, "Bank_field",         ARGP_BANK_FIELD_OP,     ARGI_BANK_FIELD_OP),
-
-/* Internal opcodes that map to invalid AML opcodes */
-
-/*  60 */   /* AML_LNOTEQUAL_OP */        OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS|           AML_HAS_ARGS, "LNot_equal",         ARGP_LNOTEQUAL_OP,      ARGI_LNOTEQUAL_OP),
-/*  61 */   /* AML_LLESSEQUAL_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS|           AML_HAS_ARGS, "LLess_equal",        ARGP_LLESSEQUAL_OP,     ARGI_LLESSEQUAL_OP),
-/*  62 */   /* AML_LGREATEREQUAL_OP */   OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS|           AML_HAS_ARGS, "LGreater_equal",     ARGP_LGREATEREQUAL_OP,  ARGI_LGREATEREQUAL_OP),
-/*  63 */   /* AML_NAMEPATH_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL|         AML_NO_ARGS,  "Name_path",          ARGP_NAMEPATH_OP,       ARGI_NAMEPATH_OP),
-/*  64 */   /* AML_METHODCALL_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_CALL|     AML_HAS_ARGS, "Method_call",        ARGP_METHODCALL_OP,     ARGI_METHODCALL_OP),
-/*  65 */   /* AML_BYTELIST_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL|         AML_NO_ARGS,  "Byte_list",          ARGP_BYTELIST_OP,       ARGI_BYTELIST_OP),
-/*  66 */   /* AML_RESERVEDFIELD_OP */   OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS|           AML_NO_ARGS,  "Reserved_field",     ARGP_RESERVEDFIELD_OP,  ARGI_RESERVEDFIELD_OP),
-/*  67 */   /* AML_NAMEDFIELD_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS|           AML_NO_ARGS,  "Named_field",        ARGP_NAMEDFIELD_OP,     ARGI_NAMEDFIELD_OP),
-/*  68 */   /* AML_ACCESSFIELD_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS|           AML_NO_ARGS,  "Access_field",       ARGP_ACCESSFIELD_OP,    ARGI_ACCESSFIELD_OP),
-/*  69 */   /* AML_STATICSTRING_OP */     OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS|           AML_NO_ARGS,  "Static_string",      ARGP_STATICSTRING_OP,   ARGI_STATICSTRING_OP),
-/*  6_a */  /* AML_RETURN_VALUE_OP */     OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_RETURN|          AML_HAS_ARGS, "[Return Value]",     ARG_NONE,               ARG_NONE),
-/*  6_b */  /* UNKNOWN OPCODES */       OP_INFO_ENTRY (ACPI_OP_TYPE_UNKNOWN | OPTYPE_BOGUS|          AML_HAS_ARGS, "UNKNOWN_OP!",        ARG_NONE,               ARG_NONE),
-/*  6_c */  /* ASCII CHARACTERS */        OP_INFO_ENTRY (ACPI_OP_TYPE_ASCII  | OPTYPE_BOGUS|           AML_HAS_ARGS, "ASCII_ONLY!",        ARG_NONE,               ARG_NONE),
-/*  6_d */  /* PREFIX CHARACTERS */      OP_INFO_ENTRY (ACPI_OP_TYPE_PREFIX | OPTYPE_BOGUS|           AML_HAS_ARGS, "PREFIX_ONLY!",       ARG_NONE,               ARG_NONE),
-
-
-/* ACPI 2.0 (new) opcodes */
-
-/*  6_e */  /* AML_QWORD_OP */  OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL|         AML_NO_ARGS,  "Qword_const",        ARGP_QWORD_OP,          ARGI_QWORD_OP),
-/*  6_f */  /* AML_VAR_PACKAGE_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM|       AML_HAS_ARGS, "Var_package",        ARGP_VAR_PACKAGE_OP,    ARGI_VAR_PACKAGE_OP),
-/*  70 */   /* AML_CONCAT_RES_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Concat_res",         ARGP_CONCAT_RES_OP,     ARGI_CONCAT_RES_OP),
-/*  71 */   /* AML_MOD_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r|       AML_HAS_ARGS, "Mod",                ARGP_MOD_OP,            ARGI_MOD_OP),
-/*  72 */   /* AML_QWORD_FIELD_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD|    AML_HAS_ARGS, "Create_qWord_field", ARGP_QWORD_FIELD_OP,    ARGI_QWORD_FIELD_OP),
-/*  73 */   /* AML_TO_BUFFER_OP */        OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "To_buffer",          ARGP_TO_BUFFER_OP,      ARGI_TO_BUFFER_OP),
-/*  74 */   /* AML_TO_DEC_STR_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "To_dec_string",      ARGP_TO_DEC_STR_OP,     ARGI_TO_DEC_STR_OP),
-/*  75 */   /* AML_TO_HEX_STR_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "To_hex_string",      ARGP_TO_HEX_STR_OP,     ARGI_TO_HEX_STR_OP),
-/*  76 */   /* AML_TO_INTEGER_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "To_integer",         ARGP_TO_INTEGER_OP,     ARGI_TO_INTEGER_OP),
-/*  77 */   /* AML_TO_STRING_OP */        OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "To_string",          ARGP_TO_STRING_OP,      ARGI_TO_STRING_OP),
-/*  78 */   /* AML_COPY_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "Copy",               ARGP_COPY_OP,           ARGI_COPY_OP),
-/*  79 */   /* AML_MID_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "Mid",                ARGP_MID_OP,            ARGI_MID_OP),
-/*  7_a */  /* AML_CONTINUE_OP */       OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL|         AML_NO_ARGS,  "Continue",           ARGP_CONTINUE_OP,       ARGI_CONTINUE_OP),
-/*  7_b */  /* AML_LOAD_TABLE_OP */      OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "Load_table",         ARGP_LOAD_TABLE_OP,     ARGI_LOAD_TABLE_OP),
-/*  7_c */  /* AML_DATA_REGION_OP */    OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r|      AML_HAS_ARGS, "Data_op_region",     ARGP_DATA_REGION_OP,    ARGI_DATA_REGION_OP),
-
-};
-
-/*
- * This table is directly indexed by the opcodes, and returns an
- * index into the table above
- */
-
-static u8 aml_short_op_info_index[256] =
-{
-/*              0     1     2     3     4     5     6     7  */
-/*              8     9     A     B     C     D     E     F  */
-/* 0x00 */     0x00, 0x01, _UNK, _UNK, _UNK, _UNK, 0x02, _UNK,
-/* 0x08 */     0x03, _UNK, 0x04, 0x05, 0x06, 0x07, 0x6E, _UNK,
-/* 0x10 */     0x08, 0x09, 0x0a, 0x6F, 0x0b, _UNK, _UNK, _UNK,
-/* 0x18 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x20 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x28 */     _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX,
-/* 0x30 */     0x67, 0x66, 0x68, 0x65, 0x69, 0x64, 0x6A, _UNK,
-/* 0x38 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x40 */     _UNK, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
-/* 0x48 */     _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
-/* 0x50 */     _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
-/* 0x58 */     _ASC, _ASC, _ASC, _UNK, _PFX, _UNK, _PFX, _ASC,
-/* 0x60 */     0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
-/* 0x68 */     0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, _UNK,
-/* 0x70 */     0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22,
-/* 0x78 */     0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
-/* 0x80 */     0x2b, 0x2c, 0x2d, 0x2e, 0x70, 0x71, 0x2f, 0x30,
-/* 0x88 */     0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x72,
-/* 0x90 */     0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x73, 0x74,
-/* 0x98 */     0x75, 0x76, _UNK, _UNK, 0x77, 0x78, 0x79, 0x7A,
-/* 0xA0 */     0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x60, 0x61,
-/* 0xA8 */     0x62, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0xB0 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0xB8 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0xC0 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0xC8 */     _UNK, _UNK, _UNK, _UNK, 0x44, _UNK, _UNK, _UNK,
-/* 0xD0 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0xD8 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0xE0 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0xE8 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0xF0 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0xF8 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x45,
-};
-
-
-static u8 aml_long_op_info_index[NUM_EXTENDED_OPCODE] =
-{
-/*              0     1     2     3     4     5     6     7  */
-/*              8     9     A     B     C     D     E     F  */
-/* 0x00 */     _UNK, 0x46, 0x47, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x08 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x10 */     _UNK, _UNK, 0x48, 0x49, _UNK, _UNK, _UNK, _UNK,
-/* 0x18 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x7B,
-/* 0x20 */     0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
-/* 0x28 */     0x52, 0x53, 0x54, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x30 */     0x55, 0x56, 0x57, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x38 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x40 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x48 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x50 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x58 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x60 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x68 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x70 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x78 */     _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
-/* 0x80 */     0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-/* 0x88 */     0x7C,
-};
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_opcode_info
- *
- * PARAMETERS:  Opcode              - The AML opcode
- *
- * RETURN:      A pointer to the info about the opcode.  NULL if the opcode was
- *              not found in the table.
- *
- * DESCRIPTION: Find AML opcode description based on the opcode.
- *              NOTE: This procedure must ALWAYS return a valid pointer!
- *
- ******************************************************************************/
-
-ACPI_OPCODE_INFO *
-acpi_ps_get_opcode_info (
-       u16                     opcode)
-{
-       ACPI_OPCODE_INFO        *op_info;
-       u8                      upper_opcode;
-       u8                      lower_opcode;
-
-
-       /* Split the 16-bit opcode into separate bytes */
-
-       upper_opcode = (u8) (opcode >> 8);
-       lower_opcode = (u8) opcode;
-
-       /* Default is "unknown opcode" */
-
-       op_info = &aml_op_info [_UNK];
-
-
-       /*
-        * Detect normal 8-bit opcode or extended 16-bit opcode
-        */
-
-       switch (upper_opcode) {
-       case 0:
-
-               /* Simple (8-bit) opcode: 0-255, can't index beyond table  */
-
-               op_info = &aml_op_info [aml_short_op_info_index [lower_opcode]];
-               break;
-
-
-       case AML_EXTOP:
-
-               /* Extended (16-bit, prefix+opcode) opcode */
-
-               if (lower_opcode <= MAX_EXTENDED_OPCODE) {
-                       op_info = &aml_op_info [aml_long_op_info_index [lower_opcode]];
-               }
-               break;
-
-
-       case AML_LNOT_OP:
-
-               /* This case is for the bogus opcodes LNOTEQUAL, LLESSEQUAL, LGREATEREQUAL */
-               /* TBD: [Investigate] remove this case? */
-
-               break;
-
-
-       default:
-
-               break;
-       }
-
-
-       /* Get the Op info pointer for this opcode */
-
-       return (op_info);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_opcode_name
- *
- * PARAMETERS:  Opcode              - The AML opcode
- *
- * RETURN:      A pointer to the name of the opcode (ASCII String)
- *              Note: Never returns NULL.
- *
- * DESCRIPTION: Translate an opcode into a human-readable string
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_ps_get_opcode_name (
-       u16                     opcode)
-{
-       ACPI_OPCODE_INFO             *op;
-
-
-       op = acpi_ps_get_opcode_info (opcode);
-
-       /* Always guaranteed to return a valid pointer */
-
-       return ("AE_NOT_CONFIGURED");
-}
-
-
diff --git a/reactos/drivers/bus/acpi/parser/psparse.c b/reactos/drivers/bus/acpi/parser/psparse.c
deleted file mode 100644 (file)
index 479756a..0000000
+++ /dev/null
@@ -1,1223 +0,0 @@
-/******************************************************************************
- *
- * Module Name: psparse - Parser top level AML parse routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-/*
- * Parse the AML and build an operation tree as most interpreters,
- * like Perl, do.  Parsing is done by hand rather than with a YACC
- * generated parser to tightly constrain stack and dynamic memory
- * usage.  At the same time, parsing is kept flexible and the code
- * fairly compact by parsing based on a list of AML opcode
- * templates in Aml_op_info[]
- */
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_PARSER
-        MODULE_NAME         ("psparse")
-
-
-u32                         acpi_gbl_depth = 0;
-extern u32                  acpi_gbl_scope_depth;
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_peek_opcode
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get next AML opcode (without incrementing AML pointer)
- *
- ******************************************************************************/
-
-static u32
-acpi_ps_get_opcode_size (
-       u32                     opcode)
-{
-
-       /* Extended (2-byte) opcode if > 255 */
-
-       if (opcode > 0x00FF) {
-               return (2);
-       }
-
-       /* Otherwise, just a single byte opcode */
-
-       return (1);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_peek_opcode
- *
- * PARAMETERS:  Parser_state        - A parser state object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get next AML opcode (without incrementing AML pointer)
- *
- ******************************************************************************/
-
-u16
-acpi_ps_peek_opcode (
-       ACPI_PARSE_STATE        *parser_state)
-{
-       u8                      *aml;
-       u16                     opcode;
-
-
-       aml = parser_state->aml;
-       opcode = (u16) GET8 (aml);
-
-       aml++;
-
-
-       /*
-        * Original code special cased LNOTEQUAL, LLESSEQUAL, LGREATEREQUAL.
-        * These opcodes are no longer recognized. Instead, they are broken into
-        * two opcodes.
-        *
-        *
-        *    if (Opcode == AML_EXTOP
-        *       || (Opcode == AML_LNOT
-        *          && (GET8 (Acpi_aml) == AML_LEQUAL
-        *               || GET8 (Acpi_aml) == AML_LGREATER
-        *               || GET8 (Acpi_aml) == AML_LLESS)))
-        *
-        *     extended Opcode, !=, <=, or >=
-        */
-
-       if (opcode == AML_EXTOP) {
-               /* Extended opcode */
-
-               opcode = (u16) ((opcode << 8) | GET8 (aml));
-               aml++;
-       }
-
-       /* don't convert bare name to a namepath */
-
-       return (opcode);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_create_state
- *
- * PARAMETERS:  Acpi_aml            - Acpi_aml code pointer
- *              Acpi_aml_size       - Length of AML code
- *
- * RETURN:      A new parser state object
- *
- * DESCRIPTION: Create and initialize a new parser state object
- *
- ******************************************************************************/
-
-ACPI_PARSE_STATE *
-acpi_ps_create_state (
-       u8                      *aml,
-       u32                     aml_size)
-{
-       ACPI_PARSE_STATE        *parser_state;
-
-
-       parser_state = acpi_cm_callocate (sizeof (ACPI_PARSE_STATE));
-       if (!parser_state) {
-               return (NULL);
-       }
-
-       parser_state->aml      = aml;
-       parser_state->aml_end  = aml + aml_size;
-       parser_state->pkg_end  = parser_state->aml_end;
-       parser_state->aml_start = aml;
-
-
-       return (parser_state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_find_object
- *
- * PARAMETERS:  Opcode          - Current opcode
- *              Parser_state    - Current state
- *              Walk_state      - Current state
- *              *Op             - Where found/new op is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Find a named object.  Two versions - one to search the parse
- *              tree (for parser-only applications such as acpidump), another
- *              to search the ACPI internal namespace (the parse tree may no
- *              longer exist)
- *
- ******************************************************************************/
-
-#ifdef PARSER_ONLY
-
-ACPI_STATUS
-acpi_ps_find_object (
-       u16                     opcode,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       **out_op)
-{
-       NATIVE_CHAR             *path;
-
-
-       /* We are only interested in opcodes that have an associated name */
-
-       if (!acpi_ps_is_named_op (opcode)) {
-               *out_op = op;
-               return (AE_OK);
-       }
-
-       /* Find the name in the parse tree */
-
-       path = acpi_ps_get_next_namestring (walk_state->parser_state);
-
-       *out_op = acpi_ps_find (acpi_ps_get_parent_scope (walk_state->parser_state),
-                         path, opcode, 1);
-
-       if (!(*out_op)) {
-               return (AE_NOT_FOUND);
-       }
-
-       return (AE_OK);
-}
-
-#endif
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_complete_this_op
- *
- * PARAMETERS:  Walk_state      - Current State
- *              Op              - Op to complete
- *
- * RETURN:      TRUE if Op and subtree was deleted
- *
- * DESCRIPTION: Perform any cleanup at the completion of an Op.
- *
- ******************************************************************************/
-
-static u8
-acpi_ps_complete_this_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op)
-{
-#ifndef PARSER_ONLY
-       ACPI_PARSE_OBJECT       *prev;
-       ACPI_PARSE_OBJECT       *next;
-       ACPI_OPCODE_INFO        *op_info;
-       ACPI_OPCODE_INFO        *parent_info;
-       u32                     opcode_class;
-       ACPI_PARSE_OBJECT       *replacement_op = NULL;
-
-
-       op_info     = acpi_ps_get_opcode_info (op->opcode);
-       opcode_class = ACPI_GET_OP_CLASS (op_info);
-
-
-       /* Delete this op and the subtree below it if asked to */
-
-       if (((walk_state->parse_flags & ACPI_PARSE_TREE_MASK) == ACPI_PARSE_DELETE_TREE) &&
-               (opcode_class != OPTYPE_CONSTANT)       &&
-               (opcode_class != OPTYPE_LITERAL)        &&
-               (opcode_class != OPTYPE_LOCAL_VARIABLE) &&
-               (opcode_class != OPTYPE_METHOD_ARGUMENT) &&
-               (opcode_class != OPTYPE_DATA_TERM)      &&
-               (op->opcode  != AML_NAMEPATH_OP)) {
-               /* Make sure that we only delete this subtree */
-
-               if (op->parent) {
-                       /*
-                        * Check if we need to replace the operator and its subtree
-                        * with a return value op (placeholder op)
-                        */
-
-                       parent_info = acpi_ps_get_opcode_info (op->parent->opcode);
-
-                       switch (ACPI_GET_OP_CLASS (parent_info)) {
-                       case OPTYPE_CONTROL:        /* IF, ELSE, WHILE only */
-                               break;
-
-                       case OPTYPE_NAMED_OBJECT:   /* Scope, method, etc. */
-
-                               /*
-                                * These opcodes contain Term_arg operands. The current
-                                * op must be replace by a placeholder return op
-                                */
-
-                               if ((op->parent->opcode == AML_REGION_OP)       ||
-                                       (op->parent->opcode == AML_CREATE_FIELD_OP) ||
-                                       (op->parent->opcode == AML_BIT_FIELD_OP)    ||
-                                       (op->parent->opcode == AML_BYTE_FIELD_OP)   ||
-                                       (op->parent->opcode == AML_WORD_FIELD_OP)   ||
-                                       (op->parent->opcode == AML_DWORD_FIELD_OP)  ||
-                                       (op->parent->opcode == AML_QWORD_FIELD_OP)) {
-                                       replacement_op = acpi_ps_alloc_op (AML_RETURN_VALUE_OP);
-                                       if (!replacement_op) {
-                                               return (FALSE);
-                                       }
-                               }
-
-                               break;
-
-                       default:
-                               replacement_op = acpi_ps_alloc_op (AML_RETURN_VALUE_OP);
-                               if (!replacement_op) {
-                                       return (FALSE);
-                               }
-                       }
-
-                       /* We must unlink this op from the parent tree */
-
-                       prev = op->parent->value.arg;
-                       if (prev == op) {
-                               /* This op is the first in the list */
-
-                               if (replacement_op) {
-                                       replacement_op->parent   = op->parent;
-                                       replacement_op->value.arg = NULL;
-                                       op->parent->value.arg    = replacement_op;
-                                       replacement_op->next     = op->next;
-                               }
-                               else {
-                                       op->parent->value.arg    = op->next;
-                               }
-                       }
-
-                       /* Search the parent list */
-
-                       else while (prev) {
-                               /* Traverse all siblings in the parent's argument list */
-
-                               next = prev->next;
-                               if (next == op) {
-                                       if (replacement_op) {
-                                               replacement_op->parent = op->parent;
-                                               replacement_op->value.arg = NULL;
-                                               prev->next = replacement_op;
-                                               replacement_op->next = op->next;
-                                               next = NULL;
-                                       }
-                                       else {
-                                               prev->next = op->next;
-                                               next = NULL;
-                                       }
-                               }
-
-                               prev = next;
-                       }
-
-               }
-
-               /* Now we can actually delete the subtree rooted at op */
-
-               acpi_ps_delete_parse_tree (op);
-
-               return (TRUE);
-       }
-
-       return (FALSE);
-
-#else
-       return (FALSE);
-#endif
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_next_parse_state
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *
- * RETURN:
- *
- * DESCRIPTION:
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_ps_next_parse_state (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_STATUS             callback_status)
-{
-       ACPI_PARSE_STATE        *parser_state = walk_state->parser_state;
-       ACPI_STATUS             status = AE_CTRL_PENDING;
-       u8                      *start;
-       u32                     package_length;
-
-
-       switch (callback_status) {
-       case AE_CTRL_TERMINATE:
-
-               /*
-                * A control method was terminated via a RETURN statement.
-                * The walk of this method is complete.
-                */
-
-               parser_state->aml = parser_state->aml_end;
-               status = AE_CTRL_TERMINATE;
-               break;
-
-
-       case AE_CTRL_PENDING:
-
-                       /*
-                        * Predicate of a WHILE was true and the loop just completed an
-                        * execution.  Go back to the start of the loop and reevaluate the
-                        * predicate.
-                        */
-/*            Walk_state->Control_state->Common.State =
-                                       CONTROL_PREDICATE_EXECUTING;*/
-
-               /* TBD: How to handle a break within a while. */
-               /* This code attempts it */
-
-               parser_state->aml = walk_state->aml_last_while;
-               break;
-
-
-       case AE_CTRL_TRUE:
-                       /*
-                        * Predicate of an IF was true, and we are at the matching ELSE.
-                        * Just close out this package
-                        *
-                        * Note: Parser_state->Aml is modified by the package length procedure
-                        * TBD: [Investigate] perhaps it shouldn't, too much trouble
-                        */
-               start = parser_state->aml;
-               package_length = acpi_ps_get_next_package_length (parser_state);
-               parser_state->aml = start + package_length;
-               break;
-
-
-       case AE_CTRL_FALSE:
-
-               /*
-                * Either an IF/WHILE Predicate was false or we encountered a BREAK
-                * opcode.  In both cases, we do not execute the rest of the
-                * package;  We simply close out the parent (finishing the walk of
-                * this branch of the tree) and continue execution at the parent
-                * level.
-                */
-
-               parser_state->aml = parser_state->scope->parse_scope.pkg_end;
-
-               /* In the case of a BREAK, just force a predicate (if any) to FALSE */
-
-               walk_state->control_state->common.value = FALSE;
-               status = AE_CTRL_END;
-               break;
-
-
-       case AE_CTRL_TRANSFER:
-
-               /*
-                * A method call (invocation) -- transfer control
-                */
-               status = AE_CTRL_TRANSFER;
-               walk_state->prev_op = op;
-               walk_state->method_call_op = op;
-               walk_state->method_call_node = (op->value.arg)->node;
-
-               /* Will return value (if any) be used by the caller? */
-
-               walk_state->return_used = acpi_ds_is_result_used (op, walk_state);
-               break;
-
-
-       default:
-               status = callback_status;
-               if ((callback_status & AE_CODE_MASK) == AE_CODE_CONTROL) {
-                       status = AE_OK;
-               }
-               break;
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_parse_loop
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Parse AML (pointed to by the current parser state) and return
- *              a tree of ops.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ps_parse_loop (
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_PARSE_OBJECT       *op = NULL;     /* current op */
-       ACPI_OPCODE_INFO        *op_info;
-       ACPI_PARSE_OBJECT       *arg = NULL;
-       ACPI_PARSE2_OBJECT      *deferred_op;
-       u32                     arg_count;      /* push for fixed or var args */
-       u32                     arg_types = 0;
-       ACPI_PTRDIFF            aml_offset;
-       u16                     opcode;
-       ACPI_PARSE_OBJECT       pre_op;
-       ACPI_PARSE_STATE        *parser_state;
-       u8                      *aml_op_start;
-
-
-       parser_state = walk_state->parser_state;
-
-#ifndef PARSER_ONLY
-       if (walk_state->walk_type & WALK_METHOD_RESTART) {
-               /* We are restarting a preempted control method */
-
-               if (acpi_ps_has_completed_scope (parser_state)) {
-                       /*
-                        * We must check if a predicate to an IF or WHILE statement
-                        * was just completed
-                        */
-                       if ((parser_state->scope->parse_scope.op) &&
-                               ((parser_state->scope->parse_scope.op->opcode == AML_IF_OP) ||
-                               (parser_state->scope->parse_scope.op->opcode == AML_WHILE_OP)) &&
-                               (walk_state->control_state) &&
-                               (walk_state->control_state->common.state ==
-                                       CONTROL_PREDICATE_EXECUTING)) {
-
-                               /*
-                                * A predicate was just completed, get the value of the
-                                * predicate and branch based on that value
-                                */
-
-                               status = acpi_ds_get_predicate_value (walk_state, NULL, TRUE);
-                               if (ACPI_FAILURE (status) &&
-                                       ((status & AE_CODE_MASK) != AE_CODE_CONTROL)) {
-                                       return (status);
-                               }
-
-                               status = acpi_ps_next_parse_state (walk_state, op, status);
-                       }
-
-                       acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count);
-               }
-
-               else if (walk_state->prev_op) {
-                       /* We were in the middle of an op */
-
-                       op = walk_state->prev_op;
-                       arg_types = walk_state->prev_arg_types;
-               }
-       }
-#endif
-
-       /*
-        * Iterative parsing loop, while there is more aml to process:
-        */
-       while ((parser_state->aml < parser_state->aml_end) || (op)) {
-               if (!op) {
-                       /* Get the next opcode from the AML stream */
-
-                       aml_op_start = parser_state->aml;
-                       aml_offset = parser_state->aml - parser_state->aml_start;
-                       opcode     = acpi_ps_peek_opcode (parser_state);
-
-                       /*
-                        * First cut to determine what we have found:
-                        * 1) A valid AML opcode
-                        * 2) A name string
-                        * 3) An unknown/invalid opcode
-                        */
-
-                       op_info = acpi_ps_get_opcode_info (opcode);
-                       switch (ACPI_GET_OP_TYPE (op_info)) {
-                       case ACPI_OP_TYPE_OPCODE:
-
-                               /* Found opcode info, this is a normal opcode */
-
-                               parser_state->aml += acpi_ps_get_opcode_size (opcode);
-                               arg_types = op_info->parse_args;
-                               break;
-
-                       case ACPI_OP_TYPE_ASCII:
-                       case ACPI_OP_TYPE_PREFIX:
-                               /*
-                                * Starts with a valid prefix or ASCII char, this is a name
-                                * string.  Convert the bare name string to a namepath.
-                                */
-
-                               opcode = AML_NAMEPATH_OP;
-                               arg_types = ARGP_NAMESTRING;
-                               break;
-
-                       case ACPI_OP_TYPE_UNKNOWN:
-
-                               /* The opcode is unrecognized.  Just skip unknown opcodes */
-
-                               /* Assume one-byte bad opcode */
-
-                               parser_state->aml++;
-                               continue;
-                       }
-
-
-                       /* Create Op structure and append to parent's argument list */
-
-                       if (acpi_ps_is_named_op (opcode)) {
-                               pre_op.value.arg = NULL;
-                               pre_op.opcode = opcode;
-
-                               while (GET_CURRENT_ARG_TYPE (arg_types) != ARGP_NAME) {
-                                       arg = acpi_ps_get_next_arg (parser_state,
-                                                        GET_CURRENT_ARG_TYPE (arg_types),
-                                                        &arg_count);
-                                       acpi_ps_append_arg (&pre_op, arg);
-                                       INCREMENT_ARG_LIST (arg_types);
-                               }
-
-
-                               /* We know that this arg is a name, move to next arg */
-
-                               INCREMENT_ARG_LIST (arg_types);
-
-                               if (walk_state->descending_callback != NULL) {
-                                       /*
-                                        * Find the object.  This will either insert the object into
-                                        * the namespace or simply look it up
-                                        */
-                                       status = walk_state->descending_callback (opcode, NULL, walk_state, &op);
-                                       if (op == NULL) {
-                                               continue;
-                                       }
-                                       status = acpi_ps_next_parse_state (walk_state, op, status);
-                                       if (status == AE_CTRL_PENDING) {
-                                               status = AE_OK;
-                                               goto close_this_op;
-                                       }
-
-                                       if (ACPI_FAILURE (status)) {
-                                               goto close_this_op;
-                                       }
-                               }
-
-                               acpi_ps_append_arg (op, pre_op.value.arg);
-                               acpi_gbl_depth++;
-
-
-                               if (op->opcode == AML_REGION_OP) {
-                                       deferred_op = acpi_ps_to_extended_op (op);
-                                       if (deferred_op) {
-                                               /*
-                                                * Defer final parsing of an Operation_region body,
-                                                * because we don't have enough info in the first pass
-                                                * to parse it correctly (i.e., there may be method
-                                                * calls within the Term_arg elements of the body.
-                                                *
-                                                * However, we must continue parsing because
-                                                * the opregion is not a standalone package --
-                                                * we don't know where the end is at this point.
-                                                *
-                                                * (Length is unknown until parse of the body complete)
-                                                */
-
-                                               deferred_op->data   = aml_op_start;
-                                               deferred_op->length = 0;
-                                       }
-                               }
-                       }
-
-
-                       else {
-                               /* Not a named opcode, just allocate Op and append to parent */
-
-                               op = acpi_ps_alloc_op (opcode);
-                               if (!op) {
-                                       return (AE_NO_MEMORY);
-                               }
-
-
-                               if ((op->opcode == AML_CREATE_FIELD_OP) ||
-                                       (op->opcode == AML_BIT_FIELD_OP)    ||
-                                       (op->opcode == AML_BYTE_FIELD_OP)   ||
-                                       (op->opcode == AML_WORD_FIELD_OP)   ||
-                                       (op->opcode == AML_DWORD_FIELD_OP)) {
-                                       /*
-                                        * Backup to beginning of Create_xXXfield declaration
-                                        * Body_length is unknown until we parse the body
-                                        */
-                                       deferred_op = (ACPI_PARSE2_OBJECT *) op;
-
-                                       deferred_op->data   = aml_op_start;
-                                       deferred_op->length = 0;
-                               }
-
-                               acpi_ps_append_arg (acpi_ps_get_parent_scope (parser_state), op);
-
-                               if ((walk_state->descending_callback != NULL)) {
-                                       /*
-                                        * Find the object.  This will either insert the object into
-                                        * the namespace or simply look it up
-                                        */
-                                       status = walk_state->descending_callback (opcode, op, walk_state, &op);
-                                       status = acpi_ps_next_parse_state (walk_state, op, status);
-                                       if (status == AE_CTRL_PENDING) {
-                                               status = AE_OK;
-                                               goto close_this_op;
-                                       }
-
-                                       if (ACPI_FAILURE (status)) {
-                                               goto close_this_op;
-                                       }
-                               }
-                       }
-
-                       op->aml_offset = aml_offset;
-
-               }
-
-
-               /* Start Arg_count at zero because we don't know if there are any args yet */
-
-               arg_count = 0;
-
-
-               if (arg_types)  /* Are there any arguments that must be processed? */ {
-                       /* get arguments */
-
-                       switch (op->opcode) {
-                       case AML_BYTE_OP:       /* AML_BYTEDATA_ARG */
-                       case AML_WORD_OP:       /* AML_WORDDATA_ARG */
-                       case AML_DWORD_OP:      /* AML_DWORDATA_ARG */
-                       case AML_STRING_OP:     /* AML_ASCIICHARLIST_ARG */
-
-                               /* fill in constant or string argument directly */
-
-                               acpi_ps_get_next_simple_arg (parser_state,
-                                                GET_CURRENT_ARG_TYPE (arg_types), op);
-                               break;
-
-                       case AML_NAMEPATH_OP:   /* AML_NAMESTRING_ARG */
-
-                               acpi_ps_get_next_namepath (parser_state, op, &arg_count, 1);
-                               arg_types = 0;
-                               break;
-
-
-                       default:
-
-                               /* Op is not a constant or string, append each argument */
-
-                               while (GET_CURRENT_ARG_TYPE (arg_types) && !arg_count) {
-                                       aml_offset = parser_state->aml - parser_state->aml_start;
-                                       arg = acpi_ps_get_next_arg (parser_state,
-                                                        GET_CURRENT_ARG_TYPE (arg_types),
-                                                        &arg_count);
-                                       if (arg) {
-                                               arg->aml_offset = aml_offset;
-                                               acpi_ps_append_arg (op, arg);
-                                       }
-
-                                       INCREMENT_ARG_LIST (arg_types);
-                               }
-
-
-                               /* For a method, save the length and address of the body */
-
-                               if (op->opcode == AML_METHOD_OP) {
-                                       deferred_op = acpi_ps_to_extended_op (op);
-                                       if (deferred_op) {
-                                               /*
-                                                * Skip parsing of control method or opregion body,
-                                                * because we don't have enough info in the first pass
-                                                * to parse them correctly.
-                                                */
-
-                                               deferred_op->data   = parser_state->aml;
-                                               deferred_op->length = parser_state->pkg_end -
-                                                                 parser_state->aml;
-
-                                               /*
-                                                * Skip body of method.  For Op_regions, we must continue
-                                                * parsing because the opregion is not a standalone
-                                                * package (We don't know where the end is).
-                                                */
-                                               parser_state->aml   = parser_state->pkg_end;
-                                               arg_count           = 0;
-                                       }
-                               }
-
-                               break;
-                       }
-               }
-
-
-               /*
-                * Zero Arg_count means that all arguments for this op have been processed
-                */
-               if (!arg_count) {
-                       /* completed Op, prepare for next */
-
-                       if (acpi_ps_is_named_op (op->opcode)) {
-                               if (acpi_gbl_depth) {
-                                       acpi_gbl_depth--;
-                               }
-
-                               if (op->opcode == AML_REGION_OP) {
-                                       deferred_op = acpi_ps_to_extended_op (op);
-                                       if (deferred_op) {
-                                               /*
-                                                * Skip parsing of control method or opregion body,
-                                                * because we don't have enough info in the first pass
-                                                * to parse them correctly.
-                                                *
-                                                * Completed parsing an Op_region declaration, we now
-                                                * know the length.
-                                                */
-
-                                               deferred_op->length = parser_state->aml -
-                                                                deferred_op->data;
-                                       }
-                               }
-                       }
-
-                       if ((op->opcode == AML_CREATE_FIELD_OP) ||
-                               (op->opcode == AML_BIT_FIELD_OP)    ||
-                               (op->opcode == AML_BYTE_FIELD_OP)   ||
-                               (op->opcode == AML_WORD_FIELD_OP)   ||
-                               (op->opcode == AML_DWORD_FIELD_OP)  ||
-                               (op->opcode == AML_QWORD_FIELD_OP)) {
-                               /*
-                                * Backup to beginning of Create_xXXfield declaration (1 for
-                                * Opcode)
-                                *
-                                * Body_length is unknown until we parse the body
-                                */
-                               deferred_op = (ACPI_PARSE2_OBJECT *) op;
-                               deferred_op->length = parser_state->aml - deferred_op->data;
-                       }
-
-                       /* This op complete, notify the dispatcher */
-
-                       if (walk_state->ascending_callback != NULL) {
-                               status = walk_state->ascending_callback (walk_state, op);
-                               status = acpi_ps_next_parse_state (walk_state, op, status);
-                               if (status == AE_CTRL_PENDING) {
-                                       status = AE_OK;
-                                       goto close_this_op;
-                               }
-                       }
-
-
-close_this_op:
-
-                       /*
-                        * Finished one argument of the containing scope
-                        */
-                       parser_state->scope->parse_scope.arg_count--;
-
-                       /* Close this Op (may result in parse subtree deletion) */
-
-                       if (acpi_ps_complete_this_op (walk_state, op)) {
-                               op = NULL;
-                       }
-
-
-                       switch (status) {
-                       case AE_OK:
-                               break;
-
-
-                       case AE_CTRL_TRANSFER:
-
-                               /*
-                                * We are about to transfer to a called method.
-                                */
-                               walk_state->prev_op = op;
-                               walk_state->prev_arg_types = arg_types;
-                               return (status);
-                               break;
-
-
-                       case AE_CTRL_END:
-
-                               acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count);
-
-                               status = walk_state->ascending_callback (walk_state, op);
-                               status = acpi_ps_next_parse_state (walk_state, op, status);
-
-                               acpi_ps_complete_this_op (walk_state, op);
-                               op = NULL;
-                               status = AE_OK;
-                               break;
-
-
-                       case AE_CTRL_TERMINATE:
-
-                               status = AE_OK;
-
-                               /* Clean up */
-                               do {
-                                       if (op) {
-                                               acpi_ps_complete_this_op (walk_state, op);
-                                       }
-
-                                       acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count);
-                               } while (op);
-
-                               return (status);
-                               break;
-
-
-                       default:  /* All other non-AE_OK status */
-
-                               if (op == NULL) {
-                                       acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count);
-                               }
-                               walk_state->prev_op = op;
-                               walk_state->prev_arg_types = arg_types;
-
-                               /*
-                                * TEMP:
-                                */
-
-                               return (status);
-                               break;
-                       }
-
-
-                       /* This scope complete? */
-
-                       if (acpi_ps_has_completed_scope (parser_state)) {
-                               acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count);
-                       }
-
-                       else {
-                               op = NULL;
-                       }
-
-               }
-
-
-               /* Arg_count is non-zero */
-
-               else {
-                       /* complex argument, push Op and prepare for argument */
-
-                       acpi_ps_push_scope (parser_state, op, arg_types, arg_count);
-                       op = NULL;
-               }
-
-       } /* while Parser_state->Aml */
-
-
-       /*
-        * Complete the last Op (if not completed), and clear the scope stack.
-        * It is easily possible to end an AML "package" with an unbounded number
-        * of open scopes (such as when several AML blocks are closed with
-        * sequential closing braces).  We want to terminate each one cleanly.
-        */
-
-       do {
-               if (op) {
-                       if (walk_state->ascending_callback != NULL) {
-                               status = walk_state->ascending_callback (walk_state, op);
-                               status = acpi_ps_next_parse_state (walk_state, op, status);
-                               if (status == AE_CTRL_PENDING) {
-                                       status = AE_OK;
-                                       goto close_this_op;
-                               }
-
-                               if (status == AE_CTRL_TERMINATE) {
-                                       status = AE_OK;
-
-                                       /* Clean up */
-                                       do {
-                                               if (op) {
-                                                       acpi_ps_complete_this_op (walk_state, op);
-                                               }
-
-                                               acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count);
-
-                                       } while (op);
-
-                                       return (status);
-                               }
-
-                               else if (ACPI_FAILURE (status)) {
-                                       acpi_ps_complete_this_op (walk_state, op);
-                                       return (status);
-                               }
-                       }
-
-                       acpi_ps_complete_this_op (walk_state, op);
-               }
-
-               acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count);
-
-       } while (op);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_parse_aml
- *
- * PARAMETERS:  Start_scope     - The starting point of the parse.  Becomes the
- *                                root of the parsed op tree.
- *              Aml             - Pointer to the raw AML code to parse
- *              Aml_size        - Length of the AML to parse
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Parse raw AML and return a tree of ops
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ps_parse_aml (
-       ACPI_PARSE_OBJECT       *start_scope,
-       u8                      *aml,
-       u32                     aml_size,
-       u32                     parse_flags,
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **caller_return_desc,
-       ACPI_PARSE_DOWNWARDS    descending_callback,
-       ACPI_PARSE_UPWARDS      ascending_callback)
-{
-       ACPI_STATUS             status;
-       ACPI_PARSE_STATE        *parser_state;
-       ACPI_WALK_STATE         *walk_state;
-       ACPI_WALK_LIST          walk_list;
-       ACPI_NAMESPACE_NODE     *node = NULL;
-       ACPI_WALK_LIST          *prev_walk_list = acpi_gbl_current_walk_list;
-       ACPI_OPERAND_OBJECT     *return_desc;
-       ACPI_OPERAND_OBJECT     *mth_desc = NULL;
-
-
-       /* Create and initialize a new parser state */
-
-       parser_state = acpi_ps_create_state (aml, aml_size);
-       if (!parser_state) {
-               return (AE_NO_MEMORY);
-       }
-
-       acpi_ps_init_scope (parser_state, start_scope);
-
-       if (method_node) {
-               mth_desc = acpi_ns_get_attached_object (method_node);
-       }
-
-       /* Create and initialize a new walk list */
-
-       walk_list.walk_state = NULL;
-       walk_list.acquired_mutex_list.prev = NULL;
-       walk_list.acquired_mutex_list.next = NULL;
-
-       walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, parser_state->start_op, mth_desc, &walk_list);
-       if (!walk_state) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       walk_state->method_node         = method_node;
-       walk_state->parser_state        = parser_state;
-       walk_state->parse_flags         = parse_flags;
-       walk_state->descending_callback = descending_callback;
-       walk_state->ascending_callback  = ascending_callback;
-
-       /* TBD: [Restructure] TEMP until we pass Walk_state to the interpreter
-        */
-       acpi_gbl_current_walk_list = &walk_list;
-
-
-       if (method_node) {
-               parser_state->start_node = method_node;
-               walk_state->walk_type   = WALK_METHOD;
-
-               /* Push start scope on scope stack and make it current  */
-
-               status = acpi_ds_scope_stack_push (method_node, ACPI_TYPE_METHOD, walk_state);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* Init arguments if this is a control method */
-               /* TBD: [Restructure] add walkstate as a param */
-
-               acpi_ds_method_data_init_args (params, MTH_NUM_ARGS, walk_state);
-       }
-
-       else {
-               /* Setup the current scope */
-
-               node = parser_state->start_op->node;
-               parser_state->start_node = node;
-
-               if (node) {
-                       /* Push start scope on scope stack and make it current  */
-
-                       status = acpi_ds_scope_stack_push (node, node->type,
-                                          walk_state);
-                       if (ACPI_FAILURE (status)) {
-                               goto cleanup;
-                       }
-
-               }
-       }
-
-
-       status = AE_OK;
-
-       /*
-        * Execute the walk loop as long as there is a valid Walk State.  This
-        * handles nested control method invocations without recursion.
-        */
-
-       while (walk_state) {
-               if (ACPI_SUCCESS (status)) {
-                       status = acpi_ps_parse_loop (walk_state);
-               }
-
-               if (status == AE_CTRL_TRANSFER) {
-                       /*
-                        * A method call was detected.
-                        * Transfer control to the called control method
-                        */
-
-                       status = acpi_ds_call_control_method (&walk_list, walk_state, NULL);
-
-                       /*
-                        * If the transfer to the new method method call worked, a new walk
-                        * state was created -- get it
-                        */
-
-                       walk_state = acpi_ds_get_current_walk_state (&walk_list);
-                       continue;
-               }
-
-               else if (status == AE_CTRL_TERMINATE) {
-                       status = AE_OK;
-               }
-
-               /* We are done with this walk, move on to the parent if any */
-
-
-               walk_state = acpi_ds_pop_walk_state (&walk_list);
-
-               /* Extract return value before we delete Walk_state */
-
-               return_desc = walk_state->return_desc;
-
-               /* Reset the current scope to the beginning of scope stack */
-
-               acpi_ds_scope_stack_clear (walk_state);
-
-               /*
-                * If we just returned from the execution of a control method,
-                * there's lots of cleanup to do
-                */
-
-               if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) == ACPI_PARSE_EXECUTE) {
-                       acpi_ds_terminate_control_method (walk_state);
-               }
-
-                /* Delete this walk state and all linked control states */
-
-               acpi_ps_cleanup_scope (walk_state->parser_state);
-               acpi_cm_free (walk_state->parser_state);
-               acpi_ds_delete_walk_state (walk_state);
-
-          /* Check if we have restarted a preempted walk */
-
-               walk_state = acpi_ds_get_current_walk_state (&walk_list);
-               if (walk_state &&
-                       ACPI_SUCCESS (status)) {
-                       /* There is another walk state, restart it */
-
-                       /*
-                        * If the method returned value is not used by the parent,
-                        * The object is deleted
-                        */
-
-                       acpi_ds_restart_control_method (walk_state, return_desc);
-                       walk_state->walk_type |= WALK_METHOD_RESTART;
-               }
-
-               /*
-                * Just completed a 1st-level method, save the final internal return
-                * value (if any)
-                */
-
-               else if (caller_return_desc) {
-                       *caller_return_desc = return_desc; /* NULL if no return value */
-               }
-
-               else if (return_desc) {
-                       /* Caller doesn't want it, must delete it */
-
-                       acpi_cm_remove_reference (return_desc);
-               }
-       }
-
-
-       /* Normal exit */
-
-       acpi_aml_release_all_mutexes ((ACPI_OPERAND_OBJECT *) &walk_list.acquired_mutex_list);
-       acpi_gbl_current_walk_list = prev_walk_list;
-       return (status);
-
-
-cleanup:
-
-       /* Cleanup */
-
-       acpi_ds_delete_walk_state (walk_state);
-       acpi_ps_cleanup_scope (parser_state);
-       acpi_cm_free (parser_state);
-
-       acpi_aml_release_all_mutexes ((ACPI_OPERAND_OBJECT *)&walk_list.acquired_mutex_list);
-       acpi_gbl_current_walk_list = prev_walk_list;
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/parser/psscope.c b/reactos/drivers/bus/acpi/parser/psscope.c
deleted file mode 100644 (file)
index 77ff1b4..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-/******************************************************************************
- *
- * Module Name: psscope - Parser scope stack management routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_PARSER
-        MODULE_NAME         ("psscope")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_parent_scope
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *
- * RETURN:      Pointer to an Op object
- *
- * DESCRIPTION: Get parent of current op being parsed
- *
- ******************************************************************************/
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_parent_scope (
-       ACPI_PARSE_STATE        *parser_state)
-{
-       return (parser_state->scope->parse_scope.op);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_has_completed_scope
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *
- * RETURN:      Boolean, TRUE = scope completed.
- *
- * DESCRIPTION: Is parsing of current argument complete?  Determined by
- *              1) AML pointer is at or beyond the end of the scope
- *              2) The scope argument count has reached zero.
- *
- ******************************************************************************/
-
-u8
-acpi_ps_has_completed_scope (
-       ACPI_PARSE_STATE        *parser_state)
-{
-       return ((u8) ((parser_state->aml >= parser_state->scope->parse_scope.arg_end ||
-                          !parser_state->scope->parse_scope.arg_count)));
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_init_scope
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *              Root                - the Root Node of this new scope
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Allocate and init a new scope object
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ps_init_scope (
-       ACPI_PARSE_STATE        *parser_state,
-       ACPI_PARSE_OBJECT       *root_op)
-{
-       ACPI_GENERIC_STATE      *scope;
-
-
-       scope = acpi_cm_create_generic_state ();
-       if (!scope) {
-               return (AE_NO_MEMORY);
-       }
-
-       scope->parse_scope.op       = root_op;
-       scope->parse_scope.arg_count = ACPI_VAR_ARGS;
-       scope->parse_scope.arg_end  = parser_state->aml_end;
-       scope->parse_scope.pkg_end  = parser_state->aml_end;
-
-       parser_state->scope         = scope;
-       parser_state->start_op      = root_op;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_push_scope
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *              Op                  - Current op to be pushed
- *              Remaining_args      - List of args remaining
- *              Arg_count           - Fixed or variable number of args
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Push current op to begin parsing its argument
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ps_push_scope (
-       ACPI_PARSE_STATE        *parser_state,
-       ACPI_PARSE_OBJECT       *op,
-       u32                     remaining_args,
-       u32                     arg_count)
-{
-       ACPI_GENERIC_STATE      *scope;
-
-
-       scope = acpi_cm_create_generic_state ();
-       if (!scope) {
-               return (AE_NO_MEMORY);
-       }
-
-
-       scope->parse_scope.op          = op;
-       scope->parse_scope.arg_list    = remaining_args;
-       scope->parse_scope.arg_count   = arg_count;
-       scope->parse_scope.pkg_end     = parser_state->pkg_end;
-
-       /* Push onto scope stack */
-
-       acpi_cm_push_generic_state (&parser_state->scope, scope);
-
-
-       if (arg_count == ACPI_VAR_ARGS) {
-               /* multiple arguments */
-
-               scope->parse_scope.arg_end = parser_state->pkg_end;
-       }
-
-       else {
-               /* single argument */
-
-               scope->parse_scope.arg_end = ACPI_MAX_AML;
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_pop_scope
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *              Op                  - Where the popped op is returned
- *              Arg_list            - Where the popped "next argument" is
- *                                    returned
- *              Arg_count           - Count of objects in Arg_list
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Return to parsing a previous op
- *
- ******************************************************************************/
-
-void
-acpi_ps_pop_scope (
-       ACPI_PARSE_STATE        *parser_state,
-       ACPI_PARSE_OBJECT       **op,
-       u32                     *arg_list,
-       u32                     *arg_count)
-{
-       ACPI_GENERIC_STATE      *scope = parser_state->scope;
-
-
-       /*
-        * Only pop the scope if there is in fact a next scope
-        */
-       if (scope->common.next) {
-               scope = acpi_cm_pop_generic_state (&parser_state->scope);
-
-
-               /* return to parsing previous op */
-
-               *op                     = scope->parse_scope.op;
-               *arg_list               = scope->parse_scope.arg_list;
-               *arg_count              = scope->parse_scope.arg_count;
-               parser_state->pkg_end   = scope->parse_scope.pkg_end;
-
-               /* All done with this scope state structure */
-
-               acpi_cm_delete_generic_state (scope);
-       }
-
-       else {
-               /* empty parse stack, prepare to fetch next opcode */
-
-               *op                     = NULL;
-               *arg_list               = 0;
-               *arg_count              = 0;
-       }
-
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_cleanup_scope
- *
- * PARAMETERS:  Parser_state        - Current parser state object
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Destroy available list, remaining stack levels, and return
- *              root scope
- *
- ******************************************************************************/
-
-void
-acpi_ps_cleanup_scope (
-       ACPI_PARSE_STATE        *parser_state)
-{
-       ACPI_GENERIC_STATE      *scope;
-
-
-       if (!parser_state) {
-               return;
-       }
-
-
-       /* Delete anything on the scope stack */
-
-       while (parser_state->scope) {
-               scope = acpi_cm_pop_generic_state (&parser_state->scope);
-               acpi_cm_delete_generic_state (scope);
-       }
-
-       return;
-}
-
diff --git a/reactos/drivers/bus/acpi/parser/pstree.c b/reactos/drivers/bus/acpi/parser/pstree.c
deleted file mode 100644 (file)
index 9260fca..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-/******************************************************************************
- *
- * Module Name: pstree - Parser op tree manipulation/traversal/search
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_PARSER
-        MODULE_NAME         ("pstree")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_arg
- *
- * PARAMETERS:  Op              - Get an argument for this op
- *              Argn            - Nth argument to get
- *
- * RETURN:      The argument (as an Op object).  NULL if argument does not exist
- *
- * DESCRIPTION: Get the specified op's argument.
- *
- ******************************************************************************/
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_arg (
-       ACPI_PARSE_OBJECT       *op,
-       u32                     argn)
-{
-       ACPI_PARSE_OBJECT       *arg = NULL;
-       ACPI_OPCODE_INFO        *op_info;
-
-
-       /* Get the info structure for this opcode */
-
-       op_info = acpi_ps_get_opcode_info (op->opcode);
-       if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) {
-               /* Invalid opcode or ASCII character */
-
-               return (NULL);
-       }
-
-       /* Check if this opcode requires argument sub-objects */
-
-       if (!(ACPI_GET_OP_ARGS (op_info))) {
-               /* Has no linked argument objects */
-
-               return (NULL);
-       }
-
-       /* Get the requested argument object */
-
-       arg = op->value.arg;
-       while (arg && argn) {
-               argn--;
-               arg = arg->next;
-       }
-
-       return (arg);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_append_arg
- *
- * PARAMETERS:  Op              - Append an argument to this Op.
- *              Arg             - Argument Op to append
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Append an argument to an op's argument list (a NULL arg is OK)
- *
- ******************************************************************************/
-
-void
-acpi_ps_append_arg (
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_PARSE_OBJECT       *arg)
-{
-       ACPI_PARSE_OBJECT       *prev_arg;
-       ACPI_OPCODE_INFO        *op_info;
-
-
-       if (!op) {
-               return;
-       }
-
-       /* Get the info structure for this opcode */
-
-       op_info = acpi_ps_get_opcode_info (op->opcode);
-       if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) {
-               /* Invalid opcode */
-
-               return;
-       }
-
-       /* Check if this opcode requires argument sub-objects */
-
-       if (!(ACPI_GET_OP_ARGS (op_info))) {
-               /* Has no linked argument objects */
-
-               return;
-       }
-
-
-       /* Append the argument to the linked argument list */
-
-       if (op->value.arg) {
-               /* Append to existing argument list */
-
-               prev_arg = op->value.arg;
-               while (prev_arg->next) {
-                       prev_arg = prev_arg->next;
-               }
-               prev_arg->next = arg;
-       }
-
-       else {
-               /* No argument list, this will be the first argument */
-
-               op->value.arg = arg;
-       }
-
-
-       /* Set the parent in this arg and any args linked after it */
-
-       while (arg) {
-               arg->parent = op;
-               arg = arg->next;
-       }
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_child
- *
- * PARAMETERS:  Op              - Get the child of this Op
- *
- * RETURN:      Child Op, Null if none is found.
- *
- * DESCRIPTION: Get op's children or NULL if none
- *
- ******************************************************************************/
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_child (
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_PARSE_OBJECT       *child = NULL;
-
-
-       switch (op->opcode) {
-       case AML_SCOPE_OP:
-       case AML_ELSE_OP:
-       case AML_DEVICE_OP:
-       case AML_THERMAL_ZONE_OP:
-       case AML_METHODCALL_OP:
-
-               child = acpi_ps_get_arg (op, 0);
-               break;
-
-
-       case AML_BUFFER_OP:
-       case AML_PACKAGE_OP:
-       case AML_METHOD_OP:
-       case AML_IF_OP:
-       case AML_WHILE_OP:
-       case AML_DEF_FIELD_OP:
-
-               child = acpi_ps_get_arg (op, 1);
-               break;
-
-
-       case AML_POWER_RES_OP:
-       case AML_INDEX_FIELD_OP:
-
-               child = acpi_ps_get_arg (op, 2);
-               break;
-
-
-       case AML_PROCESSOR_OP:
-       case AML_BANK_FIELD_OP:
-
-               child = acpi_ps_get_arg (op, 3);
-               break;
-
-       }
-
-       return (child);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_depth_next
- *
- * PARAMETERS:  Origin          - Root of subtree to search
- *              Op              - Last (previous) Op that was found
- *
- * RETURN:      Next Op found in the search.
- *
- * DESCRIPTION: Get next op in tree (walking the tree in depth-first order)
- *              Return NULL when reaching "origin" or when walking up from root
- *
- ******************************************************************************/
-
-ACPI_PARSE_OBJECT *
-acpi_ps_get_depth_next (
-       ACPI_PARSE_OBJECT       *origin,
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_PARSE_OBJECT       *next = NULL;
-       ACPI_PARSE_OBJECT       *parent;
-       ACPI_PARSE_OBJECT       *arg;
-
-
-       if (!op) {
-               return (NULL);
-       }
-
-       /* look for an argument or child */
-
-       next = acpi_ps_get_arg (op, 0);
-       if (next) {
-               return (next);
-       }
-
-       /* look for a sibling */
-
-       next = op->next;
-       if (next) {
-               return (next);
-       }
-
-       /* look for a sibling of parent */
-
-       parent = op->parent;
-
-       while (parent) {
-               arg = acpi_ps_get_arg (parent, 0);
-               while (arg && (arg != origin) && (arg != op)) {
-                       arg = arg->next;
-               }
-
-               if (arg == origin) {
-                       /* reached parent of origin, end search */
-
-                       return (NULL);
-               }
-
-               if (parent->next) {
-                       /* found sibling of parent */
-                       return (parent->next);
-               }
-
-               op = parent;
-               parent = parent->parent;
-       }
-
-       return (next);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/parser/psutils.c b/reactos/drivers/bus/acpi/parser/psutils.c
deleted file mode 100644 (file)
index 6b331a5..0000000
+++ /dev/null
@@ -1,554 +0,0 @@
-/******************************************************************************
- *
- * Module Name: psutils - Parser miscellaneous utilities (Parser only)
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_PARSER
-        MODULE_NAME         ("psutils")
-
-
-#define PARSEOP_GENERIC     0x01
-#define PARSEOP_NAMED       0x02
-#define PARSEOP_DEFERRED    0x03
-#define PARSEOP_BYTELIST    0x04
-#define PARSEOP_IN_CACHE    0x80
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_init_op
- *
- * PARAMETERS:  Op              - A newly allocated Op object
- *              Opcode          - Opcode to store in the Op
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
- *              opcode
- *
- ******************************************************************************/
-
-void
-acpi_ps_init_op (
-       ACPI_PARSE_OBJECT       *op,
-       u16                     opcode)
-{
-       ACPI_OPCODE_INFO        *aml_op;
-
-
-       op->data_type = ACPI_DESC_TYPE_PARSER;
-       op->opcode = opcode;
-
-       aml_op = acpi_ps_get_opcode_info (opcode);
-
-       DEBUG_ONLY_MEMBERS (STRNCPY (op->op_name, aml_op->name,
-                          sizeof (op->op_name)));
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_alloc_op
- *
- * PARAMETERS:  Opcode          - Opcode that will be stored in the new Op
- *
- * RETURN:      Pointer to the new Op.
- *
- * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
- *              opcode.  A cache of opcodes is available for the pure
- *              GENERIC_OP, since this is by far the most commonly used.
- *
- ******************************************************************************/
-
-ACPI_PARSE_OBJECT*
-acpi_ps_alloc_op (
-       u16                     opcode)
-{
-       ACPI_PARSE_OBJECT       *op = NULL;
-       u32                     size;
-       u8                      flags;
-
-
-       /* Allocate the minimum required size object */
-
-       if (acpi_ps_is_deferred_op (opcode)) {
-               size = sizeof (ACPI_PARSE2_OBJECT);
-               flags = PARSEOP_DEFERRED;
-       }
-
-       else if (acpi_ps_is_named_op (opcode)) {
-               size = sizeof (ACPI_PARSE2_OBJECT);
-               flags = PARSEOP_NAMED;
-       }
-
-       else if (acpi_ps_is_bytelist_op (opcode)) {
-               size = sizeof (ACPI_PARSE2_OBJECT);
-               flags = PARSEOP_BYTELIST;
-       }
-
-       else {
-               size = sizeof (ACPI_PARSE_OBJECT);
-               flags = PARSEOP_GENERIC;
-       }
-
-
-       if (size == sizeof (ACPI_PARSE_OBJECT)) {
-               /*
-                * The generic op is by far the most common (16 to 1), and therefore
-                * the op cache is implemented with this type.
-                *
-                * Check if there is an Op already available in the cache
-                */
-
-               acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-               acpi_gbl_parse_cache_requests++;
-               if (acpi_gbl_parse_cache) {
-                       /* Extract an op from the front of the cache list */
-
-                       acpi_gbl_parse_cache_depth--;
-                       acpi_gbl_parse_cache_hits++;
-
-                       op = acpi_gbl_parse_cache;
-                       acpi_gbl_parse_cache = op->next;
-
-
-                       /* Clear the previously used Op */
-
-                       MEMSET (op, 0, sizeof (ACPI_PARSE_OBJECT));
-
-               }
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-       }
-
-       else {
-               /*
-                * The generic op is by far the most common (16 to 1), and therefore
-                * the op cache is implemented with this type.
-                *
-                * Check if there is an Op already available in the cache
-                */
-
-               acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-               acpi_gbl_ext_parse_cache_requests++;
-               if (acpi_gbl_ext_parse_cache) {
-                       /* Extract an op from the front of the cache list */
-
-                       acpi_gbl_ext_parse_cache_depth--;
-                       acpi_gbl_ext_parse_cache_hits++;
-
-                       op = (ACPI_PARSE_OBJECT *) acpi_gbl_ext_parse_cache;
-                       acpi_gbl_ext_parse_cache = (ACPI_PARSE2_OBJECT *) op->next;
-
-
-                       /* Clear the previously used Op */
-
-                       MEMSET (op, 0, sizeof (ACPI_PARSE2_OBJECT));
-
-               }
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-       }
-
-
-       /* Allocate a new Op if necessary */
-
-       if (!op) {
-               op = acpi_cm_callocate (size);
-       }
-
-       /* Initialize the Op */
-       if (op) {
-               acpi_ps_init_op (op, opcode);
-               op->flags = flags;
-       }
-
-       return (op);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_free_op
- *
- * PARAMETERS:  Op              - Op to be freed
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Free an Op object.  Either put it on the GENERIC_OP cache list
- *              or actually free it.
- *
- ******************************************************************************/
-
-void
-acpi_ps_free_op (
-       ACPI_PARSE_OBJECT       *op)
-{
-
-
-
-       if (op->flags == PARSEOP_GENERIC) {
-               /* Is the cache full? */
-
-               if (acpi_gbl_parse_cache_depth < MAX_PARSE_CACHE_DEPTH) {
-                       /* Put a GENERIC_OP back into the cache */
-
-                       /* Clear the previously used Op */
-
-                       MEMSET (op, 0, sizeof (ACPI_PARSE_OBJECT));
-                       op->flags = PARSEOP_IN_CACHE;
-
-                       acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-                       acpi_gbl_parse_cache_depth++;
-
-                       op->next = acpi_gbl_parse_cache;
-                       acpi_gbl_parse_cache = op;
-
-                       acpi_cm_release_mutex (ACPI_MTX_CACHES);
-                       return;
-               }
-       }
-
-       else {
-               /* Is the cache full? */
-
-               if (acpi_gbl_ext_parse_cache_depth < MAX_EXTPARSE_CACHE_DEPTH) {
-                       /* Put a GENERIC_OP back into the cache */
-
-                       /* Clear the previously used Op */
-
-                       MEMSET (op, 0, sizeof (ACPI_PARSE2_OBJECT));
-                       op->flags = PARSEOP_IN_CACHE;
-
-                       acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-                       acpi_gbl_ext_parse_cache_depth++;
-
-                       op->next = (ACPI_PARSE_OBJECT *) acpi_gbl_ext_parse_cache;
-                       acpi_gbl_ext_parse_cache = (ACPI_PARSE2_OBJECT *) op;
-
-                       acpi_cm_release_mutex (ACPI_MTX_CACHES);
-                       return;
-               }
-       }
-
-
-       /*
-        * Not a GENERIC OP, or the cache is full, just free the Op
-        */
-
-       acpi_cm_free (op);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_delete_parse_cache
- *
- * PARAMETERS:  None
- *
- * RETURN:      None
- *
- * DESCRIPTION: Free all objects that are on the parse cache list.
- *
- ******************************************************************************/
-
-void
-acpi_ps_delete_parse_cache (
-       void)
-{
-       ACPI_PARSE_OBJECT       *next;
-
-
-       /* Traverse the global cache list */
-
-       while (acpi_gbl_parse_cache) {
-               /* Delete one cached state object */
-
-               next = acpi_gbl_parse_cache->next;
-               acpi_cm_free (acpi_gbl_parse_cache);
-               acpi_gbl_parse_cache = next;
-               acpi_gbl_parse_cache_depth--;
-       }
-
-       /* Traverse the global cache list */
-
-       while (acpi_gbl_ext_parse_cache) {
-               /* Delete one cached state object */
-
-               next = acpi_gbl_ext_parse_cache->next;
-               acpi_cm_free (acpi_gbl_ext_parse_cache);
-               acpi_gbl_ext_parse_cache = (ACPI_PARSE2_OBJECT *) next;
-               acpi_gbl_ext_parse_cache_depth--;
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Utility functions
- *
- * DESCRIPTION: Low level functions
- *
- * TBD: [Restructure]
- * 1) Some of these functions should be macros
- * 2) Some can be simplified
- *
- ******************************************************************************/
-
-
-/*
- * Is "c" a namestring lead character?
- */
-
-
-u8
-acpi_ps_is_leading_char (
-       u32                     c)
-{
-       return ((u8) (c == '_' || (c >= 'A' && c <= 'Z')));
-}
-
-
-/*
- * Is "c" a namestring prefix character?
- */
-u8
-acpi_ps_is_prefix_char (
-       u32                     c)
-{
-       return ((u8) (c == '\\' || c == '^'));
-}
-
-
-u8
-acpi_ps_is_namespace_object_op (
-       u16                     opcode)
-{
-       return ((u8)
-                  (opcode == AML_SCOPE_OP          ||
-                       opcode == AML_DEVICE_OP         ||
-                       opcode == AML_THERMAL_ZONE_OP   ||
-                       opcode == AML_METHOD_OP         ||
-                       opcode == AML_POWER_RES_OP      ||
-                       opcode == AML_PROCESSOR_OP      ||
-                       opcode == AML_DEF_FIELD_OP      ||
-                       opcode == AML_INDEX_FIELD_OP    ||
-                       opcode == AML_BANK_FIELD_OP     ||
-                       opcode == AML_NAMEDFIELD_OP     ||
-                       opcode == AML_NAME_OP           ||
-                       opcode == AML_ALIAS_OP          ||
-                       opcode == AML_MUTEX_OP          ||
-                       opcode == AML_EVENT_OP          ||
-                       opcode == AML_REGION_OP         ||
-                       opcode == AML_CREATE_FIELD_OP   ||
-                       opcode == AML_BIT_FIELD_OP      ||
-                       opcode == AML_BYTE_FIELD_OP     ||
-                       opcode == AML_WORD_FIELD_OP     ||
-                       opcode == AML_DWORD_FIELD_OP    ||
-                       opcode == AML_METHODCALL_OP     ||
-                       opcode == AML_NAMEPATH_OP));
-}
-
-u8
-acpi_ps_is_namespace_op (
-       u16                     opcode)
-{
-       return ((u8)
-                  (opcode == AML_SCOPE_OP          ||
-                       opcode == AML_DEVICE_OP         ||
-                       opcode == AML_THERMAL_ZONE_OP   ||
-                       opcode == AML_METHOD_OP         ||
-                       opcode == AML_POWER_RES_OP      ||
-                       opcode == AML_PROCESSOR_OP      ||
-                       opcode == AML_DEF_FIELD_OP      ||
-                       opcode == AML_INDEX_FIELD_OP    ||
-                       opcode == AML_BANK_FIELD_OP     ||
-                       opcode == AML_NAME_OP           ||
-                       opcode == AML_ALIAS_OP          ||
-                       opcode == AML_MUTEX_OP          ||
-                       opcode == AML_EVENT_OP          ||
-                       opcode == AML_REGION_OP         ||
-                       opcode == AML_NAMEDFIELD_OP));
-}
-
-
-/*
- * Is opcode for a named object Op?
- * (Includes all named object opcodes)
- *
- * TBD: [Restructure] Need a better way than this brute force approach!
- */
-u8
-acpi_ps_is_node_op (
-       u16                     opcode)
-{
-       return ((u8)
-                  (opcode == AML_SCOPE_OP          ||
-                       opcode == AML_DEVICE_OP         ||
-                       opcode == AML_THERMAL_ZONE_OP   ||
-                       opcode == AML_METHOD_OP         ||
-                       opcode == AML_POWER_RES_OP      ||
-                       opcode == AML_PROCESSOR_OP      ||
-                       opcode == AML_NAMEDFIELD_OP     ||
-                       opcode == AML_NAME_OP           ||
-                       opcode == AML_ALIAS_OP          ||
-                       opcode == AML_MUTEX_OP          ||
-                       opcode == AML_EVENT_OP          ||
-                       opcode == AML_REGION_OP         ||
-
-
-                       opcode == AML_CREATE_FIELD_OP   ||
-                       opcode == AML_BIT_FIELD_OP      ||
-                       opcode == AML_BYTE_FIELD_OP     ||
-                       opcode == AML_WORD_FIELD_OP     ||
-                       opcode == AML_DWORD_FIELD_OP    ||
-                       opcode == AML_METHODCALL_OP     ||
-                       opcode == AML_NAMEPATH_OP));
-}
-
-
-/*
- * Is opcode for a named Op?
- */
-u8
-acpi_ps_is_named_op (
-       u16                     opcode)
-{
-       return ((u8)
-                  (opcode == AML_SCOPE_OP          ||
-                       opcode == AML_DEVICE_OP         ||
-                       opcode == AML_THERMAL_ZONE_OP   ||
-                       opcode == AML_METHOD_OP         ||
-                       opcode == AML_POWER_RES_OP      ||
-                       opcode == AML_PROCESSOR_OP      ||
-                       opcode == AML_NAME_OP           ||
-                       opcode == AML_ALIAS_OP          ||
-                       opcode == AML_MUTEX_OP          ||
-                       opcode == AML_EVENT_OP          ||
-                       opcode == AML_REGION_OP         ||
-                       opcode == AML_NAMEDFIELD_OP));
-}
-
-
-u8
-acpi_ps_is_deferred_op (
-       u16                     opcode)
-{
-       return ((u8)
-                  (opcode == AML_METHOD_OP         ||
-                       opcode == AML_CREATE_FIELD_OP   ||
-                       opcode == AML_BIT_FIELD_OP      ||
-                       opcode == AML_BYTE_FIELD_OP     ||
-                       opcode == AML_WORD_FIELD_OP     ||
-                       opcode == AML_DWORD_FIELD_OP    ||
-                       opcode == AML_REGION_OP));
-}
-
-
-/*
- * Is opcode for a bytelist?
- */
-u8
-acpi_ps_is_bytelist_op (
-       u16                     opcode)
-{
-       return ((u8) (opcode == AML_BYTELIST_OP));
-}
-
-
-/*
- * Is opcode for a Field, Index_field, or Bank_field
- */
-u8
-acpi_ps_is_field_op (
-       u16                     opcode)
-{
-       return ((u8)
-                         (opcode == AML_CREATE_FIELD_OP
-                       || opcode == AML_DEF_FIELD_OP
-                       || opcode == AML_INDEX_FIELD_OP
-                       || opcode == AML_BANK_FIELD_OP));
-}
-
-
-/*
- * Is field creation op
- */
-u8
-acpi_ps_is_create_field_op (
-       u16                     opcode)
-{
-       return ((u8)
-                  (opcode == AML_CREATE_FIELD_OP   ||
-                       opcode == AML_BIT_FIELD_OP      ||
-                       opcode == AML_BYTE_FIELD_OP     ||
-                       opcode == AML_WORD_FIELD_OP     ||
-                       opcode == AML_DWORD_FIELD_OP));
-}
-
-
-/*
- * Cast an acpi_op to an acpi_extended_op if possible
- */
-
-/* TBD: This is very inefficient, fix */
-ACPI_PARSE2_OBJECT *
-acpi_ps_to_extended_op (
-       ACPI_PARSE_OBJECT       *op)
-{
-       return ((acpi_ps_is_deferred_op (op->opcode) || acpi_ps_is_named_op (op->opcode) || acpi_ps_is_bytelist_op (op->opcode))
-                       ? ( (ACPI_PARSE2_OBJECT *) op) : NULL);
-}
-
-
-/*
- * Get op's name (4-byte name segment) or 0 if unnamed
- */
-u32
-acpi_ps_get_name (
-       ACPI_PARSE_OBJECT       *op)
-{
-       ACPI_PARSE2_OBJECT      *named = acpi_ps_to_extended_op (op);
-
-       return (named ? named->name : 0);
-}
-
-
-/*
- * Set op's name
- */
-void
-acpi_ps_set_name (
-       ACPI_PARSE_OBJECT       *op,
-       u32                     name)
-{
-       ACPI_PARSE2_OBJECT      *named = acpi_ps_to_extended_op (op);
-
-       if (named) {
-               named->name = name;
-       }
-}
-
diff --git a/reactos/drivers/bus/acpi/parser/pswalk.c b/reactos/drivers/bus/acpi/parser/pswalk.c
deleted file mode 100644 (file)
index f2a90dd..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-/******************************************************************************
- *
- * Module Name: pswalk - Parser routines to walk parsed op tree(s)
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_PARSER
-        MODULE_NAME         ("pswalk")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_get_next_walk_op
- *
- * PARAMETERS:  Walk_state          - Current state of the walk
- *              Op                  - Current Op to be walked
- *              Ascending_callback  - Procedure called when Op is complete
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get the next Op in a walk of the parse tree.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_ps_get_next_walk_op (
-       ACPI_WALK_STATE         *walk_state,
-       ACPI_PARSE_OBJECT       *op,
-       ACPI_PARSE_UPWARDS      ascending_callback)
-{
-       ACPI_PARSE_OBJECT       *next;
-       ACPI_PARSE_OBJECT       *parent;
-       ACPI_PARSE_OBJECT       *grand_parent;
-       ACPI_STATUS             status;
-
-
-       /* Check for a argument only if we are descending in the tree */
-
-       if (walk_state->next_op_info != NEXT_OP_UPWARD) {
-               /* Look for an argument or child of the current op */
-
-               next = acpi_ps_get_arg (op, 0);
-               if (next) {
-                       /* Still going downward in tree (Op is not completed yet) */
-
-                       walk_state->prev_op     = op;
-                       walk_state->next_op     = next;
-                       walk_state->next_op_info = NEXT_OP_DOWNWARD;
-
-                       return (AE_OK);
-               }
-
-
-               /*
-                * No more children, this Op is complete.  Save Next and Parent
-                * in case the Op object gets deleted by the callback routine
-                */
-
-               next    = op->next;
-               parent  = op->parent;
-
-               status = ascending_callback (walk_state, op);
-
-               /*
-                * If we are back to the starting point, the walk is complete.
-                */
-               if (op == walk_state->origin) {
-                       /* Reached the point of origin, the walk is complete */
-
-                       walk_state->prev_op     = op;
-                       walk_state->next_op     = NULL;
-
-                       return (status);
-               }
-
-               /*
-                * Check for a sibling to the current op.  A sibling means
-                * we are still going "downward" in the tree.
-                */
-
-               if (next) {
-                       /* There is a sibling, it will be next */
-
-                       walk_state->prev_op     = op;
-                       walk_state->next_op     = next;
-                       walk_state->next_op_info = NEXT_OP_DOWNWARD;
-
-                       /* Continue downward */
-
-                       return (status);
-               }
-
-
-               /*
-                * Drop into the loop below because we are moving upwards in
-                * the tree
-                */
-       }
-
-       else {
-               /*
-                * We are resuming a walk, and we were (are) going upward in the tree.
-                * So, we want to drop into the parent loop below.
-                */
-
-               parent = op;
-       }
-
-
-       /*
-        * Look for a sibling of the current Op's parent
-        * Continue moving up the tree until we find a node that has not been
-        * visited, or we get back to where we started.
-        */
-       while (parent) {
-               /* We are moving up the tree, therefore this parent Op is complete */
-
-               grand_parent = parent->parent;
-               next        = parent->next;
-
-               status = ascending_callback (walk_state, parent);
-
-               /*
-                * If we are back to the starting point, the walk is complete.
-                */
-               if (parent == walk_state->origin) {
-                       /* Reached the point of origin, the walk is complete */
-
-                       walk_state->prev_op     = parent;
-                       walk_state->next_op     = NULL;
-
-                       return (status);
-               }
-
-               /*
-                * If there is a sibling to this parent (it is not the starting point
-                * Op), then we will visit it.
-                */
-               if (next) {
-                       /* found sibling of parent */
-
-                       walk_state->prev_op     = parent;
-                       walk_state->next_op     = next;
-                       walk_state->next_op_info = NEXT_OP_DOWNWARD;
-
-                       return (status);
-               }
-
-               /* No siblings, no errors, just move up one more level in the tree */
-
-               op                  = parent;
-               parent              = grand_parent;
-               walk_state->prev_op = op;
-       }
-
-
-       /* Got all the way to the top of the tree, we must be done! */
-       /* However, the code should have terminated in the loop above */
-
-       walk_state->next_op     = NULL;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_delete_completed_op
- *
- * PARAMETERS:  State           - Walk state
- *              Op              - Completed op
- *
- * RETURN:      AE_OK
- *
- * DESCRIPTION: Callback function for Acpi_ps_get_next_walk_op(). Used during
- *              Acpi_ps_delete_parse tree to delete Op objects when all sub-objects
- *              have been visited (and deleted.)
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_ps_delete_completed_op (
-       ACPI_WALK_STATE         *state,
-       ACPI_PARSE_OBJECT       *op)
-{
-
-       acpi_ps_free_op (op);
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_ps_delete_parse_tree
- *
- * PARAMETERS:  Subtree_root        - Root of tree (or subtree) to delete
- *
- * RETURN:      None
- *
- * DESCRIPTION: Delete a portion of or an entire parse tree.
- *
- ******************************************************************************/
-
-void
-acpi_ps_delete_parse_tree (
-       ACPI_PARSE_OBJECT       *subtree_root)
-{
-       ACPI_WALK_STATE         *walk_state;
-       ACPI_WALK_LIST          walk_list;
-
-
-       if (!subtree_root) {
-               return;
-       }
-
-       /* Create and initialize a new walk list */
-
-       walk_list.walk_state = NULL;
-       walk_list.acquired_mutex_list.prev = NULL;
-       walk_list.acquired_mutex_list.next = NULL;
-
-       walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, NULL, NULL, &walk_list);
-       if (!walk_state) {
-               return;
-       }
-
-       walk_state->parser_state        = NULL;
-       walk_state->parse_flags         = 0;
-       walk_state->descending_callback = NULL;
-       walk_state->ascending_callback  = NULL;
-
-
-       walk_state->origin = subtree_root;
-       walk_state->next_op = subtree_root;
-
-
-       /* Head downward in the tree */
-
-       walk_state->next_op_info = NEXT_OP_DOWNWARD;
-
-       /* Visit all nodes in the subtree */
-
-       while (walk_state->next_op) {
-               acpi_ps_get_next_walk_op (walk_state, walk_state->next_op,
-                                acpi_ps_delete_completed_op);
-       }
-
-       /* We are done with this walk */
-
-       acpi_aml_release_all_mutexes ((ACPI_OPERAND_OBJECT *) &walk_list.acquired_mutex_list);
-       acpi_ds_delete_walk_state (walk_state);
-
-       return;
-}
-
-
diff --git a/reactos/drivers/bus/acpi/parser/psxface.c b/reactos/drivers/bus/acpi/parser/psxface.c
deleted file mode 100644 (file)
index ee25e84..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/******************************************************************************
- *
- * Module Name: psxface - Parser external interfaces
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_PARSER
-        MODULE_NAME         ("psxface")
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_psx_execute
- *
- * PARAMETERS:  Method_node         - A method object containing both the AML
- *                                    address and length.
- *              **Params            - List of parameters to pass to method,
- *                                    terminated by NULL. Params itself may be
- *                                    NULL if no parameters are being passed.
- *              **Return_obj_desc   - Return object from execution of the
- *                                    method.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Execute a control method
- *
- ****************************************************************************/
-
-ACPI_STATUS
-acpi_psx_execute (
-       ACPI_NAMESPACE_NODE     *method_node,
-       ACPI_OPERAND_OBJECT     **params,
-       ACPI_OPERAND_OBJECT     **return_obj_desc)
-{
-       ACPI_STATUS             status;
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       u32                     i;
-       ACPI_PARSE_OBJECT       *op;
-
-
-       /* Validate the Node and get the attached object */
-
-       if (!method_node) {
-               return (AE_NULL_ENTRY);
-       }
-
-       obj_desc = acpi_ns_get_attached_object (method_node);
-       if (!obj_desc) {
-               return (AE_NULL_OBJECT);
-       }
-
-       /* Init for new method, wait on concurrency semaphore */
-
-       status = acpi_ds_begin_method_execution (method_node, obj_desc, NULL);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       if (params) {
-               /*
-                * The caller "owns" the parameters, so give each one an extra
-                * reference
-                */
-
-               for (i = 0; params[i]; i++) {
-                       acpi_cm_add_reference (params[i]);
-               }
-       }
-
-       /*
-        * Perform the first pass parse of the method to enter any
-        * named objects that it creates into the namespace
-        */
-
-       /* Create and init a Root Node */
-
-       op = acpi_ps_alloc_op (AML_SCOPE_OP);
-       if (!op) {
-               return (AE_NO_MEMORY);
-       }
-
-       status = acpi_ps_parse_aml (op, obj_desc->method.pcode,
-                         obj_desc->method.pcode_length,
-                         ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE,
-                         method_node, params, return_obj_desc,
-                         acpi_ds_load1_begin_op, acpi_ds_load1_end_op);
-       acpi_ps_delete_parse_tree (op);
-
-       /* Create and init a Root Node */
-
-       op = acpi_ps_alloc_op (AML_SCOPE_OP);
-       if (!op) {
-               return (AE_NO_MEMORY);
-       }
-
-
-       /* Init new op with the method name and pointer back to the NS node */
-
-       acpi_ps_set_name (op, method_node->name);
-       op->node = method_node;
-
-       /*
-        * The walk of the parse tree is where we actually execute the method
-        */
-       status = acpi_ps_parse_aml (op, obj_desc->method.pcode,
-                         obj_desc->method.pcode_length,
-                         ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE,
-                         method_node, params, return_obj_desc,
-                         acpi_ds_exec_begin_op, acpi_ds_exec_end_op);
-       acpi_ps_delete_parse_tree (op);
-
-       if (params) {
-               /* Take away the extra reference that we gave the parameters above */
-
-               for (i = 0; params[i]; i++) {
-                       acpi_cm_update_object_reference (params[i], REF_DECREMENT);
-               }
-       }
-
-
-       /*
-        * Normal exit is with Status == AE_RETURN_VALUE when a Return_op has been
-        * executed, or with Status == AE_PENDING at end of AML block (end of
-        * Method code)
-        */
-
-       if (*return_obj_desc) {
-               status = AE_CTRL_RETURN_VALUE;
-       }
-
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/resource/rsaddr.c b/reactos/drivers/bus/acpi/resource/rsaddr.c
deleted file mode 100644 (file)
index 5fdb638..0000000
+++ /dev/null
@@ -1,800 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rsaddr - Acpi_rs_address16_resource
- *                       Acpi_rs_address16_stream
- *                       Acpi_rs_address32_resource
- *                       Acpi_rs_address32_stream
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rsaddr")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_address16_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                              stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_address16_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u16                     temp16;
-       u8                      temp8;
-       u32                     index;
-       u32                     struct_size = sizeof(ADDRESS16_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * Point past the Descriptor to get the number of bytes consumed
-        */
-       buffer += 1;
-
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-       *bytes_consumed = temp16 + 3;
-
-       output_struct->id = address16;
-
-       output_struct->length = struct_size;
-
-       /*
-        * Get the Resource Type (Byte3)
-        */
-       buffer += 2;
-       temp8 = *buffer;
-
-       /* Values 0-2 are valid */
-       if (temp8 > 2) {
-               return (AE_AML_ERROR);
-       }
-
-       output_struct->data.address16.resource_type = temp8 & 0x03;
-
-       /*
-        * Get the General Flags (Byte4)
-        */
-       buffer += 1;
-       temp8 = *buffer;
-
-       /*
-        * Producer / Consumer
-        */
-       output_struct->data.address16.producer_consumer = temp8 & 0x01;
-
-       /*
-        * Decode
-        */
-       output_struct->data.address16.decode = (temp8 >> 1) & 0x01;
-
-       /*
-        * Min Address Fixed
-        */
-       output_struct->data.address16.min_address_fixed = (temp8 >> 2) & 0x01;
-
-       /*
-        * Max Address Fixed
-        */
-       output_struct->data.address16.max_address_fixed = (temp8 >> 3) & 0x01;
-
-       /*
-        * Get the Type Specific Flags (Byte5)
-        */
-       buffer += 1;
-       temp8 = *buffer;
-
-       if (MEMORY_RANGE == output_struct->data.address16.resource_type) {
-               output_struct->data.address16.attribute.memory.read_write_attribute =
-                               (u16) (temp8 & 0x01);
-               output_struct->data.address16.attribute.memory.cache_attribute =
-                               (u16) ((temp8 >> 1) & 0x0F);
-       }
-
-       else {
-               if (IO_RANGE == output_struct->data.address16.resource_type) {
-                       output_struct->data.address16.attribute.io.range_attribute =
-                               (u16) (temp8 & 0x03);
-               }
-
-               else {
-                       /* BUS_NUMBER_RANGE == Address32_data->Resource_type */
-                       /* Nothing needs to be filled in */
-               }
-       }
-
-       /*
-        * Get Granularity (Bytes 6-7)
-        */
-       buffer += 1;
-       MOVE_UNALIGNED16_TO_16 (&output_struct->data.address16.granularity,
-                        buffer);
-
-       /*
-        * Get Min_address_range (Bytes 8-9)
-        */
-       buffer += 2;
-       MOVE_UNALIGNED16_TO_16 (&output_struct->data.address16.min_address_range,
-                        buffer);
-
-       /*
-        * Get Max_address_range (Bytes 10-11)
-        */
-       buffer += 2;
-       MOVE_UNALIGNED16_TO_16
-               (&output_struct->data.address16.max_address_range,
-                buffer);
-
-       /*
-        * Get Address_translation_offset (Bytes 12-13)
-        */
-       buffer += 2;
-       MOVE_UNALIGNED16_TO_16
-               (&output_struct->data.address16.address_translation_offset,
-                buffer);
-
-       /*
-        * Get Address_length (Bytes 14-15)
-        */
-       buffer += 2;
-       MOVE_UNALIGNED16_TO_16
-               (&output_struct->data.address16.address_length,
-                buffer);
-
-       /*
-        * Resource Source Index (if present)
-        */
-       buffer += 2;
-
-       /*
-        * This will leave us pointing to the Resource Source Index
-        *  If it is present, then save it off and calculate the
-        *  pointer to where the null terminated string goes:
-        *  Each Interrupt takes 32-bits + the 5 bytes of the
-        *  stream that are default.
-        */
-       if (*bytes_consumed > 16) {
-               /* Dereference the Index */
-
-               temp8 = *buffer;
-               output_struct->data.address16.resource_source_index =
-                               (u32) temp8;
-
-               /* Point to the String */
-
-               buffer += 1;
-
-               /* Copy the string into the buffer */
-
-               index = 0;
-
-               while (0x00 != *buffer) {
-                       output_struct->data.address16.resource_source[index] =
-                               *buffer;
-
-                       buffer += 1;
-                       index += 1;
-               }
-
-               /*
-                * Add the terminating null
-                */
-               output_struct->data.address16.resource_source[index] = 0x00;
-
-               output_struct->data.address16.resource_source_string_length =
-                               index + 1;
-
-               /*
-                * In order for the Struct_size to fall on a 32-bit boundry,
-                *  calculate the length of the string and expand the
-                *  Struct_size to the next 32-bit boundry.
-                */
-               temp8 = (u8) (index + 1);
-               struct_size += ROUND_UP_TO_32_bITS (temp8);
-               output_struct->length = struct_size;
-       }
-       else {
-               output_struct->data.address16.resource_source_index = 0x00;
-               output_struct->data.address16.resource_source_string_length = 0;
-               output_struct->data.address16.resource_source[0] = 0x00;
-       }
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_address16_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_address16_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u8                      *length_field;
-       u8                      temp8;
-       NATIVE_CHAR             *temp_pointer = NULL;
-       u32                     actual_bytes;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x88;
-       buffer += 1;
-
-       /*
-        * Save a pointer to the Length field - to be filled in later
-        */
-       length_field = buffer;
-       buffer += 2;
-
-       /*
-        * Set the Resource Type (Memory, Io, Bus_number)
-        */
-       temp8 = (u8) (linked_list->data.address16.resource_type & 0x03);
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the general flags
-        */
-       temp8 = (u8) (linked_list->data.address16.producer_consumer & 0x01);
-
-       temp8 |= (linked_list->data.address16.decode & 0x01) << 1;
-       temp8 |= (linked_list->data.address16.min_address_fixed & 0x01) << 2;
-       temp8 |= (linked_list->data.address16.max_address_fixed & 0x01) << 3;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the type specific flags
-        */
-       temp8 = 0;
-
-       if (MEMORY_RANGE == linked_list->data.address16.resource_type) {
-               temp8 = (u8)
-                       (linked_list->data.address16.attribute.memory.read_write_attribute &
-                        0x01);
-
-               temp8 |=
-                       (linked_list->data.address16.attribute.memory.cache_attribute &
-                        0x0F) << 1;
-       }
-
-       else if (IO_RANGE == linked_list->data.address16.resource_type) {
-               temp8 = (u8)
-                       (linked_list->data.address16.attribute.io.range_attribute &
-                        0x03);
-       }
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the address space granularity
-        */
-       MOVE_UNALIGNED16_TO_16 (buffer,
-                        &linked_list->data.address16.granularity);
-       buffer += 2;
-
-       /*
-        * Set the address range minimum
-        */
-       MOVE_UNALIGNED16_TO_16 (buffer,
-                        &linked_list->data.address16.min_address_range);
-       buffer += 2;
-
-       /*
-        * Set the address range maximum
-        */
-       MOVE_UNALIGNED16_TO_16 (buffer,
-                        &linked_list->data.address16.max_address_range);
-       buffer += 2;
-
-       /*
-        * Set the address translation offset
-        */
-       MOVE_UNALIGNED16_TO_16 (buffer,
-                         &linked_list->data.address16.address_translation_offset);
-       buffer += 2;
-
-       /*
-        * Set the address length
-        */
-       MOVE_UNALIGNED16_TO_16 (buffer,
-                        &linked_list->data.address16.address_length);
-       buffer += 2;
-
-       /*
-        * Resource Source Index and Resource Source are optional
-        */
-       if (0 != linked_list->data.address16.resource_source_string_length) {
-               temp8 = (u8) linked_list->data.address16.resource_source_index;
-
-               *buffer = temp8;
-               buffer += 1;
-
-               temp_pointer = (NATIVE_CHAR *) buffer;
-
-               /*
-                * Copy the string
-                */
-               STRCPY (temp_pointer, linked_list->data.address16.resource_source);
-
-               /*
-                * Buffer needs to be set to the length of the sting + one for the
-                *  terminating null
-                */
-               buffer += (STRLEN (linked_list->data.address16.resource_source) + 1);
-       }
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       actual_bytes = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       *bytes_consumed = actual_bytes;
-
-       /*
-        * Set the length field to the number of bytes consumed
-        * minus the header size (3 bytes)
-        */
-       actual_bytes -= 3;
-       MOVE_UNALIGNED16_TO_16 (length_field, &actual_bytes);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_address32_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_address32_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer;
-       RESOURCE                *output_struct;
-       u16                     temp16;
-       u8                      temp8;
-       u32                     struct_size;
-       u32                     index;
-
-
-       buffer = byte_stream_buffer;
-
-       output_struct = (RESOURCE *) *output_buffer;
-
-       struct_size = sizeof (ADDRESS32_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-       /*
-        * Point past the Descriptor to get the number of bytes consumed
-        */
-       buffer += 1;
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-       *bytes_consumed = temp16 + 3;
-
-       output_struct->id = address32;
-
-       /*
-        * Get the Resource Type (Byte3)
-        */
-       buffer += 2;
-       temp8 = *buffer;
-
-       /* Values 0-2 are valid */
-       if(temp8 > 2) {
-               return (AE_AML_ERROR);
-       }
-
-       output_struct->data.address32.resource_type = temp8 & 0x03;
-
-       /*
-        * Get the General Flags (Byte4)
-        */
-       buffer += 1;
-       temp8 = *buffer;
-
-       /*
-        * Producer / Consumer
-        */
-       output_struct->data.address32.producer_consumer = temp8 & 0x01;
-
-       /*
-        * Decode
-        */
-       output_struct->data.address32.decode = (temp8 >> 1) & 0x01;
-
-       /*
-        * Min Address Fixed
-        */
-       output_struct->data.address32.min_address_fixed = (temp8 >> 2) & 0x01;
-
-       /*
-        * Max Address Fixed
-        */
-       output_struct->data.address32.max_address_fixed = (temp8 >> 3) & 0x01;
-
-       /*
-        * Get the Type Specific Flags (Byte5)
-        */
-       buffer += 1;
-       temp8 = *buffer;
-
-       if (MEMORY_RANGE == output_struct->data.address32.resource_type) {
-               output_struct->data.address32.attribute.memory.read_write_attribute =
-                               (u16) (temp8 & 0x01);
-
-               output_struct->data.address32.attribute.memory.cache_attribute =
-                               (u16) ((temp8 >> 1) & 0x0F);
-       }
-
-       else {
-               if (IO_RANGE == output_struct->data.address32.resource_type) {
-                       output_struct->data.address32.attribute.io.range_attribute =
-                               (u16) (temp8 & 0x03);
-               }
-
-               else {
-                       /* BUS_NUMBER_RANGE == Output_struct->Data.Address32.Resource_type */
-                       /* Nothing needs to be filled in */
-               }
-       }
-
-       /*
-        * Get Granularity (Bytes 6-9)
-        */
-       buffer += 1;
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.granularity,
-                        buffer);
-
-       /*
-        * Get Min_address_range (Bytes 10-13)
-        */
-       buffer += 4;
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.min_address_range,
-                        buffer);
-
-       /*
-        * Get Max_address_range (Bytes 14-17)
-        */
-       buffer += 4;
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.max_address_range,
-                        buffer);
-
-       /*
-        * Get Address_translation_offset (Bytes 18-21)
-        */
-       buffer += 4;
-       MOVE_UNALIGNED32_TO_32
-                        (&output_struct->data.address32.address_translation_offset,
-                                buffer);
-
-       /*
-        * Get Address_length (Bytes 22-25)
-        */
-       buffer += 4;
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.address_length,
-                        buffer);
-
-       /*
-        * Resource Source Index (if present)
-        */
-       buffer += 4;
-
-       /*
-        * This will leave us pointing to the Resource Source Index
-        *  If it is present, then save it off and calculate the
-        *  pointer to where the null terminated string goes:
-        *  Each Interrupt takes 32-bits + the 5 bytes of the
-        *  stream that are default.
-        */
-       if (*bytes_consumed > 26) {
-               /* Dereference the Index */
-
-               temp8 = *buffer;
-               output_struct->data.address32.resource_source_index = (u32)temp8;
-
-               /* Point to the String */
-
-               buffer += 1;
-
-               /* Copy the string into the buffer */
-
-               index = 0;
-
-               while (0x00 != *buffer) {
-                       output_struct->data.address32.resource_source[index] = *buffer;
-                       buffer += 1;
-                       index += 1;
-               }
-
-               /*
-                * Add the terminating null
-                */
-               output_struct->data.address32.resource_source[index] = 0x00;
-
-               output_struct->data.address32.resource_source_string_length = index + 1;
-
-               /*
-                * In order for the Struct_size to fall on a 32-bit boundry,
-                *  calculate the length of the string and expand the
-                *  Struct_size to the next 32-bit boundry.
-                */
-               temp8 = (u8) (index + 1);
-               struct_size += ROUND_UP_TO_32_bITS (temp8);
-       }
-
-       else {
-               output_struct->data.address32.resource_source_index = 0x00;
-               output_struct->data.address32.resource_source_string_length = 0;
-               output_struct->data.address32.resource_source[0] = 0x00;
-       }
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_address32_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_address32_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer;
-       u16                     *length_field;
-       u8                      temp8;
-       NATIVE_CHAR             *temp_pointer;
-
-
-       buffer = *output_buffer;
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x87;
-       buffer += 1;
-
-       /*
-        * Set a pointer to the Length field - to be filled in later
-        */
-
-       length_field = (u16 *)buffer;
-       buffer += 2;
-
-       /*
-        * Set the Resource Type (Memory, Io, Bus_number)
-        */
-       temp8 = (u8) (linked_list->data.address32.resource_type & 0x03);
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the general flags
-        */
-       temp8 = (u8) (linked_list->data.address32.producer_consumer & 0x01);
-       temp8 |= (linked_list->data.address32.decode & 0x01) << 1;
-       temp8 |= (linked_list->data.address32.min_address_fixed & 0x01) << 2;
-       temp8 |= (linked_list->data.address32.max_address_fixed & 0x01) << 3;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the type specific flags
-        */
-       temp8 = 0;
-
-       if(MEMORY_RANGE == linked_list->data.address32.resource_type) {
-               temp8 = (u8)
-                       (linked_list->data.address32.attribute.memory.read_write_attribute &
-                       0x01);
-
-               temp8 |=
-                       (linked_list->data.address32.attribute.memory.cache_attribute &
-                        0x0F) << 1;
-       }
-
-       else if (IO_RANGE == linked_list->data.address32.resource_type) {
-               temp8 = (u8)
-                       (linked_list->data.address32.attribute.io.range_attribute &
-                        0x03);
-       }
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the address space granularity
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer,
-                        &linked_list->data.address32.granularity);
-       buffer += 4;
-
-       /*
-        * Set the address range minimum
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer,
-                        &linked_list->data.address32.min_address_range);
-       buffer += 4;
-
-       /*
-        * Set the address range maximum
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer,
-                        &linked_list->data.address32.max_address_range);
-       buffer += 4;
-
-       /*
-        * Set the address translation offset
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer,
-                         &linked_list->data.address32.address_translation_offset);
-       buffer += 4;
-
-       /*
-        * Set the address length
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer,
-                        &linked_list->data.address32.address_length);
-       buffer += 4;
-
-       /*
-        * Resource Source Index and Resource Source are optional
-        */
-       if (0 != linked_list->data.address32.resource_source_string_length) {
-               temp8 = (u8) linked_list->data.address32.resource_source_index;
-
-               *buffer = temp8;
-               buffer += 1;
-
-               temp_pointer = (NATIVE_CHAR *) buffer;
-
-               /*
-                * Copy the string
-                */
-               STRCPY (temp_pointer, linked_list->data.address32.resource_source);
-
-               /*
-                * Buffer needs to be set to the length of the sting + one for the
-                *  terminating null
-                */
-               buffer += (STRLEN (linked_list->data.address32.resource_source) + 1);
-       }
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       /*
-        * Set the length field to the number of bytes consumed
-        *  minus the header size (3 bytes)
-        */
-       *length_field = (u16) (*bytes_consumed - 3);
-
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/resource/rscalc.c b/reactos/drivers/bus/acpi/resource/rscalc.c
deleted file mode 100644 (file)
index 28236e8..0000000
+++ /dev/null
@@ -1,865 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rscalc - Acpi_rs_calculate_byte_stream_length
- *                       Acpi_rs_calculate_list_length
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rscalc")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_calculate_byte_stream_length
- *
- * PARAMETERS:  Linked_list         - Pointer to the resource linked list
- *              Size_needed         - u32 pointer of the size buffer needed
- *                                      to properly return the parsed data
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Takes the resource byte stream and parses it once, calculating
- *              the size buffer needed to hold the linked list that conveys
- *              the resource data.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_calculate_byte_stream_length (
-       RESOURCE                *linked_list,
-       u32                     *size_needed)
-{
-       u32                     byte_stream_size_needed = 0;
-       u32                     segment_size;
-       EXTENDED_IRQ_RESOURCE   *ex_irq = NULL;
-       u8                      done = FALSE;
-
-
-       while (!done) {
-
-               /*
-                * Init the variable that will hold the size to add to the
-                *  total.
-                */
-               segment_size = 0;
-
-               switch (linked_list->id) {
-               case irq:
-                       /*
-                        * IRQ Resource
-                        */
-                       /*
-                        * For an IRQ Resource, Byte 3, although optional, will
-                        *  always be created - it holds IRQ information.
-                        */
-                       segment_size = 4;
-                       break;
-
-               case dma:
-                       /*
-                        * DMA Resource
-                        */
-                       /*
-                        * For this resource the size is static
-                        */
-                       segment_size = 3;
-                       break;
-
-               case start_dependent_functions:
-                       /*
-                        * Start Dependent Functions Resource
-                        */
-                       /*
-                        * For a Start_dependent_functions Resource, Byte 1,
-                        * although optional, will always be created.
-                        */
-                       segment_size = 2;
-                       break;
-
-               case end_dependent_functions:
-                       /*
-                        * End Dependent Functions Resource
-                        */
-                       /*
-                        * For this resource the size is static
-                        */
-                       segment_size = 1;
-                       break;
-
-               case io:
-                       /*
-                        * IO Port Resource
-                        */
-                       /*
-                        * For this resource the size is static
-                        */
-                       segment_size = 8;
-                       break;
-
-               case fixed_io:
-                       /*
-                        * Fixed IO Port Resource
-                        */
-                       /*
-                        * For this resource the size is static
-                        */
-                       segment_size = 4;
-                       break;
-
-               case vendor_specific:
-                       /*
-                        * Vendor Defined Resource
-                        */
-                       /*
-                        * For a Vendor Specific resource, if the Length is
-                        *  between 1 and 7 it will be created as a Small
-                        *  Resource data type, otherwise it is a Large
-                        *  Resource data type.
-                        */
-                       if(linked_list->data.vendor_specific.length > 7) {
-                               segment_size = 3;
-                       }
-                       else {
-                               segment_size = 1;
-                       }
-                       segment_size +=
-                               linked_list->data.vendor_specific.length;
-                       break;
-
-               case end_tag:
-                       /*
-                        * End Tag
-                        */
-                       /*
-                        * For this resource the size is static
-                        */
-                       segment_size = 2;
-                       done = TRUE;
-                       break;
-
-               case memory24:
-                       /*
-                        * 24-Bit Memory Resource
-                        */
-                       /*
-                        * For this resource the size is static
-                        */
-                       segment_size = 12;
-                       break;
-
-               case memory32:
-                       /*
-                        * 32-Bit Memory Range Resource
-                        */
-                       /*
-                        * For this resource the size is static
-                        */
-                       segment_size = 20;
-                       break;
-
-               case fixed_memory32:
-                       /*
-                        * 32-Bit Fixed Memory Resource
-                        */
-                       /*
-                        * For this resource the size is static
-                        */
-                       segment_size = 12;
-                       break;
-
-               case address16:
-                       /*
-                        * 16-Bit Address Resource
-                        */
-                       /*
-                        * The base size of this byte stream is 16. If a
-                        *  Resource Source string is not NULL, add 1 for
-                        *  the Index + the length of the null terminated
-                        *  string Resource Source + 1 for the null.
-                        */
-                       segment_size = 16;
-
-                       if(NULL != linked_list->data.address16.resource_source) {
-                               segment_size += (1 +
-                                       linked_list->data.address16.resource_source_string_length);
-                       }
-                       break;
-
-               case address32:
-                       /*
-                        * 32-Bit Address Resource
-                        */
-                       /*
-                        * The base size of this byte stream is 26. If a Resource
-                        *  Source string is not NULL, add 1 for the Index + the
-                        *  length of the null terminated string Resource Source +
-                        *  1 for the null.
-                        */
-                       segment_size = 26;
-
-                       if(NULL != linked_list->data.address16.resource_source) {
-                               segment_size += (1 +
-                                       linked_list->data.address16.resource_source_string_length);
-                       }
-                       break;
-
-               case extended_irq:
-                       /*
-                        * Extended IRQ Resource
-                        */
-                       /*
-                        * The base size of this byte stream is 9. This is for an
-                        *  Interrupt table length of 1.  For each additional
-                        *  interrupt, add 4.
-                        * If a Resource Source string is not NULL, add 1 for the
-                        *  Index + the length of the null terminated string
-                        *  Resource Source + 1 for the null.
-                        */
-                       segment_size = 9;
-
-                       segment_size +=
-                               (linked_list->data.extended_irq.number_of_interrupts -
-                                1) * 4;
-
-                       if(NULL != ex_irq->resource_source) {
-                               segment_size += (1 +
-                                       linked_list->data.extended_irq.resource_source_string_length);
-                       }
-                       break;
-
-               default:
-                       /*
-                        * If we get here, everything is out of sync,
-                        *  so exit with an error
-                        */
-                       return (AE_AML_ERROR);
-                       break;
-
-               } /* switch (Linked_list->Id) */
-
-               /*
-                * Update the total
-                */
-               byte_stream_size_needed += segment_size;
-
-               /*
-                * Point to the next object
-                */
-               linked_list = (RESOURCE *) ((NATIVE_UINT) linked_list +
-                                 (NATIVE_UINT) linked_list->length);
-       }
-
-       /*
-        * This is the data the caller needs
-        */
-       *size_needed = byte_stream_size_needed;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_calculate_list_length
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource byte stream
- *              Byte_stream_buffer_length - Size of Byte_stream_buffer
- *              Size_needed             - u32 pointer of the size buffer
- *                                          needed to properly return the
- *                                          parsed data
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Takes the resource byte stream and parses it once, calculating
- *              the size buffer needed to hold the linked list that conveys
- *              the resource data.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_calculate_list_length (
-       u8                      *byte_stream_buffer,
-       u32                     byte_stream_buffer_length,
-       u32                     *size_needed)
-{
-       u32                     buffer_size = 0;
-       u32                     bytes_parsed = 0;
-       u8                      number_of_interrupts = 0;
-       u8                      number_of_channels = 0;
-       u8                      resource_type;
-       u32                     structure_size;
-       u32                     bytes_consumed;
-       u8                      *buffer;
-       u8                      temp8;
-       u16                     temp16;
-       u8                      index;
-       u8                      additional_bytes;
-
-
-       while (bytes_parsed < byte_stream_buffer_length) {
-               /*
-                * Look at the next byte in the stream
-                */
-               resource_type = *byte_stream_buffer;
-
-               /*
-                * See if this is a small or large resource
-                */
-               if(resource_type & 0x80) {
-                       /*
-                        * Large Resource Type
-                        */
-                       switch (resource_type) {
-                       case MEMORY_RANGE_24:
-                               /*
-                                * 24-Bit Memory Resource
-                                */
-                               bytes_consumed = 12;
-
-                               structure_size = sizeof (MEMORY24_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA;
-                               break;
-
-                       case LARGE_VENDOR_DEFINED:
-                               /*
-                                * Vendor Defined Resource
-                                */
-                               buffer = byte_stream_buffer;
-                               ++buffer;
-
-                               MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-                               bytes_consumed = temp16 + 3;
-
-                               /*
-                                * Ensure a 32-bit boundary for the structure
-                                */
-                               temp16 = (u16) ROUND_UP_TO_32_bITS (temp16);
-
-                               structure_size = sizeof (VENDOR_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA +
-                                                 (temp16 * sizeof (u8));
-                               break;
-
-                       case MEMORY_RANGE_32:
-                               /*
-                                * 32-Bit Memory Range Resource
-                                */
-
-                               bytes_consumed = 20;
-
-                               structure_size = sizeof (MEMORY32_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA;
-                               break;
-
-                       case FIXED_MEMORY_RANGE_32:
-                               /*
-                                * 32-Bit Fixed Memory Resource
-                                */
-                               bytes_consumed = 12;
-
-                               structure_size = sizeof(FIXED_MEMORY32_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA;
-                               break;
-
-                       case DWORD_ADDRESS_SPACE:
-                               /*
-                                * 32-Bit Address Resource
-                                */
-                               buffer = byte_stream_buffer;
-
-                               ++buffer;
-                               MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-                               bytes_consumed = temp16 + 3;
-
-                               /*
-                                * Resource Source Index and Resource Source are
-                                *  optional elements.  Check the length of the
-                                *  Bytestream.  If it is greater than 23, that
-                                *  means that an Index exists and is followed by
-                                *  a null termininated string.  Therefore, set
-                                *  the temp variable to the length minus the minimum
-                                *  byte stream length plus the byte for the Index to
-                                *  determine the size of the NULL terminiated string.
-                                */
-                               if (23 < temp16) {
-                                       temp8 = (u8) (temp16 - 24);
-                               }
-                               else {
-                                       temp8 = 0;
-                               }
-
-                               /*
-                                * Ensure a 32-bit boundary for the structure
-                                */
-                               temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
-
-                               structure_size = sizeof (ADDRESS32_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA +
-                                                 (temp8 * sizeof (u8));
-                               break;
-
-                       case WORD_ADDRESS_SPACE:
-                               /*
-                                * 16-Bit Address Resource
-                                */
-                               buffer = byte_stream_buffer;
-
-                               ++buffer;
-                               MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-                               bytes_consumed = temp16 + 3;
-
-                               /*
-                                * Resource Source Index and Resource Source are
-                                *  optional elements.  Check the length of the
-                                *  Bytestream.  If it is greater than 13, that
-                                *  means that an Index exists and is followed by
-                                *  a null termininated string.  Therefore, set
-                                *  the temp variable to the length minus the minimum
-                                *  byte stream length plus the byte for the Index to
-                                *  determine the size of the NULL terminiated string.
-                                */
-                               if (13 < temp16) {
-                                       temp8 = (u8) (temp16 - 14);
-                               }
-                               else {
-                                       temp8 = 0;
-                               }
-
-                               /*
-                                * Ensure a 32-bit boundry for the structure
-                                */
-                               temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
-
-                               structure_size = sizeof (ADDRESS16_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA +
-                                                 (temp8 * sizeof (u8));
-                               break;
-
-                       case EXTENDED_IRQ:
-                               /*
-                                * Extended IRQ
-                                */
-                               buffer = byte_stream_buffer;
-
-                               ++buffer;
-                               MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-                               bytes_consumed = temp16 + 3;
-
-                               /*
-                                * Point past the length field and the
-                                *  Interrupt vector flags to save off the
-                                *  Interrupt table length to the Temp8 variable.
-                                */
-                               buffer += 3;
-                               temp8 = *buffer;
-
-                               /*
-                                * To compensate for multiple interrupt numbers,
-                                *  Add 4 bytes for each additional interrupts
-                                *  greater than 1
-                                */
-                               additional_bytes = (u8) ((temp8 - 1) * 4);
-
-                               /*
-                                * Resource Source Index and Resource Source are
-                                *  optional elements.  Check the length of the
-                                *  Bytestream.  If it is greater than 9, that
-                                *  means that an Index exists and is followed by
-                                *  a null termininated string.  Therefore, set
-                                *  the temp variable to the length minus the minimum
-                                *  byte stream length plus the byte for the Index to
-                                *  determine the size of the NULL terminiated string.
-                                */
-                               if (9 + additional_bytes < temp16) {
-                                       temp8 = (u8) (temp16 - (9 + additional_bytes));
-                               }
-
-                               else {
-                                       temp8 = 0;
-                               }
-
-                               /*
-                                * Ensure a 32-bit boundry for the structure
-                                */
-                               temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
-
-                               structure_size = sizeof (EXTENDED_IRQ_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA +
-                                                 (additional_bytes * sizeof (u8)) +
-                                                 (temp8 * sizeof (u8));
-
-                               break;
-
-/* TBD: [Future] 64-bit not currently supported */
-/*
-                       case 0x8A:
-                               break;
-*/
-
-                       default:
-                               /*
-                                * If we get here, everything is out of sync,
-                                *  so exit with an error
-                                */
-                               return (AE_AML_ERROR);
-                               break;
-                       }
-               }
-
-               else {
-                       /*
-                        * Small Resource Type
-                        *  Only bits 7:3 are valid
-                        */
-                       resource_type >>= 3;
-
-                       switch (resource_type) {
-                       case IRQ_FORMAT:
-                               /*
-                                * IRQ Resource
-                                */
-                               /*
-                                * Determine if it there are two or three
-                                *  trailing bytes
-                                */
-                               buffer = byte_stream_buffer;
-                               temp8 = *buffer;
-
-                               if(temp8 & 0x01) {
-                                       bytes_consumed = 4;
-                               }
-
-                               else {
-                                       bytes_consumed = 3;
-                               }
-
-                               /*
-                                * Point past the descriptor
-                                */
-                               ++buffer;
-
-                               /*
-                                * Look at the number of bits set
-                                */
-                               MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-                               for (index = 0; index < 16; index++) {
-                                       if (temp16 & 0x1) {
-                                               ++number_of_interrupts;
-                                       }
-
-                                       temp16 >>= 1;
-                               }
-
-                               structure_size = sizeof (IO_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA +
-                                                 (number_of_interrupts * sizeof (u32));
-                               break;
-
-
-                       case DMA_FORMAT:
-
-                               /*
-                                * DMA Resource
-                                */
-                               buffer = byte_stream_buffer;
-
-                               bytes_consumed = 3;
-
-                               /*
-                                * Point past the descriptor
-                                */
-                               ++buffer;
-
-                               /*
-                                * Look at the number of bits set
-                                */
-                               temp8 = *buffer;
-
-                               for(index = 0; index < 8; index++) {
-                                       if(temp8 & 0x1) {
-                                               ++number_of_channels;
-                                       }
-
-                                       temp8 >>= 1;
-                               }
-
-                               structure_size = sizeof (DMA_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA +
-                                                 (number_of_channels * sizeof (u32));
-                               break;
-
-
-                       case START_DEPENDENT_TAG:
-
-                               /*
-                                * Start Dependent Functions Resource
-                                */
-                               /*
-                                * Determine if it there are two or three trailing bytes
-                                */
-                               buffer = byte_stream_buffer;
-                               temp8 = *buffer;
-
-                               if(temp8 & 0x01) {
-                                       bytes_consumed = 2;
-                               }
-                               else {
-                                       bytes_consumed = 1;
-                               }
-
-
-                               structure_size =
-                                               sizeof (START_DEPENDENT_FUNCTIONS_RESOURCE) +
-                                               RESOURCE_LENGTH_NO_DATA;
-                               break;
-
-
-                       case END_DEPENDENT_TAG:
-
-                               /*
-                                * End Dependent Functions Resource
-                                */
-                               bytes_consumed = 1;
-                               structure_size = RESOURCE_LENGTH;
-                               break;
-
-
-                       case IO_PORT_DESCRIPTOR:
-                               /*
-                                * IO Port Resource
-                                */
-                               bytes_consumed = 8;
-                               structure_size = sizeof (IO_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA;
-                               break;
-
-
-                       case FIXED_LOCATION_IO_DESCRIPTOR:
-
-                               /*
-                                * Fixed IO Port Resource
-                                */
-                               bytes_consumed = 4;
-                               structure_size = sizeof (FIXED_IO_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA;
-                               break;
-
-
-                       case SMALL_VENDOR_DEFINED:
-
-                               /*
-                                * Vendor Specific Resource
-                                */
-                               buffer = byte_stream_buffer;
-
-                               temp8 = *buffer;
-                               temp8 = (u8) (temp8 & 0x7);
-                               bytes_consumed = temp8 + 1;
-
-                               /*
-                                * Ensure a 32-bit boundry for the structure
-                                */
-                               temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
-                               structure_size = sizeof (VENDOR_RESOURCE) +
-                                                 RESOURCE_LENGTH_NO_DATA +
-                                                 (temp8 * sizeof (u8));
-                               break;
-
-
-                       case END_TAG:
-
-                               /*
-                                * End Tag
-                                */
-                               bytes_consumed = 2;
-                               structure_size = RESOURCE_LENGTH;
-                               byte_stream_buffer_length = bytes_parsed;
-                               break;
-
-
-                       default:
-                               /*
-                                * If we get here, everything is out of sync,
-                                *  so exit with an error
-                                */
-                               return (AE_AML_ERROR);
-                               break;
-
-                       } /* switch */
-
-               }  /* if(Resource_type & 0x80) */
-
-               /*
-                * Update the return value and counter
-                */
-               buffer_size += structure_size;
-               bytes_parsed += bytes_consumed;
-
-               /*
-                * Set the byte stream to point to the next resource
-                */
-               byte_stream_buffer += bytes_consumed;
-
-       }
-
-       /*
-        * This is the data the caller needs
-        */
-       *size_needed = buffer_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_calculate_pci_routing_table_length
- *
- * PARAMETERS:  Package_object          - Pointer to the package object
- *              Buffer_size_needed      - u32 pointer of the size buffer
- *                                          needed to properly return the
- *                                          parsed data
- *
- * RETURN:      Status  AE_OK
- *
- * DESCRIPTION: Given a package representing a PCI routing table, this
- *                calculates the size of the corresponding linked list of
- *                descriptions.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_calculate_pci_routing_table_length (
-       ACPI_OPERAND_OBJECT     *package_object,
-       u32                     *buffer_size_needed)
-{
-       u32                     number_of_elements;
-       u32                     temp_size_needed = 0;
-       ACPI_OPERAND_OBJECT     **top_object_list;
-       u32                     index;
-       ACPI_OPERAND_OBJECT     *package_element;
-       ACPI_OPERAND_OBJECT     **sub_object_list;
-       u8                      name_found;
-       u32                     table_index;
-
-
-       number_of_elements = package_object->package.count;
-
-       /*
-        * Calculate the size of the return buffer.
-        * The base size is the number of elements * the sizes of the
-        * structures.  Additional space for the strings is added below.
-        * The minus one is to subtract the size of the u8 Source[1]
-        * member because it is added below.
-        */
-
-       /*
-        * But each PRT_ENTRY structure has a pointer to a string and
-        * the size of that string must be found.
-        */
-       top_object_list = package_object->package.elements;
-
-       for (index = 0; index < number_of_elements; index++) {
-               /*
-                * Dereference the sub-package
-                */
-               package_element = *top_object_list;
-
-               /*
-                * The Sub_object_list will now point to an array of the
-                * four IRQ elements: Address, Pin, Source and Source_index
-                */
-               sub_object_list = package_element->package.elements;
-
-               /*
-                * Scan the Irq_table_elements for the Source Name String
-                */
-               name_found = FALSE;
-
-               for (table_index = 0; table_index < 4 && !name_found; table_index++) {
-                       if ((ACPI_TYPE_STRING == (*sub_object_list)->common.type) ||
-                               ((INTERNAL_TYPE_REFERENCE == (*sub_object_list)->common.type) &&
-                                       ((*sub_object_list)->reference.opcode == AML_NAMEPATH_OP))) {
-                               name_found = TRUE;
-                       }
-
-                       else {
-                               /*
-                                * Look at the next element
-                                */
-                               sub_object_list++;
-                       }
-               }
-
-               temp_size_needed += (sizeof (PCI_ROUTING_TABLE) - 4);
-
-               /*
-                * Was a String type found?
-                */
-               if (TRUE == name_found) {
-                       if (ACPI_TYPE_STRING == (*sub_object_list)->common.type) {
-                               /*
-                                * The length String.Length field includes the
-                                * terminating NULL
-                                */
-                               temp_size_needed += (*sub_object_list)->string.length;
-                       }
-                       else {
-                               temp_size_needed += acpi_ns_get_pathname_length ((*sub_object_list)->reference.node);
-                       }
-               }
-
-               else {
-                       /*
-                        * If no name was found, then this is a NULL, which is
-                        *  translated as a u32 zero.
-                        */
-                       temp_size_needed += sizeof(u32);
-               }
-
-
-               /* Round up the size since each element must be aligned */
-
-               temp_size_needed = ROUND_UP_TO_64_bITS (temp_size_needed);
-
-               /*
-                * Point to the next ACPI_OPERAND_OBJECT
-                */
-               top_object_list++;
-       }
-
-
-       /*
-        * Adding an extra element to the end of the list, essentially a NULL terminator
-        */
-       *buffer_size_needed = temp_size_needed + sizeof (PCI_ROUTING_TABLE);
-
-       return (AE_OK);
-}
diff --git a/reactos/drivers/bus/acpi/resource/rscreate.c b/reactos/drivers/bus/acpi/resource/rscreate.c
deleted file mode 100644 (file)
index a856093..0000000
+++ /dev/null
@@ -1,418 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rscreate - Acpi_rs_create_resource_list
- *                         Acpi_rs_create_pci_routing_table
- *                         Acpi_rs_create_byte_stream
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rscreate")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_create_resource_list
- *
- * PARAMETERS:
- *              Byte_stream_buffer      - Pointer to the resource byte stream
- *              Output_buffer           - Pointer to the user's buffer
- *              Output_buffer_length    - Pointer to the size of Output_buffer
- *
- * RETURN:      Status  - AE_OK if okay, else a valid ACPI_STATUS code
- *              If Output_buffer is not large enough, Output_buffer_length
- *              indicates how large Output_buffer should be, else it
- *              indicates how may u8 elements of Output_buffer are valid.
- *
- * DESCRIPTION: Takes the byte stream returned from a _CRS, _PRS control method
- *              execution and parses the stream to create a linked list
- *              of device resources.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_create_resource_list (
-       ACPI_OPERAND_OBJECT     *byte_stream_buffer,
-       u8                      *output_buffer,
-       u32                     *output_buffer_length)
-{
-
-       ACPI_STATUS             status;
-       u8                      *byte_stream_start = NULL;
-       u32                     list_size_needed = 0;
-       u32                     byte_stream_buffer_length = 0;
-
-
-       /*
-        * Params already validated, so we don't re-validate here
-        */
-
-       byte_stream_buffer_length = byte_stream_buffer->buffer.length;
-       byte_stream_start = byte_stream_buffer->buffer.pointer;
-
-       /*
-        * Pass the Byte_stream_buffer into a module that can calculate
-        * the buffer size needed for the linked list
-        */
-       status = acpi_rs_calculate_list_length (byte_stream_start,
-                        byte_stream_buffer_length,
-                        &list_size_needed);
-
-       /*
-        * Exit with the error passed back
-        */
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * If the linked list will fit into the available buffer
-        * call to fill in the list
-        */
-
-       if (list_size_needed <= *output_buffer_length) {
-               /*
-                * Zero out the return buffer before proceeding
-                */
-               MEMSET (output_buffer, 0x00, *output_buffer_length);
-
-               status = acpi_rs_byte_stream_to_list (byte_stream_start,
-                                byte_stream_buffer_length,
-                                &output_buffer);
-
-               /*
-                * Exit with the error passed back
-                */
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-       }
-
-       else {
-               *output_buffer_length = list_size_needed;
-               return (AE_BUFFER_OVERFLOW);
-       }
-
-       *output_buffer_length = list_size_needed;
-       return (AE_OK);
-
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_create_pci_routing_table
- *
- * PARAMETERS:
- *              Package_object          - Pointer to an ACPI_OPERAND_OBJECT
- *                                          package
- *              Output_buffer           - Pointer to the user's buffer
- *              Output_buffer_length    - Size of Output_buffer
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code.
- *              If the Output_buffer is too small, the error will be
- *              AE_BUFFER_OVERFLOW and Output_buffer_length will point
- *              to the size buffer needed.
- *
- * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT  package and creates a
- *              linked list of PCI interrupt descriptions
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_create_pci_routing_table (
-       ACPI_OPERAND_OBJECT     *package_object,
-       u8                      *output_buffer,
-       u32                     *output_buffer_length)
-{
-       u8                      *buffer = output_buffer;
-       ACPI_OPERAND_OBJECT     **top_object_list = NULL;
-       ACPI_OPERAND_OBJECT     **sub_object_list = NULL;
-       ACPI_OPERAND_OBJECT     *package_element = NULL;
-       u32                     buffer_size_needed = 0;
-       u32                     number_of_elements = 0;
-       u32                     index = 0;
-       PCI_ROUTING_TABLE       *user_prt = NULL;
-       ACPI_NAMESPACE_NODE     *node;
-       ACPI_STATUS             status;
-
-
-       /*
-        * Params already validated, so we don't re-validate here
-        */
-
-       status = acpi_rs_calculate_pci_routing_table_length(package_object,
-                         &buffer_size_needed);
-
-       /*
-        * If the data will fit into the available buffer
-        * call to fill in the list
-        */
-       if (buffer_size_needed <= *output_buffer_length) {
-               /*
-                * Zero out the return buffer before proceeding
-                */
-               MEMSET (output_buffer, 0x00, *output_buffer_length);
-
-               /*
-                * Loop through the ACPI_INTERNAL_OBJECTS - Each object should
-                * contain a u32 Address, a u8 Pin, a Name and a u8
-                * Source_index.
-                */
-               top_object_list     = package_object->package.elements;
-               number_of_elements  = package_object->package.count;
-               user_prt            = (PCI_ROUTING_TABLE *) buffer;
-
-
-               buffer = ROUND_PTR_UP_TO_8 (buffer, u8);
-
-               for (index = 0; index < number_of_elements; index++) {
-                       /*
-                        * Point User_prt past this current structure
-                        *
-                        * NOTE: On the first iteration, User_prt->Length will
-                        * be zero because we cleared the return buffer earlier
-                        */
-                       buffer += user_prt->length;
-                       user_prt = (PCI_ROUTING_TABLE *) buffer;
-
-
-                       /*
-                        * Fill in the Length field with the information we
-                        * have at this point.
-                        * The minus four is to subtract the size of the
-                        * u8 Source[4] member because it is added below.
-                        */
-                       user_prt->length = (sizeof (PCI_ROUTING_TABLE) -4);
-
-                       /*
-                        * Dereference the sub-package
-                        */
-                       package_element = *top_object_list;
-
-                       /*
-                        * The Sub_object_list will now point to an array of
-                        * the four IRQ elements: Address, Pin, Source and
-                        * Source_index
-                        */
-                       sub_object_list = package_element->package.elements;
-
-                       /*
-                        * 1) First subobject:  Dereference the Address
-                        */
-                       if (ACPI_TYPE_INTEGER == (*sub_object_list)->common.type) {
-                               user_prt->address = (*sub_object_list)->integer.value;
-                       }
-
-                       else {
-                               return (AE_BAD_DATA);
-                       }
-
-                       /*
-                        * 2) Second subobject: Dereference the Pin
-                        */
-                       sub_object_list++;
-
-                       if (ACPI_TYPE_INTEGER == (*sub_object_list)->common.type) {
-                               user_prt->pin =
-                                               (u32) (*sub_object_list)->integer.value;
-                       }
-
-                       else {
-                               return (AE_BAD_DATA);
-                       }
-
-                       /*
-                        * 3) Third subobject: Dereference the Source Name
-                        */
-                       sub_object_list++;
-
-                       switch ((*sub_object_list)->common.type) {
-                       case INTERNAL_TYPE_REFERENCE:
-                               if ((*sub_object_list)->reference.opcode != AML_NAMEPATH_OP) {
-                                       return (AE_BAD_DATA);
-                               }
-
-                               node = (*sub_object_list)->reference.node;
-
-                               /* TBD: use *remaining* length of the buffer! */
-
-                               status = acpi_ns_handle_to_pathname ((ACPI_HANDLE *) node,
-                                                output_buffer_length, user_prt->source);
-
-                               user_prt->length += STRLEN (user_prt->source) + 1; /* include null terminator */
-                               break;
-
-
-                       case ACPI_TYPE_STRING:
-
-                               STRCPY (user_prt->source,
-                                         (*sub_object_list)->string.pointer);
-
-                               /*
-                                * Add to the Length field the length of the string
-                                */
-                               user_prt->length += (*sub_object_list)->string.length;
-                               break;
-
-
-                       case ACPI_TYPE_INTEGER:
-                               /*
-                                * If this is a number, then the Source Name
-                                * is NULL, since the entire buffer was zeroed
-                                * out, we can leave this alone.
-                                */
-                               /*
-                                * Add to the Length field the length of
-                                * the u32 NULL
-                                */
-                               user_prt->length += sizeof (u32);
-                               break;
-
-
-                       default:
-                          return (AE_BAD_DATA);
-                          break;
-                       }
-
-                       /* Now align the current length */
-
-                       user_prt->length = ROUND_UP_TO_64_bITS (user_prt->length);
-
-                       /*
-                        * 4) Fourth subobject: Dereference the Source Index
-                        */
-                       sub_object_list++;
-
-                       if (ACPI_TYPE_INTEGER == (*sub_object_list)->common.type) {
-                               user_prt->source_index =
-                                               (u32) (*sub_object_list)->integer.value;
-                       }
-
-                       else {
-                               return (AE_BAD_DATA);
-                       }
-
-                       /*
-                        * Point to the next ACPI_OPERAND_OBJECT
-                        */
-                       top_object_list++;
-               }
-
-       }
-
-       else {
-               *output_buffer_length = buffer_size_needed;
-
-               return (AE_BUFFER_OVERFLOW);
-       }
-
-       /*
-        * Report the amount of buffer used
-        */
-       *output_buffer_length = buffer_size_needed;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_create_byte_stream
- *
- * PARAMETERS:
- *              Linked_list_buffer      - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's buffer
- *              Output_buffer_length    - Size of Output_buffer
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code.
- *              If the Output_buffer is too small, the error will be
- *              AE_BUFFER_OVERFLOW and Output_buffer_length will point
- *              to the size buffer needed.
- *
- * DESCRIPTION: Takes the linked list of device resources and
- *              creates a bytestream to be used as input for the
- *              _SRS control method.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_create_byte_stream (
-       RESOURCE                *linked_list_buffer,
-       u8                      *output_buffer,
-       u32                     *output_buffer_length)
-{
-       ACPI_STATUS             status;
-       u32                     byte_stream_size_needed = 0;
-
-
-       /*
-        * Params already validated, so we don't re-validate here
-        *
-        * Pass the Linked_list_buffer into a module that can calculate
-        * the buffer size needed for the byte stream.
-        */
-       status = acpi_rs_calculate_byte_stream_length (linked_list_buffer,
-                        &byte_stream_size_needed);
-
-       /*
-        * Exit with the error passed back
-        */
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * If the linked list will fit into the available buffer
-        * call to fill in the list
-        */
-
-       if (byte_stream_size_needed <= *output_buffer_length) {
-               /*
-                * Zero out the return buffer before proceeding
-                */
-               MEMSET (output_buffer, 0x00, *output_buffer_length);
-
-               status = acpi_rs_list_to_byte_stream (linked_list_buffer,
-                                byte_stream_size_needed,
-                                &output_buffer);
-
-               /*
-                * Exit with the error passed back
-                */
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-       }
-       else {
-               *output_buffer_length = byte_stream_size_needed;
-               return (AE_BUFFER_OVERFLOW);
-       }
-
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/resource/rsdump.c b/reactos/drivers/bus/acpi/resource/rsdump.c
deleted file mode 100644 (file)
index d280613..0000000
+++ /dev/null
@@ -1,928 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rsdump - Functions do dump out the resource structures.
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rsdump")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_irq
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_irq (
-       RESOURCE_DATA           *data)
-{
-       IRQ_RESOURCE            *irq_data = (IRQ_RESOURCE*) data;
-       u8                      index = 0;
-
-
-       acpi_os_printf ("\t_iRQ Resource\n");
-
-       acpi_os_printf ("\t\t%s Triggered\n",
-                        LEVEL_SENSITIVE == irq_data->edge_level ?
-                        "Level" : "Edge");
-
-       acpi_os_printf ("\t\t_active %s\n",
-                        ACTIVE_LOW == irq_data->active_high_low ?
-                        "Low" : "High");
-
-       acpi_os_printf ("\t\t%s\n",
-                        SHARED == irq_data->shared_exclusive ?
-                        "Shared" : "Exclusive");
-
-       acpi_os_printf ("\t\t%X Interrupts ( ",
-                        irq_data->number_of_interrupts);
-
-       for (index = 0; index < irq_data->number_of_interrupts; index++) {
-               acpi_os_printf ("%X ", irq_data->interrupts[index]);
-       }
-
-       acpi_os_printf (")\n");
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_dma
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_dma (
-       RESOURCE_DATA           *data)
-{
-       DMA_RESOURCE            *dma_data = (DMA_RESOURCE*) data;
-       u8                      index = 0;
-
-
-       acpi_os_printf ("\t_dMA Resource\n");
-
-       switch (dma_data->type) {
-       case COMPATIBILITY:
-               acpi_os_printf ("\t\t_compatibility mode\n");
-               break;
-
-       case TYPE_A:
-               acpi_os_printf ("\t\t_type A\n");
-               break;
-
-       case TYPE_B:
-               acpi_os_printf ("\t\t_type B\n");
-               break;
-
-       case TYPE_F:
-               acpi_os_printf ("\t\t_type F\n");
-               break;
-
-       default:
-               acpi_os_printf ("\t\t_invalid DMA type\n");
-               break;
-       }
-
-       acpi_os_printf ("\t\t%sBus Master\n",
-                        BUS_MASTER == dma_data->bus_master ?
-                        "" : "Not a ");
-
-       switch (dma_data->transfer) {
-       case TRANSFER_8:
-               acpi_os_printf ("\t\t8-bit only transfer\n");
-               break;
-
-       case TRANSFER_8_16:
-               acpi_os_printf ("\t\t8 and 16-bit transfer\n");
-               break;
-
-       case TRANSFER_16:
-               acpi_os_printf ("\t\t16 bit only transfer\n");
-               break;
-
-       default:
-               acpi_os_printf ("\t\t_invalid transfer preference\n");
-               break;
-       }
-
-       acpi_os_printf ("\t\t_number of Channels: %X ( ",
-                        dma_data->number_of_channels);
-
-       for (index = 0; index < dma_data->number_of_channels; index++) {
-               acpi_os_printf ("%X ", dma_data->channels[index]);
-       }
-
-       acpi_os_printf (")\n");
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_start_dependent_functions
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_start_dependent_functions (
-       RESOURCE_DATA               *data)
-{
-       START_DEPENDENT_FUNCTIONS_RESOURCE *sdf_data =
-                          (START_DEPENDENT_FUNCTIONS_RESOURCE*) data;
-
-
-       acpi_os_printf ("\t_start Dependent Functions Resource\n");
-
-       switch (sdf_data->compatibility_priority) {
-       case GOOD_CONFIGURATION:
-               acpi_os_printf ("\t\t_good configuration\n");
-               break;
-
-       case ACCEPTABLE_CONFIGURATION:
-               acpi_os_printf ("\t\t_acceptable configuration\n");
-               break;
-
-       case SUB_OPTIMAL_CONFIGURATION:
-               acpi_os_printf ("\t\t_sub-optimal configuration\n");
-               break;
-
-       default:
-               acpi_os_printf ("\t\t_invalid compatibility priority\n");
-               break;
-       }
-
-       switch(sdf_data->performance_robustness) {
-       case GOOD_CONFIGURATION:
-               acpi_os_printf ("\t\t_good configuration\n");
-               break;
-
-       case ACCEPTABLE_CONFIGURATION:
-               acpi_os_printf ("\t\t_acceptable configuration\n");
-               break;
-
-       case SUB_OPTIMAL_CONFIGURATION:
-               acpi_os_printf ("\t\t_sub-optimal configuration\n");
-               break;
-
-       default:
-               acpi_os_printf ("\t\t_invalid performance "
-                                 "robustness preference\n");
-               break;
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_io
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_io (
-       RESOURCE_DATA       *data)
-{
-       IO_RESOURCE         *io_data = (IO_RESOURCE*) data;
-
-
-       acpi_os_printf ("\t_io Resource\n");
-
-       acpi_os_printf ("\t\t%d bit decode\n",
-                        DECODE_16 == io_data->io_decode ? 16 : 10);
-
-       acpi_os_printf ("\t\t_range minimum base: %08X\n",
-                        io_data->min_base_address);
-
-       acpi_os_printf ("\t\t_range maximum base: %08X\n",
-                        io_data->max_base_address);
-
-       acpi_os_printf ("\t\t_alignment: %08X\n",
-                        io_data->alignment);
-
-       acpi_os_printf ("\t\t_range Length: %08X\n",
-                        io_data->range_length);
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_fixed_io
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_fixed_io (
-       RESOURCE_DATA           *data)
-{
-       FIXED_IO_RESOURCE       *fixed_io_data = (FIXED_IO_RESOURCE*) data;
-
-
-       acpi_os_printf ("\t_fixed Io Resource\n");
-       acpi_os_printf ("\t\t_range base address: %08X",
-                        fixed_io_data->base_address);
-
-       acpi_os_printf ("\t\t_range length: %08X",
-                        fixed_io_data->range_length);
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_vendor_specific
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_vendor_specific (
-       RESOURCE_DATA           *data)
-{
-       VENDOR_RESOURCE         *vendor_data = (VENDOR_RESOURCE*) data;
-       u16                     index = 0;
-
-
-       acpi_os_printf ("\t_vendor Specific Resource\n");
-
-       acpi_os_printf ("\t\t_length: %08X\n", vendor_data->length);
-
-       for (index = 0; index < vendor_data->length; index++) {
-               acpi_os_printf ("\t\t_byte %X: %08X\n",
-                                index, vendor_data->reserved[index]);
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_memory24
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_memory24 (
-       RESOURCE_DATA           *data)
-{
-       MEMORY24_RESOURCE       *memory24_data = (MEMORY24_RESOURCE*) data;
-
-
-       acpi_os_printf ("\t24-Bit Memory Range Resource\n");
-
-       acpi_os_printf ("\t\t_read%s\n",
-                        READ_WRITE_MEMORY ==
-                        memory24_data->read_write_attribute ?
-                        "/Write" : " only");
-
-       acpi_os_printf ("\t\t_range minimum base: %08X\n",
-                        memory24_data->min_base_address);
-
-       acpi_os_printf ("\t\t_range maximum base: %08X\n",
-                        memory24_data->max_base_address);
-
-       acpi_os_printf ("\t\t_alignment: %08X\n",
-                        memory24_data->alignment);
-
-       acpi_os_printf ("\t\t_range length: %08X\n",
-                        memory24_data->range_length);
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_memory32
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_memory32 (
-       RESOURCE_DATA           *data)
-{
-       MEMORY32_RESOURCE       *memory32_data = (MEMORY32_RESOURCE*) data;
-
-
-       acpi_os_printf ("\t32-Bit Memory Range Resource\n");
-
-       acpi_os_printf ("\t\t_read%s\n",
-                        READ_WRITE_MEMORY ==
-                        memory32_data->read_write_attribute ?
-                        "/Write" : " only");
-
-       acpi_os_printf ("\t\t_range minimum base: %08X\n",
-                        memory32_data->min_base_address);
-
-       acpi_os_printf ("\t\t_range maximum base: %08X\n",
-                        memory32_data->max_base_address);
-
-       acpi_os_printf ("\t\t_alignment: %08X\n",
-                        memory32_data->alignment);
-
-       acpi_os_printf ("\t\t_range length: %08X\n",
-                        memory32_data->range_length);
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_fixed_memory32
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_fixed_memory32 (
-       RESOURCE_DATA           *data)
-{
-       FIXED_MEMORY32_RESOURCE *fixed_memory32_data = (FIXED_MEMORY32_RESOURCE*) data;
-
-
-       acpi_os_printf ("\t32-Bit Fixed Location Memory Range Resource\n");
-
-       acpi_os_printf ("\t\t_read%s\n",
-                        READ_WRITE_MEMORY ==
-                        fixed_memory32_data->read_write_attribute ?
-                        "/Write" : " Only");
-
-       acpi_os_printf ("\t\t_range base address: %08X\n",
-                        fixed_memory32_data->range_base_address);
-
-       acpi_os_printf ("\t\t_range length: %08X\n",
-                        fixed_memory32_data->range_length);
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_address16
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_address16 (
-       RESOURCE_DATA           *data)
-{
-       ADDRESS16_RESOURCE      *address16_data = (ADDRESS16_RESOURCE*) data;
-
-
-       acpi_os_printf ("\t16-Bit Address Space Resource\n");
-       acpi_os_printf ("\t\t_resource Type: ");
-
-       switch (address16_data->resource_type) {
-       case MEMORY_RANGE:
-
-               acpi_os_printf ("Memory Range\n");
-
-               switch (address16_data->attribute.memory.cache_attribute) {
-               case NON_CACHEABLE_MEMORY:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Noncacheable memory\n");
-                       break;
-
-               case CACHABLE_MEMORY:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Cacheable memory\n");
-                       break;
-
-               case WRITE_COMBINING_MEMORY:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Write-combining memory\n");
-                       break;
-
-               case PREFETCHABLE_MEMORY:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Prefetchable memory\n");
-                       break;
-
-               default:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Invalid cache attribute\n");
-                       break;
-               }
-
-               acpi_os_printf ("\t\t_type Specific: Read%s\n",
-                       READ_WRITE_MEMORY ==
-                       address16_data->attribute.memory.read_write_attribute ?
-                       "/Write" : " Only");
-               break;
-
-       case IO_RANGE:
-
-               acpi_os_printf ("I/O Range\n");
-
-               switch (address16_data->attribute.io.range_attribute) {
-               case NON_ISA_ONLY_RANGES:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Non-ISA Io Addresses\n");
-                       break;
-
-               case ISA_ONLY_RANGES:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "ISA Io Addresses\n");
-                       break;
-
-               case ENTIRE_RANGE:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "ISA and non-ISA Io Addresses\n");
-                       break;
-
-               default:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Invalid range attribute\n");
-                       break;
-               }
-               break;
-
-       case BUS_NUMBER_RANGE:
-
-               acpi_os_printf ("Bus Number Range\n");
-               break;
-
-       default:
-
-               acpi_os_printf ("Invalid resource type. Exiting.\n");
-               return;
-       }
-
-       acpi_os_printf ("\t\t_resource %s\n",
-                       CONSUMER == address16_data->producer_consumer ?
-                       "Consumer" : "Producer");
-
-       acpi_os_printf ("\t\t%s decode\n",
-                        SUB_DECODE == address16_data->decode ?
-                        "Subtractive" : "Positive");
-
-       acpi_os_printf ("\t\t_min address is %s fixed\n",
-                        ADDRESS_FIXED == address16_data->min_address_fixed ?
-                        "" : "not");
-
-       acpi_os_printf ("\t\t_max address is %s fixed\n",
-                        ADDRESS_FIXED == address16_data->max_address_fixed ?
-                        "" : "not");
-
-       acpi_os_printf ("\t\t_granularity: %08X\n",
-                        address16_data->granularity);
-
-       acpi_os_printf ("\t\t_address range min: %08X\n",
-                        address16_data->min_address_range);
-
-       acpi_os_printf ("\t\t_address range max: %08X\n",
-                        address16_data->max_address_range);
-
-       acpi_os_printf ("\t\t_address translation offset: %08X\n",
-                        address16_data->address_translation_offset);
-
-       acpi_os_printf ("\t\t_address Length: %08X\n",
-                        address16_data->address_length);
-
-       if (0xFF != address16_data->resource_source_index) {
-               acpi_os_printf ("\t\t_resource Source Index: %X\n",
-                                address16_data->resource_source_index);
-               acpi_os_printf ("\t\t_resource Source: %s\n",
-                                address16_data->resource_source);
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_address32
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_address32 (
-       RESOURCE_DATA           *data)
-{
-       ADDRESS32_RESOURCE      *address32_data = (ADDRESS32_RESOURCE*) data;
-
-
-       acpi_os_printf ("\t32-Bit Address Space Resource\n");
-
-       switch (address32_data->resource_type) {
-       case MEMORY_RANGE:
-
-               acpi_os_printf ("\t\t_resource Type: Memory Range\n");
-
-               switch (address32_data->attribute.memory.cache_attribute) {
-               case NON_CACHEABLE_MEMORY:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Noncacheable memory\n");
-                       break;
-
-               case CACHABLE_MEMORY:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Cacheable memory\n");
-                       break;
-
-               case WRITE_COMBINING_MEMORY:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Write-combining memory\n");
-                       break;
-
-               case PREFETCHABLE_MEMORY:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Prefetchable memory\n");
-                       break;
-
-               default:
-                       acpi_os_printf ("\t\t_type Specific: "
-                                         "Invalid cache attribute\n");
-                       break;
-               }
-
-               acpi_os_printf ("\t\t_type Specific: Read%s\n",
-                       READ_WRITE_MEMORY ==
-                       address32_data->attribute.memory.read_write_attribute ?
-                       "/Write" : " Only");
-               break;
-
-       case IO_RANGE:
-
-               acpi_os_printf ("\t\t_resource Type: Io Range\n");
-
-               switch (address32_data->attribute.io.range_attribute) {
-                       case NON_ISA_ONLY_RANGES:
-                               acpi_os_printf ("\t\t_type Specific: "
-                                                 "Non-ISA Io Addresses\n");
-                               break;
-
-                       case ISA_ONLY_RANGES:
-                               acpi_os_printf ("\t\t_type Specific: "
-                                                 "ISA Io Addresses\n");
-                               break;
-
-                       case ENTIRE_RANGE:
-                               acpi_os_printf ("\t\t_type Specific: "
-                                                 "ISA and non-ISA Io Addresses\n");
-                               break;
-
-                       default:
-                               acpi_os_printf ("\t\t_type Specific: "
-                                                 "Invalid Range attribute");
-                               break;
-                       }
-               break;
-
-       case BUS_NUMBER_RANGE:
-
-               acpi_os_printf ("\t\t_resource Type: Bus Number Range\n");
-               break;
-
-       default:
-
-               acpi_os_printf ("\t\t_invalid Resource Type..exiting.\n");
-               return;
-       }
-
-       acpi_os_printf ("\t\t_resource %s\n",
-                        CONSUMER == address32_data->producer_consumer ?
-                        "Consumer" : "Producer");
-
-       acpi_os_printf ("\t\t%s decode\n",
-                        SUB_DECODE == address32_data->decode ?
-                        "Subtractive" : "Positive");
-
-       acpi_os_printf ("\t\t_min address is %s fixed\n",
-                        ADDRESS_FIXED == address32_data->min_address_fixed ?
-                        "" : "not ");
-
-       acpi_os_printf ("\t\t_max address is %s fixed\n",
-                        ADDRESS_FIXED == address32_data->max_address_fixed ?
-                        "" : "not ");
-
-       acpi_os_printf ("\t\t_granularity: %08X\n",
-                        address32_data->granularity);
-
-       acpi_os_printf ("\t\t_address range min: %08X\n",
-                        address32_data->min_address_range);
-
-       acpi_os_printf ("\t\t_address range max: %08X\n",
-                        address32_data->max_address_range);
-
-       acpi_os_printf ("\t\t_address translation offset: %08X\n",
-                        address32_data->address_translation_offset);
-
-       acpi_os_printf ("\t\t_address Length: %08X\n",
-                        address32_data->address_length);
-
-       if(0xFF != address32_data->resource_source_index) {
-               acpi_os_printf ("\t\t_resource Source Index: %X\n",
-                                address32_data->resource_source_index);
-               acpi_os_printf ("\t\t_resource Source: %s\n",
-                                address32_data->resource_source);
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_extended_irq
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_extended_irq (
-       RESOURCE_DATA           *data)
-{
-       EXTENDED_IRQ_RESOURCE   *ext_irq_data = (EXTENDED_IRQ_RESOURCE*) data;
-       u8                      index = 0;
-
-
-       acpi_os_printf ("\t_extended IRQ Resource\n");
-
-       acpi_os_printf ("\t\t_resource %s\n",
-                        CONSUMER == ext_irq_data->producer_consumer ?
-                        "Consumer" : "Producer");
-
-       acpi_os_printf ("\t\t%s\n",
-                        LEVEL_SENSITIVE == ext_irq_data->edge_level ?
-                        "Level" : "Edge");
-
-       acpi_os_printf ("\t\t_active %s\n",
-                        ACTIVE_LOW == ext_irq_data->active_high_low ?
-                        "low" : "high");
-
-       acpi_os_printf ("\t\t%s\n",
-                        SHARED == ext_irq_data->shared_exclusive ?
-                        "Shared" : "Exclusive");
-
-       acpi_os_printf ("\t\t_interrupts : %X ( ",
-                        ext_irq_data->number_of_interrupts);
-
-       for (index = 0; index < ext_irq_data->number_of_interrupts; index++) {
-               acpi_os_printf ("%X ", ext_irq_data->interrupts[index]);
-       }
-
-       acpi_os_printf (")\n");
-
-       if(0xFF != ext_irq_data->resource_source_index) {
-               acpi_os_printf ("\t\t_resource Source Index: %X",
-                                ext_irq_data->resource_source_index);
-               acpi_os_printf ("\t\t_resource Source: %s",
-                                ext_irq_data->resource_source);
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_resource_list
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Dispatches the structure to the correct dump routine.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_resource_list (
-       RESOURCE            *resource)
-{
-       u8                  count = 0;
-       u8                  done = FALSE;
-
-
-       if (acpi_dbg_level & TRACE_RESOURCES && _COMPONENT & acpi_dbg_layer) {
-               while (!done) {
-                       acpi_os_printf ("\t_resource structure %x.\n", count++);
-
-                       switch (resource->id) {
-                       case irq:
-                               acpi_rs_dump_irq (&resource->data);
-                               break;
-
-                       case dma:
-                               acpi_rs_dump_dma (&resource->data);
-                               break;
-
-                       case start_dependent_functions:
-                               acpi_rs_dump_start_dependent_functions (&resource->data);
-                               break;
-
-                       case end_dependent_functions:
-                               acpi_os_printf ("\t_end_dependent_functions Resource\n");
-                               /* Acpi_rs_dump_end_dependent_functions (Resource->Data);*/
-                               break;
-
-                       case io:
-                               acpi_rs_dump_io (&resource->data);
-                               break;
-
-                       case fixed_io:
-                               acpi_rs_dump_fixed_io (&resource->data);
-                               break;
-
-                       case vendor_specific:
-                               acpi_rs_dump_vendor_specific (&resource->data);
-                               break;
-
-                       case end_tag:
-                               /*Rs_dump_end_tag (Resource->Data);*/
-                               acpi_os_printf ("\t_end_tag Resource\n");
-                               done = TRUE;
-                               break;
-
-                       case memory24:
-                               acpi_rs_dump_memory24 (&resource->data);
-                               break;
-
-                       case memory32:
-                               acpi_rs_dump_memory32 (&resource->data);
-                               break;
-
-                       case fixed_memory32:
-                               acpi_rs_dump_fixed_memory32 (&resource->data);
-                               break;
-
-                       case address16:
-                               acpi_rs_dump_address16 (&resource->data);
-                               break;
-
-                       case address32:
-                               acpi_rs_dump_address32 (&resource->data);
-                               break;
-
-                       case extended_irq:
-                               acpi_rs_dump_extended_irq (&resource->data);
-                               break;
-
-                       default:
-                               acpi_os_printf ("Invalid resource type\n");
-                               break;
-
-                       }
-
-                       resource = (RESOURCE *) ((NATIVE_UINT) resource +
-                                        (NATIVE_UINT) resource->length);
-               }
-       }
-
-       return;
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dump_irq_list
- *
- * PARAMETERS:  Data            - pointer to the routing table to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Dispatches the structures to the correct dump routine.
- *
- ******************************************************************************/
-
-void
-acpi_rs_dump_irq_list (
-       u8                  *route_table)
-{
-       u8                  *buffer = route_table;
-       u8                  count = 0;
-       u8                  done = FALSE;
-       PCI_ROUTING_TABLE   *prt_element;
-
-
-       if (acpi_dbg_level & TRACE_RESOURCES && _COMPONENT & acpi_dbg_layer) {
-               prt_element = (PCI_ROUTING_TABLE *) buffer;
-
-               while (!done) {
-                       acpi_os_printf ("\t_pCI IRQ Routing Table structure %X.\n", count++);
-
-                       acpi_os_printf ("\t\t_address: %X\n",
-                                        prt_element->address);
-
-                       acpi_os_printf ("\t\t_pin: %X\n", prt_element->pin);
-
-                       acpi_os_printf ("\t\t_source: %s\n", prt_element->source);
-
-                       acpi_os_printf ("\t\t_source_index: %X\n",
-                                        prt_element->source_index);
-
-                       buffer += prt_element->length;
-
-                       prt_element = (PCI_ROUTING_TABLE *) buffer;
-
-                       if(0 == prt_element->length) {
-                               done = TRUE;
-                       }
-               }
-       }
-
-       return;
-}
-
diff --git a/reactos/drivers/bus/acpi/resource/rsio.c b/reactos/drivers/bus/acpi/resource/rsio.c
deleted file mode 100644 (file)
index a84b2a2..0000000
+++ /dev/null
@@ -1,526 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rsio - Acpi_rs_io_resource
- *                     Acpi_rs_fixed_io_resource
- *                     Acpi_rs_io_stream
- *                     Acpi_rs_fixed_io_stream
- *                     Acpi_rs_dma_resource
- *                     Acpi_rs_dma_stream
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rsio")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_io_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_io_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u32                     struct_size = sizeof (IO_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * The number of bytes consumed are Constant
-        */
-       *bytes_consumed = 8;
-
-       output_struct->id = io;
-
-       /*
-        * Check Decode
-        */
-       buffer += 1;
-       temp8 = *buffer;
-
-       output_struct->data.io.io_decode = temp8 & 0x01;
-
-       /*
-        * Check Min_base Address
-        */
-       buffer += 1;
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-       output_struct->data.io.min_base_address = temp16;
-
-       /*
-        * Check Max_base Address
-        */
-       buffer += 2;
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-       output_struct->data.io.max_base_address = temp16;
-
-       /*
-        * Check Base alignment
-        */
-       buffer += 2;
-       temp8 = *buffer;
-
-       output_struct->data.io.alignment = temp8;
-
-       /*
-        * Check Range_length
-        */
-       buffer += 1;
-       temp8 = *buffer;
-
-       output_struct->data.io.range_length = temp8;
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_fixed_io_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_fixed_io_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u32                     struct_size = sizeof (FIXED_IO_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * The number of bytes consumed are Constant
-        */
-       *bytes_consumed = 4;
-
-       output_struct->id = fixed_io;
-
-       /*
-        * Check Range Base Address
-        */
-       buffer += 1;
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-       output_struct->data.fixed_io.base_address = temp16;
-
-       /*
-        * Check Range_length
-        */
-       buffer += 2;
-       temp8 = *buffer;
-
-       output_struct->data.fixed_io.range_length = temp8;
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_io_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_io_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x47;
-       buffer += 1;
-
-       /*
-        * Io Information Byte
-        */
-       temp8 = (u8) (linked_list->data.io.io_decode & 0x01);
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the Range minimum base address
-        */
-       temp16 = (u16) linked_list->data.io.min_base_address;
-
-       MOVE_UNALIGNED16_TO_16 (buffer, &temp16);
-       buffer += 2;
-
-       /*
-        * Set the Range maximum base address
-        */
-       temp16 = (u16) linked_list->data.io.max_base_address;
-
-       MOVE_UNALIGNED16_TO_16 (buffer, &temp16);
-       buffer += 2;
-
-       /*
-        * Set the base alignment
-        */
-       temp8 = (u8) linked_list->data.io.alignment;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the range length
-        */
-       temp8 = (u8) linked_list->data.io.range_length;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_fixed_io_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_fixed_io_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x4B;
-
-       buffer += 1;
-
-       /*
-        * Set the Range base address
-        */
-       temp16 = (u16) linked_list->data.fixed_io.base_address;
-
-       MOVE_UNALIGNED16_TO_16 (buffer, &temp16);
-       buffer += 2;
-
-       /*
-        * Set the range length
-        */
-       temp8 = (u8) linked_list->data.fixed_io.range_length;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dma_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_dma_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u8                      temp8 = 0;
-       u8                      index;
-       u8                      i;
-       u32                     struct_size = sizeof(DMA_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * The number of bytes consumed are Constant
-        */
-       *bytes_consumed = 3;
-       output_struct->id = dma;
-
-       /*
-        * Point to the 8-bits of Byte 1
-        */
-       buffer += 1;
-       temp8 = *buffer;
-
-       /* Decode the IRQ bits */
-
-       for (i = 0, index = 0; index < 8; index++) {
-               if ((temp8 >> index) & 0x01) {
-                       output_struct->data.dma.channels[i] = index;
-                       i++;
-               }
-       }
-       output_struct->data.dma.number_of_channels = i;
-
-
-       /*
-        * Calculate the structure size based upon the number of interrupts
-        */
-       struct_size += (output_struct->data.dma.number_of_channels - 1) * 4;
-
-       /*
-        * Point to Byte 2
-        */
-       buffer += 1;
-       temp8 = *buffer;
-
-       /*
-        * Check for transfer preference (Bits[1:0])
-        */
-       output_struct->data.dma.transfer = temp8 & 0x03;
-
-       if (0x03 == output_struct->data.dma.transfer) {
-               return (AE_BAD_DATA);
-       }
-
-       /*
-        * Get bus master preference (Bit[2])
-        */
-       output_struct->data.dma.bus_master = (temp8 >> 2) & 0x01;
-
-       /*
-        * Get channel speed support (Bits[6:5])
-        */
-       output_struct->data.dma.type = (temp8 >> 5) & 0x03;
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_dma_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_dma_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u8                      index;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x2A;
-       buffer += 1;
-       temp8 = 0;
-
-       /*
-        * Loop through all of the Channels and set the mask bits
-        */
-       for (index = 0;
-                index < linked_list->data.dma.number_of_channels;
-                index++) {
-               temp16 = (u16) linked_list->data.dma.channels[index];
-               temp8 |= 0x1 << temp16;
-       }
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the DMA Info
-        */
-       temp8 = (u8) ((linked_list->data.dma.type & 0x03) << 5);
-       temp8 |= ((linked_list->data.dma.bus_master & 0x01) << 2);
-       temp8 |= (linked_list->data.dma.transfer & 0x03);
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/resource/rsirq.c b/reactos/drivers/bus/acpi/resource/rsirq.c
deleted file mode 100644 (file)
index b5dccbb..0000000
+++ /dev/null
@@ -1,555 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rsirq - Acpi_rs_irq_resource,
- *                      Acpi_rs_irq_stream
- *                      Acpi_rs_extended_irq_resource
- *                      Acpi_rs_extended_irq_stream
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rsirq")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_irq_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_irq_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u8                      index;
-       u8                      i;
-       u32                     struct_size = sizeof (IRQ_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * The number of bytes consumed are contained in the descriptor
-        *  (Bits:0-1)
-        */
-       temp8 = *buffer;
-       *bytes_consumed = (temp8 & 0x03) + 1;
-       output_struct->id = irq;
-
-       /*
-        * Point to the 16-bits of Bytes 1 and 2
-        */
-       buffer += 1;
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-       output_struct->data.irq.number_of_interrupts = 0;
-
-       /* Decode the IRQ bits */
-
-       for (i = 0, index = 0; index < 16; index++) {
-               if((temp16 >> index) & 0x01) {
-                       output_struct->data.irq.interrupts[i] = index;
-                       i++;
-               }
-       }
-       output_struct->data.irq.number_of_interrupts = i;
-
-       /*
-        * Calculate the structure size based upon the number of interrupts
-        */
-       struct_size += (output_struct->data.irq.number_of_interrupts - 1) * 4;
-
-       /*
-        * Point to Byte 3 if it is used
-        */
-       if (4 == *bytes_consumed) {
-               buffer += 2;
-               temp8 = *buffer;
-
-               /*
-                * Check for HE, LL or HL
-                */
-               if (temp8 & 0x01) {
-                       output_struct->data.irq.edge_level = EDGE_SENSITIVE;
-                       output_struct->data.irq.active_high_low = ACTIVE_HIGH;
-               }
-
-               else {
-                       if (temp8 & 0x8) {
-                               output_struct->data.irq.edge_level = LEVEL_SENSITIVE;
-                               output_struct->data.irq.active_high_low = ACTIVE_LOW;
-                       }
-
-                       else {
-                               /*
-                                * Only _LL and _HE polarity/trigger interrupts
-                                *  are allowed (ACPI spec v1.0b ection 6.4.2.1),
-                                *  so an error will occur if we reach this point
-                                */
-                               return (AE_BAD_DATA);
-                       }
-               }
-
-               /*
-                * Check for sharable
-                */
-               output_struct->data.irq.shared_exclusive = (temp8 >> 3) & 0x01;
-       }
-
-       else {
-               /*
-                * Assume Edge Sensitive, Active High, Non-Sharable
-                *  per ACPI Specification
-                */
-               output_struct->data.irq.edge_level = EDGE_SENSITIVE;
-               output_struct->data.irq.active_high_low = ACTIVE_HIGH;
-               output_struct->data.irq.shared_exclusive = EXCLUSIVE;
-       }
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_irq_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_irq_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u8                      index;
-       u8                      IRQinfo_byte_needed;
-
-
-       /*
-        * The descriptor field is set based upon whether a third byte is
-        *  needed to contain the IRQ Information.
-        */
-       if (EDGE_SENSITIVE == linked_list->data.irq.edge_level &&
-               ACTIVE_HIGH == linked_list->data.irq.active_high_low &&
-               EXCLUSIVE == linked_list->data.irq.shared_exclusive) {
-               *buffer = 0x22;
-               IRQinfo_byte_needed = FALSE;
-       }
-       else {
-               *buffer = 0x23;
-               IRQinfo_byte_needed = TRUE;
-       }
-
-       buffer += 1;
-       temp16 = 0;
-
-       /*
-        * Loop through all of the interrupts and set the mask bits
-        */
-       for(index = 0;
-               index < linked_list->data.irq.number_of_interrupts;
-               index++) {
-               temp8 = (u8) linked_list->data.irq.interrupts[index];
-               temp16 |= 0x1 << temp8;
-       }
-
-       MOVE_UNALIGNED16_TO_16 (buffer, &temp16);
-       buffer += 2;
-
-       /*
-        * Set the IRQ Info byte if needed.
-        */
-       if (IRQinfo_byte_needed) {
-               temp8 = 0;
-               temp8 = (u8) ((linked_list->data.irq.shared_exclusive &
-                                0x01) << 4);
-
-               if (LEVEL_SENSITIVE == linked_list->data.irq.edge_level &&
-                       ACTIVE_LOW == linked_list->data.irq.active_high_low) {
-                       temp8 |= 0x08;
-               }
-
-               else {
-                       temp8 |= 0x01;
-               }
-
-               *buffer = temp8;
-               buffer += 1;
-       }
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_extended_irq_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_extended_irq_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u8                      index;
-       u32                     struct_size = sizeof (EXTENDED_IRQ_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * Point past the Descriptor to get the number of bytes consumed
-        */
-       buffer += 1;
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-       *bytes_consumed = temp16 + 3;
-       output_struct->id = extended_irq;
-
-       /*
-        * Point to the Byte3
-        */
-       buffer += 2;
-       temp8 = *buffer;
-
-       output_struct->data.extended_irq.producer_consumer = temp8 & 0x01;
-
-       /*
-        * Check for HE, LL or HL
-        */
-       if(temp8 & 0x02) {
-               output_struct->data.extended_irq.edge_level = EDGE_SENSITIVE;
-               output_struct->data.extended_irq.active_high_low = ACTIVE_HIGH;
-       }
-
-       else {
-               if(temp8 & 0x4) {
-                       output_struct->data.extended_irq.edge_level = LEVEL_SENSITIVE;
-                       output_struct->data.extended_irq.active_high_low = ACTIVE_LOW;
-               }
-
-               else {
-                       /*
-                        * Only _LL and _HE polarity/trigger interrupts
-                        *  are allowed (ACPI spec v1.0b ection 6.4.2.1),
-                        *  so an error will occur if we reach this point
-                        */
-                       return (AE_BAD_DATA);
-               }
-       }
-
-       /*
-        * Check for sharable
-        */
-       output_struct->data.extended_irq.shared_exclusive =
-                       (temp8 >> 3) & 0x01;
-
-       /*
-        * Point to Byte4 (IRQ Table length)
-        */
-       buffer += 1;
-       temp8 = *buffer;
-
-       output_struct->data.extended_irq.number_of_interrupts = temp8;
-
-       /*
-        * Add any additional structure size to properly calculate
-        *  the next pointer at the end of this function
-        */
-        struct_size += (temp8 - 1) * 4;
-
-       /*
-        * Point to Byte5 (First IRQ Number)
-        */
-       buffer += 1;
-
-       /*
-        * Cycle through every IRQ in the table
-        */
-       for (index = 0; index < temp8; index++) {
-               output_struct->data.extended_irq.interrupts[index] =
-                               (u32)*buffer;
-
-               /* Point to the next IRQ */
-
-               buffer += 4;
-       }
-
-       /*
-        * This will leave us pointing to the Resource Source Index
-        *  If it is present, then save it off and calculate the
-        *  pointer to where the null terminated string goes:
-        *  Each Interrupt takes 32-bits + the 5 bytes of the
-        *  stream that are default.
-        */
-       if (*bytes_consumed >
-               (u32)(output_struct->data.extended_irq.number_of_interrupts *
-                4) + 5) {
-               /* Dereference the Index */
-
-               temp8 = *buffer;
-               output_struct->data.extended_irq.resource_source_index =
-                               (u32)temp8;
-
-               /* Point to the String */
-
-               buffer += 1;
-
-               /* Copy the string into the buffer */
-
-               index = 0;
-
-               while (0x00 != *buffer) {
-                       output_struct->data.extended_irq.resource_source[index] =
-                                       *buffer;
-
-                       buffer += 1;
-                       index += 1;
-               }
-
-               /*
-                * Add the terminating null
-                */
-               output_struct->data.extended_irq.resource_source[index] = 0x00;
-               output_struct->data.extended_irq.resource_source_string_length =
-                               index + 1;
-
-               /*
-                * In order for the Struct_size to fall on a 32-bit boundry,
-                *  calculate the length of the string and expand the
-                *  Struct_size to the next 32-bit boundry.
-                */
-               temp8 = (u8) (index + 1);
-               temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
-       }
-
-       else {
-               output_struct->data.extended_irq.resource_source_index = 0x00;
-               output_struct->data.extended_irq.resource_source_string_length = 0;
-               output_struct->data.extended_irq.resource_source[0] = 0x00;
-       }
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_extended_irq_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_extended_irq_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u16                     *length_field;
-       u8                      temp8 = 0;
-       u8                      index;
-       NATIVE_CHAR             *temp_pointer = NULL;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x89;
-       buffer += 1;
-
-       /*
-        * Set a pointer to the Length field - to be filled in later
-        */
-
-       length_field = (u16 *)buffer;
-       buffer += 2;
-
-       /*
-        * Set the Interrupt vector flags
-        */
-       temp8 = (u8)(linked_list->data.extended_irq.producer_consumer & 0x01);
-
-       temp8 |= ((linked_list->data.extended_irq.shared_exclusive & 0x01) << 3);
-
-       if (LEVEL_SENSITIVE == linked_list->data.extended_irq.edge_level &&
-          ACTIVE_LOW == linked_list->data.extended_irq.active_high_low) {
-               temp8 |= 0x04;
-       }
-       else {
-               temp8 |= 0x02;
-       }
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the Interrupt table length
-        */
-       temp8 = (u8) linked_list->data.extended_irq.number_of_interrupts;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       for (index = 0;
-                index < linked_list->data.extended_irq.number_of_interrupts;
-                index++) {
-               MOVE_UNALIGNED32_TO_32 (buffer,
-                                 &linked_list->data.extended_irq.interrupts[index]);
-               buffer += 4;
-       }
-
-       /*
-        * Resource Source Index and Resource Source are optional
-        */
-       if (0 != linked_list->data.extended_irq.resource_source_string_length) {
-               *buffer = (u8) linked_list->data.extended_irq.resource_source_index;
-               buffer += 1;
-
-               temp_pointer = (NATIVE_CHAR *) buffer;
-
-               /*
-                * Copy the string
-                */
-               STRCPY (temp_pointer, linked_list->data.extended_irq.resource_source);
-
-               /*
-                * Buffer needs to be set to the length of the sting + one for the
-                *  terminating null
-                */
-               buffer += (STRLEN (linked_list->data.extended_irq.resource_source) + 1);
-       }
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       /*
-        * Set the length field to the number of bytes consumed
-        *  minus the header size (3 bytes)
-        */
-       *length_field = (u16) (*bytes_consumed - 3);
-
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/resource/rslist.c b/reactos/drivers/bus/acpi/resource/rslist.c
deleted file mode 100644 (file)
index 9c255d1..0000000
+++ /dev/null
@@ -1,499 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rslist - Acpi_rs_byte_stream_to_list
- *                       Acpi_list_to_byte_stream
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rslist")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_byte_stream_to_list
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource byte stream
- *              Byte_stream_buffer_length - Length of Byte_stream_buffer
- *              Output_buffer           - Pointer to the buffer that will
- *                                          contain the output structures
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Takes the resource byte stream and parses it, creating a
- *              linked list of resources in the caller's output buffer
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_byte_stream_to_list (
-       u8                      *byte_stream_buffer,
-       u32                     byte_stream_buffer_length,
-       u8                      **output_buffer)
-{
-       ACPI_STATUS             status;
-       u32                     bytes_parsed = 0;
-       u8                      resource_type = 0;
-       u32                     bytes_consumed = 0;
-       u8                      **buffer = output_buffer;
-       u32                     structure_size = 0;
-       u8                      end_tag_processed = FALSE;
-
-
-       while (bytes_parsed < byte_stream_buffer_length &&
-                       FALSE == end_tag_processed) {
-               /*
-                * Look at the next byte in the stream
-                */
-               resource_type = *byte_stream_buffer;
-
-               /*
-                * See if this is a small or large resource
-                */
-               if(resource_type & 0x80) {
-                       /*
-                        * Large Resource Type
-                        */
-                       switch (resource_type) {
-                       case MEMORY_RANGE_24:
-                               /*
-                                * 24-Bit Memory Resource
-                                */
-                               status = acpi_rs_memory24_resource(byte_stream_buffer,
-                                                  &bytes_consumed,
-                                                  buffer,
-                                                  &structure_size);
-
-                               break;
-
-                       case LARGE_VENDOR_DEFINED:
-                               /*
-                                * Vendor Defined Resource
-                                */
-                               status = acpi_rs_vendor_resource(byte_stream_buffer,
-                                                &bytes_consumed,
-                                                buffer,
-                                                &structure_size);
-
-                               break;
-
-                       case MEMORY_RANGE_32:
-                               /*
-                                * 32-Bit Memory Range Resource
-                                */
-                               status = acpi_rs_memory32_range_resource(byte_stream_buffer,
-                                                 &bytes_consumed,
-                                                 buffer,
-                                                 &structure_size);
-
-                               break;
-
-                       case FIXED_MEMORY_RANGE_32:
-                               /*
-                                * 32-Bit Fixed Memory Resource
-                                */
-                               status = acpi_rs_fixed_memory32_resource(byte_stream_buffer,
-                                                 &bytes_consumed,
-                                                 buffer,
-                                                 &structure_size);
-
-                               break;
-
-                       case DWORD_ADDRESS_SPACE:
-                               /*
-                                * 32-Bit Address Resource
-                                */
-                               status = acpi_rs_address32_resource(byte_stream_buffer,
-                                                &bytes_consumed,
-                                                buffer,
-                                                &structure_size);
-
-                               break;
-
-                       case WORD_ADDRESS_SPACE:
-                               /*
-                                * 16-Bit Address Resource
-                                */
-                               status = acpi_rs_address16_resource(byte_stream_buffer,
-                                                &bytes_consumed,
-                                                buffer,
-                                                &structure_size);
-
-                               break;
-
-                       case EXTENDED_IRQ:
-                               /*
-                                * Extended IRQ
-                                */
-                               status = acpi_rs_extended_irq_resource(byte_stream_buffer,
-                                                  &bytes_consumed,
-                                                  buffer,
-                                                  &structure_size);
-
-                               break;
-
-/* TBD: [Future] 64-bit not currently supported */
-/*
-                       case 0x8A:
-                               break;
-*/
-
-                       default:
-                               /*
-                                * If we get here, everything is out of sync,
-                                *  so exit with an error
-                                */
-                               return (AE_AML_ERROR);
-                               break;
-                       }
-               }
-
-               else {
-                       /*
-                        * Small Resource Type
-                        *  Only bits 7:3 are valid
-                        */
-                       resource_type >>= 3;
-
-                       switch(resource_type) {
-                       case IRQ_FORMAT:
-                               /*
-                                * IRQ Resource
-                                */
-                               status = acpi_rs_irq_resource(byte_stream_buffer,
-                                                &bytes_consumed,
-                                                buffer,
-                                                &structure_size);
-
-                               break;
-
-                       case DMA_FORMAT:
-                               /*
-                                * DMA Resource
-                                */
-                               status = acpi_rs_dma_resource(byte_stream_buffer,
-                                                &bytes_consumed,
-                                                buffer,
-                                                &structure_size);
-
-                               break;
-
-                       case START_DEPENDENT_TAG:
-                               /*
-                                * Start Dependent Functions Resource
-                                */
-                               status = acpi_rs_start_dependent_functions_resource(byte_stream_buffer,
-                                                  &bytes_consumed,
-                                                  buffer,
-                                                  &structure_size);
-
-                               break;
-
-                       case END_DEPENDENT_TAG:
-                               /*
-                                * End Dependent Functions Resource
-                                */
-                               status = acpi_rs_end_dependent_functions_resource(byte_stream_buffer,
-                                                &bytes_consumed,
-                                                buffer,
-                                                &structure_size);
-
-                               break;
-
-                       case IO_PORT_DESCRIPTOR:
-                               /*
-                                * IO Port Resource
-                                */
-                               status = acpi_rs_io_resource(byte_stream_buffer,
-                                                  &bytes_consumed,
-                                                  buffer,
-                                                  &structure_size);
-
-                               break;
-
-                       case FIXED_LOCATION_IO_DESCRIPTOR:
-                               /*
-                                * Fixed IO Port Resource
-                                */
-                               status = acpi_rs_fixed_io_resource(byte_stream_buffer,
-                                                 &bytes_consumed,
-                                                 buffer,
-                                                 &structure_size);
-
-                               break;
-
-                       case SMALL_VENDOR_DEFINED:
-                               /*
-                                * Vendor Specific Resource
-                                */
-                               status = acpi_rs_vendor_resource(byte_stream_buffer,
-                                                &bytes_consumed,
-                                                buffer,
-                                                &structure_size);
-
-                               break;
-
-                       case END_TAG:
-                               /*
-                                * End Tag
-                                */
-                               status = acpi_rs_end_tag_resource(byte_stream_buffer,
-                                                &bytes_consumed,
-                                                buffer,
-                                                &structure_size);
-                               end_tag_processed = TRUE;
-
-                               break;
-
-                       default:
-                               /*
-                                * If we get here, everything is out of sync,
-                                *  so exit with an error
-                                */
-                               return (AE_AML_ERROR);
-                               break;
-
-                       } /* switch */
-               }  /* end else */
-
-               /*
-                * Update the return value and counter
-                */
-               bytes_parsed += bytes_consumed;
-
-               /*
-                * Set the byte stream to point to the next resource
-                */
-               byte_stream_buffer += bytes_consumed;
-
-               /*
-                * Set the Buffer to the next structure
-                */
-               *buffer += structure_size;
-
-       } /*  end while */
-
-       /*
-        * Check the reason for exiting the while loop
-        */
-       if (TRUE != end_tag_processed) {
-               return (AE_AML_ERROR);
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_list_to_byte_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Byte_steam_size_needed  - Calculated size of the byte stream
- *                                          needed from calling
- *                                          Acpi_rs_calculate_byte_stream_length()
- *                                          The size of the Output_buffer is
- *                                          guaranteed to be >=
- *                                          Byte_stream_size_needed
- *              Output_buffer           - Pointer to the buffer that will
- *                                          contain the byte stream
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Takes the resource linked list and parses it, creating a
- *              byte stream of resources in the caller's output buffer
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_list_to_byte_stream (
-       RESOURCE                *linked_list,
-       u32                     byte_stream_size_needed,
-       u8                      **output_buffer)
-{
-       ACPI_STATUS             status;
-       u8                      *buffer = *output_buffer;
-       u32                     bytes_consumed = 0;
-       u8                      done = FALSE;
-
-
-       while (!done) {
-               switch (linked_list->id) {
-               case irq:
-                       /*
-                        * IRQ Resource
-                        */
-                       status = acpi_rs_irq_stream (linked_list,
-                                          &buffer,
-                                          &bytes_consumed);
-                       break;
-
-               case dma:
-                       /*
-                        * DMA Resource
-                        */
-                       status = acpi_rs_dma_stream (linked_list,
-                                          &buffer,
-                                          &bytes_consumed);
-                       break;
-
-               case start_dependent_functions:
-                       /*
-                        * Start Dependent Functions Resource
-                        */
-                       status = acpi_rs_start_dependent_functions_stream (linked_list,
-                                         &buffer,
-                                         &bytes_consumed);
-                       break;
-
-               case end_dependent_functions:
-                       /*
-                        * End Dependent Functions Resource
-                        */
-                       status = acpi_rs_end_dependent_functions_stream (linked_list,
-                                          &buffer,
-                                          &bytes_consumed);
-                       break;
-
-               case io:
-                       /*
-                        * IO Port Resource
-                        */
-                       status = acpi_rs_io_stream (linked_list,
-                                         &buffer,
-                                         &bytes_consumed);
-                       break;
-
-               case fixed_io:
-                       /*
-                        * Fixed IO Port Resource
-                        */
-                       status = acpi_rs_fixed_io_stream (linked_list,
-                                        &buffer,
-                                        &bytes_consumed);
-                       break;
-
-               case vendor_specific:
-                       /*
-                        * Vendor Defined Resource
-                        */
-                       status = acpi_rs_vendor_stream (linked_list,
-                                          &buffer,
-                                          &bytes_consumed);
-                       break;
-
-               case end_tag:
-                       /*
-                        * End Tag
-                        */
-                       status = acpi_rs_end_tag_stream (linked_list,
-                                          &buffer,
-                                          &bytes_consumed);
-
-                       /*
-                        * An End Tag indicates the end of the Resource Template
-                        */
-                       done = TRUE;
-                       break;
-
-               case memory24:
-                       /*
-                        * 24-Bit Memory Resource
-                        */
-                       status = acpi_rs_memory24_stream (linked_list,
-                                         &buffer,
-                                         &bytes_consumed);
-                       break;
-
-               case memory32:
-                       /*
-                        * 32-Bit Memory Range Resource
-                        */
-                       status = acpi_rs_memory32_range_stream (linked_list,
-                                        &buffer,
-                                        &bytes_consumed);
-                       break;
-
-               case fixed_memory32:
-                       /*
-                        * 32-Bit Fixed Memory Resource
-                        */
-                       status = acpi_rs_fixed_memory32_stream (linked_list,
-                                        &buffer,
-                                        &bytes_consumed);
-                       break;
-
-               case address16:
-                       /*
-                        * 16-Bit Address Descriptor Resource
-                        */
-                       status = acpi_rs_address16_stream (linked_list,
-                                          &buffer,
-                                          &bytes_consumed);
-                       break;
-
-               case address32:
-                       /*
-                        * 32-Bit Address Descriptor Resource
-                        */
-                       status = acpi_rs_address32_stream (linked_list,
-                                          &buffer,
-                                          &bytes_consumed);
-                       break;
-
-               case extended_irq:
-                       /*
-                        * Extended IRQ Resource
-                        */
-                       status = acpi_rs_extended_irq_stream (linked_list,
-                                         &buffer,
-                                         &bytes_consumed);
-                       break;
-
-               default:
-                       /*
-                        * If we get here, everything is out of sync,
-                        *  so exit with an error
-                        */
-                       return (AE_BAD_DATA);
-                       break;
-
-               } /* switch (Linked_list->Id) */
-
-               /*
-                * Set the Buffer to point to the open byte
-                */
-               buffer += bytes_consumed;
-
-               /*
-                * Point to the next object
-                */
-               linked_list = (RESOURCE *) ((NATIVE_UINT) linked_list +
-                                 (NATIVE_UINT) linked_list->length);
-       }
-
-       return  (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/resource/rsmemory.c b/reactos/drivers/bus/acpi/resource/rsmemory.c
deleted file mode 100644 (file)
index 3efab7d..0000000
+++ /dev/null
@@ -1,556 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rsmem24 - Acpi_rs_memory24_resource
- *                        Acpi_rs_memory24_stream
- *                        Acpi_rs_memory32_range_resource
- *                        Acpi_rs_fixed_memory32_resource
- *                        Acpi_rs_memory32_range_stream
- *                        Acpi_rs_fixed_memory32_stream
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rsmemory")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_memory24_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_memory24_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u32                     struct_size = sizeof (MEMORY24_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * Point past the Descriptor to get the number of bytes consumed
-        */
-       buffer += 1;
-
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       *bytes_consumed = temp16 + 3;
-       output_struct->id = memory24;
-
-       /*
-        * Check Byte 3 the Read/Write bit
-        */
-       temp8 = *buffer;
-       buffer += 1;
-       output_struct->data.memory24.read_write_attribute = temp8 & 0x01;
-
-       /*
-        * Get Min_base_address (Bytes 4-5)
-        */
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       output_struct->data.memory24.min_base_address = temp16;
-
-       /*
-        * Get Max_base_address (Bytes 6-7)
-        */
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       output_struct->data.memory24.max_base_address = temp16;
-
-       /*
-        * Get Alignment (Bytes 8-9)
-        */
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       output_struct->data.memory24.alignment = temp16;
-
-       /*
-        * Get Range_length (Bytes 10-11)
-        */
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-       output_struct->data.memory24.range_length = temp16;
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_memory24_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_memory24_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x81;
-       buffer += 1;
-
-       /*
-        * The length field is static
-        */
-       temp16 = 0x09;
-       MOVE_UNALIGNED16_TO_16 (buffer, &temp16);
-       buffer += 2;
-
-       /*
-        * Set the Information Byte
-        */
-       temp8 = (u8) (linked_list->data.memory24.read_write_attribute & 0x01);
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the Range minimum base address
-        */
-       MOVE_UNALIGNED16_TO_16 (buffer, &linked_list->data.memory24.min_base_address);
-       buffer += 2;
-
-       /*
-        * Set the Range maximum base address
-        */
-       MOVE_UNALIGNED16_TO_16 (buffer, &linked_list->data.memory24.max_base_address);
-       buffer += 2;
-
-       /*
-        * Set the base alignment
-        */
-       MOVE_UNALIGNED16_TO_16 (buffer, &linked_list->data.memory24.alignment);
-       buffer += 2;
-
-       /*
-        * Set the range length
-        */
-       MOVE_UNALIGNED16_TO_16 (buffer, &linked_list->data.memory24.range_length);
-       buffer += 2;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_memory32_range_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_memory32_range_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u32                     struct_size = sizeof (MEMORY32_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * Point past the Descriptor to get the number of bytes consumed
-        */
-       buffer += 1;
-
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       *bytes_consumed = temp16 + 3;
-
-       output_struct->id = memory32;
-
-       /*
-        *  Point to the place in the output buffer where the data portion will
-        *    begin.
-        *  1. Set the RESOURCE_DATA * Data to point to it's own address, then
-        *  2. Set the pointer to the next address.
-        *
-        *  NOTE: Output_struct->Data is cast to u8, otherwise, this addition adds
-        *  4 * sizeof(RESOURCE_DATA) instead of 4 * sizeof(u8)
-        */
-
-       /*
-        * Check Byte 3 the Read/Write bit
-        */
-       temp8 = *buffer;
-       buffer += 1;
-
-       output_struct->data.memory32.read_write_attribute = temp8 & 0x01;
-
-       /*
-        * Get Min_base_address (Bytes 4-7)
-        */
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.memory32.min_base_address,
-                        buffer);
-       buffer += 4;
-
-       /*
-        * Get Max_base_address (Bytes 8-11)
-        */
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.memory32.max_base_address,
-                        buffer);
-       buffer += 4;
-
-       /*
-        * Get Alignment (Bytes 12-15)
-        */
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.memory32.alignment, buffer);
-       buffer += 4;
-
-       /*
-        * Get Range_length (Bytes 16-19)
-        */
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.memory32.range_length, buffer);
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_fixed_memory32_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_fixed_memory32_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u32                     struct_size = sizeof (FIXED_MEMORY32_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * Point past the Descriptor to get the number of bytes consumed
-        */
-       buffer += 1;
-       MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-       buffer += 2;
-       *bytes_consumed = temp16 + 3;
-
-       output_struct->id = fixed_memory32;
-
-       /*
-        * Check Byte 3 the Read/Write bit
-        */
-       temp8 = *buffer;
-       buffer += 1;
-       output_struct->data.fixed_memory32.read_write_attribute = temp8 & 0x01;
-
-       /*
-        * Get Range_base_address (Bytes 4-7)
-        */
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.fixed_memory32.range_base_address,
-                        buffer);
-       buffer += 4;
-
-       /*
-        * Get Range_length (Bytes 8-11)
-        */
-       MOVE_UNALIGNED32_TO_32 (&output_struct->data.fixed_memory32.range_length,
-                        buffer);
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_memory32_range_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_memory32_range_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x85;
-       buffer += 1;
-
-       /*
-        * The length field is static
-        */
-       temp16 = 0x11;
-
-       MOVE_UNALIGNED16_TO_16 (buffer, &temp16);
-       buffer += 2;
-
-       /*
-        * Set the Information Byte
-        */
-       temp8 = (u8) (linked_list->data.memory32.read_write_attribute & 0x01);
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the Range minimum base address
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer, &linked_list->data.memory32.min_base_address);
-       buffer += 4;
-
-       /*
-        * Set the Range maximum base address
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer, &linked_list->data.memory32.max_base_address);
-       buffer += 4;
-
-       /*
-        * Set the base alignment
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer, &linked_list->data.memory32.alignment);
-       buffer += 4;
-
-       /*
-        * Set the range length
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer, &linked_list->data.memory32.range_length);
-       buffer += 4;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_fixed_memory32_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_fixed_memory32_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x86;
-       buffer += 1;
-
-       /*
-        * The length field is static
-        */
-       temp16 = 0x09;
-
-       MOVE_UNALIGNED16_TO_16 (buffer, &temp16);
-       buffer += 2;
-
-       /*
-        * Set the Information Byte
-        */
-       temp8 = (u8) (linked_list->data.fixed_memory32.read_write_attribute & 0x01);
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the Range base address
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer,
-                        &linked_list->data.fixed_memory32.range_base_address);
-       buffer += 4;
-
-       /*
-        * Set the range length
-        */
-       MOVE_UNALIGNED32_TO_32 (buffer,
-                        &linked_list->data.fixed_memory32.range_length);
-       buffer += 4;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/resource/rsmisc.c b/reactos/drivers/bus/acpi/resource/rsmisc.c
deleted file mode 100644 (file)
index 134ca94..0000000
+++ /dev/null
@@ -1,605 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rsmisc - Acpi_rs_end_tag_resource
- *                       Acpi_rs_end_tag_stream
- *                       Acpi_rs_vendor_resource
- *                       Acpi_rs_vendor_stream
- *                       Acpi_rs_start_dependent_functions_resource
- *                       Acpi_rs_end_dependent_functions_resource
- *                       Acpi_rs_start_dependent_functions_stream
- *                       Acpi_rs_end_dependent_functions_stream
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rsmisc")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_end_tag_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_end_tag_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u32                     struct_size = RESOURCE_LENGTH;
-
-
-       /*
-        * The number of bytes consumed is static
-        */
-       *bytes_consumed = 2;
-
-       /*
-        *  Fill out the structure
-        */
-       output_struct->id = end_tag;
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = 0;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_end_tag_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_end_tag_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u8                      temp8 = 0;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x79;
-       buffer += 1;
-
-       /*
-        * Set the Checksum - zero means that the resource data is treated as if
-        *  the checksum operation succeeded (ACPI Spec 1.0b Section 6.4.2.8)
-        */
-       temp8 = 0;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_vendor_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_vendor_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u8                      index;
-       u32                     struct_size = sizeof (VENDOR_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * Dereference the Descriptor to find if this is a large or small item.
-        */
-       temp8 = *buffer;
-
-       if (temp8 & 0x80) {
-               /*
-                * Large Item
-                */
-               /* Point to the length field */
-
-               buffer += 1;
-
-               /* Dereference */
-
-               MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-
-               /* Calculate bytes consumed */
-
-               *bytes_consumed = temp16 + 3;
-
-               /* Point to the first vendor byte */
-
-               buffer += 2;
-       }
-
-       else {
-               /*
-                * Small Item
-                */
-
-               /* Dereference the size */
-
-               temp16 = (u8)(*buffer & 0x07);
-
-               /* Calculate bytes consumed */
-
-               *bytes_consumed = temp16 + 1;
-
-               /* Point to the first vendor byte */
-
-               buffer += 1;
-       }
-
-       output_struct->id = vendor_specific;
-       output_struct->data.vendor_specific.length = temp16;
-
-       for (index = 0; index < temp16; index++) {
-               output_struct->data.vendor_specific.reserved[index] = *buffer;
-               buffer += 1;
-       }
-
-       /*
-        * In order for the Struct_size to fall on a 32-bit boundry,
-        *  calculate the length of the vendor string and expand the
-        *  Struct_size to the next 32-bit boundry.
-        */
-       struct_size += ROUND_UP_TO_32_bITS (temp16);
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_vendor_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_vendor_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u16                     temp16 = 0;
-       u8                      temp8 = 0;
-       u8                      index;
-
-
-       /*
-        * Dereference the length to find if this is a large or small item.
-        */
-
-       if(linked_list->data.vendor_specific.length > 7) {
-               /*
-                * Large Item
-                */
-               /*
-                * Set the descriptor field and length bytes
-                */
-               *buffer = 0x84;
-               buffer += 1;
-
-               temp16 = (u16) linked_list->data.vendor_specific.length;
-
-               MOVE_UNALIGNED16_TO_16 (buffer, &temp16);
-               buffer += 2;
-       }
-
-       else {
-               /*
-                * Small Item
-                */
-
-               /*
-                * Set the descriptor field
-                */
-               temp8 = 0x70;
-               temp8 |= linked_list->data.vendor_specific.length;
-
-               *buffer = temp8;
-               buffer += 1;
-       }
-
-       /*
-        * Loop through all of the Vendor Specific fields
-        */
-       for (index = 0; index < linked_list->data.vendor_specific.length; index++) {
-               temp8 = linked_list->data.vendor_specific.reserved[index];
-
-               *buffer = temp8;
-               buffer += 1;
-       }
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_start_dependent_functions_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_start_dependent_functions_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       u8                      *buffer = byte_stream_buffer;
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u8                      temp8 = 0;
-       u32                     struct_size =
-                         sizeof(START_DEPENDENT_FUNCTIONS_RESOURCE) +
-                         RESOURCE_LENGTH_NO_DATA;
-
-
-       /*
-        * The number of bytes consumed are contained in the descriptor (Bits:0-1)
-        */
-       temp8 = *buffer;
-
-       *bytes_consumed = (temp8 & 0x01) + 1;
-
-       output_struct->id = start_dependent_functions;
-
-       /*
-        * Point to Byte 1 if it is used
-        */
-       if (2 == *bytes_consumed) {
-               buffer += 1;
-               temp8 = *buffer;
-
-               /*
-                * Check Compatibility priority
-                */
-               output_struct->data.start_dependent_functions.compatibility_priority =
-                               temp8 & 0x03;
-
-               if (3 == output_struct->data.start_dependent_functions.compatibility_priority) {
-                       return (AE_AML_ERROR);
-               }
-
-               /*
-                * Check Performance/Robustness preference
-                */
-               output_struct->data.start_dependent_functions.performance_robustness =
-                               (temp8 >> 2) & 0x03;
-
-               if (3 == output_struct->data.start_dependent_functions.performance_robustness) {
-                       return (AE_AML_ERROR);
-               }
-       }
-
-       else {
-               output_struct->data.start_dependent_functions.compatibility_priority =
-                               ACCEPTABLE_CONFIGURATION;
-
-               output_struct->data.start_dependent_functions.performance_robustness =
-                               ACCEPTABLE_CONFIGURATION;
-       }
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_end_dependent_functions_resource
- *
- * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource input byte
- *                                          stream
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes consumed from
- *                                          the Byte_stream_buffer
- *              Output_buffer           - Pointer to the user's return buffer
- *              Structure_size          - u32 pointer that is filled with
- *                                          the number of bytes in the filled
- *                                          in structure
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *                  structure pointed to by the Output_buffer. Return the
- *                  number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_end_dependent_functions_resource (
-       u8                      *byte_stream_buffer,
-       u32                     *bytes_consumed,
-       u8                      **output_buffer,
-       u32                     *structure_size)
-{
-       RESOURCE                *output_struct = (RESOURCE *) * output_buffer;
-       u32                     struct_size = RESOURCE_LENGTH;
-
-
-       /*
-        * The number of bytes consumed is static
-        */
-       *bytes_consumed = 1;
-
-       /*
-        *  Fill out the structure
-        */
-       output_struct->id = end_dependent_functions;
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_start_dependent_functions_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_start_dependent_functions_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed)
-{
-       u8                      *buffer = *output_buffer;
-       u8                      temp8 = 0;
-
-
-       /*
-        * The descriptor field is set based upon whether a byte is needed
-        *  to contain Priority data.
-        */
-       if (ACCEPTABLE_CONFIGURATION ==
-                       linked_list->data.start_dependent_functions.compatibility_priority &&
-               ACCEPTABLE_CONFIGURATION ==
-                       linked_list->data.start_dependent_functions.performance_robustness) {
-               *buffer = 0x30;
-       }
-       else {
-               *buffer = 0x31;
-               buffer += 1;
-
-               /*
-                * Set the Priority Byte Definition
-                */
-               temp8 = 0;
-               temp8 = (u8)
-                       ((linked_list->data.start_dependent_functions.performance_robustness &
-                         0x03) << 2);
-               temp8 |=
-                       (linked_list->data.start_dependent_functions.compatibility_priority &
-                        0x03);
-
-               *buffer = temp8;
-       }
-
-       buffer += 1;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_end_dependent_functions_stream
- *
- * PARAMETERS:  Linked_list             - Pointer to the resource linked list
- *              Output_buffer           - Pointer to the user's return buffer
- *              Bytes_consumed          - u32 pointer that is filled with
- *                                          the number of bytes of the
- *                                          Output_buffer used
- *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *                  the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_end_dependent_functions_stream (
-       RESOURCE                *linked_list,
-       u8                      **output_buffer,
-       u32                     *bytes_consumed
-       )
-{
-       u8                      *buffer = *output_buffer;
-
-
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x38;
-       buffer += 1;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = (u32) ((NATIVE_UINT) buffer -
-                          (NATIVE_UINT) *output_buffer);
-
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/resource/rsutils.c b/reactos/drivers/bus/acpi/resource/rsutils.c
deleted file mode 100644 (file)
index a71b856..0000000
+++ /dev/null
@@ -1,384 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rsutils - Utilities for the resource manager
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rsutils")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_get_prt_method_data
- *
- * PARAMETERS:  Handle          - a handle to the containing object
- *              Ret_buffer      - a pointer to a buffer structure for the
- *                                  results
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to get the _PRT value of an object
- *              contained in an object specified by the handle passed in
- *
- *              If the function fails an appropriate status will be returned
- *              and the contents of the callers buffer is undefined.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_get_prt_method_data (
-       ACPI_HANDLE             handle,
-       ACPI_BUFFER             *ret_buffer)
-{
-       ACPI_OPERAND_OBJECT     *ret_obj;
-       ACPI_STATUS             status;
-       u32                     buffer_space_needed;
-
-
-       /* already validated params, so we won't repeat here */
-
-       buffer_space_needed = ret_buffer->length;
-
-       /*
-        *  Execute the method, no parameters
-        */
-       status = acpi_ns_evaluate_relative (handle, "_PRT", NULL, &ret_obj);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       if (!ret_obj) {
-               /* Return object is required */
-
-               return (AE_TYPE);
-       }
-
-
-       /*
-        * The return object will be a package, so check the
-        *  parameters.  If the return object is not a package,
-        *  then the underlying AML code is corrupt or improperly
-        *  written.
-        */
-       if (ACPI_TYPE_PACKAGE != ret_obj->common.type) {
-               status = AE_AML_OPERAND_TYPE;
-               goto cleanup;
-       }
-
-       /*
-        * Make the call to create a resource linked list from the
-        *  byte stream buffer that comes back from the _CRS method
-        *  execution.
-        */
-       status = acpi_rs_create_pci_routing_table (ret_obj,
-                         ret_buffer->pointer,
-                         &buffer_space_needed);
-
-       /*
-        * Tell the user how much of the buffer we have used or is needed
-        *  and return the final status.
-        */
-       ret_buffer->length = buffer_space_needed;
-
-
-       /* On exit, we must delete the object returned by evaluate_object */
-
-cleanup:
-
-       acpi_cm_remove_reference (ret_obj);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_get_crs_method_data
- *
- * PARAMETERS:  Handle          - a handle to the containing object
- *              Ret_buffer      - a pointer to a buffer structure for the
- *                                  results
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to get the _CRS value of an object
- *              contained in an object specified by the handle passed in
- *
- *              If the function fails an appropriate status will be returned
- *              and the contents of the callers buffer is undefined.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_get_crs_method_data (
-       ACPI_HANDLE             handle,
-       ACPI_BUFFER             *ret_buffer)
-{
-       ACPI_OPERAND_OBJECT     *ret_obj;
-       ACPI_STATUS             status;
-       u32                     buffer_space_needed = ret_buffer->length;
-
-
-       /* already validated params, so we won't repeat here */
-
-       /*
-        *  Execute the method, no parameters
-        */
-       status = acpi_ns_evaluate_relative (handle, "_CRS", NULL, &ret_obj);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       if (!ret_obj) {
-               /* Return object is required */
-
-               return (AE_TYPE);
-       }
-
-       /*
-        * The return object will be a buffer, but check the
-        *  parameters.  If the return object is not a buffer,
-        *  then the underlying AML code is corrupt or improperly
-        *  written.
-        */
-       if (ACPI_TYPE_BUFFER != ret_obj->common.type) {
-               status = AE_AML_OPERAND_TYPE;
-               goto cleanup;
-       }
-
-       /*
-        * Make the call to create a resource linked list from the
-        *  byte stream buffer that comes back from the _CRS method
-        *  execution.
-        */
-       status = acpi_rs_create_resource_list (ret_obj,
-                         ret_buffer->pointer,
-                         &buffer_space_needed);
-
-
-
-       /*
-        * Tell the user how much of the buffer we have used or is needed
-        *  and return the final status.
-        */
-       ret_buffer->length = buffer_space_needed;
-
-
-       /* On exit, we must delete the object returned by evaluate_object */
-
-cleanup:
-
-       acpi_cm_remove_reference (ret_obj);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_get_prs_method_data
- *
- * PARAMETERS:  Handle          - a handle to the containing object
- *              Ret_buffer      - a pointer to a buffer structure for the
- *                                  results
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to get the _PRS value of an object
- *              contained in an object specified by the handle passed in
- *
- *              If the function fails an appropriate status will be returned
- *              and the contents of the callers buffer is undefined.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_get_prs_method_data (
-       ACPI_HANDLE             handle,
-       ACPI_BUFFER             *ret_buffer)
-{
-       ACPI_OPERAND_OBJECT     *ret_obj;
-       ACPI_STATUS             status;
-       u32                     buffer_space_needed = ret_buffer->length;
-
-
-       /* already validated params, so we won't repeat here */
-
-       /*
-        *  Execute the method, no parameters
-        */
-       status = acpi_ns_evaluate_relative (handle, "_PRS", NULL, &ret_obj);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       if (!ret_obj) {
-               /* Return object is required */
-
-               return (AE_TYPE);
-       }
-
-       /*
-        * The return object will be a buffer, but check the
-        *  parameters.  If the return object is not a buffer,
-        *  then the underlying AML code is corrupt or improperly
-        *  written..
-        */
-       if (ACPI_TYPE_BUFFER != ret_obj->common.type) {
-               status = AE_AML_OPERAND_TYPE;
-               goto cleanup;
-       }
-
-       /*
-        * Make the call to create a resource linked list from the
-        *  byte stream buffer that comes back from the _CRS method
-        *  execution.
-        */
-       status = acpi_rs_create_resource_list (ret_obj,
-                         ret_buffer->pointer,
-                         &buffer_space_needed);
-
-       /*
-        * Tell the user how much of the buffer we have used or is needed
-        *  and return the final status.
-        */
-       ret_buffer->length = buffer_space_needed;
-
-
-       /* On exit, we must delete the object returned by evaluate_object */
-
-cleanup:
-
-       acpi_cm_remove_reference (ret_obj);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_rs_set_srs_method_data
- *
- * PARAMETERS:  Handle          - a handle to the containing object
- *              In_buffer       - a pointer to a buffer structure of the
- *                                  parameter
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to set the _SRS of an object contained
- *              in an object specified by the handle passed in
- *
- *              If the function fails an appropriate status will be returned
- *              and the contents of the callers buffer is undefined.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_rs_set_srs_method_data (
-       ACPI_HANDLE             handle,
-       ACPI_BUFFER             *in_buffer)
-{
-       ACPI_OPERAND_OBJECT     *params[2];
-       ACPI_OPERAND_OBJECT     param_obj;
-       ACPI_STATUS             status;
-       u8                      *byte_stream = NULL;
-       u32                     buffer_size_needed = 0;
-
-
-       /* already validated params, so we won't repeat here */
-
-       /*
-        * The In_buffer parameter will point to a linked list of
-        *  resource parameters.  It needs to be formatted into a
-        *  byte stream to be sent in as an input parameter.
-        */
-       buffer_size_needed = 0;
-
-       /*
-        * First call is to get the buffer size needed
-        */
-       status = acpi_rs_create_byte_stream (in_buffer->pointer,
-                          byte_stream,
-                          &buffer_size_needed);
-       /*
-        * We expect a return of AE_BUFFER_OVERFLOW
-        *  if not, exit with the error
-        */
-       if (AE_BUFFER_OVERFLOW != status) {
-               return (status);
-       }
-
-       /*
-        * Allocate the buffer needed
-        */
-       byte_stream = acpi_cm_callocate(buffer_size_needed);
-       if (NULL == byte_stream) {
-               return (AE_NO_MEMORY);
-       }
-
-       /*
-        * Now call to convert the linked list into a byte stream
-        */
-       status = acpi_rs_create_byte_stream (in_buffer->pointer,
-                          byte_stream,
-                          &buffer_size_needed);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-       /*
-        *  Init the param object
-        */
-       acpi_cm_init_static_object (&param_obj);
-
-       /*
-        *  Method requires one parameter.  Set it up
-        */
-       params [0] = &param_obj;
-       params [1] = NULL;
-
-       /*
-        *  Set up the parameter object
-        */
-       param_obj.common.type   = ACPI_TYPE_BUFFER;
-       param_obj.buffer.length = buffer_size_needed;
-       param_obj.buffer.pointer = byte_stream;
-
-       /*
-        *  Execute the method, no return value
-        */
-       status = acpi_ns_evaluate_relative (handle, "_SRS", params, NULL);
-
-       /*
-        *  Clean up and return the status from Acpi_ns_evaluate_relative
-        */
-
-cleanup:
-
-       acpi_cm_free (byte_stream);
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/resource/rsxface.c b/reactos/drivers/bus/acpi/resource/rsxface.c
deleted file mode 100644 (file)
index b19536e..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: rsxface - Public interfaces to the ACPI subsystem
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_RESOURCES
-        MODULE_NAME         ("rsxface")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_get_irq_routing_table
- *
- * PARAMETERS:  Device_handle   - a handle to the Bus device we are querying
- *              Ret_buffer      - a pointer to a buffer to receive the
- *                                current resources for the device
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to get the IRQ routing table for a
- *              specific bus.  The caller must first acquire a handle for the
- *              desired bus.  The routine table is placed in the buffer pointed
- *              to by the Ret_buffer variable parameter.
- *
- *              If the function fails an appropriate status will be returned
- *              and the value of Ret_buffer is undefined.
- *
- *              This function attempts to execute the _PRT method contained in
- *              the object indicated by the passed Device_handle.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_irq_routing_table (
-       ACPI_HANDLE             device_handle,
-       ACPI_BUFFER             *ret_buffer)
-{
-       ACPI_STATUS             status;
-
-
-       /*
-        *  Must have a valid handle and buffer, So we have to have a handle
-        *  and a return buffer structure, and if there is a non-zero buffer length
-        *  we also need a valid pointer in the buffer. If it's a zero buffer length,
-        *  we'll be returning the needed buffer size, so keep going.
-        */
-       if ((!device_handle)        ||
-               (!ret_buffer)           ||
-               ((!ret_buffer->pointer) && (ret_buffer->length))) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       status = acpi_rs_get_prt_method_data (device_handle, ret_buffer);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_get_current_resources
- *
- * PARAMETERS:  Device_handle   - a handle to the device object for the
- *                                device we are querying
- *              Ret_buffer      - a pointer to a buffer to receive the
- *                                current resources for the device
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to get the current resources for a
- *              specific device.  The caller must first acquire a handle for
- *              the desired device.  The resource data is placed in the buffer
- *              pointed to by the Ret_buffer variable parameter.
- *
- *              If the function fails an appropriate status will be returned
- *              and the value of Ret_buffer is undefined.
- *
- *              This function attempts to execute the _CRS method contained in
- *              the object indicated by the passed Device_handle.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_current_resources (
-       ACPI_HANDLE             device_handle,
-       ACPI_BUFFER             *ret_buffer)
-{
-       ACPI_STATUS             status;
-
-
-       /*
-        *  Must have a valid handle and buffer, So we have to have a handle
-        *  and a return buffer structure, and if there is a non-zero buffer length
-        *  we also need a valid pointer in the buffer. If it's a zero buffer length,
-        *  we'll be returning the needed buffer size, so keep going.
-        */
-       if ((!device_handle)        ||
-               (!ret_buffer)           ||
-               ((ret_buffer->length) && (!ret_buffer->pointer))) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       status = acpi_rs_get_crs_method_data (device_handle, ret_buffer);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_get_possible_resources
- *
- * PARAMETERS:  Device_handle   - a handle to the device object for the
- *                                device we are querying
- *              Ret_buffer      - a pointer to a buffer to receive the
- *                                resources for the device
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to get a list of the possible resources
- *              for a specific device.  The caller must first acquire a handle
- *              for the desired device.  The resource data is placed in the
- *              buffer pointed to by the Ret_buffer variable.
- *
- *              If the function fails an appropriate status will be returned
- *              and the value of Ret_buffer is undefined.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_possible_resources (
-       ACPI_HANDLE             device_handle,
-       ACPI_BUFFER             *ret_buffer)
-{
-       ACPI_STATUS             status;
-
-
-       /*
-        *  Must have a valid handle and buffer, So we have to have a handle
-        *  and a return buffer structure, and if there is a non-zero buffer length
-        *  we also need a valid pointer in the buffer. If it's a zero buffer length,
-        *  we'll be returning the needed buffer size, so keep going.
-        */
-       if ((!device_handle)        ||
-               (!ret_buffer)           ||
-               ((ret_buffer->length) && (!ret_buffer->pointer))) {
-               return (AE_BAD_PARAMETER);
-   }
-
-       status = acpi_rs_get_prs_method_data (device_handle, ret_buffer);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_set_current_resources
- *
- * PARAMETERS:  Device_handle   - a handle to the device object for the
- *                                device we are changing the resources of
- *              In_buffer       - a pointer to a buffer containing the
- *                                resources to be set for the device
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to set the current resources for a
- *              specific device.  The caller must first acquire a handle for
- *              the desired device.  The resource data is passed to the routine
- *              the buffer pointed to by the In_buffer variable.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_set_current_resources (
-       ACPI_HANDLE             device_handle,
-       ACPI_BUFFER             *in_buffer)
-{
-       ACPI_STATUS             status;
-
-
-       /*
-        *  Must have a valid handle and buffer
-        */
-       if ((!device_handle)      ||
-               (!in_buffer)          ||
-               (!in_buffer->pointer) ||
-               (!in_buffer->length)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       status = acpi_rs_set_srs_method_data (device_handle, in_buffer);
-
-       return (status);
-}
diff --git a/reactos/drivers/bus/acpi/tables/tbconvrt.c b/reactos/drivers/bus/acpi/tables/tbconvrt.c
deleted file mode 100644 (file)
index 77ece2a..0000000
+++ /dev/null
@@ -1,547 +0,0 @@
-/******************************************************************************
- *
- * Module Name: tbconvrt - ACPI Table conversion utilities
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_TABLES
-        MODULE_NAME         ("tbconvrt")
-
-
-/*
- * Build a GAS structure from earlier ACPI table entries (V1.0 and 0.71 extensions)
- *
- * 1) Address space
- * 2) Length in bytes -- convert to length in bits
- * 3) Bit offset is zero
- * 4) Reserved field is zero
- * 5) Expand address to 64 bits
- */
-#define ASL_BUILD_GAS_FROM_ENTRY(a,b,c,d)   {a.address_space_id = (u8) d;\
-                          a.register_bit_width = (u8) MUL_8 (b);\
-                          a.register_bit_offset = 0;\
-                          a.reserved = 0;\
-                          ACPI_STORE_ADDRESS (a.address,c);}
-
-
-/* ACPI V1.0 entries -- address space is always I/O */
-
-#define ASL_BUILD_GAS_FROM_V1_ENTRY(a,b,c)  ASL_BUILD_GAS_FROM_ENTRY(a,b,c,ADDRESS_SPACE_SYSTEM_IO)
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_convert_to_xsdt
- *
- * PARAMETERS:
- *
- * RETURN:
- *
- * DESCRIPTION:
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_convert_to_xsdt (
-       ACPI_TABLE_DESC         *table_info,
-       u32                     *number_of_tables) {
-       u32                     table_size;
-       u32                     pointer_size;
-       u32                     i;
-       XSDT_DESCRIPTOR         *new_table;
-
-
-#ifndef _IA64
-
-       if (acpi_gbl_RSDP->revision < 2) {
-               pointer_size = sizeof (u32);
-       }
-
-       else
-#endif
-       {
-               pointer_size = sizeof (UINT64);
-       }
-
-       /*
-        * Determine the number of tables pointed to by the RSDT/XSDT.
-        * This is defined by the ACPI Specification to be the number of
-        * pointers contained within the RSDT/XSDT.  The size of the pointers
-        * is architecture-dependent.
-        */
-
-       table_size = table_info->pointer->length;
-       *number_of_tables = (table_size -
-                          sizeof (ACPI_TABLE_HEADER)) / pointer_size;
-
-       /* Compute size of the converted XSDT */
-
-       table_size = (*number_of_tables * sizeof (UINT64)) + sizeof (ACPI_TABLE_HEADER);
-
-
-       /* Allocate an XSDT */
-
-       new_table = acpi_cm_callocate (table_size);
-       if (!new_table) {
-               return (AE_NO_MEMORY);
-       }
-
-       /* Copy the header and set the length */
-
-       MEMCPY (new_table, table_info->pointer, sizeof (ACPI_TABLE_HEADER));
-       new_table->header.length = table_size;
-
-       /* Copy the table pointers */
-
-       for (i = 0; i < *number_of_tables; i++) {
-               if (acpi_gbl_RSDP->revision < 2) {
-#ifdef _IA64
-                       new_table->table_offset_entry[i] =
-                               ((RSDT_DESCRIPTOR_REV071 *) table_info->pointer)->table_offset_entry[i];
-#else
-                       ACPI_STORE_ADDRESS (new_table->table_offset_entry[i],
-                               ((RSDT_DESCRIPTOR_REV1 *) table_info->pointer)->table_offset_entry[i]);
-#endif
-               }
-               else {
-                       new_table->table_offset_entry[i] =
-                               ((XSDT_DESCRIPTOR *) table_info->pointer)->table_offset_entry[i];
-               }
-       }
-
-
-       /* Delete the original table (either mapped or in a buffer) */
-
-       acpi_tb_delete_single_table (table_info);
-
-
-       /* Point the table descriptor to the new table */
-
-       table_info->pointer     = (ACPI_TABLE_HEADER *) new_table;
-       table_info->base_pointer = (ACPI_TABLE_HEADER *) new_table;
-       table_info->length      = table_size;
-       table_info->allocation  = ACPI_MEM_ALLOCATED;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_convert_table_fadt
- *
- * PARAMETERS:
- *
- * RETURN:
- *
- * DESCRIPTION:
- *    Converts BIOS supplied 1.0 and 0.71 ACPI FADT to an intermediate
- *    ACPI 2.0 FADT. If the BIOS supplied a 2.0 FADT then it is simply
- *    copied to the intermediate FADT.  The ACPI CA software uses this
- *    intermediate FADT. Thus a significant amount of special #ifdef
- *    type codeing is saved. This intermediate FADT will need to be
- *    freed at some point.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_convert_table_fadt (void)
-{
-
-#ifdef _IA64
-       FADT_DESCRIPTOR_REV071 *FADT71;
-       u8                      pm1_address_space;
-       u8                      pm2_address_space;
-       u8                      pm_timer_address_space;
-       u8                      gpe0address_space;
-       u8                      gpe1_address_space;
-#else
-       FADT_DESCRIPTOR_REV1   *FADT1;
-#endif
-
-       FADT_DESCRIPTOR_REV2   *FADT2;
-       ACPI_TABLE_DESC        *table_desc;
-
-
-       /* Acpi_gbl_FADT is valid */
-       /* Allocate and zero the 2.0 buffer */
-
-       FADT2 = acpi_cm_callocate (sizeof (FADT_DESCRIPTOR_REV2));
-       if (FADT2 == NULL) {
-               return (AE_NO_MEMORY);
-       }
-
-
-       /* The ACPI FADT revision number is FADT2_REVISION_ID=3 */
-       /* So, if the current table revision is less than 3 it is type 1.0 or 0.71 */
-
-       if (acpi_gbl_FADT->header.revision >= FADT2_REVISION_ID) {
-               /* We have an ACPI 2.0 FADT but we must copy it to our local buffer */
-
-               *FADT2 = *((FADT_DESCRIPTOR_REV2*) acpi_gbl_FADT);
-
-       }
-
-       else {
-
-#ifdef _IA64
-               /*
-                * For the 64-bit case only, a revision ID less than V2.0 means the
-                * tables are the 0.71 extensions
-                */
-
-               /* The BIOS stored FADT should agree with Revision 0.71 */
-
-               FADT71 = (FADT_DESCRIPTOR_REV071 *) acpi_gbl_FADT;
-
-               /* Copy the table header*/
-
-               FADT2->header       = FADT71->header;
-
-               /* Copy the common fields */
-
-               FADT2->sci_int      = FADT71->sci_int;
-               FADT2->acpi_enable  = FADT71->acpi_enable;
-               FADT2->acpi_disable = FADT71->acpi_disable;
-               FADT2->S4_bios_req  = FADT71->S4_bios_req;
-               FADT2->plvl2_lat    = FADT71->plvl2_lat;
-               FADT2->plvl3_lat    = FADT71->plvl3_lat;
-               FADT2->day_alrm     = FADT71->day_alrm;
-               FADT2->mon_alrm     = FADT71->mon_alrm;
-               FADT2->century      = FADT71->century;
-               FADT2->gpe1_base    = FADT71->gpe1_base;
-
-               /*
-                * We still use the block length registers even though
-                * the GAS structure should obsolete them.  This is because
-                * these registers are byte lengths versus the GAS which
-                * contains a bit width
-                */
-               FADT2->pm1_evt_len  = FADT71->pm1_evt_len;
-               FADT2->pm1_cnt_len  = FADT71->pm1_cnt_len;
-               FADT2->pm2_cnt_len  = FADT71->pm2_cnt_len;
-               FADT2->pm_tm_len    = FADT71->pm_tm_len;
-               FADT2->gpe0blk_len  = FADT71->gpe0blk_len;
-               FADT2->gpe1_blk_len = FADT71->gpe1_blk_len;
-               FADT2->gpe1_base    = FADT71->gpe1_base;
-
-               /* Copy the existing 0.71 flags to 2.0. The other bits are zero.*/
-
-               FADT2->wb_invd      = FADT71->flush_cash;
-               FADT2->proc_c1      = FADT71->proc_c1;
-               FADT2->plvl2_up     = FADT71->plvl2_up;
-               FADT2->pwr_button   = FADT71->pwr_button;
-               FADT2->sleep_button = FADT71->sleep_button;
-               FADT2->fixed_rTC    = FADT71->fixed_rTC;
-               FADT2->rtcs4        = FADT71->rtcs4;
-               FADT2->tmr_val_ext  = FADT71->tmr_val_ext;
-               FADT2->dock_cap     = FADT71->dock_cap;
-
-
-               /* We should not use these next two addresses */
-               /* Since our buffer is pre-zeroed nothing to do for */
-               /* the next three data items in the structure */
-               /* FADT2->Firmware_ctrl = 0; */
-               /* FADT2->Dsdt = 0; */
-
-               /* System Interrupt Model isn't used in ACPI 2.0*/
-               /* FADT2->Reserved1 = 0; */
-
-               /* This field is set by the OEM to convey the preferred */
-               /* power management profile to OSPM. It doesn't have any*/
-               /* 0.71 equivalence.  Since we don't know what kind of  */
-               /* 64-bit system this is, we will pick unspecified.     */
-
-               FADT2->prefer_PM_profile = PM_UNSPECIFIED;
-
-
-               /* Port address of SMI command port */
-               /* We shouldn't use this port because IA64 doesn't */
-               /* have or use SMI.  It has PMI. */
-
-               FADT2->smi_cmd      = (u32)(FADT71->smi_cmd & 0xFFFFFFFF);
-
-
-               /* processor performance state control*/
-               /* The value OSPM writes to the SMI_CMD register to assume */
-               /* processor performance state control responsibility. */
-               /* There isn't any equivalence in 0.71 */
-               /* Again this should be meaningless for IA64 */
-               /* FADT2->Pstate_cnt = 0; */
-
-               /* The 32-bit Power management and GPE registers are */
-               /* not valid in IA-64 and we are not going to use them */
-               /* so leaving them pre-zeroed. */
-
-               /* Support for the _CST object and C States change notification.*/
-               /* This data item hasn't any 0.71 equivalence so leaving it zero.*/
-               /* FADT2->Cst_cnt = 0; */
-
-               /* number of flush strides that need to be read */
-               /* No 0.71 equivalence. Leave pre-zeroed. */
-               /* FADT2->Flush_size = 0; */
-
-               /* Processor's memory cache line width, in bytes */
-               /* No 0.71 equivalence. Leave pre-zeroed. */
-               /* FADT2->Flush_stride = 0; */
-
-               /* Processor's duty cycle index in processor's P_CNT reg*/
-               /* No 0.71 equivalence. Leave pre-zeroed. */
-               /* FADT2->Duty_offset = 0; */
-
-               /* Processor's duty cycle value bit width in P_CNT register.*/
-               /* No 0.71 equivalence. Leave pre-zeroed. */
-               /* FADT2->Duty_width = 0; */
-
-
-               /* Since there isn't any equivalence in 0.71 */
-               /* and since Big_sur had to support legacy */
-
-               FADT2->iapc_boot_arch = BAF_LEGACY_DEVICES;
-
-               /* Copy to ACPI 2.0 64-BIT Extended Addresses */
-
-               FADT2->Xfirmware_ctrl = FADT71->firmware_ctrl;
-               FADT2->Xdsdt         = FADT71->dsdt;
-
-
-               /* Extract the address space IDs */
-
-               pm1_address_space   = (u8)((FADT71->address_space & PM1_BLK_ADDRESS_SPACE)    >> 1);
-               pm2_address_space   = (u8)((FADT71->address_space & PM2_CNT_BLK_ADDRESS_SPACE) >> 2);
-               pm_timer_address_space = (u8)((FADT71->address_space & PM_TMR_BLK_ADDRESS_SPACE) >> 3);
-               gpe0address_space   = (u8)((FADT71->address_space & GPE0_BLK_ADDRESS_SPACE)   >> 4);
-               gpe1_address_space  = (u8)((FADT71->address_space & GPE1_BLK_ADDRESS_SPACE)   >> 5);
-
-               /*
-                * Convert the 0.71 (non-GAS style) Block addresses to V2.0 GAS structures,
-                * in this order:
-                *
-                * PM 1_a Events
-                * PM 1_b Events
-                * PM 1_a Control
-                * PM 1_b Control
-                * PM 2 Control
-                * PM Timer Control
-                * GPE Block 0
-                * GPE Block 1
-                */
-
-               ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm1a_evt_blk, FADT71->pm1_evt_len, FADT71->pm1a_evt_blk, pm1_address_space);
-               ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm1b_evt_blk, FADT71->pm1_evt_len, FADT71->pm1b_evt_blk, pm1_address_space);
-               ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm1a_cnt_blk, FADT71->pm1_cnt_len, FADT71->pm1a_cnt_blk, pm1_address_space);
-               ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm1b_cnt_blk, FADT71->pm1_cnt_len, FADT71->pm1b_cnt_blk, pm1_address_space);
-               ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm2_cnt_blk, FADT71->pm2_cnt_len, FADT71->pm2_cnt_blk, pm2_address_space);
-               ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm_tmr_blk, FADT71->pm_tm_len,  FADT71->pm_tmr_blk, pm_timer_address_space);
-               ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xgpe0blk,    FADT71->gpe0blk_len, FADT71->gpe0blk,   gpe0address_space);
-               ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xgpe1_blk,   FADT71->gpe1_blk_len, FADT71->gpe1_blk, gpe1_address_space);
-
-#else
-
-               /* ACPI 1.0 FACS */
-
-
-               /* The BIOS stored FADT should agree with Revision 1.0 */
-
-               FADT1 = (FADT_DESCRIPTOR_REV1*) acpi_gbl_FADT;
-
-               /*
-                * Copy the table header and the common part of the tables
-                * The 2.0 table is an extension of the 1.0 table, so the
-                * entire 1.0 table can be copied first, then expand some
-                * fields to 64 bits.
-                */
-
-               MEMCPY (FADT2, FADT1, sizeof (FADT_DESCRIPTOR_REV1));
-
-
-               /* Convert table pointers to 64-bit fields */
-
-               ACPI_STORE_ADDRESS (FADT2->Xfirmware_ctrl, FADT1->firmware_ctrl);
-               ACPI_STORE_ADDRESS (FADT2->Xdsdt, FADT1->dsdt);
-
-               /* System Interrupt Model isn't used in ACPI 2.0*/
-               /* FADT2->Reserved1 = 0; */
-
-               /* This field is set by the OEM to convey the preferred */
-               /* power management profile to OSPM. It doesn't have any*/
-               /* 1.0 equivalence.  Since we don't know what kind of   */
-               /* 32-bit system this is, we will pick unspecified.     */
-
-               FADT2->prefer_PM_profile = PM_UNSPECIFIED;
-
-
-               /* Processor Performance State Control. This is the value  */
-               /* OSPM writes to the SMI_CMD register to assume processor */
-               /* performance state control responsibility. There isn't   */
-               /* any equivalence in 1.0.  So leave it zeroed.            */
-
-               FADT2->pstate_cnt = 0;
-
-
-               /* Support for the _CST object and C States change notification.*/
-               /* This data item hasn't any 1.0 equivalence so leaving it zero.*/
-
-               FADT2->cst_cnt = 0;
-
-
-               /* Since there isn't any equivalence in 1.0 and since it   */
-               /* is highly likely that a 1.0 system has legacy  support. */
-
-               FADT2->iapc_boot_arch = BAF_LEGACY_DEVICES;
-
-
-               /*
-                * Convert the V1.0 Block addresses to V2.0 GAS structures
-                * in this order:
-                *
-                * PM 1_a Events
-                * PM 1_b Events
-                * PM 1_a Control
-                * PM 1_b Control
-                * PM 2 Control
-                * PM Timer Control
-                * GPE Block 0
-                * GPE Block 1
-                */
-
-               ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm1a_evt_blk, FADT1->pm1_evt_len, FADT1->pm1a_evt_blk);
-               ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm1b_evt_blk, FADT1->pm1_evt_len, FADT1->pm1b_evt_blk);
-               ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm1a_cnt_blk, FADT1->pm1_cnt_len, FADT1->pm1a_cnt_blk);
-               ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm1b_cnt_blk, FADT1->pm1_cnt_len, FADT1->pm1b_cnt_blk);
-               ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm2_cnt_blk, FADT1->pm2_cnt_len, FADT1->pm2_cnt_blk);
-               ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm_tmr_blk, FADT1->pm_tm_len,  FADT1->pm_tmr_blk);
-               ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xgpe0blk,    FADT1->gpe0blk_len, FADT1->gpe0blk);
-               ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xgpe1_blk,   FADT1->gpe1_blk_len, FADT1->gpe1_blk);
-#endif
-       }
-
-
-       /*
-        * Global FADT pointer will point to the common V2.0 FADT
-        */
-       acpi_gbl_FADT = FADT2;
-       acpi_gbl_FADT->header.length = sizeof (FADT_DESCRIPTOR);
-
-
-       /* Free the original table */
-
-       table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_FADT];
-       acpi_tb_delete_single_table (table_desc);
-
-
-       /* Install the new table */
-
-       table_desc->pointer = (ACPI_TABLE_HEADER *) acpi_gbl_FADT;
-       table_desc->base_pointer = acpi_gbl_FADT;
-       table_desc->allocation = ACPI_MEM_ALLOCATED;
-       table_desc->length = sizeof (FADT_DESCRIPTOR_REV2);
-
-
-       /* Dump the entire FADT */
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_convert_table_facs
- *
- * PARAMETERS:
- *
- * RETURN:
- *
- * DESCRIPTION:
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_build_common_facs (
-       ACPI_TABLE_DESC         *table_info)
-{
-       ACPI_COMMON_FACS        *common_facs;
-
-#ifdef _IA64
-       FACS_DESCRIPTOR_REV071  *FACS71;
-#else
-       FACS_DESCRIPTOR_REV1    *FACS1;
-#endif
-
-       FACS_DESCRIPTOR_REV2    *FACS2;
-
-
-       /* Allocate a common FACS */
-
-       common_facs = acpi_cm_callocate (sizeof (ACPI_COMMON_FACS));
-       if (!common_facs) {
-               return (AE_NO_MEMORY);
-       }
-
-
-       /* Copy fields to the new FACS */
-
-       if (acpi_gbl_RSDP->revision < 2) {
-#ifdef _IA64
-               /* 0.71 FACS */
-
-               FACS71 = (FACS_DESCRIPTOR_REV071 *) acpi_gbl_FACS;
-
-               common_facs->global_lock = (u32 *) &(FACS71->global_lock);
-               common_facs->firmware_waking_vector = &FACS71->firmware_waking_vector;
-               common_facs->vector_width = 64;
-#else
-               /* ACPI 1.0 FACS */
-
-               FACS1 = (FACS_DESCRIPTOR_REV1 *) acpi_gbl_FACS;
-
-               common_facs->global_lock = &(FACS1->global_lock);
-               common_facs->firmware_waking_vector = (UINT64 *) &FACS1->firmware_waking_vector;
-               common_facs->vector_width = 32;
-
-#endif
-       }
-
-       else {
-               /* ACPI 2.0 FACS */
-
-               FACS2 = (FACS_DESCRIPTOR_REV2 *) acpi_gbl_FACS;
-
-               common_facs->global_lock = &(FACS2->global_lock);
-               common_facs->firmware_waking_vector = &FACS2->Xfirmware_waking_vector;
-               common_facs->vector_width = 64;
-       }
-
-
-       /* Set the global FACS pointer to point to the common FACS */
-
-
-       acpi_gbl_FACS = common_facs;
-
-       return  (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/tables/tbget.c b/reactos/drivers/bus/acpi/tables/tbget.c
deleted file mode 100644 (file)
index e16db9d..0000000
+++ /dev/null
@@ -1,608 +0,0 @@
-/******************************************************************************
- *
- * Module Name: tbget - ACPI Table get* routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_TABLES
-        MODULE_NAME         ("tbget")
-
-#define RSDP_CHECKSUM_LENGTH 20
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_get_table_ptr
- *
- * PARAMETERS:  Table_type      - one of the defined table types
- *              Instance        - Which table of this type
- *              Table_ptr_loc   - pointer to location to place the pointer for
- *                                return
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to get the pointer to an ACPI table.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_get_table_ptr (
-       ACPI_TABLE_TYPE         table_type,
-       u32                     instance,
-       ACPI_TABLE_HEADER       **table_ptr_loc)
-{
-       ACPI_TABLE_DESC         *table_desc;
-       u32                     i;
-
-
-       if (!acpi_gbl_DSDT) {
-               return (AE_NO_ACPI_TABLES);
-       }
-
-       if (table_type > ACPI_TABLE_MAX) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /*
-        * For all table types (Single/Multiple), the first
-        * instance is always in the list head.
-        */
-
-       if (instance == 1) {
-               /*
-                * Just pluck the pointer out of the global table!
-                * Will be null if no table is present
-                */
-
-               *table_ptr_loc = acpi_gbl_acpi_tables[table_type].pointer;
-               return (AE_OK);
-       }
-
-
-       /*
-        * Check for instance out of range
-        */
-       if (instance > acpi_gbl_acpi_tables[table_type].count) {
-               return (AE_NOT_EXIST);
-       }
-
-       /* Walk the list to get the desired table
-        *  Since the if (Instance == 1) check above checked for the
-        *  first table, setting Table_desc equal to the .Next member
-        *  is actually pointing to the second table.  Therefore, we
-        *  need to walk from the 2nd table until we reach the Instance
-        *  that the user is looking for and return its table pointer.
-        */
-       table_desc = acpi_gbl_acpi_tables[table_type].next;
-       for (i = 2; i < instance; i++) {
-               table_desc = table_desc->next;
-       }
-
-       /* We are now pointing to the requested table's descriptor */
-
-       *table_ptr_loc = table_desc->pointer;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_get_table
- *
- * PARAMETERS:  Physical_address        - Physical address of table to retrieve
- *              *Buffer_ptr             - If Buffer_ptr is valid, read data from
- *                                         buffer rather than searching memory
- *              *Table_info             - Where the table info is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Maps the physical address of table into a logical address
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_get_table (
-       ACPI_PHYSICAL_ADDRESS   physical_address,
-       ACPI_TABLE_HEADER       *buffer_ptr,
-       ACPI_TABLE_DESC         *table_info)
-{
-       ACPI_TABLE_HEADER       *table_header = NULL;
-       ACPI_TABLE_HEADER       *full_table = NULL;
-       u32                     size;
-       u8                      allocation;
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (!table_info) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       if (buffer_ptr) {
-               /*
-                * Getting data from a buffer, not BIOS tables
-                */
-
-               table_header = buffer_ptr;
-               status = acpi_tb_validate_table_header (table_header);
-               if (ACPI_FAILURE (status)) {
-                       /* Table failed verification, map all errors to BAD_DATA */
-
-                       return (AE_BAD_DATA);
-               }
-
-               /* Allocate buffer for the entire table */
-
-               full_table = acpi_cm_allocate (table_header->length);
-               if (!full_table) {
-                       return (AE_NO_MEMORY);
-               }
-
-               /* Copy the entire table (including header) to the local buffer */
-
-               size = table_header->length;
-               MEMCPY (full_table, buffer_ptr, size);
-
-               /* Save allocation type */
-
-               allocation = ACPI_MEM_ALLOCATED;
-       }
-
-
-       /*
-        * Not reading from a buffer, just map the table's physical memory
-        * into our address space.
-        */
-       else {
-               size = SIZE_IN_HEADER;
-
-               status = acpi_tb_map_acpi_table (physical_address, &size,
-                                 (void **) &full_table);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* Save allocation type */
-
-               allocation = ACPI_MEM_MAPPED;
-       }
-
-
-       /* Return values */
-
-       table_info->pointer     = full_table;
-       table_info->length      = size;
-       table_info->allocation  = allocation;
-       table_info->base_pointer = full_table;
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_get_all_tables
- *
- * PARAMETERS:  Number_of_tables    - Number of tables to get
- *              Table_ptr           - Input buffer pointer, optional
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load and validate all tables other than the RSDT.  The RSDT must
- *              already be loaded and validated.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_get_all_tables (
-       u32                     number_of_tables,
-       ACPI_TABLE_HEADER       *table_ptr)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     index;
-       ACPI_TABLE_DESC         table_info;
-
-
-       /*
-        * Loop through all table pointers found in RSDT.
-        * This will NOT include the FACS and DSDT - we must get
-        * them after the loop
-        */
-
-       for (index = 0; index < number_of_tables; index++) {
-               /* Clear the Table_info each time */
-
-               MEMSET (&table_info, 0, sizeof (ACPI_TABLE_DESC));
-
-               /* Get the table via the XSDT */
-
-               status = acpi_tb_get_table ((ACPI_PHYSICAL_ADDRESS)
-                                ACPI_GET_ADDRESS (acpi_gbl_XSDT->table_offset_entry[index]),
-                                table_ptr, &table_info);
-
-               /* Ignore a table that failed verification */
-
-               if (status == AE_BAD_DATA) {
-                       continue;
-               }
-
-               /* However, abort on serious errors */
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* Recognize and install the table */
-
-               status = acpi_tb_install_table (table_ptr, &table_info);
-               if (ACPI_FAILURE (status)) {
-                       /*
-                        * Unrecognized or unsupported table, delete it and ignore the
-                        * error.  Just get as many tables as we can, later we will
-                        * determine if there are enough tables to continue.
-                        */
-
-                       acpi_tb_uninstall_table (&table_info);
-               }
-       }
-
-
-       /*
-        * Convert the FADT to a common format.  This allows earlier revisions of the
-        * table to coexist with newer versions, using common access code.
-        */
-       status = acpi_tb_convert_table_fadt ();
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /*
-        * Get the minimum set of ACPI tables, namely:
-        *
-        * 1) FADT (via RSDT in loop above)
-        * 2) FACS
-        * 3) DSDT
-        *
-        */
-
-
-       /*
-        * Get the FACS (must have the FADT first, from loop above)
-        * Acpi_tb_get_table_facs will fail if FADT pointer is not valid
-        */
-
-       status = acpi_tb_get_table_facs (table_ptr, &table_info);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /* Install the FACS */
-
-       status = acpi_tb_install_table (table_ptr, &table_info);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * Create the common FACS pointer table
-        * (Contains pointers to the original table)
-        */
-
-       status = acpi_tb_build_common_facs (&table_info);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /*
-        * Get the DSDT (We know that the FADT is valid now)
-        */
-
-       status = acpi_tb_get_table ((ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xdsdt),
-                         table_ptr, &table_info);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Install the DSDT */
-
-       status = acpi_tb_install_table (table_ptr, &table_info);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Dump the DSDT Header */
-
-       /* Dump the entire DSDT */
-
-       /*
-        * Initialize the capabilities flags.
-        * Assumes that platform supports ACPI_MODE since we have tables!
-        */
-       acpi_gbl_system_flags |= acpi_hw_get_mode_capabilities ();
-
-
-       /* Always delete the RSDP mapping, we are done with it */
-
-       acpi_tb_delete_acpi_table (ACPI_TABLE_RSDP);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_verify_rsdp
- *
- * PARAMETERS:  Number_of_tables    - Where the table count is placed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load and validate the RSDP (ptr) and RSDT (table)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_verify_rsdp (
-       ACPI_PHYSICAL_ADDRESS   rsdp_physical_address)
-{
-       ACPI_TABLE_DESC         table_info;
-       ACPI_STATUS             status;
-       u8                      *table_ptr;
-
-
-       /*
-        * Obtain access to the RSDP structure
-        */
-       status = acpi_os_map_memory (rsdp_physical_address,
-                         sizeof (RSDP_DESCRIPTOR),
-                         (void **) &table_ptr);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        *  The signature and checksum must both be correct
-        */
-       if (STRNCMP ((NATIVE_CHAR *) table_ptr, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) {
-               /* Nope, BAD Signature */
-
-               status = AE_BAD_SIGNATURE;
-               goto cleanup;
-       }
-
-       if (acpi_tb_checksum (table_ptr, RSDP_CHECKSUM_LENGTH) != 0) {
-               /* Nope, BAD Checksum */
-
-               status = AE_BAD_CHECKSUM;
-               goto cleanup;
-       }
-
-       /* TBD: Check extended checksum if table version >= 2 */
-
-       /* The RSDP supplied is OK */
-
-       table_info.pointer     = (ACPI_TABLE_HEADER *) table_ptr;
-       table_info.length      = sizeof (RSDP_DESCRIPTOR);
-       table_info.allocation  = ACPI_MEM_MAPPED;
-       table_info.base_pointer = table_ptr;
-
-       /* Save the table pointers and allocation info */
-
-       status = acpi_tb_init_table_descriptor (ACPI_TABLE_RSDP, &table_info);
-       if (ACPI_FAILURE (status)) {
-               goto cleanup;
-       }
-
-
-       /* Save the RSDP in a global for easy access */
-
-       acpi_gbl_RSDP = (RSDP_DESCRIPTOR *) table_info.pointer;
-       return (status);
-
-
-       /* Error exit */
-cleanup:
-
-       acpi_os_unmap_memory (table_ptr, sizeof (RSDP_DESCRIPTOR));
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_get_table_rsdt
- *
- * PARAMETERS:  Number_of_tables    - Where the table count is placed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load and validate the RSDP (ptr) and RSDT (table)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_get_table_rsdt (
-       u32                     *number_of_tables)
-{
-       ACPI_TABLE_DESC         table_info;
-       ACPI_STATUS             status = AE_OK;
-       ACPI_PHYSICAL_ADDRESS   physical_address;
-       u32                     signature_length;
-       char                    *table_signature;
-
-
-       /*
-        * Get the RSDT from the RSDP
-        */
-
-       /*
-        * For RSDP revision 0 or 1, we use the RSDT.
-        * For RSDP revision 2 (and above), we use the XSDT
-        */
-       if (acpi_gbl_RSDP->revision < 2) {
-#ifdef _IA64
-               /* 0.71 RSDP has 64bit Rsdt address field */
-               physical_address = ((RSDP_DESCRIPTOR_REV071 *)acpi_gbl_RSDP)->rsdt_physical_address;
-#else
-               physical_address = (ACPI_PHYSICAL_ADDRESS) acpi_gbl_RSDP->rsdt_physical_address;
-#endif
-               table_signature = RSDT_SIG;
-               signature_length = sizeof (RSDT_SIG) -1;
-       }
-       else {
-               physical_address = (ACPI_PHYSICAL_ADDRESS)
-                                  ACPI_GET_ADDRESS (acpi_gbl_RSDP->xsdt_physical_address);
-               table_signature = XSDT_SIG;
-               signature_length = sizeof (XSDT_SIG) -1;
-       }
-
-
-       /* Get the RSDT/XSDT */
-
-       status = acpi_tb_get_table (physical_address, NULL, &table_info);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-
-       /* Check the RSDT or XSDT signature */
-
-       if (STRNCMP ((char *) table_info.pointer, table_signature,
-                         signature_length)) {
-               /* Invalid RSDT or XSDT signature */
-
-               REPORT_ERROR (("Invalid signature where RSDP indicates %s should be located\n",
-                                 table_signature));
-
-               return (AE_NO_ACPI_TABLES);
-       }
-
-
-       /* Valid RSDT signature, verify the checksum */
-
-       status = acpi_tb_verify_table_checksum (table_info.pointer);
-
-
-       /* Convert and/or copy to an XSDT structure */
-
-       status = acpi_tb_convert_to_xsdt (&table_info, number_of_tables);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Save the table pointers and allocation info */
-
-       status = acpi_tb_init_table_descriptor (ACPI_TABLE_XSDT, &table_info);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       acpi_gbl_XSDT = (XSDT_DESCRIPTOR *) table_info.pointer;
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_tb_get_table_facs
- *
- * PARAMETERS:  *Buffer_ptr             - If Buffer_ptr is valid, read data from
- *                                          buffer rather than searching memory
- *              *Table_info             - Where the table info is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Returns a pointer to the FACS as defined in FADT.  This
- *              function assumes the global variable FADT has been
- *              correctly initialized.  The value of FADT->Firmware_ctrl
- *              into a far pointer which is returned.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-acpi_tb_get_table_facs (
-       ACPI_TABLE_HEADER       *buffer_ptr,
-       ACPI_TABLE_DESC         *table_info)
-{
-       void                    *table_ptr = NULL;
-       u32                     size;
-       u8                      allocation;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Must have a valid FADT pointer */
-
-       if (!acpi_gbl_FADT) {
-               return (AE_NO_ACPI_TABLES);
-       }
-
-       size = sizeof (FACS_DESCRIPTOR);
-       if (buffer_ptr) {
-               /*
-                * Getting table from a file -- allocate a buffer and
-                * read the table.
-                */
-               table_ptr = acpi_cm_allocate (size);
-               if(!table_ptr) {
-                       return (AE_NO_MEMORY);
-               }
-
-               MEMCPY (table_ptr, buffer_ptr, size);
-
-               /* Save allocation type */
-
-               allocation = ACPI_MEM_ALLOCATED;
-       }
-
-       else {
-               /* Just map the physical memory to our address space */
-
-               status = acpi_tb_map_acpi_table ((ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xfirmware_ctrl),
-                                  &size, &table_ptr);
-               if (ACPI_FAILURE(status)) {
-                       return (status);
-               }
-
-               /* Save allocation type */
-
-               allocation = ACPI_MEM_MAPPED;
-       }
-
-
-       /* Return values */
-
-       table_info->pointer     = table_ptr;
-       table_info->length      = size;
-       table_info->allocation  = allocation;
-       table_info->base_pointer = table_ptr;
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/tables/tbinstal.c b/reactos/drivers/bus/acpi/tables/tbinstal.c
deleted file mode 100644 (file)
index 91c176f..0000000
+++ /dev/null
@@ -1,531 +0,0 @@
-/******************************************************************************
- *
- * Module Name: tbinstal - ACPI table installation and removal
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_TABLES
-        MODULE_NAME         ("tbinstal")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_install_table
- *
- * PARAMETERS:  Table_ptr           - Input buffer pointer, optional
- *              Table_info          - Return value from Acpi_tb_get_table
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load and validate all tables other than the RSDT.  The RSDT must
- *              already be loaded and validated.
- *              Install the table into the global data structs.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_install_table (
-       ACPI_TABLE_HEADER       *table_ptr,
-       ACPI_TABLE_DESC         *table_info)
-{
-       ACPI_STATUS             status;
-
-
-       /*
-        * Check the table signature and make sure it is recognized
-        * Also checks the header checksum
-        */
-
-       status = acpi_tb_recognize_table (table_ptr, table_info);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Lock tables while installing */
-
-       acpi_cm_acquire_mutex (ACPI_MTX_TABLES);
-
-       /* Install the table into the global data structure */
-
-       status = acpi_tb_init_table_descriptor (table_info->type, table_info);
-
-       acpi_cm_release_mutex (ACPI_MTX_TABLES);
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_recognize_table
- *
- * PARAMETERS:  Table_ptr           - Input buffer pointer, optional
- *              Table_info          - Return value from Acpi_tb_get_table
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Check a table signature for a match against known table types
- *
- * NOTE:  All table pointers are validated as follows:
- *          1) Table pointer must point to valid physical memory
- *          2) Signature must be 4 ASCII chars, even if we don't recognize the
- *             name
- *          3) Table must be readable for length specified in the header
- *          4) Table checksum must be valid (with the exception of the FACS
- *             which has no checksum for some odd reason)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_recognize_table (
-       ACPI_TABLE_HEADER       *table_ptr,
-       ACPI_TABLE_DESC         *table_info)
-{
-       ACPI_TABLE_HEADER       *table_header;
-       ACPI_STATUS             status;
-       ACPI_TABLE_TYPE         table_type = 0;
-       u32                     i;
-
-
-       /* Ensure that we have a valid table pointer */
-
-       table_header = (ACPI_TABLE_HEADER *) table_info->pointer;
-       if (!table_header) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Search for a signature match among the known table types
-        * Start at index one -> Skip the RSDP
-        */
-
-       status = AE_SUPPORT;
-       for (i = 1; i < NUM_ACPI_TABLES; i++) {
-               if (!STRNCMP (table_header->signature,
-                                 acpi_gbl_acpi_table_data[i].signature,
-                                 acpi_gbl_acpi_table_data[i].sig_length)) {
-                       /*
-                        * Found a signature match, get the pertinent info from the
-                        * Table_data structure
-                        */
-
-                       table_type      = i;
-                       status          = acpi_gbl_acpi_table_data[i].status;
-
-                       break;
-               }
-       }
-
-       /* Return the table type and length via the info struct */
-
-       table_info->type    = (u8) table_type;
-       table_info->length  = table_header->length;
-
-
-       /*
-        * Validate checksum for _most_ tables,
-        * even the ones whose signature we don't recognize
-        */
-
-       if (table_type != ACPI_TABLE_FACS) {
-               /* But don't abort if the checksum is wrong */
-               /* TBD: [Future] make this a configuration option? */
-
-               acpi_tb_verify_table_checksum (table_header);
-       }
-
-       /*
-        * An AE_SUPPORT means that the table was not recognized.
-        * We basically ignore this;  just print a debug message
-        */
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_init_table_descriptor
- *
- * PARAMETERS:  Table_type          - The type of the table
- *              Table_info          - A table info struct
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Install a table into the global data structs.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_init_table_descriptor (
-       ACPI_TABLE_TYPE         table_type,
-       ACPI_TABLE_DESC         *table_info)
-{
-       ACPI_TABLE_DESC         *list_head;
-       ACPI_TABLE_DESC         *table_desc;
-
-
-       /*
-        * Install the table into the global data structure
-        */
-
-       list_head   = &acpi_gbl_acpi_tables[table_type];
-       table_desc  = list_head;
-
-
-       /*
-        * Two major types of tables:  1) Only one instance is allowed.  This
-        * includes most ACPI tables such as the DSDT.  2) Multiple instances of
-        * the table are allowed.  This includes SSDT and PSDTs.
-        */
-
-       if (IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags)) {
-               /*
-                * Only one table allowed, and a table has alread been installed
-                *  at this location, so return an error.
-                */
-
-               if (list_head->pointer) {
-                       return (AE_EXIST);
-               }
-
-               table_desc->count = 1;
-       }
-
-
-       else {
-               /*
-                * Multiple tables allowed for this table type, we must link
-                * the new table in to the list of tables of this type.
-                */
-
-               if (list_head->pointer) {
-                       table_desc = acpi_cm_callocate (sizeof (ACPI_TABLE_DESC));
-                       if (!table_desc) {
-                               return (AE_NO_MEMORY);
-                       }
-
-                       list_head->count++;
-
-                       /* Update the original previous */
-
-                       list_head->prev->next = table_desc;
-
-                       /* Update new entry */
-
-                       table_desc->prev = list_head->prev;
-                       table_desc->next = list_head;
-
-                       /* Update list head */
-
-                       list_head->prev = table_desc;
-               }
-
-               else {
-                       table_desc->count = 1;
-               }
-       }
-
-
-       /* Common initialization of the table descriptor */
-
-       table_desc->pointer             = table_info->pointer;
-       table_desc->base_pointer        = table_info->base_pointer;
-       table_desc->length              = table_info->length;
-       table_desc->allocation          = table_info->allocation;
-       table_desc->aml_pointer         = (u8 *) (table_desc->pointer + 1),
-       table_desc->aml_length          = (u32) (table_desc->length -
-                        (u32) sizeof (ACPI_TABLE_HEADER));
-       table_desc->table_id            = acpi_cm_allocate_owner_id (OWNER_TYPE_TABLE);
-       table_desc->loaded_into_namespace = FALSE;
-
-       /*
-        * Set the appropriate global pointer (if there is one) to point to the
-        * newly installed table
-        */
-
-       if (acpi_gbl_acpi_table_data[table_type].global_ptr) {
-               *(acpi_gbl_acpi_table_data[table_type].global_ptr) = table_info->pointer;
-       }
-
-
-       /* Return Data */
-
-       table_info->table_id        = table_desc->table_id;
-       table_info->installed_desc  = table_desc;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_delete_acpi_tables
- *
- * PARAMETERS:  None.
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Delete all internal ACPI tables
- *
- ******************************************************************************/
-
-void
-acpi_tb_delete_acpi_tables (void)
-{
-       ACPI_TABLE_TYPE             type;
-
-
-       /*
-        * Free memory allocated for ACPI tables
-        * Memory can either be mapped or allocated
-        */
-
-       for (type = 0; type < NUM_ACPI_TABLES; type++) {
-               acpi_tb_delete_acpi_table (type);
-       }
-
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_delete_acpi_table
- *
- * PARAMETERS:  Type                - The table type to be deleted
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Delete an internal ACPI table
- *              Locks the ACPI table mutex
- *
- ******************************************************************************/
-
-void
-acpi_tb_delete_acpi_table (
-       ACPI_TABLE_TYPE             type)
-{
-
-       if (type > ACPI_TABLE_MAX) {
-               return;
-       }
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_TABLES);
-
-       /* Free the table */
-
-       acpi_tb_free_acpi_tables_of_type (&acpi_gbl_acpi_tables[type]);
-
-
-       /* Clear the appropriate "typed" global table pointer */
-
-       switch (type) {
-       case ACPI_TABLE_RSDP:
-               acpi_gbl_RSDP = NULL;
-               break;
-
-       case ACPI_TABLE_DSDT:
-               acpi_gbl_DSDT = NULL;
-               break;
-
-       case ACPI_TABLE_FADT:
-               acpi_gbl_FADT = NULL;
-               break;
-
-       case ACPI_TABLE_FACS:
-               acpi_gbl_FACS = NULL;
-               break;
-
-       case ACPI_TABLE_XSDT:
-               acpi_gbl_XSDT = NULL;
-               break;
-
-       case ACPI_TABLE_SSDT:
-       case ACPI_TABLE_PSDT:
-       default:
-               break;
-       }
-
-       acpi_cm_release_mutex (ACPI_MTX_TABLES);
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_free_acpi_tables_of_type
- *
- * PARAMETERS:  Table_info          - A table info struct
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Free the memory associated with an internal ACPI table
- *              Table mutex should be locked.
- *
- ******************************************************************************/
-
-void
-acpi_tb_free_acpi_tables_of_type (
-       ACPI_TABLE_DESC         *list_head)
-{
-       ACPI_TABLE_DESC         *table_desc;
-       u32                     count;
-       u32                     i;
-
-
-       /* Get the head of the list */
-
-       table_desc  = list_head;
-       count       = list_head->count;
-
-       /*
-        * Walk the entire list, deleting both the allocated tables
-        * and the table descriptors
-        */
-
-       for (i = 0; i < count; i++) {
-               table_desc = acpi_tb_uninstall_table (table_desc);
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_delete_single_table
- *
- * PARAMETERS:  Table_info          - A table info struct
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Low-level free for a single ACPI table.  Handles cases where
- *              the table was allocated a buffer or was mapped.
- *
- ******************************************************************************/
-
-void
-acpi_tb_delete_single_table (
-       ACPI_TABLE_DESC         *table_desc)
-{
-
-       if (!table_desc) {
-               return;
-       }
-
-       if (table_desc->pointer) {
-               /* Valid table, determine type of memory allocation */
-
-               switch (table_desc->allocation) {
-
-               case ACPI_MEM_NOT_ALLOCATED:
-                       break;
-
-
-               case ACPI_MEM_ALLOCATED:
-
-                       acpi_cm_free (table_desc->base_pointer);
-                       break;
-
-
-               case ACPI_MEM_MAPPED:
-
-                       acpi_os_unmap_memory (table_desc->base_pointer, table_desc->length);
-                       break;
-               }
-       }
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_uninstall_table
- *
- * PARAMETERS:  Table_info          - A table info struct
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Free the memory associated with an internal ACPI table that
- *              is either installed or has never been installed.
- *              Table mutex should be locked.
- *
- ******************************************************************************/
-
-ACPI_TABLE_DESC *
-acpi_tb_uninstall_table (
-       ACPI_TABLE_DESC         *table_desc)
-{
-       ACPI_TABLE_DESC         *next_desc;
-
-
-       if (!table_desc) {
-               return (NULL);
-       }
-
-
-       /* Unlink the descriptor */
-
-       if (table_desc->prev) {
-               table_desc->prev->next = table_desc->next;
-       }
-
-       if (table_desc->next) {
-               table_desc->next->prev = table_desc->prev;
-       }
-
-
-       /* Free the memory allocated for the table itself */
-
-       acpi_tb_delete_single_table (table_desc);
-
-
-       /* Free the table descriptor (Don't delete the list head, tho) */
-
-       if ((table_desc->prev) == (table_desc->next)) {
-
-               next_desc = NULL;
-
-               /* Clear the list head */
-
-               table_desc->pointer  = NULL;
-               table_desc->length   = 0;
-               table_desc->count    = 0;
-
-       }
-
-       else {
-               /* Free the table descriptor */
-
-               next_desc = table_desc->next;
-               acpi_cm_free (table_desc);
-       }
-
-
-       return (next_desc);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/tables/tbutils.c b/reactos/drivers/bus/acpi/tables/tbutils.c
deleted file mode 100644 (file)
index 4d1cbbf..0000000
+++ /dev/null
@@ -1,352 +0,0 @@
-/******************************************************************************
- *
- * Module Name: tbutils - Table manipulation utilities
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_TABLES
-        MODULE_NAME         ("tbutils")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_handle_to_object
- *
- * PARAMETERS:  Table_id            - Id for which the function is searching
- *              Table_desc          - Pointer to return the matching table
- *                                      descriptor.
- *
- * RETURN:      Search the tables to find one with a matching Table_id and
- *              return a pointer to that table descriptor.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_handle_to_object (
-       u16                     table_id,
-       ACPI_TABLE_DESC         **table_desc)
-{
-       u32                     i;
-       ACPI_TABLE_DESC         *list_head;
-
-
-       for (i = 0; i < ACPI_TABLE_MAX; i++) {
-               list_head = &acpi_gbl_acpi_tables[i];
-               do {
-                       if (list_head->table_id == table_id) {
-                               *table_desc = list_head;
-                               return (AE_OK);
-                       }
-
-                       list_head = list_head->next;
-
-               } while (list_head != &acpi_gbl_acpi_tables[i]);
-       }
-
-
-       return (AE_BAD_PARAMETER);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_system_table_pointer
- *
- * PARAMETERS:  *Where              - Pointer to be examined
- *
- * RETURN:      TRUE if Where is within the AML stream (in one of the ACPI
- *              system tables such as the DSDT or an SSDT.)
- *              FALSE otherwise
- *
- ******************************************************************************/
-
-u8
-acpi_tb_system_table_pointer (
-       void                    *where)
-{
-       u32                     i;
-       ACPI_TABLE_DESC         *table_desc;
-       ACPI_TABLE_HEADER       *table;
-
-
-       /* No function trace, called too often! */
-
-
-       /* Ignore null pointer */
-
-       if (!where) {
-               return (FALSE);
-       }
-
-
-       /* Check for a pointer within the DSDT */
-
-       if ((acpi_gbl_DSDT) &&
-               (IS_IN_ACPI_TABLE (where, acpi_gbl_DSDT))) {
-               return (TRUE);
-       }
-
-
-       /* Check each of the loaded SSDTs (if any)*/
-
-       table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_SSDT];
-
-       for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_SSDT].count; i++) {
-               table = table_desc->pointer;
-
-               if (IS_IN_ACPI_TABLE (where, table)) {
-                       return (TRUE);
-               }
-
-               table_desc = table_desc->next;
-       }
-
-
-       /* Check each of the loaded PSDTs (if any)*/
-
-       table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_PSDT];
-
-       for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_PSDT].count; i++) {
-               table = table_desc->pointer;
-
-               if (IS_IN_ACPI_TABLE (where, table)) {
-                       return (TRUE);
-               }
-
-               table_desc = table_desc->next;
-       }
-
-
-       /* Pointer does not point into any system table */
-
-       return (FALSE);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_validate_table_header
- *
- * PARAMETERS:  Table_header        - Logical pointer to the table
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Check an ACPI table header for validity
- *
- * NOTE:  Table pointers are validated as follows:
- *          1) Table pointer must point to valid physical memory
- *          2) Signature must be 4 ASCII chars, even if we don't recognize the
- *             name
- *          3) Table must be readable for length specified in the header
- *          4) Table checksum must be valid (with the exception of the FACS
- *              which has no checksum for some odd reason)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_validate_table_header (
-       ACPI_TABLE_HEADER       *table_header)
-{
-       ACPI_NAME               signature;
-
-
-       /* Verify that this is a valid address */
-
-       if (!acpi_os_readable (table_header, sizeof (ACPI_TABLE_HEADER))) {
-               return (AE_BAD_ADDRESS);
-       }
-
-
-       /* Ensure that the signature is 4 ASCII characters */
-
-       MOVE_UNALIGNED32_TO_32 (&signature, &table_header->signature);
-       if (!acpi_cm_valid_acpi_name (signature)) {
-               REPORT_WARNING (("Invalid table signature found\n"));
-               return (AE_BAD_SIGNATURE);
-       }
-
-
-       /* Validate the table length */
-
-       if (table_header->length < sizeof (ACPI_TABLE_HEADER)) {
-               REPORT_WARNING (("Invalid table header length found\n"));
-               return (AE_BAD_HEADER);
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_map_acpi_table
- *
- * PARAMETERS:  Physical_address        - Physical address of table to map
- *              *Size                   - Size of the table.  If zero, the size
- *                                        from the table header is used.
- *                                        Actual size is returned here.
- *              **Logical_address       - Logical address of mapped table
- *
- * RETURN:      Logical address of the mapped table.
- *
- * DESCRIPTION: Maps the physical address of table into a logical address
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_map_acpi_table (
-       ACPI_PHYSICAL_ADDRESS   physical_address,
-       u32                     *size,
-       void                    **logical_address)
-{
-       ACPI_TABLE_HEADER       *table;
-       u32                     table_size = *size;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* If size is zero, look at the table header to get the actual size */
-
-       if ((*size) == 0) {
-               /* Get the table header so we can extract the table length */
-
-               status = acpi_os_map_memory (physical_address, sizeof (ACPI_TABLE_HEADER),
-                                 (void **) &table);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               /* Extract the full table length before we delete the mapping */
-
-               table_size = table->length;
-
-               /*
-                * Validate the header and delete the mapping.
-                * We will create a mapping for the full table below.
-                */
-
-               status = acpi_tb_validate_table_header (table);
-
-               /* Always unmap the memory for the header */
-
-               acpi_os_unmap_memory (table, sizeof (ACPI_TABLE_HEADER));
-
-               /* Exit if header invalid */
-
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-
-       /* Map the physical memory for the correct length */
-
-       status = acpi_os_map_memory (physical_address, table_size, (void **) &table);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       *size = table_size;
-       *logical_address = table;
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_verify_table_checksum
- *
- * PARAMETERS:  *Table_header           - ACPI table to verify
- *
- * RETURN:      8 bit checksum of table
- *
- * DESCRIPTION: Does an 8 bit checksum of table and returns status.  A correct
- *              table should have a checksum of 0.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_verify_table_checksum (
-       ACPI_TABLE_HEADER       *table_header)
-{
-       u8                      checksum;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Compute the checksum on the table */
-
-       checksum = acpi_tb_checksum (table_header, table_header->length);
-
-       /* Return the appropriate exception */
-
-       if (checksum) {
-               REPORT_WARNING (("Invalid checksum (%X) in table %4.4s\n",
-                       checksum, &table_header->signature));
-
-               status = AE_BAD_CHECKSUM;
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_checksum
- *
- * PARAMETERS:  Buffer              - Buffer to checksum
- *              Length              - Size of the buffer
- *
- * RETURNS      8 bit checksum of buffer
- *
- * DESCRIPTION: Computes an 8 bit checksum of the buffer(length) and returns it.
- *
- ******************************************************************************/
-
-u8
-acpi_tb_checksum (
-       void                    *buffer,
-       u32                     length)
-{
-       u8                      *limit;
-       u8                      *rover;
-       u8                      sum = 0;
-
-
-       if (buffer && length) {
-               /*  Buffer and Length are valid   */
-
-               limit = (u8 *) buffer + length;
-
-               for (rover = buffer; rover < limit; rover++) {
-                       sum = (u8) (sum + *rover);
-               }
-       }
-
-       return (sum);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/tables/tbxface.c b/reactos/drivers/bus/acpi/tables/tbxface.c
deleted file mode 100644 (file)
index ff44010..0000000
+++ /dev/null
@@ -1,383 +0,0 @@
-/******************************************************************************
- *
- * Module Name: tbxface - Public interfaces to the ACPI subsystem
- *                         ACPI table oriented interfaces
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_TABLES
-        MODULE_NAME         ("tbxface")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_load_tables
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to load the ACPI tables from the
- *              provided RSDT
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_load_tables (
-       ACPI_PHYSICAL_ADDRESS   rsdp_physical_address)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     number_of_tables = 0;
-
-
-       /* Map and validate the RSDP */
-
-       status = acpi_tb_verify_rsdp (rsdp_physical_address);
-       if (ACPI_FAILURE (status)) {
-               REPORT_ERROR (("Acpi_load_tables: RSDP Failed validation: %s\n",
-                                 acpi_cm_format_exception (status)));
-               goto error_exit;
-       }
-
-       /* Get the RSDT via the RSDP */
-
-       status = acpi_tb_get_table_rsdt (&number_of_tables);
-       if (ACPI_FAILURE (status)) {
-               REPORT_ERROR (("Acpi_load_tables: Could not load RSDT: %s\n",
-                                 acpi_cm_format_exception (status)));
-               goto error_exit;
-       }
-
-       /* Now get the rest of the tables */
-
-       status = acpi_tb_get_all_tables (number_of_tables, NULL);
-       if (ACPI_FAILURE (status)) {
-               REPORT_ERROR (("Acpi_load_tables: Error getting required tables (DSDT/FADT/FACS): %s\n",
-                                 acpi_cm_format_exception (status)));
-               goto error_exit;
-       }
-
-
-       /* Load the namespace from the tables */
-
-       status = acpi_ns_load_namespace ();
-       if (ACPI_FAILURE (status)) {
-               REPORT_ERROR (("Acpi_load_tables: Could not load namespace: %s\n",
-                                 acpi_cm_format_exception (status)));
-               goto error_exit;
-       }
-
-       return (AE_OK);
-
-
-error_exit:
-       REPORT_ERROR (("Acpi_load_tables: Could not load tables: %s\n",
-                         acpi_cm_format_exception (status)));
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_load_table
- *
- * PARAMETERS:  Table_ptr       - pointer to a buffer containing the entire
- *                                table to be loaded
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to load a table from the caller's
- *              buffer.  The buffer must contain an entire ACPI Table including
- *              a valid header.  The header fields will be verified, and if it
- *              is determined that the table is invalid, the call will fail.
- *
- *              If the call fails an appropriate status will be returned.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_load_table (
-       ACPI_TABLE_HEADER       *table_ptr)
-{
-       ACPI_STATUS             status;
-       ACPI_TABLE_DESC         table_info;
-
-
-       if (!table_ptr) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Copy the table to a local buffer */
-
-       status = acpi_tb_get_table (0, table_ptr, &table_info);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /* Install the new table into the local data structures */
-
-       status = acpi_tb_install_table (NULL, &table_info);
-       if (ACPI_FAILURE (status)) {
-               /* Free table allocated by Acpi_tb_get_table */
-
-               acpi_tb_delete_single_table (&table_info);
-               return (status);
-       }
-
-
-       status = acpi_ns_load_table (table_info.installed_desc, acpi_gbl_root_node);
-       if (ACPI_FAILURE (status)) {
-               /* Uninstall table and free the buffer */
-
-               acpi_tb_uninstall_table (table_info.installed_desc);
-               return (status);
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_unload_table
- *
- * PARAMETERS:  Table_type    - Type of table to be unloaded
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This routine is used to force the unload of a table
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_unload_table (
-       ACPI_TABLE_TYPE         table_type)
-{
-       ACPI_TABLE_DESC         *list_head;
-
-
-       /* Parameter validation */
-
-       if (table_type > ACPI_TABLE_MAX) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Find all tables of the requested type */
-
-       list_head = &acpi_gbl_acpi_tables[table_type];
-       do {
-               /*
-                * Delete all namespace entries owned by this table.  Note that these
-                * entries can appear anywhere in the namespace by virtue of the AML
-                * "Scope" operator.  Thus, we need to track ownership by an ID, not
-                * simply a position within the hierarchy
-                */
-
-               acpi_ns_delete_namespace_by_owner (list_head->table_id);
-
-               /* Delete (or unmap) the actual table */
-
-               acpi_tb_delete_acpi_table (table_type);
-
-       } while (list_head != &acpi_gbl_acpi_tables[table_type]);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_get_table_header
- *
- * PARAMETERS:  Table_type      - one of the defined table types
- *              Instance        - the non zero instance of the table, allows
- *                                support for multiple tables of the same type
- *                                see Acpi_gbl_Acpi_table_flag
- *              Out_table_header - pointer to the ACPI_TABLE_HEADER if successful
- *
- * DESCRIPTION: This function is called to get an ACPI table header.  The caller
- *              supplies an pointer to a data area sufficient to contain an ACPI
- *              ACPI_TABLE_HEADER structure.
- *
- *              The header contains a length field that can be used to determine
- *              the size of the buffer needed to contain the entire table.  This
- *              function is not valid for the RSD PTR table since it does not
- *              have a standard header and is fixed length.
- *
- *              If the operation fails for any reason an appropriate status will
- *              be returned and the contents of Out_table_header are undefined.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_table_header (
-       ACPI_TABLE_TYPE         table_type,
-       u32                     instance,
-       ACPI_TABLE_HEADER       *out_table_header)
-{
-       ACPI_TABLE_HEADER       *tbl_ptr;
-       ACPI_STATUS             status;
-
-
-       if ((instance == 0)                 ||
-               (table_type == ACPI_TABLE_RSDP) ||
-               (!out_table_header)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Check the table type and instance */
-
-       if ((table_type > ACPI_TABLE_MAX)   ||
-               (IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags) &&
-                instance > 1)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Get a pointer to the entire table */
-
-       status = acpi_tb_get_table_ptr (table_type, instance, &tbl_ptr);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * The function will return a NULL pointer if the table is not loaded
-        */
-       if (tbl_ptr == NULL) {
-               return (AE_NOT_EXIST);
-       }
-
-       /*
-        * Copy the header to the caller's buffer
-        */
-       MEMCPY ((void *) out_table_header, (void *) tbl_ptr,
-                        sizeof (ACPI_TABLE_HEADER));
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_get_table
- *
- * PARAMETERS:  Table_type      - one of the defined table types
- *              Instance        - the non zero instance of the table, allows
- *                                support for multiple tables of the same type
- *                                see Acpi_gbl_Acpi_table_flag
- *              Ret_buffer      - pointer to a structure containing a buffer to
- *                                receive the table
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to get an ACPI table.  The caller
- *              supplies an Out_buffer large enough to contain the entire ACPI
- *              table.  The caller should call the Acpi_get_table_header function
- *              first to determine the buffer size needed.  Upon completion
- *              the Out_buffer->Length field will indicate the number of bytes
- *              copied into the Out_buffer->Buf_ptr buffer. This table will be
- *              a complete table including the header.
- *
- *              If the operation fails an appropriate status will be returned
- *              and the contents of Out_buffer are undefined.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_table (
-       ACPI_TABLE_TYPE         table_type,
-       u32                     instance,
-       ACPI_BUFFER             *ret_buffer)
-{
-       ACPI_TABLE_HEADER       *tbl_ptr;
-       ACPI_STATUS             status;
-       u32                     ret_buf_len;
-
-
-       /*
-        *  If we have a buffer, we must have a length too
-        */
-       if ((instance == 0)                 ||
-               (!ret_buffer)                   ||
-               ((!ret_buffer->pointer) && (ret_buffer->length))) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /* Check the table type and instance */
-
-       if ((table_type > ACPI_TABLE_MAX)   ||
-               (IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags) &&
-                instance > 1)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Get a pointer to the entire table */
-
-       status = acpi_tb_get_table_ptr (table_type, instance, &tbl_ptr);
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * Acpi_tb_get_table_ptr will return a NULL pointer if the
-        *  table is not loaded.
-        */
-       if (tbl_ptr == NULL) {
-               return (AE_NOT_EXIST);
-       }
-
-       /*
-        * Got a table ptr, assume it's ok and copy it to the user's buffer
-        */
-       if (table_type == ACPI_TABLE_RSDP) {
-               /*
-                *  RSD PTR is the only "table" without a header
-                */
-               ret_buf_len = sizeof (RSDP_DESCRIPTOR);
-       }
-       else {
-               ret_buf_len = tbl_ptr->length;
-       }
-
-       /*
-        * Verify we have space in the caller's buffer for the table
-        */
-       if (ret_buffer->length < ret_buf_len) {
-               ret_buffer->length = ret_buf_len;
-               return (AE_BUFFER_OVERFLOW);
-       }
-
-       ret_buffer->length = ret_buf_len;
-
-       MEMCPY ((void *) ret_buffer->pointer, (void *) tbl_ptr, ret_buf_len);
-
-       return (AE_OK);
-}
-
diff --git a/reactos/drivers/bus/acpi/tables/tbxfroot.c b/reactos/drivers/bus/acpi/tables/tbxfroot.c
deleted file mode 100644 (file)
index c15bf6d..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/******************************************************************************
- *
- * Module Name: tbxfroot - Find the root ACPI table (RSDT)
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_TABLES
-        MODULE_NAME         ("tbxfroot")
-
-#define RSDP_CHECKSUM_LENGTH 20
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_find_root_pointer
- *
- * PARAMETERS:  **Rsdp_physical_address     - Where to place the RSDP address
- *
- * RETURN:      Status, Physical address of the RSDP
- *
- * DESCRIPTION: Find the RSDP
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_find_root_pointer (
-       ACPI_PHYSICAL_ADDRESS   *rsdp_physical_address)
-{
-       ACPI_TABLE_DESC         table_info;
-       ACPI_STATUS             status;
-
-
-       /* Get the RSDP */
-
-       status = acpi_tb_find_rsdp (&table_info);
-       if (ACPI_FAILURE (status)) {
-               return (AE_NO_ACPI_TABLES);
-       }
-
-       *rsdp_physical_address = table_info.physical_address;
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_scan_memory_for_rsdp
- *
- * PARAMETERS:  Start_address       - Starting pointer for search
- *              Length              - Maximum length to search
- *
- * RETURN:      Pointer to the RSDP if found, otherwise NULL.
- *
- * DESCRIPTION: Search a block of memory for the RSDP signature
- *
- ******************************************************************************/
-
-u8 *
-acpi_tb_scan_memory_for_rsdp (
-       u8                      *start_address,
-       u32                     length)
-{
-       u32                     offset;
-       u8                      *mem_rover;
-
-
-       /* Search from given start addr for the requested length  */
-
-       for (offset = 0, mem_rover = start_address;
-                offset < length;
-                offset += RSDP_SCAN_STEP, mem_rover += RSDP_SCAN_STEP) {
-
-               /* The signature and checksum must both be correct */
-
-               if (STRNCMP ((NATIVE_CHAR *) mem_rover,
-                               RSDP_SIG, sizeof (RSDP_SIG)-1) == 0 &&
-                       acpi_tb_checksum (mem_rover, RSDP_CHECKSUM_LENGTH) == 0) {
-                       /* If so, we have found the RSDP */
-
-                       return (mem_rover);
-               }
-       }
-
-       /* Searched entire block, no RSDP was found */
-
-       return (NULL);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_tb_find_rsdp
- *
- * PARAMETERS:  *Buffer_ptr             - If == NULL, read data from buffer
- *                                        rather than searching memory
- *              *Table_info             - Where the table info is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Search lower 1_mbyte of memory for the root system descriptor
- *              pointer structure.  If it is found, set *RSDP to point to it.
- *
- *              NOTE: The RSDP must be either in the first 1_k of the Extended
- *              BIOS Data Area or between E0000 and FFFFF (ACPI 1.0 section
- *              5.2.2; assertion #421).
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_tb_find_rsdp (
-       ACPI_TABLE_DESC         *table_info)
-{
-       u8                      *table_ptr;
-       u8                      *mem_rover;
-       UINT64                  phys_addr;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /*
-        * Search memory for RSDP.  First map low physical memory.
-        */
-
-       status = acpi_os_map_memory (LO_RSDP_WINDOW_BASE, LO_RSDP_WINDOW_SIZE,
-                         (void **)&table_ptr);
-
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * 1) Search EBDA (low memory) paragraphs
-        */
-
-       mem_rover = acpi_tb_scan_memory_for_rsdp (table_ptr, LO_RSDP_WINDOW_SIZE);
-
-       /* This mapping is no longer needed */
-
-       acpi_os_unmap_memory (table_ptr, LO_RSDP_WINDOW_SIZE);
-
-       if (mem_rover) {
-               /* Found it, return the physical address */
-
-               phys_addr = LO_RSDP_WINDOW_BASE;
-               phys_addr += (mem_rover - table_ptr);
-
-               table_info->physical_address = phys_addr;
-
-               return (AE_OK);
-       }
-
-
-       /*
-        * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h
-        */
-
-       status = acpi_os_map_memory (HI_RSDP_WINDOW_BASE, HI_RSDP_WINDOW_SIZE,
-                         (void **)&table_ptr);
-
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       mem_rover = acpi_tb_scan_memory_for_rsdp (table_ptr, HI_RSDP_WINDOW_SIZE);
-
-       /* This mapping is no longer needed */
-
-       acpi_os_unmap_memory (table_ptr, HI_RSDP_WINDOW_SIZE);
-
-       if (mem_rover) {
-               /* Found it, return the physical address */
-
-               phys_addr = HI_RSDP_WINDOW_BASE;
-               phys_addr += (mem_rover - table_ptr);
-
-               table_info->physical_address = phys_addr;
-
-               return (AE_OK);
-       }
-
-
-       /* RSDP signature was not found */
-
-       return (AE_NOT_FOUND);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/utils/cmalloc.c b/reactos/drivers/bus/acpi/utils/cmalloc.c
deleted file mode 100644 (file)
index 03e743f..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cmalloc - local memory allocation routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cmalloc")
-
-
-/*****************************************************************************
- *
- * FUNCTION:    _Cm_allocate
- *
- * PARAMETERS:  Size                - Size of the allocation
- *              Component           - Component type of caller
- *              Module              - Source file name of caller
- *              Line                - Line number of caller
- *
- * RETURN:      Address of the allocated memory on success, NULL on failure.
- *
- * DESCRIPTION: The subsystem's equivalent of malloc.
- *
- ****************************************************************************/
-
-void *
-_cm_allocate (
-       u32                     size,
-       u32                     component,
-       NATIVE_CHAR             *module,
-       u32                     line)
-{
-       void                    *address = NULL;
-
-
-       /* Check for an inadvertent size of zero bytes */
-
-       if (!size) {
-               _REPORT_ERROR (module, line, component,
-                               ("Cm_allocate: Attempt to allocate zero bytes\n"));
-               size = 1;
-       }
-
-       address = acpi_os_allocate (size);
-       if (!address) {
-               /* Report allocation error */
-
-               _REPORT_ERROR (module, line, component,
-                               ("Cm_allocate: Could not allocate size %X\n", size));
-
-               return (NULL);
-       }
-
-
-       return (address);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    _Cm_callocate
- *
- * PARAMETERS:  Size                - Size of the allocation
- *              Component           - Component type of caller
- *              Module              - Source file name of caller
- *              Line                - Line number of caller
- *
- * RETURN:      Address of the allocated memory on success, NULL on failure.
- *
- * DESCRIPTION: Subsystem equivalent of calloc.
- *
- ****************************************************************************/
-
-void *
-_cm_callocate (
-       u32                     size,
-       u32                     component,
-       NATIVE_CHAR             *module,
-       u32                     line)
-{
-       void                    *address = NULL;
-
-
-       /* Check for an inadvertent size of zero bytes */
-
-       if (!size) {
-               _REPORT_ERROR (module, line, component,
-                               ("Cm_callocate: Attempt to allocate zero bytes\n"));
-               return (NULL);
-       }
-
-
-       address = acpi_os_callocate (size);
-
-       if (!address) {
-               /* Report allocation error */
-
-               _REPORT_ERROR (module, line, component,
-                               ("Cm_callocate: Could not allocate size %X\n", size));
-               return (NULL);
-       }
-
-
-       return (address);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    _Cm_free
- *
- * PARAMETERS:  Address             - Address of the memory to deallocate
- *              Component           - Component type of caller
- *              Module              - Source file name of caller
- *              Line                - Line number of caller
- *
- * RETURN:      None
- *
- * DESCRIPTION: Frees the memory at Address
- *
- ****************************************************************************/
-
-void
-_cm_free (
-       void                    *address,
-       u32                     component,
-       NATIVE_CHAR             *module,
-       u32                     line)
-{
-
-       if (NULL == address) {
-               _REPORT_ERROR (module, line, component,
-                       ("_Cm_free: Trying to delete a NULL address\n"));
-
-               return;
-       }
-
-
-       acpi_os_free (address);
-
-       return;
-}
-
-
diff --git a/reactos/drivers/bus/acpi/utils/cmclib.c b/reactos/drivers/bus/acpi/utils/cmclib.c
deleted file mode 100644 (file)
index 29f1d4f..0000000
+++ /dev/null
@@ -1,810 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cmclib - Local implementation of C library functions
- * $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-/*
- * These implementations of standard C Library routines can optionally be
- * used if a C library is not available.  In general, they are less efficient
- * than an inline or assembly implementation
- */
-
-#define _COMPONENT          MISCELLANEOUS
-        MODULE_NAME         ("cmclib")
-
-
-#ifndef ACPI_USE_SYSTEM_CLIBRARY
-
-/*******************************************************************************
- *
- * FUNCTION:    strlen
- *
- * PARAMETERS:  String              - Null terminated string
- *
- * RETURN:      Length
- *
- * DESCRIPTION: Returns the length of the input string
- *
- ******************************************************************************/
-
-
-u32
-acpi_cm_strlen (
-       const NATIVE_CHAR       *string)
-{
-       u32                     length = 0;
-
-
-       /* Count the string until a null is encountered */
-
-       while (*string) {
-               length++;
-               string++;
-       }
-
-       return (length);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    strcpy
- *
- * PARAMETERS:  Dst_string      - Target of the copy
- *              Src_string      - The source string to copy
- *
- * RETURN:      Dst_string
- *
- * DESCRIPTION: Copy a null terminated string
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_cm_strcpy (
-       NATIVE_CHAR             *dst_string,
-       const NATIVE_CHAR       *src_string)
-{
-       NATIVE_CHAR             *string = dst_string;
-
-
-       /* Move bytes brute force */
-
-       while (*src_string) {
-               *string = *src_string;
-
-               string++;
-               src_string++;
-       }
-
-       /* Null terminate */
-
-       *string = 0;
-
-       return (dst_string);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    strncpy
- *
- * PARAMETERS:  Dst_string      - Target of the copy
- *              Src_string      - The source string to copy
- *              Count           - Maximum # of bytes to copy
- *
- * RETURN:      Dst_string
- *
- * DESCRIPTION: Copy a null terminated string, with a maximum length
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_cm_strncpy (
-       NATIVE_CHAR             *dst_string,
-       const NATIVE_CHAR       *src_string,
-       NATIVE_UINT             count)
-{
-       NATIVE_CHAR             *string = dst_string;
-
-
-       /* Copy the string */
-
-       for (string = dst_string;
-               count && (count--, (*string++ = *src_string++)); ) {;}
-
-       /* Pad with nulls if necessary */
-
-       while (count--) {
-               *string = 0;
-               string++;
-       }
-
-       /* Return original pointer */
-
-       return (dst_string);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    strcmp
- *
- * PARAMETERS:  String1         - First string
- *              String2         - Second string
- *
- * RETURN:      Index where strings mismatched, or 0 if strings matched
- *
- * DESCRIPTION: Compare two null terminated strings
- *
- ******************************************************************************/
-
-u32
-acpi_cm_strcmp (
-       const NATIVE_CHAR       *string1,
-       const NATIVE_CHAR       *string2)
-{
-
-
-       for ( ; (*string1 == *string2); string2++) {
-               if (!*string1++) {
-                       return (0);
-               }
-       }
-
-
-       return ((unsigned char) *string1 - (unsigned char) *string2);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    strncmp
- *
- * PARAMETERS:  String1         - First string
- *              String2         - Second string
- *              Count           - Maximum # of bytes to compare
- *
- * RETURN:      Index where strings mismatched, or 0 if strings matched
- *
- * DESCRIPTION: Compare two null terminated strings, with a maximum length
- *
- ******************************************************************************/
-
-u32
-acpi_cm_strncmp (
-       const NATIVE_CHAR       *string1,
-       const NATIVE_CHAR       *string2,
-       NATIVE_UINT             count)
-{
-
-
-       for ( ; count-- && (*string1 == *string2); string2++) {
-               if (!*string1++) {
-                       return (0);
-               }
-       }
-
-       return ((count == -1) ? 0 : ((unsigned char) *string1 -
-               (unsigned char) *string2));
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Strcat
- *
- * PARAMETERS:  Dst_string      - Target of the copy
- *              Src_string      - The source string to copy
- *
- * RETURN:      Dst_string
- *
- * DESCRIPTION: Append a null terminated string to a null terminated string
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_cm_strcat (
-       NATIVE_CHAR             *dst_string,
-       const NATIVE_CHAR       *src_string)
-{
-       NATIVE_CHAR             *string;
-
-
-       /* Find end of the destination string */
-
-       for (string = dst_string; *string++; ) { ; }
-
-       /* Concatinate the string */
-
-       for (--string; (*string++ = *src_string++); ) { ; }
-
-       return (dst_string);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    strncat
- *
- * PARAMETERS:  Dst_string      - Target of the copy
- *              Src_string      - The source string to copy
- *              Count           - Maximum # of bytes to copy
- *
- * RETURN:      Dst_string
- *
- * DESCRIPTION: Append a null terminated string to a null terminated string,
- *              with a maximum count.
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_cm_strncat (
-       NATIVE_CHAR             *dst_string,
-       const NATIVE_CHAR       *src_string,
-       NATIVE_UINT             count)
-{
-       NATIVE_CHAR             *string;
-
-
-       if (count) {
-               /* Find end of the destination string */
-
-               for (string = dst_string; *string++; ) { ; }
-
-               /* Concatinate the string */
-
-               for (--string; (*string++ = *src_string++) && --count; ) { ; }
-
-               /* Null terminate if necessary */
-
-               if (!count) {
-                       *string = 0;
-               }
-       }
-
-       return (dst_string);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    memcpy
- *
- * PARAMETERS:  Dest        - Target of the copy
- *              Src         - Source buffer to copy
- *              Count       - Number of bytes to copy
- *
- * RETURN:      Dest
- *
- * DESCRIPTION: Copy arbitrary bytes of memory
- *
- ******************************************************************************/
-
-void *
-acpi_cm_memcpy (
-       void                    *dest,
-       const void              *src,
-       NATIVE_UINT             count)
-{
-       NATIVE_CHAR             *new = (NATIVE_CHAR *) dest;
-       NATIVE_CHAR             *old = (NATIVE_CHAR *) src;
-
-
-       while (count) {
-               *new = *old;
-               new++;
-               old++;
-               count--;
-       }
-
-       return (dest);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    memset
- *
- * PARAMETERS:  Dest        - Buffer to set
- *              Value       - Value to set each byte of memory
- *              Count       - Number of bytes to set
- *
- * RETURN:      Dest
- *
- * DESCRIPTION: Initialize a buffer to a known value.
- *
- ******************************************************************************/
-
-void *
-acpi_cm_memset (
-       void                    *dest,
-       NATIVE_UINT             value,
-       NATIVE_UINT             count)
-{
-       NATIVE_CHAR             *new = (NATIVE_CHAR *) dest;
-
-
-       while (count) {
-               *new = (char) value;
-               new++;
-               count--;
-       }
-
-       return (dest);
-}
-
-
-#define NEGATIVE    1
-#define POSITIVE    0
-
-
-#define _ACPI_XA     0x00    /* extra alphabetic - not supported */
-#define _ACPI_XS     0x40    /* extra space */
-#define _ACPI_BB     0x00    /* BEL, BS, etc. - not supported */
-#define _ACPI_CN     0x20    /* CR, FF, HT, NL, VT */
-#define _ACPI_DI     0x04    /* '0'-'9' */
-#define _ACPI_LO     0x02    /* 'a'-'z' */
-#define _ACPI_PU     0x10    /* punctuation */
-#define _ACPI_SP     0x08    /* space */
-#define _ACPI_UP     0x01    /* 'A'-'Z' */
-#define _ACPI_XD     0x80    /* '0'-'9', 'A'-'F', 'a'-'f' */
-
-static const u8 _acpi_ctype[257] = {
-       _ACPI_CN,            /* 0x0      0.     */
-       _ACPI_CN,            /* 0x1      1.     */
-       _ACPI_CN,            /* 0x2      2.     */
-       _ACPI_CN,            /* 0x3      3.     */
-       _ACPI_CN,            /* 0x4      4.     */
-       _ACPI_CN,            /* 0x5      5.     */
-       _ACPI_CN,            /* 0x6      6.     */
-       _ACPI_CN,            /* 0x7      7.     */
-       _ACPI_CN,            /* 0x8      8.     */
-       _ACPI_CN|_ACPI_SP,   /* 0x9      9.     */
-       _ACPI_CN|_ACPI_SP,   /* 0xA     10.     */
-       _ACPI_CN|_ACPI_SP,   /* 0xB     11.     */
-       _ACPI_CN|_ACPI_SP,   /* 0xC     12.     */
-       _ACPI_CN|_ACPI_SP,   /* 0xD     13.     */
-       _ACPI_CN,            /* 0xE     14.     */
-       _ACPI_CN,            /* 0xF     15.     */
-       _ACPI_CN,            /* 0x10    16.     */
-       _ACPI_CN,            /* 0x11    17.     */
-       _ACPI_CN,            /* 0x12    18.     */
-       _ACPI_CN,            /* 0x13    19.     */
-       _ACPI_CN,            /* 0x14    20.     */
-       _ACPI_CN,            /* 0x15    21.     */
-       _ACPI_CN,            /* 0x16    22.     */
-       _ACPI_CN,            /* 0x17    23.     */
-       _ACPI_CN,            /* 0x18    24.     */
-       _ACPI_CN,            /* 0x19    25.     */
-       _ACPI_CN,            /* 0x1A    26.     */
-       _ACPI_CN,            /* 0x1B    27.     */
-       _ACPI_CN,            /* 0x1C    28.     */
-       _ACPI_CN,            /* 0x1D    29.     */
-       _ACPI_CN,            /* 0x1E    30.     */
-       _ACPI_CN,            /* 0x1F    31.     */
-       _ACPI_XS|_ACPI_SP,   /* 0x20    32. ' ' */
-       _ACPI_PU,            /* 0x21    33. '!' */
-       _ACPI_PU,            /* 0x22    34. '"' */
-       _ACPI_PU,            /* 0x23    35. '#' */
-       _ACPI_PU,            /* 0x24    36. '$' */
-       _ACPI_PU,            /* 0x25    37. '%' */
-       _ACPI_PU,            /* 0x26    38. '&' */
-       _ACPI_PU,            /* 0x27    39. ''' */
-       _ACPI_PU,            /* 0x28    40. '(' */
-       _ACPI_PU,            /* 0x29    41. ')' */
-       _ACPI_PU,            /* 0x2A    42. '*' */
-       _ACPI_PU,            /* 0x2B    43. '+' */
-       _ACPI_PU,            /* 0x2C    44. ',' */
-       _ACPI_PU,            /* 0x2D    45. '-' */
-       _ACPI_PU,            /* 0x2E    46. '.' */
-       _ACPI_PU,            /* 0x2F    47. '/' */
-       _ACPI_XD|_ACPI_DI,   /* 0x30    48. '0' */
-       _ACPI_XD|_ACPI_DI,   /* 0x31    49. '1' */
-       _ACPI_XD|_ACPI_DI,   /* 0x32    50. '2' */
-       _ACPI_XD|_ACPI_DI,   /* 0x33    51. '3' */
-       _ACPI_XD|_ACPI_DI,   /* 0x34    52. '4' */
-       _ACPI_XD|_ACPI_DI,   /* 0x35    53. '5' */
-       _ACPI_XD|_ACPI_DI,   /* 0x36    54. '6' */
-       _ACPI_XD|_ACPI_DI,   /* 0x37    55. '7' */
-       _ACPI_XD|_ACPI_DI,   /* 0x38    56. '8' */
-       _ACPI_XD|_ACPI_DI,   /* 0x39    57. '9' */
-       _ACPI_PU,            /* 0x3A    58. ':' */
-       _ACPI_PU,            /* 0x3B    59. ';' */
-       _ACPI_PU,            /* 0x3C    60. '<' */
-       _ACPI_PU,            /* 0x3D    61. '=' */
-       _ACPI_PU,            /* 0x3E    62. '>' */
-       _ACPI_PU,            /* 0x3F    63. '?' */
-       _ACPI_PU,            /* 0x40    64. '@' */
-       _ACPI_XD|_ACPI_UP,   /* 0x41    65. 'A' */
-       _ACPI_XD|_ACPI_UP,   /* 0x42    66. 'B' */
-       _ACPI_XD|_ACPI_UP,   /* 0x43    67. 'C' */
-       _ACPI_XD|_ACPI_UP,   /* 0x44    68. 'D' */
-       _ACPI_XD|_ACPI_UP,   /* 0x45    69. 'E' */
-       _ACPI_XD|_ACPI_UP,   /* 0x46    70. 'F' */
-       _ACPI_UP,            /* 0x47    71. 'G' */
-       _ACPI_UP,            /* 0x48    72. 'H' */
-       _ACPI_UP,            /* 0x49    73. 'I' */
-       _ACPI_UP,            /* 0x4A    74. 'J' */
-       _ACPI_UP,            /* 0x4B    75. 'K' */
-       _ACPI_UP,            /* 0x4C    76. 'L' */
-       _ACPI_UP,            /* 0x4D    77. 'M' */
-       _ACPI_UP,            /* 0x4E    78. 'N' */
-       _ACPI_UP,            /* 0x4F    79. 'O' */
-       _ACPI_UP,            /* 0x50    80. 'P' */
-       _ACPI_UP,            /* 0x51    81. 'Q' */
-       _ACPI_UP,            /* 0x52    82. 'R' */
-       _ACPI_UP,            /* 0x53    83. 'S' */
-       _ACPI_UP,            /* 0x54    84. 'T' */
-       _ACPI_UP,            /* 0x55    85. 'U' */
-       _ACPI_UP,            /* 0x56    86. 'V' */
-       _ACPI_UP,            /* 0x57    87. 'W' */
-       _ACPI_UP,            /* 0x58    88. 'X' */
-       _ACPI_UP,            /* 0x59    89. 'Y' */
-       _ACPI_UP,            /* 0x5A    90. 'Z' */
-       _ACPI_PU,            /* 0x5B    91. '[' */
-       _ACPI_PU,            /* 0x5C    92. '\' */
-       _ACPI_PU,            /* 0x5D    93. ']' */
-       _ACPI_PU,            /* 0x5E    94. '^' */
-       _ACPI_PU,            /* 0x5F    95. '_' */
-       _ACPI_PU,            /* 0x60    96. '`' */
-       _ACPI_XD|_ACPI_LO,   /* 0x61    97. 'a' */
-       _ACPI_XD|_ACPI_LO,   /* 0x62    98. 'b' */
-       _ACPI_XD|_ACPI_LO,   /* 0x63    99. 'c' */
-       _ACPI_XD|_ACPI_LO,   /* 0x64   100. 'd' */
-       _ACPI_XD|_ACPI_LO,   /* 0x65   101. 'e' */
-       _ACPI_XD|_ACPI_LO,   /* 0x66   102. 'f' */
-       _ACPI_LO,            /* 0x67   103. 'g' */
-       _ACPI_LO,            /* 0x68   104. 'h' */
-       _ACPI_LO,            /* 0x69   105. 'i' */
-       _ACPI_LO,            /* 0x6A   106. 'j' */
-       _ACPI_LO,            /* 0x6B   107. 'k' */
-       _ACPI_LO,            /* 0x6C   108. 'l' */
-       _ACPI_LO,            /* 0x6D   109. 'm' */
-       _ACPI_LO,            /* 0x6E   110. 'n' */
-       _ACPI_LO,            /* 0x6F   111. 'o' */
-       _ACPI_LO,            /* 0x70   112. 'p' */
-       _ACPI_LO,            /* 0x71   113. 'q' */
-       _ACPI_LO,            /* 0x72   114. 'r' */
-       _ACPI_LO,            /* 0x73   115. 's' */
-       _ACPI_LO,            /* 0x74   116. 't' */
-       _ACPI_LO,            /* 0x75   117. 'u' */
-       _ACPI_LO,            /* 0x76   118. 'v' */
-       _ACPI_LO,            /* 0x77   119. 'w' */
-       _ACPI_LO,            /* 0x78   120. 'x' */
-       _ACPI_LO,            /* 0x79   121. 'y' */
-       _ACPI_LO,            /* 0x7A   122. 'z' */
-       _ACPI_PU,            /* 0x7B   123. '{' */
-       _ACPI_PU,            /* 0x7C   124. '|' */
-       _ACPI_PU,            /* 0x7D   125. '}' */
-       _ACPI_PU,            /* 0x7E   126. '~' */
-       _ACPI_CN,            /* 0x7F   127.     */
-
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0x80 to 0x8F    */
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0x90 to 0x9F    */
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xA0 to 0xAF    */
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xB0 to 0xBF    */
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xC0 to 0xCF    */
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xD0 to 0xDF    */
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xE0 to 0xEF    */
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* 0xF0 to 0x100   */
-};
-
-#define IS_UPPER(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_UP))
-#define IS_LOWER(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO))
-#define IS_DIGIT(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_DI))
-#define IS_SPACE(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_SP))
-#define IS_XDIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_XD))
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_to_upper
- *
- * PARAMETERS:
- *
- * RETURN:
- *
- * DESCRIPTION: Convert character to uppercase
- *
- ******************************************************************************/
-
-u32
-acpi_cm_to_upper (
-       u32                     c)
-{
-
-       return (IS_LOWER(c) ? ((c)-0x20) : (c));
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_to_lower
- *
- * PARAMETERS:
- *
- * RETURN:
- *
- * DESCRIPTION: Convert character to lowercase
- *
- ******************************************************************************/
-
-u32
-acpi_cm_to_lower (
-       u32                     c)
-{
-
-       return (IS_UPPER(c) ? ((c)+0x20) : (c));
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    strupr
- *
- * PARAMETERS:  Src_string      - The source string to convert to
- *
- * RETURN:      Src_string
- *
- * DESCRIPTION: Convert string to uppercase
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_cm_strupr (
-       NATIVE_CHAR             *src_string)
-{
-       NATIVE_CHAR             *string;
-
-
-       /* Walk entire string, uppercasing the letters */
-
-       for (string = src_string; *string; ) {
-               *string = (char) acpi_cm_to_upper (*string);
-               string++;
-       }
-
-
-       return (src_string);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    strstr
- *
- * PARAMETERS:  String1       -
- *              String2
- *
- * RETURN:
- *
- * DESCRIPTION: Checks if String2 occurs in String1. This is not really a
- *              full implementation of strstr, only sufficient for command
- *              matching
- *
- ******************************************************************************/
-
-NATIVE_CHAR *
-acpi_cm_strstr (
-       NATIVE_CHAR             *string1,
-       NATIVE_CHAR             *string2)
-{
-       NATIVE_CHAR             *string;
-
-
-       if (acpi_cm_strlen (string2) > acpi_cm_strlen (string1)) {
-               return (NULL);
-       }
-
-       /* Walk entire string, comparing the letters */
-
-       for (string = string1; *string2; ) {
-               if (*string2 != *string) {
-                       return (NULL);
-               }
-
-               string2++;
-               string++;
-       }
-
-
-       return (string1);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    strtoul
- *
- * PARAMETERS:  String          - Null terminated string
- *              Terminater      - Where a pointer to the terminating byte is returned
- *              Base            - Radix of the string
- *
- * RETURN:      Converted value
- *
- * DESCRIPTION: Convert a string into an unsigned value.
- *
- ******************************************************************************/
-
-NATIVE_UINT
-acpi_cm_strtoul (
-       const NATIVE_CHAR       *string,
-       NATIVE_CHAR             **terminator,
-       NATIVE_UINT             base)
-{
-       u32                     converted = 0;
-       u32                     index;
-       u32                     sign;
-       const NATIVE_CHAR       *string_start;
-       NATIVE_UINT             return_value = 0;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /*
-        * Save the value of the pointer to the buffer's first
-        * character, save the current errno value, and then
-        * skip over any white space in the buffer:
-        */
-       string_start = string;
-       while (IS_SPACE (*string) || *string == '\t') {
-               ++string;
-       }
-
-       /*
-        * The buffer may contain an optional plus or minus sign.
-        * If it does, then skip over it but remember what is was:
-        */
-       if (*string == '-') {
-               sign = NEGATIVE;
-               ++string;
-       }
-
-       else if (*string == '+') {
-               ++string;
-               sign = POSITIVE;
-       }
-
-       else {
-               sign = POSITIVE;
-       }
-
-       /*
-        * If the input parameter Base is zero, then we need to
-        * determine if it is octal, decimal, or hexadecimal:
-        */
-       if (base == 0) {
-               if (*string == '0') {
-                       if (acpi_cm_to_lower (*(++string)) == 'x') {
-                               base = 16;
-                               ++string;
-                       }
-
-                       else {
-                               base = 8;
-                       }
-               }
-
-               else {
-                       base = 10;
-               }
-       }
-
-       else if (base < 2 || base > 36) {
-               /*
-                * The specified Base parameter is not in the domain of
-                * this function:
-                */
-               goto done;
-       }
-
-       /*
-        * For octal and hexadecimal bases, skip over the leading
-        * 0 or 0x, if they are present.
-        */
-       if (base == 8 && *string == '0') {
-               string++;
-       }
-
-       if (base == 16 &&
-               *string == '0' &&
-               acpi_cm_to_lower (*(++string)) == 'x') {
-               string++;
-       }
-
-
-       /*
-        * Main loop: convert the string to an unsigned long:
-        */
-       while (*string) {
-               if (IS_DIGIT (*string)) {
-                       index = *string - '0';
-               }
-
-               else {
-                       index = acpi_cm_to_upper (*string);
-                       if (IS_UPPER (index)) {
-                               index = index - 'A' + 10;
-                       }
-
-                       else {
-                               goto done;
-                       }
-               }
-
-               if (index >= base) {
-                       goto done;
-               }
-
-               /*
-                * Check to see if value is out of range:
-                */
-
-               if (return_value > ((ACPI_UINT32_MAX - (u32) index) /
-                                  (u32) base)) {
-                       status = AE_ERROR;
-                       return_value = 0L;          /* reset */
-               }
-
-               else {
-                       return_value *= base;
-                       return_value += index;
-                       converted = 1;
-               }
-
-               ++string;
-       }
-
-done:
-       /*
-        * If appropriate, update the caller's pointer to the next
-        * unconverted character in the buffer.
-        */
-       if (terminator) {
-               if (converted == 0 && return_value == 0L && string != NULL) {
-                       *terminator = (NATIVE_CHAR *) string_start;
-               }
-
-               else {
-                       *terminator = (NATIVE_CHAR *) string;
-               }
-       }
-
-       if (status == AE_ERROR) {
-               return_value = ACPI_UINT32_MAX;
-       }
-
-       /*
-        * If a minus sign was present, then "the conversion is negated":
-        */
-       if (sign == NEGATIVE) {
-               return_value = (ACPI_UINT32_MAX - return_value) + 1;
-       }
-
-       return (return_value);
-}
-
-#endif /* ACPI_USE_SYSTEM_CLIBRARY */
-
diff --git a/reactos/drivers/bus/acpi/utils/cmcopy.c b/reactos/drivers/bus/acpi/utils/cmcopy.c
deleted file mode 100644 (file)
index f09c35c..0000000
+++ /dev/null
@@ -1,704 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cmcopy - Internal to external object translation utilities
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cmcopy")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_copy_isimple_to_esimple
- *
- * PARAMETERS:  *Internal_object    - Pointer to the object we are examining
- *              *Buffer             - Where the object is returned
- *              *Space_used         - Where the data length is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to place a simple object in a user
- *              buffer.
- *
- *              The buffer is assumed to have sufficient space for the object.
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_cm_copy_isimple_to_esimple (
-       ACPI_OPERAND_OBJECT     *internal_object,
-       ACPI_OBJECT             *external_object,
-       u8                      *data_space,
-       u32                     *buffer_space_used)
-{
-       u32                     length = 0;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /*
-        * Check for NULL object case (could be an uninitialized
-        * package element
-        */
-
-       if (!internal_object) {
-               *buffer_space_used = 0;
-               return (AE_OK);
-       }
-
-       /* Always clear the external object */
-
-       MEMSET (external_object, 0, sizeof (ACPI_OBJECT));
-
-       /*
-        * In general, the external object will be the same type as
-        * the internal object
-        */
-
-       external_object->type = internal_object->common.type;
-
-       /* However, only a limited number of external types are supported */
-
-       switch (internal_object->common.type) {
-
-       case ACPI_TYPE_STRING:
-
-               length = internal_object->string.length + 1;
-               external_object->string.length = internal_object->string.length;
-               external_object->string.pointer = (NATIVE_CHAR *) data_space;
-               MEMCPY ((void *) data_space, (void *) internal_object->string.pointer, length);
-               break;
-
-
-       case ACPI_TYPE_BUFFER:
-
-               length = internal_object->buffer.length;
-               external_object->buffer.length = internal_object->buffer.length;
-               external_object->buffer.pointer = data_space;
-               MEMCPY ((void *) data_space, (void *) internal_object->buffer.pointer, length);
-               break;
-
-
-       case ACPI_TYPE_INTEGER:
-
-               external_object->integer.value= internal_object->integer.value;
-               break;
-
-
-       case INTERNAL_TYPE_REFERENCE:
-
-               /*
-                * This is an object reference.  Attempt to dereference it.
-                */
-
-               switch (internal_object->reference.opcode) {
-               case AML_ZERO_OP:
-                       external_object->type = ACPI_TYPE_INTEGER;
-                       external_object->integer.value = 0;
-                       break;
-
-               case AML_ONE_OP:
-                       external_object->type = ACPI_TYPE_INTEGER;
-                       external_object->integer.value = 1;
-                       break;
-
-               case AML_ONES_OP:
-                       external_object->type = ACPI_TYPE_INTEGER;
-                       external_object->integer.value = ACPI_INTEGER_MAX;
-                       break;
-
-               case AML_NAMEPATH_OP:
-                       /*
-                        * This is a named reference, get the string.  We already know that
-                        * we have room for it, use max length
-                        */
-                       length = MAX_STRING_LENGTH;
-                       external_object->type = ACPI_TYPE_STRING;
-                       external_object->string.pointer = (NATIVE_CHAR *) data_space;
-                       status = acpi_ns_handle_to_pathname ((ACPI_HANDLE *) internal_object->reference.node,
-                                        &length, (char *) data_space);
-
-                       /* Converted (external) string length is returned from above */
-
-                       external_object->string.length = length;
-                       break;
-
-               default:
-                       /*
-                        * Use the object type of "Any" to indicate a reference
-                        * to object containing a handle to an ACPI named object.
-                        */
-                       external_object->type = ACPI_TYPE_ANY;
-                       external_object->reference.handle = internal_object->reference.node;
-                       break;
-               }
-               break;
-
-
-       case ACPI_TYPE_PROCESSOR:
-
-               external_object->processor.proc_id = internal_object->processor.proc_id;
-               external_object->processor.pblk_address = internal_object->processor.address;
-               external_object->processor.pblk_length = internal_object->processor.length;
-               break;
-
-
-       case ACPI_TYPE_POWER:
-
-               external_object->power_resource.system_level =
-                                  internal_object->power_resource.system_level;
-
-               external_object->power_resource.resource_order =
-                                  internal_object->power_resource.resource_order;
-               break;
-
-
-       default:
-               /*
-                * There is no corresponding external object type
-                */
-               return (AE_SUPPORT);
-               break;
-       }
-
-
-       *buffer_space_used = (u32) ROUND_UP_TO_NATIVE_WORD (length);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_copy_ielement_to_eelement
- *
- * PARAMETERS:  ACPI_PKG_CALLBACK
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Copy one package element to another package element
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_copy_ielement_to_eelement (
-       u8                      object_type,
-       ACPI_OPERAND_OBJECT     *source_object,
-       ACPI_GENERIC_STATE      *state,
-       void                    *context)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_PKG_INFO           *info = (ACPI_PKG_INFO *) context;
-       u32                     object_space;
-       u32                     this_index;
-       ACPI_OBJECT             *target_object;
-
-
-       this_index      = state->pkg.index;
-       target_object   = (ACPI_OBJECT *)
-                          &((ACPI_OBJECT *)(state->pkg.dest_object))->package.elements[this_index];
-
-
-       switch (object_type) {
-       case ACPI_COPY_TYPE_SIMPLE:
-
-               /*
-                * This is a simple or null object -- get the size
-                */
-
-               status = acpi_cm_copy_isimple_to_esimple (source_object,
-                                 target_object, info->free_space, &object_space);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               break;
-
-       case ACPI_COPY_TYPE_PACKAGE:
-
-               /*
-                * Build the package object
-                */
-               target_object->type             = ACPI_TYPE_PACKAGE;
-               target_object->package.count    = source_object->package.count;
-               target_object->package.elements = (ACPI_OBJECT *) info->free_space;
-
-               /*
-                * Pass the new package object back to the package walk routine
-                */
-               state->pkg.this_target_obj = target_object;
-
-               /*
-                * Save space for the array of objects (Package elements)
-                * update the buffer length counter
-                */
-               object_space = (u32) ROUND_UP_TO_NATIVE_WORD (
-                                  target_object->package.count * sizeof (ACPI_OBJECT));
-               break;
-
-       default:
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       info->free_space  += object_space;
-       info->length      += object_space;
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_copy_ipackage_to_epackage
- *
- * PARAMETERS:  *Internal_object    - Pointer to the object we are returning
- *              *Buffer             - Where the object is returned
- *              *Space_used         - Where the object length is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to place a package object in a user
- *              buffer.  A package object by definition contains other objects.
- *
- *              The buffer is assumed to have sufficient space for the object.
- *              The caller must have verified the buffer length needed using the
- *              Acpi_cm_get_object_size function before calling this function.
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_cm_copy_ipackage_to_epackage (
-       ACPI_OPERAND_OBJECT     *internal_object,
-       u8                      *buffer,
-       u32                     *space_used)
-{
-       ACPI_OBJECT             *external_object;
-       ACPI_STATUS             status;
-       ACPI_PKG_INFO           info;
-
-
-       /*
-        * First package at head of the buffer
-        */
-       external_object = (ACPI_OBJECT *) buffer;
-
-       /*
-        * Free space begins right after the first package
-        */
-       info.length      = 0;
-       info.object_space = 0;
-       info.num_packages = 1;
-       info.free_space  = buffer + ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));
-
-
-       external_object->type              = internal_object->common.type;
-       external_object->package.count     = internal_object->package.count;
-       external_object->package.elements  = (ACPI_OBJECT *) info.free_space;
-
-
-       /*
-        * Build an array of ACPI_OBJECTS in the buffer
-        * and move the free space past it
-        */
-
-       info.free_space += external_object->package.count *
-                         ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));
-
-
-       status = acpi_cm_walk_package_tree (internal_object, external_object,
-                        acpi_cm_copy_ielement_to_eelement, &info);
-
-       *space_used = info.length;
-
-       return (status);
-
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_copy_iobject_to_eobject
- *
- * PARAMETERS:  *Internal_object    - The internal object to be converted
- *              *Buffer_ptr         - Where the object is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to build an API object to be returned to
- *              the caller.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_copy_iobject_to_eobject (
-       ACPI_OPERAND_OBJECT     *internal_object,
-       ACPI_BUFFER             *ret_buffer)
-{
-       ACPI_STATUS             status;
-
-
-       if (IS_THIS_OBJECT_TYPE (internal_object, ACPI_TYPE_PACKAGE)) {
-               /*
-                * Package object:  Copy all subobjects (including
-                * nested packages)
-                */
-               status = acpi_cm_copy_ipackage_to_epackage (internal_object,
-                                 ret_buffer->pointer, &ret_buffer->length);
-       }
-
-       else {
-               /*
-                * Build a simple object (no nested objects)
-                */
-               status = acpi_cm_copy_isimple_to_esimple (internal_object,
-                                 (ACPI_OBJECT *) ret_buffer->pointer,
-                                 ((u8 *) ret_buffer->pointer +
-                                 ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT))),
-                                 &ret_buffer->length);
-               /*
-                * build simple does not include the object size in the length
-                * so we add it in here
-                */
-               ret_buffer->length += sizeof (ACPI_OBJECT);
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_copy_esimple_to_isimple
- *
- * PARAMETERS:  *External_object   - The external object to be converted
- *              *Internal_object   - Where the internal object is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function copies an external object to an internal one.
- *              NOTE: Pointers can be copied, we don't need to copy data.
- *              (The pointers have to be valid in our address space no matter
- *              what we do with them!)
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_copy_esimple_to_isimple (
-       ACPI_OBJECT             *external_object,
-       ACPI_OPERAND_OBJECT     *internal_object)
-{
-
-
-       internal_object->common.type = (u8) external_object->type;
-
-       switch (external_object->type) {
-
-       case ACPI_TYPE_STRING:
-
-               internal_object->string.length = external_object->string.length;
-               internal_object->string.pointer = external_object->string.pointer;
-               break;
-
-
-       case ACPI_TYPE_BUFFER:
-
-               internal_object->buffer.length = external_object->buffer.length;
-               internal_object->buffer.pointer = external_object->buffer.pointer;
-               break;
-
-
-       case ACPI_TYPE_INTEGER:
-               /*
-                * Number is included in the object itself
-                */
-               internal_object->integer.value  = external_object->integer.value;
-               break;
-
-
-       default:
-               return (AE_CTRL_RETURN_VALUE);
-               break;
-       }
-
-
-       return (AE_OK);
-}
-
-
-#ifdef ACPI_FUTURE_IMPLEMENTATION
-
-/* Code to convert packages that are parameters to control methods */
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_copy_epackage_to_ipackage
- *
- * PARAMETERS:  *Internal_object   - Pointer to the object we are returning
- *              *Buffer         - Where the object is returned
- *              *Space_used     - Where the length of the object is returned
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to place a package object in a user
- *              buffer.  A package object by definition contains other objects.
- *
- *              The buffer is assumed to have sufficient space for the object.
- *              The caller must have verified the buffer length needed using the
- *              Acpi_cm_get_object_size function before calling this function.
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_cm_copy_epackage_to_ipackage (
-       ACPI_OPERAND_OBJECT     *internal_object,
-       u8                      *buffer,
-       u32                     *space_used)
-{
-       u8                      *free_space;
-       ACPI_OBJECT             *external_object;
-       u32                     length = 0;
-       u32                     this_index;
-       u32                     object_space = 0;
-       ACPI_OPERAND_OBJECT     *this_internal_obj;
-       ACPI_OBJECT             *this_external_obj;
-
-
-       /*
-        * First package at head of the buffer
-        */
-       external_object = (ACPI_OBJECT *)buffer;
-
-       /*
-        * Free space begins right after the first package
-        */
-       free_space = buffer + sizeof(ACPI_OBJECT);
-
-
-       external_object->type              = internal_object->common.type;
-       external_object->package.count     = internal_object->package.count;
-       external_object->package.elements  = (ACPI_OBJECT *)free_space;
-
-
-       /*
-        * Build an array of ACPI_OBJECTS in the buffer
-        * and move the free space past it
-        */
-
-       free_space += external_object->package.count * sizeof(ACPI_OBJECT);
-
-
-       /* Call Walk_package */
-
-}
-
-#endif /* Future implementation */
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_copy_eobject_to_iobject
- *
- * PARAMETERS:  *Internal_object   - The external object to be converted
- *              *Buffer_ptr     - Where the internal object is returned
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: Converts an external object to an internal object.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_copy_eobject_to_iobject (
-       ACPI_OBJECT             *external_object,
-       ACPI_OPERAND_OBJECT     *internal_object)
-{
-       ACPI_STATUS             status;
-
-
-       if (external_object->type == ACPI_TYPE_PACKAGE) {
-               /*
-                * Package objects contain other objects (which can be objects)
-                * buildpackage does it all
-                *
-                * TBD: Package conversion must be completed and tested
-                * NOTE: this code converts packages as input parameters to
-                * control methods only.  This is a very, very rare case.
-                */
-/*
-               Status = Acpi_cm_copy_epackage_to_ipackage(Internal_object,
-                                Ret_buffer->Pointer,
-                                &Ret_buffer->Length);
-*/
-               return (AE_NOT_IMPLEMENTED);
-       }
-
-       else {
-               /*
-                * Build a simple object (no nested objects)
-                */
-               status = acpi_cm_copy_esimple_to_isimple (external_object, internal_object);
-               /*
-                * build simple does not include the object size in the length
-                * so we add it in here
-                */
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_copy_ielement_to_ielement
- *
- * PARAMETERS:  ACPI_PKG_CALLBACK
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: Copy one package element to another package element
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_copy_ielement_to_ielement (
-       u8                      object_type,
-       ACPI_OPERAND_OBJECT     *source_object,
-       ACPI_GENERIC_STATE      *state,
-       void                    *context)
-{
-       ACPI_STATUS             status = AE_OK;
-       u32                     this_index;
-       ACPI_OPERAND_OBJECT     **this_target_ptr;
-       ACPI_OPERAND_OBJECT     *target_object;
-
-
-       this_index    = state->pkg.index;
-       this_target_ptr = (ACPI_OPERAND_OBJECT **)
-                          &state->pkg.dest_object->package.elements[this_index];
-
-       switch (object_type) {
-       case 0:
-
-               /*
-                * This is a simple object, just copy it
-                */
-               target_object = acpi_cm_create_internal_object (source_object->common.type);
-               if (!target_object) {
-                       return (AE_NO_MEMORY);
-               }
-
-               status = acpi_aml_store_object_to_object (source_object, target_object,
-                                 (ACPI_WALK_STATE *) context);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               *this_target_ptr = target_object;
-               break;
-
-
-       case 1:
-               /*
-                * This object is a package - go down another nesting level
-                * Create and build the package object
-                */
-               target_object = acpi_cm_create_internal_object (ACPI_TYPE_PACKAGE);
-               if (!target_object) {
-                       /* TBD: must delete package created up to this point */
-
-                       return (AE_NO_MEMORY);
-               }
-
-               target_object->package.count = source_object->package.count;
-
-               /*
-                * Pass the new package object back to the package walk routine
-                */
-               state->pkg.this_target_obj = target_object;
-
-               /*
-                * Store the object pointer in the parent package object
-                */
-               *this_target_ptr = target_object;
-               break;
-
-       default:
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_copy_ipackage_to_ipackage
- *
- * PARAMETERS:  *Source_obj     - Pointer to the source package object
- *              *Dest_obj       - Where the internal object is returned
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to copy an internal package object
- *              into another internal package object.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_copy_ipackage_to_ipackage (
-       ACPI_OPERAND_OBJECT     *source_obj,
-       ACPI_OPERAND_OBJECT     *dest_obj,
-       ACPI_WALK_STATE         *walk_state)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       dest_obj->common.type   = source_obj->common.type;
-       dest_obj->package.count = source_obj->package.count;
-
-
-       /*
-        * Create the object array and walk the source package tree
-        */
-
-       dest_obj->package.elements = acpi_cm_callocate ((source_obj->package.count + 1) *
-                        sizeof (void *));
-       dest_obj->package.next_element = dest_obj->package.elements;
-
-       if (!dest_obj->package.elements) {
-               REPORT_ERROR (
-                       ("Aml_build_copy_internal_package_object: Package allocation failure\n"));
-               return (AE_NO_MEMORY);
-       }
-
-
-       status = acpi_cm_walk_package_tree (source_obj, dest_obj,
-                        acpi_cm_copy_ielement_to_ielement, walk_state);
-
-       return (status);
-}
-
diff --git a/reactos/drivers/bus/acpi/utils/cmdebug.c b/reactos/drivers/bus/acpi/utils/cmdebug.c
deleted file mode 100644 (file)
index afcb0ec..0000000
+++ /dev/null
@@ -1,555 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cmdebug - Debug print routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cmdebug")
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Get/Set debug level
- *
- * DESCRIPTION: Get or set value of the debug flag
- *
- *              These are used to allow user's to get/set the debug level
- *
- ****************************************************************************/
-
-
-u32
-get_debug_level (void)
-{
-
-       return (acpi_dbg_level);
-}
-
-void
-set_debug_level (
-       u32                     new_debug_level)
-{
-
-       acpi_dbg_level = new_debug_level;
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Function_trace
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Function_name       - Name of Caller's function
- *
- * RETURN:      None
- *
- * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
- *              set in Debug_level
- *
- ****************************************************************************/
-
-void
-function_trace (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name)
-{
-
-       acpi_gbl_nesting_level++;
-
-       debug_print (module_name, line_number, component_id,
-                        TRACE_FUNCTIONS,
-                        " %2.2ld Entered Function: %s\n",
-                        acpi_gbl_nesting_level, function_name);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Function_trace_ptr
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Function_name       - Name of Caller's function
- *              Pointer             - Pointer to display
- *
- * RETURN:      None
- *
- * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
- *              set in Debug_level
- *
- ****************************************************************************/
-
-void
-function_trace_ptr (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       void                    *pointer)
-{
-
-       acpi_gbl_nesting_level++;
-       debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS,
-                        " %2.2ld Entered Function: %s, %p\n",
-                        acpi_gbl_nesting_level, function_name, pointer);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Function_trace_str
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Function_name       - Name of Caller's function
- *              String              - Additional string to display
- *
- * RETURN:      None
- *
- * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
- *              set in Debug_level
- *
- ****************************************************************************/
-
-void
-function_trace_str (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       NATIVE_CHAR             *string)
-{
-
-       acpi_gbl_nesting_level++;
-       debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS,
-                        " %2.2ld Entered Function: %s, %s\n",
-                        acpi_gbl_nesting_level, function_name, string);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Function_trace_u32
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Function_name       - Name of Caller's function
- *              Integer             - Integer to display
- *
- * RETURN:      None
- *
- * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
- *              set in Debug_level
- *
- ****************************************************************************/
-
-void
-function_trace_u32 (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       u32                     integer)
-{
-
-       acpi_gbl_nesting_level++;
-       debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS,
-                        " %2.2ld Entered Function: %s, %lX\n",
-                        acpi_gbl_nesting_level, function_name, integer);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Function_exit
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Function_name       - Name of Caller's function
- *
- * RETURN:      None
- *
- * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
- *              set in Debug_level
- *
- ****************************************************************************/
-
-void
-function_exit (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name)
-{
-
-       debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS,
-                        " %2.2ld Exiting Function: %s\n",
-                        acpi_gbl_nesting_level, function_name);
-
-       acpi_gbl_nesting_level--;
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Function_status_exit
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Function_name       - Name of Caller's function
- *              Status              - Exit status code
- *
- * RETURN:      None
- *
- * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
- *              set in Debug_level. Prints exit status also.
- *
- ****************************************************************************/
-
-void
-function_status_exit (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       ACPI_STATUS             status)
-{
-
-       debug_print (module_name, line_number, component_id,
-               TRACE_FUNCTIONS,
-               " %2.2ld Exiting Function: %s, %s\n",
-               acpi_gbl_nesting_level,
-               function_name,
-               acpi_cm_format_exception (status));
-
-       acpi_gbl_nesting_level--;
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Function_value_exit
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Function_name       - Name of Caller's function
- *              Value               - Value to be printed with exit msg
- *
- * RETURN:      None
- *
- * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
- *              set in Debug_level. Prints exit value also.
- *
- ****************************************************************************/
-
-void
-function_value_exit (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       ACPI_INTEGER            value)
-{
-
-       debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS,
-                        " %2.2ld Exiting Function: %s, %X\n",
-                        acpi_gbl_nesting_level, function_name, value);
-
-       acpi_gbl_nesting_level--;
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Function_ptr_exit
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Function_name       - Name of Caller's function
- *              Value               - Value to be printed with exit msg
- *
- * RETURN:      None
- *
- * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
- *              set in Debug_level. Prints exit value also.
- *
- ****************************************************************************/
-
-void
-function_ptr_exit (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       NATIVE_CHAR             *function_name,
-       u8                      *ptr)
-{
-
-       debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS,
-                        " %2.2ld Exiting Function: %s, %p\n",
-                        acpi_gbl_nesting_level, function_name, ptr);
-
-       acpi_gbl_nesting_level--;
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Debug_print
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Print_level         - Requested debug print level
- *              Format              - Printf format field
- *              ...                 - Optional printf arguments
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print error message with prefix consisting of the module name,
- *              line number, and component ID.
- *
- ****************************************************************************/
-
-void
-debug_print (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       u32                     print_level,
-       NATIVE_CHAR             *format,
-       ...)
-{
-       va_list                 args;
-
-
-       /* Both the level and the component must be enabled */
-
-       if ((print_level & acpi_dbg_level) &&
-               (component_id & acpi_dbg_layer)) {
-               va_start (args, format);
-
-               acpi_os_printf ("%8s-%04d: ", module_name, line_number);
-               acpi_os_vprintf (format, args);
-       }
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Debug_print_prefix
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print the prefix part of an error message, consisting of the
- *              module name, and line number
- *
- ****************************************************************************/
-
-void
-debug_print_prefix (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number)
-{
-
-
-       acpi_os_printf ("%8s-%04d: ", module_name, line_number);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Debug_print_raw
- *
- * PARAMETERS:  Format              - Printf format field
- *              ...                 - Optional printf arguments
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print error message -- without module/line indentifiers
- *
- ****************************************************************************/
-
-void
-debug_print_raw (
-       NATIVE_CHAR             *format,
-       ...)
-{
-       va_list                 args;
-
-
-       va_start (args, format);
-
-       acpi_os_vprintf (format, args);
-
-       va_end (args);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_cm_dump_buffer
- *
- * PARAMETERS:  Buffer              - Buffer to dump
- *              Count               - Amount to dump, in bytes
- *              Component_iD        - Caller's component ID
- *
- * RETURN:      None
- *
- * DESCRIPTION: Generic dump buffer in both hex and ascii.
- *
- ****************************************************************************/
-
-void
-acpi_cm_dump_buffer (
-       u8                      *buffer,
-       u32                     count,
-       u32                     display,
-       u32                     component_id)
-{
-       u32                     i = 0;
-       u32                     j;
-       u32                     temp32;
-       u8                      buf_char;
-
-
-       /* Only dump the buffer if tracing is enabled */
-
-       if (!((TRACE_TABLES & acpi_dbg_level) &&
-               (component_id & acpi_dbg_layer))) {
-               return;
-       }
-
-
-       /*
-        * Nasty little dump buffer routine!
-        */
-       while (i < count) {
-               /* Print current offset */
-
-               acpi_os_printf ("%05X  ", i);
-
-
-               /* Print 16 hex chars */
-
-               for (j = 0; j < 16;) {
-                       if (i + j >= count) {
-                               acpi_os_printf ("\n");
-                               return;
-                       }
-
-                       /* Make sure that the s8 doesn't get sign-extended! */
-
-                       switch (display) {
-                       /* Default is BYTE display */
-
-                       default:
-
-                               acpi_os_printf ("%02X ",
-                                               *((u8 *) &buffer[i + j]));
-                               j += 1;
-                               break;
-
-
-                       case DB_WORD_DISPLAY:
-
-                               MOVE_UNALIGNED16_TO_32 (&temp32,
-                                                &buffer[i + j]);
-                               acpi_os_printf ("%04X ", temp32);
-                               j += 2;
-                               break;
-
-
-                       case DB_DWORD_DISPLAY:
-
-                               MOVE_UNALIGNED32_TO_32 (&temp32,
-                                                &buffer[i + j]);
-                               acpi_os_printf ("%08X ", temp32);
-                               j += 4;
-                               break;
-
-
-                       case DB_QWORD_DISPLAY:
-
-                               MOVE_UNALIGNED32_TO_32 (&temp32,
-                                                &buffer[i + j]);
-                               acpi_os_printf ("%08X", temp32);
-
-                               MOVE_UNALIGNED32_TO_32 (&temp32,
-                                                &buffer[i + j + 4]);
-                               acpi_os_printf ("%08X ", temp32);
-                               j += 8;
-                               break;
-                       }
-               }
-
-
-               /*
-                * Print the ASCII equivalent characters
-                * But watch out for the bad unprintable ones...
-                */
-
-               for (j = 0; j < 16; j++) {
-                       if (i + j >= count) {
-                               acpi_os_printf ("\n");
-                               return;
-                       }
-
-                       buf_char = buffer[i + j];
-                       if ((buf_char > 0x1F && buf_char < 0x2E) ||
-                               (buf_char > 0x2F && buf_char < 0x61) ||
-                               (buf_char > 0x60 && buf_char < 0x7F)) {
-                               acpi_os_printf ("%c", buf_char);
-                       }
-                       else {
-                               acpi_os_printf (".");
-                       }
-               }
-
-               /* Done with that line. */
-
-               acpi_os_printf ("\n");
-               i += 16;
-       }
-
-       return;
-}
-
-
diff --git a/reactos/drivers/bus/acpi/utils/cmdelete.c b/reactos/drivers/bus/acpi/utils/cmdelete.c
deleted file mode 100644 (file)
index a0fc962..0000000
+++ /dev/null
@@ -1,585 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: cmdelete - object deletion and reference count utilities
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cmdelete")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_delete_internal_obj
- *
- * PARAMETERS:  *Object        - Pointer to the list to be deleted
- *
- * RETURN:      None
- *
- * DESCRIPTION: Low level object deletion, after reference counts have been
- *              updated (All reference counts, including sub-objects!)
- *
- ******************************************************************************/
-
-void
-acpi_cm_delete_internal_obj (
-       ACPI_OPERAND_OBJECT     *object)
-{
-       void                    *obj_pointer = NULL;
-       ACPI_OPERAND_OBJECT     *handler_desc;
-
-
-       if (!object) {
-               return;
-       }
-
-       /*
-        * Must delete or free any pointers within the object that are not
-        * actual ACPI objects (for example, a raw buffer pointer).
-        */
-
-       switch (object->common.type) {
-
-       case ACPI_TYPE_STRING:
-
-               /* Free the actual string buffer */
-
-               obj_pointer = object->string.pointer;
-               break;
-
-
-       case ACPI_TYPE_BUFFER:
-
-               /* Free the actual buffer */
-
-               obj_pointer = object->buffer.pointer;
-               break;
-
-
-       case ACPI_TYPE_PACKAGE:
-
-               /*
-                * Elements of the package are not handled here, they are deleted
-                * separately
-                */
-
-               /* Free the (variable length) element pointer array */
-
-               obj_pointer = object->package.elements;
-               break;
-
-
-       case ACPI_TYPE_MUTEX:
-
-               acpi_aml_unlink_mutex (object);
-               acpi_os_delete_semaphore (object->mutex.semaphore);
-               break;
-
-
-       case ACPI_TYPE_EVENT:
-
-               acpi_os_delete_semaphore (object->event.semaphore);
-               object->event.semaphore = NULL;
-               break;
-
-
-       case ACPI_TYPE_METHOD:
-
-               /* Delete the method semaphore if it exists */
-
-               if (object->method.semaphore) {
-                       acpi_os_delete_semaphore (object->method.semaphore);
-                       object->method.semaphore = NULL;
-               }
-
-               break;
-
-
-       case ACPI_TYPE_REGION:
-
-
-               if (object->region.extra) {
-                       /*
-                        * Free the Region_context if and only if the handler is one of the
-                        * default handlers -- and therefore, we created the context object
-                        * locally, it was not created by an external caller.
-                        */
-                       handler_desc = object->region.addr_handler;
-                       if ((handler_desc) &&
-                               (handler_desc->addr_handler.hflags == ADDR_HANDLER_DEFAULT_INSTALLED)) {
-                               obj_pointer = object->region.extra->extra.region_context;
-                       }
-
-                       /* Now we can free the Extra object */
-
-                       acpi_cm_delete_object_desc (object->region.extra);
-               }
-               break;
-
-
-       case ACPI_TYPE_FIELD_UNIT:
-
-               if (object->field_unit.extra) {
-                       acpi_cm_delete_object_desc (object->field_unit.extra);
-               }
-               break;
-
-       default:
-               break;
-       }
-
-
-       /*
-        * Delete any allocated memory found above
-        */
-
-       if (obj_pointer) {
-               if (!acpi_tb_system_table_pointer (obj_pointer)) {
-                       acpi_cm_free (obj_pointer);
-               }
-       }
-
-
-       /* Only delete the object if it was dynamically allocated */
-
-
-       if (!(object->common.flags & AOPOBJ_STATIC_ALLOCATION)) {
-               acpi_cm_delete_object_desc (object);
-
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_delete_internal_object_list
- *
- * PARAMETERS:  *Obj_list       - Pointer to the list to be deleted
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function deletes an internal object list, including both
- *              simple objects and package objects
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_delete_internal_object_list (
-       ACPI_OPERAND_OBJECT     **obj_list)
-{
-       ACPI_OPERAND_OBJECT     **internal_obj;
-
-
-       /* Walk the null-terminated internal list */
-
-       for (internal_obj = obj_list; *internal_obj; internal_obj++) {
-               /*
-                * Check for a package
-                * Simple objects are simply stored in the array and do not
-                * need to be deleted separately.
-                */
-
-               if (IS_THIS_OBJECT_TYPE ((*internal_obj), ACPI_TYPE_PACKAGE)) {
-                       /* Delete the package */
-
-                       /*
-                        * TBD: [Investigate] This might not be the right thing to do,
-                        * depending on how the internal package object was allocated!!!
-                        */
-                       acpi_cm_delete_internal_obj (*internal_obj);
-               }
-
-       }
-
-       /* Free the combined parameter pointer list and object array */
-
-       acpi_cm_free (obj_list);
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_update_ref_count
- *
- * PARAMETERS:  *Object         - Object whose ref count is to be updated
- *              Action          - What to do
- *
- * RETURN:      New ref count
- *
- * DESCRIPTION: Modify the ref count and return it.
- *
- ******************************************************************************/
-
-static void
-acpi_cm_update_ref_count (
-       ACPI_OPERAND_OBJECT     *object,
-       u32                     action)
-{
-       u16                     count;
-       u16                     new_count;
-
-
-       if (!object) {
-               return;
-       }
-
-
-       count = object->common.reference_count;
-       new_count = count;
-
-       /*
-        * Reference count action (increment, decrement, or force delete)
-        */
-
-       switch (action) {
-
-       case REF_INCREMENT:
-
-               new_count++;
-               object->common.reference_count = new_count;
-
-               break;
-
-
-       case REF_DECREMENT:
-
-               if (count < 1) {
-                       new_count = 0;
-               }
-
-               else {
-                       new_count--;
-
-               }
-
-
-               object->common.reference_count = new_count;
-               if (new_count == 0) {
-                       acpi_cm_delete_internal_obj (object);
-               }
-
-               break;
-
-
-       case REF_FORCE_DELETE:
-
-               new_count = 0;
-               object->common.reference_count = new_count;
-               acpi_cm_delete_internal_obj (object);
-               break;
-
-
-       default:
-
-               break;
-       }
-
-
-       /*
-        * Sanity check the reference count, for debug purposes only.
-        * (A deleted object will have a huge reference count)
-        */
-
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_update_object_reference
- *
- * PARAMETERS:  *Object             - Increment ref count for this object
- *                                    and all sub-objects
- *              Action              - Either REF_INCREMENT or REF_DECREMENT or
- *                                    REF_FORCE_DELETE
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Increment the object reference count
- *
- * Object references are incremented when:
- * 1) An object is attached to a Node (namespace object)
- * 2) An object is copied (all subobjects must be incremented)
- *
- * Object references are decremented when:
- * 1) An object is detached from an Node
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_update_object_reference (
-       ACPI_OPERAND_OBJECT     *object,
-       u16                     action)
-{
-       ACPI_STATUS             status;
-       u32                     i;
-       ACPI_OPERAND_OBJECT     *next;
-       ACPI_OPERAND_OBJECT     *new;
-       ACPI_GENERIC_STATE       *state_list = NULL;
-       ACPI_GENERIC_STATE       *state;
-
-
-       /* Ignore a null object ptr */
-
-       if (!object) {
-               return (AE_OK);
-       }
-
-
-       /*
-        * Make sure that this isn't a namespace handle or an AML pointer
-        */
-
-       if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED)) {
-               return (AE_OK);
-       }
-
-       if (acpi_tb_system_table_pointer (object)) {
-               return (AE_OK);
-       }
-
-
-       state = acpi_cm_create_update_state (object, action);
-
-       while (state) {
-
-               object = state->update.object;
-               action = state->update.value;
-               acpi_cm_delete_generic_state (state);
-
-               /*
-                * All sub-objects must have their reference count incremented also.
-                * Different object types have different subobjects.
-                */
-               switch (object->common.type) {
-
-               case ACPI_TYPE_DEVICE:
-
-                       status = acpi_cm_create_update_state_and_push (object->device.addr_handler,
-                                          action, &state_list);
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       acpi_cm_update_ref_count (object->device.sys_handler, action);
-                       acpi_cm_update_ref_count (object->device.drv_handler, action);
-                       break;
-
-
-               case INTERNAL_TYPE_ADDRESS_HANDLER:
-
-                       /* Must walk list of address handlers */
-
-                       next = object->addr_handler.next;
-                       while (next) {
-                               new = next->addr_handler.next;
-                               acpi_cm_update_ref_count (next, action);
-
-                               next = new;
-                       }
-                       break;
-
-
-               case ACPI_TYPE_PACKAGE:
-
-                       /*
-                        * We must update all the sub-objects of the package
-                        * (Each of whom may have their own sub-objects, etc.
-                        */
-                       for (i = 0; i < object->package.count; i++) {
-                               /*
-                                * Push each element onto the stack for later processing.
-                                * Note: There can be null elements within the package,
-                                * these are simply ignored
-                                */
-
-                               status = acpi_cm_create_update_state_and_push (
-                                                object->package.elements[i], action, &state_list);
-                               if (ACPI_FAILURE (status)) {
-                                       return (status);
-                               }
-                       }
-                       break;
-
-
-               case ACPI_TYPE_FIELD_UNIT:
-
-                       status = acpi_cm_create_update_state_and_push (
-                                        object->field_unit.container, action, &state_list);
-
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-                       break;
-
-
-               case INTERNAL_TYPE_DEF_FIELD:
-
-                       status = acpi_cm_create_update_state_and_push (
-                                        object->field.container, action, &state_list);
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-                  break;
-
-
-               case INTERNAL_TYPE_BANK_FIELD:
-
-                       status = acpi_cm_create_update_state_and_push (
-                                        object->bank_field.bank_select, action, &state_list);
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-
-                       status = acpi_cm_create_update_state_and_push (
-                                        object->bank_field.container, action, &state_list);
-                       if (ACPI_FAILURE (status)) {
-                               return (status);
-                       }
-                       break;
-
-
-               case ACPI_TYPE_REGION:
-
-       /* TBD: [Investigate]
-                       Acpi_cm_update_ref_count (Object->Region.Addr_handler, Action);
-       */
-/*
-                       Status =
-                               Acpi_cm_create_update_state_and_push (Object->Region.Addr_handler,
-                                                  Action, &State_list);
-                       if (ACPI_FAILURE (Status))
-                       {
-                               return (Status);
-                       }
-*/
-                       break;
-
-
-               case INTERNAL_TYPE_REFERENCE:
-
-                       break;
-               }
-
-
-               /*
-                * Now we can update the count in the main object.  This can only
-                * happen after we update the sub-objects in case this causes the
-                * main object to be deleted.
-                */
-
-               acpi_cm_update_ref_count (object, action);
-
-
-               /* Move on to the next object to be updated */
-
-               state = acpi_cm_pop_generic_state (&state_list);
-       }
-
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_add_reference
- *
- * PARAMETERS:  *Object        - Object whose reference count is to be
- *                                  incremented
- *
- * RETURN:      None
- *
- * DESCRIPTION: Add one reference to an ACPI object
- *
- ******************************************************************************/
-
-void
-acpi_cm_add_reference (
-       ACPI_OPERAND_OBJECT     *object)
-{
-
-
-       /*
-        * Ensure that we have a valid object
-        */
-
-       if (!acpi_cm_valid_internal_object (object)) {
-               return;
-       }
-
-       /*
-        * We have a valid ACPI internal object, now increment the reference count
-        */
-
-       acpi_cm_update_object_reference (object, REF_INCREMENT);
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_remove_reference
- *
- * PARAMETERS:  *Object        - Object whose ref count will be decremented
- *
- * RETURN:      None
- *
- * DESCRIPTION: Decrement the reference count of an ACPI internal object
- *
- ******************************************************************************/
-
-void
-acpi_cm_remove_reference (
-       ACPI_OPERAND_OBJECT     *object)
-{
-
-
-       /*
-        * Ensure that we have a valid object
-        */
-
-       if (!acpi_cm_valid_internal_object (object)) {
-               return;
-       }
-
-       /*
-        * Decrement the reference count, and only actually delete the object
-        * if the reference count becomes 0.  (Must also decrement the ref count
-        * of all subobjects!)
-        */
-
-       acpi_cm_update_object_reference (object, REF_DECREMENT);
-
-       return;
-}
-
-
diff --git a/reactos/drivers/bus/acpi/utils/cmeval.c b/reactos/drivers/bus/acpi/utils/cmeval.c
deleted file mode 100644 (file)
index 0ad0406..0000000
+++ /dev/null
@@ -1,303 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cmeval - Object evaluation
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cmeval")
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_cm_evaluate_numeric_object
- *
- * PARAMETERS:  *Object_name        - Object name to be evaluated
- *              Device_node         - Node for the device
- *              *Address            - Where the value is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: evaluates a numeric namespace object for a selected device
- *              and stores results in *Address.
- *
- *              NOTE: Internal function, no parameter validation
- *
- ***************************************************************************/
-
-ACPI_STATUS
-acpi_cm_evaluate_numeric_object (
-       NATIVE_CHAR             *object_name,
-       ACPI_NAMESPACE_NODE     *device_node,
-       ACPI_INTEGER            *address)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status;
-
-
-       /* Execute the method */
-
-       status = acpi_ns_evaluate_relative (device_node, object_name, NULL, &obj_desc);
-       if (ACPI_FAILURE (status)) {
-
-               return (status);
-       }
-
-
-       /* Did we get a return object? */
-
-       if (!obj_desc) {
-               return (AE_TYPE);
-       }
-
-       /* Is the return object of the correct type? */
-
-       if (obj_desc->common.type != ACPI_TYPE_INTEGER) {
-               status = AE_TYPE;
-       }
-       else {
-               /*
-                * Since the structure is a union, setting any field will set all
-                * of the variables in the union
-                */
-               *address = obj_desc->integer.value;
-       }
-
-       /* On exit, we must delete the return object */
-
-       acpi_cm_remove_reference (obj_desc);
-
-       return (status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_cm_execute_HID
- *
- * PARAMETERS:  Device_node         - Node for the device
- *              *Hid                - Where the HID is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Executes the _HID control method that returns the hardware
- *              ID of the device.
- *
- *              NOTE: Internal function, no parameter validation
- *
- ***************************************************************************/
-
-ACPI_STATUS
-acpi_cm_execute_HID (
-       ACPI_NAMESPACE_NODE     *device_node,
-       DEVICE_ID               *hid)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status;
-
-
-       /* Execute the method */
-
-       status = acpi_ns_evaluate_relative (device_node,
-                        METHOD_NAME__HID, NULL, &obj_desc);
-       if (ACPI_FAILURE (status)) {
-
-
-               return (status);
-       }
-
-       /* Did we get a return object? */
-
-       if (!obj_desc) {
-               return (AE_TYPE);
-       }
-
-       /*
-        *  A _HID can return either a Number (32 bit compressed EISA ID) or
-        *  a string
-        */
-
-       if ((obj_desc->common.type != ACPI_TYPE_INTEGER) &&
-               (obj_desc->common.type != ACPI_TYPE_STRING)) {
-               status = AE_TYPE;
-       }
-
-       else {
-               if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
-                       /* Convert the Numeric HID to string */
-
-                       acpi_aml_eisa_id_to_string ((u32) obj_desc->integer.value, hid->buffer);
-               }
-
-               else {
-                       /* Copy the String HID from the returned object */
-
-                       STRNCPY(hid->buffer, obj_desc->string.pointer, sizeof(hid->buffer));
-               }
-       }
-
-
-       /* On exit, we must delete the return object */
-
-       acpi_cm_remove_reference (obj_desc);
-
-       return (status);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_cm_execute_UID
- *
- * PARAMETERS:  Device_node         - Node for the device
- *              *Uid                - Where the UID is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Executes the _UID control method that returns the hardware
- *              ID of the device.
- *
- *              NOTE: Internal function, no parameter validation
- *
- ***************************************************************************/
-
-ACPI_STATUS
-acpi_cm_execute_UID (
-       ACPI_NAMESPACE_NODE     *device_node,
-       DEVICE_ID               *uid)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status;
-
-
-       /* Execute the method */
-
-       status = acpi_ns_evaluate_relative (device_node,
-                        METHOD_NAME__UID, NULL, &obj_desc);
-       if (ACPI_FAILURE (status)) {
-
-
-               return (status);
-       }
-
-       /* Did we get a return object? */
-
-       if (!obj_desc) {
-               return (AE_TYPE);
-       }
-
-       /*
-        *  A _UID can return either a Number (32 bit compressed EISA ID) or
-        *  a string
-        */
-
-       if ((obj_desc->common.type != ACPI_TYPE_INTEGER) &&
-               (obj_desc->common.type != ACPI_TYPE_STRING)) {
-               status = AE_TYPE;
-       }
-
-       else {
-               if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
-                       /* Convert the Numeric UID to string */
-
-                       acpi_aml_unsigned_integer_to_string (obj_desc->integer.value, uid->buffer);
-               }
-
-               else {
-                       /* Copy the String UID from the returned object */
-
-                       STRNCPY(uid->buffer, obj_desc->string.pointer, sizeof(uid->buffer));
-               }
-       }
-
-
-       /* On exit, we must delete the return object */
-
-       acpi_cm_remove_reference (obj_desc);
-
-       return (status);
-}
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_cm_execute_STA
- *
- * PARAMETERS:  Device_node         - Node for the device
- *              *Flags              - Where the status flags are returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Executes _STA for selected device and stores results in
- *              *Flags.
- *
- *              NOTE: Internal function, no parameter validation
- *
- ***************************************************************************/
-
-ACPI_STATUS
-acpi_cm_execute_STA (
-       ACPI_NAMESPACE_NODE     *device_node,
-       u32                     *flags)
-{
-       ACPI_OPERAND_OBJECT     *obj_desc;
-       ACPI_STATUS             status;
-
-
-       /* Execute the method */
-
-       status = acpi_ns_evaluate_relative (device_node,
-                        METHOD_NAME__STA, NULL, &obj_desc);
-       if (AE_NOT_FOUND == status) {
-               *flags = 0x0F;
-               status = AE_OK;
-       }
-
-
-       else /* success */ {
-               /* Did we get a return object? */
-
-               if (!obj_desc) {
-                       return (AE_TYPE);
-               }
-
-               /* Is the return object of the correct type? */
-
-               if (obj_desc->common.type != ACPI_TYPE_INTEGER) {
-                       status = AE_TYPE;
-               }
-
-               else {
-                       /* Extract the status flags */
-
-                       *flags = (u32) obj_desc->integer.value;
-               }
-
-               /* On exit, we must delete the return object */
-
-               acpi_cm_remove_reference (obj_desc);
-       }
-
-       return (status);
-}
diff --git a/reactos/drivers/bus/acpi/utils/cmglobal.c b/reactos/drivers/bus/acpi/utils/cmglobal.c
deleted file mode 100644 (file)
index a66677e..0000000
+++ /dev/null
@@ -1,568 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cmglobal - Global variables for the ACPI subsystem
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cmglobal")
-
-
-/******************************************************************************
- *
- * Static global variable initialization.
- *
- ******************************************************************************/
-
-/*
- * We want the debug switches statically initialized so they
- * are already set when the debugger is entered.
- */
-
-/* Debug switch - level and trace mask */
-
-u32                         acpi_dbg_level = NORMAL_DEFAULT;
-
-/* Debug switch - layer (component) mask */
-
-u32                         acpi_dbg_layer = ACPI_COMPONENT_DEFAULT;
-u32                         acpi_gbl_nesting_level = 0;
-
-
-/* Debugger globals */
-
-u8                          acpi_gbl_db_terminate_threads = FALSE;
-u8                          acpi_gbl_method_executing = FALSE;
-
-/* System flags */
-
-u32                         acpi_gbl_system_flags = 0;
-u32                         acpi_gbl_startup_flags = 0;
-
-/* System starts unitialized! */
-u8                          acpi_gbl_shutdown = TRUE;
-
-
-u8                          acpi_gbl_decode_to8bit [8] = {1,2,4,8,16,32,64,128};
-
-
-/******************************************************************************
- *
- * Namespace globals
- *
- ******************************************************************************/
-
-
-/*
- * Names built-in to the interpreter
- *
- * Initial values are currently supported only for types String and Number.
- * To avoid type punning, both are specified as strings in this table.
- *
- * NOTES:
- * 1) _SB_ is defined to be a device to allow _SB_/_INI to be run
- *    during the initialization sequence.
- */
-
-PREDEFINED_NAMES            acpi_gbl_pre_defined_names[] =
-{ {"_GPE",    INTERNAL_TYPE_DEF_ANY},
-       {"_PR_",    INTERNAL_TYPE_DEF_ANY},
-       {"_SB_",    ACPI_TYPE_DEVICE},
-       {"_SI_",    INTERNAL_TYPE_DEF_ANY},
-       {"_TZ_",    INTERNAL_TYPE_DEF_ANY},
-       {"_REV",    ACPI_TYPE_INTEGER, "2"},
-       {"_OS_",    ACPI_TYPE_STRING, ACPI_OS_NAME},
-       {"_GL_",    ACPI_TYPE_MUTEX, "0"},
-       {NULL,      ACPI_TYPE_ANY}           /* Table terminator */
-};
-
-
-/*
- * Properties of the ACPI Object Types, both internal and external.
- *
- * Elements of Acpi_ns_properties are bit significant
- * and the table is indexed by values of ACPI_OBJECT_TYPE
- */
-
-u8                          acpi_gbl_ns_properties[] =
-{
-       NSP_NORMAL,                 /* 00 Any              */
-       NSP_NORMAL,                 /* 01 Number           */
-       NSP_NORMAL,                 /* 02 String           */
-       NSP_NORMAL,                 /* 03 Buffer           */
-       NSP_LOCAL,                  /* 04 Package          */
-       NSP_NORMAL,                 /* 05 Field_unit       */
-       NSP_NEWSCOPE | NSP_LOCAL,   /* 06 Device           */
-       NSP_LOCAL,                  /* 07 Acpi_event       */
-       NSP_NEWSCOPE | NSP_LOCAL,   /* 08 Method           */
-       NSP_LOCAL,                  /* 09 Mutex            */
-       NSP_LOCAL,                  /* 10 Region           */
-       NSP_NEWSCOPE | NSP_LOCAL,   /* 11 Power            */
-       NSP_NEWSCOPE | NSP_LOCAL,   /* 12 Processor        */
-       NSP_NEWSCOPE | NSP_LOCAL,   /* 13 Thermal          */
-       NSP_NORMAL,                 /* 14 Buffer_field     */
-       NSP_NORMAL,                 /* 15 Ddb_handle       */
-       NSP_NORMAL,                 /* 16 Debug Object     */
-       NSP_NORMAL,                 /* 17 Def_field        */
-       NSP_NORMAL,                 /* 18 Bank_field       */
-       NSP_NORMAL,                 /* 19 Index_field      */
-       NSP_NORMAL,                 /* 20 Reference        */
-       NSP_NORMAL,                 /* 21 Alias            */
-       NSP_NORMAL,                 /* 22 Notify           */
-       NSP_NORMAL,                 /* 23 Address Handler  */
-       NSP_NEWSCOPE | NSP_LOCAL,   /* 24 Resource         */
-       NSP_NORMAL,                 /* 25 Def_field_defn   */
-       NSP_NORMAL,                 /* 26 Bank_field_defn  */
-       NSP_NORMAL,                 /* 27 Index_field_defn */
-       NSP_NORMAL,                 /* 28 If               */
-       NSP_NORMAL,                 /* 29 Else             */
-       NSP_NORMAL,                 /* 30 While            */
-       NSP_NEWSCOPE,               /* 31 Scope            */
-       NSP_LOCAL,                  /* 32 Def_any          */
-       NSP_NORMAL,                 /* 33 Extra            */
-       NSP_NORMAL                  /* 34 Invalid          */
-};
-
-
-/* Hex to ASCII conversion table */
-
-NATIVE_CHAR                 acpi_gbl_hex_to_ascii[] =
-                         {'0','1','2','3','4','5','6','7',
-                         '8','9','A','B','C','D','E','F'};
-
-
-/******************************************************************************
- *
- * Table globals
- *
- * NOTE: This table includes ONLY the ACPI tables that the subsystem consumes.
- * it is NOT an exhaustive list of all possible ACPI tables.  All ACPI tables
- * that are not used by the subsystem are simply ignored.
- *
- ******************************************************************************/
-
-
-ACPI_TABLE_DESC             acpi_gbl_acpi_tables[NUM_ACPI_TABLES];
-
-
-ACPI_TABLE_SUPPORT          acpi_gbl_acpi_table_data[NUM_ACPI_TABLES] =
-{
-       /***********    Name,    Signature,  Signature size,    How many allowed?,   Supported?  Global typed pointer */
-
-       /* RSDP 0 */ {RSDP_NAME, RSDP_SIG, sizeof (RSDP_SIG)-1, ACPI_TABLE_SINGLE,   AE_OK,      NULL},
-       /* DSDT 1 */ {DSDT_SIG,  DSDT_SIG, sizeof (DSDT_SIG)-1, ACPI_TABLE_SINGLE,   AE_OK,      (void **) &acpi_gbl_DSDT},
-       /* FADT 2 */ {FADT_SIG,  FADT_SIG, sizeof (FADT_SIG)-1, ACPI_TABLE_SINGLE,   AE_OK,      (void **) &acpi_gbl_FADT},
-       /* FACS 3 */ {FACS_SIG,  FACS_SIG, sizeof (FACS_SIG)-1, ACPI_TABLE_SINGLE,   AE_OK,      (void **) &acpi_gbl_FACS},
-       /* PSDT 4 */ {PSDT_SIG,  PSDT_SIG, sizeof (PSDT_SIG)-1, ACPI_TABLE_MULTIPLE, AE_OK,      NULL},
-       /* SSDT 5 */ {SSDT_SIG,  SSDT_SIG, sizeof (SSDT_SIG)-1, ACPI_TABLE_MULTIPLE, AE_OK,      NULL},
-       /* XSDT 6 */ {XSDT_SIG,  XSDT_SIG, sizeof (RSDT_SIG)-1, ACPI_TABLE_SINGLE,   AE_OK,      NULL},
-};
-
-/*
- * String versions of the exception codes above
- * These strings must match the corresponding defines exactly
- */
-NATIVE_CHAR          *acpi_gbl_exception_names_env[] =
-{
-       "AE_OK",
-       "AE_ERROR",
-       "AE_NO_ACPI_TABLES",
-       "AE_NO_NAMESPACE",
-       "AE_NO_MEMORY",
-       "AE_NOT_FOUND",
-       "AE_NOT_EXIST",
-       "AE_EXIST",
-       "AE_TYPE",
-       "AE_NULL_OBJECT",
-       "AE_NULL_ENTRY",
-       "AE_BUFFER_OVERFLOW",
-       "AE_STACK_OVERFLOW",
-       "AE_STACK_UNDERFLOW",
-       "AE_NOT_IMPLEMENTED",
-       "AE_VERSION_MISMATCH",
-       "AE_SUPPORT",
-       "AE_SHARE",
-       "AE_LIMIT",
-       "AE_TIME",
-       "AE_UNKNOWN_STATUS",
-       "AE_ACQUIRE_DEADLOCK",
-       "AE_RELEASE_DEADLOCK",
-       "AE_NOT_ACQUIRED",
-       "AE_ALREADY_ACQUIRED",
-       "AE_NO_HARDWARE_RESPONSE",
-       "AE_NO_GLOBAL_LOCK",
-};
-
-static NATIVE_CHAR          *acpi_gbl_exception_names_pgm[] =
-{
-       "AE_BAD_PARAMETER",
-       "AE_BAD_CHARACTER",
-       "AE_BAD_PATHNAME",
-       "AE_BAD_DATA",
-       "AE_BAD_ADDRESS",
-};
-
-static NATIVE_CHAR          *acpi_gbl_exception_names_tbl[] =
-{
-       "AE_BAD_SIGNATURE",
-       "AE_BAD_HEADER",
-       "AE_BAD_CHECKSUM",
-       "AE_BAD_VALUE",
-};
-
-static NATIVE_CHAR          *acpi_gbl_exception_names_aml[] =
-{
-       "AE_AML_ERROR",
-       "AE_AML_PARSE",
-       "AE_AML_BAD_OPCODE",
-       "AE_AML_NO_OPERAND",
-       "AE_AML_OPERAND_TYPE",
-       "AE_AML_OPERAND_VALUE",
-       "AE_AML_UNINITIALIZED_LOCAL",
-       "AE_AML_UNINITIALIZED_ARG",
-       "AE_AML_UNINITIALIZED_ELEMENT",
-       "AE_AML_NUMERIC_OVERFLOW",
-       "AE_AML_REGION_LIMIT",
-       "AE_AML_BUFFER_LIMIT",
-       "AE_AML_PACKAGE_LIMIT",
-       "AE_AML_DIVIDE_BY_ZERO",
-       "AE_AML_BAD_NAME",
-       "AE_AML_NAME_NOT_FOUND",
-       "AE_AML_INTERNAL",
-       "AE_AML_INVALID_SPACE_ID",
-       "AE_AML_STRING_LIMIT",
-       "AE_AML_NO_RETURN_VALUE",
-       "AE_AML_METHOD_LIMIT",
-       "AE_AML_NOT_OWNER",
-       "AE_AML_MUTEX_ORDER",
-       "AE_AML_MUTEX_NOT_ACQUIRED",
-};
-
-static NATIVE_CHAR          *acpi_gbl_exception_names_ctrl[] =
-{
-       "AE_CTRL_RETURN_VALUE",
-       "AE_CTRL_PENDING",
-       "AE_CTRL_TERMINATE",
-       "AE_CTRL_TRUE",
-       "AE_CTRL_FALSE",
-       "AE_CTRL_DEPTH",
-       "AE_CTRL_END",
-       "AE_CTRL_TRANSFER",
-};
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_cm_valid_object_type
- *
- * PARAMETERS:  None.
- *
- * RETURN:      TRUE if valid object type
- *
- * DESCRIPTION: Validate an object type
- *
- ****************************************************************************/
-
-u8
-acpi_cm_valid_object_type (
-       u32                     type)
-{
-
-       if (type > ACPI_TYPE_MAX)
-       {
-               if ((type < INTERNAL_TYPE_BEGIN) ||
-                       (type > INTERNAL_TYPE_MAX))
-               {
-                       return (FALSE);
-               }
-       }
-
-       return (TRUE);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_cm_format_exception
- *
- * PARAMETERS:  Status              - Acpi status to be formatted
- *
- * RETURN:      Formatted status string
- *
- * DESCRIPTION: Convert an ACPI exception to a string
- *
- ****************************************************************************/
-
-NATIVE_CHAR *
-acpi_cm_format_exception (
-       ACPI_STATUS             status)
-{
-       NATIVE_CHAR             *exception = "UNKNOWN_STATUS";
-       ACPI_STATUS             sub_status;
-
-
-       sub_status = (status & ~AE_CODE_MASK);
-
-
-       switch (status & AE_CODE_MASK)
-       {
-       case AE_CODE_ENVIRONMENTAL:
-
-               if (sub_status <= AE_CODE_ENV_MAX)
-               {
-                       exception = acpi_gbl_exception_names_env [sub_status];
-               }
-               break;
-
-       case AE_CODE_PROGRAMMER:
-
-               if (sub_status <= AE_CODE_PGM_MAX)
-               {
-                       exception = acpi_gbl_exception_names_pgm [sub_status -1];
-               }
-               break;
-
-       case AE_CODE_ACPI_TABLES:
-
-               if (sub_status <= AE_CODE_TBL_MAX)
-               {
-                       exception = acpi_gbl_exception_names_tbl [sub_status -1];
-               }
-               break;
-
-       case AE_CODE_AML:
-
-               if (sub_status <= AE_CODE_AML_MAX)
-               {
-                       exception = acpi_gbl_exception_names_aml [sub_status -1];
-               }
-               break;
-
-       case AE_CODE_CONTROL:
-
-               if (sub_status <= AE_CODE_CTRL_MAX)
-               {
-                       exception = acpi_gbl_exception_names_ctrl [sub_status -1];
-               }
-               break;
-
-       default:
-               break;
-       }
-
-
-       return (exception);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_cm_allocate_owner_id
- *
- * PARAMETERS:  Id_type         - Type of ID (method or table)
- *
- * DESCRIPTION: Allocate a table or method owner id
- *
- ***************************************************************************/
-
-ACPI_OWNER_ID
-acpi_cm_allocate_owner_id (
-       u32                     id_type)
-{
-       ACPI_OWNER_ID           owner_id = 0xFFFF;
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-
-       switch (id_type)
-       {
-       case OWNER_TYPE_TABLE:
-
-               owner_id = acpi_gbl_next_table_owner_id;
-               acpi_gbl_next_table_owner_id++;
-
-               if (acpi_gbl_next_table_owner_id == FIRST_METHOD_ID)
-               {
-                       acpi_gbl_next_table_owner_id = FIRST_TABLE_ID;
-               }
-               break;
-
-
-       case OWNER_TYPE_METHOD:
-
-               owner_id = acpi_gbl_next_method_owner_id;
-               acpi_gbl_next_method_owner_id++;
-
-               if (acpi_gbl_next_method_owner_id == FIRST_TABLE_ID)
-               {
-                       acpi_gbl_next_method_owner_id = FIRST_METHOD_ID;
-               }
-               break;
-       }
-
-
-       acpi_cm_release_mutex (ACPI_MTX_CACHES);
-
-       return (owner_id);
-}
-
-
-/****************************************************************************
- *
- * FUNCTION:    Acpi_cm_init_globals
- *
- * PARAMETERS:  none
- *
- * DESCRIPTION: Init library globals.  All globals that require specific
- *              initialization should be initialized here!
- *
- ***************************************************************************/
-
-void
-acpi_cm_init_globals (
-       void)
-{
-       u32                     i;
-
-
-       /* ACPI table structure */
-
-       for (i = 0; i < NUM_ACPI_TABLES; i++)
-       {
-               acpi_gbl_acpi_tables[i].prev        = &acpi_gbl_acpi_tables[i];
-               acpi_gbl_acpi_tables[i].next        = &acpi_gbl_acpi_tables[i];
-               acpi_gbl_acpi_tables[i].pointer     = NULL;
-               acpi_gbl_acpi_tables[i].length      = 0;
-               acpi_gbl_acpi_tables[i].allocation  = ACPI_MEM_NOT_ALLOCATED;
-               acpi_gbl_acpi_tables[i].count       = 0;
-       }
-
-
-       /* Address Space handler array */
-
-       for (i = 0; i < ACPI_NUM_ADDRESS_SPACES; i++)
-       {
-               acpi_gbl_address_spaces[i].handler  = NULL;
-               acpi_gbl_address_spaces[i].context  = NULL;
-       }
-
-       /* Mutex locked flags */
-
-       for (i = 0; i < NUM_MTX; i++)
-       {
-               acpi_gbl_acpi_mutex_info[i].mutex   = NULL;
-               acpi_gbl_acpi_mutex_info[i].locked  = FALSE;
-               acpi_gbl_acpi_mutex_info[i].use_count = 0;
-               acpi_gbl_acpi_mutex_info[i].owner_id = 0;
-       }
-
-       /* Global notify handlers */
-
-       acpi_gbl_sys_notify.handler         = NULL;
-       acpi_gbl_drv_notify.handler         = NULL;
-
-       /* Global "typed" ACPI table pointers */
-
-       acpi_gbl_RSDP                       = NULL;
-       acpi_gbl_XSDT                       = NULL;
-       acpi_gbl_FACS                       = NULL;
-       acpi_gbl_FADT                       = NULL;
-       acpi_gbl_DSDT                       = NULL;
-
-
-       /* Global Lock support */
-
-       acpi_gbl_global_lock_acquired       = FALSE;
-       acpi_gbl_global_lock_thread_count   = 0;
-
-       /* Miscellaneous variables */
-
-       acpi_gbl_system_flags               = 0;
-       acpi_gbl_startup_flags              = 0;
-       acpi_gbl_rsdp_original_location     = 0;
-       acpi_gbl_cm_single_step             = FALSE;
-       acpi_gbl_db_terminate_threads       = FALSE;
-       acpi_gbl_shutdown                   = FALSE;
-       acpi_gbl_ns_lookup_count            = 0;
-       acpi_gbl_ps_find_count              = 0;
-       acpi_gbl_acpi_hardware_present      = TRUE;
-       acpi_gbl_next_table_owner_id        = FIRST_TABLE_ID;
-       acpi_gbl_next_method_owner_id       = FIRST_METHOD_ID;
-       acpi_gbl_debugger_configuration     = DEBUGGER_THREADING;
-
-       /* Cache of small "state" objects */
-
-       acpi_gbl_generic_state_cache        = NULL;
-       acpi_gbl_generic_state_cache_depth  = 0;
-       acpi_gbl_state_cache_requests       = 0;
-       acpi_gbl_state_cache_hits           = 0;
-
-       acpi_gbl_parse_cache                = NULL;
-       acpi_gbl_parse_cache_depth          = 0;
-       acpi_gbl_parse_cache_requests       = 0;
-       acpi_gbl_parse_cache_hits           = 0;
-
-       acpi_gbl_ext_parse_cache            = NULL;
-       acpi_gbl_ext_parse_cache_depth      = 0;
-       acpi_gbl_ext_parse_cache_requests   = 0;
-       acpi_gbl_ext_parse_cache_hits       = 0;
-
-       acpi_gbl_object_cache               = NULL;
-       acpi_gbl_object_cache_depth         = 0;
-       acpi_gbl_object_cache_requests      = 0;
-       acpi_gbl_object_cache_hits          = 0;
-
-       acpi_gbl_walk_state_cache           = NULL;
-       acpi_gbl_walk_state_cache_depth     = 0;
-       acpi_gbl_walk_state_cache_requests  = 0;
-       acpi_gbl_walk_state_cache_hits      = 0;
-
-       /* Hardware oriented */
-
-       acpi_gbl_gpe0enable_register_save   = NULL;
-       acpi_gbl_gpe1_enable_register_save  = NULL;
-       acpi_gbl_original_mode              = SYS_MODE_UNKNOWN;   /*  original ACPI/legacy mode   */
-       acpi_gbl_gpe_registers              = NULL;
-       acpi_gbl_gpe_info                   = NULL;
-
-       /* Namespace */
-
-       acpi_gbl_root_node                  = NULL;
-
-       acpi_gbl_root_node_struct.name      = ACPI_ROOT_NAME;
-       acpi_gbl_root_node_struct.data_type = ACPI_DESC_TYPE_NAMED;
-       acpi_gbl_root_node_struct.type      = ACPI_TYPE_ANY;
-       acpi_gbl_root_node_struct.child     = NULL;
-       acpi_gbl_root_node_struct.peer      = NULL;
-       acpi_gbl_root_node_struct.object    = NULL;
-       acpi_gbl_root_node_struct.flags     = ANOBJ_END_OF_PEER_LIST;
-
-       /* Memory allocation metrics - compiled out in non-debug mode. */
-
-       INITIALIZE_ALLOCATION_METRICS();
-
-       return;
-}
-
-
diff --git a/reactos/drivers/bus/acpi/utils/cminit.c b/reactos/drivers/bus/acpi/utils/cminit.c
deleted file mode 100644 (file)
index 42523f8..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cminit - Common ACPI subsystem initialization
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cminit")
-
-
-#define ACPI_OFFSET(d,o)    ((NATIVE_INT) &(((d *)0)->o))
-#define ACPI_FADT_OFFSET(o) ACPI_OFFSET (FADT_DESCRIPTOR, o)
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_fadt_register_error
- *
- * PARAMETERS:  *Register_name          - Pointer to string identifying register
- *              Value                   - Actual register contents value
- *              Acpi_test_spec_section  - TDS section containing assertion
- *              Acpi_assertion          - Assertion number being tested
- *
- * RETURN:      AE_BAD_VALUE
- *
- * DESCRIPTION: Display failure message and link failure to TDS assertion
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-acpi_cm_fadt_register_error (
-       NATIVE_CHAR             *register_name,
-       u32                     value,
-       u32                     offset)
-{
-
-       REPORT_ERROR (
-               ("Invalid FADT value %s=%lX at offset %lX FADT=%p\n",
-               register_name, value, offset, acpi_gbl_FADT));
-
-
-       return (AE_BAD_VALUE);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_cm_validate_fadt
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Validate various ACPI registers in the FADT
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_validate_fadt (
-       void)
-{
-       ACPI_STATUS                 status = AE_OK;
-
-
-       /*
-        * Verify Fixed ACPI Description Table fields,
-        * but don't abort on any problems, just display error
-        */
-
-       if (acpi_gbl_FADT->pm1_evt_len < 4) {
-               status = acpi_cm_fadt_register_error ("PM1_EVT_LEN",
-                                 (u32) acpi_gbl_FADT->pm1_evt_len,
-                                 ACPI_FADT_OFFSET (pm1_evt_len));
-       }
-
-       if (!acpi_gbl_FADT->pm1_cnt_len) {
-               status = acpi_cm_fadt_register_error ("PM1_CNT_LEN", 0,
-                                 ACPI_FADT_OFFSET (pm1_cnt_len));
-       }
-
-       if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1a_evt_blk.address)) {
-               status = acpi_cm_fadt_register_error ("X_PM1a_EVT_BLK", 0,
-                                 ACPI_FADT_OFFSET (Xpm1a_evt_blk.address));
-       }
-
-       if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1a_cnt_blk.address)) {
-               status = acpi_cm_fadt_register_error ("X_PM1a_CNT_BLK", 0,
-                                 ACPI_FADT_OFFSET (Xpm1a_cnt_blk.address));
-       }
-
-       if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm_tmr_blk.address)) {
-               status = acpi_cm_fadt_register_error ("X_PM_TMR_BLK", 0,
-                                 ACPI_FADT_OFFSET (Xpm_tmr_blk.address));
-       }
-
-       if ((ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm2_cnt_blk.address) &&
-               !acpi_gbl_FADT->pm2_cnt_len)) {
-               status = acpi_cm_fadt_register_error ("PM2_CNT_LEN",
-                                 (u32) acpi_gbl_FADT->pm2_cnt_len,
-                                 ACPI_FADT_OFFSET (pm2_cnt_len));
-       }
-
-       if (acpi_gbl_FADT->pm_tm_len < 4) {
-               status = acpi_cm_fadt_register_error ("PM_TM_LEN",
-                                 (u32) acpi_gbl_FADT->pm_tm_len,
-                                 ACPI_FADT_OFFSET (pm_tm_len));
-       }
-
-       /* length of GPE blocks must be a multiple of 2 */
-
-
-       if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) &&
-               (acpi_gbl_FADT->gpe0blk_len & 1)) {
-               status = acpi_cm_fadt_register_error ("(x)GPE0_BLK_LEN",
-                                 (u32) acpi_gbl_FADT->gpe0blk_len,
-                                 ACPI_FADT_OFFSET (gpe0blk_len));
-       }
-
-       if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) &&
-               (acpi_gbl_FADT->gpe1_blk_len & 1)) {
-               status = acpi_cm_fadt_register_error ("(x)GPE1_BLK_LEN",
-                                 (u32) acpi_gbl_FADT->gpe1_blk_len,
-                                 ACPI_FADT_OFFSET (gpe1_blk_len));
-       }
-
-       return (status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_cm_terminate
- *
- * PARAMETERS:  none
- *
- * RETURN:      none
- *
- * DESCRIPTION: free memory allocated for table storage.
- *
- ******************************************************************************/
-
-void
-acpi_cm_terminate (void)
-{
-
-
-       /* Free global tables, etc. */
-
-       if (acpi_gbl_gpe0enable_register_save) {
-               acpi_cm_free (acpi_gbl_gpe0enable_register_save);
-       }
-
-       if (acpi_gbl_gpe1_enable_register_save) {
-               acpi_cm_free (acpi_gbl_gpe1_enable_register_save);
-       }
-
-
-       return;
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_cm_subsystem_shutdown
- *
- * PARAMETERS:  none
- *
- * RETURN:      none
- *
- * DESCRIPTION: Shutdown the various subsystems.  Don't delete the mutex
- *              objects here -- because the AML debugger may be still running.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_subsystem_shutdown (void)
-{
-
-       /* Just exit if subsystem is already shutdown */
-
-       if (acpi_gbl_shutdown) {
-               return (AE_OK);
-       }
-
-       /* Subsystem appears active, go ahead and shut it down */
-
-       acpi_gbl_shutdown = TRUE;
-
-       /* Close the Namespace */
-
-       acpi_ns_terminate ();
-
-       /* Close the Acpi_event Handling */
-
-       acpi_ev_terminate ();
-
-       /* Close the globals */
-
-       acpi_cm_terminate ();
-
-       /* Flush the local cache(s) */
-
-       acpi_cm_delete_generic_state_cache ();
-       acpi_cm_delete_object_cache ();
-       acpi_ds_delete_walk_state_cache ();
-
-       /* Close the Parser */
-
-       /* TBD: [Restructure] Acpi_ps_terminate () */
-
-       acpi_ps_delete_parse_cache ();
-
-       /* Debug only - display leftover memory allocation, if any */
-#ifdef ENABLE_DEBUGGER
-       acpi_cm_dump_current_allocations (ACPI_UINT32_MAX, NULL);
-#endif
-
-       return (AE_OK);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/utils/cmobject.c b/reactos/drivers/bus/acpi/utils/cmobject.c
deleted file mode 100644 (file)
index cab18b5..0000000
+++ /dev/null
@@ -1,618 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cmobject - ACPI object create/delete/size/cache routines
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cmobject")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    _Cm_create_internal_object
- *
- * PARAMETERS:  Address             - Address of the memory to deallocate
- *              Component           - Component type of caller
- *              Module              - Source file name of caller
- *              Line                - Line number of caller
- *              Type                - ACPI Type of the new object
- *
- * RETURN:      Object              - The new object.  Null on failure
- *
- * DESCRIPTION: Create and initialize a new internal object.
- *
- * NOTE:        We always allocate the worst-case object descriptor because
- *              these objects are cached, and we want them to be
- *              one-size-satisifies-any-request.  This in itself may not be
- *              the most memory efficient, but the efficiency of the object
- *              cache should more than make up for this!
- *
- ******************************************************************************/
-
-ACPI_OPERAND_OBJECT  *
-_cm_create_internal_object (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id,
-       OBJECT_TYPE_INTERNAL    type)
-{
-       ACPI_OPERAND_OBJECT     *object;
-
-
-       /* Allocate the raw object descriptor */
-
-       object = _cm_allocate_object_desc (module_name, line_number, component_id);
-       if (!object) {
-               /* Allocation failure */
-
-               return (NULL);
-       }
-
-       /* Save the object type in the object descriptor */
-
-       object->common.type = type;
-
-       /* Init the reference count */
-
-       object->common.reference_count = 1;
-
-       /* Any per-type initialization should go here */
-
-
-       return (object);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_valid_internal_object
- *
- * PARAMETERS:  Operand             - Object to be validated
- *
- * RETURN:      Validate a pointer to be an ACPI_OPERAND_OBJECT
- *
- ******************************************************************************/
-
-u8
-acpi_cm_valid_internal_object (
-       void                    *object)
-{
-
-       /* Check for a null pointer */
-
-       if (!object) {
-               return (FALSE);
-       }
-
-       /* Check for a pointer within one of the ACPI tables */
-
-       if (acpi_tb_system_table_pointer (object)) {
-               return (FALSE);
-       }
-
-       /* Check the descriptor type field */
-
-       if (!VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_INTERNAL)) {
-               /* Not an ACPI internal object, do some further checking */
-
-
-
-
-               return (FALSE);
-       }
-
-
-       /* The object appears to be a valid ACPI_OPERAND_OBJECT  */
-
-       return (TRUE);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    _Cm_allocate_object_desc
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Message             - Error message to use on failure
- *
- * RETURN:      Pointer to newly allocated object descriptor.  Null on error
- *
- * DESCRIPTION: Allocate a new object descriptor.  Gracefully handle
- *              error conditions.
- *
- ******************************************************************************/
-
-void *
-_cm_allocate_object_desc (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id)
-{
-       ACPI_OPERAND_OBJECT     *object;
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-
-       acpi_gbl_object_cache_requests++;
-
-       /* Check the cache first */
-
-       if (acpi_gbl_object_cache) {
-               /* There is an object available, use it */
-
-               object = acpi_gbl_object_cache;
-               acpi_gbl_object_cache = object->cache.next;
-               object->cache.next = NULL;
-
-               acpi_gbl_object_cache_hits++;
-               acpi_gbl_object_cache_depth--;
-
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-       }
-
-       else {
-               /* The cache is empty, create a new object */
-
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-
-               /* Attempt to allocate new descriptor */
-
-               object = _cm_callocate (sizeof (ACPI_OPERAND_OBJECT), component_id,
-                                 module_name, line_number);
-               if (!object) {
-                       /* Allocation failed */
-
-                       _REPORT_ERROR (module_name, line_number, component_id,
-                                         ("Could not allocate an object descriptor\n"));
-
-                       return (NULL);
-               }
-
-               /* Memory allocation metrics - compiled out in non debug mode. */
-
-               INCREMENT_OBJECT_METRICS (sizeof (ACPI_OPERAND_OBJECT));
-       }
-
-       /* Mark the descriptor type */
-
-       object->common.data_type = ACPI_DESC_TYPE_INTERNAL;
-
-       return (object);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_delete_object_desc
- *
- * PARAMETERS:  Object          - Acpi internal object to be deleted
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache
- *
- ******************************************************************************/
-
-void
-acpi_cm_delete_object_desc (
-       ACPI_OPERAND_OBJECT     *object)
-{
-
-
-       /* Make sure that the object isn't already in the cache */
-
-       if (object->common.data_type == (ACPI_DESC_TYPE_INTERNAL | ACPI_CACHED_OBJECT)) {
-               return;
-       }
-
-       /* Object must be an ACPI_OPERAND_OBJECT  */
-
-       if (object->common.data_type != ACPI_DESC_TYPE_INTERNAL) {
-               return;
-       }
-
-
-       /* If cache is full, just free this object */
-
-       if (acpi_gbl_object_cache_depth >= MAX_OBJECT_CACHE_DEPTH) {
-               /*
-                * Memory allocation metrics.  Call the macro here since we only
-                * care about dynamically allocated objects.
-                */
-               DECREMENT_OBJECT_METRICS (sizeof (ACPI_OPERAND_OBJECT));
-
-               acpi_cm_free (object);
-               return;
-       }
-
-       acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-
-       /* Clear the entire object.  This is important! */
-
-       MEMSET (object, 0, sizeof (ACPI_OPERAND_OBJECT));
-       object->common.data_type = ACPI_DESC_TYPE_INTERNAL | ACPI_CACHED_OBJECT;
-
-       /* Put the object at the head of the global cache list */
-
-       object->cache.next = acpi_gbl_object_cache;
-       acpi_gbl_object_cache = object;
-       acpi_gbl_object_cache_depth++;
-
-
-       acpi_cm_release_mutex (ACPI_MTX_CACHES);
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_delete_object_cache
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Purge the global state object cache.  Used during subsystem
- *              termination.
- *
- ******************************************************************************/
-
-void
-acpi_cm_delete_object_cache (
-       void)
-{
-       ACPI_OPERAND_OBJECT     *next;
-
-
-       /* Traverse the global cache list */
-
-       while (acpi_gbl_object_cache) {
-               /* Delete one cached state object */
-
-               next = acpi_gbl_object_cache->cache.next;
-               acpi_gbl_object_cache->cache.next = NULL;
-
-               /*
-                * Memory allocation metrics.  Call the macro here since we only
-                * care about dynamically allocated objects.
-                */
-               DECREMENT_OBJECT_METRICS (sizeof (ACPI_OPERAND_OBJECT));
-
-               acpi_cm_free (acpi_gbl_object_cache);
-               acpi_gbl_object_cache = next;
-               acpi_gbl_object_cache_depth--;
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_init_static_object
- *
- * PARAMETERS:  Obj_desc            - Pointer to a "static" object - on stack
- *                                    or in the data segment.
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Initialize a static object.  Sets flags to disallow dynamic
- *              deletion of the object.
- *
- ******************************************************************************/
-
-void
-acpi_cm_init_static_object (
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-
-
-       if (!obj_desc) {
-               return;
-       }
-
-
-       /*
-        * Clear the entire descriptor
-        */
-       MEMSET ((void *) obj_desc, 0, sizeof (ACPI_OPERAND_OBJECT));
-
-
-       /*
-        * Initialize the header fields
-        * 1) This is an ACPI_OPERAND_OBJECT  descriptor
-        * 2) The size is the full object (worst case)
-        * 3) The flags field indicates static allocation
-        * 4) Reference count starts at one (not really necessary since the
-        *    object can't be deleted, but keeps everything sane)
-        */
-
-       obj_desc->common.data_type      = ACPI_DESC_TYPE_INTERNAL;
-       obj_desc->common.flags          = AOPOBJ_STATIC_ALLOCATION;
-       obj_desc->common.reference_count = 1;
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_get_simple_object_size
- *
- * PARAMETERS:  *Internal_object    - Pointer to the object we are examining
- *              *Ret_length         - Where the length is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to determine the space required to
- *              contain a simple object for return to an API user.
- *
- *              The length includes the object structure plus any additional
- *              needed space.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_get_simple_object_size (
-       ACPI_OPERAND_OBJECT     *internal_object,
-       u32                     *obj_length)
-{
-       u32                     length;
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Handle a null object (Could be a uninitialized package element -- which is legal) */
-
-       if (!internal_object) {
-               *obj_length = 0;
-               return (AE_OK);
-       }
-
-
-       /* Start with the length of the Acpi object */
-
-       length = sizeof (ACPI_OBJECT);
-
-       if (VALID_DESCRIPTOR_TYPE (internal_object, ACPI_DESC_TYPE_NAMED)) {
-               /* Object is a named object (reference), just return the length */
-
-               *obj_length = (u32) ROUND_UP_TO_NATIVE_WORD (length);
-               return (status);
-       }
-
-
-       /*
-        * The final length depends on the object type
-        * Strings and Buffers are packed right up against the parent object and
-        * must be accessed bytewise or there may be alignment problems on
-        * certain processors
-        */
-
-       switch (internal_object->common.type) {
-
-       case ACPI_TYPE_STRING:
-
-               length += internal_object->string.length + 1;
-               break;
-
-
-       case ACPI_TYPE_BUFFER:
-
-               length += internal_object->buffer.length;
-               break;
-
-
-       case ACPI_TYPE_INTEGER:
-       case ACPI_TYPE_PROCESSOR:
-       case ACPI_TYPE_POWER:
-
-               /*
-                * No extra data for these types
-                */
-               break;
-
-
-       case INTERNAL_TYPE_REFERENCE:
-
-               /*
-                * The only type that should be here is opcode AML_NAMEPATH_OP -- since
-                * this means an object reference
-                */
-               if (internal_object->reference.opcode != AML_NAMEPATH_OP) {
-                       status = AE_TYPE;
-               }
-
-               else {
-                       /*
-                        * Get the actual length of the full pathname to this object.
-                        * The reference will be converted to the pathname to the object
-                        */
-                       length += ROUND_UP_TO_NATIVE_WORD (acpi_ns_get_pathname_length (internal_object->reference.node));
-               }
-               break;
-
-
-       default:
-
-               status = AE_TYPE;
-               break;
-       }
-
-
-       /*
-        * Account for the space required by the object rounded up to the next
-        * multiple of the machine word size.  This keeps each object aligned
-        * on a machine word boundary. (preventing alignment faults on some
-        * machines.)
-        */
-       *obj_length = (u32) ROUND_UP_TO_NATIVE_WORD (length);
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_get_element_length
- *
- * PARAMETERS:  ACPI_PKG_CALLBACK
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: Get the length of one package element.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_get_element_length (
-       u8                      object_type,
-       ACPI_OPERAND_OBJECT     *source_object,
-       ACPI_GENERIC_STATE      *state,
-       void                    *context)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_PKG_INFO           *info = (ACPI_PKG_INFO *) context;
-       u32                     object_space;
-
-
-       switch (object_type) {
-       case 0:
-
-               /*
-                * Simple object - just get the size (Null object/entry is handled
-                * here also) and sum it into the running package length
-                */
-               status = acpi_cm_get_simple_object_size (source_object, &object_space);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-
-               info->length += object_space;
-               break;
-
-
-       case 1:
-               /* Package - nothing much to do here, let the walk handle it */
-
-               info->num_packages++;
-               state->pkg.this_target_obj = NULL;
-               break;
-
-       default:
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_get_package_object_size
- *
- * PARAMETERS:  *Internal_object    - Pointer to the object we are examining
- *              *Ret_length         - Where the length is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to determine the space required to
- *              contain a package object for return to an API user.
- *
- *              This is moderately complex since a package contains other
- *              objects including packages.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_get_package_object_size (
-       ACPI_OPERAND_OBJECT     *internal_object,
-       u32                     *obj_length)
-{
-       ACPI_STATUS             status;
-       ACPI_PKG_INFO           info;
-
-
-       info.length      = 0;
-       info.object_space = 0;
-       info.num_packages = 1;
-
-       status = acpi_cm_walk_package_tree (internal_object, NULL,
-                        acpi_cm_get_element_length, &info);
-
-       /*
-        * We have handled all of the objects in all levels of the package.
-        * just add the length of the package objects themselves.
-        * Round up to the next machine word.
-        */
-       info.length += ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)) *
-                         info.num_packages;
-
-       /* Return the total package length */
-
-       *obj_length = info.length;
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_get_object_size
- *
- * PARAMETERS:  *Internal_object    - Pointer to the object we are examining
- *              *Ret_length         - Where the length will be returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to determine the space required to
- *              contain an object for return to an API user.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_get_object_size(
-       ACPI_OPERAND_OBJECT     *internal_object,
-       u32                     *obj_length)
-{
-       ACPI_STATUS             status;
-
-
-       if ((VALID_DESCRIPTOR_TYPE (internal_object, ACPI_DESC_TYPE_INTERNAL)) &&
-               (IS_THIS_OBJECT_TYPE (internal_object, ACPI_TYPE_PACKAGE))) {
-               status = acpi_cm_get_package_object_size (internal_object, obj_length);
-       }
-
-       else {
-               status = acpi_cm_get_simple_object_size (internal_object, obj_length);
-       }
-
-       return (status);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/utils/cmutils.c b/reactos/drivers/bus/acpi/utils/cmutils.c
deleted file mode 100644 (file)
index 387c649..0000000
+++ /dev/null
@@ -1,999 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: cmutils - common utility procedures
- *              $Revision: 1.1 $
- *
- ******************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cmutils")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_valid_acpi_name
- *
- * PARAMETERS:  Character           - The character to be examined
- *
- * RETURN:      1 if Character may appear in a name, else 0
- *
- * DESCRIPTION: Check for a valid ACPI name.  Each character must be one of:
- *              1) Upper case alpha
- *              2) numeric
- *              3) underscore
- *
- ******************************************************************************/
-
-u8
-acpi_cm_valid_acpi_name (
-       u32                     name)
-{
-       NATIVE_CHAR             *name_ptr = (NATIVE_CHAR *) &name;
-       u32                     i;
-
-
-       for (i = 0; i < ACPI_NAME_SIZE; i++) {
-               if (!((name_ptr[i] == '_') ||
-                         (name_ptr[i] >= 'A' && name_ptr[i] <= 'Z') ||
-                         (name_ptr[i] >= '0' && name_ptr[i] <= '9'))) {
-                       return (FALSE);
-               }
-       }
-
-
-       return (TRUE);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_valid_acpi_character
- *
- * PARAMETERS:  Character           - The character to be examined
- *
- * RETURN:      1 if Character may appear in a name, else 0
- *
- * DESCRIPTION: Check for a printable character
- *
- ******************************************************************************/
-
-u8
-acpi_cm_valid_acpi_character (
-       NATIVE_CHAR             character)
-{
-
-       return ((u8)   ((character == '_') ||
-                          (character >= 'A' && character <= 'Z') ||
-                          (character >= '0' && character <= '9')));
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_mutex_initialize
- *
- * PARAMETERS:  None.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create the system mutex objects.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_mutex_initialize (
-       void)
-{
-       u32                     i;
-       ACPI_STATUS             status;
-
-
-       /*
-        * Create each of the predefined mutex objects
-        */
-       for (i = 0; i < NUM_MTX; i++) {
-               status = acpi_cm_create_mutex (i);
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_mutex_terminate
- *
- * PARAMETERS:  None.
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Delete all of the system mutex objects.
- *
- ******************************************************************************/
-
-void
-acpi_cm_mutex_terminate (
-       void)
-{
-       u32                     i;
-
-
-       /*
-        * Delete each predefined mutex object
-        */
-       for (i = 0; i < NUM_MTX; i++) {
-               acpi_cm_delete_mutex (i);
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_create_mutex
- *
- * PARAMETERS:  Mutex_iD        - ID of the mutex to be created
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a mutex object.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_create_mutex (
-       ACPI_MUTEX_HANDLE       mutex_id)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       if (mutex_id > MAX_MTX) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       if (!acpi_gbl_acpi_mutex_info[mutex_id].mutex) {
-               status = acpi_os_create_semaphore (1, 1,
-                                  &acpi_gbl_acpi_mutex_info[mutex_id].mutex);
-               acpi_gbl_acpi_mutex_info[mutex_id].locked = FALSE;
-               acpi_gbl_acpi_mutex_info[mutex_id].use_count = 0;
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_delete_mutex
- *
- * PARAMETERS:  Mutex_iD        - ID of the mutex to be deleted
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Delete a mutex object.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_delete_mutex (
-       ACPI_MUTEX_HANDLE       mutex_id)
-{
-       ACPI_STATUS             status;
-
-
-       if (mutex_id > MAX_MTX) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       status = acpi_os_delete_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex);
-
-       acpi_gbl_acpi_mutex_info[mutex_id].mutex = NULL;
-       acpi_gbl_acpi_mutex_info[mutex_id].locked = FALSE;
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_acquire_mutex
- *
- * PARAMETERS:  Mutex_iD        - ID of the mutex to be acquired
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Acquire a mutex object.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_acquire_mutex (
-       ACPI_MUTEX_HANDLE       mutex_id)
-{
-       ACPI_STATUS             status;
-       u32                     i;
-       u32                     this_thread_id;
-
-
-       if (mutex_id > MAX_MTX) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       this_thread_id = acpi_os_get_thread_id ();
-
-       /*
-        * Deadlock prevention.  Check if this thread owns any mutexes of value
-        * greater than or equal to this one.  If so, the thread has violated
-        * the mutex ordering rule.  This indicates a coding error somewhere in
-        * the ACPI subsystem code.
-        */
-       for (i = mutex_id; i < MAX_MTX; i++) {
-               if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) {
-                       if (i == mutex_id) {
-                               return (AE_ALREADY_ACQUIRED);
-                       }
-
-                       return (AE_ACQUIRE_DEADLOCK);
-               }
-       }
-
-
-       status = acpi_os_wait_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex,
-                          1, WAIT_FOREVER);
-
-       if (ACPI_SUCCESS (status)) {
-               acpi_gbl_acpi_mutex_info[mutex_id].locked = TRUE;
-               acpi_gbl_acpi_mutex_info[mutex_id].use_count++;
-               acpi_gbl_acpi_mutex_info[mutex_id].owner_id = this_thread_id;
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_release_mutex
- *
- * PARAMETERS:  Mutex_iD        - ID of the mutex to be released
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Release a mutex object.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_release_mutex (
-       ACPI_MUTEX_HANDLE       mutex_id)
-{
-       ACPI_STATUS             status;
-       u32                     i;
-       u32                     this_thread_id;
-
-
-       if (mutex_id > MAX_MTX) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /*
-        * Mutex must be acquired in order to release it!
-        */
-       if (!acpi_gbl_acpi_mutex_info[mutex_id].locked) {
-               return (AE_NOT_ACQUIRED);
-       }
-
-
-       /*
-        * Deadlock prevention.  Check if this thread owns any mutexes of value
-        * greater than this one.  If so, the thread has violated
-        * the mutex ordering rule.  This indicates a coding error somewhere in
-        * the ACPI subsystem code.
-        */
-       this_thread_id = acpi_os_get_thread_id ();
-       for (i = mutex_id; i < MAX_MTX; i++) {
-               if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) {
-                       if (i == mutex_id) {
-                               continue;
-                       }
-
-                       return (AE_RELEASE_DEADLOCK);
-               }
-       }
-
-       acpi_gbl_acpi_mutex_info[mutex_id].locked = FALSE; /* Mark before unlocking */
-       acpi_gbl_acpi_mutex_info[mutex_id].owner_id = 0;
-
-       status = acpi_os_signal_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex, 1);
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_create_update_state_and_push
- *
- * PARAMETERS:  *Object         - Object to be added to the new state
- *              Action          - Increment/Decrement
- *              State_list      - List the state will be added to
- *
- * RETURN:      None
- *
- * DESCRIPTION: Create a new state and push it
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_create_update_state_and_push (
-       ACPI_OPERAND_OBJECT     *object,
-       u16                     action,
-       ACPI_GENERIC_STATE      **state_list)
-{
-       ACPI_GENERIC_STATE       *state;
-
-
-       /* Ignore null objects; these are expected */
-
-       if (!object) {
-               return (AE_OK);
-       }
-
-       state = acpi_cm_create_update_state (object, action);
-       if (!state) {
-               return (AE_NO_MEMORY);
-       }
-
-
-       acpi_cm_push_generic_state (state_list, state);
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_create_pkg_state_and_push
- *
- * PARAMETERS:  *Object         - Object to be added to the new state
- *              Action          - Increment/Decrement
- *              State_list      - List the state will be added to
- *
- * RETURN:      None
- *
- * DESCRIPTION: Create a new state and push it
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_create_pkg_state_and_push (
-       void                    *internal_object,
-       void                    *external_object,
-       u16                     index,
-       ACPI_GENERIC_STATE      **state_list)
-{
-       ACPI_GENERIC_STATE       *state;
-
-
-       state = acpi_cm_create_pkg_state (internal_object, external_object, index);
-       if (!state) {
-               return (AE_NO_MEMORY);
-       }
-
-
-       acpi_cm_push_generic_state (state_list, state);
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_push_generic_state
- *
- * PARAMETERS:  List_head           - Head of the state stack
- *              State               - State object to push
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Push a state object onto a state stack
- *
- ******************************************************************************/
-
-void
-acpi_cm_push_generic_state (
-       ACPI_GENERIC_STATE      **list_head,
-       ACPI_GENERIC_STATE      *state)
-{
-       /* Push the state object onto the front of the list (stack) */
-
-       state->common.next = *list_head;
-       *list_head = state;
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_pop_generic_state
- *
- * PARAMETERS:  List_head           - Head of the state stack
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Pop a state object from a state stack
- *
- ******************************************************************************/
-
-ACPI_GENERIC_STATE *
-acpi_cm_pop_generic_state (
-       ACPI_GENERIC_STATE      **list_head)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       /* Remove the state object at the head of the list (stack) */
-
-       state = *list_head;
-       if (state) {
-               /* Update the list head */
-
-               *list_head = state->common.next;
-       }
-
-       return (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_create_generic_state
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a generic state object.  Attempt to obtain one from
- *              the global state cache;  If none available, create a new one.
- *
- ******************************************************************************/
-
-ACPI_GENERIC_STATE *
-acpi_cm_create_generic_state (void)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-
-       acpi_gbl_state_cache_requests++;
-
-       /* Check the cache first */
-
-       if (acpi_gbl_generic_state_cache) {
-               /* There is an object available, use it */
-
-               state = acpi_gbl_generic_state_cache;
-               acpi_gbl_generic_state_cache = state->common.next;
-               state->common.next = NULL;
-
-               acpi_gbl_state_cache_hits++;
-               acpi_gbl_generic_state_cache_depth--;
-
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-
-       }
-
-       else {
-               /* The cache is empty, create a new object */
-
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-
-               state = acpi_cm_callocate (sizeof (ACPI_GENERIC_STATE));
-       }
-
-       /* Initialize */
-
-       if (state) {
-               /* Always zero out the object before init */
-
-               MEMSET (state, 0, sizeof (ACPI_GENERIC_STATE));
-
-               state->common.data_type = ACPI_DESC_TYPE_STATE;
-       }
-
-       return (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_create_update_state
- *
- * PARAMETERS:  Object              - Initial Object to be installed in the
- *                                    state
- *              Action              - Update action to be performed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create an "Update State" - a flavor of the generic state used
- *              to update reference counts and delete complex objects such
- *              as packages.
- *
- ******************************************************************************/
-
-ACPI_GENERIC_STATE *
-acpi_cm_create_update_state (
-       ACPI_OPERAND_OBJECT     *object,
-       u16                     action)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       /* Create the generic state object */
-
-       state = acpi_cm_create_generic_state ();
-       if (!state) {
-               return (NULL);
-       }
-
-       /* Init fields specific to the update struct */
-
-       state->update.object = object;
-       state->update.value  = action;
-
-       return (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_create_pkg_state
- *
- * PARAMETERS:  Object              - Initial Object to be installed in the
- *                                    state
- *              Action              - Update action to be performed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create an "Update State" - a flavor of the generic state used
- *              to update reference counts and delete complex objects such
- *              as packages.
- *
- ******************************************************************************/
-
-ACPI_GENERIC_STATE *
-acpi_cm_create_pkg_state (
-       void                    *internal_object,
-       void                    *external_object,
-       u16                     index)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       /* Create the generic state object */
-
-       state = acpi_cm_create_generic_state ();
-       if (!state) {
-               return (NULL);
-       }
-
-       /* Init fields specific to the update struct */
-
-       state->pkg.source_object = (ACPI_OPERAND_OBJECT *) internal_object;
-       state->pkg.dest_object  = external_object;
-       state->pkg.index        = index;
-       state->pkg.num_packages = 1;
-
-       return (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_create_control_state
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a "Control State" - a flavor of the generic state used
- *              to support nested IF/WHILE constructs in the AML.
- *
- ******************************************************************************/
-
-ACPI_GENERIC_STATE *
-acpi_cm_create_control_state (
-       void)
-{
-       ACPI_GENERIC_STATE      *state;
-
-
-       /* Create the generic state object */
-
-       state = acpi_cm_create_generic_state ();
-       if (!state) {
-               return (NULL);
-       }
-
-
-       /* Init fields specific to the control struct */
-
-       state->common.state = CONTROL_CONDITIONAL_EXECUTING;
-
-       return (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_delete_generic_state
- *
- * PARAMETERS:  State               - The state object to be deleted
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Put a state object back into the global state cache.  The object
- *              is not actually freed at this time.
- *
- ******************************************************************************/
-
-void
-acpi_cm_delete_generic_state (
-       ACPI_GENERIC_STATE      *state)
-{
-
-       /* If cache is full, just free this state object */
-
-       if (acpi_gbl_generic_state_cache_depth >= MAX_STATE_CACHE_DEPTH) {
-               acpi_cm_free (state);
-       }
-
-       /* Otherwise put this object back into the cache */
-
-       else {
-               acpi_cm_acquire_mutex (ACPI_MTX_CACHES);
-
-               /* Clear the state */
-
-               MEMSET (state, 0, sizeof (ACPI_GENERIC_STATE));
-               state->common.data_type = ACPI_DESC_TYPE_STATE;
-
-               /* Put the object at the head of the global cache list */
-
-               state->common.next = acpi_gbl_generic_state_cache;
-               acpi_gbl_generic_state_cache = state;
-               acpi_gbl_generic_state_cache_depth++;
-
-
-               acpi_cm_release_mutex (ACPI_MTX_CACHES);
-       }
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_delete_generic_state_cache
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Purge the global state object cache.  Used during subsystem
- *              termination.
- *
- ******************************************************************************/
-
-void
-acpi_cm_delete_generic_state_cache (
-       void)
-{
-       ACPI_GENERIC_STATE      *next;
-
-
-       /* Traverse the global cache list */
-
-       while (acpi_gbl_generic_state_cache) {
-               /* Delete one cached state object */
-
-               next = acpi_gbl_generic_state_cache->common.next;
-               acpi_cm_free (acpi_gbl_generic_state_cache);
-               acpi_gbl_generic_state_cache = next;
-               acpi_gbl_generic_state_cache_depth--;
-       }
-
-       return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_resolve_package_references
- *
- * PARAMETERS:  Obj_desc        - The Package object on which to resolve refs
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Walk through a package and turn internal references into values
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_resolve_package_references (
-       ACPI_OPERAND_OBJECT     *obj_desc)
-{
-       u32                     count;
-       ACPI_OPERAND_OBJECT     *sub_object;
-
-
-       if (obj_desc->common.type != ACPI_TYPE_PACKAGE) {
-               /* The object must be a package */
-
-               REPORT_ERROR (("Must resolve Package Refs on a Package\n"));
-               return(AE_ERROR);
-       }
-
-       /*
-        * TBD: what about nested packages? */
-
-       for (count = 0; count < obj_desc->package.count; count++) {
-               sub_object = obj_desc->package.elements[count];
-
-               if (sub_object->common.type == INTERNAL_TYPE_REFERENCE) {
-                       if (sub_object->reference.opcode == AML_ZERO_OP) {
-                               sub_object->common.type = ACPI_TYPE_INTEGER;
-                               sub_object->integer.value = 0;
-                       }
-
-                       else if (sub_object->reference.opcode == AML_ONE_OP) {
-                               sub_object->common.type = ACPI_TYPE_INTEGER;
-                               sub_object->integer.value = 1;
-                       }
-
-                       else if (sub_object->reference.opcode == AML_ONES_OP) {
-                               sub_object->common.type = ACPI_TYPE_INTEGER;
-                               sub_object->integer.value = ACPI_INTEGER_MAX;
-                       }
-               }
-       }
-
-       return(AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_cm_walk_package_tree
- *
- * PARAMETERS:  Obj_desc        - The Package object on which to resolve refs
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Walk through a package
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_cm_walk_package_tree (
-       ACPI_OPERAND_OBJECT     *source_object,
-       void                    *target_object,
-       ACPI_PKG_CALLBACK       walk_callback,
-       void                    *context)
-{
-       ACPI_STATUS             status = AE_OK;
-       ACPI_GENERIC_STATE      *state_list = NULL;
-       ACPI_GENERIC_STATE      *state;
-       u32                     this_index;
-       ACPI_OPERAND_OBJECT     *this_source_obj;
-
-
-       state = acpi_cm_create_pkg_state (source_object, target_object, 0);
-       if (!state) {
-               return (AE_NO_MEMORY);
-       }
-
-       while (state) {
-               this_index    = state->pkg.index;
-               this_source_obj = (ACPI_OPERAND_OBJECT *)
-                                 state->pkg.source_object->package.elements[this_index];
-
-               /*
-                * Check for
-                * 1) An uninitialized package element.  It is completely
-                *      legal to declare a package and leave it uninitialized
-                * 2) Not an internal object - can be a namespace node instead
-                * 3) Any type other than a package.  Packages are handled in else
-                *      case below.
-                */
-               if ((!this_source_obj) ||
-                       (!VALID_DESCRIPTOR_TYPE (
-                                       this_source_obj, ACPI_DESC_TYPE_INTERNAL)) ||
-                       (!IS_THIS_OBJECT_TYPE (
-                                       this_source_obj, ACPI_TYPE_PACKAGE))) {
-
-                       status = walk_callback (ACPI_COPY_TYPE_SIMPLE, this_source_obj,
-                                        state, context);
-                       if (ACPI_FAILURE (status)) {
-                               /* TBD: must delete package created up to this point */
-
-                               return (status);
-                       }
-
-                       state->pkg.index++;
-                       while (state->pkg.index >= state->pkg.source_object->package.count) {
-                               /*
-                                * We've handled all of the objects at this level,  This means
-                                * that we have just completed a package.  That package may
-                                * have contained one or more packages itself.
-                                *
-                                * Delete this state and pop the previous state (package).
-                                */
-                               acpi_cm_delete_generic_state (state);
-                               state = acpi_cm_pop_generic_state (&state_list);
-
-
-                               /* Finished when there are no more states */
-
-                               if (!state) {
-                                       /*
-                                        * We have handled all of the objects in the top level
-                                        * package just add the length of the package objects
-                                        * and exit
-                                        */
-                                       return (AE_OK);
-                               }
-
-                               /*
-                                * Go back up a level and move the index past the just
-                                * completed package object.
-                                */
-                               state->pkg.index++;
-                       }
-               }
-
-               else {
-                       /* This is a sub-object of type package */
-
-                       status = walk_callback (ACPI_COPY_TYPE_PACKAGE, this_source_obj,
-                                         state, context);
-                       if (ACPI_FAILURE (status)) {
-                               /* TBD: must delete package created up to this point */
-
-                               return (status);
-                       }
-
-
-                       /*
-                        * The callback above returned a new target package object.
-                        */
-
-                       /*
-                        * Push the current state and create a new one
-                        */
-                       acpi_cm_push_generic_state (&state_list, state);
-                       state = acpi_cm_create_pkg_state (this_source_obj,
-                                          state->pkg.this_target_obj, 0);
-                       if (!state) {
-                               /* TBD: must delete package created up to this point */
-
-                               return (AE_NO_MEMORY);
-                       }
-               }
-       }
-
-       /* We should never get here */
-
-       return (AE_AML_INTERNAL);
-
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    _Report_error
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Message             - Error message to use on failure
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print error message
- *
- ******************************************************************************/
-
-void
-_report_error (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id)
-{
-
-
-       acpi_os_printf ("%8s-%04d: *** Error: ", module_name, line_number);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    _Report_warning
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Message             - Error message to use on failure
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print warning message
- *
- ******************************************************************************/
-
-void
-_report_warning (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id)
-{
-
-       acpi_os_printf ("%8s-%04d: *** Warning: ", module_name, line_number);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    _Report_info
- *
- * PARAMETERS:  Module_name         - Caller's module name (for error output)
- *              Line_number         - Caller's line number (for error output)
- *              Component_id        - Caller's component ID (for error output)
- *              Message             - Error message to use on failure
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print information message
- *
- ******************************************************************************/
-
-void
-_report_info (
-       NATIVE_CHAR             *module_name,
-       u32                     line_number,
-       u32                     component_id)
-{
-
-       acpi_os_printf ("%8s-%04d: *** Info: ", module_name, line_number);
-}
-
-
diff --git a/reactos/drivers/bus/acpi/utils/cmxface.c b/reactos/drivers/bus/acpi/utils/cmxface.c
deleted file mode 100644 (file)
index ce5124b..0000000
+++ /dev/null
@@ -1,452 +0,0 @@
-/******************************************************************************
- *
- * Module Name: cmxface - External interfaces for "global" ACPI functions
- *              $Revision: 1.1 $
- *
- *****************************************************************************/
-
-/*
- *  Copyright (C) 2000, 2001 R. Byron Moore
- *
- *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include <acpi.h>
-
-#define _COMPONENT          ACPI_UTILITIES
-        MODULE_NAME         ("cmxface")
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_initialize_subsystem
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initializes all global variables.  This is the first function
- *              called, so any early initialization belongs here.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_initialize_subsystem (
-       void)
-{
-       ACPI_STATUS             status;
-
-
-       /* Initialize all globals used by the subsystem */
-
-       acpi_cm_init_globals ();
-
-       /* Initialize the OS-Dependent layer */
-
-       status = acpi_os_initialize ();
-       if (ACPI_FAILURE (status)) {
-               REPORT_ERROR (("OSD failed to initialize, %s\n",
-                       acpi_cm_format_exception (status)));
-               return (status);
-       }
-
-       /* Create the default mutex objects */
-
-       status = acpi_cm_mutex_initialize ();
-       if (ACPI_FAILURE (status)) {
-               REPORT_ERROR (("Global mutex creation failure, %s\n",
-                       acpi_cm_format_exception (status)));
-               return (status);
-       }
-
-       /*
-        * Initialize the namespace manager and
-        * the root of the namespace tree
-        */
-
-       status = acpi_ns_root_initialize ();
-       if (ACPI_FAILURE (status)) {
-               REPORT_ERROR (("Namespace initialization failure, %s\n",
-                       acpi_cm_format_exception (status)));
-               return (status);
-       }
-
-
-       /* If configured, initialize the AML debugger */
-
-       DEBUGGER_EXEC (acpi_db_initialize ());
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_enable_subsystem
- *
- * PARAMETERS:  Flags           - Init/enable Options
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Completes the subsystem initialization including hardware.
- *              Puts system into ACPI mode if it isn't already.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_enable_subsystem (
-       u32                     flags)
-{
-       ACPI_STATUS             status = AE_OK;
-
-
-       /* Sanity check the FADT for valid values */
-
-       status = acpi_cm_validate_fadt ();
-       if (ACPI_FAILURE (status)) {
-               return (status);
-       }
-
-       /*
-        * Install the default Op_region handlers. These are
-        * installed unless other handlers have already been
-        * installed via the Install_address_space_handler interface
-        */
-
-       if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
-               status = acpi_ev_install_default_address_space_handlers ();
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       /*
-        * We must initialize the hardware before we can enable ACPI.
-        */
-
-       if (!(flags & ACPI_NO_HARDWARE_INIT)) {
-               status = acpi_hw_initialize ();
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       /*
-        * Enable ACPI on this platform
-        */
-
-       if (!(flags & ACPI_NO_ACPI_ENABLE)) {
-               status = acpi_enable ();
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-       /*
-        * Note:
-        * We must have the hardware AND events initialized before we can execute
-        * ANY control methods SAFELY.  Any control method can require ACPI hardware
-        * support, so the hardware MUST be initialized before execution!
-        */
-
-       if (!(flags & ACPI_NO_EVENT_INIT)) {
-               status = acpi_ev_initialize ();
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-
-       /*
-        * Initialize all device objects in the namespace
-        * This runs the _STA and _INI methods.
-        */
-
-       if (!(flags & ACPI_NO_DEVICE_INIT)) {
-               status = acpi_ns_initialize_devices ();
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-
-       /*
-        * Initialize the objects that remain uninitialized.  This
-        * runs the executable AML that is part of the declaration of Op_regions
-        * and Fields.
-        */
-
-       if (!(flags & ACPI_NO_OBJECT_INIT)) {
-               status = acpi_ns_initialize_objects ();
-               if (ACPI_FAILURE (status)) {
-                       return (status);
-               }
-       }
-
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    Acpi_terminate
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Shutdown the ACPI subsystem.  Release all resources.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_terminate (void)
-{
-
-       /* Terminate the AML Debuger if present */
-
-       DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE);
-
-       /* TBD: [Investigate] This is no longer needed?*/
-/*    Acpi_cm_release_mutex (ACPI_MTX_DEBUG_CMD_READY); */
-
-
-       /* Shutdown and free all resources */
-
-       acpi_cm_subsystem_shutdown ();
-
-
-       /* Free the mutex objects */
-
-       acpi_cm_mutex_terminate ();
-
-
-       /* Now we can shutdown the OS-dependent layer */
-
-       acpi_os_terminate ();
-
-       return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_get_system_info
- *
- * PARAMETERS:  Out_buffer      - a pointer to a buffer to receive the
- *                                resources for the device
- *              Buffer_length   - the number of bytes available in the buffer
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function is called to get information about the current
- *              state of the ACPI subsystem.  It will return system information
- *              in the Out_buffer.
- *
- *              If the function fails an appropriate status will be returned
- *              and the value of Out_buffer is undefined.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_get_system_info (
-       ACPI_BUFFER             *out_buffer)
-{
-       ACPI_SYSTEM_INFO        *info_ptr;
-       u32                     i;
-
-
-       /*
-        *  Must have a valid buffer
-        */
-       if ((!out_buffer)         ||
-               (!out_buffer->pointer)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       if (out_buffer->length < sizeof (ACPI_SYSTEM_INFO)) {
-               /*
-                *  Caller's buffer is too small
-                */
-               out_buffer->length = sizeof (ACPI_SYSTEM_INFO);
-
-               return (AE_BUFFER_OVERFLOW);
-       }
-
-
-       /*
-        *  Set return length and get data
-        */
-       out_buffer->length = sizeof (ACPI_SYSTEM_INFO);
-       info_ptr = (ACPI_SYSTEM_INFO *) out_buffer->pointer;
-
-       info_ptr->acpi_ca_version   = ACPI_CA_VERSION;
-
-       /* System flags (ACPI capabilities) */
-
-       info_ptr->flags             = acpi_gbl_system_flags;
-
-       /* Timer resolution - 24 or 32 bits  */
-       if (!acpi_gbl_FADT) {
-               info_ptr->timer_resolution = 0;
-       }
-       else if (acpi_gbl_FADT->tmr_val_ext == 0) {
-               info_ptr->timer_resolution = 24;
-       }
-       else {
-               info_ptr->timer_resolution = 32;
-       }
-
-       /* Clear the reserved fields */
-
-       info_ptr->reserved1         = 0;
-       info_ptr->reserved2         = 0;
-
-       /* Current debug levels */
-
-       info_ptr->debug_layer       = acpi_dbg_layer;
-       info_ptr->debug_level       = acpi_dbg_level;
-
-       /* Current status of the ACPI tables, per table type */
-
-       info_ptr->num_table_types = NUM_ACPI_TABLES;
-       for (i = 0; i < NUM_ACPI_TABLES; i++) {
-               info_ptr->table_info[i].count = acpi_gbl_acpi_tables[i].count;
-       }
-
-       return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION:    Acpi_format_exception
- *
- * PARAMETERS:  Out_buffer      - a pointer to a buffer to receive the
- *                                exception name
- *
- * RETURN:      Status          - the status of the call
- *
- * DESCRIPTION: This function translates an ACPI exception into an ASCII string.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-acpi_format_exception (
-       ACPI_STATUS             exception,
-       ACPI_BUFFER             *out_buffer)
-{
-       u32                     length;
-       NATIVE_CHAR             *formatted_exception;
-
-
-       /*
-        *  Must have a valid buffer
-        */
-       if ((!out_buffer)         ||
-               (!out_buffer->pointer)) {
-               return (AE_BAD_PARAMETER);
-       }
-
-
-       /* Convert the exception code (Handles bad exception codes) */
-
-       formatted_exception = acpi_cm_format_exception (exception);
-
-       /*
-        * Get length of string and check if it will fit in caller's buffer
-        */
-
-       length = STRLEN (formatted_exception);
-       if (out_buffer->length < length) {
-               out_buffer->length = length;
-               return (AE_BUFFER_OVERFLOW);
-       }
-
-
-       /* Copy the string, all done */
-
-       STRCPY (out_buffer->pointer, formatted_exception);
-
-       return (AE_OK);
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_allocate
- *
- * PARAMETERS:  Size                - Size of the allocation
- *
- * RETURN:      Address of the allocated memory on success, NULL on failure.
- *
- * DESCRIPTION: The subsystem's equivalent of malloc.
- *              External front-end to the Cm* memory manager
- *
- ****************************************************************************/
-
-void *
-acpi_allocate (
-       u32                     size)
-{
-
-       return (acpi_cm_allocate (size));
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_callocate
- *
- * PARAMETERS:  Size                - Size of the allocation
- *
- * RETURN:      Address of the allocated memory on success, NULL on failure.
- *
- * DESCRIPTION: The subsystem's equivalent of calloc.
- *              External front-end to the Cm* memory manager
- *
- ****************************************************************************/
-
-void *
-acpi_callocate (
-       u32                     size)
-{
-
-       return (acpi_cm_callocate (size));
-}
-
-
-/*****************************************************************************
- *
- * FUNCTION:    Acpi_free
- *
- * PARAMETERS:  Address             - Address of the memory to deallocate
- *
- * RETURN:      None
- *
- * DESCRIPTION: Frees the memory at Address
- *              External front-end to the Cm* memory manager
- *
- ****************************************************************************/
-
-void
-acpi_free (
-       void                    *address)
-{
-
-       acpi_cm_free (address);
-}
index 003dbe8..59697b9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __ISAPNP_H
-#define __ISAPNP_H
+#pragma once
 
 #include <ntddk.h>
 
@@ -337,5 +336,3 @@ DriverEntry(
 #ifdef __cplusplus
 }
 #endif
-
-#endif  /*  __ISAPNP_H  */
index 5cd7e53..2c40433 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __PCI_H
-#define __PCI_H
+#pragma once
 
 #include <ntifs.h>
 #include <wdmguid.h>
@@ -175,5 +174,3 @@ NTAPI
 DriverEntry(
   IN PDRIVER_OBJECT DriverObject,
   IN PUNICODE_STRING RegistryPath);
-
-#endif  /*  __PCI_H  */
index 75b6a49..34407c4 100644 (file)
@@ -17,8 +17,7 @@
  *    Casper S. Hornstrup (chorns@users.sourceforge.net)
  */
 
-#ifndef _PCIDEF_H
-#define _PCIDEF_H
+#pragma once
 
 /*
  * Under PCI, each device has 256 bytes of configuration address space,
 #define PCI_NUM_RESOURCES 11
 
 #define PCI_REGION_FLAG_MASK 0x0f      /* These bits of resource flags tell us the PCI region flags */
-
-#endif /* _PCIDEF_H */
index 850deb3..04d6ae9 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE group SYSTEM "../tools/rbuild/project.dtd">
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
 <group xmlns:xi="http://www.w3.org/2001/XInclude">
 <directory name="dxapi">
        <xi:include href="dxapi/dxapi.rbuild" />
index b7bd1d0..010702c 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <module name="dxapi" type="kernelmodedriver"
 installbase="system32/drivers" installname="dxapi.sys">
        <importlibrary definition="dxapi.spec" />
index 9f0cd81..3303dc5 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <module name="dxg" type="kernelmodedriver" installbase="system32/drivers" installname="dxg.sys">
        <importlibrary definition="dxg.spec" />
        <include base="dxg">.</include>
index 4bf33cb..924c3c9 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <module name="dxgthk" type="kernelmodedriver"
 installbase="system32/drivers" installname="dxgthk.sys">
        <importlibrary definition="dxgthk.spec" />
index 5cc82ca..970810f 100644 (file)
@@ -4,6 +4,9 @@
 <directory name="base">
        <xi:include href="base/directory.rbuild" />
 </directory>
+<directory name="battery">
+       <xi:include href="battery/directory.rbuild" />
+</directory>
 <directory name="bus">
        <xi:include href="bus/directory.rbuild" />
 </directory>
index 8b47aa8..c76f04f 100644 (file)
@@ -33,8 +33,6 @@
 #define  CACHEPAGESIZE(pDeviceExt) ((pDeviceExt)->FatInfo.BytesPerCluster > PAGE_SIZE ? \
                                     (pDeviceExt)->FatInfo.BytesPerCluster : PAGE_SIZE)
 
-#define VOLUME_IS_DIRTY 0x00000001
-
 static NTSTATUS
 VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount,
                   PBOOLEAN RecognizedFS,
index 3e240c3..222755d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __FAT_H__
-#define __FAT_H__
+#pragma once
 
 //
 //  Might be a good idea to have this as a shared
@@ -288,5 +287,3 @@ typedef struct _LONG_FILE_NAME_ENTRY {
                                           FAT_DIRENT_ATTR_HIDDEN |    \
                                           FAT_DIRENT_ATTR_SYSTEM |    \
                                           FAT_DIRENT_ATTR_VOLUME_ID)
-
-#endif//__FAT_H__
index 50661e1..dff04c5 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __STRUCT_H__
-#define __STRUCT_H__
+#pragma once
 
 typedef struct _FAT_SCAN_CONTEXT *PFAT_SCAN_CONTEXT;
 typedef struct _FAT_IO_CONTEXT *PFAT_IO_CONTEXT;
@@ -404,5 +403,3 @@ typedef enum _FILE_TIME_INDEX
 #define CCB_SEARCH_PATTERN_HAS_WILD_CARD    0x04
 #define CCB_DASD_IO                         0x10
 extern FAT_GLOBAL_DATA FatGlobalData;
-
-#endif//__STRUCT_H__ 
index 39a42ad..7eca3a2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef MUP_H
-#define MUP_H
+#pragma once
 
 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
 
@@ -24,5 +23,3 @@ MupCreate(PDEVICE_OBJECT DeviceObject,
 NTSTATUS NTAPI
 DriverEntry(PDRIVER_OBJECT DriverObject,
            PUNICODE_STRING RegistryPath);
-
-#endif /* MUP_H */
index e3f6478..035feaf 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _I8042PRT_H_
-#define _I8042PRT_H_
+#pragma once
 
 #include <ntifs.h>
 #include <kbdmou.h>
@@ -452,5 +451,3 @@ NTSTATUS
 i8042AddLegacyKeyboard(
        IN PDRIVER_OBJECT DriverObject,
        IN PUNICODE_STRING RegistryPath);
-
-#endif // _I8042PRT_H_
index 8921caf..96d763a 100644 (file)
@@ -9,7 +9,7 @@
 
 #include "priv.h"
 
-const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46}};
+const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
 
 /* http://msdn2.microsoft.com/en-us/library/ms809781.aspx */
 COMDDKAPI NTSTATUS NTAPI
index 99f0b20..3395a94 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef KSFUNC_H__
-#define KSFUNC_H__
+#pragma once
 
 #include "ksiface.h"
 #include "kstypes.h"
@@ -145,6 +144,3 @@ KspPropertyHandler(
     IN  const KSPROPERTY_SET* PropertySet,
     IN  PFNKSALLOCATOR Allocator OPTIONAL,
     IN  ULONG PropertyItemSize OPTIONAL);
-
-
-#endif
index 8954528..ffea3ed 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef KSIFACE_H__
-#define KSIFACE_H__
+#pragma once
 
 #include <ntddk.h>
 #include <ks.h>
@@ -308,5 +307,3 @@ DECLARE_INTERFACE_(IKsDevice, IUnknown)
     STDMETHOD_(NTSTATUS, CheckIoCapability)(THIS_
         IN ULONG Unknown)PURE;
 };
-
-#endif
index 503fc01..a24464e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef KSTYPES_H__
-#define KSTYPES_H__
+#pragma once
 
 #include <ntddk.h>
 #include <ks.h>
@@ -158,6 +157,3 @@ typedef struct
 
     WCHAR BusIdentifier[1];
 }BUS_ENUM_DEVICE_EXTENSION, *PBUS_ENUM_DEVICE_EXTENSION;
-
-
-#endif
index 6b9aced..cc0b8f9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef PRIV_H__
-#define PRIV_H__
+#pragma once
 
 #define _KSDDK_
 
@@ -36,5 +35,3 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
     DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\
     DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\
 }
-
-#endif
index 6a357ef..5706a0c 100644 (file)
@@ -1,13 +1,7 @@
-#ifndef PRECOMP_H__
-#define PRECOMP_H__
+#pragma once
 
 #include <ntddk.h>
 #include <windef.h>
 #include <ks.h>
 #include <swenum.h>
 #include <debug.h>
-
-
-
-
-#endif
index e5e2a5b..03a8c0b 100644 (file)
@@ -9,8 +9,7 @@
  *                       Sept 26, 2003: Created
  */
 
-#ifndef __INCLUDES_MPU401_H__
-#define __INCLUDES_MPU401_H__
+#pragma once
 
 //#include <mmsystem.h>
 //#include <mmddk.h>
@@ -151,5 +150,3 @@ NTSTATUS NTAPI LoadSettings(
 NTSTATUS NTAPI
 DriverEntry(PDRIVER_OBJECT DriverObject,
            PUNICODE_STRING RegistryPath);
-
-#endif
index 16bfa09..31f3474 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef SNDBLST_H
-#define SNDBLST_H
+#pragma once
 
 #include <debug.h>
 #include <ntddk.h>
@@ -151,5 +150,3 @@ StartSoundOutput(
 NTSTATUS
 EnableIrq(
     PDEVICE_OBJECT DeviceObject);
-
-#endif
index 8afd207..6d6e3b1 100644 (file)
@@ -9,8 +9,7 @@
  *                       Sept 28, 2003: Created
  */
 
-#ifndef __INCLUDES_SNDBLST_H__
-#define __INCLUDES_SNDBLST_H__
+#pragma once
 
 #include <ntddk.h>
 
@@ -172,5 +171,3 @@ VOID SetOutputSampleRate(ULONG BasePort, ULONG SampleRate);
 VOID EnableSpeaker(ULONG BasePort, BOOLEAN SpeakerOn);
 BOOLEAN IsSpeakerEnabled(ULONG BasePort);
 VOID BeginPlayback(ULONG BasePort, ULONG BitDepth, ULONG Channels, ULONG BlockSize);
-
-#endif
index dda9c1b..927bc96 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef PRECOMP_H__
-#define PRECOMP_H__
+#pragma once
 
 #include <ntddk.h>
 #include <windef.h>
@@ -38,7 +37,3 @@ AllocateItem(
 VOID
 FreeItem(
     IN PVOID Item);
-
-
-
-#endif
index ab8868f..40fa87e 100644 (file)
@@ -8,9 +8,6 @@
  *   25/05/2008 Created
  */
 
-#ifndef _ACDAPI_H
-#define _ACDAPI_H
+#pragma once
 
 #define FILE_DEVICE_RASACD 0xf1
-
-#endif /* _ACDAPI_H */
index 6127fa4..f4ed29a 100644 (file)
@@ -6,8 +6,8 @@
  * DEFINES:     DBG     - Enable debug output
  *              NASSERT - Disable assertions
  */
-#ifndef __DEBUG_H
-#define __DEBUG_H
+
+#pragma once
 
 #define NORMAL_MASK    0x000000FF
 #define SPECIAL_MASK   0xFFFFFF00
@@ -89,6 +89,4 @@ extern DWORD DebugTraceLevel;
 
 #define CP CHECKPOINT
 
-#endif /* __DEBUG_H */
-
 /* EOF */
index 93354ba..a70c810 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _TDI_PROTO_H
-#define _TDI_PROTO_H
+#pragma once
 
 NTSTATUS TdiConnect( PIRP *PendingIrp,
                     PFILE_OBJECT ConnectionObject,
@@ -45,5 +44,3 @@ NTSTATUS TdiQueryDeviceControl(
     PVOID OutputBuffer,
     ULONG OutputBufferLength,
     PULONG Return);
-
-#endif/*_TDI_PROTO_H*/
index 0ada133..54f83fc 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _TDICONN_H
-#define _TDICONN_H
+#pragma once
 
 #ifdef _MSC_VER
 #include <ntddtdi.h>
@@ -29,5 +28,3 @@ NTSTATUS TdiBuildConnectionInfoPair
   PTRANSPORT_ADDRESS From,
   PTRANSPORT_ADDRESS To );
 PTA_ADDRESS TdiGetRemoteAddress( PTDI_CONNECTION_INFORMATION TdiConn );
-
-#endif/*_TDICONN_H*/
index 29c724e..7776bc7 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/8390.h
  * PURPOSE:     National Semiconductor 8390 NIC definitions
  */
-#ifndef __8390_H
-#define __8390_H
+
+#pragma once
 
 /* Page 0 register layout (PS1 = 0, PS0 = 0) */
 #define PG0_CR      0x00    /* Command Register (R/W) */
@@ -169,6 +169,4 @@ typedef struct _DISCARD_HEADER {
 VOID NTAPI MiniportHandleInterrupt(
     IN  NDIS_HANDLE MiniportAdapterContext);
 
-#endif /* __8390_H */
-
 /* EOF */
index 9f352f6..f495766 100644 (file)
@@ -6,8 +6,8 @@
  * DEFINES:     DBG     - Enable debug output
  *              NASSERT - Disable assertions
  */
-#ifndef __DEBUG_H
-#define __DEBUG_H
+
+#pragma once
 
 #define NORMAL_MASK    0x000000FF
 #define SPECIAL_MASK   0xFFFFFF00
@@ -79,6 +79,4 @@ extern ULONG DebugTraceLevel;
 #define CHECKPOINT \
     do { NDIS_DbgPrint(MIN_TRACE, ("%s:%d\n", __FILE__, __LINE__)); } while(0);
 
-#endif /* __DEBUG_H */
-
 /* EOF */
index 44d4de3..4c4e28b 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/ne2000.h
  * PURPOSE:     NE2000 driver definitions
  */
-#ifndef __NE2000_H
-#define __NE2000_H
+
+#pragma once
 
 #define NDIS_MINIPORT_DRIVER 1
 #define NDIS_LEGACY_MINIPORT 1
@@ -246,6 +246,4 @@ VOID NICWriteData(
 VOID NICTransmit(
     PNIC_ADAPTER Adapter);
 
-#endif /* __NE2000_H */
-
 /* EOF */
index db0b801..d30a251 100644 (file)
@@ -23,8 +23,7 @@
  *     01-Sept-2003 vizzini - Created
  */
 
-#ifndef _PCI_
-#define _PCI_
+#pragma once
 
 /* PCI Config Space Offset Definitions */
 #define PCI_PCIID    0x0        /* pci id - query 32 bits */
@@ -67,5 +66,3 @@
 #define PCI_RTABORT  0x1000     /* received target abort */
 #define PCI_SERR     0x2000     /* signalled error */
 #define PCI_PERR     0x4000     /* parity error */
-
-#endif /* _PCI_ */
index ebf8980..1a23ba5 100644 (file)
@@ -25,8 +25,7 @@
  *     - this assumes 32-bit physical addresses
  */
 
-#ifndef _PCNET_H_
-#define _PCNET_H_
+#pragma once
 
 /* statistics struct */
 typedef struct _ADAPTER_STATS
@@ -160,6 +159,3 @@ MiGetMediaDuplex(PADAPTER Adapter);
 
 /* memory pool tag */
 #define PCNET_TAG 'tNcP'
-
-#endif // _PCNET_H_
-
index 9e045c5..be79003 100644 (file)
@@ -26,8 +26,7 @@
  *       PCNet II chip documentation (Am79C790A, pub# 19436).
  */
 
-#ifndef _PCNETHW_
-#define _PCNETHW_
+#pragma once
 
 /* when in 32-bit mode, most registers require the top 16 bits be 0. */
 #define MASK16(__x__) ((__x__) & 0x0000ffff)
@@ -414,5 +413,3 @@ typedef struct _TRANSMIT_DESCRIPTOR
 #define TD2_EXDEF       0x2000  /* excessive deferral */
 #define TD2_UFLO        0x4000  /* buffer underflow */
 #define TD2_BUFF        0x8000  /* buffer error */
-
-#endif /* _PCNETHW_ */
index bef2357..fc72311 100644 (file)
@@ -6,8 +6,8 @@
  * DEFINES:     DBG     - Enable debug output
  *              NASSERT - Disable assertions
  */
-#ifndef __DEBUG_H
-#define __DEBUG_H
+
+#pragma once
 
 #define NORMAL_MASK    0x000000FF
 #define SPECIAL_MASK   0xFFFFFF00
@@ -96,7 +96,3 @@ extern DWORD DebugTraceLevel;
 #define CP CHECKPOINT
 
 #include <memtrack.h>
-
-#endif /* __DEBUG_H */
-
-/* EOF */
index 431441f..fb7e1e0 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/lan.h
  * PURPOSE:     LAN adapter definitions
  */
-#ifndef __LAN_H
-#define __LAN_H
+
+#pragma once
 
 /* NDIS version this driver supports */
 #define NDIS_VERSION_MAJOR 4
@@ -161,6 +161,4 @@ VOID CloseNdisPools();
 
 PLAN_ADAPTER FindAdapterByIndex( PLAN_DEVICE_EXT DeviceExt, UINT Index );
 
-#endif /* __LAN_H */
-
 /* EOF */
index 62f45cc..a5b7dfd 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef MEMTRACK_H
-#define MEMTRACK_H
+#pragma once
 
 #ifndef FOURCC
 #define FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
@@ -19,5 +18,3 @@
 #define exFreePool(x) ExFreePool(x)
 #define TrackWithTag(w,x,y,z)
 #define UntrackFL(x,y,z)
-
-#endif/*MEMMTRAC_H*/
index c61a734..0a3223a 100644 (file)
@@ -1,4 +1,4 @@
-#ifndef _NET_LAN_H
+#pragma once
 
 #include "net_wh.h"
 
@@ -75,5 +75,3 @@ typedef struct _LAN_ADAPTER_INFO_S {
                   (Types), \
                   sizeof(USHORT) * (NumTypes) ); \
   }
-
-#endif/*_NET_LAN_H*/
index b277271..b473613 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _NET_WH_H
-#define _NET_WH_H
+#pragma once
 
 #ifdef i386
 
@@ -46,5 +45,3 @@
     (w)
 
 #endif /* i386 */
-
-#endif/*_NET_WH_H*/
index 31c1479..33626a9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _LAN_PRECOMP_H
-#define _LAN_PRECOMP_H
+#pragma once
 
 #include <limits.h>
 #include <ntddk.h>
@@ -8,5 +7,3 @@
 #include <pseh.h>
 #include "net_lan.h"
 #include "lan.h"
-
-#endif/*_LAN_PRECOMP_H*/
index 62f9fce..b938ced 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/buffer.h
  * PURPOSE:     Buffer management routine definitions
  */
-#ifndef __BUFFER_H
-#define __BUFFER_H
+
+#pragma once
 
 #include "ndissys.h"
 
@@ -57,6 +57,4 @@ UINT CopyPacketToBufferChain(
     UINT SrcOffset,
     UINT Length);
 
-#endif /* __BUFFER_H */
-
 /* EOF */
index 7a4c40e..32cf70f 100644 (file)
@@ -5,8 +5,8 @@
  * PURPOSE:     Debugging support macros
  * DEFINES:     DBG     - Enable debug output
  */
-#ifndef __DEBUG_H
-#define __DEBUG_H
+
+#pragma once
 
 #define NORMAL_MASK    0x000000FF
 #define SPECIAL_MASK   0xFFFFFF00
@@ -68,6 +68,4 @@ extern ULONG DebugTraceLevel;
 
 #define CP CHECKPOINT
 
-#endif /* __DEBUG_H */
-
 /* EOF */
index 96d095d..3b564f7 100644 (file)
@@ -5,8 +5,7 @@
  * PURPOSE:     Definitions for Ethernet filter
  */
 
-#ifndef __EFILTER_H
-#define __EFILTER_H
+#pragma once
 
 #define DECLARE_UNKNOWN_STRUCT(BaseName) \
   typedef struct _##BaseName BaseName, *P##BaseName;
@@ -76,7 +75,4 @@ NTAPI
 EthFilterDprIndicateReceiveComplete(
     IN  PETH_FILTER Filter);
 
-#endif /* __EFILTER_H */
-
 /* EOF */
-
index 32aab60..7dd615d 100644 (file)
@@ -5,8 +5,7 @@
  * PURPOSE:     Definitions for routines used by NDIS miniport drivers
  */
 
-#ifndef __MINIPORT_H
-#define __MINIPORT_H
+#pragma once
 
 #include <ndis.h>
 #include <ndissys.h>
@@ -197,7 +196,4 @@ VOID
 MiniDoAddressingReset(
     PLOGICAL_ADAPTER Adapter);
 
-#endif /* __MINIPORT_H */
-
 /* EOF */
-
index ecebc2d..99f92ea 100644 (file)
@@ -5,8 +5,7 @@
  * PURPOSE:     Definitions for routines used by NDIS protocol drivers
  */
 
-#ifndef __PROTOCOL_H
-#define __PROTOCOL_H
+#pragma once
 
 typedef struct _PROTOCOL_BINDING {
     LIST_ENTRY                    ListEntry;        /* Entry on global list */
@@ -70,7 +69,4 @@ NdisIPnPCancelStopDevice(
 NDIS_STATUS
 proSendPacketToMiniport(PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet);
 
-#endif /* __PROTOCOL_H */
-
 /* EOF */
-
index 1bd1dbd..7a9dacf 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/address.h
  * PURPOSE:     Address manipulation prototypes
  */
-#ifndef __ADDRESS_H
-#define __ADDRESS_H
+
+#pragma once
 
 /*
  * Initialize an IPv4 style address
@@ -75,6 +75,4 @@ UINT AddrCountPrefixBits( PIP_ADDRESS Netmask );
 VOID AddrWidenAddress( PIP_ADDRESS Network, PIP_ADDRESS Source,
                       PIP_ADDRESS Netmask );
 
-#endif /* __ADDRESS_H */
-
 /* EOF */
index dd9f23a..710cbdb 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/arp.h
  * PURPOSE:     Address Resolution Protocol definitions
  */
-#ifndef __ARP_H
-#define __ARP_H
+
+#pragma once
 
 typedef struct ARP_HEADER {
     USHORT HWType;       /* Hardware Type */
@@ -30,6 +30,4 @@ VOID ARPReceive(
     PVOID Context,
     PIP_PACKET Packet);
 
-#endif /* __ARP_H */
-
 /* EOF */
index 3ee66ae..0eb4910 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/checksum.h
  * PURPOSE:     Checksum routine definitions
  */
-#ifndef __CHECKSUM_H
-#define __CHECKSUM_H
+
+#pragma once
 
 
 ULONG ChecksumFold(
@@ -48,5 +48,3 @@ UDPv4ChecksumCalculate(
     (BOOLEAN)(TCPv4Checksum(Data, Count, \
       TCPv4Checksum(TcpPseudoHeader, sizeof(TCPv4_PSEUDO_HEADER), \
       0)) == DH2N(0x0000FFFF))
-
-#endif /* __CHECKSUM_H */
index f05107a..29cf82d 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/datagram.h
  * PURPOSE:     Datagram types and constants
  */
-#ifndef __DATAGRAM_H
-#define __DATAGRAM_H
+
+#pragma once
 
 #include <titypes.h>
 
@@ -34,6 +34,4 @@ VOID DGDeliverData(
   PIP_PACKET IPPacket,
   UINT DataSize);
 
-#endif /* __DATAGRAM_H */
-
 /* EOF */
index 7f6d86b..303d66a 100644 (file)
@@ -6,8 +6,8 @@
  * DEFINES:     DBG     - Enable debug output
  *              NASSERT - Disable assertions
  */
-#ifndef __DEBUG_H
-#define __DEBUG_H
+
+#pragma once
 
 #define MIN_TRACE      ((1 << DPFLTR_WARNING_LEVEL))
 #define MID_TRACE      ((1 << DPFLTR_WARNING_LEVEL) | (1 << DPFLTR_TRACE_LEVEL))
@@ -75,6 +75,4 @@
    ASSERT(((PVOID)_x) != (PVOID)0xcccccccc); \
    ASSERT(((PVOID)_x) >= (PVOID)0x80000000);
 
-#endif /* __DEBUG_H */
-
 /* EOF */
index 6be0f26..9effe5f 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/dispatch.h
  * PURPOSE:     Dispatch routine prototypes
  */
-#ifndef __DISPATCH_H
-#define __DISPATCH_H
+
+#pragma once
 
 typedef struct _DISCONNECT_TYPE {
     UINT Type;
@@ -74,6 +74,4 @@ VOID DispDoDisconnect(
 
 NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status );
 
-#endif /* __DISPATCH_H */
-
 /* EOF */
index 1232770..d45ec7b 100644 (file)
@@ -4,9 +4,8 @@
  * FILE:        include/fileobjs.h
  * PURPOSE:     File object routine prototypes
  */
-#ifndef __FILEOBJS_H
-#define __FILEOBJS_H
 
+#pragma once
 
 extern LIST_ENTRY AddressFileListHead;
 extern KSPIN_LOCK AddressFileListLock;
@@ -35,6 +34,4 @@ NTSTATUS FileOpenControlChannel(
 NTSTATUS FileCloseControlChannel(
   PTDI_REQUEST Request);
 
-#endif /* __FILEOBJS_H */
-
 /* EOF */
index bb0e28a..aaaefa2 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/icmp.h
  * PURPOSE:     Internet Control Message Protocol definitions
  */
-#ifndef __ICMP_H
-#define __ICMP_H
+
+#pragma once
 
 typedef struct ICMP_HEADER {
     UCHAR Type;      /* ICMP message type */
@@ -74,6 +74,4 @@ VOID ICMPReply(
     UCHAR Type,
     UCHAR Code);
 
-#endif /* __ICMP_H */
-
 /* EOF */
index ee8a6d1..a05b0b2 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/info.h
  * PURPOSE:     TdiQueryInformation definitions
  */
-#ifndef __INFO_H
-#define __INFO_H
+
+#pragma once
 
 #include <tcpioctl.h>
 
@@ -194,6 +194,4 @@ VOID AddEntity(ULONG EntityType,
 
 VOID RemoveEntityByContext(PVOID Context);
 
-#endif /* __INFO_H */
-
 /* EOF */
index 18b69b4..c79bcab 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _TCPIP_INTERFACE_H
-#define _TCPIP_INTERFACE_H
+#pragma once
 
 #include <ip.h>
 
@@ -16,5 +15,3 @@ NTSTATUS GetInterfaceName( PIP_INTERFACE Interface, PCHAR NameBuffer,
 NTSTATUS GetInterfaceConnectionStatus( PIP_INTERFACE Interface,
                                        PULONG OperStatus );
 PIP_INTERFACE FindOnLinkInterface(PIP_ADDRESS Address);
-
-#endif//_TCPIP_INTERFACE_H
index 068992f..dc6898d 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/ip.h
  * PURPOSE:     Internet Protocol related definitions
  */
-#ifndef __IP_H
-#define __IP_H
+
+#pragma once
 
 typedef VOID (*OBJECT_FREE_ROUTINE)(PVOID Object);
 
@@ -246,8 +246,4 @@ NTSTATUS IPStartup(PUNICODE_STRING RegistryPath);
 
 NTSTATUS IPShutdown(VOID);
 
-
-
-#endif /* __IP_H */
-
 /* EOF */
index 7cdf49a..226d354 100644 (file)
@@ -4,9 +4,8 @@
  * FILE:        include/lan.h
  * PURPOSE:     LAN adapter definitions
  */
-#ifndef __LAN_H
-#define __LAN_H
 
+#pragma once
 
 /* Media we support */
 #define MEDIA_ETH 0
@@ -108,6 +107,4 @@ NDIS_STATUS NDISCall(
     PVOID Buffer,
     UINT Length);
 
-#endif /* __LAN_H */
-
 /* EOF */
index a4f3bf3..9c4ad1c 100755 (executable)
@@ -1,5 +1,4 @@
-#ifndef _LINUX_TYPES_H
-#define _LINUX_TYPES_H
+#pragma once
 
 #include <ntddk.h>
 
@@ -1872,5 +1871,3 @@ struct pollfd {
 };
 
 #endif /* poll */
-
-#endif /* _LINUX_TYPES_H */
index 31ed91a..cac01eb 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _LOCK_H
-#define _LOCK_H
+#pragma once
 
 extern KIRQL TcpipGetCurrentIrql();
 extern VOID TcpipInitializeSpinLock( PKSPIN_LOCK SpinLock );
@@ -12,5 +11,3 @@ extern VOID TcpipInterlockedInsertTailList( PLIST_ENTRY ListHead,
                                            PKSPIN_LOCK Lock );
 extern VOID TcpipAcquireFastMutex( PFAST_MUTEX Mutex );
 extern VOID TcpipReleaseFastMutex( PFAST_MUTEX Mutex );
-
-#endif/*_LOCK_H*/
index 02ba55f..9988a26 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/loopback.h
  * PURPOSE:     Loopback adapter definitions
  */
-#ifndef __LOOPBACK_H
-#define __LOOPBACK_H
+
+#pragma once
 
 #include <lan.h>
 
@@ -18,6 +18,4 @@ NDIS_STATUS LoopRegisterAdapter(
 NDIS_STATUS LoopUnregisterAdapter(
     PLAN_ADAPTER Adapter);
 
-#endif /* __LOOPBACK_H */
-
 /* EOF */
index 6f125f0..d35f641 100644 (file)
@@ -4,9 +4,8 @@
  * FILE:        include/neighbor.h
  * PURPOSE:     Neighbor definitions
  */
-#ifndef __NEIGHBOR_H
-#define __NEIGHBOR_H
 
+#pragma once
 
 #define NB_HASHMASK 0xF /* Hash mask for neighbor cache */
 
@@ -103,6 +102,4 @@ ULONG NBCopyNeighbors(
 VOID NBResetNeighborTimeout(
     PIP_ADDRESS Address);
 
-#endif /* __NEIGHBOR_H */
-
 /* EOF */
index 846fcea..93db980 100644 (file)
@@ -4,12 +4,10 @@
  * FILE:        include/pool.h
  * PURPOSE:     Prototypes for memory pooling
  */
-#ifndef __POOL_H
-#define __POOL_H
+
+#pragma once
 
 NDIS_STATUS PrependPacket( PNDIS_PACKET Packet, PCHAR Data, UINT Len,
                           BOOLEAN Copy );
 
-#endif /* __POOL_H */
-
 /* EOF */
index 3be3590..f63332b 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef _TCPIP_PORTS_H
-#define _TCPIP_PORTS_H
-
 /*
  * COPYRIGHT:   See COPYING in the top level directory
  * PROJECT:     ReactOS TCP/IP protocol driver
@@ -11,6 +8,8 @@
  *   arty 20041114 Created
  */
 
+#pragma once
+
 typedef struct _PORT_SET {
     RTL_BITMAP ProtoBitmap;
     PVOID ProtoBitBuffer;
@@ -27,5 +26,3 @@ VOID DeallocatePort( PPORT_SET PortSet, ULONG Port );
 BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port );
 ULONG AllocateAnyPort( PPORT_SET PortSet );
 ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest );
-
-#endif/*_TCPIP_PORTS_H*/
index 872dec5..821fdb4 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/rawip.h
  * PURPOSE:     Raw IP types and constants
  */
-#ifndef __RAWIP_H
-#define __RAWIP_H
+
+#pragma once
 
 NTSTATUS RawIPSendDatagram(
     PADDRESS_FILE AddrFile,
@@ -36,6 +36,4 @@ NTSTATUS AddGenericHeaderIPv4(
     UINT ExtraLength,
     PVOID *NextHeader );
 
-#endif /* __RAWIP_H */
-
 /* EOF */
index 2681732..6f78828 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/receive.h
  * PURPOSE:     Internet Protocol receive prototypes
  */
-#ifndef __RECEIVE_H
-#define __RECEIVE_H
+
+#pragma once
 
 #include <ip.h>
 
@@ -61,6 +61,4 @@ VOID IPReceive(
     PIP_INTERFACE IF,
     PIP_PACKET IPPacket);
 
-#endif /* __RECEIVE_H */
-
 /* EOF */
index 19f1323..b92c984 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/route.h
  * PURPOSE:     Routing cache definitions
  */
-#ifndef __ROUTE_H
-#define __ROUTE_H
+
+#pragma once
 
 #include <neighbor.h>
 #include <address.h>
@@ -16,6 +16,4 @@
 
 PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination(PIP_ADDRESS Destination);
 
-#endif /* __ROUTE_H */
-
 /* EOF */
index 73d2409..6b2b2bb 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/router.h
  * PURPOSE:     IP routing definitions
  */
-#ifndef __ROUTER_H
-#define __ROUTER_H
+
+#pragma once
 
 #include <neighbor.h>
 
@@ -47,6 +47,4 @@ UINT CountFIBs(PIP_INTERFACE IF);
 
 UINT CopyFIBs( PIP_INTERFACE IF, PFIB_ENTRY Target );
 
-#endif /* __ROUTER_H */
-
 /* EOF */
index 1fda0e5..2234442 100644 (file)
@@ -4,9 +4,8 @@
  * FILE:        include/routines.h
  * PURPOSE:     Common routine prototypes
  */
-#ifndef __ROUTINES_H
-#define __ROUTINES_H
 
+#pragma once
 
 UINT Random(VOID);
 
@@ -71,6 +70,4 @@ VOID DisplayTCPPacket(
 #define DISPLAY_TCP_PACKET(x)
 #endif /* DBG */
 
-#endif /* __ROUTINES_H */
-
 /* EOF */
index 52c16a4..bd55276 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/tags.h
  * PURPOSE:     Memory tags
  */
-#ifndef __TAGS_H
-#define __TAGS_H
+
+#pragma once
 
 #define CONN_ENDPT_TAG 'pEnC'
 #define ADDR_FILE_TAG 'FrdA'
@@ -35,5 +35,3 @@
 #define OSK_SMALL_TAG 'SKSO'
 #define LAN_ADAPTER_TAG ' NAL'
 #define WQ_CONTEXT_TAG 'noCW'
-
-#endif
index 4b5318f..637900a 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/tcp.h
  * PURPOSE:     Transmission Control Protocol definitions
  */
-#ifndef __TCP_H
-#define __TCP_H
+
+#pragma once
 
 typedef VOID
 (*PTCP_COMPLETION_ROUTINE)( PVOID Context, NTSTATUS Status, ULONG Count );
@@ -181,5 +181,3 @@ NTSTATUS TCPShutdown(
   VOID);
 
 BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Connection, PIRP Irp );
-
-#endif /* __TCP_H */
index 9478c81..5034e85 100755 (executable)
@@ -24,8 +24,8 @@
  *             as published by the Free Software Foundation; either version
  *             2 of the License, or (at your option) any later version.
  */
-#ifndef __TCPCORE_H
-#define __TCPCORE_H
+
+#pragma once
 
 #include "tcpdef.h"
 
@@ -3853,4 +3853,3 @@ static __inline int tcp_paws_check(struct tcp_opt *tp, int rst)
 
 //
 #endif
-#endif
index e70e5ad..fa77e9f 100755 (executable)
@@ -14,8 +14,8 @@
  *             as published by the Free Software Foundation; either version
  *             2 of the License, or (at your option) any later version.
  */
-#ifndef _LINUX_TCP_H
-#define _LINUX_TCP_H
+
+#pragma once
 
 #include "linux.h"
 
@@ -183,5 +183,3 @@ struct tcp_info
        __u32   tcpi_advmss;
        __u32   tcpi_reordering;
 };
-
-#endif /* _LINUX_TCP_H */
index a9fefc9..563e662 100644 (file)
@@ -11,8 +11,8 @@
  *                - Neighbor cache lock
  *                - Route cache lock
  */
-#ifndef __TCPIP_H
-#define __TCPIP_H
+
+#pragma once
 
 #ifdef _MSC_VER
 #include <basetsd.h>
@@ -180,6 +180,4 @@ extern ULONG EntityMax;
 extern NTSTATUS TiGetProtocolNumber( PUNICODE_STRING FileName,
                                     PULONG Protocol );
 
-#endif /* __TCPIP_H */
-
 /* EOF */
index ca26064..ede93c9 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/ticonsts.h
  * PURPOSE:     TCP/IP protocol driver constants
  */
-#ifndef __TICONSTS_H
-#define __TICONSTS_H
+
+#pragma once
 
 /* NDIS version this driver supports */
 #define NDIS_VERSION_MAJOR 4
@@ -59,6 +59,4 @@
 #define IP_NO_RESOURCES            0x0001 /* Not enough free resources */
 #define IP_NO_ROUTE_TO_DESTINATION 0x0002 /* No route to destination */
 
-#endif /* __TICONSTS_H */
-
 /* EOF */
index 3134522..8200e0d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _TILISTS_H
-#define _TILISTS_H
+#pragma once
 
 #define TIPASTE(x,y) x ## y
 
@@ -23,5 +22,3 @@
                            TIPASTE(n,Entry->Flink))); \
      TIPASTE(n,Entry) = TIPASTE(n,Entry)->Flink; \
 }
-
-#endif/*_TILISTS_H*/
index fb8ec77..5400010 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/titypes.h
  * PURPOSE:     TCP/IP protocol driver types
  */
-#ifndef __TITYPES_H
-#define __TITYPES_H
+
+#pragma once
 
 /*
  * VOID ReferenceObject(
@@ -306,6 +306,4 @@ typedef struct _TI_QUERY_CONTEXT {
     TCP_REQUEST_QUERY_INFORMATION_EX QueryInfo;
 } TI_QUERY_CONTEXT, *PTI_QUERY_CONTEXT;
 
-#endif /* __TITYPES_H */
-
 /* EOF */
index f2ab2d3..cef0b99 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/transmit.h
  * PURPOSE:     Internet Protocol transmit prototypes
  */
-#ifndef __TRANSMIT_H
-#define __TRANSMIT_H
+
+#pragma once
 
 typedef VOID (*PIP_TRANSMIT_COMPLETE)( PVOID Context,
                                       PNDIS_PACKET Packet,
@@ -33,6 +33,4 @@ typedef struct IPFRAGMENT_CONTEXT {
 NTSTATUS IPSendDatagram(PIP_PACKET IPPacket, PNEIGHBOR_CACHE_ENTRY NCE,
                        PIP_TRANSMIT_COMPLETE Complete, PVOID Context);
 
-#endif /* __TRANSMIT_H */
-
 /* EOF */
index 5554757..e5b52c0 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/udp.h
  * PURPOSE:     User Datagram Protocol definitions
  */
-#ifndef __UDP_H
-#define __UDP_H
+
+#pragma once
 
 #define UDP_STARTING_PORT 0x8000
 #define UDP_DYNAMIC_PORTS 0x8000
@@ -62,6 +62,4 @@ NTSTATUS UDPShutdown(
 UINT UDPAllocatePort( UINT HintPort );
 VOID UDPFreePort( UINT Port );
 
-#endif /* __UDP_H */
-
 /* EOF */
index 655fcd5..37a841d 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef _TCPIP_WAIT_H
-#define _TCPIP_WAIT_H
+#pragma once
 
 NTSTATUS TcpipWaitForSingleObject( PVOID Object,
                                   KWAIT_REASON Reason,
                                   KPROCESSOR_MODE WaitMode,
                                   BOOLEAN Alertable,
                                   PLARGE_INTEGER Timeout );
-
-#endif/*_TCPIP_WAIT_H*/
index c28e27e..bf09f1a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _LINUX_LP_H
-#define _LINUX_LP_H
+#pragma once
 
 /*
  * usr/include/linux/lp.h c.1991-1992 James Wiegand
  * It is used only in the lp_init() routine.
  */
 #define LP_DELAY       150000
-
-#endif
index 786233c..efd55a7 100644 (file)
@@ -7,8 +7,7 @@
  * PROGRAMMER:      Eric Kohl
  */
 
-#ifndef __INCLUDE_DDK_CLASS2_H
-#define __INCLUDE_DDK_CLASS2_H
+#pragma once
 
 #include "ntddscsi.h"
 #include "srb.h"
@@ -265,7 +264,4 @@ ScsiClassCheckVerifyComplete(
     IN PVOID Context
     );
 
-
-#endif /* __INCLUDE_DDK_CLASS2_H */
-
 /* EOF */
index e3d3d8e..1ebe196 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <initguid.h>
 #include <ntddk.h>
+#include <ntifs.h>
 #include <ntdddisk.h>
 #include <ntddcdrm.h>
 #include <scsi.h>
@@ -27,6 +28,8 @@
 #define NDEBUG
 #include <debug.h>
 
+#define DO_XIP   0x00020000
+
 /* GLOBALS ********************************************************************/
 
 #define RAMDISK_SESSION_SIZE \
index 03c5e85..05d1598 100644 (file)
@@ -686,19 +686,20 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo)
       return STATUS_IO_DEVICE_ERROR;
     }
 
-  /* Check if floppy drive exists */
-  if(HwSenseInterruptStatus(ControllerInfo) != STATUS_SUCCESS)
+  /* All controllers should support this so
+   * if we get something strange back then we
+   * know that this isn't a floppy controller
+   */
+  if (HwGetVersion(ControllerInfo) <= 0)
     {
-      WARN_(FLOPPY, "Floppy drive not detected!\n");
+      WARN_(FLOPPY, "InitController: unable to contact controller\n");
       return STATUS_NO_SUCH_DEVICE;
     }
 
-  INFO_(FLOPPY, "InitController: resetting the controller after floppy detection\n");
-
-  /* Reset the controller again after drive detection */
+  /* Reset the controller to avoid interrupt garbage on certain controllers */
   if(HwReset(ControllerInfo) != STATUS_SUCCESS)
     {
-      WARN_(FLOPPY, "InitController: unable to reset controller\n");
+      WARN_(FLOPPY, "InitController: unable to reset controller #2\n");
       return STATUS_IO_DEVICE_ERROR;
     }
 
@@ -971,7 +972,7 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject)
            }
 
          /* 3e: Set up the DPC */
-         IoInitializeDpcRequest(gControllerInfo[i].DriveInfo[j].DeviceObject, DpcForIsr);
+         IoInitializeDpcRequest(gControllerInfo[i].DriveInfo[j].DeviceObject, (PIO_DPC_ROUTINE)DpcForIsr);
 
          /* 3f: Point the device extension at our DriveInfo struct */
          gControllerInfo[i].DriveInfo[j].DeviceObject->DeviceExtension = &gControllerInfo[i].DriveInfo[j];
index 206e56e..d89b5dc 100644 (file)
@@ -45,7 +45,6 @@
  *       with the bit position in the register, or they *might not*.  This should
  *       all be converted to standardize on absolute values or shifts.
  *       I prefer bit fields, but they break endianness.
- * TODO: Figure out the right delays in Send_Byte and Get_Byte
  */
 
 #include <ntddk.h>
 #include "floppy.h"
 #include "hardware.h"
 
-/*
- * Global variable that tracks the amount of time we've
- * been waiting on the controller
- */
-static ULONG TimeIncrement = 0;
-
-
 /*
  * Hardware Support Routines
  */
@@ -131,60 +123,35 @@ static NTSTATUS NTAPI Send_Byte(PCONTROLLER_INFO ControllerInfo,
  *     - Function designed after flowchart in intel datasheet
  *     - 250us max delay.  Note that this is exactly 5 times longer
  *       than Microsoft recommends stalling the processor
- *     - Remember that we can be interrupted here, so this might
- *       take much more wall clock time than 250us
  *     - PAGED_CODE, because we spin for more than the Microsoft-recommended
  *       maximum.
  *     - This function is necessary because sometimes the FIFO reacts slowly
  *       and isn't yet ready to read or write the next byte
- * FIXME: time interval here and in Get_Byte
  */
 {
-  LARGE_INTEGER StartingTickCount;
-  LARGE_INTEGER CurrentTickCount;
-  PUCHAR Address;
+  int i;
 
   PAGED_CODE();
 
-  Address = ControllerInfo->BaseAddress + FIFO;
-
-  if(!TimeIncrement)
-    TimeIncrement = KeQueryTimeIncrement();
-
-  StartingTickCount.QuadPart = 0;
-
-  for(;;)
+  for(i = 0; i < 5; i++)
     {
-      if(!ReadyForWrite(ControllerInfo))
-       {
-         ULONG64 ElapsedTicks;
-         ULONG64 TimeUnits;
-
-         /* If this is the first time through... */
-         if(!StartingTickCount.QuadPart)
-           {
-              KeQueryTickCount(&StartingTickCount);
-             continue;
-           }
-
-         /* Otherwise, only do this for 250 us == 2500 100ns units */
-         KeQueryTickCount(&CurrentTickCount);
-         ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart;
-         TimeUnits = ElapsedTicks * TimeIncrement;
-
-         if(TimeUnits > 25000000)
-           break;
-
-          continue;
-       }
+      if(ReadyForWrite(ControllerInfo))
+         break;
 
-      WRITE_PORT_UCHAR(Address, Byte);
-      return STATUS_SUCCESS;
+      KeStallExecutionProcessor(50);
     }
 
-  INFO_(FLOPPY, "Send_Byte: timed out trying to write\n");
-  HwDumpRegisters(ControllerInfo);
-  return STATUS_UNSUCCESSFUL;
+  if (i < 5)
+  {
+    WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO, Byte);
+    return STATUS_SUCCESS;
+  }
+  else
+  {
+    INFO_(FLOPPY, "Send_Byte: timed out trying to write\n");
+    HwDumpRegisters(ControllerInfo);
+    return STATUS_UNSUCCESSFUL;
+  }
 }
 
 \f
@@ -208,52 +175,29 @@ static NTSTATUS NTAPI Get_Byte(PCONTROLLER_INFO ControllerInfo,
  *     - PAGED_CODE because we spin for longer than Microsoft recommends
  */
 {
-  LARGE_INTEGER StartingTickCount;
-  LARGE_INTEGER CurrentTickCount;
-  PUCHAR Address;
+  int i;
 
   PAGED_CODE();
 
-  Address = ControllerInfo->BaseAddress + FIFO;
-
-  if(!TimeIncrement)
-    TimeIncrement = KeQueryTimeIncrement();
-
-  StartingTickCount.QuadPart = 0;
-
-  for(;;)
+  for(i = 0; i < 5; i++)
     {
-      if(!ReadyForRead(ControllerInfo))
-       {
-         ULONG64 ElapsedTicks;
-         ULONG64 TimeUnits;
-
-         /* if this is the first time through, start the timer */
-          if(!StartingTickCount.QuadPart)
-           {
-              KeQueryTickCount(&StartingTickCount);
-             continue;
-           }
+      if(ReadyForRead(ControllerInfo))
+         break;
 
-         /* Otherwise, only do this for 250 us == 2500 100ns units */
-         KeQueryTickCount(&CurrentTickCount);
-         ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart;
-         TimeUnits = ElapsedTicks * TimeIncrement;
-
-         if(TimeUnits > 25000000)
-           break;
-
-          continue;
-       }
-
-      *Byte = READ_PORT_UCHAR(Address);
-
-      return STATUS_SUCCESS;
+      KeStallExecutionProcessor(50);
     }
 
-  WARN_(FLOPPY, "Get_Byte: timed out trying to read\n");
-  HwDumpRegisters(ControllerInfo);
-  return STATUS_UNSUCCESSFUL;
+  if (i < 5)
+  {
+    *Byte = READ_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO);
+    return STATUS_SUCCESS;
+  }
+  else
+  {
+    INFO_(FLOPPY, "Get_Byte: timed out trying to write\n");
+    HwDumpRegisters(ControllerInfo);
+    return STATUS_UNSUCCESSFUL;
+  }
 }
 
 \f
index 708522b..2f6b428 100644 (file)
@@ -3,8 +3,6 @@
 <module name="atapi" type="kernelmodedriver" installbase="system32/drivers" installname="atapi.sys">
        <bootstrap installbase="$(CDOUTPUT)" />
        <include base="atapi">.</include>
-       <library>ntoskrnl</library>
-       <library>hal</library>
        <library>scsiport</library>
        <file>atapi.c</file>
        <file>atapi.rc</file>
index 8795f1f..b279b34 100644 (file)
@@ -687,7 +687,7 @@ AtapiSoftReset(
     GetBaseStatus(chan, statusByte2);
     KdPrint2((PRINT_PREFIX "  statusByte2 %x:\n", statusByte2));
     SelectDrive(chan, DeviceNumber);
-    AtapiStallExecution(10000);
+    AtapiStallExecution(500);
     AtapiWritePort1(chan, IDX_IO1_o_Command, IDE_COMMAND_ATAPI_RESET);
 
     // ReactOS modification: Already stop looping when we know that the drive has finished resetting.
index 5a617cb..f254236 100644 (file)
@@ -2723,6 +2723,7 @@ CheckDevice(
                          signatureHigh;
     UCHAR                statusByte;
     ULONG                RetVal=0;
+    ULONG                waitCount = 10000;
 
     KdPrint2((PRINT_PREFIX "CheckDevice: Device %#x\n",
                deviceNumber));
@@ -2745,7 +2746,22 @@ CheckDevice(
             // Perform hard-reset.
             KdPrint2((PRINT_PREFIX
                         "CheckDevice: BUSY\n"));
+
+            AtapiWritePort1(chan, IDX_IO2_o_Control, IDE_DC_RESET_CONTROLLER );
+            AtapiStallExecution(500 * 1000);
+            AtapiWritePort1(chan, IDX_IO2_o_Control, IDE_DC_REENABLE_CONTROLLER);
+            SelectDrive(chan, deviceNumber & 0x01);
+
+            do {
+                // Wait for Busy to drop.
+                AtapiStallExecution(100);
+                GetStatus(chan, statusByte);
+
+            } while ((statusByte & IDE_STATUS_BUSY) && waitCount--);
+
             GetBaseStatus(chan, statusByte);
+            KdPrint2((PRINT_PREFIX
+                        "CheckDevice: status after hard reset %x\n", statusByte));
         }
 
         if((statusByte | IDE_STATUS_BUSY) == 0xff) {
index 221ba79..e13ca48 100644 (file)
@@ -8,8 +8,8 @@
 #endif
 
 #ifndef FILE_CHARACTERISTIC_PNP_DEVICE  // DDK 2003
-
 #define FILE_CHARACTERISTIC_PNP_DEVICE  0x00000800
+#endif // !FILE_CHARACTERISTIC_PNP_DEVICE
 
 typedef enum _SYSTEM_INFORMATION_CLASS {
     SystemBasicInformation,
@@ -127,8 +127,6 @@ typedef enum _SYSTEM_INFORMATION_CLASS {
 #endif //__REACTOS__
 } SYSTEM_INFORMATION_CLASS;
 
-#endif // !FILE_CHARACTERISTIC_PNP_DEVICE
-
 
 NTSYSAPI
 NTSTATUS
index fea7c90..51dce2c 100644 (file)
@@ -20,9 +20,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-
-#ifndef _BT958dt_h_
-#define _BT958dt_h_
+#pragma once
 
 // BT958ExtendedSetupInfoGuid - BT958ExtendedSetupInfo
 // BT958 Extended Setup Information (Operation Code 8Dh)
@@ -101,5 +99,3 @@ typedef struct _BT958ExtendedSetupInfo
     #define BT958ExtendedSetupInfo_HostSmartTermination_ID 13
 
 } BT958ExtendedSetupInfo, *PBT958ExtendedSetupInfo;
-
-#endif
index 4af8d0a..9ca15de 100644 (file)
@@ -34,8 +34,7 @@
 
 // Prototype for functions
 
-#ifndef _BT958_H_
-#define _BT958_H_
+#pragma once
 
 #include <ntddk.h>
 #include <srb.h>
@@ -1182,5 +1181,3 @@ BusLogic_IncrementErrorCounter(unsigned short *ErrorCounter)
   if (*ErrorCounter < 65535) (*ErrorCounter)++;
 }
 //____________________________________________________________________________________________
-
-#endif  // _BT958_H_
index f5b652d..3347f10 100644 (file)
@@ -1,10 +1,8 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
-<module name="buslogic" type="kernelmodedriver" installbase="system32/drivers" installname="buslogic.sys">
+<module name="buslogic" type="kernelmodedriver" installbase="system32/drivers" installname="buslogic.sys" crt="libcntpr">
        <bootstrap installbase="$(CDOUTPUT)" />
        <include base="buslogic">.</include>
-       <library>ntoskrnl</library>
-       <library>hal</library>
        <library>scsiport</library>
        <file>BusLogic958.c</file>
        <file>BusLogic958.rc</file>
index f03325d..79ecbad 100644 (file)
@@ -103,7 +103,6 @@ ForwardIrpAndForget(PDEVICE_OBJECT DeviceObject, PIRP Irp)
     PDEVICE_OBJECT LowerDevice;
 
     LowerDevice = ((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerDevice;
-DPRINT1("DeviceObject %x, LowerDevice %x\n", DeviceObject, LowerDevice);
     ASSERT(LowerDevice);
 
     IoSkipCurrentIrpStackLocation(Irp);
index 5435f72..eebc0c0 100644 (file)
 /* INCLUDES *******************************************************************/
 #include "usbehci.h"
 #include <stdio.h>
+
 //#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)
 {
     PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+    PPDO_DEVICE_EXTENSION PdoDeviceExtension;
     ULONG CStatus;
 
     FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeferredContext;
+    PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) FdoDeviceExtension->Pdo->DeviceExtension;
 
     CStatus = (ULONG) SystemArgument2;
 
@@ -40,7 +61,6 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
             if (tmp & 0x02)
             {
                 PWORKITEM_DATA WorkItemData = NULL;
-
                 /* Connect or Disconnect? */
                 if (tmp & 0x01)
                 {
@@ -81,27 +101,12 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
                     tmp = READ_REGISTER_ULONG((PULONG)((Base + EHCI_PORTSC) + (4 * i)));
 
                     DPRINT("port tmp %x\n", tmp);
-                    GetDeviceDescriptor(FdoDeviceExtension, 0);
-                    FdoDeviceExtension->ChildDeviceCount++;
-                    CompletePendingRequest(FdoDeviceExtension);
-
+                    GetDeviceDescriptor(FdoDeviceExtension, 0, 0, FALSE);
+                    PdoDeviceExtension->ChildDeviceCount++;
                     WorkItemData = ExAllocatePool(NonPagedPool, sizeof(WORKITEM_DATA));
-                    if (!WorkItemData)
-                    {
-                        DPRINT1("No memory\n");
-                        break;
-                    }
-
-                    WorkItemData->IoWorkItem = IoAllocateWorkItem(FdoDeviceExtension->Pdo);
-                    if (!WorkItemData->IoWorkItem)
-                    {
-                        DPRINT1("WorkItem allocation failed!\n");
-                        break;
-                    }
-
-
-                    WorkItemData->FdoDeviceExtension = FdoDeviceExtension;
-                    
+                    if (!WorkItemData) ASSERT(FALSE);
+                    WorkItemData->IoWorkItem = IoAllocateWorkItem(PdoDeviceExtension->DeviceObject);
+                    WorkItemData->PdoDeviceExtension = PdoDeviceExtension;
                     IoQueueWorkItem(WorkItemData->IoWorkItem,
                                     (PIO_WORKITEM_ROUTINE)DeviceArrivalWorkItem,
                                     DelayedWorkQueue,
@@ -116,7 +121,6 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
                     tmp |= 0x02;
                     WRITE_REGISTER_ULONG((PULONG) ((Base + EHCI_PORTSC) + (4 * i)), tmp);
                 }
-
             }
         }
     }
@@ -180,7 +184,6 @@ InterruptService(PKINTERRUPT Interrupt, PVOID ServiceContext)
 BOOLEAN
 ResetPort(PDEVICE_OBJECT DeviceObject)
 {
-
     /*FIXME: Implement me */
 
     return TRUE;
@@ -310,8 +313,6 @@ StartEhci(PDEVICE_OBJECT DeviceObject)
                       EHCI_USBINTR_INTE | EHCI_USBINTR_ERR | EHCI_USBINTR_ASYNC | EHCI_USBINTR_HSERR
                       | EHCI_USBINTR_FLROVR  | EHCI_USBINTR_PC);
 
-    //UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
-
     UsbCmd->Run = 1;
     WRITE_REGISTER_ULONG((PULONG)(base + EHCI_USBCMD), tmp);
 
@@ -351,14 +352,12 @@ GetCapabilities(PFDO_DEVICE_EXTENSION DeviceExtension, ULONG Base)
     PCap->HCSParamsLong = READ_REGISTER_ULONG((PULONG)(Base + 4));
     PCap->HCCParams = READ_REGISTER_ULONG((PULONG)(Base + 8));
 
-
     DPRINT("Length %d\n", PCap->Length);
     DPRINT("Reserved %d\n", PCap->Reserved);
     DPRINT("HCIVersion %x\n", PCap->HCIVersion);
     DPRINT("HCSParams %x\n", PCap->HCSParamsLong);
     DPRINT("HCCParams %x\n", PCap->HCCParams);
 
-
     if (PCap->HCCParams & 0x02)
         DPRINT1("Frame list size is configurable\n");
 
@@ -412,8 +411,8 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART
     DeviceDescription.MaximumLength = EHCI_MAX_SIZE_TRANSFER;
 
     FdoDeviceExtension->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->LowerDevice,
-                                                    &DeviceDescription,
-                                                    &FdoDeviceExtension->MapRegisters);
+                                                      &DeviceDescription,
+                                                      &FdoDeviceExtension->MapRegisters);
 
     if (FdoDeviceExtension->pDmaAdapter == NULL)
     {
@@ -561,14 +560,16 @@ FdoQueryBusRelations(
     NTSTATUS Status;
     ULONG UsbDeviceNumber = 0;
     WCHAR CharDeviceName[64];
+
     UNICODE_STRING DeviceName;
 
     DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-    /* Create the PDO */
+
+    /* Create the PDO with the next available number */
     while (TRUE)
     {
-        /* FIXME: Use safe string sprintf*/
-        /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBFDO-%d", UsbDeviceNumber); */
+        /* FIXME: Use safe string */
+        /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBPDO-%d", UsbDeviceNumber); */
         swprintf(CharDeviceName, L"\\Device\\USBPDO-%d", UsbDeviceNumber);
         RtlInitUnicodeString(&DeviceName, CharDeviceName);
         DPRINT("DeviceName %wZ\n", &DeviceName);
@@ -604,20 +605,17 @@ FdoQueryBusRelations(
     PdoDeviceExtension->Common.IsFdo = FALSE;
 
     PdoDeviceExtension->ControllerFdo = DeviceObject;
+    PdoDeviceExtension->DeviceObject = Pdo;
 
-    Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
-    DeviceExtension->Pdo = Pdo;
+    InitializeListHead(&PdoDeviceExtension->IrpQueue);
+    KeInitializeSpinLock(&PdoDeviceExtension->IrpQueueLock);
 
-    /*swprintf(CharSymLinkName, L"\\Device\\HCD%d", UsbDeviceNumber);
-    RtlInitUnicodeString(&SymLinkName, CharSymLinkName);
-    Status = IoCreateSymbolicLink(&SymLinkName, &DeviceName);
+    Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
 
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("Warning: Unable to create symbolic link for ehci usb device!\n");
-    }*/
+    DeviceExtension->Pdo = Pdo;
 
     DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS));
+
     if (!DeviceRelations)
     {
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -646,7 +644,7 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
     {
         case IRP_MN_START_DEVICE:
         {
-            DPRINT("START_DEVICE\n");
+            DPRINT1("START_DEVICE\n");
             Irp->IoStatus.Status = STATUS_SUCCESS;
             Status = ForwardAndWait(DeviceObject, Irp);
 
@@ -657,7 +655,7 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
         }
         case IRP_MN_QUERY_DEVICE_RELATIONS:
         {
-            DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n");
+            DPRINT1("IRP_MN_QUERY_DEVICE_RELATIONS\n");
             switch(Stack->Parameters.QueryDeviceRelations.Type)
             {
                 case BusRelations:
@@ -687,6 +685,14 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
         {
             DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
         }
+        case IRP_MN_QUERY_INTERFACE:
+        {
+            Status = STATUS_SUCCESS;
+            Information = 0;
+            Status = ForwardIrpAndForget(DeviceObject, Irp);
+            return Status;
+            break;
+        }
         default:
         {
             DPRINT1("IRP_MJ_PNP / Unhandled minor function 0x%lx\n", Stack->MinorFunction);
@@ -710,21 +716,22 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo)
     WCHAR CharSymLinkName[64];
     UNICODE_STRING DeviceName;
     UNICODE_STRING SymLinkName;
+    UNICODE_STRING InterfaceSymLinkName;
     ULONG BytesRead;
     PCI_COMMON_CONFIG PciConfig;
 
     PFDO_DEVICE_EXTENSION FdoDeviceExtension;
 
-    DPRINT1("Ehci AddDevice\n");
+    DPRINT("Ehci AddDevice\n");
 
-    /* Create the FDO */
+    /* Create the FDO with next available number */
     while (TRUE)
     {
         /* FIXME: Use safe string sprintf*/
         /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBFDO-%d", UsbDeviceNumber); */
         swprintf(CharDeviceName, L"\\Device\\USBFDO-%d", UsbDeviceNumber);
         RtlInitUnicodeString(&DeviceName, CharDeviceName);
-        DPRINT1("DeviceName %wZ\n", &DeviceName);
+        DPRINT("DeviceName %wZ\n", &DeviceName);
 
         Status = IoCreateDevice(DriverObject,
                                 sizeof(FDO_DEVICE_EXTENSION),
@@ -734,8 +741,8 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo)
                                 FALSE,
                                 &Fdo);
 
-       if (NT_SUCCESS(Status))
-           break;
+        if (NT_SUCCESS(Status))
+            break;
 
         if ((Status == STATUS_OBJECT_NAME_EXISTS) || (Status == STATUS_OBJECT_NAME_COLLISION))
         {
@@ -758,21 +765,17 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo)
 
     if (!NT_SUCCESS(Status))
     {
-        DPRINT1("Warning: Unable to create symbolic link for ehci usb device!\n");
+        DPRINT1("Warning: Unable to create symbolic link for ehci host controller!\n");
     }
 
-    DPRINT("Attaching created device %x to %x\n", Fdo, Pdo);
-
     FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) Fdo->DeviceExtension;
     RtlZeroMemory(FdoDeviceExtension, sizeof(PFDO_DEVICE_EXTENSION));
 
-    InitializeListHead(&FdoDeviceExtension->IrpQueue);
-    KeInitializeSpinLock(&FdoDeviceExtension->IrpQueueLock);
-
     FdoDeviceExtension->Common.IsFdo = TRUE;
     FdoDeviceExtension->DeviceObject = Fdo;
 
     FdoDeviceExtension->LowerDevice = IoAttachDeviceToDeviceStack(Fdo, Pdo);
+
     if (FdoDeviceExtension->LowerDevice == NULL)
     {
         DPRINT1("UsbEhci: Failed to attach to device stack!\n");
@@ -782,10 +785,10 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo)
         return STATUS_NO_SUCH_DEVICE;
     }
 
-    Fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
+    Fdo->Flags |= DO_BUFFERED_IO;// | DO_POWER_PAGABLE;
 
-    DPRINT("Attached %x!\n", FdoDeviceExtension->LowerDevice);
     ASSERT(FdoDeviceExtension->LowerDevice == Pdo);
+
     Status = GetBusInterface(FdoDeviceExtension->LowerDevice, &FdoDeviceExtension->BusInterface);
 
     if (!NT_SUCCESS(Status))
@@ -797,8 +800,6 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo)
         return Status;
     }
 
-    DPRINT("Context %x\n", FdoDeviceExtension->BusInterface.Context);
-
     BytesRead = (*FdoDeviceExtension->BusInterface.GetBusData)(
         FdoDeviceExtension->BusInterface.Context,
         PCI_WHICHSPACE_CONFIG,
@@ -827,15 +828,24 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo)
         DPRINT("PCI_ENABLE_BUS_MASTER\n");
 
     DPRINT("BaseAddress[0] %x\n", PciConfig.u.type0.BaseAddresses[0]);
-    DPRINT("Vendor %x\n", PciConfig.VendorID);
-    DPRINT("Device %x\n", PciConfig.DeviceID);
+    DPRINT1("Vendor %x\n", PciConfig.VendorID);
+    DPRINT1("Device %x\n", PciConfig.DeviceID);
 
     FdoDeviceExtension->VendorId = PciConfig.VendorID;
     FdoDeviceExtension->DeviceId = PciConfig.DeviceID;
 
-    DPRINT("FdoDeviceExtension->NextLowerDevice %x\n", FdoDeviceExtension->LowerDevice);
     FdoDeviceExtension->DeviceState = DEVICEINTIALIZED;
 
+    Status = IoRegisterDeviceInterface(Pdo, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER, NULL, &InterfaceSymLinkName);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Unable to register device interface!\n");
+    }
+    else
+    {
+        Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE);
+        DPRINT1("SetInterfaceState %x\n", Status);
+    }
     Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
 
     return STATUS_SUCCESS;
index 9be9e8b..29af1f9 100644 (file)
 #include "usbehci.h"
 
 VOID
-RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp)
+RequestURBCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 {
     PPDO_DEVICE_EXTENSION PdoDeviceExtension;
-    PFDO_DEVICE_EXTENSION FdoDeviceExtension;
 
     PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
-    FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension;
 
     KIRQL OldIrql = Irp->CancelIrql;
     IoReleaseCancelSpinLock(DISPATCH_LEVEL);
 
-    KeAcquireSpinLockAtDpcLevel(&FdoDeviceExtension->IrpQueueLock);
+    KeAcquireSpinLockAtDpcLevel(&PdoDeviceExtension->IrpQueueLock);
     RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
 
-    KeReleaseSpinLock(&FdoDeviceExtension->IrpQueueLock, OldIrql);
+    KeReleaseSpinLock(&PdoDeviceExtension->IrpQueueLock, OldIrql);
 
-   Irp->IoStatus.Status = STATUS_CANCELLED;
-   IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    Irp->IoStatus.Status = STATUS_CANCELLED;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 }
 
 VOID
-QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp)
+QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp)
 {
     KIRQL OldIrql;
 
@@ -51,10 +49,13 @@ QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp)
 }
 
 VOID
-CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension)
+CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension)
 {
     PLIST_ENTRY NextIrp = NULL;
+    NTSTATUS Status = STATUS_UNSUCCESSFUL;
+    ULONG_PTR Information = 0;
     PIO_STACK_LOCATION Stack;
+    PUSB_DEVICE UsbDevice = NULL;
     KIRQL oldIrql;
     PIRP Irp = NULL;
     URB *Urb;
@@ -75,18 +76,354 @@ CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension)
         Urb = (PURB) Stack->Parameters.Others.Argument1;
         ASSERT(Urb);
 
-        /* FIXME: Fill in information for Argument1/URB */
+        Information = 0;
+        Status = STATUS_SUCCESS;
+
+        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 */
+        if (UsbDevice == NULL)
+            UsbDevice = DeviceExtension->UsbDevices[0];
+
+        switch (Urb->UrbHeader.Function)
+        {
+            case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
+            {
+                /* Are we suppose to only return on this request when a device is connected
+                   or is it the RootHubInitNotification Callback */
+                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("--->TransferFlags %x\n", Urb->UrbBulkOrInterruptTransfer.TransferFlags);
+                /* FIXME */
+                RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength);
+                ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1;
+                /* Turn off Irp handling as nothing is handled beyond this */
+                DeviceExtension->HaltUrbHandling = TRUE;
+                break;
+            }
+            case URB_FUNCTION_GET_STATUS_FROM_DEVICE:
+            {
+                DPRINT1("Get Status from Device\n");
+                break;
+            }
+            case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
+            {
+                Urb->UrbHeader.Function = 0x08;
+                Urb->UrbHeader.UsbdFlags = 0;
+                Urb->UrbHeader.UsbdDeviceHandle = UsbDevice;
+
+                switch(Urb->UrbControlDescriptorRequest.DescriptorType)
+                {
+                    case USB_DEVICE_DESCRIPTOR_TYPE:
+                    {
+                        DPRINT1("USB DEVICE DESC\n");
+                        if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= sizeof(USB_DEVICE_DESCRIPTOR))
+                        {
+                            Urb->UrbControlDescriptorRequest.TransferBufferLength = sizeof(USB_DEVICE_DESCRIPTOR);
+                        }
+
+                        RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer,
+                                      &UsbDevice->DeviceDescriptor,
+                                      Urb->UrbControlDescriptorRequest.TransferBufferLength);
+
+                        Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
+
+                        break;
+                    }
+                    case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+                    {
+                        DPRINT1("USB CONFIG DESC\n");
+                        ULONG FullDescriptorLength = sizeof(USB_CONFIGURATION_DESCRIPTOR) +
+                                                     sizeof(USB_INTERFACE_DESCRIPTOR) +
+                                                     sizeof(USB_ENDPOINT_DESCRIPTOR);
+
+                        if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= FullDescriptorLength)
+                        {
+                            Urb->UrbControlDescriptorRequest.TransferBufferLength = FullDescriptorLength;
+                        }
+
+                        RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer,
+                                      &UsbDevice->ConfigurationDescriptor,
+                                      Urb->UrbControlDescriptorRequest.TransferBufferLength);
+
+                        Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
+
+                        break;
+                    }
+                    case USB_STRING_DESCRIPTOR_TYPE:
+                    {
+                        DPRINT1("Usb String Descriptor not implemented\n");
+                        break;
+                    }
+                    default:
+                    {
+                        DPRINT1("Descriptor Type %x not supported!\n", Urb->UrbControlDescriptorRequest.DescriptorType);
+                    }
+                }
+                break;
+            }
+            case URB_FUNCTION_SELECT_CONFIGURATION:
+            {
+                PUSBD_INTERFACE_INFORMATION InterfaceInfo;
+                LONG iCount, pCount;
+
+                DPRINT("Selecting Configuration\n");
+                DPRINT("Length %x\n", Urb->UrbHeader.Length);
+                DPRINT("Urb->UrbSelectConfiguration.ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle);
+
+                if (Urb->UrbSelectConfiguration.ConfigurationDescriptor)
+                {
+                    DPRINT("ConfigurationDescriptor = %p\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor);
+                    DPRINT(" bLength = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bLength);
+                    DPRINT(" bDescriptorType = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bDescriptorType);
+                    DPRINT(" wTotalLength = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->wTotalLength);
+                    DPRINT(" bNumInterfaces = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces);
+                    DPRINT(" bConfigurationValue = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bConfigurationValue);
+                    DPRINT(" iConfiguration = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->iConfiguration);
+                    DPRINT(" bmAttributes = %04x\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bmAttributes);
+                    DPRINT(" MaxPower = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->MaxPower);
+
+
+                    Urb->UrbSelectConfiguration.ConfigurationHandle = (PVOID)&DeviceExtension->UsbDevices[0]->ConfigurationDescriptor;
+                    DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle);
+                    InterfaceInfo = &Urb->UrbSelectConfiguration.Interface;
+
+                    for (iCount = 0; iCount < Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces; iCount++)
+                    {
+                        DPRINT("InterfaceInformation[%d]\n", iCount);
+                        DPRINT(" Length = %d\n", InterfaceInfo->Length);
+                        DPRINT(" InterfaceNumber = %d\n", InterfaceInfo->InterfaceNumber);
+                        DPRINT(" AlternateSetting = %d\n", InterfaceInfo->AlternateSetting);
+                        DPRINT(" Class = %02x\n", (ULONG)InterfaceInfo->Class);
+                        DPRINT(" SubClass = %02x\n", (ULONG)InterfaceInfo->SubClass);
+                        DPRINT(" Protocol = %02x\n", (ULONG)InterfaceInfo->Protocol);
+                        DPRINT(" Reserved = %02x\n", (ULONG)InterfaceInfo->Reserved);
+                        DPRINT(" InterfaceHandle = %p\n", InterfaceInfo->InterfaceHandle);
+                        DPRINT(" NumberOfPipes = %d\n", InterfaceInfo->NumberOfPipes);
+                        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++)
+                        {
+                          DPRINT("Pipe[%d]\n", pCount);
+                          DPRINT(" MaximumPacketSize = %d\n", InterfaceInfo->Pipes[pCount].MaximumPacketSize);
+                          DPRINT(" EndpointAddress = %d\n", InterfaceInfo->Pipes[pCount].EndpointAddress);
+                          DPRINT(" Interval = %d\n", InterfaceInfo->Pipes[pCount].Interval);
+                          DPRINT(" PipeType = %d\n", InterfaceInfo->Pipes[pCount].PipeType);
+                          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->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->EndPointDescriptor;
+                          if (InterfaceInfo->Pipes[pCount].MaximumTransferSize == 0)
+                              InterfaceInfo->Pipes[pCount].MaximumTransferSize = 4096;
+                          /* InterfaceInfo->Pipes[j].PipeFlags = 0; */
+                        }
+                        InterfaceInfo = (PUSBD_INTERFACE_INFORMATION)((PUCHAR)InterfaceInfo + InterfaceInfo->Length);
+                    }
+
+                    Urb->UrbHeader.UsbdDeviceHandle = UsbDevice;
+                    Urb->UrbHeader.UsbdFlags = 0;
+                    Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
+                }
+                else
+                {
+                    /* FIXME: Set device to unconfigured state */
+                }
+                break;
+            }
+            case URB_FUNCTION_CLASS_DEVICE:
+            {
+                switch (Urb->UrbControlVendorClassRequest.Request)
+                {
+                    case USB_REQUEST_GET_DESCRIPTOR:
+                    {
+                        DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags);
+                        DPRINT1("Urb->UrbControlVendorClassRequest.Value %x\n", Urb->UrbControlVendorClassRequest.Value);
+
+
+                        switch (Urb->UrbControlVendorClassRequest.Value >> 8)
+                        {
+                            case USB_DEVICE_CLASS_AUDIO:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_AUDIO\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_COMMUNICATIONS:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_COMMUNICATIONS\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_HUMAN_INTERFACE:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_HUMAN_INTERFACE\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_MONITOR:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_MONITOR\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_PHYSICAL_INTERFACE:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_PHYSICAL_INTERFACE\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_POWER:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_POWER\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_PRINTER:
+                            {
+                                DPRINT1("USB_DEVICE_CLASS_PRINTER\n");
+                                break;
+                            }
+                            case USB_DEVICE_CLASS_STORAGE:
+                            {
+                               DPRINT1("USB_DEVICE_CLASS_STORAGE\n");
+                               break;
+                            }
+                            case USB_DEVICE_CLASS_RESERVED:
+                            case USB_DEVICE_CLASS_HUB:
+                            {
+                                PUSB_HUB_DESCRIPTOR UsbHubDescr = Urb->UrbControlVendorClassRequest.TransferBuffer;
+                                /* FIXME: Handle more than root hub? */
+                                if(Urb->UrbControlVendorClassRequest.TransferBufferLength >= sizeof(USB_HUB_DESCRIPTOR))
+                                {
+                                    Urb->UrbControlVendorClassRequest.TransferBufferLength = sizeof(USB_HUB_DESCRIPTOR);
+                                }
+                                else
+                                {
+                                    /* FIXME: Handle this correctly */
+                                    UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR);
+                                    UsbHubDescr->bDescriptorType = 0x29;
+                                    return;
+                                }
+                                DPRINT1("USB_DEVICE_CLASS_HUB request\n");
+                                UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR);
+                                UsbHubDescr->bDescriptorType = 0x29;
+                                UsbHubDescr->bNumberOfPorts = 0x08;
+                                UsbHubDescr->wHubCharacteristics = 0x0012;
+                                UsbHubDescr->bPowerOnToPowerGood = 0x01;
+                                UsbHubDescr->bHubControlCurrent = 0x00;
+                                UsbHubDescr->bRemoveAndPowerMask[0] = 0x00;
+                                UsbHubDescr->bRemoveAndPowerMask[1] = 0x00;
+                                UsbHubDescr->bRemoveAndPowerMask[2] = 0xff;
+                                break;
+                            }
+                            default:
+                            {
+                                DPRINT1("Unknown UrbControlVendorClassRequest Value\n");
+                            }
+                        }
+                        Urb->UrbHeader.Function = 0x08;
+                        Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
+                        Urb->UrbHeader.UsbdDeviceHandle = UsbDevice;
+                        Urb->UrbHeader.UsbdFlags = 0;
+                        break;
+                    }
+                    default:
+                    {
+                        DPRINT1("Unhandled URB request for class device\n");
+                        Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION;
+                    }
+                }
+                break;
+            }
+            case URB_FUNCTION_CLASS_OTHER:
+            {
+                switch (Urb->UrbControlVendorClassRequest.Request)
+                {
+                    case USB_REQUEST_GET_STATUS:
+                    {
+                        DPRINT1("USB_REQUEST_GET_STATUS\n");
+                        break;
+                    }
+                    case USB_REQUEST_CLEAR_FEATURE:
+                    {
+                        DPRINT1("USB_REQUEST_CLEAR_FEATURE\n");
+                        break;
+                    }
+                    case USB_REQUEST_SET_FEATURE:
+                    {
+                        DPRINT1("USB_REQUEST_SET_FEATURE value %x\n", Urb->UrbControlVendorClassRequest.Value);
+                        switch(Urb->UrbControlVendorClassRequest.Value)
+                        {
+                            /* FIXME: Needs research */
+                            case 0x01:
+                            {
+                            }
+                        }
+                        break;
+                    }
+                    case USB_REQUEST_SET_ADDRESS:
+                    {
+                        DPRINT1("USB_REQUEST_SET_ADDRESS\n");
+                        break;
+                    }
+                    case USB_REQUEST_GET_DESCRIPTOR:
+                    {
+                        DPRINT1("USB_REQUEST_GET_DESCRIPTOR\n");
+                        break;
+                    }
+                    case USB_REQUEST_SET_DESCRIPTOR:
+                    {
+                        DPRINT1("USB_REQUEST_SET_DESCRIPTOR\n");
+                        break;
+                    }
+                    case USB_REQUEST_GET_CONFIGURATION:
+                    {
+                        DPRINT1("USB_REQUEST_GET_CONFIGURATION\n");
+                        break;
+                    }
+                    case USB_REQUEST_SET_CONFIGURATION:
+                    {
+                        DPRINT1("USB_REQUEST_SET_CONFIGURATION\n");
+                        break;
+                    }
+                    case USB_REQUEST_GET_INTERFACE:
+                    {
+                        DPRINT1("USB_REQUEST_GET_INTERFACE\n");
+                        break;
+                    }
+                    case USB_REQUEST_SET_INTERFACE:
+                    {
+                        DPRINT1("USB_REQUEST_SET_INTERFACE\n");
+                        break;
+                    }
+                    case USB_REQUEST_SYNC_FRAME:
+                    {
+                        DPRINT1("USB_REQUEST_SYNC_FRAME\n");
+                        break;
+                    }
+                }
+                break;
+            }
+            default:
+            {
+                DPRINT1("Unhandled URB %x\n", Urb->UrbHeader.Function);
+                Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION;
+            }
+
+        }
 
-        DPRINT("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer);
-        DPRINT("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength);
-        DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index);
-        DPRINT("DescriptorType %x\n",     Urb->UrbControlDescriptorRequest.DescriptorType);    
-        DPRINT("LanguageId %x\n", Urb->UrbControlDescriptorRequest.LanguageId);
+        KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
 
-        Irp->IoStatus.Status = STATUS_SUCCESS;
-        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = Status;
+        Irp->IoStatus.Information = Information;
 
-        KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
         KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql);
     }
@@ -94,64 +431,3 @@ CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension)
     KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
 }
 
-NTSTATUS
-NTAPI
-ArrivalNotificationCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID PContext)
-{
-    PDEVICE_OBJECT PortDeviceObject = (PDEVICE_OBJECT) PContext;
-    IoFreeIrp(Irp);
-    ObDereferenceObject(PortDeviceObject);
-    return STATUS_MORE_PROCESSING_REQUIRED;
-}
-
-VOID
-DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context)
-{
-    PWORKITEM_DATA WorkItemData;
-    PIO_STACK_LOCATION IrpStack = NULL;
-    PDEVICE_OBJECT PortDeviceObject = NULL;
-    PIRP Irp = NULL;
-
-    WorkItemData = (PWORKITEM_DATA)Context;
-
-    PortDeviceObject = IoGetAttachedDeviceReference(WorkItemData->FdoDeviceExtension->Pdo);
-
-    if (!PortDeviceObject)
-    {
-        DPRINT1("Unable to notify Pdos parent of device arrival.\n");
-        goto Cleanup;
-    }
-
-    if (PortDeviceObject == DeviceObject)
-    {
-        /* Piontless to send query relations to ourself */
-        ObDereferenceObject(PortDeviceObject);
-        goto Cleanup;
-    }
-
-    Irp = IoAllocateIrp(PortDeviceObject->StackSize, FALSE);
-
-    if (!Irp)
-    {
-        DPRINT1("Unable to allocate IRP\n");
-    }
-
-    IoSetCompletionRoutine(Irp,
-                           (PIO_COMPLETION_ROUTINE)ArrivalNotificationCompletion,
-                           (PVOID) PortDeviceObject,
-                           TRUE,
-                           TRUE,
-                           TRUE);
-
-    IrpStack = IoGetNextIrpStackLocation(Irp);
-    IrpStack->Parameters.QueryDeviceRelations.Type = TargetDeviceRelation;
-    IrpStack->MajorFunction = IRP_MJ_PNP;
-    IrpStack->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;
-
-    IoCallDriver(PortDeviceObject, Irp);
-
-Cleanup:
-    IoFreeWorkItem(WorkItemData->IoWorkItem);
-    ExFreePool(WorkItemData);
-}
-
index 8334a2d..3ab717f 100644 (file)
  *              Michael Martin
  */
 
-/* INCLUDES *******************************************************************/
 #define INITGUID
+#define NDEBUG
+
 #include "usbehci.h"
 #include <wdmguid.h>
+#include "usbiffn.h"
 #include <stdio.h>
-
-#define NDEBUG
 #include <debug.h>
 
+/* Lifted from Linux with slight changes */
+const UCHAR ROOTHUB2_DEVICE_DESCRIPTOR [] =
+{
+    0x12,       /*  bLength; */
+    USB_DEVICE_DESCRIPTOR_TYPE,       /*  bDescriptorType; Device */
+    0x00, 0x20, /*  bcdUSB; v1.1 */
+    USB_DEVICE_CLASS_HUB,       /*  bDeviceClass; HUB_CLASSCODE */
+    0x01,       /*  bDeviceSubClass; */
+    0x00,       /*  bDeviceProtocol; [ low/full speeds only ] */
+    0x08,       /*  bMaxPacketSize0; 8 Bytes */
+    /* Fill Vendor and Product in when init root hub */
+    0x00, 0x00, /*  idVendor; */
+    0x00, 0x00, /*  idProduct; */
+    0x00, 0x00, /*  bcdDevice */
+    0x00,       /*  iManufacturer; */
+    0x00,       /*  iProduct; */
+    0x00,       /*  iSerialNumber; */
+    0x01        /*  bNumConfigurations; */
+
+};
+
+const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] =
+{
+    /* one configuration */
+    0x09,       /* bLength; */
+    0x02,       /* bDescriptorType; Configuration */
+    0x19, 0x00, /* wTotalLength; */
+    0x01,       /* bNumInterfaces; (1) */
+    0x23,       /* bConfigurationValue; */
+    0x00,       /* iConfiguration; */
+    0x40,       /* bmAttributes; 
+    Bit 7: must be set,
+        6: Self-powered,
+        5: Remote wakeup,
+        4..0: reserved */
+    0x00,       /* MaxPower; */
+
+    /* one interface */
+    0x09,       /* bLength: Interface; */
+    0x04,       /* bDescriptorType; Interface */
+    0x00,       /* bInterfaceNumber; */
+    0x00,       /* bAlternateSetting; */
+    0x01,       /* bNumEndpoints; */
+    0x09,       /* bInterfaceClass; HUB_CLASSCODE */
+    0x01,       /* bInterfaceSubClass; */
+    0x00,       /* bInterfaceProtocol: */
+    0x00,       /* iInterface; */
+
+    /* one endpoint (status change endpoint) */
+    0x07,       /* bLength; */
+    0x05,       /* bDescriptorType; Endpoint */
+    0x81,       /* bEndpointAddress; IN Endpoint 1 */
+    0x03,       /* bmAttributes; Interrupt */
+    0x08, 0x00, /* wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */
+    0xFF        /* bInterval; (255ms -- usb 2.0 spec) */
+};
+
+/* FIXME: Do something better */
+VOID NTAPI
+UrbWorkerThread(PVOID Context)
+{
+    PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Context;
+
+    while (PdoDeviceExtension->HaltUrbHandling == FALSE)
+    {
+        CompletePendingURBRequest(PdoDeviceExtension);
+        KeStallExecutionProcessor(10);
+    }
+    DPRINT1("Thread terminated\n");
+}
+
+/* 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)
+    {
+        DPRINT1("Out of memory\n");
+        return NULL;
+    }
+
+    if ((Hub) && (!Parent))
+    {
+        DPRINT1("This is the root hub\n");
+    }
+
+    UsbDevicePointer->Address = DeviceNumber;
+    UsbDevicePointer->Port = Port;
+    UsbDevicePointer->ParentDevice = Parent;
+
+    UsbDevicePointer->IsHub = Hub;
+
+    return UsbDevicePointer;
+}
+
 NTSTATUS NTAPI
 PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
 {
@@ -24,125 +120,101 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
     PIO_STACK_LOCATION Stack = NULL;
     NTSTATUS Status = STATUS_UNSUCCESSFUL;
     ULONG_PTR Information = 0;
-    DPRINT("PdoDispatchInternalDeviceControl\n");
 
     PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
     FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension;
 
     ASSERT(PdoDeviceExtension->Common.IsFdo == FALSE);
+
     Stack =  IoGetCurrentIrpStackLocation(Irp);
-    DPRINT("IoControlCode %x\n", Stack->Parameters.DeviceIoControl.IoControlCode);
+
     switch(Stack->Parameters.DeviceIoControl.IoControlCode)
     {
         case IOCTL_INTERNAL_USB_SUBMIT_URB:
         {
             URB *Urb;
 
-            DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB\n");
-            DPRINT("Stack->Parameters.DeviceIoControl.InputBufferLength %d\n",
-                     Stack->Parameters.DeviceIoControl.InputBufferLength);
-            DPRINT("Stack->Parameters.Others.Argument1 %x\n", Stack->Parameters.Others.Argument1);
-
             Urb = (PURB) Stack->Parameters.Others.Argument1;
-            DPRINT("Header Size %d\n", Urb->UrbHeader.Length);
-            DPRINT("Header Type %d\n", Urb->UrbHeader.Function);
-            DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index);
-
-            /* Check the type */
-            switch(Urb->UrbHeader.Function)
-            {
-                case URB_FUNCTION_SELECT_CONFIGURATION:
-                {
-                    DPRINT1("URB_FUNCTION_SELECT_CONFIGURATION\n");
-                    break;
-                }
-                case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
-                {
-                    URB *Urb;
-                    DPRINT1("URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n");
-                    Urb = (PURB) Stack->Parameters.Others.Argument1;
-                    Urb->UrbHeader.Status = 0;
-
-                    DPRINT1("Irp->CancelRoutine %x\n",Irp->CancelRoutine);
-                    QueueRequest(FdoDeviceExtension, Irp);
-  
-                    Information = 0;
-
-                    IoMarkIrpPending(Irp);
-                    Status = STATUS_PENDING;
-
-                    break;
-                }
-                /* FIXME: Handle all other Functions */
-                default:
-                    DPRINT1("Not handled yet!\n");
-            }
+            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;
+            IoMarkIrpPending(Irp);
+            Status = STATUS_PENDING;
             break;
         }
         case IOCTL_INTERNAL_USB_CYCLE_PORT:
         {
-            DPRINT("IOCTL_INTERNAL_USB_CYCLE_PORT\n");
+            DPRINT1("IOCTL_INTERNAL_USB_CYCLE_PORT\n");
             break;
         }
         case IOCTL_INTERNAL_USB_ENABLE_PORT:
         {
-            DPRINT("IOCTL_INTERNAL_USB_ENABLE_PORT\n");
+            DPRINT1("IOCTL_INTERNAL_USB_ENABLE_PORT\n");
             break;
         }
         case IOCTL_INTERNAL_USB_GET_BUS_INFO:
         {
-            DPRINT("IOCTL_INTERNAL_USB_GET_BUS_INFO\n");
+            DPRINT1("IOCTL_INTERNAL_USB_GET_BUS_INFO\n");
             break;
         }
         case IOCTL_INTERNAL_USB_GET_BUSGUID_INFO:
         {
-            DPRINT("IOCTL_INTERNAL_USB_GET_BUSGUID_INFO\n");
+            DPRINT1("IOCTL_INTERNAL_USB_GET_BUSGUID_INFO\n");
             break;
         }
         case IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME:
         {
-            DPRINT("IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME\n");
+            DPRINT1("IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME\n");
             break;
         }
         case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE:
         {
-            DPRINT("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n");
+            DPRINT1("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n");
             break;
         }
         case IOCTL_INTERNAL_USB_GET_HUB_COUNT:
         {
-            DPRINT("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n");
+            DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n");
+
+            if (Stack->Parameters.Others.Argument1)
+            {
+                /* FIXME: Determine the number of hubs between the usb device and root hub */
+                /* For now return 0 */
+                *(PVOID *)Stack->Parameters.Others.Argument1 = 0;
+            }
             break;
         }
         case IOCTL_INTERNAL_USB_GET_HUB_NAME:
         {
-            DPRINT("IOCTL_INTERNAL_USB_GET_HUB_NAME\n");
+            DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_NAME\n");
             break;
         }
         case IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO:
         {
-            DPRINT("IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n");
+            DPRINT1("IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n");
             break;
         }
         case IOCTL_INTERNAL_USB_GET_PORT_STATUS:
         {
-            DPRINT("IOCTL_INTERNAL_USB_GET_PORT_STATUS\n");
+            DPRINT1("IOCTL_INTERNAL_USB_GET_PORT_STATUS\n");
             break;
         }
         case IOCTL_INTERNAL_USB_RESET_PORT:
         {
-            DPRINT("IOCTL_INTERNAL_USB_RESET_PORT\n");
+            DPRINT1("IOCTL_INTERNAL_USB_RESET_PORT\n");
             break;
         }
         case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO:
         {
-            DPRINT("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n");
-            /* This is document as Argument1 = PDO and Argument2 = FDO.
-               Its actually reversed, the FDO goes in Argument1 and PDO goes in Argument2 */
+            DPRINT1("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n");
+
             if (Stack->Parameters.Others.Argument1)
-                Stack->Parameters.Others.Argument1 = FdoDeviceExtension->DeviceObject;
+                *(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo;
             if (Stack->Parameters.Others.Argument2)
-                Stack->Parameters.Others.Argument2 = FdoDeviceExtension->Pdo;
+                *(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDevice(FdoDeviceExtension->DeviceObject);
 
             Irp->IoStatus.Information = 0;
             Irp->IoStatus.Status = STATUS_SUCCESS;
@@ -151,7 +223,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
         }
         case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION:
         {
-            DPRINT("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n");
+            DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n");
             break;
         }
         default:
@@ -162,6 +234,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
     }
 
     Irp->IoStatus.Information = Information;
+
     if (Status != STATUS_PENDING)
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
@@ -171,8 +244,6 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
 NTSTATUS
 PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
 {
-    PPDO_DEVICE_EXTENSION PdoDeviceExtension;
-    PFDO_DEVICE_EXTENSION FdoDeviceExtension;
     WCHAR Buffer[256];
     ULONG Index = 0;
     ULONG IdType;
@@ -181,25 +252,18 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
     NTSTATUS Status;
 
     IdType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryId.IdType;
-    PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-    FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
-
-    /* FIXME: Read values from registry */
 
     switch (IdType)
     {
         case BusQueryDeviceID:
         {
-            DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
             RtlInitUnicodeString(&SourceString, L"USB\\ROOT_HUB20");
             break;
         }
         case BusQueryHardwareIDs:
         {
-            DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
-
             Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C&REV0000") + 1;
-            Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265") + 1;
+            Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C") + 1;
             Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20") + 1;
 
             Buffer[Index] = UNICODE_NULL;
@@ -209,24 +273,12 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
         }
         case BusQueryCompatibleIDs:
         {
-            DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n");
-                        /* We have none */
+            /* We have none */
             return STATUS_SUCCESS;
-            break;
         }
         case BusQueryInstanceID:
         {
-            DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
-
-               /*
-               Do we need to implement this?
-               At one point I hade DeviceCapabilities->UniqueID set to TRUE.
-               And caused usbhub to fail attaching
-               to the PDO. Setting UniqueID to FALSE, it works
-               */
-
             return STATUS_SUCCESS;
-            break;
         }
         default:
         {
@@ -247,18 +299,15 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
 NTSTATUS
 PdoQueryDeviceRelations(PDEVICE_OBJECT DeviceObject, PDEVICE_RELATIONS* pDeviceRelations)
 {
-    PFDO_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_RELATIONS DeviceRelations;
 
-    DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
     DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS));
     if (!DeviceRelations)
         return STATUS_INSUFFICIENT_RESOURCES;
 
-    ObReferenceObject(DeviceObject);
     DeviceRelations->Count = 1;
     DeviceRelations->Objects[0] = DeviceObject;
+    ObReferenceObject(DeviceObject);
 
     *pDeviceRelations = DeviceRelations;
     return STATUS_SUCCESS;
@@ -271,8 +320,8 @@ PdoDispatchPnp(
 {
     ULONG MinorFunction;
     PIO_STACK_LOCATION Stack;
-    ULONG_PTR Information = 0;
-    NTSTATUS Status;
+    ULONG_PTR Information = Irp->IoStatus.Information;
+    NTSTATUS Status = Irp->IoStatus.Status;
 
     Stack = IoGetCurrentIrpStackLocation(Irp);
     MinorFunction = Stack->MinorFunction;
@@ -284,17 +333,67 @@ PdoDispatchPnp(
         case IRP_MN_CANCEL_REMOVE_DEVICE:
         case IRP_MN_STOP_DEVICE:
         case IRP_MN_QUERY_STOP_DEVICE:
+        case IRP_MN_CANCEL_STOP_DEVICE:
         case IRP_MN_QUERY_DEVICE_TEXT:
         case IRP_MN_SURPRISE_REMOVAL:
+        case IRP_MN_QUERY_RESOURCES:
+        case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
+        case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
         {
-            Information = Irp->IoStatus.Information;
             Status = STATUS_SUCCESS;
             break;
         }
 
         case IRP_MN_START_DEVICE:
         {
-            DPRINT("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
+            PUSB_DEVICE RootHubDevice;
+            PPDO_DEVICE_EXTENSION PdoDeviceExtension;
+            PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+            UNICODE_STRING InterfaceSymLinkName;
+
+            PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+            FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
+
+            /* Create the root hub */
+            RootHubDevice = InternalCreateUsbDevice(1, 0, NULL, TRUE);
+
+            RtlCopyMemory(&RootHubDevice->DeviceDescriptor,
+                          ROOTHUB2_DEVICE_DESCRIPTOR,
+                          sizeof(ROOTHUB2_DEVICE_DESCRIPTOR));
+
+            RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId;
+            RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId;
+
+            RtlCopyMemory(&RootHubDevice->ConfigurationDescriptor,
+                          ROOTHUB2_CONFIGURATION_DESCRIPTOR,
+                          sizeof(ROOTHUB2_CONFIGURATION_DESCRIPTOR));
+
+            PdoDeviceExtension->UsbDevices[0] = RootHubDevice;
+
+            /* Create a thread to handle the URB's */
+            Status = PsCreateSystemThread(&PdoDeviceExtension->ThreadHandle,
+                                          THREAD_ALL_ACCESS,
+                                          NULL,
+                                          NULL,
+                                          NULL,
+                                          UrbWorkerThread,
+                                          (PVOID)PdoDeviceExtension);
+
+            if (!NT_SUCCESS(Status))
+                DPRINT1("Failed Thread Creation with Status: %x\n", Status);
+
+            Status = IoRegisterDeviceInterface(DeviceObject, &GUID_DEVINTERFACE_USB_HUB, NULL, &InterfaceSymLinkName);
+            if (!NT_SUCCESS(Status))
+            {
+                DPRINT1("Failed to register interface\n");
+            }
+            else
+            {
+                Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE);
+                DPRINT1("Set interface state %x\n", Status);
+            }
+
+
             Status = STATUS_SUCCESS;
             break;
         }
@@ -305,16 +404,17 @@ PdoDispatchPnp(
                 case TargetDeviceRelation:
                 {
                     PDEVICE_RELATIONS DeviceRelations = NULL;
-                    DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / TargetDeviceRelation\n");
                     Status = PdoQueryDeviceRelations(DeviceObject, &DeviceRelations);
                     Information = (ULONG_PTR)DeviceRelations;
                     break;
                 }
+                case BusRelations:
+                case RemovalRelations:
+                case EjectionRelations:
                 default:
                 {
                     DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unhandled type 0x%lx\n",
                         Stack->Parameters.QueryDeviceRelations.Type);
-                    //ASSERT(FALSE);
                     Status = STATUS_NOT_SUPPORTED;
                     break;
                 }
@@ -325,17 +425,20 @@ PdoDispatchPnp(
         {
             PDEVICE_CAPABILITIES DeviceCapabilities;
             ULONG i;
-            DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES\n");
+
             DeviceCapabilities = (PDEVICE_CAPABILITIES)Stack->Parameters.DeviceCapabilities.Capabilities;
-            /* FIXME: capabilities can change with connected device */
+
             DeviceCapabilities->LockSupported = FALSE;
             DeviceCapabilities->EjectSupported = FALSE;
             DeviceCapabilities->Removable = FALSE;
             DeviceCapabilities->DockDevice = FALSE;
-            DeviceCapabilities->UniqueID = FALSE;//TRUE;
+            DeviceCapabilities->UniqueID = FALSE;
             DeviceCapabilities->SilentInstall = FALSE;
-            DeviceCapabilities->RawDeviceOK = TRUE;
+            DeviceCapabilities->RawDeviceOK = FALSE;
             DeviceCapabilities->SurpriseRemovalOK = FALSE;
+            DeviceCapabilities->Address = 0;
+            DeviceCapabilities->UINumber = 0;
+            DeviceCapabilities->DeviceD2 = 1;
 
              /* FIXME */
             DeviceCapabilities->HardwareDisabled = FALSE;
@@ -343,47 +446,101 @@ PdoDispatchPnp(
             DeviceCapabilities->DeviceState[0] = PowerDeviceD0;
             for (i = 0; i < PowerSystemMaximum; i++)
                 DeviceCapabilities->DeviceState[i] = PowerDeviceD3;
-            //DeviceCapabilities->DeviceWake = PowerDeviceUndefined;
+            DeviceCapabilities->DeviceWake = 0;
             DeviceCapabilities->D1Latency = 0;
             DeviceCapabilities->D2Latency = 0;
             DeviceCapabilities->D3Latency = 0;
+            Information = 0;
             Status = STATUS_SUCCESS;
             break;
         }
-        case IRP_MN_QUERY_RESOURCES:
-        {
-            Information = Irp->IoStatus.Information;
-            Status = Irp->IoStatus.Status;
-            break;
-        }
-        case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
-        {
-            DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
-            Information = Irp->IoStatus.Information;
-            Status = Irp->IoStatus.Status;
-            break;
-        }
         /*case IRP_MN_QUERY_DEVICE_TEXT:
         {
             Status = STATUS_NOT_SUPPORTED;
             break;
         }*/
-        case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
+
+        case IRP_MN_QUERY_ID:
         {
-            DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
-            Information = Irp->IoStatus.Information;
-            Status = Irp->IoStatus.Status;
+            Status = PdoQueryId(DeviceObject, Irp, &Information);
             break;
         }
-        case IRP_MN_QUERY_ID:
+        case IRP_MN_QUERY_INTERFACE:
         {
-            Status = PdoQueryId(DeviceObject, Irp, &Information);
+            UNICODE_STRING GuidString;
+            PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub;
+            PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI;
+            PPDO_DEVICE_EXTENSION PdoDeviceExtension;
+            PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+
+            PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+            FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
+
+            Status = RtlStringFromGUID(Stack->Parameters.QueryInterface.InterfaceType, &GuidString);
+            if (!NT_SUCCESS(Status))
+            {
+                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);
+
+            Status = STATUS_SUCCESS;
+            Information = 0;
+
+            /* 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 = 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;
+            }
+            else
+            {
+                DPRINT1("Not Supported\n");
+                Status = STATUS_NOT_SUPPORTED;
+            }
             break;
         }
         case IRP_MN_QUERY_BUS_INFORMATION:
         {
             PPNP_BUS_INFORMATION BusInfo;
-            DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_BUS_INFORMATION\n");
 
             BusInfo = (PPNP_BUS_INFORMATION)ExAllocatePool(PagedPool, sizeof(PNP_BUS_INFORMATION));
             if (!BusInfo)
@@ -407,9 +564,6 @@ PdoDispatchPnp(
         {
             /* We are the PDO. So ignore */
             DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n", MinorFunction);
-
-            Information = Irp->IoStatus.Information;
-            Status = Irp->IoStatus.Status;
             break;
         }
     }
index 8ff2401..d9a85ba 100644 (file)
@@ -68,7 +68,7 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead,
 
     /* Must be Page aligned */
     *CtrlSetup = (PEHCI_SETUP_FORMAT) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF)  & ~0xFFF);
-    *CtrlData = (PSTANDARD_DEVICE_DESC) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF)  & ~0xFFF);
+    *CtrlData = (PUSB_DEVICE_DESCRIPTOR) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF)  & ~0xFFF);
 
     (*CtrlTD1)->NextPointer = TERMINATE_POINTER;
     (*CtrlTD1)->AlternateNextPointer = TERMINATE_POINTER;
@@ -105,10 +105,10 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead,
 }
 
 BOOLEAN
-GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index)
+GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub)
 {
     PEHCI_SETUP_FORMAT CtrlSetup = NULL;
-    PSTANDARD_DEVICE_DESC CtrlData = NULL;
+    PUSB_DEVICE_DESCRIPTOR CtrlData = NULL;
     PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL;
     PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL;
     PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL;
@@ -129,14 +129,22 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index)
                                          &CtrlTD3,
                                          &CtrlSetup,
                                          (PVOID)&CtrlData,
-                                         sizeof(STANDARD_DEVICE_DESC));
+                                         sizeof(USB_DEVICE_DESCRIPTOR));
 
     /* FIXME: Use defines and handle other than Device Desciptors */
-    CtrlSetup->bmRequestType = 0x80;
+    if (Hub)
+    {
+        CtrlSetup->bmRequestType = 0x80;
+        CtrlSetup->wValue = 0x0600;
+    }
+    else
+    {
+        CtrlSetup->bmRequestType = 0x80;
+        CtrlSetup->wValue = 0x0100;
+    }
     CtrlSetup->bRequest = 0x06;
-    CtrlSetup->wValue = 0x0100;
     CtrlSetup->wIndex = 0;
-    CtrlSetup->wLength = sizeof(STANDARD_DEVICE_DESC);
+    CtrlSetup->wLength = sizeof(USB_DEVICE_DESCRIPTOR);
 
     tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
     UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
@@ -182,13 +190,31 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index)
             break;
     }
 
+    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->bDeviceProtocal);
-    DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize);
+    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);
@@ -202,7 +228,7 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index)
     {
         /* We got valid data, try for strings */
         UCHAR Manufacturer = CtrlData->iManufacturer;
-        UCHAR Product = CtrlData->iManufacturer;
+        UCHAR Product = CtrlData->iProduct;
         UCHAR SerialNumber = CtrlData->iSerialNumber;
 
         GetDeviceStringDescriptor(DeviceExtension, Manufacturer);
@@ -228,7 +254,7 @@ GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index)
     LONG tmp;
 
     Base = (ULONG) DeviceExtension->ResourceMemory;
-DPRINT1("Index: %d\n", Index);
+
     /* Set up the QUEUE HEAD in memory */
     QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr);
 
index dd35b0d..1554069 100644 (file)
@@ -94,6 +94,7 @@ VOID NTAPI
 DriverUnload(PDRIVER_OBJECT DriverObject)
 {
     DPRINT1("Unloading Driver\n");
+    /* FIXME: Clean up */
 }
 
 NTSTATUS NTAPI
index ca3765b..f4c440d 100644 (file)
@@ -1,12 +1,11 @@
-
-#ifndef __EHCI_H__
-#define __EHCI_H__
+#pragma once
 
 #include <ntifs.h>
 #include <ntddk.h>
 #include <stdio.h>
 #define        NDEBUG
 #include <debug.h>
+#include "usbiffn.h"
 #include <usbioctl.h>
 #include <usb.h>
 
@@ -176,24 +175,6 @@ typedef struct _EHCI_SETUP_FORMAT
     USHORT wLength;
 } EHCI_SETUP_FORMAT, *PEHCI_SETUP_FORMAT;
 
-typedef struct _STANDARD_DEVICE_DESC
-{
-       UCHAR bLength;
-       UCHAR bDescriptorType;
-       USHORT bcdUSB;
-       UCHAR bDeviceClass; 
-       UCHAR bDeviceSubClass; 
-       UCHAR bDeviceProtocal; 
-       UCHAR bMaxPacketSize; 
-       USHORT idVendor; 
-       USHORT idProduct; 
-       USHORT bcdDevice; 
-       UCHAR iManufacturer; 
-       UCHAR iProduct; 
-       UCHAR iSerialNumber; 
-       UCHAR bNumConfigurations;
-} STANDARD_DEVICE_DESC, *PSTANDARD_DEVICE_DESC;
-
 typedef struct _STRING_DESCRIPTOR
 {
   UCHAR bLength;               /* Size of this descriptor in bytes */
@@ -201,6 +182,18 @@ typedef struct _STRING_DESCRIPTOR
   UCHAR bString[0];            /* UNICODE encoded string */
 } STRING_DESCRIPTOR, *PSTRING_DESCRIPTOR;
 
+typedef struct _USB_DEVICE
+{
+    UCHAR Address;
+    ULONG Port;
+    PVOID ParentDevice;
+    BOOLEAN IsHub;
+    USB_DEVICE_DESCRIPTOR DeviceDescriptor;
+    USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
+    USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
+    USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
+} USB_DEVICE, *PUSB_DEVICE;
+
 /* USBCMD register 32 bits */
 typedef struct _EHCI_USBCMD_CONTENT
 {
@@ -292,7 +285,6 @@ typedef struct _EHCI_CAPS {
     UCHAR        PortRoute [8];
 } EHCI_CAPS, *PEHCI_CAPS;
 
-
 typedef struct _COMMON_DEVICE_EXTENSION
 {
     BOOLEAN IsFdo;
@@ -309,9 +301,7 @@ typedef struct _FDO_DEVICE_EXTENSION
     PDEVICE_OBJECT Pdo;
     ULONG DeviceState;
 
-    /* USB Specs says a max of 127 devices */
-    ULONG ChildDeviceCount;
-
+    PVOID RootHubDeviceHandle;
     PDMA_ADAPTER pDmaAdapter;
 
     ULONG Vector;
@@ -323,10 +313,6 @@ typedef struct _FDO_DEVICE_EXTENSION
     KDPC DpcObject;
     KAFFINITY Affinity;
 
-    LIST_ENTRY IrpQueue;
-    KSPIN_LOCK IrpQueueLock;
-    PIRP CurrentIrp;
-
     ULONG MapRegisters;
 
     ULONG BusNumber;
@@ -354,7 +340,6 @@ typedef struct _FDO_DEVICE_EXTENSION
 
     PULONG ResourceBase;
     ULONG Size;
-
 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
 
 typedef struct _PDO_DEVICE_EXTENSION
@@ -362,16 +347,28 @@ typedef struct _PDO_DEVICE_EXTENSION
     COMMON_DEVICE_EXTENSION Common;
     PDEVICE_OBJECT DeviceObject;
     PDEVICE_OBJECT ControllerFdo;
-
+    PUSB_DEVICE UsbDevices[127];
+    LIST_ENTRY IrpQueue;
+    KSPIN_LOCK IrpQueueLock;
+    PIRP CurrentIrp;
+    HANDLE ThreadHandle;
+    ULONG ChildDeviceCount;
+    BOOLEAN HaltUrbHandling;
+    PVOID CallbackContext;
+    PRH_INIT_CALLBACK CallbackRoutine;
 } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
 
-
 typedef struct _WORKITEM_DATA
 {
     PIO_WORKITEM IoWorkItem;
-    PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+    PPDO_DEVICE_EXTENSION PdoDeviceExtension;
+    PDEVICE_OBJECT PortDeviceObject;
 } WORKITEM_DATA, *PWORKITEM_DATA;
 
+
+VOID NTAPI
+UrbWorkerThread(PVOID Context);
+
 NTSTATUS NTAPI
 GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface);
 
@@ -406,27 +403,19 @@ NTSTATUS NTAPI
 PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
 BOOLEAN
-GetDeviceDescriptor (PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index);
+GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub);
 
 BOOLEAN
 GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index);
 
 VOID
-CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension);
+QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
 
 VOID
-QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
+CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension);
 
 VOID
-QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
+URBRequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
-VOID
-CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension);
-
-VOID
+VOID NTAPI
 DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context);
-
-VOID
-RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp);
-
-#endif
index c49c039..3f6f1e6 100644 (file)
@@ -9,5 +9,6 @@
        <file>common.c</file>
        <file>misc.c</file>
        <file>irp.c</file>
+       <file>usbiffn.c</file>
        <file>urbreq.c</file>
 </module>
diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c
new file mode 100644 (file)
index 0000000..47fefb6
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * PROJECT:     ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        drivers/usb/usbehci/usbiffn.c
+ * PURPOSE:     Direct Call Interface Functions.
+ * PROGRAMMERS:
+ *              Michael Martin
+ */
+
+/* usbbusif.h and hubbusif.h need to be imported */
+#include "usbehci.h"
+#include "usbiffn.h"
+#define        NDEBUG
+#include <debug.h>
+
+VOID
+USB_BUSIFFN
+InterfaceReference(PVOID BusContext)
+{
+    DPRINT1("InterfaceReference called\n");
+}
+
+VOID
+USB_BUSIFFN
+InterfaceDereference(PVOID BusContext)
+{
+    DPRINT1("InterfaceDereference called\n");
+}
+
+/* Bus Interface Hub V5 Functions */
+
+NTSTATUS
+USB_BUSIFFN
+CreateUsbDevice(PVOID BusContext,
+                PUSB_DEVICE_HANDLE *NewDevice,
+                PUSB_DEVICE_HANDLE HubDeviceHandle,
+                USHORT PortStatus, USHORT PortNumber)
+{
+    DPRINT1("CreateUsbDevice called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle)
+{
+    DPRINT1("InitializeUsbDevice called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+GetUsbDescriptors(PVOID BusContext,
+                  PUSB_DEVICE_HANDLE DeviceHandle,
+                  PUCHAR DeviceDescriptorBuffer,
+                  PULONG DeviceDescriptorBufferLength,
+                  PUCHAR ConfigurationBuffer,
+                  PULONG ConfigDescriptorBufferLength)
+{
+    DPRINT1("GetUsbDescriptor called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags)
+{
+    DPRINT1("RemoveUsbDevice called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle)
+{
+    DPRINT1("RestoreUsbDevice called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+GetPortHackFlags(PVOID BusContext, PULONG Flags)
+{
+    DPRINT1("GetPortHackFlags called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+QueryDeviceInformation(PVOID BusContext,
+                       PUSB_DEVICE_HANDLE DeviceHandle,
+                       PVOID DeviceInformationBuffer,
+                       ULONG DeviceInformationBufferLength,
+                       PULONG LengthReturned)
+{
+    DPRINT1("QueryDeviceInformation called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+GetControllerInformation(PVOID BusContext,
+                         PVOID ControllerInformationBuffer,
+                         ULONG ControllerInformationBufferLength,
+                         PULONG LengthReturned)
+{
+    DPRINT1("GetControllerInformation called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable)
+{
+    DPRINT1("ControllerSelectiveSuspend called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+GetExtendedHubInformation(PVOID BusContext,
+                          PDEVICE_OBJECT HubPhysicalDeviceObject,
+                          PVOID HubInformationBuffer,
+                          ULONG HubInformationBufferLength,
+                          PULONG LengthReturned)
+{
+
+    PUSB_EXTHUB_INFORMATION_0 UsbExtHubInfo = HubInformationBuffer;
+    PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension;
+    PFDO_DEVICE_EXTENSION FdoDeviceExntension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
+    LONG i;
+
+    /* Set the default return value */
+    *LengthReturned = 0;
+    /* Caller must have set InformationLevel to 0 */
+    if (UsbExtHubInfo->InformationLevel != 0)
+    {
+        return STATUS_NOT_SUPPORTED;
+    }
+
+    UsbExtHubInfo->NumberOfPorts = 8;
+
+    for (i=0; i < UsbExtHubInfo->NumberOfPorts; i++)
+    {
+        UsbExtHubInfo->Port[i].PhysicalPortNumber = i + 1;
+        UsbExtHubInfo->Port[i].PortLabelNumber = FdoDeviceExntension->ECHICaps.HCSParams.PortCount;
+        UsbExtHubInfo->Port[i].VidOverride = 0;
+        UsbExtHubInfo->Port[i].PidOverride = 0;
+        UsbExtHubInfo->Port[i].PortAttributes = USB_PORTATTR_SHARED_USB2;
+    }
+
+    *LengthReturned = FIELD_OFFSET(USB_EXTHUB_INFORMATION_0, Port[8]);
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+GetRootHubSymbolicName(PVOID BusContext,
+                       PVOID HubSymNameBuffer,
+                       ULONG HubSymNameBufferLength,
+                       PULONG HubSymNameActualLength)
+{
+    DPRINT1("GetRootHubSymbolicName called\n");
+    return STATUS_SUCCESS;
+}
+
+PVOID
+USB_BUSIFFN
+GetDeviceBusContext(PVOID HubBusContext, PVOID DeviceHandle)
+{
+    DPRINT1("GetDeviceBusContext called\n");
+    return NULL;
+}
+
+NTSTATUS
+USB_BUSIFFN
+Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount)
+{
+    DPRINT1("Initialize20Hub called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBACK CallbackRoutine)
+{
+    PPDO_DEVICE_EXTENSION PdoDeviceExtension;
+    DPRINT1("RootHubInitNotification %x, %x, %x\n", BusContext, CallbackContext, CallbackRoutine);
+
+    PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension;
+    PdoDeviceExtension->CallbackContext = CallbackContext;
+    PdoDeviceExtension->CallbackRoutine = CallbackRoutine;
+    return STATUS_SUCCESS;
+}
+
+VOID
+USB_BUSIFFN
+FlushTransfers(PVOID BusContext, PVOID DeviceHandle)
+{
+    DPRINT1("FlushTransfers\n");
+}
+
+VOID
+USB_BUSIFFN
+SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo)
+{
+    DPRINT1("SetDeviceHandleData called\n");
+}
+
+
+/* USB_BUS_INTERFACE_USBDI_V2 Functions */
+
+NTSTATUS
+USB_BUSIFFN
+GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites)
+{
+    DPRINT1("GetUSBDIVersion called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+QueryBusTime(PVOID BusContext, PULONG CurrentFrame)
+{
+    DPRINT1("QueryBusTime called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+SubmitIsoOutUrb(PVOID BusContext, PURB Urb)
+{
+    DPRINT1("SubmitIsoOutUrb called\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+USB_BUSIFFN
+QueryBusInformation(PVOID BusContext,
+                    ULONG Level,
+                    PVOID BusInformationBuffer,
+                    PULONG BusInformationBufferLength,
+                    PULONG BusInformationActualLength)
+{
+    DPRINT1("QueryBusInformation called\n");
+    return STATUS_SUCCESS;
+}
+
+BOOLEAN
+USB_BUSIFFN
+IsDeviceHighSpeed(PVOID BusContext)
+{
+    DPRINT1("IsDeviceHighSpeed called\n");
+    return TRUE;
+}
+
+NTSTATUS
+USB_BUSIFFN
+EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2)
+{
+    DPRINT1("EnumLogEntry called\n");
+    return STATUS_SUCCESS;
+}
+
diff --git a/reactos/drivers/usb/usbehci/usbiffn.h b/reactos/drivers/usb/usbehci/usbiffn.h
new file mode 100644 (file)
index 0000000..e9c2de4
--- /dev/null
@@ -0,0 +1,196 @@
+#pragma once
+
+#define USB_BUSIFFN __stdcall
+#include <ntifs.h>
+#include <ntddk.h>
+#include <usb.h>
+
+/* 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
+InterfaceReference(PVOID BusContext);
+
+VOID
+USB_BUSIFFN
+InterfaceDereference(PVOID BusContext);
+
+NTSTATUS
+USB_BUSIFFN
+CreateUsbDevice(PVOID BusContext,
+    PUSB_DEVICE_HANDLE *NewDevice,
+    PUSB_DEVICE_HANDLE HubDeviceHandle,
+    USHORT PortStatus, USHORT PortNumber);
+
+NTSTATUS
+USB_BUSIFFN
+InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle);
+
+NTSTATUS
+USB_BUSIFFN
+GetUsbDescriptors(PVOID BusContext,
+    PUSB_DEVICE_HANDLE DeviceHandle,
+    PUCHAR DeviceDescriptorBuffer,
+    PULONG DeviceDescriptorBufferLength,
+    PUCHAR ConfigurationBuffer,
+    PULONG ConfigDescriptorBufferLength);
+
+NTSTATUS
+USB_BUSIFFN
+RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags);
+
+NTSTATUS
+USB_BUSIFFN
+RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle);
+
+NTSTATUS
+USB_BUSIFFN
+GetPortHackFlags(PVOID BusContext, PULONG Flags);
+
+NTSTATUS
+USB_BUSIFFN
+QueryDeviceInformation(PVOID BusContext,
+                       PUSB_DEVICE_HANDLE DeviceHandle,
+                       PVOID DeviceInformationBuffer,
+                       ULONG DeviceInformationBufferLength,
+                       PULONG LengthReturned);
+
+NTSTATUS
+USB_BUSIFFN
+GetControllerInformation(PVOID BusContext,
+                         PVOID ControllerInformationBuffer,
+                         ULONG ControllerInformationBufferLength,
+                         PULONG LengthReturned);
+
+NTSTATUS
+USB_BUSIFFN
+ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable);
+
+NTSTATUS
+USB_BUSIFFN
+GetExtendedHubInformation(PVOID BusContext,
+                          PDEVICE_OBJECT HubPhysicalDeviceObject,
+                          PVOID HubInformationBuffer,
+                          ULONG HubInformationBufferLength,
+                          PULONG LengthReturned);
+
+NTSTATUS
+USB_BUSIFFN
+GetRootHubSymbolicName(PVOID BusContext,
+                       PVOID HubSymNameBuffer,
+                       ULONG HubSymNameBufferLength,
+                       PULONG HubSymNameActualLength);
+
+PVOID
+USB_BUSIFFN
+GetDeviceBusContext(PVOID HubBusContext, PVOID DeviceHandle);
+
+NTSTATUS
+USB_BUSIFFN
+Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount);
+
+NTSTATUS
+USB_BUSIFFN
+RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBACK CallbackRoutine);
+
+VOID
+USB_BUSIFFN
+FlushTransfers(PVOID BusContext, PVOID DeviceHandle);
+
+VOID
+USB_BUSIFFN
+SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo);
+
+NTSTATUS
+USB_BUSIFFN
+GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites);
+
+NTSTATUS
+USB_BUSIFFN
+QueryBusTime(PVOID BusContext, PULONG CurrentFrame);
+
+NTSTATUS
+USB_BUSIFFN
+SubmitIsoOutUrb(PVOID BusContext, PURB Urb);
+
+NTSTATUS
+USB_BUSIFFN
+QueryBusInformation(PVOID BusContext,
+                    ULONG Level,
+                    PVOID BusInformationBuffer,
+                    PULONG BusInformationBufferLength,
+                    PULONG BusInformationActualLength);
+
+BOOLEAN
+USB_BUSIFFN
+IsDeviceHighSpeed(PVOID BusCOntext);
+
+NTSTATUS
+USB_BUSIFFN
+EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2);
index eb65085..514fd43 100644 (file)
@@ -7,4 +7,7 @@
        <directory name="vga">
                <xi:include href="vga/vgaddi.rbuild" />
        </directory>
+       <directory name="framebuf_new">
+               <xi:include href="framebuf_new/framebuf_new.rbuild" />
+       </directory>
 </group>
index 3a18e86..7f222c8 100644 (file)
@@ -18,8 +18,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef FRAMEBUF_H
-#define FRAMEBUF_H
+#pragma once
 
 #include <stdarg.h>
 #include <windef.h>
@@ -160,5 +159,3 @@ IntSetPalette(
    IN PPALETTEENTRY ppalent,
    IN ULONG iStart,
    IN ULONG cColors);
-
-#endif /* FRAMEBUF_H */
diff --git a/reactos/drivers/video/displays/framebuf_new/debug.c b/reactos/drivers/video/displays/framebuf_new/debug.c
new file mode 100755 (executable)
index 0000000..ada125d
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * PROJECT:         ReactOS Framebuffer Display Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/displays/framebuf/debug.c
+ * PURPOSE:         Debug Support
+ * PROGRAMMERS:     Copyright (c) 1992-1995 Microsoft Corporation
+ */
+
+#include "driver.h"
+
+#if DBG
+
+ULONG DebugLevel = 0xFFFFFFFF;
+
+/*****************************************************************************
+ *
+ *   Routine Description:
+ *
+ *      This function is variable-argument, level-sensitive debug print
+ *      routine.
+ *      If the specified debug level for the print statement is lower or equal
+ *      to the current debug level, the message will be printed.
+ *
+ *   Arguments:
+ *
+ *      DebugPrintLevel - Specifies at which debugging level the string should
+ *          be printed
+ *
+ *      DebugMessage - Variable argument ascii c string
+ *
+ *   Return Value:
+ *
+ *      None.
+ *
+ ***************************************************************************/
+
+VOID
+DebugPrint(
+    ULONG DebugPrintLevel,
+    PCHAR DebugMessage,
+    ...
+    )
+
+{
+
+    va_list ap;
+
+    va_start(ap, DebugMessage);
+
+    if (DebugPrintLevel <= DebugLevel)
+    {
+        EngDebugPrint(STANDARD_DEBUG_PREFIX, DebugMessage, ap);
+    }
+
+    va_end(ap);
+
+}
+
+#endif
diff --git a/reactos/drivers/video/displays/framebuf_new/debug.h b/reactos/drivers/video/displays/framebuf_new/debug.h
new file mode 100755 (executable)
index 0000000..d73a223
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * PROJECT:         ReactOS Framebuffer Display Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/displays/framebuf/debug.h
+ * PURPOSE:         Debug Support Header
+ * PROGRAMMERS:     Copyright (c) 1992-1995 Microsoft Corporation
+ */
+
+#if DBG
+
+VOID
+DebugPrint(
+    ULONG DebugPrintLevel,
+    PCHAR DebugMessage,
+    ...
+    );
+
+#define DISPDBG(arg) DebugPrint arg
+#define RIP(x) { DebugPrint(0, x); EngDebugBreak();}
+
+#else
+
+#define DISPDBG(arg)
+#define RIP(x)
+
+#endif
diff --git a/reactos/drivers/video/displays/framebuf_new/driver.h b/reactos/drivers/video/displays/framebuf_new/driver.h
new file mode 100755 (executable)
index 0000000..e9e6171
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * PROJECT:         ReactOS Framebuffer Display Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/displays/framebuf/driver.h
+ * PURPOSE:         Main Driver Header File
+ * PROGRAMMERS:     Copyright (c) 1992-1995 Microsoft Corporation
+ *                  ReactOS Portable Systems Group
+ */
+//#define DBG 1
+#include "stddef.h"
+#include <stdarg.h>
+#include "windef.h"
+#include "wingdi.h"
+#include "winddi.h"
+#include "devioctl.h"
+#include "ntddvdeo.h"
+#include "debug.h"
+
+typedef struct  _PDEV
+{
+    HANDLE  hDriver;                    // Handle to \Device\Screen
+    HDEV    hdevEng;                    // Engine's handle to PDEV
+    HSURF   hsurfEng;                   // Engine's handle to surface
+    HPALETTE hpalDefault;               // Handle to the default palette for device.
+    PBYTE   pjScreen;                   // This is pointer to base screen address
+    ULONG   cxScreen;                   // Visible screen width
+    ULONG   cyScreen;                   // Visible screen height
+    ULONG   ulMode;                     // Mode the mini-port driver is in.
+    LONG    lDeltaScreen;               // Distance from one scan to the next.
+    ULONG   cScreenSize;                // size of video memory, including
+                                        // offscreen memory.
+    PVOID   pOffscreenList;             // linked list of DCI offscreen surfaces.
+    FLONG   flRed;                      // For bitfields device, Red Mask
+    FLONG   flGreen;                    // For bitfields device, Green Mask
+    FLONG   flBlue;                     // For bitfields device, Blue Mask
+    ULONG   cPaletteShift;              // number of bits the 8-8-8 palette must
+                                        // be shifted by to fit in the hardware
+                                        // palette.
+    ULONG   ulBitCount;                 // # of bits per pel 8,16,24,32 are only supported.
+    POINTL  ptlHotSpot;                 // adjustment for pointer hot spot
+    VIDEO_POINTER_CAPABILITIES PointerCapabilities; // HW pointer abilities
+    PVIDEO_POINTER_ATTRIBUTES pPointerAttributes; // hardware pointer attributes
+    DWORD   cjPointerAttributes;        // Size of buffer allocated
+    BOOL    fHwCursorActive;            // Are we currently using the hw cursor
+    PALETTEENTRY *pPal;                 // If this is pal managed, this is the pal
+    BOOL    bSupportDCI;                // Does the miniport support DCI?
+// eVb: 3.1 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping
+    LONG flHooks;
+// eVb: 3.1 [END]
+} PDEV, *PPDEV;
+
+DWORD getAvailableModes(HANDLE, PVIDEO_MODE_INFORMATION *, DWORD *);
+BOOL bInitPDEV(PPDEV, PDEVMODEW, GDIINFO *, DEVINFO *);
+BOOL bInitSURF(PPDEV, BOOL);
+BOOL bInitPaletteInfo(PPDEV, DEVINFO *);
+BOOL bInitPointer(PPDEV, DEVINFO *);
+BOOL bInit256ColorPalette(PPDEV);
+VOID vDisablePalette(PPDEV);
+VOID vDisableSURF(PPDEV);
+
+#define MAX_CLUT_SIZE (sizeof(VIDEO_CLUT) + (sizeof(ULONG) * 256))
+
+//
+// Determines the size of the DriverExtra information in the DEVMODE
+// structure passed to and from the display driver.
+//
+
+#define DRIVER_EXTRA_SIZE 0
+
+#define DLL_NAME                L"framebuf"   // Name of the DLL in UNICODE
+#define STANDARD_DEBUG_PREFIX   "FRAMEBUF: "  // All debug output is prefixed
+#define ALLOC_TAG               'bfDD'        // Four byte tag (characters in
+                                              // reverse order) used for memory
+                                              // allocations
diff --git a/reactos/drivers/video/displays/framebuf_new/enable.c b/reactos/drivers/video/displays/framebuf_new/enable.c
new file mode 100644 (file)
index 0000000..8031da8
--- /dev/null
@@ -0,0 +1,476 @@
+/*
+ * PROJECT:         ReactOS Framebuffer Display Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/displays/framebuf/enable.c
+ * PURPOSE:         Main Driver Initialization and PDEV Enabling
+ * PROGRAMMERS:     Copyright (c) 1992-1995 Microsoft Corporation
+ *                  ReactOS Portable Systems Group
+ */
+
+#include "driver.h"
+
+// The driver function table with all function index/address pairs
+
+static DRVFN gadrvfn[] =
+{
+    {   INDEX_DrvEnablePDEV,            (PFN) DrvEnablePDEV         },
+    {   INDEX_DrvCompletePDEV,          (PFN) DrvCompletePDEV       },
+    {   INDEX_DrvDisablePDEV,           (PFN) DrvDisablePDEV        },
+    {   INDEX_DrvEnableSurface,         (PFN) DrvEnableSurface      },
+    {   INDEX_DrvDisableSurface,        (PFN) DrvDisableSurface     },
+    {   INDEX_DrvAssertMode,            (PFN) DrvAssertMode         },
+    {   INDEX_DrvSetPalette,            (PFN) DrvSetPalette         },
+    {   INDEX_DrvMovePointer,           (PFN) DrvMovePointer        },
+    {   INDEX_DrvSetPointerShape,       (PFN) DrvSetPointerShape    },
+    {   INDEX_DrvGetModes,              (PFN) DrvGetModes           }
+};
+
+// Define the functions you want to hook for 8/16/24/32 pel formats
+
+#define HOOKS_BMF8BPP 0
+
+#define HOOKS_BMF16BPP 0
+
+#define HOOKS_BMF24BPP 0
+
+#define HOOKS_BMF32BPP 0
+
+/******************************Public*Routine******************************\
+* DrvEnableDriver
+*
+* Enables the driver by retrieving the drivers function table and version.
+*
+\**************************************************************************/
+
+BOOL DrvEnableDriver(
+ULONG iEngineVersion,
+ULONG cj,
+PDRVENABLEDATA pded)
+{
+// Engine Version is passed down so future drivers can support previous
+// engine versions.  A next generation driver can support both the old
+// and new engine conventions if told what version of engine it is
+// working with.  For the first version the driver does nothing with it.
+// eVb: 1.1 [DDK Change] - Remove bogus statement
+    //iEngineVersion;
+// eVb: 1.1 [END]
+// Fill in as much as we can.
+
+    if (cj >= sizeof(DRVENABLEDATA))
+        pded->pdrvfn = gadrvfn;
+
+    if (cj >= (sizeof(ULONG) * 2))
+        pded->c = sizeof(gadrvfn) / sizeof(DRVFN);
+
+// DDI version this driver was targeted for is passed back to engine.
+// Future graphic's engine may break calls down to old driver format.
+
+    if (cj >= sizeof(ULONG))
+// eVb: 1.2 [DDK Change] - Use DDI_DRIVER_VERSION_NT4 instead of DDI_DRIVER_VERSION
+        pded->iDriverVersion = DDI_DRIVER_VERSION_NT4;
+// eVb: 1.2 [END]
+
+    return(TRUE);
+}
+
+/******************************Public*Routine******************************\
+* DrvEnablePDEV
+*
+* DDI function, Enables the Physical Device.
+*
+* Return Value: device handle to pdev.
+*
+\**************************************************************************/
+
+DHPDEV DrvEnablePDEV(
+DEVMODEW   *pDevmode,       // Pointer to DEVMODE
+PWSTR       pwszLogAddress, // Logical address
+ULONG       cPatterns,      // number of patterns
+HSURF      *ahsurfPatterns, // return standard patterns
+ULONG       cjGdiInfo,      // Length of memory pointed to by pGdiInfo
+ULONG      *pGdiInfo,       // Pointer to GdiInfo structure
+ULONG       cjDevInfo,      // Length of following PDEVINFO structure
+DEVINFO    *pDevInfo,       // physical device information structure
+HDEV        hdev,           // HDEV, used for callbacks
+PWSTR       pwszDeviceName, // DeviceName - not used
+HANDLE      hDriver)        // Handle to base driver
+{
+    GDIINFO GdiInfo;
+    DEVINFO DevInfo;
+    PPDEV   ppdev = (PPDEV) NULL;
+
+    UNREFERENCED_PARAMETER(pwszLogAddress);
+    UNREFERENCED_PARAMETER(pwszDeviceName);
+
+    // Allocate a physical device structure.
+
+    ppdev = (PPDEV) EngAllocMem(0, sizeof(PDEV), ALLOC_TAG);
+
+    if (ppdev == (PPDEV) NULL)
+    {
+        RIP("DISP DrvEnablePDEV failed EngAllocMem\n");
+        return((DHPDEV) 0);
+    }
+
+    memset(ppdev, 0, sizeof(PDEV));
+
+    // Save the screen handle in the PDEV.
+
+    ppdev->hDriver = hDriver;
+
+    // Get the current screen mode information.  Set up device caps and devinfo.
+
+    if (!bInitPDEV(ppdev, pDevmode, &GdiInfo, &DevInfo))
+    {
+        DISPDBG((0,"DISP DrvEnablePDEV failed\n"));
+        goto error_free;
+    }
+
+    // Initialize the cursor information.
+
+    if (!bInitPointer(ppdev, &DevInfo))
+    {
+        // Not a fatal error...
+        DISPDBG((0, "DrvEnablePDEV failed bInitPointer\n"));
+    }
+
+    // Initialize palette information.
+
+    if (!bInitPaletteInfo(ppdev, &DevInfo))
+    {
+        RIP("DrvEnablePDEV failed bInitPalette\n");
+        goto error_free;
+    }
+
+    // Copy the devinfo into the engine buffer.
+
+    memcpy(pDevInfo, &DevInfo, min(sizeof(DEVINFO), cjDevInfo));
+
+    // Set the pdevCaps with GdiInfo we have prepared to the list of caps for this
+    // pdev.
+
+    memcpy(pGdiInfo, &GdiInfo, min(cjGdiInfo, sizeof(GDIINFO)));
+
+    return((DHPDEV) ppdev);
+
+    // Error case for failure.
+error_free:
+    EngFreeMem(ppdev);
+    return((DHPDEV) 0);
+}
+
+/******************************Public*Routine******************************\
+* DrvCompletePDEV
+*
+* Store the HPDEV, the engines handle for this PDEV, in the DHPDEV.
+*
+\**************************************************************************/
+
+VOID DrvCompletePDEV(
+DHPDEV dhpdev,
+HDEV  hdev)
+{
+    ((PPDEV) dhpdev)->hdevEng = hdev;
+}
+
+/******************************Public*Routine******************************\
+* DrvDisablePDEV
+*
+* Release the resources allocated in DrvEnablePDEV.  If a surface has been
+* enabled DrvDisableSurface will have already been called.
+*
+\**************************************************************************/
+
+VOID DrvDisablePDEV(
+DHPDEV dhpdev)
+{
+    vDisablePalette((PPDEV) dhpdev);
+    EngFreeMem(dhpdev);
+}
+
+/******************************Public*Routine******************************\
+* DrvEnableSurface
+*
+* Enable the surface for the device.  Hook the calls this driver supports.
+*
+* Return: Handle to the surface if successful, 0 for failure.
+*
+\**************************************************************************/
+
+HSURF DrvEnableSurface(
+DHPDEV dhpdev)
+{
+    PPDEV ppdev;
+    HSURF hsurf;
+    SIZEL sizl;
+    ULONG ulBitmapType;
+    FLONG flHooks;
+
+    // Create engine bitmap around frame buffer.
+
+    ppdev = (PPDEV) dhpdev;
+
+    if (!bInitSURF(ppdev, TRUE))
+    {
+        RIP("DISP DrvEnableSurface failed bInitSURF\n");
+        return(FALSE);
+    }
+
+    sizl.cx = ppdev->cxScreen;
+    sizl.cy = ppdev->cyScreen;
+
+    if (ppdev->ulBitCount == 8)
+    {
+        if (!bInit256ColorPalette(ppdev)) {
+            RIP("DISP DrvEnableSurface failed to init the 8bpp palette\n");
+            return(FALSE);
+        }
+        ulBitmapType = BMF_8BPP;
+        flHooks = HOOKS_BMF8BPP;
+    }
+    else if (ppdev->ulBitCount == 16)
+    {
+        ulBitmapType = BMF_16BPP;
+        flHooks = HOOKS_BMF16BPP;
+    }
+    else if (ppdev->ulBitCount == 24)
+    {
+        ulBitmapType = BMF_24BPP;
+        flHooks = HOOKS_BMF24BPP;
+    }
+    else
+    {
+        ulBitmapType = BMF_32BPP;
+        flHooks = HOOKS_BMF32BPP;
+    }
+// eVb: 1.3 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping
+    ppdev->flHooks = flHooks;
+// eVb: 1.3 [END]
+// eVb: 1.4 [DDK Change] - Use EngCreateDeviceSurface instead of EngCreateBitmap
+    hsurf = (HSURF)EngCreateDeviceSurface((DHSURF)ppdev, 
+                                           sizl,
+                                           ulBitmapType);
+
+    if (hsurf == (HSURF) 0)
+    {
+        RIP("DISP DrvEnableSurface failed EngCreateDeviceSurface\n");
+        return(FALSE);
+    }
+// eVb: 1.4 [END]
+
+// eVb: 1.5 [DDK Change] - Use EngModifySurface instead of EngAssociateSurface
+    if ( !EngModifySurface(hsurf,
+                           ppdev->hdevEng,
+                           ppdev->flHooks | HOOK_SYNCHRONIZE,
+                           MS_NOTSYSTEMMEMORY,
+                           (DHSURF)ppdev,
+                           ppdev->pjScreen,
+                           ppdev->lDeltaScreen,
+                           NULL))
+    {
+        RIP("DISP DrvEnableSurface failed EngModifySurface\n");
+        return(FALSE);
+    }
+// eVb: 1.5 [END]
+    ppdev->hsurfEng = hsurf;
+
+    return(hsurf);
+}
+
+/******************************Public*Routine******************************\
+* DrvDisableSurface
+*
+* Free resources allocated by DrvEnableSurface.  Release the surface.
+*
+\**************************************************************************/
+
+VOID DrvDisableSurface(
+DHPDEV dhpdev)
+{
+    EngDeleteSurface(((PPDEV) dhpdev)->hsurfEng);
+    vDisableSURF((PPDEV) dhpdev);
+    ((PPDEV) dhpdev)->hsurfEng = (HSURF) 0;
+}
+
+/******************************Public*Routine******************************\
+* DrvAssertMode
+*
+* This asks the device to reset itself to the mode of the pdev passed in.
+*
+\**************************************************************************/
+
+BOOL DrvAssertMode(
+DHPDEV dhpdev,
+BOOL bEnable)
+{
+    PPDEV   ppdev = (PPDEV) dhpdev;
+    ULONG   ulReturn;
+    PBYTE   pjScreen;
+
+    if (bEnable)
+    {
+        //
+        // The screen must be reenabled, reinitialize the device to clean state.
+        //
+// eVb: 1.6 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping
+        pjScreen = ppdev->pjScreen;
+
+        if (!bInitSURF(ppdev, FALSE))
+        {
+            DISPDBG((0, "DISP DrvAssertMode failed bInitSURF\n"));
+            return (FALSE);
+        }
+
+        if (pjScreen != ppdev->pjScreen) {
+
+            if ( !EngModifySurface(ppdev->hsurfEng,
+                                   ppdev->hdevEng,
+                                   ppdev->flHooks | HOOK_SYNCHRONIZE,
+                                   MS_NOTSYSTEMMEMORY,
+                                   (DHSURF)ppdev,
+                                   ppdev->pjScreen,
+                                   ppdev->lDeltaScreen,
+                                   NULL))
+            {
+                DISPDBG((0, "DISP DrvAssertMode failed EngModifySurface\n"));
+                return (FALSE);
+            }
+        }
+// eVb: 1.6 [END]
+        return (TRUE);
+    }
+    else
+    {
+        //
+        // We must give up the display.
+        // Call the kernel driver to reset the device to a known state.
+        //
+
+        if (EngDeviceIoControl(ppdev->hDriver,
+                               IOCTL_VIDEO_RESET_DEVICE,
+                               NULL,
+                               0,
+                               NULL,
+                               0,
+                               &ulReturn))
+        {
+            RIP("DISP DrvAssertMode failed IOCTL");
+            return FALSE;
+        }
+        else
+        {
+            return TRUE;
+        }
+    }
+}
+
+/******************************Public*Routine******************************\
+* DrvGetModes
+*
+* Returns the list of available modes for the device.
+*
+\**************************************************************************/
+
+ULONG DrvGetModes(
+HANDLE hDriver,
+ULONG cjSize,
+DEVMODEW *pdm)
+
+{
+
+    DWORD cModes;
+    DWORD cbOutputSize;
+    PVIDEO_MODE_INFORMATION pVideoModeInformation, pVideoTemp;
+    DWORD cOutputModes = cjSize / (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
+    DWORD cbModeSize;
+
+    DISPDBG((3, "DrvGetModes\n"));
+
+    cModes = getAvailableModes(hDriver,
+                               (PVIDEO_MODE_INFORMATION *) &pVideoModeInformation,
+                               &cbModeSize);
+
+    if (cModes == 0)
+    {
+        DISPDBG((0, "DrvGetModes failed to get mode information"));
+        return 0;
+    }
+
+    if (pdm == NULL)
+    {
+        cbOutputSize = cModes * (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
+    }
+    else
+    {
+        //
+        // Now copy the information for the supported modes back into the output
+        // buffer
+        //
+
+        cbOutputSize = 0;
+
+        pVideoTemp = pVideoModeInformation;
+
+        do
+        {
+            if (pVideoTemp->Length != 0)
+            {
+                if (cOutputModes == 0)
+                {
+                    break;
+                }
+
+                //
+                // Zero the entire structure to start off with.
+                //
+
+                memset(pdm, 0, sizeof(DEVMODEW));
+
+                //
+                // Set the name of the device to the name of the DLL.
+                //
+
+                memcpy(pdm->dmDeviceName, DLL_NAME, sizeof(DLL_NAME));
+
+                pdm->dmSpecVersion      = DM_SPECVERSION;
+                pdm->dmDriverVersion    = DM_SPECVERSION;
+                pdm->dmSize             = sizeof(DEVMODEW);
+                pdm->dmDriverExtra      = DRIVER_EXTRA_SIZE;
+
+                pdm->dmBitsPerPel       = pVideoTemp->NumberOfPlanes *
+                                          pVideoTemp->BitsPerPlane;
+                pdm->dmPelsWidth        = pVideoTemp->VisScreenWidth;
+                pdm->dmPelsHeight       = pVideoTemp->VisScreenHeight;
+                pdm->dmDisplayFrequency = pVideoTemp->Frequency;
+                pdm->dmDisplayFlags     = 0;
+
+                pdm->dmFields           = DM_BITSPERPEL       |
+                                          DM_PELSWIDTH        |
+                                          DM_PELSHEIGHT       |
+                                          DM_DISPLAYFREQUENCY |
+                                          DM_DISPLAYFLAGS     ;
+
+                //
+                // Go to the next DEVMODE entry in the buffer.
+                //
+
+                cOutputModes--;
+
+                pdm = (LPDEVMODEW) ( ((ULONG)pdm) + sizeof(DEVMODEW) +
+                                                   DRIVER_EXTRA_SIZE);
+
+                cbOutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
+
+            }
+
+            pVideoTemp = (PVIDEO_MODE_INFORMATION)
+                (((PUCHAR)pVideoTemp) + cbModeSize);
+
+        } while (--cModes);
+    }
+
+    EngFreeMem(pVideoModeInformation);
+
+    return cbOutputSize;
+
+}
diff --git a/reactos/drivers/video/displays/framebuf_new/framebuf_new.rbuild b/reactos/drivers/video/displays/framebuf_new/framebuf_new.rbuild
new file mode 100644 (file)
index 0000000..991954e
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
+<module name="framebuf_new" type="kernelmodedll" entrypoint="DrvEnableDriver@12" installbase="system32" installname="framebuf_new.dll" crt="libcntpr">
+       <importlibrary definition="framebuf_new.spec" />
+       <include base="framebuf_new">.</include>
+       <library>win32k</library>
+       <file>debug.c</file>
+       <file>enable.c</file>
+       <file>palette.c</file>
+       <file>pointer.c</file>
+       <file>screen.c</file>
+       <file>framebuf_new.rc</file>
+       <group compilerset="gcc">
+        <compilerflag>-mrtd</compilerflag>
+        <compilerflag>-fno-builtin</compilerflag>
+               <compilerflag>-Wno-unused-variable</compilerflag>
+       </group>
+       <pch>driver.h</pch>
+</module>
diff --git a/reactos/drivers/video/displays/framebuf_new/framebuf_new.rc b/reactos/drivers/video/displays/framebuf_new/framebuf_new.rc
new file mode 100644 (file)
index 0000000..98ba262
--- /dev/null
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION   "Framebuffer Display Driver\0"
+#define REACTOS_STR_INTERNAL_NAME          "framebuf\0"
+#define REACTOS_STR_ORIGINAL_FILENAME  "framebuf.dll\0"
+#include <reactos/version.rc>
diff --git a/reactos/drivers/video/displays/framebuf_new/framebuf_new.spec b/reactos/drivers/video/displays/framebuf_new/framebuf_new.spec
new file mode 100644 (file)
index 0000000..aec115e
--- /dev/null
@@ -0,0 +1 @@
+@ stdcall DrvEnableDriver(long long ptr)
diff --git a/reactos/drivers/video/displays/framebuf_new/palette.c b/reactos/drivers/video/displays/framebuf_new/palette.c
new file mode 100755 (executable)
index 0000000..c8cff99
--- /dev/null
@@ -0,0 +1,332 @@
+/*
+ * PROJECT:         ReactOS Framebuffer Display Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/displays/framebuf/palette.c
+ * PURPOSE:         Palette Support
+ * PROGRAMMERS:     Copyright (c) 1992-1995 Microsoft Corporation
+ */
+
+#include "driver.h"
+
+// Global Table defining the 20 Window Default Colors.        For 256 color
+// palettes the first 10 must be put at the beginning of the palette
+// and the last 10 at the end of the palette.
+
+const PALETTEENTRY BASEPALETTE[20] =
+{
+    { 0,   0,   0,   0 },       // 0
+    { 0x80,0,   0,   0 },       // 1
+    { 0,   0x80,0,   0 },       // 2
+    { 0x80,0x80,0,   0 },       // 3
+    { 0,   0,   0x80,0 },       // 4
+    { 0x80,0,   0x80,0 },       // 5
+    { 0,   0x80,0x80,0 },       // 6
+    { 0xC0,0xC0,0xC0,0 },       // 7
+    { 192, 220, 192, 0 },       // 8
+    { 166, 202, 240, 0 },       // 9
+    { 255, 251, 240, 0 },       // 10
+    { 160, 160, 164, 0 },       // 11
+    { 0x80,0x80,0x80,0 },       // 12
+    { 0xFF,0,   0   ,0 },       // 13
+    { 0,   0xFF,0   ,0 },       // 14
+    { 0xFF,0xFF,0   ,0 },       // 15
+    { 0   ,0,   0xFF,0 },       // 16
+    { 0xFF,0,   0xFF,0 },       // 17
+    { 0,   0xFF,0xFF,0 },       // 18
+    { 0xFF,0xFF,0xFF,0 },       // 19
+};
+
+BOOL bInitDefaultPalette(PPDEV ppdev, DEVINFO *pDevInfo);
+
+/******************************Public*Routine******************************\
+* bInitPaletteInfo
+*
+* Initializes the palette information for this PDEV.
+*
+* Called by DrvEnablePDEV.
+*
+\**************************************************************************/
+
+BOOL bInitPaletteInfo(PPDEV ppdev, DEVINFO *pDevInfo)
+{
+    if (!bInitDefaultPalette(ppdev, pDevInfo))
+        return(FALSE);
+
+    return(TRUE);
+}
+
+/******************************Public*Routine******************************\
+* vDisablePalette
+*
+* Frees resources allocated by bInitPaletteInfo.
+*
+\**************************************************************************/
+
+VOID vDisablePalette(PPDEV ppdev)
+{
+// Delete the default palette if we created one.
+
+    if (ppdev->hpalDefault)
+    {
+        EngDeletePalette(ppdev->hpalDefault);
+        ppdev->hpalDefault = (HPALETTE) 0;
+    }
+
+    if (ppdev->pPal != (PPALETTEENTRY)NULL)
+        EngFreeMem((PVOID)ppdev->pPal);
+}
+
+/******************************Public*Routine******************************\
+* bInitDefaultPalette
+*
+* Initializes default palette for PDEV.
+*
+\**************************************************************************/
+
+BOOL bInitDefaultPalette(PPDEV ppdev, DEVINFO *pDevInfo)
+{
+    if (ppdev->ulBitCount == 8)
+    {
+        ULONG ulLoop;
+        BYTE jRed,jGre,jBlu;
+
+        //
+        // Allocate our palette
+        //
+
+        ppdev->pPal = (PPALETTEENTRY)EngAllocMem(0, sizeof(PALETTEENTRY) * 256,
+                                                 ALLOC_TAG);
+
+        if ((ppdev->pPal) == NULL) {
+            RIP("DISP bInitDefaultPalette() failed EngAllocMem\n");
+            return(FALSE);
+        }
+
+        //
+        // Generate 256 (8*4*4) RGB combinations to fill the palette
+        //
+
+        jRed = jGre = jBlu = 0;
+
+        for (ulLoop = 0; ulLoop < 256; ulLoop++)
+        {
+            ppdev->pPal[ulLoop].peRed   = jRed;
+            ppdev->pPal[ulLoop].peGreen = jGre;
+            ppdev->pPal[ulLoop].peBlue  = jBlu;
+            ppdev->pPal[ulLoop].peFlags = (BYTE)0;
+
+            if (!(jRed += 32))
+            if (!(jGre += 32))
+            jBlu += 64;
+        }
+
+        //
+        // Fill in Windows Reserved Colors from the WIN 3.0 DDK
+        // The Window Manager reserved the first and last 10 colors for
+        // painting windows borders and for non-palette managed applications.
+        //
+
+        for (ulLoop = 0; ulLoop < 10; ulLoop++)
+        {
+            //
+            // First 10
+            //
+
+            ppdev->pPal[ulLoop] = BASEPALETTE[ulLoop];
+
+            //
+            // Last 10
+            //
+
+            ppdev->pPal[246 + ulLoop] = BASEPALETTE[ulLoop+10];
+        }
+
+        //
+        // Create handle for palette.
+        //
+
+        ppdev->hpalDefault =
+        pDevInfo->hpalDefault = EngCreatePalette(PAL_INDEXED,
+                                                   256,
+                                                   (PULONG) ppdev->pPal,
+                                                   0,0,0);
+
+        if (ppdev->hpalDefault == (HPALETTE) 0)
+        {
+            RIP("DISP bInitDefaultPalette failed EngCreatePalette\n");
+            EngFreeMem(ppdev->pPal);
+            return(FALSE);
+        }
+
+        //
+        // Initialize the hardware with the initial palette.
+        //
+
+        return(TRUE);
+
+    } else {
+
+        ppdev->hpalDefault =
+        pDevInfo->hpalDefault = EngCreatePalette(PAL_BITFIELDS,
+                                                   0,(PULONG) NULL,
+                                                   ppdev->flRed,
+                                                   ppdev->flGreen,
+                                                   ppdev->flBlue);
+
+        if (ppdev->hpalDefault == (HPALETTE) 0)
+        {
+            RIP("DISP bInitDefaultPalette failed EngCreatePalette\n");
+            return(FALSE);
+        }
+    }
+
+    return(TRUE);
+}
+
+/******************************Public*Routine******************************\
+* bInit256ColorPalette
+*
+* Initialize the hardware's palette registers.
+*
+\**************************************************************************/
+
+BOOL bInit256ColorPalette(PPDEV ppdev)
+{
+    BYTE        ajClutSpace[MAX_CLUT_SIZE];
+    PVIDEO_CLUT pScreenClut;
+    ULONG       ulReturnedDataLength;
+    ULONG       cColors;
+    PVIDEO_CLUTDATA pScreenClutData;
+
+    if (ppdev->ulBitCount == 8)
+    {
+        //
+        // Fill in pScreenClut header info:
+        //
+
+        pScreenClut             = (PVIDEO_CLUT) ajClutSpace;
+        pScreenClut->NumEntries = 256;
+        pScreenClut->FirstEntry = 0;
+
+        //
+        // Copy colours in:
+        //
+
+        cColors = 256;
+        pScreenClutData = (PVIDEO_CLUTDATA) (&(pScreenClut->LookupTable[0]));
+
+        while(cColors--)
+        {
+            pScreenClutData[cColors].Red =    ppdev->pPal[cColors].peRed >>
+                                              ppdev->cPaletteShift;
+            pScreenClutData[cColors].Green =  ppdev->pPal[cColors].peGreen >>
+                                              ppdev->cPaletteShift;
+            pScreenClutData[cColors].Blue =   ppdev->pPal[cColors].peBlue >>
+                                              ppdev->cPaletteShift;
+            pScreenClutData[cColors].Unused = 0;
+        }
+
+        //
+        // Set palette registers:
+        //
+
+        if (EngDeviceIoControl(ppdev->hDriver,
+                               IOCTL_VIDEO_SET_COLOR_REGISTERS,
+                               pScreenClut,
+                               MAX_CLUT_SIZE,
+                               NULL,
+                               0,
+                               &ulReturnedDataLength))
+        {
+            DISPDBG((0, "Failed bEnablePalette"));
+            return(FALSE);
+        }
+    }
+
+    DISPDBG((5, "Passed bEnablePalette"));
+
+    return(TRUE);
+}
+
+/******************************Public*Routine******************************\
+* DrvSetPalette
+*
+* DDI entry point for manipulating the palette.
+*
+\**************************************************************************/
+
+BOOL DrvSetPalette(
+DHPDEV  dhpdev,
+PALOBJ* ppalo,
+FLONG   fl,
+ULONG   iStart,
+ULONG   cColors)
+{
+    BYTE            ajClutSpace[MAX_CLUT_SIZE];
+    PVIDEO_CLUT     pScreenClut;
+    PVIDEO_CLUTDATA pScreenClutData;
+    PDEV*           ppdev;
+
+    UNREFERENCED_PARAMETER(fl);
+
+    ppdev = (PDEV*) dhpdev;
+
+    //
+    // Fill in pScreenClut header info:
+    //
+
+    pScreenClut             = (PVIDEO_CLUT) ajClutSpace;
+    pScreenClut->NumEntries = (USHORT) cColors;
+    pScreenClut->FirstEntry = (USHORT) iStart;
+
+    pScreenClutData = (PVIDEO_CLUTDATA) (&(pScreenClut->LookupTable[0]));
+
+    if (cColors != PALOBJ_cGetColors(ppalo, iStart, cColors,
+                                     (ULONG*) pScreenClutData))
+    {
+        DISPDBG((0, "DrvSetPalette failed PALOBJ_cGetColors\n"));
+        return (FALSE);
+    }
+
+    //
+    // Set the high reserved byte in each palette entry to 0.
+    // Do the appropriate palette shifting to fit in the DAC.
+    //
+
+    if (ppdev->cPaletteShift)
+    {
+        while(cColors--)
+        {
+            pScreenClutData[cColors].Red >>= ppdev->cPaletteShift;
+            pScreenClutData[cColors].Green >>= ppdev->cPaletteShift;
+            pScreenClutData[cColors].Blue >>= ppdev->cPaletteShift;
+            pScreenClutData[cColors].Unused = 0;
+        }
+    }
+    else
+    {
+        while(cColors--)
+        {
+            pScreenClutData[cColors].Unused = 0;
+        }
+    }
+
+    //
+    // Set palette registers
+    //
+
+    if (EngDeviceIoControl(ppdev->hDriver,
+                           IOCTL_VIDEO_SET_COLOR_REGISTERS,
+                           pScreenClut,
+                           MAX_CLUT_SIZE,
+                           NULL,
+                           0,
+                           &cColors))
+    {
+        DISPDBG((0, "DrvSetPalette failed EngDeviceIoControl\n"));
+        return (FALSE);
+    }
+
+    return(TRUE);
+
+}
diff --git a/reactos/drivers/video/displays/framebuf_new/pointer.c b/reactos/drivers/video/displays/framebuf_new/pointer.c
new file mode 100755 (executable)
index 0000000..d3752a2
--- /dev/null
@@ -0,0 +1,455 @@
+/*
+ * PROJECT:         ReactOS Framebuffer Display Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/displays/framebuf/pointer.c
+ * PURPOSE:         Hardware Pointer Support
+ * PROGRAMMERS:     Copyright (c) 1992-1995 Microsoft Corporation
+ */
+
+#include "driver.h"
+
+BOOL bCopyColorPointer(
+PPDEV ppdev,
+SURFOBJ *psoMask,
+SURFOBJ *psoColor,
+XLATEOBJ *pxlo);
+
+BOOL bCopyMonoPointer(
+PPDEV ppdev,
+SURFOBJ *psoMask);
+
+BOOL bSetHardwarePointerShape(
+SURFOBJ  *pso,
+SURFOBJ  *psoMask,
+SURFOBJ  *psoColor,
+XLATEOBJ *pxlo,
+LONG      x,
+LONG      y,
+FLONG     fl);
+
+/******************************Public*Routine******************************\
+* DrvMovePointer
+*
+* Moves the hardware pointer to a new position.
+*
+\**************************************************************************/
+
+VOID DrvMovePointer
+(
+    SURFOBJ *pso,
+    LONG     x,
+    LONG     y,
+    RECTL   *prcl
+)
+{
+    PPDEV ppdev = (PPDEV) pso->dhpdev;
+    DWORD returnedDataLength;
+    VIDEO_POINTER_POSITION NewPointerPosition;
+
+    // We don't use the exclusion rectangle because we only support
+    // hardware Pointers. If we were doing our own Pointer simulations
+    // we would want to update prcl so that the engine would call us
+    // to exclude out pointer before drawing to the pixels in prcl.
+
+    UNREFERENCED_PARAMETER(prcl);
+
+    if (x == -1)
+    {
+        //
+        // A new position of (-1,-1) means hide the pointer.
+        //
+
+        if (EngDeviceIoControl(ppdev->hDriver,
+                               IOCTL_VIDEO_DISABLE_POINTER,
+                               NULL,
+                               0,
+                               NULL,
+                               0,
+                               &returnedDataLength))
+        {
+            //
+            // Not the end of the world, print warning in checked build.
+            //
+
+            DISPDBG((1, "DISP vMoveHardwarePointer failed IOCTL_VIDEO_DISABLE_POINTER\n"));
+        }
+    }
+    else
+    {
+        NewPointerPosition.Column = (SHORT) x - (SHORT) (ppdev->ptlHotSpot.x);
+        NewPointerPosition.Row    = (SHORT) y - (SHORT) (ppdev->ptlHotSpot.y);
+
+        //
+        // Call miniport driver to move Pointer.
+        //
+
+        if (EngDeviceIoControl(ppdev->hDriver,
+                               IOCTL_VIDEO_SET_POINTER_POSITION,
+                               &NewPointerPosition,
+                               sizeof(VIDEO_POINTER_POSITION),
+                               NULL,
+                               0,
+                               &returnedDataLength))
+        {
+            //
+            // Not the end of the world, print warning in checked build.
+            //
+
+            DISPDBG((1, "DISP vMoveHardwarePointer failed IOCTL_VIDEO_SET_POINTER_POSITION\n"));
+        }
+    }
+}
+
+/******************************Public*Routine******************************\
+* DrvSetPointerShape
+*
+* Sets the new pointer shape.
+*
+\**************************************************************************/
+
+ULONG DrvSetPointerShape
+(
+    SURFOBJ  *pso,
+    SURFOBJ  *psoMask,
+    SURFOBJ  *psoColor,
+    XLATEOBJ *pxlo,
+    LONG      xHot,
+    LONG      yHot,
+    LONG      x,
+    LONG      y,
+    RECTL    *prcl,
+    FLONG     fl
+)
+{
+    PPDEV   ppdev = (PPDEV) pso->dhpdev;
+    DWORD   returnedDataLength;
+
+    // We don't use the exclusion rectangle because we only support
+    // hardware Pointers. If we were doing our own Pointer simulations
+    // we would want to update prcl so that the engine would call us
+    // to exclude out pointer before drawing to the pixels in prcl.
+    UNREFERENCED_PARAMETER(prcl);
+
+    if (ppdev->pPointerAttributes == (PVIDEO_POINTER_ATTRIBUTES) NULL)
+    {
+        // Mini-port has no hardware Pointer support.
+        return(SPS_ERROR);
+    }
+
+    // See if we are being asked to hide the pointer
+
+    if (psoMask == (SURFOBJ *) NULL)
+    {
+        if (EngDeviceIoControl(ppdev->hDriver,
+                               IOCTL_VIDEO_DISABLE_POINTER,
+                               NULL,
+                               0,
+                               NULL,
+                               0,
+                               &returnedDataLength))
+        {
+            //
+            // It should never be possible to fail.
+            // Message supplied for debugging.
+            //
+
+            DISPDBG((1, "DISP bSetHardwarePointerShape failed IOCTL_VIDEO_DISABLE_POINTER\n"));
+        }
+
+        return(TRUE);
+    }
+
+    ppdev->ptlHotSpot.x = xHot;
+    ppdev->ptlHotSpot.y = yHot;
+
+    if (!bSetHardwarePointerShape(pso,psoMask,psoColor,pxlo,x,y,fl))
+    {
+            if (ppdev->fHwCursorActive) {
+                ppdev->fHwCursorActive = FALSE;
+
+                if (EngDeviceIoControl(ppdev->hDriver,
+                                       IOCTL_VIDEO_DISABLE_POINTER,
+                                       NULL,
+                                       0,
+                                       NULL,
+                                       0,
+                                       &returnedDataLength)) {
+
+                    DISPDBG((1, "DISP bSetHardwarePointerShape failed IOCTL_VIDEO_DISABLE_POINTER\n"));
+                }
+            }
+
+            //
+            // Mini-port declines to realize this Pointer
+            //
+
+            return(SPS_DECLINE);
+    }
+    else
+    {
+        ppdev->fHwCursorActive = TRUE;
+    }
+
+    return(SPS_ACCEPT_NOEXCLUDE);
+}
+
+/******************************Public*Routine******************************\
+* bSetHardwarePointerShape
+*
+* Changes the shape of the Hardware Pointer.
+*
+* Returns: True if successful, False if Pointer shape can't be hardware.
+*
+\**************************************************************************/
+
+BOOL bSetHardwarePointerShape(
+SURFOBJ  *pso,
+SURFOBJ  *psoMask,
+SURFOBJ  *psoColor,
+XLATEOBJ *pxlo,
+LONG      x,
+LONG      y,
+FLONG     fl)
+{
+    PPDEV     ppdev = (PPDEV) pso->dhpdev;
+    PVIDEO_POINTER_ATTRIBUTES pPointerAttributes = ppdev->pPointerAttributes;
+    DWORD     returnedDataLength;
+
+    if (psoColor != (SURFOBJ *) NULL)
+    {
+        if ((ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER) &&
+                bCopyColorPointer(ppdev, psoMask, psoColor, pxlo))
+        {
+            pPointerAttributes->Flags |= VIDEO_MODE_COLOR_POINTER;
+        } else {
+            return(FALSE);
+        }
+
+    } else {
+
+        if ((ppdev->PointerCapabilities.Flags & VIDEO_MODE_MONO_POINTER) &&
+                bCopyMonoPointer(ppdev, psoMask))
+        {
+            pPointerAttributes->Flags |= VIDEO_MODE_MONO_POINTER;
+        } else {
+            return(FALSE);
+        }
+    }
+
+    //
+    // Initialize Pointer attributes and position
+    //
+
+    pPointerAttributes->Enable = 1;
+
+    //
+    // if x,y = -1,-1 then pass them directly to the miniport so that
+    // the cursor will be disabled
+
+    pPointerAttributes->Column = (SHORT)(x);
+    pPointerAttributes->Row    = (SHORT)(y);
+
+    if ((x != -1) || (y != -1)) {
+        pPointerAttributes->Column -= (SHORT)(ppdev->ptlHotSpot.x);
+        pPointerAttributes->Row    -= (SHORT)(ppdev->ptlHotSpot.y);
+    }
+
+    //
+    // set animate flags
+    //
+
+    if (fl & SPS_ANIMATESTART) {
+        pPointerAttributes->Flags |= VIDEO_MODE_ANIMATE_START;
+    } else if (fl & SPS_ANIMATEUPDATE) {
+        pPointerAttributes->Flags |= VIDEO_MODE_ANIMATE_UPDATE;
+    }
+
+    //
+    // Set the new Pointer shape.
+    //
+
+    if (EngDeviceIoControl(ppdev->hDriver,
+                           IOCTL_VIDEO_SET_POINTER_ATTR,
+                           pPointerAttributes,
+                           ppdev->cjPointerAttributes,
+                           NULL,
+                           0,
+                           &returnedDataLength)) {
+
+        DISPDBG((1, "DISP:Failed IOCTL_VIDEO_SET_POINTER_ATTR call\n"));
+        return(FALSE);
+    }
+
+    return(TRUE);
+}
+
+/******************************Public*Routine******************************\
+* bCopyMonoPointer
+*
+* Copies two monochrome masks into a buffer of the maximum size handled by the
+* miniport, with any extra bits set to 0.  The masks are converted to topdown
+* form if they aren't already.  Returns TRUE if we can handle this pointer in
+* hardware, FALSE if not.
+*
+\**************************************************************************/
+
+BOOL bCopyMonoPointer(
+    PPDEV    ppdev,
+    SURFOBJ *pso)
+{
+    ULONG cy;
+    PBYTE pjSrcAnd, pjSrcXor;
+    LONG  lDeltaSrc, lDeltaDst;
+    LONG  lSrcWidthInBytes;
+    ULONG cxSrc = pso->sizlBitmap.cx;
+    ULONG cySrc = pso->sizlBitmap.cy;
+    ULONG cxSrcBytes;
+    PVIDEO_POINTER_ATTRIBUTES pPointerAttributes = ppdev->pPointerAttributes;
+    PBYTE pjDstAnd = pPointerAttributes->Pixels;
+    PBYTE pjDstXor = pPointerAttributes->Pixels;
+
+    // Make sure the new pointer isn't too big to handle
+    // (*2 because both masks are in there)
+    if ((cxSrc > ppdev->PointerCapabilities.MaxWidth) ||
+        (cySrc > (ppdev->PointerCapabilities.MaxHeight * 2)))
+    {
+        return(FALSE);
+    }
+
+    pjDstXor += ((ppdev->PointerCapabilities.MaxWidth + 7) / 8) *
+            ppdev->pPointerAttributes->Height;
+
+    // set the desk and mask to 0xff
+    RtlFillMemory(pjDstAnd, ppdev->pPointerAttributes->WidthInBytes *
+            ppdev->pPointerAttributes->Height, 0xFF);
+
+    // Zero the dest XOR mask
+    RtlZeroMemory(pjDstXor, ppdev->pPointerAttributes->WidthInBytes *
+            ppdev->pPointerAttributes->Height);
+
+    cxSrcBytes = (cxSrc + 7) / 8;
+
+    if ((lDeltaSrc = pso->lDelta) < 0)
+    {
+        lSrcWidthInBytes = -lDeltaSrc;
+    } else {
+        lSrcWidthInBytes = lDeltaSrc;
+    }
+
+    pjSrcAnd = (PBYTE) pso->pvBits;
+
+    // If the incoming pointer bitmap is bottomup, we'll flip it to topdown to
+    // save the miniport some work
+    if (!(pso->fjBitmap & BMF_TOPDOWN))
+    {
+        // Copy from the bottom
+        pjSrcAnd += lSrcWidthInBytes * (cySrc - 1);
+    }
+
+    // Height of just AND mask
+    cySrc = cySrc / 2;
+
+    // Point to XOR mask
+    pjSrcXor = pjSrcAnd + (cySrc * lDeltaSrc);
+
+    // Offset from end of one dest scan to start of next
+    lDeltaDst = ppdev->pPointerAttributes->WidthInBytes;
+
+    for (cy = 0; cy < cySrc; ++cy)
+    {
+        RtlCopyMemory(pjDstAnd, pjSrcAnd, cxSrcBytes);
+        RtlCopyMemory(pjDstXor, pjSrcXor, cxSrcBytes);
+
+        // Point to next source and dest scans
+        pjSrcAnd += lDeltaSrc;
+        pjSrcXor += lDeltaSrc;
+        pjDstAnd += lDeltaDst;
+        pjDstXor += lDeltaDst;
+    }
+
+    return(TRUE);
+}
+
+/******************************Public*Routine******************************\
+* bCopyColorPointer
+*
+* Copies the mono and color masks into the buffer of maximum size
+* handled by the miniport with any extra bits set to 0. Color translation
+* is handled at this time. The masks are converted to topdown form if they
+* aren't already.  Returns TRUE if we can handle this pointer in  hardware,
+* FALSE if not.
+*
+\**************************************************************************/
+BOOL bCopyColorPointer(
+PPDEV ppdev,
+SURFOBJ *psoMask,
+SURFOBJ *psoColor,
+XLATEOBJ *pxlo)
+{
+    return(FALSE);
+}
+
+
+/******************************Public*Routine******************************\
+* bInitPointer
+*
+* Initialize the Pointer attributes.
+*
+\**************************************************************************/
+
+BOOL bInitPointer(PPDEV ppdev, DEVINFO *pdevinfo)
+{
+    DWORD    returnedDataLength;
+
+    ppdev->pPointerAttributes = (PVIDEO_POINTER_ATTRIBUTES) NULL;
+    ppdev->cjPointerAttributes = 0; // initialized in screen.c
+
+    //
+    // Ask the miniport whether it provides pointer support.
+    //
+
+    if (EngDeviceIoControl(ppdev->hDriver,
+                           IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES,
+                           &ppdev->ulMode,
+                           sizeof(PVIDEO_MODE),
+                           &ppdev->PointerCapabilities,
+                           sizeof(ppdev->PointerCapabilities),
+                           &returnedDataLength))
+    {
+         return(FALSE);
+    }
+
+    //
+    // If neither mono nor color hardware pointer is supported, there's no
+    // hardware pointer support and we're done.
+    //
+
+    if ((!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_MONO_POINTER)) &&
+        (!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER)))
+    {
+        return(TRUE);
+    }
+
+    //
+    // Note: The buffer itself is allocated after we set the
+    // mode. At that time we know the pixel depth and we can
+    // allocate the correct size for the color pointer if supported.
+    //
+
+    //
+    // Set the asynchronous support status (async means miniport is capable of
+    // drawing the Pointer at any time, with no interference with any ongoing
+    // drawing operation)
+    //
+
+    if (ppdev->PointerCapabilities.Flags & VIDEO_MODE_ASYNC_POINTER)
+    {
+       pdevinfo->flGraphicsCaps |= GCAPS_ASYNCMOVE;
+    }
+    else
+    {
+       pdevinfo->flGraphicsCaps &= ~GCAPS_ASYNCMOVE;
+    }
+
+    return(TRUE);
+}
diff --git a/reactos/drivers/video/displays/framebuf_new/screen.c b/reactos/drivers/video/displays/framebuf_new/screen.c
new file mode 100755 (executable)
index 0000000..7ea4443
--- /dev/null
@@ -0,0 +1,604 @@
+/*
+ * PROJECT:         ReactOS Framebuffer Display Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/displays/framebuf/screen.c
+ * PURPOSE:         Surface, Screen and PDEV support/initialization
+ * PROGRAMMERS:     Copyright (c) 1992-1995 Microsoft Corporation
+ *                  ReactOS Portable Systems Group
+ */
+#include "driver.h"
+
+#define SYSTM_LOGFONT {16,7,0,0,700,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH | FF_DONTCARE,L"System"}
+#define HELVE_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,VARIABLE_PITCH | FF_DONTCARE,L"MS Sans Serif"}
+#define COURI_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_DONTCARE, L"Courier"}
+
+// This is the basic devinfo for a default driver.  This is used as a base and customized based
+// on information passed back from the miniport driver.
+
+const DEVINFO gDevInfoFrameBuffer = {
+    ( GCAPS_OPAQUERECT
+// eVb: 2.8 [DDK CHANGE] - No dithering support
+// eVb: 2.8 [END]
+                   ), /* Graphics capabilities         */
+    SYSTM_LOGFONT,    /* Default font description */
+    HELVE_LOGFONT,    /* ANSI variable font description   */
+    COURI_LOGFONT,    /* ANSI fixed font description          */
+    0,                /* Count of device fonts          */
+    0,                /* Preferred DIB format          */
+// eVb: 2.9 [DDK CHANGE] - No dithering support
+    0,                /* Width of color dither          */
+    0,                /* Height of color dither   */
+// eVb: 2.9 [END]
+    0                 /* Default palette to use for this device */
+};
+
+/******************************Public*Routine******************************\
+* bInitSURF
+*
+* Enables the surface.        Maps the frame buffer into memory.
+*
+\**************************************************************************/
+
+BOOL bInitSURF(PPDEV ppdev, BOOL bFirst)
+{
+    DWORD returnedDataLength;
+    DWORD MaxWidth, MaxHeight;
+    VIDEO_MEMORY videoMemory;
+    VIDEO_MEMORY_INFORMATION videoMemoryInformation;
+// eVb: 2.1 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping
+    ULONG RemappingNeeded = 0;  
+// eVb: 2.1 [END]
+    //
+    // Set the current mode into the hardware.
+    //
+
+    if (EngDeviceIoControl(ppdev->hDriver,
+                           IOCTL_VIDEO_SET_CURRENT_MODE,
+                           &(ppdev->ulMode),
+                           sizeof(ULONG),
+// eVb: 2.2 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping
+                           &RemappingNeeded,
+                           sizeof(ULONG),
+// eVb: 2.2 [END]
+                           &returnedDataLength))
+    {
+        RIP("DISP bInitSURF failed IOCTL_SET_MODE\n");
+        return(FALSE);
+    }
+
+    //
+    // If this is the first time we enable the surface we need to map in the
+    // memory also.
+    //
+// eVb: 2.3 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping
+    if (bFirst || RemappingNeeded)
+    {
+// eVb: 2.3 [END]
+        videoMemory.RequestedVirtualAddress = NULL;
+
+        if (EngDeviceIoControl(ppdev->hDriver,
+                               IOCTL_VIDEO_MAP_VIDEO_MEMORY,
+                               &videoMemory,
+                               sizeof(VIDEO_MEMORY),
+                               &videoMemoryInformation,
+                               sizeof(VIDEO_MEMORY_INFORMATION),
+                               &returnedDataLength))
+        {
+            RIP("DISP bInitSURF failed IOCTL_VIDEO_MAP\n");
+            return(FALSE);
+        }
+
+        ppdev->pjScreen = (PBYTE)(videoMemoryInformation.FrameBufferBase);
+
+        if (videoMemoryInformation.FrameBufferBase !=
+            videoMemoryInformation.VideoRamBase)
+        {
+            RIP("VideoRamBase does not correspond to FrameBufferBase\n");
+        }
+// eVb: 2.4 [DDK Change] - Make sure frame buffer mapping worked
+        //
+        // Make sure we can access this video memory
+        //
+
+        *(PULONG)(ppdev->pjScreen) = 0xaa55aa55;
+
+        if (*(PULONG)(ppdev->pjScreen) != 0xaa55aa55) {
+
+            DISPDBG((1, "Frame buffer memory is not accessible.\n"));
+            return(FALSE);
+        }
+// eVb: 2.4 [END]
+        ppdev->cScreenSize = videoMemoryInformation.VideoRamLength;
+
+        //
+        // Initialize the head of the offscreen list to NULL.
+        //
+
+        ppdev->pOffscreenList = NULL;
+
+        // It's a hardware pointer; set up pointer attributes.
+
+        MaxHeight = ppdev->PointerCapabilities.MaxHeight;
+
+        // Allocate space for two DIBs (data/mask) for the pointer. If this
+        // device supports a color Pointer, we will allocate a larger bitmap.
+        // If this is a color bitmap we allocate for the largest possible
+        // bitmap because we have no idea of what the pixel depth might be.
+
+        // Width rounded up to nearest byte multiple
+
+        if (!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER))
+        {
+            MaxWidth = (ppdev->PointerCapabilities.MaxWidth + 7) / 8;
+        }
+        else
+        {
+            MaxWidth = ppdev->PointerCapabilities.MaxWidth * sizeof(DWORD);
+        }
+
+        ppdev->cjPointerAttributes =
+                sizeof(VIDEO_POINTER_ATTRIBUTES) +
+                ((sizeof(UCHAR) * MaxWidth * MaxHeight) * 2);
+
+        ppdev->pPointerAttributes = (PVIDEO_POINTER_ATTRIBUTES)
+                EngAllocMem(0, ppdev->cjPointerAttributes, ALLOC_TAG);
+
+        if (ppdev->pPointerAttributes == NULL) {
+
+            DISPDBG((0, "bInitPointer EngAllocMem failed\n"));
+            return(FALSE);
+        }
+
+        ppdev->pPointerAttributes->Flags = ppdev->PointerCapabilities.Flags;
+        ppdev->pPointerAttributes->WidthInBytes = MaxWidth;
+        ppdev->pPointerAttributes->Width = ppdev->PointerCapabilities.MaxWidth;
+        ppdev->pPointerAttributes->Height = MaxHeight;
+        ppdev->pPointerAttributes->Column = 0;
+        ppdev->pPointerAttributes->Row = 0;
+        ppdev->pPointerAttributes->Enable = 0;
+    }
+
+    return(TRUE);
+}
+
+/******************************Public*Routine******************************\
+* vDisableSURF
+*
+* Disable the surface. Un-Maps the frame in memory.
+*
+\**************************************************************************/
+
+VOID vDisableSURF(PPDEV ppdev)
+{
+    DWORD returnedDataLength;
+    VIDEO_MEMORY videoMemory;
+
+    videoMemory.RequestedVirtualAddress = (PVOID) ppdev->pjScreen;
+
+    if (EngDeviceIoControl(ppdev->hDriver,
+                           IOCTL_VIDEO_UNMAP_VIDEO_MEMORY,
+                           &videoMemory,
+                           sizeof(VIDEO_MEMORY),
+                           NULL,
+                           0,
+                           &returnedDataLength))
+    {
+        RIP("DISP vDisableSURF failed IOCTL_VIDEO_UNMAP\n");
+    }
+}
+
+
+/******************************Public*Routine******************************\
+* bInitPDEV
+*
+* Determine the mode we should be in based on the DEVMODE passed in.
+* Query mini-port to get information needed to fill in the DevInfo and the
+* GdiInfo .
+*
+\**************************************************************************/
+
+BOOL bInitPDEV(
+PPDEV ppdev,
+DEVMODEW *pDevMode,
+GDIINFO *pGdiInfo,
+DEVINFO *pDevInfo)
+{
+    ULONG cModes;
+    PVIDEO_MODE_INFORMATION pVideoBuffer, pVideoModeSelected, pVideoTemp;
+    VIDEO_COLOR_CAPABILITIES colorCapabilities;
+    ULONG ulTemp;
+    BOOL bSelectDefault;
+    ULONG cbModeSize;
+
+    //
+    // calls the miniport to get mode information.
+    //
+
+    cModes = getAvailableModes(ppdev->hDriver, &pVideoBuffer, &cbModeSize);
+
+    if (cModes == 0)
+    {
+        return(FALSE);
+    }
+
+    //
+    // Now see if the requested mode has a match in that table.
+    //
+
+    pVideoModeSelected = NULL;
+    pVideoTemp = pVideoBuffer;
+
+    if ((pDevMode->dmPelsWidth        == 0) &&
+        (pDevMode->dmPelsHeight       == 0) &&
+        (pDevMode->dmBitsPerPel       == 0) &&
+        (pDevMode->dmDisplayFrequency == 0))
+    {
+        DISPDBG((2, "Default mode requested"));
+        bSelectDefault = TRUE;
+    }
+    else
+    {
+// eVb: 2.5 [DDK Change] - Add missing newlines to debug output
+        DISPDBG((2, "Requested mode...\n"));
+        DISPDBG((2, "   Screen width  -- %li\n", pDevMode->dmPelsWidth));
+        DISPDBG((2, "   Screen height -- %li\n", pDevMode->dmPelsHeight));
+        DISPDBG((2, "   Bits per pel  -- %li\n", pDevMode->dmBitsPerPel));
+        DISPDBG((2, "   Frequency     -- %li\n", pDevMode->dmDisplayFrequency));
+// eVb: 2.5 [END]
+        bSelectDefault = FALSE;
+    }
+
+    while (cModes--)
+    {
+        if (pVideoTemp->Length != 0)
+        {
+            if (bSelectDefault ||
+                ((pVideoTemp->VisScreenWidth  == pDevMode->dmPelsWidth) &&
+                 (pVideoTemp->VisScreenHeight == pDevMode->dmPelsHeight) &&
+                 (pVideoTemp->BitsPerPlane *
+                  pVideoTemp->NumberOfPlanes  == pDevMode->dmBitsPerPel) &&
+                 (pVideoTemp->Frequency  == pDevMode->dmDisplayFrequency)))
+            {
+                pVideoModeSelected = pVideoTemp;
+                DISPDBG((3, "Found a match\n")) ;
+                break;
+            }
+        }
+
+        pVideoTemp = (PVIDEO_MODE_INFORMATION)
+            (((PUCHAR)pVideoTemp) + cbModeSize);
+    }
+
+    //
+    // If no mode has been found, return an error
+    //
+
+    if (pVideoModeSelected == NULL)
+    {
+        EngFreeMem(pVideoBuffer);
+        DISPDBG((0,"DISP bInitPDEV failed - no valid modes\n"));
+        return(FALSE);
+    }
+
+    //
+    // Fill in the GDIINFO data structure with the information returned from
+    // the kernel driver.
+    //
+
+    ppdev->ulMode = pVideoModeSelected->ModeIndex;
+    ppdev->cxScreen = pVideoModeSelected->VisScreenWidth;
+    ppdev->cyScreen = pVideoModeSelected->VisScreenHeight;
+    ppdev->ulBitCount = pVideoModeSelected->BitsPerPlane *
+                        pVideoModeSelected->NumberOfPlanes;
+    ppdev->lDeltaScreen = pVideoModeSelected->ScreenStride;
+
+    ppdev->flRed = pVideoModeSelected->RedMask;
+    ppdev->flGreen = pVideoModeSelected->GreenMask;
+    ppdev->flBlue = pVideoModeSelected->BlueMask;
+
+
+    pGdiInfo->ulVersion    = GDI_DRIVER_VERSION;
+    pGdiInfo->ulTechnology = DT_RASDISPLAY;
+    pGdiInfo->ulHorzSize   = pVideoModeSelected->XMillimeter;
+    pGdiInfo->ulVertSize   = pVideoModeSelected->YMillimeter;
+
+    pGdiInfo->ulHorzRes        = ppdev->cxScreen;
+    pGdiInfo->ulVertRes        = ppdev->cyScreen;
+    pGdiInfo->ulPanningHorzRes = ppdev->cxScreen;
+    pGdiInfo->ulPanningVertRes = ppdev->cyScreen;
+    pGdiInfo->cBitsPixel       = pVideoModeSelected->BitsPerPlane;
+    pGdiInfo->cPlanes          = pVideoModeSelected->NumberOfPlanes;
+    pGdiInfo->ulVRefresh       = pVideoModeSelected->Frequency;
+    pGdiInfo->ulBltAlignment   = 1;     // We don't have accelerated screen-
+                                        //   to-screen blts, and any
+                                        //   window alignment is okay
+
+    pGdiInfo->ulLogPixelsX = pDevMode->dmLogPixels;
+    pGdiInfo->ulLogPixelsY = pDevMode->dmLogPixels;
+
+#ifdef MIPS
+    if (ppdev->ulBitCount == 8)
+        pGdiInfo->flTextCaps = (TC_RA_ABLE | TC_SCROLLBLT);
+    else
+#endif
+    pGdiInfo->flTextCaps = TC_RA_ABLE;
+
+    pGdiInfo->flRaster = 0;           // flRaster is reserved by DDI
+
+    pGdiInfo->ulDACRed   = pVideoModeSelected->NumberRedBits;
+    pGdiInfo->ulDACGreen = pVideoModeSelected->NumberGreenBits;
+    pGdiInfo->ulDACBlue  = pVideoModeSelected->NumberBlueBits;
+
+    pGdiInfo->ulAspectX    = 0x24;    // One-to-one aspect ratio
+    pGdiInfo->ulAspectY    = 0x24;
+    pGdiInfo->ulAspectXY   = 0x33;
+
+    pGdiInfo->xStyleStep   = 1;       // A style unit is 3 pels
+    pGdiInfo->yStyleStep   = 1;
+    pGdiInfo->denStyleStep = 3;
+
+    pGdiInfo->ptlPhysOffset.x = 0;
+    pGdiInfo->ptlPhysOffset.y = 0;
+    pGdiInfo->szlPhysSize.cx  = 0;
+    pGdiInfo->szlPhysSize.cy  = 0;
+
+    // RGB and CMY color info.
+
+    //
+    // try to get it from the miniport.
+    // if the miniport doesn ot support this feature, use defaults.
+    //
+
+    if (EngDeviceIoControl(ppdev->hDriver,
+                           IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES,
+                           NULL,
+                           0,
+                           &colorCapabilities,
+                           sizeof(VIDEO_COLOR_CAPABILITIES),
+                           &ulTemp))
+    {
+
+        DISPDBG((2, "getcolorCapabilities failed \n"));
+
+        pGdiInfo->ciDevice.Red.x = 6700;
+        pGdiInfo->ciDevice.Red.y = 3300;
+        pGdiInfo->ciDevice.Red.Y = 0;
+        pGdiInfo->ciDevice.Green.x = 2100;
+        pGdiInfo->ciDevice.Green.y = 7100;
+        pGdiInfo->ciDevice.Green.Y = 0;
+        pGdiInfo->ciDevice.Blue.x = 1400;
+        pGdiInfo->ciDevice.Blue.y = 800;
+        pGdiInfo->ciDevice.Blue.Y = 0;
+        pGdiInfo->ciDevice.AlignmentWhite.x = 3127;
+        pGdiInfo->ciDevice.AlignmentWhite.y = 3290;
+        pGdiInfo->ciDevice.AlignmentWhite.Y = 0;
+
+        pGdiInfo->ciDevice.RedGamma = 20000;
+        pGdiInfo->ciDevice.GreenGamma = 20000;
+        pGdiInfo->ciDevice.BlueGamma = 20000;
+
+    }
+    else
+    {
+        pGdiInfo->ciDevice.Red.x = colorCapabilities.RedChromaticity_x;
+        pGdiInfo->ciDevice.Red.y = colorCapabilities.RedChromaticity_y;
+        pGdiInfo->ciDevice.Red.Y = 0;
+        pGdiInfo->ciDevice.Green.x = colorCapabilities.GreenChromaticity_x;
+        pGdiInfo->ciDevice.Green.y = colorCapabilities.GreenChromaticity_y;
+        pGdiInfo->ciDevice.Green.Y = 0;
+        pGdiInfo->ciDevice.Blue.x = colorCapabilities.BlueChromaticity_x;
+        pGdiInfo->ciDevice.Blue.y = colorCapabilities.BlueChromaticity_y;
+        pGdiInfo->ciDevice.Blue.Y = 0;
+        pGdiInfo->ciDevice.AlignmentWhite.x = colorCapabilities.WhiteChromaticity_x;
+        pGdiInfo->ciDevice.AlignmentWhite.y = colorCapabilities.WhiteChromaticity_y;
+        pGdiInfo->ciDevice.AlignmentWhite.Y = colorCapabilities.WhiteChromaticity_Y;
+
+        // if we have a color device store the three color gamma values,
+        // otherwise store the unique gamma value in all three.
+
+        if (colorCapabilities.AttributeFlags & VIDEO_DEVICE_COLOR)
+        {
+            pGdiInfo->ciDevice.RedGamma = colorCapabilities.RedGamma;
+            pGdiInfo->ciDevice.GreenGamma = colorCapabilities.GreenGamma;
+            pGdiInfo->ciDevice.BlueGamma = colorCapabilities.BlueGamma;
+        }
+        else
+        {
+            pGdiInfo->ciDevice.RedGamma = colorCapabilities.WhiteGamma;
+            pGdiInfo->ciDevice.GreenGamma = colorCapabilities.WhiteGamma;
+            pGdiInfo->ciDevice.BlueGamma = colorCapabilities.WhiteGamma;
+        }
+
+    };
+
+    pGdiInfo->ciDevice.Cyan.x = 0;
+    pGdiInfo->ciDevice.Cyan.y = 0;
+    pGdiInfo->ciDevice.Cyan.Y = 0;
+    pGdiInfo->ciDevice.Magenta.x = 0;
+    pGdiInfo->ciDevice.Magenta.y = 0;
+    pGdiInfo->ciDevice.Magenta.Y = 0;
+    pGdiInfo->ciDevice.Yellow.x = 0;
+    pGdiInfo->ciDevice.Yellow.y = 0;
+    pGdiInfo->ciDevice.Yellow.Y = 0;
+
+    // No dye correction for raster displays.
+
+    pGdiInfo->ciDevice.MagentaInCyanDye = 0;
+    pGdiInfo->ciDevice.YellowInCyanDye = 0;
+    pGdiInfo->ciDevice.CyanInMagentaDye = 0;
+    pGdiInfo->ciDevice.YellowInMagentaDye = 0;
+    pGdiInfo->ciDevice.CyanInYellowDye = 0;
+    pGdiInfo->ciDevice.MagentaInYellowDye = 0;
+
+    pGdiInfo->ulDevicePelsDPI = 0;   // For printers only
+    pGdiInfo->ulPrimaryOrder = PRIMARY_ORDER_CBA;
+
+    // BUGBUG this should be modified to take into account the size
+    // of the display and the resolution.
+
+    pGdiInfo->ulHTPatternSize = HT_PATSIZE_4x4_M;
+
+    pGdiInfo->flHTFlags = HT_FLAG_ADDITIVE_PRIMS;
+
+    // Fill in the basic devinfo structure
+
+    *pDevInfo = gDevInfoFrameBuffer;
+
+    // Fill in the rest of the devinfo and GdiInfo structures.
+
+    if (ppdev->ulBitCount == 8)
+    {
+        // It is Palette Managed.
+
+        pGdiInfo->ulNumColors = 20;
+        pGdiInfo->ulNumPalReg = 1 << ppdev->ulBitCount;
+// eVb: 2.7 [DDK CHANGE] - No dithering support
+        pDevInfo->flGraphicsCaps |= GCAPS_PALMANAGED;
+// eVb: 2.7 [END]
+        pGdiInfo->ulHTOutputFormat = HT_FORMAT_8BPP;
+        pDevInfo->iDitherFormat = BMF_8BPP;
+
+        // Assuming palette is orthogonal - all colors are same size.
+
+        ppdev->cPaletteShift   = 8 - pGdiInfo->ulDACRed;
+    }
+    else
+    {
+        pGdiInfo->ulNumColors = (ULONG) (-1);
+        pGdiInfo->ulNumPalReg = 0;
+
+        if (ppdev->ulBitCount == 16)
+        {
+            pGdiInfo->ulHTOutputFormat = HT_FORMAT_16BPP;
+            pDevInfo->iDitherFormat = BMF_16BPP;
+        }
+        else if (ppdev->ulBitCount == 24)
+        {
+            pGdiInfo->ulHTOutputFormat = HT_FORMAT_24BPP;
+            pDevInfo->iDitherFormat = BMF_24BPP;
+        }
+        else
+        {
+            pGdiInfo->ulHTOutputFormat = HT_FORMAT_32BPP;
+            pDevInfo->iDitherFormat = BMF_32BPP;
+        }
+    }
+
+    EngFreeMem(pVideoBuffer);
+
+    return(TRUE);
+}
+
+
+/******************************Public*Routine******************************\
+* getAvailableModes
+*
+* Calls the miniport to get the list of modes supported by the kernel driver,
+* and returns the list of modes supported by the diplay driver among those
+*
+* returns the number of entries in the videomode buffer.
+* 0 means no modes are supported by the miniport or that an error occured.
+*
+* NOTE: the buffer must be freed up by the caller.
+*
+\**************************************************************************/
+
+DWORD getAvailableModes(
+HANDLE hDriver,
+PVIDEO_MODE_INFORMATION *modeInformation,
+DWORD *cbModeSize)
+{
+    ULONG ulTemp;
+    VIDEO_NUM_MODES modes;
+    PVIDEO_MODE_INFORMATION pVideoTemp;
+
+    //
+    // Get the number of modes supported by the mini-port
+    //
+
+    if (EngDeviceIoControl(hDriver,
+                           IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES,
+                           NULL,
+                           0,
+                           &modes,
+                           sizeof(VIDEO_NUM_MODES),
+                           &ulTemp))
+    {
+        DISPDBG((0, "getAvailableModes failed VIDEO_QUERY_NUM_AVAIL_MODES\n"));
+        return(0);
+    }
+
+    *cbModeSize = modes.ModeInformationLength;
+
+    //
+    // Allocate the buffer for the mini-port to write the modes in.
+    //
+
+    *modeInformation = (PVIDEO_MODE_INFORMATION)
+                        EngAllocMem(0, modes.NumModes *
+                                    modes.ModeInformationLength, ALLOC_TAG);
+
+    if (*modeInformation == (PVIDEO_MODE_INFORMATION) NULL)
+    {
+        DISPDBG((0, "getAvailableModes failed EngAllocMem\n"));
+
+        return 0;
+    }
+
+    //
+    // Ask the mini-port to fill in the available modes.
+    //
+
+    if (EngDeviceIoControl(hDriver,
+                           IOCTL_VIDEO_QUERY_AVAIL_MODES,
+                           NULL,
+                           0,
+                           *modeInformation,
+                           modes.NumModes * modes.ModeInformationLength,
+                           &ulTemp))
+    {
+
+        DISPDBG((0, "getAvailableModes failed VIDEO_QUERY_AVAIL_MODES\n"));
+
+        EngFreeMem(*modeInformation);
+        *modeInformation = (PVIDEO_MODE_INFORMATION) NULL;
+
+        return(0);
+    }
+
+    //
+    // Now see which of these modes are supported by the display driver.
+    // As an internal mechanism, set the length to 0 for the modes we
+    // DO NOT support.
+    //
+
+    ulTemp = modes.NumModes;
+    pVideoTemp = *modeInformation;
+
+    //
+    // Mode is rejected if it is not one plane, or not graphics, or is not
+    // one of 8, 16 or 32 bits per pel.
+    //
+
+    while (ulTemp--)
+    {
+        if ((pVideoTemp->NumberOfPlanes != 1 ) ||
+            !(pVideoTemp->AttributeFlags & VIDEO_MODE_GRAPHICS) ||
+// eVb: 2.6 [DDK CHANGE] - Do not process banked video modes
+             (pVideoTemp->AttributeFlags & VIDEO_MODE_BANKED) ||
+// eVb: 2.6 [END]
+            ((pVideoTemp->BitsPerPlane != 8) &&
+             (pVideoTemp->BitsPerPlane != 16) &&
+             (pVideoTemp->BitsPerPlane != 24) &&
+             (pVideoTemp->BitsPerPlane != 32)))
+        {
+            pVideoTemp->Length = 0;
+        }
+
+        pVideoTemp = (PVIDEO_MODE_INFORMATION)
+            (((PUCHAR)pVideoTemp) + modes.ModeInformationLength);
+    }
+
+    return modes.NumModes;
+
+}
index 8f8f05a..bd38ca2 100644 (file)
@@ -18,8 +18,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef FRAMEBUF_H
-#define FRAMEBUF_H
+#pragma once
 
 #include <stdarg.h>
 #include <windef.h>
@@ -197,5 +196,3 @@ CopyColorPointer(PPDEV ppdev,
                  SURFOBJ *psoMask,
                  SURFOBJ *psoColor,
                  XLATEOBJ *pxlo);
-
-#endif /* FRAMEBUF_H */
index 7b4a3c6..97282f8 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _VGADDI_H_
-#define _VGADDI_H_
+#pragma once
 
 #define _WINBASE_
 #define _WINDOWS_H
@@ -288,5 +287,3 @@ vgaReadScan(int x, int y, int w, void *b);
 
 VOID FASTCALL
 vgaWriteScan(int x, int y, int w, void *b);
-
-#endif /* _VGADDI_H_ */
index 964548b..2f424df 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
 <module name="bmfd" type="kernelmodedriver" entrypoint="BmfdEnableDriver@12" installbase="system32" installname="bmfd.dll" crt="static">
        <library>win32k</library>
        <library>libcntpr</library>
index f7e7f3c..2ed97e3 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
+<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
 <group xmlns:xi="http://www.w3.org/2001/XInclude">
        <directory name="bmfd">
                <xi:include href="bmfd/bmfd.rbuild" />
index 78f8425..883a977 100644 (file)
@@ -1,5 +1,8 @@
 LIBRARY ftfd.dll
 EXPORTS
+  FT_Bitmap_Convert
+  FT_Bitmap_Done
+  FT_Bitmap_New
   FT_Done_Face
   FT_Done_Glyph
   FT_Get_Char_Index
index 869964c..34d822a 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
 <module name="ftfd" type="kernelmodedll" entrypoint="FtfdEnableDriver@12" baseaddress="${BASEADDRESS_FREETYPE}" installbase="system32" installname="ftfd.dll" crt="libcntpr">
        <importlibrary definition="freetype.def" />
        <include base="freetype">include</include>
index 2575e1a..363c909 100644 (file)
@@ -7,6 +7,9 @@
        <directory name="vga">
                <xi:include href="vga/vgamp.rbuild" />
        </directory>
+       <directory name="vga_new">
+               <xi:include href="vga_new/vga.rbuild" />
+       </directory>
        <directory name="vmx_svga">
                <xi:include href="vmx_svga/vmx_svga.rbuild" />
        </directory>
index 55b2bcb..2107e5f 100644 (file)
@@ -71,6 +71,9 @@ VBEFindAdapter(
    IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo,
    OUT PUCHAR Again)
 {
+   if (VideoPortIsNoVesa())
+       return ERROR_DEV_NOT_EXIST;
+
    return NO_ERROR;
 }
 
index c5423bd..34807b2 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef VBEMP_H
-#define VBEMP_H
+#pragma once
 
 /* INCLUDES *******************************************************************/
 
-#ifdef _MSC_VER
-#pragma message ("INVESTIGATE ME")
-#endif
-
-#if 0 //#ifdef _MSC_VER
-#include "devioctl.h"
-#else
-#include <ntddk.h>
-#endif
-
+#include "ntdef.h"
 #include "dderror.h"
+#include "devioctl.h"
 #include "miniport.h"
 #include "ntddvdeo.h"
 #include "video.h"
@@ -313,5 +304,3 @@ VBESetColorRegisters(
    PVBE_DEVICE_EXTENSION DeviceExtension,
    PVIDEO_CLUT ColorLookUpTable,
    PSTATUS_BLOCK StatusBlock);
-
-#endif /* VBEMP_H */
index efe0bc5..2e018e4 100644 (file)
 
 /* INCLUDES *******************************************************************/
 
-#ifdef _MSC_VER
-#pragma message ("INVESTIGATE ME")
-#endif
-
-#if 0 //#ifdef _MSC_VER
-#include "devioctl.h"
-#else
-#include <ntddk.h>
-#endif
-
+#include "ntdef.h"
 #include "dderror.h"
+#include "devioctl.h"
 #include "miniport.h"
 #include "ntddvdeo.h"
 #include "video.h"
diff --git a/reactos/drivers/video/miniport/vga_new/cmdcnst.h b/reactos/drivers/video/miniport/vga_new/cmdcnst.h
new file mode 100644 (file)
index 0000000..c818b49
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * PROJECT:         ReactOS VGA Miniport Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/miniport/vga/cmdcnst.h
+ * PURPOSE:         Command Code Definitions for VGA Command Streams
+ * PROGRAMMERS:     Copyright (c) 1992  Microsoft Corporation
+ */
+
+//--------------------------------------------------------------------------
+//   Definition of the set/clear mode command language.
+//
+//   Each command is composed of a major portion and a minor portion.
+//   The major portion of a command can be found in the most significant
+//   nibble of a command byte, while the minor portion is in the least
+//   significant portion of a command byte.
+//
+//   maj  minor      Description
+//   ---- -----      --------------------------------------------
+//   00              End of data
+//
+//   10              in and out type commands as described by flags
+//        flags:
+//
+//        xxxx
+//        ||||
+//        |||+-------- unused
+//        ||+--------- 0/1 single/multiple values to output (in's are always 
+//        |+---------- 0/1 8/16 bit operation                  single)
+//        +----------- 0/1 out/in instruction
+//
+//       Outs
+//       ----------------------------------------------
+//       0           reg:W val:B
+//       2           reg:W cnt:W val1:B val2:B...valN:B
+//       4           reg:W val:W
+//       6           reg:W cnt:W val1:W val2:W...valN:W
+//
+//       Ins
+//       ----------------------------------------------
+//       8           reg:W
+//       a           reg:W cnt:W
+//       c           reg:W
+//       e           reg:W cnt:W
+//
+//   20              Special purpose outs
+//       00          do indexed outs for seq, crtc, and gdc
+//                   indexreg:W cnt:B startindex:B val1:B val2:B...valN:B
+//       01          do indexed outs for atc
+//                   index-data_reg:W cnt:B startindex:B val1:B val2:B...valN:B
+//       02          do masked outs
+//                   indexreg:W andmask:B xormask:B
+//
+//   F0              Nop
+//
+//---------------------------------------------------------------------------
+
+// some useful equates - major commands
+
+#define EOD     0x000                   // end of data
+#define INOUT   0x010                   // do ins or outs
+#define METAOUT 0x020                   // do special types of outs
+#define NCMD    0x0f0                   // Nop command
+
+
+// flags for INOUT major command
+
+//#define UNUSED    0x01                    // reserved
+#define MULTI   0x02                    // multiple or single outs
+#define BW      0x04                    // byte/word size of operation
+#define IO      0x08                    // out/in instruction
+
+// minor commands for metout
+
+#define INDXOUT 0x00                    // do indexed outs
+#define ATCOUT  0x01                    // do indexed outs for atc
+#define MASKOUT 0x02                    // do masked outs using and-xor masks
+
+
+// composite inout type commands
+
+#define OB      (INOUT)                 // output 8 bit value
+#define OBM     (INOUT+MULTI)           // output multiple bytes
+#define OW      (INOUT+BW)              // output single word value
+#define OWM     (INOUT+BW+MULTI)        // output multiple words
+
+#define IB      (INOUT+IO)              // input byte
+#define IBM     (INOUT+IO+MULTI)        // input multiple bytes
+#define IW      (INOUT+IO+BW)           // input word
+#define IWM     (INOUT+IO+BW+MULTI)     // input multiple words
+/* EOF */
diff --git a/reactos/drivers/video/miniport/vga_new/modeset.c b/reactos/drivers/video/miniport/vga_new/modeset.c
new file mode 100644 (file)
index 0000000..abe1191
--- /dev/null
@@ -0,0 +1,888 @@
+/*
+ * PROJECT:         ReactOS VGA Miniport Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/miniport/vga/modeset.c
+ * PURPOSE:         Handles switching to Standard VGA Modes for compatible cards
+ * PROGRAMMERS:     Copyright (c) 1992  Microsoft Corporation
+ *                  ReactOS Portable Systems Group
+ */
+
+#include "vga.h"
+
+VP_STATUS
+VgaInterpretCmdStream(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PUSHORT pusCmdStream
+    );
+
+VP_STATUS
+VgaSetMode(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_MODE Mode,
+    ULONG ModeSize,
+// eVb: 2.1 [SET MODE] - Add new output parameter for framebuffer update functionality
+    PULONG PhysPtrChange
+// eVb: 2.1 [END]
+    );
+
+VP_STATUS
+VgaQueryAvailableModes(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_MODE_INFORMATION ModeInformation,
+    ULONG ModeInformationSize,
+    PULONG OutputSize
+    );
+
+VP_STATUS
+VgaQueryNumberOfAvailableModes(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_NUM_MODES NumModes,
+    ULONG NumModesSize,
+    PULONG OutputSize
+    );
+
+VP_STATUS
+VgaQueryCurrentMode(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_MODE_INFORMATION ModeInformation,
+    ULONG ModeInformationSize,
+    PULONG OutputSize
+    );
+
+VOID
+VgaZeroVideoMemory(
+    PHW_DEVICE_EXTENSION HwDeviceExtension
+    );
+
+#if defined(ALLOC_PRAGMA)
+#pragma alloc_text(PAGE,VgaInterpretCmdStream)
+#pragma alloc_text(PAGE,VgaSetMode)
+#pragma alloc_text(PAGE,VgaQueryAvailableModes)
+#pragma alloc_text(PAGE,VgaQueryNumberOfAvailableModes)
+#pragma alloc_text(PAGE,VgaZeroVideoMemory)
+#endif
+
+//---------------------------------------------------------------------------
+VP_STATUS
+VgaInterpretCmdStream(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PUSHORT pusCmdStream
+    )
+
+/*++
+
+Routine Description:
+
+    Interprets the appropriate command array to set up VGA registers for the
+    requested mode. Typically used to set the VGA into a particular mode by
+    programming all of the registers
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's device extension.
+
+    pusCmdStream - array of commands to be interpreted.
+
+Return Value:
+
+    The status of the operation (can only fail on a bad command); TRUE for
+    success, FALSE for failure.
+
+--*/
+
+{
+    ULONG ulCmd;
+    ULONG ulPort;
+    UCHAR jValue;
+    USHORT usValue;
+    ULONG culCount;
+    ULONG ulIndex;
+    ULONG ulBase;
+
+    if (pusCmdStream == NULL) {
+
+        VideoDebugPrint((1, "VgaInterpretCmdStream - Invalid pusCmdStream\n"));
+        return TRUE;
+    }
+
+    ulBase = (ULONG)HwDeviceExtension->IOAddress;
+
+    //
+    // Now set the adapter to the desired mode.
+    //
+
+    while ((ulCmd = *pusCmdStream++) != EOD) {
+
+        //
+        // Determine major command type
+        //
+
+        switch (ulCmd & 0xF0) {
+
+            //
+            // Basic input/output command
+            //
+
+            case INOUT:
+
+                //
+                // Determine type of inout instruction
+                //
+
+                if (!(ulCmd & IO)) {
+
+                    //
+                    // Out instruction. Single or multiple outs?
+                    //
+
+                    if (!(ulCmd & MULTI)) {
+
+                        //
+                        // Single out. Byte or word out?
+                        //
+
+                        if (!(ulCmd & BW)) {
+
+                            //
+                            // Single byte out
+                            //
+
+                            ulPort = *pusCmdStream++;
+                            jValue = (UCHAR) *pusCmdStream++;
+                            VideoPortWritePortUchar((PUCHAR)(ulBase+ulPort),
+                                    jValue);
+
+                        } else {
+
+                            //
+                            // Single word out
+                            //
+
+                            ulPort = *pusCmdStream++;
+                            usValue = *pusCmdStream++;
+                            VideoPortWritePortUshort((PUSHORT)(ulBase+ulPort),
+                                    usValue);
+
+                        }
+
+                    } else {
+
+                        //
+                        // Output a string of values
+                        // Byte or word outs?
+                        //
+
+                        if (!(ulCmd & BW)) {
+
+                            //
+                            // String byte outs. Do in a loop; can't use
+                            // VideoPortWritePortBufferUchar because the data
+                            // is in USHORT form
+                            //
+
+                            ulPort = ulBase + *pusCmdStream++;
+                            culCount = *pusCmdStream++;
+
+                            while (culCount--) {
+                                jValue = (UCHAR) *pusCmdStream++;
+                                VideoPortWritePortUchar((PUCHAR)ulPort,
+                                        jValue);
+
+                            }
+
+                        } else {
+
+                            //
+                            // String word outs
+                            //
+
+                            ulPort = *pusCmdStream++;
+                            culCount = *pusCmdStream++;
+                            VideoPortWritePortBufferUshort((PUSHORT)
+                                    (ulBase + ulPort), pusCmdStream, culCount);
+                            pusCmdStream += culCount;
+
+                        }
+                    }
+
+                } else {
+
+                    // In instruction
+                    //
+                    // Currently, string in instructions aren't supported; all
+                    // in instructions are handled as single-byte ins
+                    //
+                    // Byte or word in?
+                    //
+
+                    if (!(ulCmd & BW)) {
+                        //
+                        // Single byte in
+                        //
+
+                        ulPort = *pusCmdStream++;
+                        jValue = VideoPortReadPortUchar((PUCHAR)ulBase+ulPort);
+
+                    } else {
+
+                        //
+                        // Single word in
+                        //
+
+                        ulPort = *pusCmdStream++;
+                        usValue = VideoPortReadPortUshort((PUSHORT)
+                                (ulBase+ulPort));
+
+                    }
+
+                }
+
+                break;
+
+            //
+            // Higher-level input/output commands
+            //
+
+            case METAOUT:
+
+                //
+                // Determine type of metaout command, based on minor
+                // command field
+                //
+                switch (ulCmd & 0x0F) {
+
+                    //
+                    // Indexed outs
+                    //
+
+                    case INDXOUT:
+
+                        ulPort = ulBase + *pusCmdStream++;
+                        culCount = *pusCmdStream++;
+                        ulIndex = *pusCmdStream++;
+
+                        while (culCount--) {
+
+                            usValue = (USHORT) (ulIndex +
+                                      (((ULONG)(*pusCmdStream++)) << 8));
+                            VideoPortWritePortUshort((PUSHORT)ulPort, usValue);
+
+                            ulIndex++;
+
+                        }
+
+                        break;
+
+                    //
+                    // Masked out (read, AND, XOR, write)
+                    //
+
+                    case MASKOUT:
+
+                        ulPort = *pusCmdStream++;
+                        jValue = VideoPortReadPortUchar((PUCHAR)ulBase+ulPort);
+                        jValue &= *pusCmdStream++;
+                        jValue ^= *pusCmdStream++;
+                        VideoPortWritePortUchar((PUCHAR)ulBase + ulPort,
+                                jValue);
+                        break;
+
+                    //
+                    // Attribute Controller out
+                    //
+
+                    case ATCOUT:
+
+                        ulPort = ulBase + *pusCmdStream++;
+                        culCount = *pusCmdStream++;
+                        ulIndex = *pusCmdStream++;
+
+                        while (culCount--) {
+
+                            // Write Attribute Controller index
+                            VideoPortWritePortUchar((PUCHAR)ulPort,
+                                    (UCHAR)ulIndex);
+
+                            // Write Attribute Controller data
+                            jValue = (UCHAR) *pusCmdStream++;
+                            VideoPortWritePortUchar((PUCHAR)ulPort, jValue);
+
+                            ulIndex++;
+
+                        }
+
+                        break;
+
+                    //
+                    // None of the above; error
+                    //
+                    default:
+
+                        return FALSE;
+
+                }
+
+
+                break;
+
+            //
+            // NOP
+            //
+
+            case NCMD:
+
+                break;
+
+            //
+            // Unknown command; error
+            //
+
+            default:
+
+                return FALSE;
+
+        }
+
+    }
+
+    return TRUE;
+
+} // end VgaInterpretCmdStream()
+
+\f
+VP_STATUS
+VgaSetMode(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_MODE Mode,
+    ULONG ModeSize,
+// eVb: 2.2 [SET MODE] - Add new output parameter for framebuffer update functionality
+    PULONG PhysPtrChange
+// eVb: 2.2 [END]
+    )
+
+/*++
+
+Routine Description:
+
+    This routine sets the vga into the requested mode.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's device extension.
+
+    Mode - Pointer to the structure containing the information about the
+        font to be set.
+
+    ModeSize - Length of the input buffer supplied by the user.
+
+Return Value:
+
+    ERROR_INSUFFICIENT_BUFFER if the input buffer was not large enough
+        for the input data.
+
+    ERROR_INVALID_PARAMETER if the mode number is invalid.
+
+    NO_ERROR if the operation completed successfully.
+
+--*/
+
+{
+    PVIDEOMODE pRequestedMode;
+    VP_STATUS status;
+    ULONG RequestedModeNum;
+// eVb: 2.3 [SET MODE] - Add new output parameter for framebuffer update functionality
+    *PhysPtrChange = FALSE;
+// eVb: 2.3 [END]
+    //
+    // Check if the size of the data in the input buffer is large enough.
+    //
+
+    if (ModeSize < sizeof(VIDEO_MODE))
+    {
+        return ERROR_INSUFFICIENT_BUFFER;
+    }
+
+    //
+    // Extract the clear memory, and map linear bits.
+    //
+
+    RequestedModeNum = Mode->RequestedMode &
+        ~(VIDEO_MODE_NO_ZERO_MEMORY | VIDEO_MODE_MAP_MEM_LINEAR);
+
+
+    if (!(Mode->RequestedMode & VIDEO_MODE_NO_ZERO_MEMORY))
+    {
+#if defined(_X86_)
+        VgaZeroVideoMemory(HwDeviceExtension);
+#endif
+    }
+
+    //
+    // Check to see if we are requesting a valid mode
+    //
+// eVb: 2.4 [CIRRUS] - Remove Cirrus-specific check for valid mode
+    if ( (RequestedModeNum >= NumVideoModes) )
+// eVb: 2.4 [END]
+    {
+        VideoDebugPrint((0, "Invalide Mode Number = %d!\n", RequestedModeNum));
+
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    VideoDebugPrint((2, "Attempting to set mode %d\n",
+                        RequestedModeNum));
+// eVb: 2.5 [VBE] - Use dynamic VBE mode list instead of hard-coded VGA list
+    pRequestedMode = &VgaModeList[RequestedModeNum];
+// eVb: 2.5 [END]
+    VideoDebugPrint((2, "Info on Requested Mode:\n"
+                        "\tResolution: %dx%d\n",
+                        pRequestedMode->hres,
+                        pRequestedMode->vres ));
+
+    //
+    // VESA BIOS mode switch
+    //
+// eVb: 2.6 [VBE] - VBE Mode Switch Support 
+    status = VbeSetMode(HwDeviceExtension, pRequestedMode, PhysPtrChange);
+    if (status == ERROR_INVALID_FUNCTION)
+    {
+        //
+        // VGA mode switch
+        //
+
+        if (!pRequestedMode->CmdStream) return ERROR_INVALID_FUNCTION;
+        if (!VgaInterpretCmdStream(HwDeviceExtension, pRequestedMode->CmdStream)) return ERROR_INVALID_FUNCTION;
+        goto Cleanup;
+    }
+    else if (status != NO_ERROR) return status;
+// eVb: 2.6 [END]
+// eVb: 2.7 [MODE-X] - Windows VGA Miniport Supports Mode-X, we should too
+    //
+    // ModeX check
+    //
+    
+    if (pRequestedMode->hres == 320)
+    {
+        VideoPortDebugPrint(0, "ModeX not support!!!\n");
+        return ERROR_INVALID_PARAMETER;
+    }
+// eVb: 2.7 [END]
+    //
+    // Text mode check
+    //
+    
+    if (!(pRequestedMode->fbType & VIDEO_MODE_GRAPHICS))
+    {
+// eVb: 2.8 [TODO] - This code path is not implemented yet
+        VideoPortDebugPrint(0, "Text-mode not support!!!\n");
+        return ERROR_INVALID_PARAMETER;
+// eVb: 2.8 [END]
+    }
+
+Cleanup:
+    //
+    // Update the location of the physical frame buffer within video memory.
+    //
+// eVb: 2.9 [VBE] - Linear and banked support is unified in VGA, unlike Cirrus
+    HwDeviceExtension->PhysicalVideoMemoryBase.LowPart = pRequestedMode->PhysBase;
+    HwDeviceExtension->PhysicalVideoMemoryLength = pRequestedMode->PhysSize;
+
+    HwDeviceExtension->PhysicalFrameLength =
+            pRequestedMode->FrameBufferSize;
+
+    HwDeviceExtension->PhysicalFrameOffset.LowPart =
+            pRequestedMode->FrameBufferBase;
+// eVb: 2.9 [END]
+
+    //
+    // Store the new mode value.
+    //
+
+    HwDeviceExtension->CurrentMode = pRequestedMode;
+    HwDeviceExtension->ModeIndex = Mode->RequestedMode;
+
+    return NO_ERROR;
+
+} //end VgaSetMode()
+\f
+VP_STATUS
+VgaQueryAvailableModes(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_MODE_INFORMATION ModeInformation,
+    ULONG ModeInformationSize,
+    PULONG OutputSize
+    )
+
+/*++
+
+Routine Description:
+
+    This routine returns the list of all available available modes on the
+    card.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's device extension.
+
+    ModeInformation - Pointer to the output buffer supplied by the user.
+        This is where the list of all valid modes is stored.
+
+    ModeInformationSize - Length of the output buffer supplied by the user.
+
+    OutputSize - Pointer to a buffer in which to return the actual size of
+        the data in the buffer. If the buffer was not large enough, this
+        contains the minimum required buffer size.
+
+Return Value:
+
+    ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
+        for the data being returned.
+
+    NO_ERROR if the operation completed successfully.
+
+--*/
+
+{
+    PVIDEO_MODE_INFORMATION videoModes = ModeInformation;
+    ULONG i;
+
+    //
+    // Find out the size of the data to be put in the buffer and return
+    // that in the status information (whether or not the information is
+    // there). If the buffer passed in is not large enough return an
+    // appropriate error code.
+    //
+
+    if (ModeInformationSize < (*OutputSize =
+// eVb: 2.10 [VBE] - We store VBE/VGA mode count in this global, not in DevExt like Cirrus
+            NumVideoModes *
+// eVb: 2.10 [END]
+            sizeof(VIDEO_MODE_INFORMATION)) ) {
+
+        return ERROR_INSUFFICIENT_BUFFER;
+
+    }
+
+    //
+    // For each mode supported by the card, store the mode characteristics
+    // in the output buffer.
+    //
+
+    for (i = 0; i < NumVideoModes; i++)
+    {
+        videoModes->Length = sizeof(VIDEO_MODE_INFORMATION);
+        videoModes->ModeIndex  = i;
+// eVb: 2.11 [VBE] - Use dynamic VBE mode list instead of hard-coded VGA list
+        videoModes->VisScreenWidth = VgaModeList[i].hres;
+        videoModes->ScreenStride = VgaModeList[i].wbytes;
+        videoModes->VisScreenHeight = VgaModeList[i].vres;
+        videoModes->NumberOfPlanes = VgaModeList[i].numPlanes;
+        videoModes->BitsPerPlane = VgaModeList[i].bitsPerPlane;
+        videoModes->Frequency = VgaModeList[i].Frequency;
+        videoModes->XMillimeter = 320;        // temporary hardcoded constant
+        videoModes->YMillimeter = 240;        // temporary hardcoded constant
+        videoModes->AttributeFlags = VgaModeList[i].fbType;
+// eVb: 2.11 [END]
+
+        if ((VgaModeList[i].bitsPerPlane == 32) ||
+            (VgaModeList[i].bitsPerPlane == 24))
+        {
+
+            videoModes->NumberRedBits = 8;
+            videoModes->NumberGreenBits = 8;
+            videoModes->NumberBlueBits = 8;
+            videoModes->RedMask = 0xff0000;
+            videoModes->GreenMask = 0x00ff00;
+            videoModes->BlueMask = 0x0000ff;
+
+        }
+        else if (VgaModeList[i].bitsPerPlane == 16)
+        {
+
+            videoModes->NumberRedBits = 6;
+            videoModes->NumberGreenBits = 6;
+            videoModes->NumberBlueBits = 6;
+            videoModes->RedMask = 0x1F << 11;
+            videoModes->GreenMask = 0x3F << 5;
+            videoModes->BlueMask = 0x1F;
+
+        }
+// eVb: 2.12 [VGA] - Add support for 15bpp modes, which Cirrus doesn't support
+        else if (VgaModeList[i].bitsPerPlane == 15)
+        {
+
+            videoModes->NumberRedBits = 6;
+            videoModes->NumberGreenBits = 6;
+            videoModes->NumberBlueBits = 6;
+            videoModes->RedMask = 0x3E << 9;
+            videoModes->GreenMask = 0x1F << 5;
+            videoModes->BlueMask = 0x1F;
+        }
+// eVb: 2.12 [END]
+        else
+        {
+
+            videoModes->NumberRedBits = 6;
+            videoModes->NumberGreenBits = 6;
+            videoModes->NumberBlueBits = 6;
+            videoModes->RedMask = 0;
+            videoModes->GreenMask = 0;
+            videoModes->BlueMask = 0;
+        }
+
+// eVb: 2.13 [VGA] - All modes are palette managed/driven, unlike Cirrus
+        videoModes->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN |
+             VIDEO_MODE_MANAGED_PALETTE;
+// eVb: 2.13 [END]
+        videoModes++;
+
+    }
+
+    return NO_ERROR;
+
+} // end VgaGetAvailableModes()
+\f
+VP_STATUS
+VgaQueryNumberOfAvailableModes(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_NUM_MODES NumModes,
+    ULONG NumModesSize,
+    PULONG OutputSize
+    )
+
+/*++
+
+Routine Description:
+
+    This routine returns the number of available modes for this particular
+    video card.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's device extension.
+
+    NumModes - Pointer to the output buffer supplied by the user. This is
+        where the number of modes is stored.
+
+    NumModesSize - Length of the output buffer supplied by the user.
+
+    OutputSize - Pointer to a buffer in which to return the actual size of
+        the data in the buffer.
+
+Return Value:
+
+    ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
+        for the data being returned.
+
+    NO_ERROR if the operation completed successfully.
+
+--*/
+
+{
+    //
+    // Find out the size of the data to be put in the the buffer and return
+    // that in the status information (whether or not the information is
+    // there). If the buffer passed in is not large enough return an
+    // appropriate error code.
+    //
+
+    if (NumModesSize < (*OutputSize = sizeof(VIDEO_NUM_MODES)) ) {
+
+        return ERROR_INSUFFICIENT_BUFFER;
+
+    }
+
+    //
+    // Store the number of modes into the buffer.
+    //
+
+// eVb: 2.14 [VBE] - We store VBE/VGA mode count in this global, not in DevExt like Cirrus
+    NumModes->NumModes = NumVideoModes;
+// eVb: 2.14 [END]
+    NumModes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION);
+
+    return NO_ERROR;
+
+} // end VgaGetNumberOfAvailableModes()
+\f
+VP_STATUS
+VgaQueryCurrentMode(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_MODE_INFORMATION ModeInformation,
+    ULONG ModeInformationSize,
+    PULONG OutputSize
+    )
+
+/*++
+
+Routine Description:
+
+    This routine returns a description of the current video mode.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's device extension.
+
+    ModeInformation - Pointer to the output buffer supplied by the user.
+        This is where the current mode information is stored.
+
+    ModeInformationSize - Length of the output buffer supplied by the user.
+
+    OutputSize - Pointer to a buffer in which to return the actual size of
+        the data in the buffer. If the buffer was not large enough, this
+        contains the minimum required buffer size.
+
+Return Value:
+
+    ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
+        for the data being returned.
+
+    NO_ERROR if the operation completed successfully.
+
+--*/
+
+{
+    //
+    // check if a mode has been set
+    //
+
+    if (HwDeviceExtension->CurrentMode == NULL ) {
+
+        return ERROR_INVALID_FUNCTION;
+
+    }
+
+    //
+    // Find out the size of the data to be put in the the buffer and return
+    // that in the status information (whether or not the information is
+    // there). If the buffer passed in is not large enough return an
+    // appropriate error code.
+    //
+
+    if (ModeInformationSize < (*OutputSize = sizeof(VIDEO_MODE_INFORMATION))) {
+
+        return ERROR_INSUFFICIENT_BUFFER;
+
+    }
+
+    //
+    // Store the characteristics of the current mode into the buffer.
+    //
+
+    ModeInformation->Length = sizeof(VIDEO_MODE_INFORMATION);
+    ModeInformation->ModeIndex = HwDeviceExtension->ModeIndex;
+    ModeInformation->VisScreenWidth = HwDeviceExtension->CurrentMode->hres;
+    ModeInformation->ScreenStride = HwDeviceExtension->CurrentMode->wbytes;
+    ModeInformation->VisScreenHeight = HwDeviceExtension->CurrentMode->vres;
+    ModeInformation->NumberOfPlanes = HwDeviceExtension->CurrentMode->numPlanes;
+    ModeInformation->BitsPerPlane = HwDeviceExtension->CurrentMode->bitsPerPlane;
+    ModeInformation->Frequency = HwDeviceExtension->CurrentMode->Frequency;
+    ModeInformation->XMillimeter = 320;        // temporary hardcoded constant
+    ModeInformation->YMillimeter = 240;        // temporary hardcoded constant
+
+    ModeInformation->AttributeFlags = HwDeviceExtension->CurrentMode->fbType;
+
+    if ((ModeInformation->BitsPerPlane == 32) ||
+        (ModeInformation->BitsPerPlane == 24))
+    {
+
+        ModeInformation->NumberRedBits = 8;
+        ModeInformation->NumberGreenBits = 8;
+        ModeInformation->NumberBlueBits = 8;
+        ModeInformation->RedMask = 0xff0000;
+        ModeInformation->GreenMask = 0x00ff00;
+        ModeInformation->BlueMask = 0x0000ff;
+
+    }
+    else if (ModeInformation->BitsPerPlane == 16)
+    {
+
+        ModeInformation->NumberRedBits = 6;
+        ModeInformation->NumberGreenBits = 6;
+        ModeInformation->NumberBlueBits = 6;
+        ModeInformation->RedMask = 0x1F << 11;
+        ModeInformation->GreenMask = 0x3F << 5;
+        ModeInformation->BlueMask = 0x1F;
+
+    }
+// eVb: 2.12 [VGA] - Add support for 15bpp modes, which Cirrus doesn't support
+    else if (ModeInformation->BitsPerPlane == 15)
+    {
+
+        ModeInformation->NumberRedBits = 6;
+        ModeInformation->NumberGreenBits = 6;
+        ModeInformation->NumberBlueBits = 6;
+        ModeInformation->RedMask = 0x3E << 9;
+        ModeInformation->GreenMask = 0x1F << 5;
+        ModeInformation->BlueMask = 0x1F;
+    }
+// eVb: 2.12 [END]
+    else
+    {
+
+        ModeInformation->NumberRedBits = 6;
+        ModeInformation->NumberGreenBits = 6;
+        ModeInformation->NumberBlueBits = 6;
+        ModeInformation->RedMask = 0;
+        ModeInformation->GreenMask = 0;
+        ModeInformation->BlueMask = 0;
+    }
+
+// eVb: 2.13 [VGA] - All modes are palette managed/driven, unlike Cirrus
+    ModeInformation->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN |
+         VIDEO_MODE_MANAGED_PALETTE;
+// eVb: 2.13 [END]
+
+    return NO_ERROR;
+
+} // end VgaQueryCurrentMode()
+
+\f
+VOID
+VgaZeroVideoMemory(
+    PHW_DEVICE_EXTENSION HwDeviceExtension
+    )
+
+/*++
+
+Routine Description:
+
+    This routine zeros the first 256K on the VGA.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's device extension.
+
+
+Return Value:
+
+    None.
+
+--*/
+{
+    UCHAR temp;
+
+    //
+    // Map font buffer at A0000
+    //
+
+    VgaInterpretCmdStream(HwDeviceExtension, EnableA000Data);
+
+    //
+    // Enable all planes.
+    //
+
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT,
+            IND_MAP_MASK);
+
+    temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+            SEQ_DATA_PORT) | (UCHAR)0x0F;
+
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT,
+            temp);
+
+    VideoPortZeroDeviceMemory(HwDeviceExtension->VideoMemoryAddress, 0xFFFF);
+
+    VgaInterpretCmdStream(HwDeviceExtension, DisableA000Color);
+
+}
diff --git a/reactos/drivers/video/miniport/vga_new/vbe.c b/reactos/drivers/video/miniport/vga_new/vbe.c
new file mode 100644 (file)
index 0000000..a2c593d
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * PROJECT:         ReactOS VGA Miniport Driver
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            boot/drivers/video/miniport/vga/vbe.c
+ * PURPOSE:         Main VESA VBE 1.02+ SVGA Miniport Handling Code
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "vga.h"
+
+/* GLOBALS ********************************************************************/
+
+static const PCHAR Nv11Board = "NV11 (GeForce2) Board";
+static const PCHAR Nv11Chip = "Chip Rev B2";
+static const PCHAR Nv11Vendor = "NVidia Corporation";
+static const PCHAR IntelBrookdale = "Brookdale-G Graphics Controller";
+static const PCHAR BrokenVesaBiosList[] =
+{
+    "SiS 5597",
+    "MGA-G100",
+    "3Dfx Banshee",
+    "Voodoo3 2000 LC ",
+    "Voodoo3 3000 LC ",
+    "Voodoo4 4500 ",
+    "ArtX I",
+    "ATI S1-370TL"
+};
+
+BOOLEAN g_bIntelBrookdaleBIOS;
+
+/* FUNCTIONS ******************************************************************/
+
+BOOLEAN
+NTAPI
+IsVesaBiosOk(IN PVIDEO_PORT_INT10_INTERFACE Interface,
+             IN ULONG OemRevision,
+             IN PCHAR Vendor,
+             IN PCHAR Product,
+             IN PCHAR Revision)
+{
+    ULONG i;
+    CHAR Version[21];
+    
+    /* If the broken VESA bios found, turn VESA off */
+    VideoPortDebugPrint(0, "Vendor: %s Product: %s Revision: %s (%lx)\n", Vendor, Product, Revision, OemRevision);
+    for (i = 0; i < (sizeof(BrokenVesaBiosList) / sizeof(PCHAR)); i++)
+    {
+        if (!strncmp(Product, BrokenVesaBiosList[i], sizeof(BrokenVesaBiosList[i]))) return FALSE;
+    }
+
+    /* For Brookdale-G (Intel), special hack used */
+    g_bIntelBrookdaleBIOS = !strncmp(Product, IntelBrookdale, sizeof(IntelBrookdale));
+    
+    /* For NVIDIA make sure */
+    if (!(strncmp(Vendor, Nv11Vendor, sizeof(Nv11Vendor))) &&
+        !(strncmp(Product, Nv11Board, sizeof(Nv11Board))) &&
+        !(strncmp(Revision, Nv11Chip, sizeof(Nv11Chip))) &&
+        (OemRevision == 0x311))
+    {
+        /* Read version */
+        if (Interface->Int10ReadMemory(Interface->Context,
+                                       0xC000,
+                                       345,
+                                       Version,
+                                       sizeof(Version))) return FALSE;                                        
+        if (!strncmp(Version, "Version 3.11.01.24N16", sizeof(Version))) return FALSE;
+    }
+    
+    /* VESA ok */
+    //VideoPortDebugPrint(0, "Vesa ok\n");
+    return TRUE;
+}
+
+BOOLEAN
+NTAPI
+ValidateVbeInfo(IN PHW_DEVICE_EXTENSION VgaExtension,
+                IN PVBE_INFO VbeInfo)
+{
+    BOOLEAN VesaBiosOk;
+    PVOID Context;
+    CHAR ProductRevision[80];
+    CHAR OemString[80];
+    CHAR ProductName[80];
+    CHAR VendorName[80];
+    VP_STATUS Status;
+    
+    /* Set default */
+    VesaBiosOk = FALSE;
+    Context = VgaExtension->Int10Interface.Context;
+    
+    /* Check magic and version */
+    if (strncmp(VbeInfo->Info.Signature, "VESA", 4)) return VesaBiosOk;
+    if (VbeInfo->Info.Version < 0x102) return VesaBiosOk;
+
+    /* Read strings */
+    Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
+                                                          HIWORD(VbeInfo->Info.OemStringPtr),
+                                                          LOWORD(VbeInfo->Info.OemStringPtr),
+                                                          OemString,
+                                                          sizeof(OemString));
+    if (Status != NO_ERROR) return VesaBiosOk;
+    Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
+                                                          HIWORD(VbeInfo->Info.OemVendorNamePtr),
+                                                          LOWORD(VbeInfo->Info.OemVendorNamePtr),
+                                                          VendorName,
+                                                          sizeof(VendorName));
+    if (Status != NO_ERROR) return VesaBiosOk;
+    Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
+                                                          HIWORD(VbeInfo->Info.OemProductNamePtr),
+                                                          LOWORD(VbeInfo->Info.OemProductNamePtr),
+                                                          ProductName,
+                                                          sizeof(ProductName));
+    if (Status != NO_ERROR) return VesaBiosOk;
+    Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
+                                                          HIWORD(VbeInfo->Info.OemProductRevPtr),
+                                                          LOWORD(VbeInfo->Info.OemProductRevPtr),
+                                                          ProductRevision,
+                                                          sizeof(ProductRevision));
+    if (Status != NO_ERROR) return VesaBiosOk;
+
+    /* Null-terminate strings */
+    VendorName[sizeof(OemString) - 1] = ANSI_NULL;
+    ProductName[sizeof(OemString) - 1] = ANSI_NULL;
+    ProductRevision[sizeof(OemString) - 1] = ANSI_NULL;
+    OemString[sizeof(OemString) - 1] = ANSI_NULL;
+                
+    /* Check for known bad BIOS */
+    VesaBiosOk = IsVesaBiosOk(&VgaExtension->Int10Interface,
+                              VbeInfo->Info.OemSoftwareRevision,
+                              VendorName,
+                              ProductName,
+                              ProductRevision);        
+    VgaExtension->VesaBiosOk = VesaBiosOk;
+    return VesaBiosOk;
+}
+
+VP_STATUS
+NTAPI
+VbeSetColorLookup(IN PHW_DEVICE_EXTENSION VgaExtension,
+                  IN PVIDEO_CLUT ClutBuffer)
+{
+    PVBE_COLOR_REGISTER VesaClut;
+    INT10_BIOS_ARGUMENTS BiosArguments;
+    PVOID Context;
+    ULONG Entries;
+    ULONG BufferSize = 4 * 1024;
+    USHORT TrampolineMemorySegment, TrampolineMemoryOffset;
+    VP_STATUS Status;
+    USHORT i;
+
+    Entries = ClutBuffer->NumEntries;
+      
+    /* Allocate INT10 context/buffer */
+    VesaClut = VideoPortAllocatePool(VgaExtension, 1, sizeof(ULONG) * Entries, 0x20616756u);
+    if (!VesaClut) return ERROR_INVALID_PARAMETER;
+    if (!VgaExtension->Int10Interface.Size) return ERROR_INVALID_PARAMETER;
+    Context = VgaExtension->Int10Interface.Context;
+    Status = VgaExtension->Int10Interface.Int10AllocateBuffer(Context,
+                                                            &TrampolineMemorySegment,
+                                                            &TrampolineMemoryOffset,
+                                                            &BufferSize);
+    if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER;
+
+    /* VESA has color registers backward! */
+    for (i = 0; i < Entries; i++)
+    {
+        VesaClut[i].Blue = ClutBuffer->LookupTable[i].RgbArray.Blue;
+        VesaClut[i].Green = ClutBuffer->LookupTable[i].RgbArray.Green;
+        VesaClut[i].Red = ClutBuffer->LookupTable[i].RgbArray.Red;
+        VesaClut[i].Pad = 0;
+    }
+    Status = VgaExtension->Int10Interface.Int10WriteMemory(Context,
+                                                         TrampolineMemorySegment,
+                                                         TrampolineMemoryOffset,
+                                                         VesaClut,
+                                                         Entries * sizeof(ULONG));
+    if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER;
+
+    /* Write new palette */                                                      
+    BiosArguments.Ebx = 0;
+    BiosArguments.Ecx = Entries;
+    BiosArguments.Edx = ClutBuffer->FirstEntry;
+    BiosArguments.Edi = TrampolineMemoryOffset;
+    BiosArguments.SegEs = TrampolineMemorySegment;
+    BiosArguments.Eax = VBE_SET_GET_PALETTE_DATA;
+    Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments);
+    if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER;
+    VideoPortFreePool(VgaExtension, VesaClut);
+    VideoPortDebugPrint(Error, "VBE Status: %lx\n", BiosArguments.Eax);
+    if (BiosArguments.Eax == VBE_SUCCESS) return NO_ERROR;
+    return ERROR_INVALID_PARAMETER;
+}
+
+/* EOF */
diff --git a/reactos/drivers/video/miniport/vga_new/vbe.h b/reactos/drivers/video/miniport/vga_new/vbe.h
new file mode 100644 (file)
index 0000000..8802a5e
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * PROJECT:         VGA Miniport Driver
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            boot/drivers/video/miniport/vga/vbe.h
+ * PURPOSE:         VESA VBE Registers and Structures
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+
+#define LOWORD(l)      ((USHORT)((ULONG_PTR)(l)))
+#define HIWORD(l)      ((USHORT)(((ULONG_PTR)(l)>>16)&0xFFFF))
+
+
+/*
+ * VBE Command Definitions
+ */
+
+#define VBE_GET_CONTROLLER_INFORMATION       0x4F00
+#define VBE_GET_MODE_INFORMATION             0x4F01
+#define VBE_SET_VBE_MODE                     0x4F02
+#define VBE_GET_CURRENT_VBE_MODE             0x4F03
+#define VBE_SAVE_RESTORE_STATE               0x4F04
+#define VBE_DISPLAY_WINDOW_CONTROL           0x4F05
+#define VBE_SET_GET_LOGICAL_SCAN_LINE_LENGTH 0x4F06
+#define VBE_SET_GET_DISPLAY_START            0x4F07
+#define VBE_SET_GET_DAC_PALETTE_FORMAT       0x4F08
+#define VBE_SET_GET_PALETTE_DATA             0x4F09
+
+/* VBE 2.0+ */
+#define VBE_RETURN_PROTECTED_MODE_INTERFACE  0x4F0A
+#define VBE_GET_SET_PIXEL_CLOCK              0x4F0B
+
+/* Extensions */
+#define VBE_POWER_MANAGEMENT_EXTENSIONS      0x4F10
+#define VBE_FLAT_PANEL_INTERFACE_EXTENSIONS  0x4F11
+#define VBE_AUDIO_INTERFACE_EXTENSIONS       0x4F12
+#define VBE_OEM_EXTENSIONS                   0x4F13
+#define VBE_DISPLAY_DATA_CHANNEL             0x4F14
+#define VBE_DDC                              0x4F15
+
+/*
+ * VBE DDC Sub-Functions
+ */
+
+#define VBE_DDC_READ_EDID                      0x01
+#define VBE_DDC_REPORT_CAPABILITIES            0x10
+#define VBE_DDC_BEGIN_SCL_SDA_CONTROL          0x11
+#define VBE_DDC_END_SCL_SDA_CONTROL            0x12
+#define VBE_DDC_WRITE_SCL_CLOCK_LINE           0x13
+#define VBE_DDC_WRITE_SDA_DATA_LINE            0x14
+#define VBE_DDC_READ_SCL_CLOCK_LINE            0x15
+#define VBE_DDC_READ_SDA_DATA_LINE             0x16
+
+/*
+ * VBE Video Mode Information Definitions
+ */
+#define VBE_MODEATTR_VALID                      0x01
+#define VBE_MODEATTR_COLOR                      0x08
+#define VBE_MODEATTR_GRAPHICS                   0x10
+#define VBE_MODEATTR_NON_VGA                    0x20
+#define VBE_MODEATTR_NO_BANK_SWITCH             0x40
+#define VBE_MODEATTR_LINEAR                     0x80
+
+#define VBE_MODE_BITS                           8
+#define VBE_MODE_RESERVED_1                     0x200
+#define VBE_MODE_RESERVED_2                     0x400
+#define VBE_MODE_REFRESH_CONTROL                0x800
+#define VBE_MODE_ACCELERATED_1                  0x1000
+#define VBE_MODE_ACCELERATED_2                  0x2000
+#define VBE_MODE_LINEAR_FRAMEBUFFER             0x4000
+#define VBE_MODE_PRESERVE_DISPLAY               0x8000
+#define VBE_MODE_MASK                           ((1 << (VBE_MODE_BITS + 1)) - 1)
+
+#define VBE_MEMORYMODEL_PACKEDPIXEL            0x04
+#define VBE_MEMORYMODEL_DIRECTCOLOR            0x06
+
+/*
+ * VBE Return Codes
+ */
+
+#define VBE_SUCCESS                            0x4F
+#define VBE_UNSUCCESSFUL                      0x14F
+#define VBE_NOT_SUPPORTED                     0x24F
+#define VBE_FUNCTION_INVALID                  0x34F
+
+#define VBE_GETRETURNCODE(x) (x & 0xFFFF)
+
+#include <pshpack1.h>
+
+/*
+ * VBE specification defined structure for general adapter info
+ * returned by function VBE_GET_CONTROLLER_INFORMATION command.
+ */
+
+typedef struct _VBE_CONTROLLER_INFO
+{
+   CHAR Signature[4];
+   USHORT Version;
+   ULONG OemStringPtr;
+   LONG Capabilities;
+   ULONG VideoModePtr;
+   USHORT TotalMemory;
+   USHORT OemSoftwareRevision;
+   ULONG OemVendorNamePtr;
+   ULONG OemProductNamePtr;
+   ULONG OemProductRevPtr;
+   CHAR Reserved[222];
+   CHAR OemData[256];
+} VBE_CONTROLLER_INFO, *PVBE_CONTROLLER_INFO;
+
+/*
+ * VBE specification defined structure for specific video mode
+ * info returned by function VBE_GET_MODE_INFORMATION command.
+ */
+
+typedef struct _VBE_MODE_INFO
+{
+   /* Mandatory information for all VBE revisions */
+   USHORT ModeAttributes;
+   UCHAR WinAAttributes;
+   UCHAR WinBAttributes;
+   USHORT WinGranularity;
+   USHORT WinSize;
+   USHORT WinASegment;
+   USHORT WinBSegment;
+   ULONG WinFuncPtr;
+   USHORT BytesPerScanLine;
+
+   /* Mandatory information for VBE 1.2 and above */
+   USHORT XResolution;
+   USHORT YResolution;
+   UCHAR XCharSize;
+   UCHAR YCharSize;
+   UCHAR NumberOfPlanes;
+   UCHAR BitsPerPixel;
+   UCHAR NumberOfBanks;
+   UCHAR MemoryModel;
+   UCHAR BankSize;
+   UCHAR NumberOfImagePages;
+   UCHAR Reserved1;
+
+   /* Direct Color fields (required for Direct/6 and YUV/7 memory models) */
+   UCHAR RedMaskSize;
+   UCHAR RedFieldPosition;
+   UCHAR GreenMaskSize;
+   UCHAR GreenFieldPosition;
+   UCHAR BlueMaskSize;
+   UCHAR BlueFieldPosition;
+   UCHAR ReservedMaskSize;
+   UCHAR ReservedFieldPosition;
+   UCHAR DirectColorModeInfo;
+
+   /* Mandatory information for VBE 2.0 and above */
+   ULONG PhysBasePtr;
+   ULONG Reserved2;
+   USHORT Reserved3;
+
+   /* Mandatory information for VBE 3.0 and above */
+   USHORT LinBytesPerScanLine;
+   UCHAR BnkNumberOfImagePages;
+   UCHAR LinNumberOfImagePages;
+   UCHAR LinRedMaskSize;
+   UCHAR LinRedFieldPosition;
+   UCHAR LinGreenMaskSize;
+   UCHAR LinGreenFieldPosition;
+   UCHAR LinBlueMaskSize;
+   UCHAR LinBlueFieldPosition;
+   UCHAR LinReservedMaskSize;
+   UCHAR LinReservedFieldPosition;
+   ULONG MaxPixelClock;
+
+   CHAR Reserved4[190];
+} VBE_MODE_INFO, *PVBE_MODE_INFO;
+
+#include <poppack.h>
+
+typedef struct _VBE_INFO
+{
+    VBE_CONTROLLER_INFO Info;
+    VBE_MODE_INFO Modes;
+    USHORT ModeArray[129];
+} VBE_INFO, *PVBE_INFO;
+
+C_ASSERT(sizeof(VBE_CONTROLLER_INFO) == 0x200);
+C_ASSERT(sizeof(VBE_MODE_INFO) == 0x100);
+
+typedef struct _VBE_COLOR_REGISTER
+{
+    UCHAR Blue;
+    UCHAR Green;
+    UCHAR Red;
+    UCHAR Pad;
+} VBE_COLOR_REGISTER, *PVBE_COLOR_REGISTER;
+
+VOID
+NTAPI
+InitializeModeTable(IN PHW_DEVICE_EXTENSION VgaExtension);
+
+VP_STATUS
+NTAPI
+VbeSetMode(IN PHW_DEVICE_EXTENSION VgaDeviceExtension,
+         IN PVIDEOMODE VgaMode,
+         OUT PULONG PhysPtrChange);
+
+VP_STATUS
+NTAPI
+VbeSetColorLookup(IN PHW_DEVICE_EXTENSION VgaExtension,
+            IN PVIDEO_CLUT ClutBuffer);
+
+BOOLEAN
+NTAPI
+ValidateVbeInfo(IN PHW_DEVICE_EXTENSION VgaExtension,
+                IN PVBE_INFO VbeInfo);
+
+extern BOOLEAN g_bIntelBrookdaleBIOS;
+
+/* EOF */
diff --git a/reactos/drivers/video/miniport/vga_new/vbemodes.c b/reactos/drivers/video/miniport/vga_new/vbemodes.c
new file mode 100644 (file)
index 0000000..39537c6
--- /dev/null
@@ -0,0 +1,449 @@
+/*
+ * PROJECT:         ReactOS VGA Miniport Driver
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            boot/drivers/video/miniport/vga/vbemodes.c
+ * PURPOSE:         Mode Initialization and Mode Set for VBE-compatible cards
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "vga.h"
+
+/* FUNCTIONS ******************************************************************/
+
+ULONG
+NTAPI
+RaiseToPower2Ulong(IN ULONG Value)
+{
+    ULONG SquaredResult = Value;
+    if ((Value - 1) & Value) for (SquaredResult = 1; (SquaredResult < Value) && (SquaredResult); SquaredResult *= 2);
+    return SquaredResult;
+}
+
+ULONG
+NTAPI
+RaiseToPower2(IN USHORT Value)
+{
+    ULONG SquaredResult = Value;
+    if ((Value - 1) & Value) for (SquaredResult = 1; (SquaredResult < Value) && (SquaredResult); SquaredResult *= 2); 
+    return SquaredResult;
+}
+
+ULONG
+NTAPI
+VbeGetVideoMemoryBaseAddress(IN PHW_DEVICE_EXTENSION VgaExtension,
+                             IN PVIDEOMODE VgaMode)
+{ 
+    ULONG Length = 4 * 1024;
+    USHORT TrampolineMemorySegment, TrampolineMemoryOffset;
+    PVOID Context;
+    INT10_BIOS_ARGUMENTS BiosArguments;
+    PVBE_MODE_INFO VbeModeInfo;
+    ULONG BaseAddress;
+    VP_STATUS Status;
+
+    /* Need linear and INT10 interface */
+    if (!(VgaMode->fbType & VIDEO_MODE_BANKED)) return 0;
+    if (VgaExtension->Int10Interface.Size) return 0;
+    
+    /* Allocate scratch area and context */
+    VbeModeInfo = VideoPortAllocatePool(VgaExtension, 1, sizeof(VBE_MODE_INFO), ' agV');
+    if (!VbeModeInfo) return 0;
+    Context = VgaExtension->Int10Interface.Context;
+    Status = VgaExtension->Int10Interface.Int10AllocateBuffer(Context,
+                                                              &TrampolineMemorySegment,
+                                                              &TrampolineMemoryOffset,
+                                                              &Length);
+    if (Status != NO_ERROR) return 0;
+
+    /* Ask VBE BIOS for mode info */
+    BiosArguments.Ecx = HIWORD(VgaMode->Mode);
+    BiosArguments.Edi = TrampolineMemorySegment;
+    BiosArguments.SegEs = TrampolineMemoryOffset;
+    BiosArguments.Eax = VBE_GET_MODE_INFORMATION;
+    Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments);
+    if (Status != NO_ERROR) return 0;
+    if (BiosArguments.Eax != VBE_SUCCESS) return 0;
+    Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
+                                                          TrampolineMemorySegment,
+                                                          TrampolineMemoryOffset,
+                                                          VbeModeInfo,
+                                                          sizeof(VBE_MODE_INFO));
+    if (Status != NO_ERROR) return 0;
+    
+    /* Return phys address and cleanup */
+    BaseAddress = VbeModeInfo->PhysBasePtr;
+    VgaExtension->Int10Interface.Int10FreeBuffer(Context,
+                                                 TrampolineMemorySegment,
+                                                 TrampolineMemoryOffset);
+    VideoPortFreePool(VgaExtension, VbeModeInfo);
+    return BaseAddress;
+}
+
+VP_STATUS
+NTAPI
+VbeSetMode(IN PHW_DEVICE_EXTENSION VgaDeviceExtension,
+           IN PVIDEOMODE VgaMode,
+           OUT PULONG PhysPtrChange)
+{
+    VP_STATUS Status;
+    VIDEO_X86_BIOS_ARGUMENTS BiosArguments;
+    ULONG ModeIndex;
+    ULONG BaseAddress;
+    
+    VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments));     
+    ModeIndex = VgaMode->Mode;
+    BiosArguments.Eax = ModeIndex & 0x0000FFFF;
+    BiosArguments.Ebx = ModeIndex >> 16;
+    VideoPortDebugPrint(0, "Switching to %lx %lx\n", BiosArguments.Eax, BiosArguments.Ebx);
+    Status = VideoPortInt10(VgaDeviceExtension, &BiosArguments);
+    if (Status != NO_ERROR) return Status;
+
+    /* Check for VESA mode */  
+    if (ModeIndex >> 16)
+    {
+        /* Mode set fail */
+        if (BiosArguments.Eax != VBE_SUCCESS) return ERROR_INVALID_PARAMETER;
+        
+        /* Check current mode is desired mode */
+        BiosArguments.Eax = VBE_GET_CURRENT_VBE_MODE;
+        Status = VideoPortInt10(VgaDeviceExtension, &BiosArguments);
+        if ((Status == NO_ERROR) &&
+            (BiosArguments.Eax == VBE_SUCCESS) &&
+            ((BiosArguments.Ebx ^ (ModeIndex >> 16)) & VBE_MODE_BITS))
+        {
+            return ERROR_INVALID_PARAMETER;
+        }
+
+        /* Set logical scanline width if different from physical */
+        if (VgaMode->LogicalWidth != VgaMode->hres)
+        {
+            /* Check setting works after being set */
+            BiosArguments.Eax = VBE_SET_GET_LOGICAL_SCAN_LINE_LENGTH;
+            BiosArguments.Ecx = VgaMode->LogicalWidth;
+            BiosArguments.Ebx = 0;
+            Status = VideoPortInt10(VgaDeviceExtension, &BiosArguments);
+            if ((Status != NO_ERROR) ||
+                (BiosArguments.Eax != VBE_SUCCESS) ||
+                (BiosArguments.Ecx != VgaMode->LogicalWidth))
+            {
+                return ERROR_INVALID_PARAMETER;
+            }
+        }
+    }
+    
+    /* Get VRAM address to update changes */
+    BaseAddress = VbeGetVideoMemoryBaseAddress(VgaDeviceExtension, VgaMode);
+    if ((BaseAddress) && (VgaMode->PhysBase != BaseAddress))
+    {
+        *PhysPtrChange = TRUE;
+        VgaMode->PhysBase = BaseAddress;
+    }
+    
+    return NO_ERROR;   
+}
+
+VOID
+NTAPI
+InitializeModeTable(IN PHW_DEVICE_EXTENSION VgaExtension)
+{
+    ULONG ModeCount = 0;
+    ULONG Length = 4 * 1024;
+    ULONG TotalMemory;
+    VP_STATUS Status;
+    INT10_BIOS_ARGUMENTS BiosArguments;
+    PVBE_INFO VbeInfo;
+    PVBE_MODE_INFO VbeModeInfo;
+    PVOID Context;
+    USHORT TrampolineMemorySegment;
+    USHORT TrampolineMemoryOffset;
+    ULONG VbeVersion;
+    ULONG NewModes = 0;
+    BOOLEAN FourBppModeFound = FALSE;
+    USHORT ModeResult;
+    USHORT Mode;
+    PUSHORT ThisMode;
+    BOOLEAN LinearAddressing;
+    ULONG Size, ScreenSize;
+    PVIDEOMODE VgaMode;
+    PVOID BaseAddress;
+    ULONG ScreenStride = 0;
+    PHYSICAL_ADDRESS PhysicalAddress;
+
+    /* Enable only default vga modes if no vesa */
+    VgaModeList = ModesVGA;
+    if (VideoPortIsNoVesa())
+    {
+        VgaExtension->Int10Interface.Size = 0;
+        VgaExtension->Int10Interface.Version = 0;
+        return;
+    }
+    
+    /* Query INT10 interface */
+    VgaExtension->Int10Interface.Version = VIDEO_PORT_INT10_INTERFACE_VERSION_1;
+    VgaExtension->Int10Interface.Size = sizeof(VIDEO_PORT_INT10_INTERFACE);
+    if (VideoPortQueryServices(VgaExtension,
+                               VideoPortServicesInt10,
+                               (PINTERFACE)&VgaExtension->Int10Interface))
+    {
+        VgaExtension->Int10Interface.Size = 0;
+        VgaExtension->Int10Interface.Version = 0;
+    }
+    
+    /* Add ref */
+    //VideoPortDebugPrint(0, "have int10 iface\n");
+    VgaExtension->Int10Interface.InterfaceReference(VgaExtension->Int10Interface.Context);
+    Context = VgaExtension->Int10Interface.Context;
+    
+    /* Allocate scratch area and context */
+    Status = VgaExtension->Int10Interface.Int10AllocateBuffer(Context,
+                                                              &TrampolineMemorySegment,
+                                                              &TrampolineMemoryOffset,
+                                                              &Length);
+    if (Status != NO_ERROR) return;
+    VbeInfo = VideoPortAllocatePool(VgaExtension, 1, sizeof(VBE_INFO), ' agV');
+    VbeModeInfo = &VbeInfo->Modes;
+    if (!VbeInfo) return;
+
+    /* Init VBE data and write to card buffer */
+    //VideoPortDebugPrint(0, "have int10 data\n");
+    VbeInfo->ModeArray[128] = 0xFFFF;
+    strcpy(VbeInfo->Info.Signature, "VBE2");
+    Status = VgaExtension->Int10Interface.Int10WriteMemory(Context,
+                                                           TrampolineMemorySegment,
+                                                           TrampolineMemoryOffset,
+                                                           VbeInfo,
+                                                           512);
+    if (Status != NO_ERROR) return;
+
+    /* Get controller info */
+    BiosArguments.Edi = TrampolineMemoryOffset;
+    BiosArguments.SegEs = TrampolineMemorySegment;
+    BiosArguments.Eax = VBE_GET_CONTROLLER_INFORMATION;
+    Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments);
+    if (Status != NO_ERROR) return;
+    if (BiosArguments.Eax != VBE_SUCCESS) return;
+    Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
+                                                          TrampolineMemorySegment,
+                                                          TrampolineMemoryOffset,
+                                                          VbeInfo,
+                                                          512);
+    if (Status != NO_ERROR) return;
+
+    /* Check correct VBE BIOS */
+    //VideoPortDebugPrint(0, "have vbe data\n");
+    TotalMemory = VbeInfo->Info.TotalMemory << 16;
+    VbeVersion = VbeInfo->Info.Version;
+    VideoPortDebugPrint(0, "vbe version %lx memory %lx\n", VbeVersion, TotalMemory);
+    if (!ValidateVbeInfo(VgaExtension, VbeInfo)) return;
+    
+    /* Read modes */
+    //VideoPortDebugPrint(0, "read modes from %p\n", VbeInfo->Info.VideoModePtr);
+    Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
+                                                          HIWORD(VbeInfo->Info.VideoModePtr),
+                                                          LOWORD(VbeInfo->Info.VideoModePtr),
+                                                          VbeInfo->ModeArray,
+                                                          128 * sizeof(USHORT));
+    if (Status != NO_ERROR) return;
+    //VideoPortDebugPrint(0, "Read modes at: %p\n", VbeInfo->ModeArray);
+
+    /* Count modes, check for new 4bpp SVGA modes */
+    ThisMode = VbeInfo->ModeArray;
+    ModeResult = VbeInfo->ModeArray[0];
+    while (ModeResult != 0xFFFF)
+    {
+        Mode = ModeResult & 0x1FF;
+        //VideoPortDebugPrint(0, "Mode found: %lx\n", Mode);
+        if ((Mode == 0x102) || (Mode == 0x6A)) FourBppModeFound = TRUE;
+        ModeResult = *++ThisMode;
+        NewModes++;
+    }
+    
+    /* Remove the built-in mode if not supported by card and check max modes */
+    if (!FourBppModeFound) --NumVideoModes;
+    if ((NewModes >= 128) && (NumVideoModes > 8)) goto Cleanup;
+    
+    /* Switch to new SVGA mode list, copy VGA modes */
+    VgaModeList = VideoPortAllocatePool(VgaExtension, 1, (NewModes + NumVideoModes) * sizeof(VIDEOMODE), ' agV');
+    if (!VgaModeList) goto Cleanup;
+    VideoPortMoveMemory(VgaModeList, ModesVGA, NumVideoModes * sizeof(VIDEOMODE));
+
+    /* Apply fixup for Intel Brookdale */
+    if (g_bIntelBrookdaleBIOS)
+    {
+        VideoPortDebugPrint(0, "Intel Brookdale-G Video BIOS Not Support!\n");
+        while (TRUE);
+    }
+    
+    /* Scan SVGA modes */
+//    VideoPortDebugPrint(0, "Static modes: %d\n", NumVideoModes);
+    VgaMode = &VgaModeList[NumVideoModes];
+    ThisMode = VbeInfo->ModeArray;
+    //VideoPortDebugPrint(0, "new modes: %d\n", NewModes);
+    while (NewModes--)
+    {
+        /* Get info on mode */
+        BiosArguments.Eax = VBE_GET_MODE_INFORMATION;
+        BiosArguments.Ecx = *ThisMode;
+        BiosArguments.Edi = TrampolineMemoryOffset;
+        BiosArguments.SegEs = TrampolineMemorySegment;
+        Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments);
+        if (Status != NO_ERROR) goto Next;
+        if (BiosArguments.Eax != VBE_SUCCESS) goto Next;
+        Status = VgaExtension->Int10Interface.Int10ReadMemory(Context,
+                                                              TrampolineMemorySegment,
+                                                              TrampolineMemoryOffset,
+                                                              VbeModeInfo,
+                                                              256);
+        if (Status != NO_ERROR) goto Next;
+
+        /* Parse graphics modes only if linear framebuffer support */
+        //VideoPortDebugPrint(0, "attr: %lx\n", VbeModeInfo->ModeAttributes);
+        if (!(VbeModeInfo->ModeAttributes & (VBE_MODEATTR_VALID |
+                                             VBE_MODEATTR_GRAPHICS))) goto Next;
+        LinearAddressing = ((VbeVersion >= 0x200) &&
+                            (VbeModeInfo->PhysBasePtr) &&
+                            (VbeModeInfo->ModeAttributes & VBE_MODEATTR_LINEAR)) ?
+                            TRUE : FALSE;
+
+        /* Check SVGA modes if 8bpp or higher */
+        //VideoPortDebugPrint(0, "PhysBase: %lx\n", VbeModeInfo->PhysBasePtr);
+        if ((VbeModeInfo->XResolution >= 640) &&
+            (VbeModeInfo->YResolution >= 480) &&
+            (VbeModeInfo->NumberOfPlanes >= 1) &&
+            (VbeModeInfo->BitsPerPixel >= 8))
+        {
+            /* Copy VGA mode info */
+            VideoPortZeroMemory(VgaMode, sizeof(VIDEOMODE));
+            VgaMode->numPlanes = VbeModeInfo->NumberOfPlanes;
+            VgaMode->hres = VbeModeInfo->XResolution;
+            VgaMode->vres = VbeModeInfo->YResolution;
+            VgaMode->Frequency = 1;
+            VgaMode->Mode = (*ThisMode << 16) | VBE_SET_VBE_MODE;
+            VgaMode->Granularity = VbeModeInfo->WinGranularity << 10;
+            //VideoPortDebugPrint(0, "Mode %lx (Granularity %d)\n", VgaMode->Mode, VgaMode->Granularity);
+
+            /* Set flags */
+            if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_COLOR) VgaMode->fbType |= VIDEO_MODE_COLOR;
+            if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_GRAPHICS) VgaMode->fbType |= VIDEO_MODE_GRAPHICS;
+            if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_NON_VGA) VgaMode->NonVgaMode = TRUE;
+            
+            /* If no char data, say 80x25 */
+            VgaMode->col = VbeModeInfo->XCharSize ? VbeModeInfo->XResolution / VbeModeInfo->XCharSize : 80;
+            VgaMode->row = VbeModeInfo->YCharSize ? VbeModeInfo->YResolution / VbeModeInfo->YCharSize : 25;
+            //VideoPortDebugPrint(0, "%d by %d rows\n", VgaMode->Columns, VgaMode->Rows);
+
+            /* Check RGB555 (15bpp only) */
+            VgaMode->bitsPerPlane = VbeModeInfo->BitsPerPixel / VbeModeInfo->NumberOfPlanes;
+            if ((VgaMode->bitsPerPlane == 16) && (VbeModeInfo->GreenMaskSize == 5)) VgaMode->bitsPerPlane = 15;
+            //VideoPortDebugPrint(0, "BPP: %d\n", VgaMode->BitsPerPlane);
+            
+            /* Do linear or banked frame buffers */ 
+            VgaMode->FrameBufferBase = 0;
+            if (!LinearAddressing)
+            {
+                /* Read the screen stride (scanline size) */
+                ScreenStride = RaiseToPower2(VbeModeInfo->BytesPerScanLine);
+                VgaMode->wbytes = ScreenStride;
+                //VideoPortDebugPrint(0, "ScanLines: %lx Stride: %lx\n", VbeModeInfo->BytesPerScanLine, VgaMode->Stride);
+            
+                /* Size of frame buffer is Height X ScanLine, align to bank/page size */
+                ScreenSize = VgaMode->hres * ScreenStride;
+                //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+                Size = (ScreenSize + ((64 * 1024) - 1)) & ((64 * 1024) - 1);
+                //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+                if (Size > TotalMemory) Size = (Size + ((4 * 1024) - 1)) & ((4 * 1024) - 1);
+                //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+             
+                /* Banked VGA at 0xA0000 (64K) */
+                //VideoPortDebugPrint(0, "Final size: %lx\n", Size);
+                VgaMode->fbType |= VIDEO_MODE_BANKED;
+                VgaMode->sbytes = Size;
+                VgaMode->PhysSize = 64 * 1024;
+                VgaMode->FrameBufferSize = 64 * 1024;
+                VgaMode->NoBankSwitch = TRUE;
+                VgaMode->PhysBase = 0xA0000;
+                VgaMode->LogicalWidth = RaiseToPower2(VgaMode->hres);
+            }
+            else
+            {
+                /* VBE 3.00+ has specific field, read legacy field if not */
+                //VideoPortDebugPrint(0, "LINEAR MODE!!!\n");
+                ScreenStride = (VbeVersion >= 0x300) ? VbeModeInfo->LinBytesPerScanLine : 0;
+                if (!ScreenStride) ScreenStride = VbeModeInfo->BytesPerScanLine;
+                VgaMode->wbytes = ScreenStride;
+                //VideoPortDebugPrint(0, "ScanLines: %lx Stride: %lx\n", VbeModeInfo->BytesPerScanLine, VgaMode->Stride);
+           
+                /* Size of frame buffer is Height X ScanLine, align to page size */
+                ScreenSize = VgaMode->hres * LOWORD(VgaMode->wbytes);
+                //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+                Size = RaiseToPower2Ulong(ScreenSize);
+                //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+                if (Size > TotalMemory) Size = (Size + ((4 * 1024) - 1)) & ((4 * 1024) - 1);
+                //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize);
+           
+                /* Linear VGA must read settings from VBE */
+                VgaMode->fbType |= VIDEO_MODE_LINEAR;
+                VgaMode->sbytes = Size;
+                VgaMode->PhysSize = Size;
+                VgaMode->FrameBufferSize = Size;
+                VgaMode->NoBankSwitch = FALSE;
+                VgaMode->PhysBase = VbeModeInfo->PhysBasePtr;
+                VgaMode->LogicalWidth = VgaMode->hres;
+                
+                /* Make VBE_SET_VBE_MODE command use Linear Framebuffer Select */
+                VgaMode->Mode |= (VBE_MODE_LINEAR_FRAMEBUFFER << 16);
+            }
+            
+            /* Override bank switch if not support by card */
+            if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_NO_BANK_SWITCH) VgaMode->NoBankSwitch = TRUE;
+            
+            /* Next */
+            if (ScreenSize <= TotalMemory)
+            {
+                VgaMode++;
+                ModeCount++;
+            }
+        }
+Next:
+        /* Next */
+        ThisMode++;
+    }
+
+    /* Check if last mode was color to do test */
+    VideoPortDebugPrint(0, "mode scan complete. Total modes: %d\n", ModeCount);
+    if (--VgaMode->fbType & VIDEO_MODE_COLOR)
+    {
+        /* Try map physical buffer and free if worked */
+        PhysicalAddress.QuadPart = VgaMode->PhysBase;
+        BaseAddress = VideoPortGetDeviceBase(VgaExtension, PhysicalAddress, 4 * 1024, FALSE);
+        if (BaseAddress)
+        {
+            VideoPortFreeDeviceBase(VgaExtension, BaseAddress);
+        }
+        else
+        {
+            /* Not work, so throw out VBE data */
+            ModeCount = 0;
+        }
+    }
+
+    /* Cleanup sucess path */
+    VideoPortFreePool(VgaExtension, VbeInfo);
+    VgaExtension->Int10Interface.Int10FreeBuffer(Context,
+                                                 TrampolineMemorySegment,
+                                                 TrampolineMemoryOffset);
+    NumVideoModes += ModeCount;
+    return;
+
+Cleanup:
+    /* Cleanup failure path, reset standard VGA and free memory */
+    VgaModeList = ModesVGA;
+    VideoPortFreePool(VgaExtension, VbeInfo);
+    VgaExtension->Int10Interface.Int10FreeBuffer(Context,
+                                                 TrampolineMemorySegment,
+                                                 TrampolineMemoryOffset);
+}
+
+/* EOF */
diff --git a/reactos/drivers/video/miniport/vga_new/vga.c b/reactos/drivers/video/miniport/vga_new/vga.c
new file mode 100644 (file)
index 0000000..a97c64b
--- /dev/null
@@ -0,0 +1,1556 @@
+/*
+ * PROJECT:         ReactOS VGA Miniport Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/miniport/vga/vga.c
+ * PURPOSE:         Main Standard VGA-compatible Minport Handling Code
+ * PROGRAMMERS:     Copyright (c) 1992  Microsoft Corporation
+ *                  ReactOS Portable Systems Group
+ */
+
+//---------------------------------------------------------------------------
+
+#include "vga.h"
+
+//---------------------------------------------------------------------------
+//
+// Function declarations
+//
+// Functions that start with 'VGA' are entry points for the OS port driver.
+//
+
+VP_STATUS
+VgaFindAdapter(
+    PVOID HwDeviceExtension,
+    PVOID HwContext,
+    PWSTR ArgumentString,
+    PVIDEO_PORT_CONFIG_INFO ConfigInfo,
+    PUCHAR Again
+    );
+
+BOOLEAN
+VgaInitialize(
+    PVOID HwDeviceExtension
+    );
+
+BOOLEAN
+VgaStartIO(
+    PVOID HwDeviceExtension,
+    PVIDEO_REQUEST_PACKET RequestPacket
+    );
+
+//
+// Private function prototypes.
+//
+
+VP_STATUS
+VgaQueryAvailableModes(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_MODE_INFORMATION ModeInformation,
+    ULONG ModeInformationSize,
+    PULONG OutputSize
+    );
+
+VP_STATUS
+VgaQueryNumberOfAvailableModes(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_NUM_MODES NumModes,
+    ULONG NumModesSize,
+    PULONG OutputSize
+    );
+
+VP_STATUS
+VgaQueryCurrentMode(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_MODE_INFORMATION ModeInformation,
+    ULONG ModeInformationSize,
+    PULONG OutputSize
+    );
+
+VP_STATUS
+VgaSetMode(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_MODE Mode,
+    ULONG ModeSize,
+// eVb: 1.1 [SET MODE] - Add new output parameter for framebuffer update functionality
+    PULONG PhysPtrChange
+// eVb: 1.1 [END]
+    );
+
+BOOLEAN
+VgaIsPresent(
+    PHW_DEVICE_EXTENSION HwDeviceExtension
+    );
+
+VOID
+VgaInterpretCmdStream(
+    PVOID HwDeviceExtension,
+    PUSHORT pusCmdStream
+    );
+
+VP_STATUS
+VgaSetPaletteReg(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_PALETTE_DATA PaletteBuffer,
+    ULONG PaletteBufferSize
+    );
+    
+VP_STATUS
+VgaSetColorLookup(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_CLUT ClutBuffer,
+    ULONG ClutBufferSize
+    );
+
+VP_STATUS
+GetDeviceDataCallback(
+   PVOID HwDeviceExtension,
+   PVOID Context,
+   VIDEO_DEVICE_DATA_TYPE DeviceDataType,
+   PVOID Identifier,
+   ULONG IdentifierLength,
+   PVOID ConfigurationData,
+   ULONG ConfigurationDataLength,
+   PVOID ComponentInformation,
+   ULONG ComponentInformationLength
+   );
+
+// eVb: 1.2 [RESOURCE] - Add new function for acquiring VGA resources (I/O, memory)
+VP_STATUS
+VgaAcquireResources(
+    PHW_DEVICE_EXTENSION DeviceExtension
+    );
+// eVb: 1.2 [END]
+
+#if defined(ALLOC_PRAGMA)
+#pragma alloc_text(PAGE,DriverEntry)
+#pragma alloc_text(PAGE,VgaFindAdapter)
+#pragma alloc_text(PAGE,VgaInitialize)
+#pragma alloc_text(PAGE,VgaStartIO)
+#pragma alloc_text(PAGE,VgaIsPresent)
+#pragma alloc_text(PAGE,VgaSetColorLookup)
+#endif
+
+\f
+//---------------------------------------------------------------------------
+ULONG
+// eVb: 1.3 [GCC] - Add NTAPI for GCC support
+NTAPI
+// eVb: 1.3 [END]
+DriverEntry(
+    PVOID Context1,
+    PVOID Context2
+    )
+
+/*++
+
+Routine Description:
+
+    Installable driver initialization entry point.
+    This entry point is called directly by the I/O system.
+
+Arguments:
+
+    Context1 - First context value passed by the operating system. This is
+        the value with which the miniport driver calls VideoPortInitialize().
+
+    Context2 - Second context value passed by the operating system. This is
+        the value with which the miniport driver calls 3VideoPortInitialize().
+
+Return Value:
+
+    Status from VideoPortInitialize()
+
+--*/
+
+{
+
+    VIDEO_HW_INITIALIZATION_DATA hwInitData;
+    ULONG status;
+    ULONG initializationStatus = (ULONG) -1;
+
+    //
+    // Zero out structure.
+    //
+
+    VideoPortZeroMemory(&hwInitData, sizeof(VIDEO_HW_INITIALIZATION_DATA));
+
+    //
+    // Specify sizes of structure and extension.
+    //
+
+    hwInitData.HwInitDataSize = sizeof(VIDEO_HW_INITIALIZATION_DATA);
+
+    //
+    // Set entry points.
+    //
+
+    hwInitData.HwFindAdapter = VgaFindAdapter;
+    hwInitData.HwInitialize = VgaInitialize;
+    hwInitData.HwInterrupt = NULL;
+    hwInitData.HwStartIO = VgaStartIO;
+
+    //
+    // Determine the size we require for the device extension.
+    //
+
+    hwInitData.HwDeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION);
+
+    //
+    // Always start with parameters for device0 in this case.
+    // We can leave it like this since we know we will only ever find one
+    // VGA type adapter in a machine.
+    //
+
+    // hwInitData.StartingDeviceNumber = 0;
+
+    //
+    // Once all the relevant information has been stored, call the video
+    // port driver to do the initialization.
+    // For this device we will repeat this call three times, for ISA, EISA
+    // and PCI.
+    // We will return the minimum of all return values.
+    //
+
+    //
+    // We will try the PCI bus first so that our ISA detection does'nt claim
+    // PCI cards (since it is impossible to differentiate between the two
+    // by looking at the registers).
+    //
+
+    //
+    // NOTE: since this driver only supports one adapter, we will return
+    // as soon as we find a device, without going on to the following buses.
+    // Normally one would call for each bus type and return the smallest
+    // value.
+    //
+
+#if !defined(_ALPHA_)
+
+    //
+    // Before we can enable this on ALPHA we need to find a way to map a
+    // sparse view of a 4MB region successfully.
+    //
+
+    hwInitData.AdapterInterfaceType = PCIBus;
+
+    initializationStatus = VideoPortInitialize(Context1,
+                                               Context2,
+                                               &hwInitData,
+                                               NULL);
+
+    if (initializationStatus == NO_ERROR)
+    {
+        return initializationStatus;
+    }
+
+#endif
+
+    hwInitData.AdapterInterfaceType = MicroChannel;
+
+    initializationStatus = VideoPortInitialize(Context1,
+                                               Context2,
+                                               &hwInitData,
+                                               NULL);
+
+    //
+    // Return immediately instead of checkin for smallest return code.
+    //
+
+    if (initializationStatus == NO_ERROR)
+    {
+        return initializationStatus;
+    }
+
+
+    hwInitData.AdapterInterfaceType = Internal;
+
+    initializationStatus = VideoPortInitialize(Context1,
+                                               Context2,
+                                               &hwInitData,
+                                               NULL);
+
+    if (initializationStatus == NO_ERROR)
+    {
+        return initializationStatus;
+    }
+
+
+    hwInitData.AdapterInterfaceType = Isa;
+
+    initializationStatus = VideoPortInitialize(Context1,
+                                               Context2,
+                                               &hwInitData,
+                                               NULL);
+
+    if (initializationStatus == NO_ERROR)
+    {
+        return initializationStatus;
+    }
+
+
+
+    hwInitData.AdapterInterfaceType = Eisa;
+
+    status = VideoPortInitialize(Context1,
+                                 Context2,
+                                 &hwInitData,
+                                 NULL);
+
+    if (initializationStatus > status) {
+        initializationStatus = status;
+    }
+
+    return initializationStatus;
+
+} // end DriverEntry()
+\f
+//---------------------------------------------------------------------------
+VP_STATUS
+VgaFindAdapter(
+    PVOID HwDeviceExtension,
+    PVOID HwContext,
+    PWSTR ArgumentString,
+    PVIDEO_PORT_CONFIG_INFO ConfigInfo,
+    PUCHAR Again
+    )
+
+/*++
+
+Routine Description:
+
+    This routine is called to determine if the adapter for this driver
+    is present in the system.
+    If it is present, the function fills out some information describing
+    the adapter.
+
+Arguments:
+
+    HwDeviceExtension - Supplies the miniport driver's adapter storage. This
+        storage is initialized to zero before this call.
+
+    HwContext - Supplies the context value which was passed to
+        VideoPortInitialize().
+
+    ArgumentString - Supplies a NULL terminated ASCII string. This string
+        originates from the user.
+
+    ConfigInfo - Returns the configuration information structure which is
+        filled by the miniport driver. This structure is initialized with
+        any known configuration information (such as SystemIoBusNumber) by
+        the port driver. Where possible, drivers should have one set of
+        defaults which do not require any supplied configuration information.
+
+    Again - Indicates if the miniport driver wants the port driver to call
+        its VIDEO_HW_FIND_ADAPTER function again with a new device extension
+        and the same config info. This is used by the miniport drivers which
+        can search for several adapters on a bus.
+
+Return Value:
+
+    This routine must return:
+
+    NO_ERROR - Indicates a host adapter was found and the
+        configuration information was successfully determined.
+
+    ERROR_INVALID_PARAMETER - Indicates an adapter was found but there was an
+        error obtaining the configuration information. If possible an error
+        should be logged.
+
+    ERROR_DEV_NOT_EXIST - Indicates no host adapter was found for the
+        supplied configuration information.
+
+--*/
+
+{
+
+    PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension;
+
+    //
+    // Make sure the size of the structure is at least as large as what we
+    // are expecting (check version of the config info structure).
+    //
+
+    if (ConfigInfo->Length < sizeof(VIDEO_PORT_CONFIG_INFO)) {
+
+        return ERROR_INVALID_PARAMETER;
+
+    }
+// eVb: 1.4 [CIRRUS] - Remove CIRRUS-specific support
+    //
+    // Check internal VGA (MIPS and ARM systems)
+    //
+
+    if ((ConfigInfo->AdapterInterfaceType == Internal) &&
+        (VideoPortGetDeviceData(HwDeviceExtension,
+                                VpControllerData,
+                                &GetDeviceDataCallback,
+                                VgaAccessRange) != NO_ERROR))
+    {
+        return ERROR_INVALID_PARAMETER;
+    }
+// eVb: 1.4 [END]
+    //
+    // No interrupt information is necessary.
+    //
+
+    //
+    // Check to see if there is a hardware resource conflict.
+    //
+// eVb: 1.5 [RESOURCE] - Use new function for acquiring VGA resources (I/O, memory)
+    if (VgaAcquireResources(hwDeviceExtension) != NO_ERROR) return ERROR_INVALID_PARAMETER;
+// eVb: 1.5 [END]
+    //
+    // Get logical IO port addresses.
+    //
+
+    if ((hwDeviceExtension->IOAddress =
+         VideoPortGetDeviceBase(hwDeviceExtension,
+         VgaAccessRange->RangeStart,
+         VGA_MAX_IO_PORT - VGA_BASE_IO_PORT + 1,
+         VgaAccessRange->RangeInIoSpace)) == NULL)
+    {
+        VideoDebugPrint((0, "VgaFindAdapter - Fail to get io address\n"));
+
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    //
+    // Determine whether a VGA is present.
+    //
+
+    if (!VgaIsPresent(hwDeviceExtension)) {
+
+        VideoDebugPrint((0, "VgaFindAdapter - VGA Failed\n"));
+        return ERROR_DEV_NOT_EXIST;
+    }
+
+    //
+    // Minimum size of the buffer required to store the hardware state
+    // information returned by IOCTL_VIDEO_SAVE_HARDWARE_STATE.
+    //
+
+    ConfigInfo->HardwareStateSize = VGA_TOTAL_STATE_SIZE;
+
+    //
+    // Pass a pointer to the emulator range we are using.
+    //
+// eVb: 1.6 [VDM] - Disable VDM for now
+    ConfigInfo->NumEmulatorAccessEntries = 0;
+    ConfigInfo->EmulatorAccessEntries = NULL;
+    ConfigInfo->EmulatorAccessEntriesContext = 0;
+// eVb: 1.6 [END]
+    //
+    // BUGBUG
+    //
+    // There is really no reason to have the frame buffer mapped. On an
+    // x86 we use if for save/restore (supposedly) but even then we
+    // would only need to map a 64K window, not all 16 Meg!
+    //
+
+#ifdef _X86_
+
+    //
+    // Map the video memory into the system virtual address space so we can
+    // clear it out and use it for save and restore.
+    //
+
+    if ( (hwDeviceExtension->VideoMemoryAddress =
+              VideoPortGetDeviceBase(hwDeviceExtension,
+                                     VgaAccessRange[2].RangeStart,
+                                     VgaAccessRange[2].RangeLength,
+                                     FALSE)) == NULL)
+    {
+        VideoDebugPrint((0, "VgaFindAdapter - Fail to get memory address\n"));
+
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    VideoPortDebugPrint(0, "vga mapped at %x\n", hwDeviceExtension->VideoMemoryAddress);
+#endif
+// eVb: 1.7 [VDM] - Disable VDM for now
+    ConfigInfo->VdmPhysicalVideoMemoryAddress.QuadPart = 0;
+    ConfigInfo->VdmPhysicalVideoMemoryLength = 0;
+// eVb: 1.7 [END]
+    //
+    // Indicate we do not wish to be called again for another initialization.
+    //
+
+    *Again = 0;
+
+    //
+    // Indicate a successful completion status.
+    //
+
+    return NO_ERROR;
+
+
+} // VgaFindAdapter()
+\f
+//---------------------------------------------------------------------------
+BOOLEAN
+VgaInitialize(
+    PVOID HwDeviceExtension
+    )
+
+/*++
+
+Routine Description:
+
+    This routine does one time initialization of the device.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's adapter information.
+
+Return Value:
+
+    None.
+
+--*/
+
+{
+    PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension;
+
+    //
+    // set up the default cursor position and type.
+    //
+
+    hwDeviceExtension->CursorPosition.Column = 0;
+    hwDeviceExtension->CursorPosition.Row = 0;
+    hwDeviceExtension->CursorTopScanLine = 0;
+    hwDeviceExtension->CursorBottomScanLine = 31;
+    hwDeviceExtension->CursorEnable = TRUE;
+
+// eVb: 1.8 [VBE] - Initialize VBE modes
+    InitializeModeTable(hwDeviceExtension);
+// eVb: 1.8 [END]
+    return TRUE;
+
+} // VgaInitialize()
+\f
+//---------------------------------------------------------------------------
+BOOLEAN
+VgaStartIO(
+    PVOID HwDeviceExtension,
+    PVIDEO_REQUEST_PACKET RequestPacket
+    )
+
+/*++
+
+Routine Description:
+
+    This routine is the main execution routine for the miniport driver. It
+    accepts a Video Request Packet, performs the request, and then returns
+    with the appropriate status.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's adapter information.
+
+    RequestPacket - Pointer to the video request packet. This structure
+        contains all the parameters passed to the VideoIoControl function.
+
+Return Value:
+
+    This routine will return error codes from the various support routines
+    and will also return ERROR_INSUFFICIENT_BUFFER for incorrectly sized
+    buffers and ERROR_INVALID_FUNCTION for unsupported functions.
+
+--*/
+
+{
+    PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension;
+    VP_STATUS status;
+    VIDEO_MODE videoMode;
+    PVIDEO_MEMORY_INFORMATION memoryInformation;
+    ULONG inIoSpace;
+    ULONG Result;
+
+    //
+    // Switch on the IoContolCode in the RequestPacket. It indicates which
+    // function must be performed by the driver.
+    //
+// eVb: 1.9 [IOCTL] - Remove IOCTLs not needed yet
+    switch (RequestPacket->IoControlCode)
+    {
+    case IOCTL_VIDEO_SHARE_VIDEO_MEMORY:
+
+        VideoDebugPrint((2, "VgaStartIO - ShareVideoMemory\n"));
+
+         status = ERROR_INVALID_FUNCTION;
+
+         break;
+
+    case IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY:
+
+        VideoDebugPrint((2, "VgaStartIO - UnshareVideoMemory\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+
+    case IOCTL_VIDEO_MAP_VIDEO_MEMORY:
+
+        VideoDebugPrint((2, "VgaStartIO - MapVideoMemory\n"));
+
+        if ( (RequestPacket->OutputBufferLength <
+              (RequestPacket->StatusBlock->Information =
+                                     sizeof(VIDEO_MEMORY_INFORMATION))) ||
+             (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY)) )
+        {
+            status = ERROR_INSUFFICIENT_BUFFER;
+        }
+
+        memoryInformation = RequestPacket->OutputBuffer;
+
+        memoryInformation->VideoRamBase = ((PVIDEO_MEMORY)
+                (RequestPacket->InputBuffer))->RequestedVirtualAddress;
+
+        //
+        // We reserved 16 meg for the frame buffer, however, it makes
+        // no sense to map more memory than there is on the card.  So
+        // only map the amount of memory we have on the card.
+        //
+// eVb: 1.10 [CIRRUS] - On VGA, we have VRAM size since boot, use it
+        memoryInformation->VideoRamLength =
+                hwDeviceExtension->PhysicalVideoMemoryLength;
+// eVb: 1.10 [END]
+        //
+        // If you change to using a dense space frame buffer, make this
+        // value a 4 for the ALPHA.
+        //
+
+        inIoSpace = 0;
+
+        status = VideoPortMapMemory(hwDeviceExtension,
+                                    hwDeviceExtension->PhysicalVideoMemoryBase,
+// eVb: 1.11 [CIRRUS] - On VGA, we have VRAM size since boot, use it
+                                    &memoryInformation->VideoRamLength,
+// eVb: 1.11 [END]
+                                    &inIoSpace,
+                                    &(memoryInformation->VideoRamBase));
+
+        if (status != NO_ERROR) {
+            VideoDebugPrint((0, "VgaStartIO - IOCTL_VIDEO_MAP_VIDEO_MEMORY failed VideoPortMapMemory (%x)\n", status));
+        }
+
+        memoryInformation->FrameBufferBase =
+            ((PUCHAR) (memoryInformation->VideoRamBase)) +
+            hwDeviceExtension->PhysicalFrameOffset.LowPart;
+
+        memoryInformation->FrameBufferLength =
+            hwDeviceExtension->PhysicalFrameLength ?
+            hwDeviceExtension->PhysicalFrameLength :
+            memoryInformation->VideoRamLength;
+
+
+        VideoDebugPrint((2, "physical VideoMemoryBase %08lx\n", hwDeviceExtension->PhysicalVideoMemoryBase));
+        VideoDebugPrint((2, "physical VideoMemoryLength %08lx\n", hwDeviceExtension->PhysicalVideoMemoryLength));
+        VideoDebugPrint((2, "VideoMemoryBase %08lx\n", memoryInformation->VideoRamBase));
+        VideoDebugPrint((2, "VideoMemoryLength %08lx\n", memoryInformation->VideoRamLength));
+
+        VideoDebugPrint((2, "physical framebuf offset %08lx\n", hwDeviceExtension->PhysicalFrameOffset.LowPart));
+        VideoDebugPrint((2, "framebuf base %08lx\n", memoryInformation->FrameBufferBase));
+        VideoDebugPrint((2, "physical framebuf len %08lx\n", hwDeviceExtension->PhysicalFrameLength));
+        VideoDebugPrint((2, "framebuf length %08lx\n", memoryInformation->FrameBufferLength));
+
+        break;
+
+    case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY:
+
+        VideoDebugPrint((2, "VgaStartIO - UnMapVideoMemory\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+
+    case IOCTL_VIDEO_QUERY_AVAIL_MODES:
+
+        VideoDebugPrint((2, "VgaStartIO - QueryAvailableModes\n"));
+
+        status = VgaQueryAvailableModes(HwDeviceExtension,
+                                        (PVIDEO_MODE_INFORMATION)
+                                            RequestPacket->OutputBuffer,
+                                        RequestPacket->OutputBufferLength,
+                                        &RequestPacket->StatusBlock->Information);
+
+        break;
+
+
+    case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES:
+
+        VideoDebugPrint((2, "VgaStartIO - QueryNumAvailableModes\n"));
+
+        status = VgaQueryNumberOfAvailableModes(HwDeviceExtension,
+                                                (PVIDEO_NUM_MODES)
+                                                    RequestPacket->OutputBuffer,
+                                                RequestPacket->OutputBufferLength,
+                                                &RequestPacket->StatusBlock->Information);
+
+        break;
+
+
+    case IOCTL_VIDEO_QUERY_CURRENT_MODE:
+
+        VideoDebugPrint((2, "VgaStartIO - QueryCurrentMode\n"));
+
+        status = VgaQueryCurrentMode(HwDeviceExtension,
+                                     (PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer,
+                                     RequestPacket->OutputBufferLength,
+                                     &RequestPacket->StatusBlock->Information);
+
+        break;
+
+
+    case IOCTL_VIDEO_SET_CURRENT_MODE:
+
+        VideoDebugPrint((2, "VgaStartIO - SetCurrentModes\n"));
+
+        status = VgaSetMode(HwDeviceExtension,
+                              (PVIDEO_MODE) RequestPacket->InputBuffer,
+                              RequestPacket->InputBufferLength,
+// eVb: 1.12 [SET MODE] - Use new output parameter for framebuffer update functionality
+                              &Result);
+// eVb: 1.12 [END]
+
+        break;
+
+
+    case IOCTL_VIDEO_RESET_DEVICE:
+
+        VideoDebugPrint((2, "VgaStartIO - Reset Device\n"));
+
+        videoMode.RequestedMode = 0;
+
+        VgaSetMode(HwDeviceExtension,
+                        (PVIDEO_MODE) &videoMode,
+                        sizeof(videoMode),
+// eVb: 1.13 [SET MODE] - Use new output parameter for framebuffer update functionality
+                        &Result);
+// eVb: 1.13 [END]
+
+        //
+        // Always return succcess since settings the text mode will fail on
+        // non-x86.
+        //
+        // Also, failiure to set the text mode is not fatal in any way, since
+        // this operation must be followed by another set mode operation.
+        //
+
+        status = NO_ERROR;
+
+        break;
+
+
+    case IOCTL_VIDEO_LOAD_AND_SET_FONT:
+
+        VideoDebugPrint((2, "VgaStartIO - LoadAndSetFont\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+
+    case IOCTL_VIDEO_QUERY_CURSOR_POSITION:
+
+        VideoDebugPrint((2, "VgaStartIO - QueryCursorPosition\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+
+    case IOCTL_VIDEO_SET_CURSOR_POSITION:
+
+        VideoDebugPrint((2, "VgaStartIO - SetCursorPosition\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+
+    case IOCTL_VIDEO_QUERY_CURSOR_ATTR:
+
+        VideoDebugPrint((2, "VgaStartIO - QueryCursorAttributes\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+
+    case IOCTL_VIDEO_SET_CURSOR_ATTR:
+
+        VideoDebugPrint((2, "VgaStartIO - SetCursorAttributes\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+
+    case IOCTL_VIDEO_SET_PALETTE_REGISTERS:
+
+        VideoDebugPrint((2, "VgaStartIO - SetPaletteRegs\n"));
+
+        status = VgaSetPaletteReg(HwDeviceExtension,
+                                  (PVIDEO_PALETTE_DATA) RequestPacket->InputBuffer,
+                                  RequestPacket->InputBufferLength);
+
+        break;
+
+
+    case IOCTL_VIDEO_SET_COLOR_REGISTERS:
+
+        VideoDebugPrint((2, "VgaStartIO - SetColorRegs\n"));
+
+        status = VgaSetColorLookup(HwDeviceExtension,
+                                   (PVIDEO_CLUT) RequestPacket->InputBuffer,
+                                   RequestPacket->InputBufferLength);
+
+        break;
+
+
+    case IOCTL_VIDEO_ENABLE_VDM:
+
+        VideoDebugPrint((2, "VgaStartIO - EnableVDM\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+
+    case IOCTL_VIDEO_RESTORE_HARDWARE_STATE:
+
+        VideoDebugPrint((2, "VgaStartIO - RestoreHardwareState\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+
+    case IOCTL_VIDEO_SAVE_HARDWARE_STATE:
+
+        VideoDebugPrint((2, "VgaStartIO - SaveHardwareState\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+    case IOCTL_VIDEO_GET_BANK_SELECT_CODE:
+
+        VideoDebugPrint((2, "VgaStartIO - GetBankSelectCode\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+        break;
+
+    case IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES:
+        {
+            VideoDebugPrint((2, "VgaStartIO - Query Public Address Ranges\n"));
+        
+            PVIDEO_PUBLIC_ACCESS_RANGES portAccess;
+            ULONG physicalPortLength;
+
+            if (RequestPacket->OutputBufferLength <
+                sizeof(VIDEO_PUBLIC_ACCESS_RANGES))
+            {
+                status = ERROR_INSUFFICIENT_BUFFER;
+                break;
+            }
+
+            RequestPacket->StatusBlock->Information =
+                sizeof(VIDEO_PUBLIC_ACCESS_RANGES);
+
+            portAccess = RequestPacket->OutputBuffer;
+
+            //
+            // The first public access range is the IO ports.
+            //
+
+            portAccess->VirtualAddress  = (PVOID) NULL;
+            portAccess->InIoSpace       = TRUE;
+            portAccess->MappedInIoSpace = portAccess->InIoSpace;
+            physicalPortLength = VGA_MAX_IO_PORT - VGA_BASE_IO_PORT + 1;
+
+            status =  VideoPortMapMemory(hwDeviceExtension,
+                                         VgaAccessRange->RangeStart,
+                                         &physicalPortLength,
+                                         &(portAccess->MappedInIoSpace),
+                                         &(portAccess->VirtualAddress));
+// eVb: 1.17 [GCG] - Fix lvalue error
+            portAccess->VirtualAddress = (PVOID)((ULONG_PTR)portAccess->VirtualAddress - VGA_BASE_IO_PORT);
+// eVb: 1.17 [END]
+            VideoDebugPrint((2, "VgaStartIO - mapping ports to (%x)\n", portAccess->VirtualAddress));
+        }
+        
+        break;
+
+    case IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES:
+
+        VideoDebugPrint((2, "VgaStartIO - Free Public Access Ranges\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+        break;
+        
+    //
+    // if we get here, an invalid IoControlCode was specified.
+    //
+
+    default:
+
+        VideoDebugPrint((0, "Fell through vga startIO routine - invalid command\n"));
+
+        status = ERROR_INVALID_FUNCTION;
+
+        break;
+
+    }
+// eVb: 1.9 [END]
+    RequestPacket->StatusBlock->Status = status;
+
+    return TRUE;
+
+} // VgaStartIO()
+
+\f
+//---------------------------------------------------------------------------
+//
+// private routines
+//
+
+\f
+//---------------------------------------------------------------------------
+BOOLEAN
+VgaIsPresent(
+    PHW_DEVICE_EXTENSION HwDeviceExtension
+    )
+
+/*++
+
+Routine Description:
+
+    This routine returns TRUE if a VGA is present. Determining whether a VGA
+    is present is a two-step process. First, this routine walks bits through
+    the Bit Mask register, to establish that there are readable indexed
+    registers (EGAs normally don't have readable registers, and other adapters
+    are unlikely to have indexed registers). This test is done first because
+    it's a non-destructive EGA rejection test (correctly rejects EGAs, but
+    doesn't potentially mess up the screen or the accessibility of display
+    memory). Normally, this would be an adequate test, but some EGAs have
+    readable registers, so next, we check for the existence of the Chain4 bit
+    in the Memory Mode register; this bit doesn't exist in EGAs. It's
+    conceivable that there are EGAs with readable registers and a register bit
+    where Chain4 is stored, although I don't know of any; if a better test yet
+    is needed, memory could be written to in Chain4 mode, and then examined
+    plane by plane in non-Chain4 mode to make sure the Chain4 bit did what it's
+    supposed to do. However, the current test should be adequate to eliminate
+    just about all EGAs, and 100% of everything else.
+
+    If this function fails to find a VGA, it attempts to undo any damage it
+    may have inadvertently done while testing. The underlying assumption for
+    the damage control is that if there's any non-VGA adapter at the tested
+    ports, it's an EGA or an enhanced EGA, because: a) I don't know of any
+    other adapters that use 3C4/5 or 3CE/F, and b), if there are other
+    adapters, I certainly don't know how to restore their original states. So
+    all error recovery is oriented toward putting an EGA back in a writable
+    state, so that error messages are visible. The EGA's state on entry is
+    assumed to be text mode, so the Memory Mode register is restored to the
+    default state for text mode.
+
+    If a VGA is found, the VGA is returned to its original state after
+    testing is finished.
+
+Arguments:
+
+    None.
+
+Return Value:
+
+    TRUE if a VGA is present, FALSE if not.
+
+--*/
+
+{
+    UCHAR originalGCAddr;
+    UCHAR originalSCAddr;
+    UCHAR originalBitMask;
+    UCHAR originalReadMap;
+    UCHAR originalMemoryMode;
+    UCHAR testMask;
+    BOOLEAN returnStatus;
+
+    //
+    // Remember the original state of the Graphics Controller Address register.
+    //
+
+    originalGCAddr = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_ADDRESS_PORT);
+
+    //
+    // Write the Read Map register with a known state so we can verify
+    // that it isn't changed after we fool with the Bit Mask. This ensures
+    // that we're dealing with indexed registers, since both the Read Map and
+    // the Bit Mask are addressed at GRAPH_DATA_PORT.
+    //
+
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_ADDRESS_PORT, IND_READ_MAP);
+
+    //
+    // If we can't read back the Graphics Address register setting we just
+    // performed, it's not readable and this isn't a VGA.
+    //
+
+    if ((VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+        GRAPH_ADDRESS_PORT) & GRAPH_ADDR_MASK) != IND_READ_MAP) {
+
+        return FALSE;
+    }
+
+    //
+    // Set the Read Map register to a known state.
+    //
+
+    originalReadMap = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_DATA_PORT);
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_DATA_PORT, READ_MAP_TEST_SETTING);
+
+    if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_DATA_PORT) != READ_MAP_TEST_SETTING) {
+
+        //
+        // The Read Map setting we just performed can't be read back; not a
+        // VGA. Restore the default Read Map state.
+        //
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                GRAPH_DATA_PORT, READ_MAP_DEFAULT);
+
+        return FALSE;
+    }
+
+    //
+    // Remember the original setting of the Bit Mask register.
+    //
+
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_ADDRESS_PORT, IND_BIT_MASK);
+    if ((VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+                GRAPH_ADDRESS_PORT) & GRAPH_ADDR_MASK) != IND_BIT_MASK) {
+
+        //
+        // The Graphics Address register setting we just made can't be read
+        // back; not a VGA. Restore the default Read Map state.
+        //
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                GRAPH_ADDRESS_PORT, IND_READ_MAP);
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                GRAPH_DATA_PORT, READ_MAP_DEFAULT);
+
+        return FALSE;
+    }
+
+    originalBitMask = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_DATA_PORT);
+
+    //
+    // Set up the initial test mask we'll write to and read from the Bit Mask.
+    //
+
+    testMask = 0xBB;
+
+    do {
+
+        //
+        // Write the test mask to the Bit Mask.
+        //
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                GRAPH_DATA_PORT, testMask);
+
+        //
+        // Make sure the Bit Mask remembered the value.
+        //
+
+        if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+                    GRAPH_DATA_PORT) != testMask) {
+
+            //
+            // The Bit Mask is not properly writable and readable; not a VGA.
+            // Restore the Bit Mask and Read Map to their default states.
+            //
+
+            VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                    GRAPH_DATA_PORT, BIT_MASK_DEFAULT);
+            VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                    GRAPH_ADDRESS_PORT, IND_READ_MAP);
+            VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                    GRAPH_DATA_PORT, READ_MAP_DEFAULT);
+
+            return FALSE;
+        }
+
+        //
+        // Cycle the mask for next time.
+        //
+
+        testMask >>= 1;
+
+    } while (testMask != 0);
+
+    //
+    // There's something readable at GRAPH_DATA_PORT; now switch back and
+    // make sure that the Read Map register hasn't changed, to verify that
+    // we're dealing with indexed registers.
+    //
+
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_ADDRESS_PORT, IND_READ_MAP);
+    if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+                GRAPH_DATA_PORT) != READ_MAP_TEST_SETTING) {
+
+        //
+        // The Read Map is not properly writable and readable; not a VGA.
+        // Restore the Bit Mask and Read Map to their default states, in case
+        // this is an EGA, so subsequent writes to the screen aren't garbled.
+        //
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                GRAPH_DATA_PORT, READ_MAP_DEFAULT);
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                GRAPH_ADDRESS_PORT, IND_BIT_MASK);
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                GRAPH_DATA_PORT, BIT_MASK_DEFAULT);
+
+        return FALSE;
+    }
+
+    //
+    // We've pretty surely verified the existence of the Bit Mask register.
+    // Put the Graphics Controller back to the original state.
+    //
+
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_DATA_PORT, originalReadMap);
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_ADDRESS_PORT, IND_BIT_MASK);
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_DATA_PORT, originalBitMask);
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            GRAPH_ADDRESS_PORT, originalGCAddr);
+
+    //
+    // Now, check for the existence of the Chain4 bit.
+    //
+
+    //
+    // Remember the original states of the Sequencer Address and Memory Mode
+    // registers.
+    //
+
+    originalSCAddr = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+            SEQ_ADDRESS_PORT);
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            SEQ_ADDRESS_PORT, IND_MEMORY_MODE);
+    if ((VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+            SEQ_ADDRESS_PORT) & SEQ_ADDR_MASK) != IND_MEMORY_MODE) {
+
+        //
+        // Couldn't read back the Sequencer Address register setting we just
+        // performed.
+        //
+
+        return FALSE;
+    }
+    originalMemoryMode = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+            SEQ_DATA_PORT);
+
+    //
+    // Toggle the Chain4 bit and read back the result. This must be done during
+    // sync reset, since we're changing the chaining state.
+    //
+
+    //
+    // Begin sync reset.
+    //
+
+    VideoPortWritePortUshort((PUSHORT)(HwDeviceExtension->IOAddress +
+             SEQ_ADDRESS_PORT),
+             (IND_SYNC_RESET + (START_SYNC_RESET_VALUE << 8)));
+
+    //
+    // Toggle the Chain4 bit.
+    //
+
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            SEQ_ADDRESS_PORT, IND_MEMORY_MODE);
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+            SEQ_DATA_PORT, (UCHAR)(originalMemoryMode ^ CHAIN4_MASK));
+
+    if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+                SEQ_DATA_PORT) != (UCHAR) (originalMemoryMode ^ CHAIN4_MASK)) {
+
+        //
+        // Chain4 bit not there; not a VGA.
+        // Set text mode default for Memory Mode register.
+        //
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                SEQ_DATA_PORT, MEMORY_MODE_TEXT_DEFAULT);
+        //
+        // End sync reset.
+        //
+
+        VideoPortWritePortUshort((PUSHORT) (HwDeviceExtension->IOAddress +
+                SEQ_ADDRESS_PORT),
+                (IND_SYNC_RESET + (END_SYNC_RESET_VALUE << 8)));
+
+        returnStatus = FALSE;
+
+    } else {
+
+        //
+        // It's a VGA.
+        //
+
+        //
+        // Restore the original Memory Mode setting.
+        //
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                SEQ_DATA_PORT, originalMemoryMode);
+
+        //
+        // End sync reset.
+        //
+
+        VideoPortWritePortUshort((PUSHORT)(HwDeviceExtension->IOAddress +
+                SEQ_ADDRESS_PORT),
+                (USHORT)(IND_SYNC_RESET + (END_SYNC_RESET_VALUE << 8)));
+
+        //
+        // Restore the original Sequencer Address setting.
+        //
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                SEQ_ADDRESS_PORT, originalSCAddr);
+
+        returnStatus = TRUE;
+    }
+
+    return returnStatus;
+
+} // VgaIsPresent()
+\f
+
+//---------------------------------------------------------------------------
+VP_STATUS
+VgaSetPaletteReg(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_PALETTE_DATA PaletteBuffer,
+    ULONG PaletteBufferSize
+    )
+
+/*++
+
+Routine Description:
+
+    This routine sets a specified portion of the EGA (not DAC) palette
+    registers.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's device extension.
+
+    PaletteBuffer - Pointer to the structure containing the palette data.
+
+    PaletteBufferSize - Length of the input buffer supplied by the user.
+
+Return Value:
+
+    NO_ERROR - information returned successfully
+
+    ERROR_INSUFFICIENT_BUFFER - input buffer not large enough for input data.
+
+    ERROR_INVALID_PARAMETER - invalid palette size.
+
+--*/
+
+{
+    USHORT i;
+
+    //
+    // Check if the size of the data in the input buffer is large enough.
+    //
+
+    if ((PaletteBufferSize) < (sizeof(VIDEO_PALETTE_DATA)) ||
+        (PaletteBufferSize < (sizeof(VIDEO_PALETTE_DATA) +
+                (sizeof(USHORT) * (PaletteBuffer->NumEntries -1)) ))) {
+
+        return ERROR_INSUFFICIENT_BUFFER;
+
+    }
+
+    //
+    // Check to see if the parameters are valid.
+    //
+
+    if ( (PaletteBuffer->FirstEntry > VIDEO_MAX_COLOR_REGISTER ) ||
+         (PaletteBuffer->NumEntries == 0) ||
+         (PaletteBuffer->FirstEntry + PaletteBuffer->NumEntries >
+             VIDEO_MAX_PALETTE_REGISTER + 1 ) ) {
+
+        return ERROR_INVALID_PARAMETER;
+
+    }
+
+    //
+    // Reset ATC to index mode
+    //
+
+    VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
+                           ATT_INITIALIZE_PORT_COLOR);
+
+    //
+    // Blast out our palette values.
+    //
+
+    for (i = 0; i < PaletteBuffer->NumEntries; i++) {
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress + ATT_ADDRESS_PORT,
+                                (UCHAR)(i+PaletteBuffer->FirstEntry));
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                                    ATT_DATA_WRITE_PORT,
+                                (UCHAR)PaletteBuffer->Colors[i]);
+    }
+
+    VideoPortWritePortUchar(HwDeviceExtension->IOAddress + ATT_ADDRESS_PORT,
+                            VIDEO_ENABLE);
+
+    return NO_ERROR;
+
+} // end VgaSetPaletteReg()
+
+\f
+//---------------------------------------------------------------------------
+VP_STATUS
+VgaSetColorLookup(
+    PHW_DEVICE_EXTENSION HwDeviceExtension,
+    PVIDEO_CLUT ClutBuffer,
+    ULONG ClutBufferSize
+    )
+
+/*++
+
+Routine Description:
+
+    This routine sets a specified portion of the DAC color lookup table
+    settings.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport driver's device extension.
+
+    ClutBufferSize - Length of the input buffer supplied by the user.
+
+    ClutBuffer - Pointer to the structure containing the color lookup table.
+
+Return Value:
+
+    NO_ERROR - information returned successfully
+
+    ERROR_INSUFFICIENT_BUFFER - input buffer not large enough for input data.
+
+    ERROR_INVALID_PARAMETER - invalid clut size.
+
+--*/
+
+{
+    PVIDEOMODE CurrentMode = HwDeviceExtension->CurrentMode;
+    USHORT i;
+    
+    //
+    // Check if the size of the data in the input buffer is large enough.
+    //
+
+    if ( (ClutBufferSize < sizeof(VIDEO_CLUT) - sizeof(ULONG)) ||
+         (ClutBufferSize < sizeof(VIDEO_CLUT) +
+                     (sizeof(ULONG) * (ClutBuffer->NumEntries - 1)) ) ) {
+
+        return ERROR_INSUFFICIENT_BUFFER;
+
+    }
+
+    //
+    // Check to see if the parameters are valid.
+    //
+
+    if ( (ClutBuffer->NumEntries == 0) ||
+         (ClutBuffer->FirstEntry > VIDEO_MAX_COLOR_REGISTER) ||
+         (ClutBuffer->FirstEntry + ClutBuffer->NumEntries >
+             VIDEO_MAX_COLOR_REGISTER + 1) ) {
+
+        return ERROR_INVALID_PARAMETER;
+
+    }
+// eVb: 1.14 [VBE] - Add VBE color support
+    //
+    // Check SVGA mode
+    //
+    
+    if (CurrentMode->bitsPerPlane >= 8) return VbeSetColorLookup(HwDeviceExtension, ClutBuffer);
+// eVb: 1.14 [END]    
+    //
+    // Path for VGA mode
+    //
+// eVb: 1.15 [VBE] - Add VBE support for non-VGA-compatible detected modes
+    if (!CurrentMode->NonVgaMode)
+    {
+// eVb: 1.15 [END]
+        //
+        //  Set CLUT registers directly on the hardware
+        //
+
+        VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                DAC_ADDRESS_WRITE_PORT, (UCHAR) ClutBuffer->FirstEntry);
+
+        for (i = 0; i < ClutBuffer->NumEntries; i++) {
+            VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                                    DAC_ADDRESS_WRITE_PORT,
+                                    (UCHAR)(i + ClutBuffer->FirstEntry));
+
+            VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                                    DAC_DATA_REG_PORT,
+                                    ClutBuffer->LookupTable[i].RgbArray.Red);
+
+            VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                                    DAC_DATA_REG_PORT,
+                                    ClutBuffer->LookupTable[i].RgbArray.Green);
+
+            VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
+                                    DAC_DATA_REG_PORT,
+                                    ClutBuffer->LookupTable[i].RgbArray.Blue);
+        }
+        return NO_ERROR;
+    }
+
+    return ERROR_INVALID_PARAMETER;
+
+} // end VgaSetColorLookup()
+\f
+VP_STATUS
+GetDeviceDataCallback(
+    PVOID HwDeviceExtension,
+    PVOID Context,
+    VIDEO_DEVICE_DATA_TYPE DeviceDataType,
+    PVOID Identifier,
+    ULONG IdentifierLength,
+    PVOID ConfigurationData,
+    ULONG ConfigurationDataLength,
+    PVOID ComponentInformation,
+    ULONG ComponentInformationLength
+    )
+
+/*++
+
+Routine Description:
+
+    Callback routine for the VideoPortGetDeviceData function.
+
+Arguments:
+
+    HwDeviceExtension - Pointer to the miniport drivers device extension.
+
+    Context - Context value passed to the VideoPortGetDeviceData function.
+
+    DeviceDataType - The type of data that was requested in
+        VideoPortGetDeviceData.
+
+    Identifier - Pointer to a string that contains the name of the device,
+        as setup by the ROM or ntdetect.
+
+    IdentifierLength - Length of the Identifier string.
+
+    ConfigurationData - Pointer to the configuration data for the device or
+        BUS.
+
+    ConfigurationDataLength - Length of the data in the configurationData
+        field.
+
+    ComponentInformation - Undefined.
+
+    ComponentInformationLength - Undefined.
+
+Return Value:
+
+    Returns NO_ERROR if the function completed properly.
+    Returns ERROR_DEV_NOT_EXIST if we did not find the device.
+    Returns ERROR_INVALID_PARAMETER otherwise.
+
+--*/
+
+{
+    VideoPortDebugPrint(Error, "Detected internal VGA chip on embedded board, todo\n");
+    while (TRUE);
+    return NO_ERROR;
+
+} //end GetDeviceDataCallback()
+
+// eVb: 1.16 [RESOURCE] - Add new function for acquiring VGA resources (I/O, memory)
+VP_STATUS
+VgaAcquireResources(
+    PHW_DEVICE_EXTENSION DeviceExtension
+    )
+{
+    VP_STATUS Status = NO_ERROR;
+    ULONG Ranges, i;
+    
+    //
+    // Try exclusive ranges (vga + ati)
+    //
+    
+    Ranges = NUM_VGA_ACCESS_RANGES;
+    for (i = 0; i < Ranges; i++) VgaAccessRange[i].RangeShareable = FALSE;
+    if (VideoPortVerifyAccessRanges(DeviceExtension, Ranges, VgaAccessRange) != NO_ERROR)
+    {
+        //
+        // Not worked, try vga only
+        //
+        
+        Ranges = 3;
+        if (VideoPortVerifyAccessRanges(DeviceExtension, Ranges, VgaAccessRange) != NO_ERROR)
+        {
+            //
+            // Still not, try shared ranges
+            //
+            
+            for (i = 0; i < Ranges; i++) VgaAccessRange[i].RangeShareable = TRUE;
+            Status = VideoPortVerifyAccessRanges(DeviceExtension, Ranges, VgaAccessRange);
+            if (Status == NO_ERROR)
+            {
+                //
+                // It did work
+                //
+                
+                VideoPortVerifyAccessRanges(DeviceExtension, 0, 0);
+                Status = NO_ERROR;
+            }
+        }
+    }
+
+    if (Status == NO_ERROR)
+    {
+        //
+        // Worked with exclusive, also try shared
+        //
+        
+        for (i = 0; i < Ranges; i++) VgaAccessRange[i].RangeShareable = TRUE;
+        Status = VideoPortVerifyAccessRanges(DeviceExtension, Ranges, VgaAccessRange);
+    }
+
+    return Status;
+}
+// eVb: 1.16 [END]
diff --git a/reactos/drivers/video/miniport/vga_new/vga.h b/reactos/drivers/video/miniport/vga_new/vga.h
new file mode 100644 (file)
index 0000000..21e4115
--- /dev/null
@@ -0,0 +1,446 @@
+/*
+ * PROJECT:         ReactOS VGA Miniport Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/miniport/vga/vga.h
+ * PURPOSE:         Main Header File
+ * PROGRAMMERS:     Copyright (c) 1992  Microsoft Corporation
+ *                  ReactOS Portable Systems Group
+ */
+
+#include "ntdef.h"
+#include "dderror.h"
+#include "devioctl.h"
+#include "miniport.h"
+#include "ntddvdeo.h"
+#include "video.h"
+#include "cmdcnst.h"
+
+//
+// Base address of VGA memory range.  Also used as base address of VGA
+// memory when loading a font, which is done with the VGA mapped at A0000.
+//
+
+#define MEM_VGA      0xA0000
+#define MEM_VGA_SIZE 0x20000
+
+//
+// For memory mapped IO
+//
+
+#define MEMORY_MAPPED_IO_OFFSET (0xB8000 - 0xA0000)
+
+//
+// Port definitions for filling the ACCESS_RANGES structure in the miniport
+// information, defines the range of I/O ports the VGA spans.
+// There is a break in the IO ports - a few ports are used for the parallel
+// port. Those cannot be defined in the ACCESS_RANGE, but are still mapped
+// so all VGA ports are in one address range.
+//
+
+#define VGA_BASE_IO_PORT      0x000003B0
+#define VGA_START_BREAK_PORT  0x000003BB
+#define VGA_END_BREAK_PORT    0x000003C0
+#define VGA_MAX_IO_PORT       0x000003DF
+
+//
+// VGA register definitions
+//
+// eVb: 3.1 [VGA] - Use offsets from the VGA Port Address instead of absolute
+#define CRTC_ADDRESS_PORT_MONO      0x0004  // CRT Controller Address and
+#define CRTC_DATA_PORT_MONO         0x0005  // Data registers in mono mode
+#define FEAT_CTRL_WRITE_PORT_MONO   0x000A  // Feature Control write port
+                                            // in mono mode
+#define INPUT_STATUS_1_MONO         0x000A  // Input Status 1 register read
+                                            // port in mono mode
+#define ATT_INITIALIZE_PORT_MONO    INPUT_STATUS_1_MONO
+                                            // Register to read to reset
+                                            // Attribute Controller index/data
+
+#define ATT_ADDRESS_PORT            0x0010  // Attribute Controller Address and
+#define ATT_DATA_WRITE_PORT         0x0010  // Data registers share one port
+                                            // for writes, but only Address is
+                                            // readable at 0x3C0
+#define ATT_DATA_READ_PORT          0x0011  // Attribute Controller Data reg is
+                                            // readable here
+#define MISC_OUTPUT_REG_WRITE_PORT  0x0012  // Miscellaneous Output reg write
+                                            // port
+#define INPUT_STATUS_0_PORT         0x0012  // Input Status 0 register read
+                                            // port
+#define VIDEO_SUBSYSTEM_ENABLE_PORT 0x0013  // Bit 0 enables/disables the
+                                            // entire VGA subsystem
+#define SEQ_ADDRESS_PORT            0x0014  // Sequence Controller Address and
+#define SEQ_DATA_PORT               0x0015  // Data registers
+#define DAC_PIXEL_MASK_PORT         0x0016  // DAC pixel mask reg
+#define DAC_ADDRESS_READ_PORT       0x0017  // DAC register read index reg,
+                                            // write-only
+#define DAC_STATE_PORT              0x0017  // DAC state (read/write),
+                                            // read-only
+#define DAC_ADDRESS_WRITE_PORT      0x0018  // DAC register write index reg
+#define DAC_DATA_REG_PORT           0x0019  // DAC data transfer reg
+#define FEAT_CTRL_READ_PORT         0x001A  // Feature Control read port
+#define MISC_OUTPUT_REG_READ_PORT   0x001C  // Miscellaneous Output reg read
+                                            // port
+#define GRAPH_ADDRESS_PORT          0x001E  // Graphics Controller Address
+#define GRAPH_DATA_PORT             0x001F  // and Data registers
+
+#define CRTC_ADDRESS_PORT_COLOR     0x0024  // CRT Controller Address and
+#define CRTC_DATA_PORT_COLOR        0x0025  // Data registers in color mode
+#define FEAT_CTRL_WRITE_PORT_COLOR  0x002A  // Feature Control write port
+#define INPUT_STATUS_1_COLOR        0x002A  // Input Status 1 register read
+                                            // port in color mode
+// eVb: 3.2 [END]
+#define ATT_INITIALIZE_PORT_COLOR   INPUT_STATUS_1_COLOR
+                                            // Register to read to reset
+                                            // Attribute Controller index/data
+                                            // toggle in color mode
+
+//
+// Offsets in HardwareStateHeader->PortValue[] of save areas for non-indexed
+// VGA registers.
+//
+
+#define CRTC_ADDRESS_MONO_OFFSET      0x04
+#define FEAT_CTRL_WRITE_MONO_OFFSET   0x0A
+#define ATT_ADDRESS_OFFSET            0x10
+#define MISC_OUTPUT_REG_WRITE_OFFSET  0x12
+#define VIDEO_SUBSYSTEM_ENABLE_OFFSET 0x13
+#define SEQ_ADDRESS_OFFSET            0x14
+#define DAC_PIXEL_MASK_OFFSET         0x16
+#define DAC_STATE_OFFSET              0x17
+#define DAC_ADDRESS_WRITE_OFFSET      0x18
+#define GRAPH_ADDRESS_OFFSET          0x1E
+#define CRTC_ADDRESS_COLOR_OFFSET     0x24
+#define FEAT_CTRL_WRITE_COLOR_OFFSET  0x2A
+
+                                            // toggle in color mode
+//
+// VGA indexed register indexes.
+//
+
+// CL-GD542x specific registers:
+//
+#define IND_CL_EXTS_ENB         0x06    // index in Sequencer to enable exts
+#define IND_NORD_SCRATCH_PAD    0x09    // index in Seq of Nordic scratch pad
+#define IND_CL_SCRATCH_PAD      0x0A    // index in Seq of 542x scratch pad
+#define IND_ALP_SCRATCH_PAD     0x15    // index in Seq of Alpine scratch pad
+#define IND_CL_REV_REG          0x25    // index in CRTC of ID Register
+#define IND_CL_ID_REG           0x27    // index in CRTC of ID Register
+//
+#define IND_CURSOR_START        0x0A    // index in CRTC of the Cursor Start
+#define IND_CURSOR_END          0x0B    //  and End registers
+#define IND_CURSOR_HIGH_LOC     0x0E    // index in CRTC of the Cursor Location
+#define IND_CURSOR_LOW_LOC      0x0F    //  High and Low Registers
+#define IND_VSYNC_END           0x11    // index in CRTC of the Vertical Sync
+                                        //  End register, which has the bit
+                                        //  that protects/unprotects CRTC
+                                        //  index registers 0-7
+#define IND_CR2C                0x2C    // Nordic LCD Interface Register
+#define IND_CR2D                0x2D    // Nordic LCD Display Control
+#define IND_SET_RESET_ENABLE    0x01    // index of Set/Reset Enable reg in GC
+#define IND_DATA_ROTATE         0x03    // index of Data Rotate reg in GC
+#define IND_READ_MAP            0x04    // index of Read Map reg in Graph Ctlr
+#define IND_GRAPH_MODE          0x05    // index of Mode reg in Graph Ctlr
+#define IND_GRAPH_MISC          0x06    // index of Misc reg in Graph Ctlr
+#define IND_BIT_MASK            0x08    // index of Bit Mask reg in Graph Ctlr
+#define IND_SYNC_RESET          0x00    // index of Sync Reset reg in Seq
+#define IND_MAP_MASK            0x02    // index of Map Mask in Sequencer
+#define IND_MEMORY_MODE         0x04    // index of Memory Mode reg in Seq
+#define IND_CRTC_PROTECT        0x11    // index of reg containing regs 0-7 in
+                                        //  CRTC
+#define IND_CRTC_COMPAT         0x34    // index of CRTC Compatibility reg
+                                        //  in CRTC
+#define IND_PERF_TUNING         0x16    // index of performance tuning in Seq
+#define START_SYNC_RESET_VALUE  0x01    // value for Sync Reset reg to start
+                                        //  synchronous reset
+#define END_SYNC_RESET_VALUE    0x03    // value for Sync Reset reg to end
+                                        //  synchronous reset
+
+//
+// Value to write to Extensions Control register values extensions.
+//
+
+#define CL64xx_EXTENSION_ENABLE_INDEX     0x0A     // GR0A to be exact!
+#define CL64xx_EXTENSION_ENABLE_VALUE     0xEC
+#define CL64xx_EXTENSION_DISABLE_VALUE    0xCE
+#define CL64xx_TRISTATE_CONTROL_REG       0xA1
+
+#define CL6340_ENABLE_READBACK_REGISTER   0xE0
+#define CL6340_ENABLE_READBACK_ALLSEL_VALUE 0xF0
+#define CL6340_ENABLE_READBACK_OFF_VALUE  0x00
+#define CL6340_IDENTIFICATION_REGISTER    0xE9
+//
+// Values for Attribute Controller Index register to turn video off
+// and on, by setting bit 5 to 0 (off) or 1 (on).
+//
+
+#define VIDEO_DISABLE 0
+#define VIDEO_ENABLE  0x20
+
+#define INDEX_ENABLE_AUTO_START 0x31
+
+// Masks to keep only the significant bits of the Graphics Controller and
+// Sequencer Address registers. Masking is necessary because some VGAs, such
+// as S3-based ones, don't return unused bits set to 0, and some SVGAs use
+// these bits if extensions are enabled.
+//
+
+#define GRAPH_ADDR_MASK 0x0F
+#define SEQ_ADDR_MASK   0x07
+
+//
+// Mask used to toggle Chain4 bit in the Sequencer's Memory Mode register.
+//
+
+#define CHAIN4_MASK 0x08
+
+//
+// Value written to the Read Map register when identifying the existence of
+// a VGA in VgaInitialize. This value must be different from the final test
+// value written to the Bit Mask in that routine.
+//
+
+#define READ_MAP_TEST_SETTING 0x03
+
+//
+// Default text mode setting for various registers, used to restore their
+// states if VGA detection fails after they've been modified.
+//
+
+#define MEMORY_MODE_TEXT_DEFAULT 0x02
+#define BIT_MASK_DEFAULT 0xFF
+#define READ_MAP_DEFAULT 0x00
+
+\f
+//
+// Palette-related info.
+//
+
+//
+// Highest valid DAC color register index.
+//
+
+#define VIDEO_MAX_COLOR_REGISTER  0xFF
+
+//
+// Highest valid palette register index
+//
+
+#define VIDEO_MAX_PALETTE_REGISTER 0x0F
+
+//
+// Driver Specific Attribute Flags
+//
+
+#define CAPS_NO_HOST_XFER       0x00000002   // Do not use host xfers to
+                                             //   the blt engine.
+#define CAPS_SW_POINTER         0x00000004   // Use software pointer.
+#define CAPS_TRUE_COLOR         0x00000008   // Set upper color registers.
+#define CAPS_MM_IO              0x00000010   // Use memory mapped IO.
+#define CAPS_BLT_SUPPORT        0x00000020   // BLTs are supported
+#define CAPS_IS_542x            0x00000040   // This is a 542x
+#define CAPS_IS_5436            0x00000080   // This is a 5436
+#define CAPS_CURSOR_VERT_EXP    0x00000100   // Flag set if 8x6 panel,
+                                             //   but 6x4 resolution
+
+//
+// Structure used to describe each video mode in ModesVGA[].
+//
+
+typedef struct {
+    USHORT  fbType; // color or monochrome, text or graphics, via
+                    //  VIDEO_MODE_COLOR and VIDEO_MODE_GRAPHICS
+    USHORT  numPlanes;    // # of video memory planes
+    USHORT  bitsPerPlane; // # of bits of color in each plane
+    SHORT   col;    // # of text columns across screen with default font
+    SHORT   row;    // # of text rows down screen with default font
+    USHORT  hres;   // # of pixels across screen
+    USHORT  vres;   // # of scan lines down screen
+// eVb: 3.2 [VGA] - Store frequency next to resolution data
+    ULONG   Frequency;         // Vertical Frequency
+// eVb: 3.2 [END]
+    USHORT  wbytes; // # of bytes from start of one scan line to start of next
+    ULONG   sbytes; // total size of addressable display memory in bytes
+// eVb: 3.3 [VBE] - Add VBE mode and bank flag
+    ULONG NoBankSwitch;
+    ULONG Mode;
+// eVb: 3.3 [VBE]
+    PUSHORT CmdStream;   // pointer to array of register-setting commands to
+                                         //  set up mode
+// eVb: 3.4 [VBE] - Add fields to track linear addresses/sizes and flags                      
+    ULONG PhysBase;
+    ULONG FrameBufferBase;
+    ULONG FrameBufferSize;
+    ULONG PhysSize;
+    ULONG LogicalWidth;
+    ULONG NonVgaMode;
+    ULONG Granularity;
+// eVb: 3.4 [END]
+} VIDEOMODE, *PVIDEOMODE;
+
+//
+// Mode into which to put the VGA before starting a VDM, so it's a plain
+// vanilla VGA.  (This is the mode's index in ModesVGA[], currently standard
+// 80x25 text mode.)
+//
+
+#define DEFAULT_MODE 0
+
+\f
+//
+// Info used by the Validator functions and save/restore code.
+// Structure used to trap register accesses that must be done atomically.
+//
+
+#define VGA_MAX_VALIDATOR_DATA             100
+
+#define VGA_VALIDATOR_UCHAR_ACCESS   1
+#define VGA_VALIDATOR_USHORT_ACCESS  2
+#define VGA_VALIDATOR_ULONG_ACCESS   3
+
+typedef struct _VGA_VALIDATOR_DATA {
+   ULONG Port;
+   UCHAR AccessType;
+   ULONG Data;
+} VGA_VALIDATOR_DATA, *PVGA_VALIDATOR_DATA;
+
+//
+// Number of bytes to save in each plane.
+//
+
+#define VGA_PLANE_SIZE 0x10000
+
+//
+// Number of each type of indexed register in a standard VGA, used by
+// validator and state save/restore functions.
+//
+// Note: VDMs currently only support basic VGAs only.
+//
+
+#define VGA_NUM_SEQUENCER_PORTS     5
+#define VGA_NUM_CRTC_PORTS         25
+#define VGA_NUM_GRAPH_CONT_PORTS    9
+#define VGA_NUM_ATTRIB_CONT_PORTS  21
+#define VGA_NUM_DAC_ENTRIES       256
+
+#define EXT_NUM_GRAPH_CONT_PORTS    0
+#define EXT_NUM_SEQUENCER_PORTS     0
+#define EXT_NUM_CRTC_PORTS          0
+#define EXT_NUM_ATTRIB_CONT_PORTS   0
+#define EXT_NUM_DAC_ENTRIES         0
+
+//
+// These constants determine the offsets within the
+// VIDEO_HARDWARE_STATE_HEADER structure that are used to save and
+// restore the VGA's state.
+//
+
+#define VGA_HARDWARE_STATE_SIZE sizeof(VIDEO_HARDWARE_STATE_HEADER)
+
+#define VGA_BASIC_SEQUENCER_OFFSET (VGA_HARDWARE_STATE_SIZE + 0)
+#define VGA_BASIC_CRTC_OFFSET (VGA_BASIC_SEQUENCER_OFFSET + \
+         VGA_NUM_SEQUENCER_PORTS)
+#define VGA_BASIC_GRAPH_CONT_OFFSET (VGA_BASIC_CRTC_OFFSET + \
+         VGA_NUM_CRTC_PORTS)
+#define VGA_BASIC_ATTRIB_CONT_OFFSET (VGA_BASIC_GRAPH_CONT_OFFSET + \
+         VGA_NUM_GRAPH_CONT_PORTS)
+#define VGA_BASIC_DAC_OFFSET (VGA_BASIC_ATTRIB_CONT_OFFSET + \
+         VGA_NUM_ATTRIB_CONT_PORTS)
+#define VGA_BASIC_LATCHES_OFFSET (VGA_BASIC_DAC_OFFSET + \
+         (3 * VGA_NUM_DAC_ENTRIES))
+
+#define VGA_EXT_SEQUENCER_OFFSET (VGA_BASIC_LATCHES_OFFSET + 4)
+#define VGA_EXT_CRTC_OFFSET (VGA_EXT_SEQUENCER_OFFSET + \
+         EXT_NUM_SEQUENCER_PORTS)
+#define VGA_EXT_GRAPH_CONT_OFFSET (VGA_EXT_CRTC_OFFSET + \
+         EXT_NUM_CRTC_PORTS)
+#define VGA_EXT_ATTRIB_CONT_OFFSET (VGA_EXT_GRAPH_CONT_OFFSET +\
+         EXT_NUM_GRAPH_CONT_PORTS)
+#define VGA_EXT_DAC_OFFSET (VGA_EXT_ATTRIB_CONT_OFFSET + \
+         EXT_NUM_ATTRIB_CONT_PORTS)
+
+#define VGA_VALIDATOR_OFFSET (VGA_EXT_DAC_OFFSET + 4 * EXT_NUM_DAC_ENTRIES)
+
+#define VGA_VALIDATOR_AREA_SIZE  sizeof (ULONG) + (VGA_MAX_VALIDATOR_DATA * \
+                                 sizeof (VGA_VALIDATOR_DATA)) +             \
+                                 sizeof (ULONG) +                           \
+                                 sizeof (ULONG) +                           \
+                                 sizeof (PVIDEO_ACCESS_RANGE)
+
+#define VGA_MISC_DATA_AREA_OFFSET VGA_VALIDATOR_OFFSET + VGA_VALIDATOR_AREA_SIZE
+
+#define VGA_MISC_DATA_AREA_SIZE  0
+
+#define VGA_PLANE_0_OFFSET VGA_MISC_DATA_AREA_OFFSET + VGA_MISC_DATA_AREA_SIZE
+
+#define VGA_PLANE_1_OFFSET VGA_PLANE_0_OFFSET + VGA_PLANE_SIZE
+#define VGA_PLANE_2_OFFSET VGA_PLANE_1_OFFSET + VGA_PLANE_SIZE
+#define VGA_PLANE_3_OFFSET VGA_PLANE_2_OFFSET + VGA_PLANE_SIZE
+
+//
+// Space needed to store all state data.
+//
+
+#define VGA_TOTAL_STATE_SIZE VGA_PLANE_3_OFFSET + VGA_PLANE_SIZE
+
+\f
+//
+// Device extension for the driver object.  This data is only used
+// locally, so this structure can be added to as needed.
+//
+
+typedef struct _HW_DEVICE_EXTENSION {
+
+    PHYSICAL_ADDRESS PhysicalVideoMemoryBase; // physical memory address and
+    PHYSICAL_ADDRESS PhysicalFrameOffset;     // physical memory address and
+    ULONG PhysicalVideoMemoryLength;          // length of display memory
+    ULONG PhysicalFrameLength;                // length of display memory for
+                                              // the current mode.
+
+    PUCHAR  IOAddress;            // base I/O address of VGA ports
+    PUCHAR  VideoMemoryAddress;   // base virtual memory address of VGA memory
+    ULONG   ModeIndex;            // index of current mode in ModesVGA[]
+    PVIDEOMODE  CurrentMode;      // pointer to VIDEOMODE structure for
+                                  // current mode
+
+    VIDEO_CURSOR_POSITION CursorPosition;  // current cursor position
+
+    UCHAR CursorEnable;           // whether cursor is enabled or not
+    UCHAR CursorTopScanLine;      // Cursor Start register setting (top scan)
+    UCHAR CursorBottomScanLine;   // Cursor End register setting (bottom scan)
+// eVb: 3.5 [VBE] - Add fields for VBE support and XP+ INT10 interface  
+    VIDEO_PORT_INT10_INTERFACE Int10Interface;
+    BOOLEAN VesaBiosOk;
+// eVb: 3.5 [END]
+} HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION;
+
+\f
+//
+// Function prototypes.
+//
+
+//
+// Entry points for the VGA validator. Used in VgaEmulatorAccessEntries[].
+//
+
+
+//
+// Vga init scripts for font loading
+//
+
+extern USHORT EnableA000Data[];
+extern USHORT DisableA000Color[];
+
+//
+// Mode Information
+//
+
+extern ULONG NumVideoModes;
+extern VIDEOMODE ModesVGA[];
+extern PVIDEOMODE VgaModeList;
+
+// eVb: 3.5 [VGA] - Add ATI/Mach64 Access Range    
+#define NUM_VGA_ACCESS_RANGES  5
+// eVb: 3.5 [END]
+extern VIDEO_ACCESS_RANGE VgaAccessRange[];
+
+#include "vbe.h"
diff --git a/reactos/drivers/video/miniport/vga_new/vga.rbuild b/reactos/drivers/video/miniport/vga_new/vga.rbuild
new file mode 100644 (file)
index 0000000..622440d
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
+<module name="vga" type="kernelmodedriver" installbase="system32/drivers" installname="vga.sys">
+       <include base="vga">.</include>
+       <library>videoprt</library>
+       <library>libcntpr</library>
+       <file>modeset.c</file>
+       <file>vgadata.c</file>
+       <file>vga.c</file>
+       <file>vbemodes.c</file>
+       <file>vbe.c</file>
+       <file>vga.rc</file>
+       <pch>vga.h</pch>
+       <group compilerset="gcc">
+        <compilerflag>-mrtd</compilerflag>
+        <compilerflag>-fno-builtin</compilerflag>
+    </group>
+</module>
diff --git a/reactos/drivers/video/miniport/vga_new/vga.rc b/reactos/drivers/video/miniport/vga_new/vga.rc
new file mode 100644 (file)
index 0000000..4aac6fd
--- /dev/null
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION   "VGA Miniport Device Driver\0"
+#define REACTOS_STR_INTERNAL_NAME          "vga\0"
+#define REACTOS_STR_ORIGINAL_FILENAME  "vga.sys\0"
+#include <reactos/version.rc>
diff --git a/reactos/drivers/video/miniport/vga_new/vgadata.c b/reactos/drivers/video/miniport/vga_new/vgadata.c
new file mode 100644 (file)
index 0000000..6f9ea0f
--- /dev/null
@@ -0,0 +1,490 @@
+/*
+ * PROJECT:         ReactOS VGA Miniport Driver
+ * LICENSE:         Microsoft NT4 DDK Sample Code License
+ * FILE:            boot/drivers/video/miniport/vga/vgadata.c
+ * PURPOSE:         Handles switching to VGA Modes and holds VGA Built-in Modes
+ * PROGRAMMERS:     Copyright (c) 1992  Microsoft Corporation
+ *                  ReactOS Portable Systems Group
+ */
+
+#include "vga.h"
+
+//
+// This structure describes to which ports access is required.
+//
+
+VIDEO_ACCESS_RANGE VgaAccessRange[] = {
+{
+    {{VGA_BASE_IO_PORT, 0x00000000}},            // 64-bit linear base address
+                                                 // of range
+    VGA_START_BREAK_PORT - VGA_BASE_IO_PORT + 1, // # of ports
+    1,                                           // range is in I/O space
+    1,                                           // range should be visible
+    0                                            // range should be shareable
+},
+{
+    {{VGA_END_BREAK_PORT, 0x00000000}},
+    VGA_MAX_IO_PORT - VGA_END_BREAK_PORT + 1,
+    1,
+    1,
+    0
+},
+
+//
+// This next region also includes Memory mapped IO.  In MMIO, the ports are
+// repeated every 256 bytes from b8000 to bff00.
+//
+
+{
+    {{MEM_VGA, 0x00000000}},
+    MEM_VGA_SIZE,
+    0,
+    1,
+    0
+},
+// eVb: 4.1 [VGA] - Add ATI/Mach64 VGA registers
+//
+// ATI Registers
+//
+
+{
+    {{0x1CE, 0x00000000}},
+    2,
+    1,
+    1,
+    0
+},
+{
+    {{0x2E8, 0x00000000}},
+    8,
+    1,
+    1,
+    0
+}
+// eVb: 4.1 [END]
+};
+
+//
+// 640x480 256-color 60Hz mode (BIOS mode 12) set command string for
+// VGA.
+//
+// eVb: 4.2 [VGA] - Add VGA command streams instead of Cirrus
+USHORT VGA_640x480[] = {
+    OWM,                            // begin setmode
+    SEQ_ADDRESS_PORT,
+    5,                              // count
+    0x100,                          // start sync reset
+    0x0101,0x0F02,0x0003,0x0604,    // program up sequencer
+
+    OB,                             // misc. register
+    MISC_OUTPUT_REG_WRITE_PORT,
+    0xE3,
+
+    OW,                             // text/graphics bit
+    GRAPH_ADDRESS_PORT,
+    0x506,
+    
+    OW,                             // end sync reset
+    SEQ_ADDRESS_PORT,
+    IND_SYNC_RESET,
+
+    OB,
+    SEQ_DATA_PORT,
+    END_SYNC_RESET_VALUE,
+
+    OW,                             // unprotect crtc 0-7
+    CRTC_ADDRESS_PORT_COLOR,
+    0x511,                        
+
+    METAOUT+INDXOUT,                // program gdc registers
+    GRAPH_ADDRESS_PORT,
+    VGA_NUM_CRTC_PORTS,0,            // count, startindex
+    0x5F,0x4F,0x50,0x82,0x54,0x80,0x0B,0x3E,0x00,0x40,0x0,0x0,0x0,0x0,0x0,0x0,
+    0xEA,0x8C,0xDF,0x28,0x0,0xE7,0x4,0xE3,0xFF,
+
+    IB,                             // prepare atc for writing
+    INPUT_STATUS_1_COLOR,
+
+    METAOUT+ATCOUT,                 // program atc registers
+    ATT_ADDRESS_PORT,
+    VGA_NUM_ATTRIB_CONT_PORTS,0,    // count, startindex
+    0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x17, 0x38, 0x39, 0x3A, 0x3B, 0x3C,
+    0x3D, 0x3E, 0x3F, 0x3F, 0x01, 0x00,
+    0x0F, 0x00, 0x00,
+
+    METAOUT+INDXOUT,                // program gdc registers
+    GRAPH_ADDRESS_PORT,
+    VGA_NUM_GRAPH_CONT_PORTS,0,     // count, startindex
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
+    0x05, 0x0F, 0xFF,
+
+    OB,
+    DAC_PIXEL_MASK_PORT,
+    0xFF,
+
+    IB,                             // prepare atc for writing
+    INPUT_STATUS_1_COLOR,
+    
+    OB,                             // turn video on.
+    ATT_ADDRESS_PORT,
+    VIDEO_ENABLE,
+
+    EOD
+};
+
+//
+// 720x400 color text mode (BIOS mode 3) set command string for
+// VGA.
+//
+
+USHORT VGA_TEXT_0[] = {
+    OWM,                            // begin setmode
+    SEQ_ADDRESS_PORT,
+    5,                              // count
+    0x100,                          // start sync reset
+    0x0101,0x0302,0x0003,0x0204,    // program up sequencer
+
+    OB,                             // misc. register
+    MISC_OUTPUT_REG_WRITE_PORT,
+    0x67,
+
+    OW,                             // text/graphics bit
+    GRAPH_ADDRESS_PORT,
+    0x0e06,
+    
+    OW,                             // end sync reset
+    SEQ_ADDRESS_PORT,
+    IND_SYNC_RESET,
+
+    OB,
+    SEQ_DATA_PORT,
+    END_SYNC_RESET_VALUE,
+
+    OW,                             // unprotect crtc 0-7
+    CRTC_ADDRESS_PORT_COLOR,
+    0xE11,                        
+
+    METAOUT+INDXOUT,                // program gdc registers
+    GRAPH_ADDRESS_PORT,
+    VGA_NUM_CRTC_PORTS,0,           // count, startindex
+    0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x4F,0xD,0xE,0x0,0x0,0x0,0x0,
+    0x9c,0x8E,0x8F,0x28,0x1F,0x96,0xB9,0xA3,0xFF,
+
+    IB,                             // prepare atc for writing
+    INPUT_STATUS_1_COLOR,
+
+    METAOUT+ATCOUT,                 // program atc registers
+    ATT_ADDRESS_PORT,
+    VGA_NUM_ATTRIB_CONT_PORTS,0,    // count, startindex
+    0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x17, 0x38, 0x39, 0x3A, 0x3B, 0x3C,
+    0x3D, 0x3E, 0x3F, 0x3F, 0x04, 0x00,
+    0x0F, 0x08, 0x00,
+
+    METAOUT+INDXOUT,                // program gdc registers
+    GRAPH_ADDRESS_PORT,
+    VGA_NUM_GRAPH_CONT_PORTS,0,     // count, startindex
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+    0x0E, 0x00, 0xFF,
+
+    OB,
+    DAC_PIXEL_MASK_PORT,
+    0xFF,
+
+    IB,                             // prepare atc for writing
+    INPUT_STATUS_1_COLOR,
+    
+    OB,                             // turn video on.
+    ATT_ADDRESS_PORT,
+    VIDEO_ENABLE,
+
+    EOD
+};
+
+//
+// 640x400 color text mode (BIOS mode 3) set command string for
+// VGA.
+//
+
+USHORT VGA_TEXT_1[] = {
+    OWM,                            // begin setmode
+    SEQ_ADDRESS_PORT,
+    5,                              // count
+    0x100,                          // start sync reset
+    0x0101,0x0302,0x0003,0x0204,    // program up sequencer
+
+    OB,                             // misc. register
+    MISC_OUTPUT_REG_WRITE_PORT,
+    0xA3,
+
+    OW,                             // text/graphics bit
+    GRAPH_ADDRESS_PORT,
+    0x0e06,
+    
+    OW,                             // end sync reset
+    SEQ_ADDRESS_PORT,
+    IND_SYNC_RESET,
+
+    OB,
+    SEQ_DATA_PORT,
+    END_SYNC_RESET_VALUE,
+
+    OW,                             // unprotect crtc 0-7
+    CRTC_ADDRESS_PORT_COLOR,
+    0x511,                        
+
+    METAOUT+INDXOUT,                // program gdc registers
+    GRAPH_ADDRESS_PORT,
+    VGA_NUM_CRTC_PORTS,0,           // count, startindex
+    0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x4D,0xB,0xC,0x0,0x0,0x0,0x0,
+    0x83,0x85,0x5D,0x28,0x1F,0x63,0xBA,0xA3,0xFF,
+
+    IB,                             // prepare atc for writing
+    INPUT_STATUS_1_COLOR,
+
+    METAOUT+ATCOUT,                 // program atc registers
+    ATT_ADDRESS_PORT,
+    VGA_NUM_ATTRIB_CONT_PORTS,0,    // count, startindex
+    0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x17, 0x38, 0x39, 0x3A, 0x3B, 0x3C,
+    0x3D, 0x3E, 0x3F, 0x3F, 0x04, 0x00,
+    0x0F, 0x00, 0x00,
+
+    METAOUT+INDXOUT,                // program gdc registers
+    GRAPH_ADDRESS_PORT,
+    VGA_NUM_GRAPH_CONT_PORTS,0,     // count, startindex
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+    0x0E, 0x00, 0xFF,
+
+    OB,
+    DAC_PIXEL_MASK_PORT,
+    0xFF,
+
+    IB,                             // prepare atc for writing
+    INPUT_STATUS_1_COLOR,
+    
+    OB,                             // turn video on.
+    ATT_ADDRESS_PORT,
+    VIDEO_ENABLE,
+
+    EOD
+};
+// eVb: 4.2 [END]  
+//
+// Video mode table - contains information and commands for initializing each
+// mode. These entries must correspond with those in VIDEO_MODE_VGA. The first
+// entry is commented; the rest follow the same format, but are not so
+// heavily commented.
+//
+// eVb: 4.3 [VGA] - Add VGA, ModeX and SVGA mode instead of Cirrus Modes
+VIDEOMODE ModesVGA[] =
+{
+    // Color text mode 3, 720x400, 9x16 char cell (VGA).
+    //
+    {
+       VIDEO_MODE_BANKED | VIDEO_MODE_COLOR,  // flags that this mode is a color mode, but not graphics
+        4,                 // four planes
+        1,                 // one bit of colour per plane
+        80, 25,            // 80x25 text resolution
+        720, 400,          // 720x400 pixels on screen
+        1,                 // only support one frequency, non-interlaced
+        160, 0x10000,      // 160 bytes per scan line, 64K of CPU-addressable bitmap
+        FALSE,
+        0x3, VGA_TEXT_0,   // Mode 3, I/O initialization stream
+        0xA0000,           // Physical address at 0xA0000
+        0x18000, 0x8000,
+        0x20000,           // 2 banks of 64K, 128KB total memory
+        720,               // 720 pixels per scan line
+        FALSE,
+        0
+    },
+    
+    //
+    // Color text mode 3, 640x350, 8x14 char cell (EGA).
+    //
+    {
+        VIDEO_MODE_BANKED | VIDEO_MODE_COLOR,
+        4, 1,
+        80, 25, 
+        640, 350,
+        1,
+        160, 0x10000,
+        FALSE,
+        0x3, VGA_TEXT_1,
+        0xA0000,
+        0x18000, 0x8000,
+        0x20000,
+        640,
+        FALSE,
+        0
+    },
+    
+    //
+    //
+    // Standard VGA Color graphics mode 0x12, 640x480 16 colors.
+    //
+    {
+        VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS,
+        4, 1,
+        80, 30, 
+        640, 480,
+        1,
+        80, 0x10000,
+        FALSE,
+        0x12, VGA_640x480,
+        0xA0000,
+        0, 0x20000,
+        0x20000,
+        640,
+        FALSE,
+        0
+    },
+
+    {
+        VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS,
+        8, 1,
+        0, 0, 
+        320, 200,
+        70,
+        80, 0x10000,
+        FALSE,
+        0x3, NULL,
+        0xA0000,
+        0, 0x20000,
+        0x20000,
+        320,
+        FALSE,
+        0
+    },
+    
+    {
+        VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS,
+        8, 1,
+        0, 0, 
+        320, 240,
+        60,
+        80, 0x10000,
+        FALSE,
+        0x3, NULL,
+        0xA0000,
+        0, 0x20000,
+        0x20000,
+        320,
+        FALSE,
+        0
+    },
+    
+    {
+        VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS,
+        8, 1,
+        0, 0, 
+        320, 400,
+        70,
+        80, 0x10000,
+        FALSE,
+        0x3, NULL,
+        0xA0000,
+        0, 0x20000,
+        0x20000,
+        320,
+        FALSE,
+        0
+    },
+
+    {
+        VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS,
+        8, 1,
+        0, 0, 
+        320, 480,
+        60,
+        80, 0x10000,
+        FALSE,
+        0x3, NULL,
+        0xA0000,
+        0, 0x20000,
+        0x20000,
+        320,
+        FALSE,
+        0
+    },
+    
+    //
+    // 800x600 16 colors.
+    //
+    {
+        VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS,
+        4, 1,
+        100, 37,
+        800, 600,
+        1,
+        100, 0x10000,
+        FALSE,
+        (0x102 << 16) | VBE_SET_VBE_MODE, NULL,
+        0xA0000,
+        0, 0x20000,
+        0x20000,
+        800,
+        FALSE,
+        0
+    },
+};
+
+ULONG NumVideoModes = sizeof(ModesVGA) / sizeof(VIDEOMODE);
+PVIDEOMODE VgaModeList;
+// eVb: 4.3 [END]
+
+//
+//
+// Data used to set the Graphics and Sequence Controllers to put the
+// VGA into a planar state at A0000 for 64K, with plane 2 enabled for
+// reads and writes, so that a font can be loaded, and to disable that mode.
+//
+
+// Settings to enable planar mode with plane 2 enabled.
+//
+
+USHORT EnableA000Data[] = {
+    OWM,
+    SEQ_ADDRESS_PORT,
+    1,
+    0x0100,
+
+    OWM,
+    GRAPH_ADDRESS_PORT,
+    3,
+    0x0204,     // Read Map = plane 2
+    0x0005, // Graphics Mode = read mode 0, write mode 0
+    0x0406, // Graphics Miscellaneous register = A0000 for 64K, not odd/even,
+            //  graphics mode
+    OWM,
+    SEQ_ADDRESS_PORT,
+    3,
+    0x0402, // Map Mask = write to plane 2 only
+    0x0404, // Memory Mode = not odd/even, not full memory, graphics mode
+    0x0300,  // end sync reset
+    EOD
+};
+
+//
+// Settings to disable the font-loading planar mode.
+//
+
+USHORT DisableA000Color[] = {
+    OWM,
+    SEQ_ADDRESS_PORT,
+    1,
+    0x0100,
+
+    OWM,
+    GRAPH_ADDRESS_PORT,
+    3,
+    0x0004, 0x1005, 0x0E06,
+
+    OWM,
+    SEQ_ADDRESS_PORT,
+    3,
+    0x0302, 0x0204, 0x0300,  // end sync reset
+    EOD
+
+};
index 245d901..a8f8a82 100644 (file)
@@ -5,8 +5,8 @@
  * PURPOSE:         VMWARE SVGA-II Driver Header
  * PROGRAMMERS:     ReactOS Portable Systems Group
  */
-#include <ntddk.h>
+
+#include <ntdef.h>
 #include <dderror.h>
 #include <miniport.h>
 #include <ntddvdeo.h>
@@ -20,13 +20,13 @@ typedef struct _HW_DEVICE_EXTENSION
     LARGE_INTEGER VramSize;
     PHYSICAL_ADDRESS VramBase;
     ULONG MemSize;
-    ULONG IndexPort;
-    ULONG ValuePort;
+    PULONG IndexPort;
+    PULONG ValuePort;
     PVOID FrameBufferBase;
     PVOID Fifo;
     ULONG InterruptPort;
     ULONG InterruptState;
-    PKEVENT SyncEvent;
+    PENG_EVENT SyncEvent;
     VIDEO_MODE_INFORMATION CurrentMode;
     ULONG VideoModeCount;
     ULONG Capabilities;
index ca5cab4..3c981c5 100644 (file)
@@ -9,13 +9,76 @@
 /* INCLUDES *******************************************************************/
 
 #include "precomp.h"
+#include "debug.h"
 
 /* GLOBALS ********************************************************************/
 
 PHW_DEVICE_EXTENSION VmxDeviceExtensionArray[SVGA_MAX_DISPLAYS];
+static PWCHAR AdapterString = L"VMware SVGA II";
 
 /* FUNCTIONS ******************************************************************/
 
+ULONG
+NTAPI
+VmxReadUlong(IN PHW_DEVICE_EXTENSION DeviceExtension,
+             IN ULONG Index)
+{
+    /* Program the index first, then read the value */
+    VideoPortWritePortUlong(DeviceExtension->IndexPort, Index);
+    return VideoPortReadPortUlong(DeviceExtension->ValuePort);
+}
+
+VOID
+NTAPI
+VmxWriteUlong(IN PHW_DEVICE_EXTENSION DeviceExtension,
+              IN ULONG Index,
+              IN ULONG Value)
+{
+    /* Program the index first, then write the value */
+    VideoPortWritePortUlong(DeviceExtension->IndexPort, Index);
+    VideoPortWritePortUlong(DeviceExtension->ValuePort, Value);
+}
+
+ULONG
+NTAPI
+VmxInitModes(IN PHW_DEVICE_EXTENSION DeviceExtension)
+{
+    /* Not here yet */
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+VP_STATUS
+NTAPI
+VmxInitDevice(IN PHW_DEVICE_EXTENSION DeviceExtension)
+{
+    /* Not here yet */
+    UNIMPLEMENTED;
+    while (TRUE);
+    return NO_ERROR;
+}
+
+BOOLEAN
+NTAPI
+VmxIsMultiMon(IN PHW_DEVICE_EXTENSION DeviceExtension)
+{
+    ULONG Capabilities;
+    
+    /* Get the caps */
+    Capabilities = DeviceExtension->Capabilities;
+    
+    /* Check for multi-mon support */
+    if ((Capabilities & SVGA_CAP_MULTIMON) && (Capabilities & SVGA_CAP_PITCHLOCK))
+    {
+        /* Query the monitor count */
+        if (VmxReadUlong(DeviceExtension, SVGA_REG_NUM_DISPLAYS) > 1) return TRUE;
+    }
+    
+    /* Either no support, or just one screen */
+    return FALSE;
+}
+
 VP_STATUS
 NTAPI
 VmxFindAdapter(IN PVOID HwDeviceExtension,
@@ -24,6 +87,82 @@ VmxFindAdapter(IN PVOID HwDeviceExtension,
                IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo,
                OUT PUCHAR Again)
 {
+    VP_STATUS Status;
+    PHW_DEVICE_EXTENSION DeviceExtension = HwDeviceExtension;
+    DPRINT1("VMX searching for adapter\n");
+    
+    /* Zero out the fields */
+    VideoPortZeroMemory(DeviceExtension, sizeof(HW_DEVICE_EXTENSION));
+    
+    /* Validate the Config Info */
+    if (ConfigInfo->Length < sizeof(VIDEO_PORT_CONFIG_INFO))
+    {
+        /* Incorrect OS version? */
+        DPRINT1("Invalid configuration info\n");
+        return ERROR_INVALID_PARAMETER;
+    }
+    
+    /* Initialize the device extension and find the adapter */
+    Status = VmxInitDevice(DeviceExtension);
+    DPRINT1("Init status: %lx\n", Status);
+    if (Status != NO_ERROR) return ERROR_DEV_NOT_EXIST;
+    
+    /* Save this adapter extension */
+    VmxDeviceExtensionArray[0] = DeviceExtension;
+    
+    /* Create the sync event */
+    VideoPortCreateEvent(DeviceExtension,
+                         NOTIFICATION_EVENT,
+                         NULL,
+                         &DeviceExtension->SyncEvent);
+                         
+    /* Check for multi-monitor configuration */
+    if (VmxIsMultiMon(DeviceExtension))
+    {
+        /* Let's not go so far */
+        UNIMPLEMENTED;
+        while (TRUE);
+    }
+    
+    /* Zero the frame buffer */
+    VideoPortZeroMemory((PVOID)DeviceExtension->FrameBuffer.LowPart, 
+                        DeviceExtension->VramSize.LowPart);
+                        
+    /* Initialize the video modes */
+    VmxInitModes(DeviceExtension);
+    
+    /* Setup registry keys */
+    VideoPortSetRegistryParameters(DeviceExtension,
+                                   L"HardwareInformation.ChipType",
+                                   AdapterString,
+                                   sizeof(AdapterString));
+    VideoPortSetRegistryParameters(DeviceExtension,
+                                   L"HardwareInformation.DacType",
+                                   AdapterString,
+                                   sizeof(AdapterString));
+    VideoPortSetRegistryParameters(DeviceExtension,
+                                   L"HardwareInformation.MemorySize",
+                                   &DeviceExtension->VramSize.LowPart,
+                                   sizeof(ULONG));
+    VideoPortSetRegistryParameters(DeviceExtension,
+                                   L"HardwareInformation.AdapterString",
+                                   AdapterString,
+                                   sizeof(AdapterString));
+    VideoPortSetRegistryParameters(DeviceExtension,
+                                   L"HardwareInformation.BiosString",
+                                   AdapterString,
+                                   sizeof(AdapterString));
+                                   
+    /* No VDM support */
+    ConfigInfo->NumEmulatorAccessEntries = 0;
+    ConfigInfo->EmulatorAccessEntries = 0;
+    ConfigInfo->EmulatorAccessEntriesContext = 0;
+    ConfigInfo->HardwareStateSize = 0;
+    ConfigInfo->VdmPhysicalVideoMemoryAddress.QuadPart = 0;
+    ConfigInfo->VdmPhysicalVideoMemoryLength = 0;
+    
+    /* Write that this is Windows XP or higher */
+    VmxWriteUlong(DeviceExtension, SVGA_REG_GUEST_ID, 0x5000 | 0x08);
     return NO_ERROR;
 }
 
@@ -31,6 +170,8 @@ BOOLEAN
 NTAPI
 VmxInitialize(IN PVOID HwDeviceExtension)
 {
+    UNIMPLEMENTED;
+    while (TRUE);
     return TRUE;
 }
 
@@ -39,6 +180,8 @@ NTAPI
 VmxStartIO(IN PVOID HwDeviceExtension,
            IN PVIDEO_REQUEST_PACKET RequestPacket)
 {
+    UNIMPLEMENTED;
+    while (TRUE);
     return TRUE;
 }
 
@@ -48,6 +191,8 @@ VmxResetHw(IN PVOID DeviceExtension,
            IN ULONG Columns,
            IN ULONG Rows)
 {
+    UNIMPLEMENTED;
+    while (TRUE);
     return FALSE;
 }
 
@@ -57,6 +202,8 @@ VmxGetPowerState(IN PVOID HwDeviceExtension,
                  IN ULONG HwId,
                  IN PVIDEO_POWER_MANAGEMENT VideoPowerControl)
 {
+    UNIMPLEMENTED;
+    while (TRUE);
     return NO_ERROR;
 }
 
@@ -66,14 +213,17 @@ VmxSetPowerState(IN PVOID HwDeviceExtension,
                  IN ULONG HwId,
                  IN PVIDEO_POWER_MANAGEMENT VideoPowerControl)
 {
-
-   return NO_ERROR;
+    UNIMPLEMENTED;
+    while (TRUE);
+    return NO_ERROR;
 }
 
 BOOLEAN
 NTAPI
 VmxInterrupt(IN PVOID HwDeviceExtension)
 {
+    UNIMPLEMENTED;
+    while (TRUE);
     return TRUE;
 }
 
@@ -86,6 +236,8 @@ VmxGetVideoChildDescriptor(IN PVOID HwDeviceExtension,
                            OUT PULONG UId,
                            OUT PULONG pUnused)
 {
+    UNIMPLEMENTED;
+    while (TRUE);
     return NO_ERROR;
 }
 
@@ -97,6 +249,7 @@ DriverEntry(IN PVOID Context1,
     VIDEO_HW_INITIALIZATION_DATA InitData;
 
     /* Zero initialization structure and array of extensions, one per screen */
+    DPRINT1("VMX-SVGAII Loading...\n");
     VideoPortZeroMemory(VmxDeviceExtensionArray, sizeof(VmxDeviceExtensionArray));
     VideoPortZeroMemory(&InitData, sizeof(InitData));
     
index 422e25f..3dacdcc 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifndef XBOXVMP_H
-#define XBOXVMP_H
+#pragma once
 
 /* INCLUDES *******************************************************************/
 
-#ifdef _MSC_VER
-#pragma message ("INVESTIGATE ME")
-#endif
-
-#if 0 //#ifdef _MSC_VER
-#include "devioctl.h"
+#include "ntdef.h"
 #define PAGE_SIZE 4096
-#else
-#include <ntddk.h>
-#endif
-
 #include "dderror.h"
+#include "devioctl.h"
 #include "miniport.h"
 #include "ntddvdeo.h"
 #include "video.h"
@@ -157,6 +148,4 @@ XboxVmpSetColorRegisters(
    PVIDEO_CLUT ColorLookUpTable,
    PSTATUS_BLOCK StatusBlock);
 
-#endif /* XBOXVMP_H */
-
 /* EOF */
index 9914052..5f5458a 100644 (file)
@@ -188,7 +188,8 @@ IntInt10CallBios(
 
     /* Detach and return status */
     IntDetachFromCSRSS(&CallingProcess, &ApcState);
-    return Status;
+    if (NT_SUCCESS(Status)) return NO_ERROR;
+    return ERROR_INVALID_PARAMETER;
 }
 #endif
 
@@ -243,8 +244,8 @@ VideoPortInt10(
 
     /* Detach from CSRSS */
     IntDetachFromCSRSS(&CallingProcess, &ApcState);
-
-    return Status;
+    if (NT_SUCCESS(Status)) return NO_ERROR;
+    return ERROR_INVALID_PARAMETER;
 #else
     /* Not implemented for anything else than X86*/
     DPRINT1("Int10 not available on non-x86!\n");
index f976c7e..33c6fed 100644 (file)
@@ -322,7 +322,6 @@ IntVideoPortCreateAdapterDeviceObject(
 }
 
 
-/* FIXME: we have to detach the device object in IntVideoPortFindAdapter if it fails */
 NTSTATUS NTAPI
 IntVideoPortFindAdapter(
    IN PDRIVER_OBJECT DriverObject,
@@ -341,7 +340,7 @@ IntVideoPortFindAdapter(
    WCHAR SymlinkBuffer[20];
    UNICODE_STRING SymlinkName;
    BOOL LegacyDetection = FALSE;
-   ULONG DeviceNumber;
+   ULONG DeviceNumber, DisplayNumber;
 
    DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
    DeviceNumber = DeviceExtension->DeviceNumber;
@@ -423,6 +422,8 @@ IntVideoPortFindAdapter(
          {
             WARN_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", Status);
             RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
+            if (DeviceExtension->NextDeviceObject)
+                IoDetachDevice(DeviceExtension->NextDeviceObject);
             IoDeleteDevice(DeviceObject);
 
             return Status;
@@ -444,6 +445,8 @@ IntVideoPortFindAdapter(
    {
       WARN_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", Status);
       RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
+      if (DeviceExtension->NextDeviceObject)
+          IoDetachDevice(DeviceExtension->NextDeviceObject);
       IoDeleteDevice(DeviceObject);
       return Status;
    }
@@ -458,12 +461,30 @@ IntVideoPortFindAdapter(
    RtlInitUnicodeString(&DeviceName, DeviceBuffer);
 
    /* Create symbolic link "\??\DISPLAYx" */
-   swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
-   RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
-   IoCreateSymbolicLink(&SymlinkName, &DeviceName);
+
+   /* HACK: We need this to find the first available display to
+    * use. We can't use the device number because then we could
+    * end up with \Device\Video0 being non-functional because
+    * HwFindAdapter returned an error. \Device\Video1 would be
+    * the correct primary display but it would be set to DISPLAY2
+    * so it would never be used and ROS would bugcheck on boot.
+    * By doing it this way, we ensure that DISPLAY1 is always
+    * functional. Another idea would be letting the IO manager
+    * give our video devices names then getting those names
+    * somehow and creating symbolic links to \Device\VideoX
+    * and \??\DISPLAYX once we know that HwFindAdapter has succeeded.
+    */
+   DisplayNumber = 0;
+   do
+   {
+      DisplayNumber++;
+      swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DisplayNumber);
+      RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
+   }
+   while (IoCreateSymbolicLink(&SymlinkName, &DeviceName) != STATUS_SUCCESS);
 
    /* Add entry to DEVICEMAP\VIDEO key in registry. */
-   swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DeviceNumber);
+   swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DisplayNumber - 1);
    RtlWriteRegistryValue(
       RTL_REGISTRY_DEVICEMAP,
       L"VIDEO",
@@ -489,6 +510,8 @@ IntVideoPortFindAdapter(
    if (!IntVideoPortSetupInterrupt(DeviceObject, DriverExtension, &ConfigInfo))
    {
       RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
+      if (DeviceExtension->NextDeviceObject)
+          IoDetachDevice(DeviceExtension->NextDeviceObject);
       IoDeleteDevice(DeviceObject);
       return STATUS_INSUFFICIENT_RESOURCES;
    }
@@ -501,6 +524,8 @@ IntVideoPortFindAdapter(
    {
       if (DeviceExtension->InterruptObject != NULL)
          IoDisconnectInterrupt(DeviceExtension->InterruptObject);
+      if (DeviceExtension->NextDeviceObject)
+          IoDetachDevice(DeviceExtension->NextDeviceObject);
       RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
       IoDeleteDevice(DeviceObject);
       WARN_(VIDEOPRT, "STATUS_INSUFFICIENT_RESOURCES\n");
@@ -1417,3 +1442,99 @@ VideoPortAllocateContiguousMemory(
 
     return MmAllocateContiguousMemory(NumberOfBytes, HighestAcceptableAddress);
 }
+
+/*
+ * @implemented
+ */
+BOOLEAN NTAPI
+VideoPortIsNoVesa(VOID)
+{
+   NTSTATUS Status;
+   HANDLE KeyHandle;
+   UNICODE_STRING Path = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control");
+   UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions");
+   OBJECT_ATTRIBUTES ObjectAttributes;
+   PKEY_VALUE_PARTIAL_INFORMATION KeyInfo;
+   ULONG Length, NewLength;
+
+   /* Initialize object attributes with the path we want */
+   InitializeObjectAttributes(&ObjectAttributes,
+                              &Path,
+                              OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                              NULL,
+                              NULL);
+
+   /* Open the key */
+   Status = ZwOpenKey(&KeyHandle,
+                      KEY_QUERY_VALUE,
+                      &ObjectAttributes);
+
+   if (!NT_SUCCESS(Status))
+   {
+       VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status);
+       return FALSE;
+   }
+
+   /* Find out how large our buffer should be */
+   Status = ZwQueryValueKey(KeyHandle,
+                            &ValueName,
+                            KeyValuePartialInformation,
+                            NULL,
+                            0,
+                            &Length);
+   if (Status != STATUS_BUFFER_OVERFLOW && Status != STATUS_BUFFER_TOO_SMALL)
+   {
+       VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
+       ZwClose(KeyHandle);
+       return FALSE;
+   }
+
+   /* Allocate it */
+   KeyInfo = ExAllocatePool(PagedPool, Length);
+   if (!KeyInfo)
+   {
+       VideoPortDebugPrint(Error, "Out of memory\n");
+       ZwClose(KeyHandle);
+       return FALSE;
+   }
+
+   /* Now for real this time */
+   Status = ZwQueryValueKey(KeyHandle,
+                            &ValueName,
+                            KeyValuePartialInformation,
+                            KeyInfo,
+                            Length,
+                            &NewLength);
+
+   ZwClose(KeyHandle);
+
+   if (!NT_SUCCESS(Status))
+   {
+       VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status);
+       ExFreePool(KeyInfo);
+       return FALSE;
+   }
+
+   /* Sanity check */
+   if (KeyInfo->Type != REG_SZ)
+   {
+       VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n");
+       ExFreePool(KeyInfo);
+       return FALSE;
+   }
+
+   /* Check if NOVESA is present in the start options */
+   if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA"))
+   {
+       VideoPortDebugPrint(Info, "VESA mode disabled\n");
+       ExFreePool(KeyInfo);
+       return TRUE;
+   }
+
+   ExFreePool(KeyInfo);
+
+   VideoPortDebugPrint(Info, "VESA mode enabled\n");
+
+   return FALSE;
+}
+
index aae0ba1..21ea2c0 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <stdio.h>
 #include <ntddk.h>
+#define __BROKEN__
 #include <miniport.h>
 #include <video.h>
 #include <ntddvdeo.h>
index 27bc1e8..4dacc44 100644 (file)
@@ -52,6 +52,7 @@
 @ fastcall VideoPortInterlockedDecrement(ptr) NTOSKRNL.InterlockedDecrement
 @ fastcall VideoPortInterlockedExchange(ptr long) NTOSKRNL.InterlockedExchange
 @ fastcall VideoPortInterlockedIncrement(ptr) NTOSKRNL.InterlockedIncrement
+@ stdcall VideoPortIsNoVesa()
 @ stdcall VideoPortLockBuffer(ptr ptr long long)
 ;VideoPortIsNoVesa // 2003 and later
 @ stdcall VideoPortLockPages(ptr ptr ptr ptr long)
index 7aefc88..730b6a3 100644 (file)
@@ -320,8 +320,6 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
 
     STDMETHOD_(NTSTATUS, Init)(THIS_
         IN KSPIN_CONNECT *ConnectDetails,
-        IN PKSDATAFORMAT DataFormat,
-        IN PDEVICE_OBJECT DeviceObject,
         IN ULONG FrameSize,
         IN ULONG Alignment,
         IN PVOID SilenceBuffer) PURE;
@@ -337,17 +335,10 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
     STDMETHOD_(VOID, UpdateMapping)(THIS_
         IN ULONG BytesWritten) PURE;
 
-    STDMETHOD_(ULONG, NumMappings)(THIS) PURE;
-
     STDMETHOD_(ULONG, NumData)(THIS) PURE;
 
-    STDMETHOD_(BOOL, MinimumDataAvailable)(THIS) PURE;
-
     STDMETHOD_(BOOL, CancelBuffers)(THIS) PURE;
 
-    STDMETHOD_(VOID, UpdateFormat)(THIS_
-        IN PKSDATAFORMAT DataFormat) PURE;
-
     STDMETHOD_(NTSTATUS, GetMappingWithTag)(THIS_
         IN PVOID Tag,
         OUT PPHYSICAL_ADDRESS  PhysicalAddress,
@@ -358,19 +349,19 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
     STDMETHOD_(NTSTATUS, ReleaseMappingWithTag)(THIS_
         IN PVOID Tag) PURE;
 
-    STDMETHOD_(BOOL, HasLastMappingFailed)(THIS) PURE;
+    STDMETHOD_(BOOLEAN, HasLastMappingFailed)(THIS) PURE;
     STDMETHOD_(ULONG, GetCurrentIrpOffset)(THIS) PURE;
-    STDMETHOD_(VOID, SetMinimumDataThreshold)(THIS_
-        IN ULONG MinimumDataThreshold) PURE;
-    STDMETHOD_(ULONG, GetMinimumDataThreshold)(THIS) PURE;
+
+    STDMETHOD_(BOOLEAN, GetAcquiredTagRange)(THIS_
+        IN PVOID * FirstTag,
+        IN PVOID * LastTag);
+
 };
 
 
 #define IMP_IIrpQueue                                  \
     STDMETHODIMP_(NTSTATUS) Init(THIS_                 \
         IN KSPIN_CONNECT *ConnectDetails,              \
-        IN PKSDATAFORMAT DataFormat,                   \
-        IN PDEVICE_OBJECT DeviceObject,                \
         IN ULONG FrameSize,                            \
         IN ULONG Alignment,                            \
         IN PVOID SilenceBuffer);                       \
@@ -386,17 +377,10 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
     STDMETHODIMP_(VOID) UpdateMapping(THIS_            \
         IN ULONG BytesWritten);                        \
                                                        \
-    STDMETHODIMP_(ULONG) NumMappings(THIS);            \
-                                                       \
     STDMETHODIMP_(ULONG) NumData(THIS);                \
                                                        \
-    STDMETHODIMP_(BOOL) MinimumDataAvailable(THIS);    \
-                                                       \
     STDMETHODIMP_(BOOL) CancelBuffers(THIS);           \
                                                        \
-    STDMETHODIMP_(VOID) UpdateFormat(THIS_             \
-        IN PKSDATAFORMAT DataFormat);                  \
-                                                       \
     STDMETHODIMP_(NTSTATUS) GetMappingWithTag(THIS_    \
         IN PVOID Tag,                                  \
         OUT PPHYSICAL_ADDRESS  PhysicalAddress,        \
@@ -407,11 +391,13 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
     STDMETHODIMP_(NTSTATUS) ReleaseMappingWithTag(     \
         IN PVOID Tag);                                 \
                                                        \
-    STDMETHODIMP_(BOOL) HasLastMappingFailed(THIS);    \
+    STDMETHODIMP_(BOOLEAN) HasLastMappingFailed(THIS); \
     STDMETHODIMP_(ULONG) GetCurrentIrpOffset(THIS);    \
-    STDMETHODIMP_(VOID) SetMinimumDataThreshold(       \
-        IN ULONG MinimumDataThreshold);                \
-    STDMETHODIMP_(ULONG) GetMinimumDataThreshold(VOID)
+    STDMETHODIMP_(BOOLEAN) GetAcquiredTagRange(THIS_      \
+        IN PVOID * FirstTag,                           \
+        IN PVOID * LastTag);
+
+
 
 /*****************************************************************************
  * IKsWorkSink
index aaa707b..50d55fb 100644 (file)
@@ -38,10 +38,7 @@ protected:
     volatile ULONG m_CurrentOffset;
     LONG m_NumMappings;
     ULONG m_NumDataAvailable;
-    BOOL m_StartStream;
     PKSPIN_CONNECT m_ConnectDetails;
-    PKSDATAFORMAT_WAVEFORMATEX m_DataFormat;
-
     KSPIN_LOCK m_IrpListLock;
     LIST_ENTRY m_IrpList;
     LIST_ENTRY m_FreeIrpList;
@@ -51,7 +48,6 @@ protected:
     ULONG m_OutOfMapping;
     ULONG m_MaxFrameSize;
     ULONG m_Alignment;
-    ULONG m_MinimumDataThreshold;
 
     LONG m_Ref;
 
@@ -87,18 +83,14 @@ NTSTATUS
 NTAPI
 CIrpQueue::Init(
     IN KSPIN_CONNECT *ConnectDetails,
-    IN PKSDATAFORMAT DataFormat,
-    IN PDEVICE_OBJECT DeviceObject,
     IN ULONG FrameSize,
     IN ULONG Alignment,
     IN PVOID SilenceBuffer)
 {
     m_ConnectDetails = ConnectDetails;
-    m_DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
     m_MaxFrameSize = FrameSize;
     m_SilenceBuffer = SilenceBuffer;
     m_Alignment = Alignment;
-    m_MinimumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)DataFormat)->WaveFormatEx.nAvgBytesPerSec / 3;
 
     InitializeListHead(&m_IrpList);
     InitializeListHead(&m_FreeIrpList);
@@ -225,6 +217,9 @@ CIrpQueue::AddMapping(
     // add irp to cancelable queue
     KsAddIrpToCancelableQueue(&m_IrpList, &m_IrpListLock, Irp, KsListEntryTail, NULL);
 
+    // disable mapping failed status
+    m_OutOfMapping = FALSE;
+
     // done
     return Status;
 }
@@ -270,10 +265,6 @@ CIrpQueue::GetMapping(
         // no irp available, use silence buffer
         *Buffer = (PUCHAR)m_SilenceBuffer;
         *BufferSize = m_MaxFrameSize;
-        // flag for port wave pci driver
-        m_OutOfMapping = TRUE;
-        // indicate flag to restart fast buffering
-        m_StartStream = FALSE;
         return STATUS_SUCCESS;
     }
 
@@ -410,15 +401,6 @@ CIrpQueue::UpdateMapping(
     }
 }
 
-ULONG
-NTAPI
-CIrpQueue::NumMappings()
-{
-
-    // returns the amount of mappings available
-    return m_NumMappings;
-}
-
 ULONG
 NTAPI
 CIrpQueue::NumData()
@@ -427,28 +409,6 @@ CIrpQueue::NumData()
     return m_NumDataAvailable;
 }
 
-
-BOOL
-NTAPI
-CIrpQueue::MinimumDataAvailable()
-{
-    BOOL Result;
-
-    if (m_StartStream)
-        return TRUE;
-
-    if (m_MinimumDataThreshold < m_NumDataAvailable)
-    {
-        m_StartStream = TRUE;
-        Result = TRUE;
-    }
-    else
-    {
-        Result = FALSE;
-    }
-    return Result;
-}
-
 BOOL
 NTAPI
 CIrpQueue::CancelBuffers()
@@ -464,23 +424,15 @@ CIrpQueue::CancelBuffers()
 
     // cancel all irps
     KsCancelIo(&m_IrpList, &m_IrpListLock);
-    // reset stream start flag
-    m_StartStream = FALSE;
+    // reset number of mappings
+    m_NumMappings = 0;
+    // reset number of data available
+    m_NumDataAvailable = 0;
+
     // done
     return TRUE;
 }
 
-VOID
-NTAPI
-CIrpQueue::UpdateFormat(
-    PKSDATAFORMAT DataFormat)
-{
-    m_DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
-    m_MinimumDataThreshold = m_DataFormat->WaveFormatEx.nAvgBytesPerSec / 3;
-    m_StartStream = FALSE;
-    m_NumDataAvailable = 0;
-}
-
 NTSTATUS
 NTAPI
 CIrpQueue::GetMappingWithTag(
@@ -504,8 +456,7 @@ CIrpQueue::GetMappingWithTag(
     {
         // no irp available
         m_OutOfMapping = TRUE;
-        m_StartStream = FALSE;
-        return STATUS_UNSUCCESSFUL;
+        return STATUS_NOT_FOUND;
     }
 
     //FIXME support more than one stream header
@@ -567,16 +518,13 @@ CIrpQueue::ReleaseMappingWithTag(
     
     Irp->IoStatus.Information = StreamHeader->FrameExtent;
 
-    // free stream header, no tag as wdmaud.drv allocates it atm
-    ExFreePool(StreamHeader);
-
     // complete the request
     IoCompleteRequest(Irp, IO_SOUND_INCREMENT);
 
     return STATUS_SUCCESS;
 }
 
-BOOL
+BOOLEAN
 NTAPI
 CIrpQueue::HasLastMappingFailed()
 {
@@ -591,22 +539,52 @@ CIrpQueue::GetCurrentIrpOffset()
     return m_CurrentOffset;
 }
 
-VOID
+BOOLEAN
 NTAPI
-CIrpQueue::SetMinimumDataThreshold(
-    ULONG MinimumDataThreshold)
+CIrpQueue::GetAcquiredTagRange(
+    IN PVOID * FirstTag,
+    IN PVOID * LastTag)
 {
+    KIRQL OldLevel;
+    BOOLEAN Ret = FALSE;
+    PIRP Irp;
+    PLIST_ENTRY CurEntry;
 
-    m_MinimumDataThreshold = MinimumDataThreshold;
-}
+    KeAcquireSpinLock(&m_IrpListLock, &OldLevel);
 
-ULONG
-NTAPI
-CIrpQueue::GetMinimumDataThreshold()
-{
-    return m_MinimumDataThreshold;
-}
+    if (!IsListEmpty(&m_FreeIrpList))
+    {
+        // get first entry
+        CurEntry = RemoveHeadList(&m_FreeIrpList);
+        // get irp from list entry
+        Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry);
+
+        // get tag of first acquired buffer
+        *FirstTag = Irp->Tail.Overlay.DriverContext[3];
+
+        // put back irp
+        InsertHeadList(&m_FreeIrpList, &Irp->Tail.Overlay.ListEntry);
+
+        // get last entry
+        CurEntry = RemoveTailList(&m_FreeIrpList);
+        // get irp from list entry
+        Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry);
 
+        // get tag of first acquired buffer
+        *LastTag = Irp->Tail.Overlay.DriverContext[3];
+
+        // put back irp
+        InsertTailList(&m_FreeIrpList, &Irp->Tail.Overlay.ListEntry);
+
+        // indicate success
+        Ret = TRUE;
+    }
+
+    // release lock
+    KeReleaseSpinLock(&m_IrpListLock, OldLevel);
+    // done
+    return Ret;
+}
 
 NTSTATUS
 NTAPI
index 07395ae..da6e98d 100644 (file)
@@ -41,9 +41,6 @@ protected:
     VOID TransferMidiDataToDMus();
     VOID TransferMidiData();
 
-    VOID NTAPI SetStreamState(IN KSSTATE State);
-
-
     IPortDMus * m_Port;
     IPortFilterDMus * m_Filter;
     KSPIN_DESCRIPTOR * m_KsPinDescriptor;
@@ -75,10 +72,6 @@ protected:
     ULONG m_LastTag;
 
     LONG m_Ref;
-
-    friend VOID NTAPI SetStreamWorkerRoutineDMus(IN PDEVICE_OBJECT  DeviceObject, IN PVOID  Context);
-    friend VOID NTAPI CloseStreamRoutineDMus(IN PDEVICE_OBJECT  DeviceObject, IN PVOID Context);
-
 };
 
 typedef struct
@@ -198,92 +191,6 @@ CPortPinDMus::DisconnectOutput(
 
 //==================================================================================================================================
 
-VOID
-NTAPI
-SetStreamWorkerRoutineDMus(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PVOID  Context)
-{
-    CPortPinDMus* This;
-    KSSTATE State;
-    NTSTATUS Status;
-    PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context;
-
-    This = Ctx->Pin;
-    State = Ctx->State;
-
-    IoFreeWorkItem(Ctx->WorkItem);
-    FreeItem(Ctx, TAG_PORTCLASS);
-
-    // Has the audio stream resumed?
-    if (This->m_IrpQueue->NumMappings() && State == KSSTATE_STOP)
-        return;
-
-    // Set the state
-    if (This->m_MidiStream)
-    {
-        Status = This->m_MidiStream->SetState(State);
-    }
-    else
-    {
-        Status = This->m_Mxf->SetState(State);
-    }
-
-    if (NT_SUCCESS(Status))
-    {
-        // Set internal state to requested state
-        This->m_State = State;
-
-        if (This->m_State == KSSTATE_STOP)
-        {
-            // reset start stream
-            This->m_IrpQueue->CancelBuffers(); //FIX function name
-            DPRINT("Stopping PreCompleted %u PostCompleted %u\n", This->m_PreCompleted, This->m_PostCompleted);
-        }
-    }
-}
-
-VOID
-NTAPI
-CPortPinDMus::SetStreamState(
-   IN KSSTATE State)
-{
-    PIO_WORKITEM WorkItem;
-    PSETSTREAM_CONTEXT Context;
-
-    PC_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
-
-    // Has the audio stream resumed?
-    if (m_IrpQueue->NumMappings() && State == KSSTATE_STOP)
-        return;
-
-    // Has the audio state already been set?
-    if (m_State == State)
-        return;
-
-    // allocate set state context
-    Context = (PSETSTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(SETSTREAM_CONTEXT), TAG_PORTCLASS);
-
-    if (!Context)
-        return;
-
-    // allocate work item
-    WorkItem = IoAllocateWorkItem(m_DeviceObject);
-
-    if (!WorkItem)
-    {
-        ExFreePool(Context);
-        return;
-    }
-
-    Context->Pin = this;
-    Context->WorkItem = WorkItem;
-    Context->State = State;
-
-    // queue the work item
-    IoQueueWorkItem(WorkItem, SetStreamWorkerRoutineDMus, DelayedWorkQueue, (PVOID)Context);
-}
-
 VOID
 CPortPinDMus::TransferMidiData()
 {
@@ -297,7 +204,6 @@ CPortPinDMus::TransferMidiData()
         Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
         if (!NT_SUCCESS(Status))
         {
-            SetStreamState(KSSTATE_STOP);
             return;
         }
 
@@ -375,7 +281,6 @@ CPortPinDMus::TransferMidiDataToDMus()
 
     if (!Root)
     {
-        SetStreamState(KSSTATE_STOP);
         return;
     }
 
@@ -482,128 +387,59 @@ CPortPinDMus::Flush(
     return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
 }
 
-
-VOID
+NTSTATUS
 NTAPI
-CloseStreamRoutineDMus(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PVOID Context)
+CPortPinDMus::Close(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
 {
-    PMINIPORTMIDISTREAM Stream = NULL;
     NTSTATUS Status;
-    ISubdevice *ISubDevice;
+    ISubdevice * SubDevice;
     PSUBDEVICE_DESCRIPTOR Descriptor;
-    CPortPinDMus * This;
-    PCLOSESTREAM_CONTEXT Ctx = (PCLOSESTREAM_CONTEXT)Context;
-
-    This = (CPortPinDMus*)Ctx->Pin;
 
-    if (This->m_MidiStream)
+    if (m_ServiceGroup)
     {
-        if (This->m_State != KSSTATE_STOP)
-        {
-            This->m_MidiStream->SetState(KSSTATE_STOP);
-        }
-        Stream = This->m_MidiStream;
-        This->m_MidiStream = NULL;
+        m_ServiceGroup->RemoveMember(PSERVICESINK(this));
     }
 
-    if (This->m_ServiceGroup)
+    if (m_MidiStream)
     {
-        This->m_ServiceGroup->RemoveMember(PSERVICESINK(This));
+        if (m_State != KSSTATE_STOP)
+        {
+            m_MidiStream->SetState(KSSTATE_STOP);
+            m_State = KSSTATE_STOP;
+        }
+        DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql());
+        m_MidiStream->Release();
     }
 
-    Status = This->m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice);
+    Status = m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&SubDevice);
     if (NT_SUCCESS(Status))
     {
-        Status = ISubDevice->GetDescriptor(&Descriptor);
+        Status = SubDevice->GetDescriptor(&Descriptor);
         if (NT_SUCCESS(Status))
         {
-            Descriptor->Factory.Instances[This->m_ConnectDetails->PinId].CurrentPinInstanceCount--;
-            ISubDevice->Release();
+            // release reference count
+            Descriptor->Factory.Instances[m_ConnectDetails->PinId].CurrentPinInstanceCount--;
         }
+        SubDevice->Release();
     }
 
-    if (This->m_Format)
+    if (m_Format)
     {
-        ExFreePool(This->m_Format);
-        This->m_Format = NULL;
+        ExFreePool(m_Format);
+        m_Format = NULL;
     }
 
     // complete the irp
-    Ctx->Irp->IoStatus.Information = 0;
-    Ctx->Irp->IoStatus.Status = STATUS_SUCCESS;
-    IoCompleteRequest(Ctx->Irp, IO_NO_INCREMENT);
-
-    // free the work item
-    IoFreeWorkItem(Ctx->WorkItem);
-
-    // free work item ctx
-    FreeItem(Ctx, TAG_PORTCLASS);
-
-    // destroy DMus pin
-    This->m_Filter->FreePin(PPORTPINDMUS(This));
-
-    if (Stream)
-    {
-        DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql());
-        Stream->Release();
-    }
-}
-
-NTSTATUS
-NTAPI
-CPortPinDMus::Close(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN PIRP Irp)
-{
-    PCLOSESTREAM_CONTEXT Ctx;
-
-    if (m_MidiStream || m_Mxf)
-    {
-        Ctx = (PCLOSESTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(CLOSESTREAM_CONTEXT), TAG_PORTCLASS);
-        if (!Ctx)
-        {
-            DPRINT("Failed to allocate stream context\n");
-            goto cleanup;
-        }
-
-        Ctx->WorkItem = IoAllocateWorkItem(DeviceObject);
-        if (!Ctx->WorkItem)
-        {
-            DPRINT("Failed to allocate work item\n");
-            goto cleanup;
-        }
-
-        Ctx->Irp = Irp;
-        Ctx->Pin = this;
-
-        IoMarkIrpPending(Irp);
-        Irp->IoStatus.Information = 0;
-        Irp->IoStatus.Status = STATUS_PENDING;
-
-        // defer work item
-        IoQueueWorkItem(Ctx->WorkItem, CloseStreamRoutineDMus, DelayedWorkQueue, (PVOID)Ctx);
-        // Return result
-        return STATUS_PENDING;
-    }
-
     Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = STATUS_SUCCESS;
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-    return STATUS_SUCCESS;
-
-cleanup:
-
-    if (Ctx)
-        FreeItem(Ctx, TAG_PORTCLASS);
-
-    Irp->IoStatus.Information = 0;
-    Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return STATUS_UNSUCCESSFUL;
+    // destroy DMus pin
+    m_Filter->FreePin(PPORTPINDMUS(this));
 
+    return STATUS_SUCCESS;
 }
 
 NTSTATUS
@@ -769,7 +605,7 @@ CPortPinDMus::Init(
         m_ServiceGroup->SupportDelayedService();
     }
 
-    Status = m_IrpQueue->Init(ConnectDetails, m_Format, DeviceObject, 0, 0, NULL);
+    Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL);
     if (!NT_SUCCESS(Status))
     {
         DPRINT("IrpQueue_Init failed with %x\n", Status);
index 14be43f..ff02905 100644 (file)
@@ -347,7 +347,6 @@ PinWaveCyclicAudioPosition(
             DPRINT("Play %lu Write %lu\n", Position->PlayOffset, Position->WriteOffset);
         }
 
-
         Irp->IoStatus.Information = sizeof(KSAUDIO_POSITION);
         return STATUS_SUCCESS;
     }
@@ -450,10 +449,14 @@ PinWaveCyclicState(
                 // FIXME
                 // complete with successful state
                 Pin->m_IrpQueue->CancelBuffers();
+                Pin->m_Position.PlayOffset = 0;
+                Pin->m_Position.WriteOffset = 0;
             }
             else if (Pin->m_State == KSSTATE_STOP)
             {
                 Pin->m_IrpQueue->CancelBuffers();
+                Pin->m_Position.PlayOffset = 0;
+                Pin->m_Position.WriteOffset = 0;
             }
             // store result
             Irp->IoStatus.Information = sizeof(KSSTATE);
@@ -539,9 +542,6 @@ PinWaveCyclicDataFormat(
             // free old format
             FreeItem(Pin->m_Format, TAG_PORTCLASS);
 
-            // update irp queue with new format
-            Pin->m_IrpQueue->UpdateFormat((PKSDATAFORMAT)NewDataFormat);
-
             // store new format
             Pin->m_Format = NewDataFormat;
             Irp->IoStatus.Information = NewDataFormat->FormatSize;
@@ -693,8 +693,11 @@ CPortPinWaveCyclic::UpdateCommonBuffer(
 
         if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING)
         {
-            // normalize position
-            m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset;
+            if (m_Position.WriteOffset)
+            {
+                // normalize position
+                m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset;
+            }
         }
     }
 }
@@ -742,8 +745,11 @@ CPortPinWaveCyclic::UpdateCommonBufferOverlap(
 
         if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING)
         {
-            // normalize position
-            m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset;
+            if (m_Position.WriteOffset)
+            {
+                // normalize position
+                m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset;
+            }
         }
 
     }
@@ -773,29 +779,32 @@ CPortPinWaveCyclic::RequestService()
 
     PC_ASSERT_IRQL(DISPATCH_LEVEL);
 
-    Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
-    if (!NT_SUCCESS(Status))
+    if (m_State == KSSTATE_RUN)
     {
-        return;
-    }
+        Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize);
+        if (!NT_SUCCESS(Status))
+        {
+            return;
+        }
 
-    Status = m_Stream->GetPosition(&Position);
-    DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture);
+        Status = m_Stream->GetPosition(&Position);
+        DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture);
 
-    OldOffset = m_Position.PlayOffset;
+        OldOffset = m_Position.PlayOffset;
 
-    if (Position < m_CommonBufferOffset)
-    {
-        UpdateCommonBufferOverlap(Position, m_FrameSize);
-    }
-    else if (Position >= m_CommonBufferOffset)
-    {
-        UpdateCommonBuffer(Position, m_FrameSize);
-    }
+        if (Position < m_CommonBufferOffset)
+        {
+            UpdateCommonBufferOverlap(Position, m_FrameSize);
+        }
+        else if (Position >= m_CommonBufferOffset)
+        {
+            UpdateCommonBuffer(Position, m_FrameSize);
+        }
 
-    NewOffset = m_Position.PlayOffset;
+        NewOffset = m_Position.PlayOffset;
 
-    GeneratePositionEvents(OldOffset, NewOffset);
+        GeneratePositionEvents(OldOffset, NewOffset);
+    }
 }
 
 NTSTATUS
@@ -1232,7 +1241,7 @@ CPortPinWaveCyclic::Init(
     m_Stream->Silence(SilenceBuffer, m_FrameSize);
     m_Stream->Silence(m_CommonBuffer, m_CommonBufferSize);
 
-    Status = m_IrpQueue->Init(ConnectDetails, DataFormat, DeviceObject, m_FrameSize, 0, SilenceBuffer);
+    Status = m_IrpQueue->Init(ConnectDetails, m_FrameSize, 0, SilenceBuffer);
     if (!NT_SUCCESS(Status))
     {
        m_IrpQueue->Release();
index 273bfae..935ece8 100644 (file)
@@ -36,9 +36,6 @@ public:
     IMP_IPortWavePciStream;
     CPortPinWavePci(IUnknown *OuterUnknown) {}
     virtual ~CPortPinWavePci(){}
-
-    VOID NTAPI SetState( IN KSSTATE State);
-    VOID NTAPI CloseStream();
 protected:
 
     friend NTSTATUS NTAPI PinWavePciState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
@@ -77,9 +74,6 @@ protected:
 
     NTSTATUS NTAPI HandleKsProperty(IN PIRP Irp);
     NTSTATUS NTAPI HandleKsStream(IN PIRP Irp);
-
-
-    VOID NTAPI SetStreamState( IN KSSTATE State);
 };
 
 typedef struct
@@ -201,6 +195,8 @@ PinWavePciState(
     NTSTATUS Status = STATUS_UNSUCCESSFUL;
     CPortPinWavePci *Pin;
     PSUBDEVICE_DESCRIPTOR Descriptor;
+    PVOID FirstTag, LastTag;
+    ULONG MappingsRevoked;
     PKSSTATE State = (PKSSTATE)Data;
 
     // get sub device descriptor 
@@ -227,6 +223,35 @@ PinWavePciState(
         {
             // store new state
             Pin->m_State = *State;
+            if (Pin->m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING && Pin->m_State == KSSTATE_STOP)
+            {
+                // FIXME
+                // complete with successful state
+                Pin->m_IrpQueue->CancelBuffers();
+                while(Pin->m_IrpQueue->GetAcquiredTagRange(&FirstTag, &LastTag))
+                {
+                    Status = Pin->m_Stream->RevokeMappings(FirstTag, LastTag, &MappingsRevoked);
+                    DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status, MappingsRevoked);
+                    KeStallExecutionProcessor(10);
+                }
+                Pin->m_Position.PlayOffset = 0;
+                Pin->m_Position.WriteOffset = 0;
+            }
+            else if (Pin->m_State == KSSTATE_STOP)
+            {
+                Pin->m_IrpQueue->CancelBuffers();
+                while(Pin->m_IrpQueue->GetAcquiredTagRange(&FirstTag, &LastTag))
+                {
+                    Status = Pin->m_Stream->RevokeMappings(FirstTag, LastTag, &MappingsRevoked);
+                    DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status, MappingsRevoked);
+                    KeStallExecutionProcessor(10);
+                }
+                Pin->m_Position.PlayOffset = 0;
+                Pin->m_Position.WriteOffset = 0;
+            }
+            // store result
+            Irp->IoStatus.Information = sizeof(KSSTATE);
+
         }
         // store result
         Irp->IoStatus.Information = sizeof(KSSTATE);
@@ -311,9 +336,6 @@ PinWavePciDataFormat(
             // free old format
             FreeItem(Pin->m_Format, TAG_PORTCLASS);
 
-            // update irp queue with new format
-            Pin->m_IrpQueue->UpdateFormat((PKSDATAFORMAT)NewDataFormat);
-
             // store new format
             Pin->m_Format = NewDataFormat;
             Irp->IoStatus.Information = NewDataFormat->FormatSize;
@@ -373,7 +395,7 @@ CPortPinWavePci::QueryInterface(
     IN  REFIID refiid,
     OUT PVOID* Output)
 {
-    DPRINT("CPortPinWavePci::QueryInterface entered\n");
+    //DPRINT("CPortPinWavePci::QueryInterface entered\n");
 
     if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) || 
         IsEqualGUIDAligned(refiid, IID_IUnknown))
@@ -435,137 +457,18 @@ CPortPinWavePci::TerminatePacket()
 }
 
 
-VOID
-CPortPinWavePci::SetState(KSSTATE State)
-{
-    ULONG MinimumDataThreshold;
-    ULONG MaximumDataThreshold;
-
-    // Has the audio stream resumed?
-    if (m_IrpQueue->NumMappings() && State == KSSTATE_STOP)
-        return;
-
-    // Set the state
-    if (NT_SUCCESS(m_Stream->SetState(State)))
-    {
-        // Save new internal state
-        m_State = State;
-
-        if (m_State == KSSTATE_STOP)
-        {
-            // reset start stream
-            m_IrpQueue->CancelBuffers(); //FIX function name
-            //This->ServiceGroup->lpVtbl->CancelDelayedService(This->ServiceGroup);
-            // increase stop counter
-            m_StopCount++;
-            // get current data threshold
-            MinimumDataThreshold = m_IrpQueue->GetMinimumDataThreshold();
-            // get maximum data threshold
-            MaximumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)m_Format)->WaveFormatEx.nAvgBytesPerSec;
-            // increase minimum data threshold by 10 frames
-            MinimumDataThreshold += m_AllocatorFraming.FrameSize * 10;
-
-            // assure it has not exceeded
-            MinimumDataThreshold = min(MinimumDataThreshold, MaximumDataThreshold);
-            // store minimum data threshold
-            m_IrpQueue->SetMinimumDataThreshold(MinimumDataThreshold);
-
-            DPRINT("Stopping TotalCompleted %u StopCount %u MinimumDataThreshold %u\n", m_TotalPackets, m_StopCount, MinimumDataThreshold);
-        }
-        if (m_State == KSSTATE_RUN)
-        {
-            // start the notification timer
-            //m_ServiceGroup->RequestDelayedService(m_ServiceGroup, m_Delay);
-        }
-    }
-
-
-}
-
-VOID
-NTAPI
-PinWavePciSetStreamWorkerRoutine(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PVOID  Context)
-{
-    CPortPinWavePci * This;
-    PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context;
-    KSSTATE State;
-
-    This = Ctx->Pin;
-    State = Ctx->State;
-
-    IoFreeWorkItem(Ctx->WorkItem);
-    FreeItem(Ctx, TAG_PORTCLASS);
-
-    This->SetState(State);
-}
-
-VOID
-NTAPI
-CPortPinWavePci::SetStreamState(
-   IN KSSTATE State)
-{
-    PDEVICE_OBJECT DeviceObject;
-    PIO_WORKITEM WorkItem;
-    PSETSTREAM_CONTEXT Context;
-
-    PC_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
-
-    // Has the audio stream resumed?
-    if (m_IrpQueue->NumMappings() && State == KSSTATE_STOP)
-        return;
-
-    // Has the audio state already been set?
-    if (m_State == State)
-        return;
-
-    // Get device object
-    DeviceObject = GetDeviceObjectFromPortWavePci(m_Port);
-
-    // allocate set state context
-    Context = (PSETSTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(SETSTREAM_CONTEXT), TAG_PORTCLASS);
-
-    if (!Context)
-        return;
-
-    // allocate work item
-    WorkItem = IoAllocateWorkItem(DeviceObject);
-
-    if (!WorkItem)
-    {
-        ExFreePool(Context);
-        return;
-    }
-
-    Context->Pin = this;
-    Context->WorkItem = WorkItem;
-    Context->State = State;
-
-    // queue the work item
-    IoQueueWorkItem(WorkItem, PinWavePciSetStreamWorkerRoutine, DelayedWorkQueue, (PVOID)Context);
-}
-
-
 VOID
 NTAPI
 CPortPinWavePci::RequestService()
 {
     PC_ASSERT_IRQL(DISPATCH_LEVEL);
 
-    if (m_IrpQueue->HasLastMappingFailed())
+    if (m_State == KSSTATE_RUN)
     {
-        if (m_IrpQueue->NumMappings() == 0)
-        {
-            DPRINT("Stopping stream...\n");
-            SetStreamState(KSSTATE_STOP);
-            return;
-        }
+        m_Stream->Service();
+        //TODO
+        //generate events
     }
-
-    m_Stream->Service();
-    //TODO
-    //generate events
 }
 
 //==================================================================================================================================
@@ -597,18 +500,18 @@ CPortPinWavePci::HandleKsProperty(
 {
     PKSPROPERTY Property;
     NTSTATUS Status;
-    UNICODE_STRING GuidString;
+    //UNICODE_STRING GuidString;
     PIO_STACK_LOCATION IoStack;
 
     IoStack = IoGetCurrentIrpStackLocation(Irp);
 
-    DPRINT("IPortPinWave_HandleKsProperty entered\n");
+    //DPRINT("IPortPinWave_HandleKsProperty entered\n");
 
     IoStack = IoGetCurrentIrpStackLocation(Irp);
 
     if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY)
     {
-        DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength);
+        //DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength);
         
         Irp->IoStatus.Status = STATUS_SUCCESS;
 
@@ -621,10 +524,11 @@ CPortPinWavePci::HandleKsProperty(
     if (Status == STATUS_NOT_FOUND)
     {
         Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
-
+#if 0
         RtlStringFromGUID(Property->Set, &GuidString);
-        DPRINT("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
+        //DPRINT("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
         RtlFreeUnicodeString(&GuidString);
+#endif
     }
 
     if (Status != STATUS_PENDING)
@@ -636,29 +540,6 @@ CPortPinWavePci::HandleKsProperty(
     return Status;
 }
 
-#if 0
-        else if (Property->Id == KSPROPERTY_CONNECTION_ALLOCATORFRAMING)
-        {
-            PKSALLOCATOR_FRAMING Framing = (PKSALLOCATOR_FRAMING)OutputBuffer;
-
-            PC_ASSERT_IRQL(DISPATCH_LEVEL);
-            // Validate input buffer
-            if (OutputBufferLength < sizeof(KSALLOCATOR_FRAMING))
-            {
-                IoStatusBlock->Information = sizeof(KSALLOCATOR_FRAMING);
-                IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL;
-                return STATUS_BUFFER_TOO_SMALL;
-            }
-            // copy frame allocator struct
-            RtlMoveMemory(Framing, &m_AllocatorFraming, sizeof(KSALLOCATOR_FRAMING));
-
-            IoStatusBlock->Information = sizeof(KSALLOCATOR_FRAMING);
-            IoStatusBlock->Status = STATUS_SUCCESS;
-            return STATUS_SUCCESS;
-        }
-    }
-#endif
-
 NTSTATUS
 NTAPI
 CPortPinWavePci::HandleKsStream(
@@ -666,10 +547,13 @@ CPortPinWavePci::HandleKsStream(
 {
     NTSTATUS Status;
     ULONG Data = 0;
+    BOOLEAN bFailed;
     InterlockedIncrement((PLONG)&m_TotalPackets);
 
     DPRINT("IPortPinWaveCyclic_HandleKsStream entered Total %u State %x MinData %u\n", m_TotalPackets, m_State, m_IrpQueue->NumData());
 
+    bFailed = m_IrpQueue->HasLastMappingFailed();
+
     Status = m_IrpQueue->AddMapping(Irp, &Data);
 
     if (NT_SUCCESS(Status))
@@ -679,6 +563,12 @@ CPortPinWavePci::HandleKsStream(
         else
             m_Position.WriteOffset += Data;
 
+        if (bFailed)
+        {
+            // notify stream of new mapping
+            m_Stream->MappingAvailable();
+        }
+
         return STATUS_PENDING;
     }
 
@@ -741,37 +631,39 @@ CPortPinWavePci::Flush(
     return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
 }
 
-VOID
+NTSTATUS
 NTAPI
-CPortPinWavePci::CloseStream()
+CPortPinWavePci::Close(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
 {
-    PMINIPORTWAVEPCISTREAM Stream;
-    ISubdevice *ISubDevice;
+    ISubdevice *SubDevice;
     NTSTATUS Status;
     PSUBDEVICE_DESCRIPTOR Descriptor;
 
+    if (m_ServiceGroup)
+    {
+        m_ServiceGroup->RemoveMember(PSERVICESINK(this));
+    }
+
     if (m_Stream)
     {
         if (m_State != KSSTATE_STOP)
         {
             m_Stream->SetState(KSSTATE_STOP);
         }
+        m_Stream->Release();
     }
 
-    if (m_ServiceGroup)
-    {
-        m_ServiceGroup->RemoveMember(PSERVICESINK(this));
-    }
-
-    Status = m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice);
+    Status = m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&SubDevice);
     if (NT_SUCCESS(Status))
     {
-        Status = ISubDevice->GetDescriptor(&Descriptor);
+        Status = SubDevice->GetDescriptor(&Descriptor);
         if (NT_SUCCESS(Status))
         {
             Descriptor->Factory.Instances[m_ConnectDetails->PinId].CurrentPinInstanceCount--;
         }
-        ISubDevice->Release();
+        SubDevice->Release();
     }
 
     if (m_Format)
@@ -780,93 +672,11 @@ CPortPinWavePci::CloseStream()
         m_Format = NULL;
     }
 
-    if (m_Stream)
-    {
-        Stream = m_Stream;
-        m_Stream = 0;
-        DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql());
-        Stream->Release();
-    }
-}
-
-VOID
-NTAPI
-PinWavePciCloseStreamRoutine(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PVOID Context)
-{
-    CPortPinWavePci * This;
-    PCLOSESTREAM_CONTEXT Ctx = (PCLOSESTREAM_CONTEXT)Context;
-
-    This = (CPortPinWavePci*)Ctx->Pin;
-
-    This->CloseStream();
-
-    // complete the irp
-    Ctx->Irp->IoStatus.Information = 0;
-    Ctx->Irp->IoStatus.Status = STATUS_SUCCESS;
-    IoCompleteRequest(Ctx->Irp, IO_NO_INCREMENT);
-
-    // free the work item
-    IoFreeWorkItem(Ctx->WorkItem);
-
-    // free work item ctx
-    FreeItem(Ctx, TAG_PORTCLASS);
-}
-
-NTSTATUS
-NTAPI
-CPortPinWavePci::Close(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN PIRP Irp)
-{
-    PCLOSESTREAM_CONTEXT Ctx;
-
-    if (m_Stream)
-    {
-        Ctx = (PCLOSESTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(CLOSESTREAM_CONTEXT), TAG_PORTCLASS);
-        if (!Ctx)
-        {
-            DPRINT("Failed to allocate stream context\n");
-            goto cleanup;
-        }
-
-        Ctx->WorkItem = IoAllocateWorkItem(DeviceObject);
-        if (!Ctx->WorkItem)
-        {
-            DPRINT("Failed to allocate work item\n");
-            goto cleanup;
-        }
-
-        Ctx->Irp = Irp;
-        Ctx->Pin = (PVOID)this;
-
-        IoMarkIrpPending(Irp);
-        Irp->IoStatus.Information = 0;
-        Irp->IoStatus.Status = STATUS_PENDING;
-
-        // defer work item
-        IoQueueWorkItem(Ctx->WorkItem, PinWavePciCloseStreamRoutine, DelayedWorkQueue, (PVOID)Ctx);
-        // Return result
-        return STATUS_PENDING;
-    }
-
-    Irp->IoStatus.Information = 0;
     Irp->IoStatus.Status = STATUS_SUCCESS;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return STATUS_SUCCESS;
-
-cleanup:
-
-    if (Ctx)
-        FreeItem(Ctx, TAG_PORTCLASS);
-
     Irp->IoStatus.Information = 0;
-    Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return STATUS_UNSUCCESSFUL;
 
+    return STATUS_SUCCESS;
 }
 
 NTSTATUS
@@ -1053,7 +863,7 @@ CPortPinWavePci::Init(
     if (!NT_SUCCESS(Status))
         return Status;
 
-    Status = m_IrpQueue->Init(ConnectDetails, m_Format, DeviceObject, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment, NULL);
+    Status = m_IrpQueue->Init(ConnectDetails, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment, NULL);
     if (!NT_SUCCESS(Status))
     {
         DPRINT("IrpQueue_Init failed with %x\n", Status);
index e325e49..0aa281d 100644 (file)
@@ -100,91 +100,6 @@ CPortPinWaveRT::QueryInterface(
     return STATUS_UNSUCCESSFUL;
 }
 
-VOID
-NTAPI
-SetStreamWorkerRoutine(
-    IN PDEVICE_OBJECT  DeviceObject,
-    IN PVOID  Context)
-{
-    CPortPinWaveRT * This;
-    PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context;
-    KSSTATE State;
-
-    This = Ctx->Pin;
-    State = Ctx->State;
-
-    IoFreeWorkItem(Ctx->WorkItem);
-    FreeItem(Ctx, TAG_PORTCLASS);
-
-    // Has the audio stream resumed?
-    if (This->m_IrpQueue->NumMappings() && State == KSSTATE_STOP)
-        return;
-
-    // Set the state
-    if (NT_SUCCESS(This->m_Stream->SetState(State)))
-    {
-        // Set internal state to stop
-        This->m_State = State;
-
-        if (This->m_State == KSSTATE_STOP)
-        {
-            // reset start stream
-            This->m_IrpQueue->CancelBuffers(); //FIX function name
-            DPRINT("Stopping PreCompleted %u PostCompleted %u\n", This->m_PreCompleted, This->m_PostCompleted);
-        }
-
-        if (This->m_State == KSSTATE_RUN)
-        {
-            // start the notification timer
-        }
-    }
-}
-
-VOID
-NTAPI
-CPortPinWaveRT::SetStreamState(
-   IN KSSTATE State)
-{
-    PDEVICE_OBJECT DeviceObject;
-    PIO_WORKITEM WorkItem;
-    PSETSTREAM_CONTEXT Context;
-
-    PC_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
-
-    // Has the audio stream resumed?
-    if (m_IrpQueue->NumMappings() && State == KSSTATE_STOP)
-        return;
-
-    // Has the audio state already been set?
-    if (m_State == State)
-        return;
-
-    // Get device object
-    DeviceObject = GetDeviceObjectFromPortWaveRT(m_Port);
-
-    // allocate set state context
-    Context = (PSETSTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(SETSTREAM_CONTEXT), TAG_PORTCLASS);
-
-    if (!Context)
-        return;
-
-    // allocate work item
-    WorkItem = IoAllocateWorkItem(DeviceObject);
-
-    if (!WorkItem)
-    {
-        ExFreePool(Context);
-        return;
-    }
-
-    Context->Pin = this;
-    Context->WorkItem = WorkItem;
-    Context->State = State;
-
-    // queue the work item
-    IoQueueWorkItem(WorkItem, SetStreamWorkerRoutine, DelayedWorkQueue, (PVOID)Context);
-}
-
 //==================================================================================================================================
 
 NTSTATUS
@@ -313,7 +228,6 @@ CPortPinWaveRT::HandleKsProperty(
                         if (m_Format)
                             ExFreePoolWithTag(m_Format, TAG_PORTCLASS);
 
-                        m_IrpQueue->UpdateFormat((PKSDATAFORMAT)NewDataFormat);
                         m_Format = NewDataFormat;
                         Irp->IoStatus.Information = DataFormat->FormatSize;
                         Irp->IoStatus.Status = STATUS_SUCCESS;
@@ -673,7 +587,7 @@ CPortPinWaveRT::Init(
         goto cleanup;
     }
 
-    Status = m_IrpQueue->Init(ConnectDetails, DataFormat, DeviceObject, 0, 0, NULL);
+    Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL);
     if (!NT_SUCCESS(Status))
     {
         goto cleanup;
index 3122dfb..81d6ed9 100644 (file)
@@ -161,8 +161,9 @@ CPortWavePci::QueryInterface(
 
     DPRINT("IPortWavePci_fnQueryInterface entered\n");
 
-    if (IsEqualGUIDAligned(refiid, IID_IPortWavePci) || 
-        IsEqualGUIDAligned(refiid, IID_IUnknown))
+    if (IsEqualGUIDAligned(refiid, IID_IPortWavePci) ||
+        IsEqualGUIDAligned(refiid, IID_IUnknown) ||
+        IsEqualGUIDAligned(refiid, IID_IPort))
     {
         *Output = PVOID(PPORTWAVEPCI(this));
         PUNKNOWN(*Output)->AddRef();
@@ -171,7 +172,7 @@ CPortWavePci::QueryInterface(
     else if (IsEqualGUIDAligned(refiid, IID_IServiceSink))
     {
         *Output = PVOID(PSERVICESINK(this));
-               PUNKNOWN(*Output)->AddRef();
+        PUNKNOWN(*Output)->AddRef();
         return STATUS_SUCCESS;
     }
     else if (IsEqualGUIDAligned(refiid, IID_IPortEvents))
@@ -183,7 +184,7 @@ CPortWavePci::QueryInterface(
     else if (IsEqualGUIDAligned(refiid, IID_ISubdevice))
     {
         *Output = PVOID(PSUBDEVICE(this));
-               PUNKNOWN(*Output)->AddRef();
+        PUNKNOWN(*Output)->AddRef();
         return STATUS_SUCCESS;
     }
     else if (IsEqualGUIDAligned(refiid, IID_IPortClsVersion))
index 4230e55..f3c0b98 100644 (file)
@@ -24,8 +24,8 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
-#ifndef _MAIN_H_
-#define _MAIN_H_
+
+#pragma once
 
 #include <math.h>
 
@@ -78,6 +78,4 @@ CMIDATA   cmiData;
 HWAVEOUT  hWave;
 WAVEHDR   pwh;
 int       currentChannelCount;
-HFONT     hURLFont;
-
-#endif //_MAIN_H_
\ No newline at end of file
+HFONT     hURLFont;
\ No newline at end of file
index c8cefe5..583a24d 100644 (file)
@@ -25,8 +25,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-#ifndef _MAIN_H_
-#define _MAIN_H_
+#pragma once
 
 #include <windows.h>
 #include <newdev.h>
@@ -75,7 +74,4 @@ const char DisplayName[] = _T("CMI 8738/8768 Audio Driver (remove only)");
 const char DisplayIcon[] = _T("\\cmicontrol.exe,0");
 const char Uninstaller[] = _T("\\cmicontrol.exe /uninstall");
 const char Publisher[] = _T("Dogbert <dogber1@gmail.com>");
-const char URLInfoAbout[] = _T("http://cmediadrivers.googlepages.com/");
-
-
-#endif //_MAIN_H_
\ No newline at end of file
+const char URLInfoAbout[] = _T("http://cmediadrivers.googlepages.com/");
\ No newline at end of file
index 7e6593d..4ecb412 100644 (file)
@@ -25,8 +25,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
-#ifndef _PROPERTY_H_
-#define _PROPERTY_H_
+#pragma once
 
 //GUID for the private property
 // {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFF}
@@ -84,5 +83,3 @@ typedef struct
        UInt32  formatMask;
        UInt32  enableSPDI;
 } CMIDATA;
-
-#endif //_PROPERTY_H_
index 70bdc6e..18c82c1 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef KMIXER_H__
-#define KMIXER_H__
+#pragma once
 
 #include <ntddk.h>
 #include <portcls.h>
@@ -35,6 +34,3 @@ KMixAllocateDeviceHeader(
 NTSTATUS
 CreatePin(
     IN PIRP Irp);
-
-
-#endif
index 7492e21..76ad7f1 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef PRECOMP_H__
-#define PRECOMP_H__
+#pragma once
 
 #include <ntddk.h>
 #include <portcls.h>
@@ -65,6 +64,3 @@ typedef struct
     ULONG BytesAvailable;
     ULONG BytesProcessed;
 }PIN_CONTEXT, *PPIN_CONTEXT;
-
-
-#endif
index 635ff00..299df5e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../../../tools/rbuild/project.dtd">
 <module name="splitter" type="kernelmodedriver" installbase="system32/drivers" installname="splitter.sys">
        <library>ntoskrnl</library>
        <library>ks</library>
index 742eaf0..6208d3a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef STREAM_H__
-#define STREAM_H__
+#pragma once
 
 #include <strmini.h>
 #define YDEBUG
@@ -136,5 +135,3 @@ CompleteIrp(
     IN PIRP Irp,
     IN NTSTATUS Status,
     IN ULONG_PTR Information);
-
-#endif
index 9f51bf4..631b861 100644 (file)
@@ -8,17 +8,7 @@
  */
 #include "wdmaud.h"
 
-const GUID KSPROPSETID_Pin                     = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
-const GUID KSPROPSETID_Connection               = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
 const GUID KSPROPSETID_Sysaudio                 = {0xCBE3FAA0L, 0xCC75, 0x11D0, {0xB4, 0x65, 0x00, 0x00, 0x1A, 0x18, 0x18, 0xE6}};
-const GUID KSPROPSETID_General                  = {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
-const GUID KSINTERFACESETID_Standard            = {0x1A8766A0L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
-const GUID KSMEDIUMSETID_Standard               = {0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
-const GUID KSDATAFORMAT_TYPE_AUDIO              = {0x73647561L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
-const GUID KSDATAFORMAT_SUBTYPE_PCM             = {0x00000001L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
-const GUID KSDATAFORMAT_SPECIFIER_WAVEFORMATEX  = {0x05589f81L, 0xc356, 0x11ce, {0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a}};
-const GUID KSPROPSETID_Topology                 = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
-
 
 NTSTATUS
 WdmAudControlOpen(
@@ -55,15 +45,15 @@ WdmAudControlDeviceType(
 
     if (DeviceInfo->DeviceType == MIXER_DEVICE_TYPE)
     {
-        Result = DeviceExtension->MixerInfoCount;
+        Result = WdmAudGetMixerDeviceCount();
     }
     else if (DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE)
     {
-        Result = DeviceExtension->WaveOutDeviceCount;
+        Result = WdmAudGetWaveInDeviceCount();
     }
     else if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE)
     {
-        Result = DeviceExtension->WaveInDeviceCount;
+        Result = WdmAudGetWaveOutDeviceCount();
     }
 
     /* store result count */
@@ -221,7 +211,6 @@ WdmAudGetDeviceInterface(
     PWDMAUD_DEVICE_EXTENSION DeviceExtension;
     NTSTATUS Status;
     LPWSTR Device;
-    LPWAVE_INFO WaveInfo;
     ULONG Size, Length;
 
     /* get device extension */
@@ -233,16 +222,8 @@ WdmAudGetDeviceInterface(
     if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE || DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE)
     {
         /* get wave info */
-        Status = GetWaveInfoByIndexAndType(DeviceObject, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &WaveInfo);
-
-        /* check for success */
-        if (!NT_SUCCESS(Status))
-        {
-            /* invalid device id */
-            return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
-        }
+        Status = WdmAudGetPnpNameByIndexAndType(DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &Device);
 
-        Status = GetSysAudioDevicePnpName(DeviceObject, WaveInfo->FilterId, &Device);
         /* check for success */
         if (!NT_SUCCESS(Status))
         {
@@ -275,13 +256,13 @@ WdmAudGetDeviceInterface(
     }
     else if (DeviceInfo->DeviceType == MIXER_DEVICE_TYPE)
     {
-        if (DeviceInfo->DeviceIndex >= DeviceExtension->MixerInfoCount)
+        if (DeviceInfo->DeviceIndex >= WdmAudGetMixerDeviceCount())
         {
             /* invalid device id */
             return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, sizeof(WDMAUD_DEVICE_INFO));
         }
 
-        Status = GetSysAudioDevicePnpName(DeviceObject, DeviceExtension->MixerInfo[DeviceInfo->DeviceIndex].DeviceIndex, &Device);
+        Status = WdmAudGetMixerPnpNameByIndex(DeviceInfo->DeviceIndex, &Device);
         /* check for success */
         if (!NT_SUCCESS(Status))
         {
@@ -308,8 +289,6 @@ WdmAudGetDeviceInterface(
             //FIXME SEH
             RtlMoveMemory(DeviceInfo->u.Interface.DeviceInterfaceString, Device, Length);
         }
-
-        ExFreePool(Device);
         return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
     }
 
index 46d8775..572a972 100644 (file)
@@ -80,9 +80,7 @@ WdmAudInstallDevice(
     }
 
     Status = WdmAudMixerInitialize(DeviceObject);
-    DPRINT("WdmAudMixerInitialize Status %x\n", Status);
-    Status = WdmAudWaveInitialize(DeviceObject);
-    DPRINT("WdmAudWaveInitialize Status %x\n", Status);
+    DPRINT("WdmAudMixerInitialize Status %x WaveIn %lu WaveOut %lu Mixer %lu\n", Status, WdmAudGetWaveInDeviceCount(), WdmAudGetWaveOutDeviceCount(), WdmAudGetMixerDeviceCount());
 
     DeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
     DeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
index 7e2e8bc..aa5e7b2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef INTERFACE_H__
-#define INTERFACE_H__
+#pragma once
 
 ///
 /// WDMAUD Interface Definition
@@ -375,4 +374,3 @@ typedef struct
              17, \
              METHOD_BUFFERED, \
              FILE_CREATE_TREE_CONNECTION | FILE_ANY_ACCESS)
-#endif
diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c
deleted file mode 100644 (file)
index 9b70bb7..0000000
+++ /dev/null
@@ -1,2438 +0,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS Kernel Streaming
- * FILE:            drivers/wdm/audio/legacy/wdmaud/mixer.c
- * PURPOSE:         System Audio graph builder
- * PROGRAMMER:      Andrew Greenwood
- *                  Johannes Anderwald
- */
-#include "wdmaud.h"
-
-const GUID KSNODETYPE_DAC = {0x507AE360L, 0xC554, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_ADC = {0x4D837FE0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_AGC = {0xE88C9BA0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_LOUDNESS = {0x41887440L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_MUTE =     {0x02B223C0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_TONE =     {0x7607E580L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_VOLUME =   {0x3A5ACC00L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_PEAKMETER = {0xa085651e, 0x5f0d, 0x4b36, {0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e}};
-const GUID KSNODETYPE_MUX =       {0x2CEAF780, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_STEREO_WIDE = {0xA9E69800L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_CHORUS =      {0x20173F20L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_REVERB =      {0xEF0328E0L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_SUPERMIX =    {0xE573ADC0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSNODETYPE_SUM = {0xDA441A60L, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
-const GUID KSPROPSETID_Audio = {0x45FFAAA0L, 0x6E1B, 0x11D0, {0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}};
-
-#define DESTINATION_LINE 0xFFFF0000
-
-LPMIXERLINE_EXT
-GetSourceMixerLine(
-    LPMIXER_INFO MixerInfo,
-    DWORD dwSource)
-{
-    PLIST_ENTRY Entry;
-    LPMIXERLINE_EXT MixerLineSrc;
-
-    /* get first entry */
-    Entry = MixerInfo->LineList.Flink;
-
-    while(Entry != &MixerInfo->LineList)
-    {
-        MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry);
-        DPRINT("dwSource %x dwSource %x\n", MixerLineSrc->Line.dwSource, dwSource);
-        if (MixerLineSrc->Line.dwSource == dwSource)
-            return MixerLineSrc;
-
-        Entry = Entry->Flink;
-    }
-
-    return NULL;
-}
-
-LPMIXERCONTROL_DATA
-GetMixerControlDataById(
-    PLIST_ENTRY ListHead,
-    DWORD dwControlId)
-{
-    PLIST_ENTRY Entry;
-    LPMIXERCONTROL_DATA Control;
-
-    /* get first entry */
-    Entry = ListHead->Flink;
-
-    while(Entry != ListHead)
-    {
-        Control = (LPMIXERCONTROL_DATA)CONTAINING_RECORD(Entry, MIXERCONTROL_DATA, Entry);
-        DPRINT("dwSource %x dwSource %x\n", Control->dwControlID, dwControlId);
-        if (Control->dwControlID == dwControlId)
-            return Control;
-
-        Entry = Entry->Flink;
-    }
-    return NULL;
-}
-
-NTSTATUS
-GetMixerControlById(
-    LPMIXER_INFO MixerInfo,
-    DWORD dwControlID,
-    LPMIXERLINE_EXT *MixerLine,
-    LPMIXERCONTROLW *MixerControl,
-    PULONG NodeId)
-{
-    PLIST_ENTRY Entry;
-    LPMIXERLINE_EXT MixerLineSrc;
-    ULONG Index;
-
-    /* get first entry */
-    Entry = MixerInfo->LineList.Flink;
-
-    while(Entry != &MixerInfo->LineList)
-    {
-        MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry);
-
-        for(Index = 0; Index < MixerLineSrc->Line.cControls; Index++)
-        {
-            if (MixerLineSrc->LineControls[Index].dwControlID == dwControlID)
-            {
-                if (MixerLine)
-                    *MixerLine = MixerLineSrc;
-                if (MixerControl)
-                    *MixerControl = &MixerLineSrc->LineControls[Index];
-                if (NodeId)
-                    *NodeId = MixerLineSrc->NodeIds[Index];
-                return STATUS_SUCCESS;
-            }
-        }
-        Entry = Entry->Flink;
-    }
-
-    return STATUS_NOT_FOUND;
-}
-
-LPMIXERLINE_EXT
-GetSourceMixerLineByComponentType(
-    LPMIXER_INFO MixerInfo,
-    DWORD dwComponentType)
-{
-    PLIST_ENTRY Entry;
-    LPMIXERLINE_EXT MixerLineSrc;
-
-    /* get first entry */
-    Entry = MixerInfo->LineList.Flink;
-
-    while(Entry != &MixerInfo->LineList)
-    {
-        MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry);
-        if (MixerLineSrc->Line.dwComponentType == dwComponentType)
-            return MixerLineSrc;
-
-        Entry = Entry->Flink;
-    }
-
-    return NULL;
-}
-
-LPMIXERLINE_EXT
-GetSourceMixerLineByLineId(
-    LPMIXER_INFO MixerInfo,
-    DWORD dwLineID)
-{
-    PLIST_ENTRY Entry;
-    LPMIXERLINE_EXT MixerLineSrc;
-
-    /* get first entry */
-    Entry = MixerInfo->LineList.Flink;
-
-    while(Entry != &MixerInfo->LineList)
-    {
-        MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry);
-        DPRINT("dwLineID %x dwLineID %x\n", MixerLineSrc->Line.dwLineID, dwLineID);
-        if (MixerLineSrc->Line.dwLineID == dwLineID)
-            return MixerLineSrc;
-
-        Entry = Entry->Flink;
-    }
-
-    return NULL;
-}
-
-
-
-ULONG
-GetPinCount(
-    IN PFILE_OBJECT FileObject)
-{
-    KSPROPERTY Pin;
-    NTSTATUS Status;
-    ULONG NumPins, BytesReturned;
-
-    Pin.Flags = KSPROPERTY_TYPE_GET;
-    Pin.Set = KSPROPSETID_Pin;
-    Pin.Id = KSPROPERTY_PIN_CTYPES;
-
-    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&NumPins, sizeof(ULONG), &BytesReturned);
-    if (!NT_SUCCESS(Status))
-        return 0;
-
-    return NumPins;
-}
-
-
-ULONG
-GetSysAudioDeviceCount(
-    IN  PDEVICE_OBJECT DeviceObject)
-{
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    KSPROPERTY Pin;
-    ULONG Count, BytesReturned;
-    NTSTATUS Status;
-
-    /* setup the query request */
-    Pin.Set = KSPROPSETID_Sysaudio;
-    Pin.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT;
-    Pin.Flags = KSPROPERTY_TYPE_GET;
-
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    /* query sysaudio for the device count */
-    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned);
-    if (!NT_SUCCESS(Status))
-        return 0;
-
-    return Count;
-}
-
-NTSTATUS
-GetSysAudioDevicePnpName(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  ULONG DeviceIndex,
-    OUT LPWSTR * Device)
-{
-    ULONG BytesReturned;
-    KSP_PIN Pin;
-    NTSTATUS Status;
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-
-   /* first check if the device index is within bounds */
-   if (DeviceIndex >= GetSysAudioDeviceCount(DeviceObject))
-       return STATUS_INVALID_PARAMETER;
-
-    /* setup the query request */
-    Pin.Property.Set = KSPROPSETID_Sysaudio;
-    Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME;
-    Pin.Property.Flags = KSPROPERTY_TYPE_GET;
-    Pin.PinId = DeviceIndex;
-
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    /* query sysaudio for the device path */
-    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), NULL, 0, &BytesReturned);
-
-    /* check if the request failed */
-    if (Status != STATUS_BUFFER_TOO_SMALL || BytesReturned == 0)
-        return STATUS_UNSUCCESSFUL;
-
-    /* allocate buffer for the device */
-    *Device = ExAllocatePool(NonPagedPool, BytesReturned);
-    if (!Device)
-        return STATUS_INSUFFICIENT_RESOURCES;
-
-    /* query sysaudio again for the device path */
-    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), (PVOID)*Device, BytesReturned, &BytesReturned);
-
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed */
-        ExFreePool(*Device);
-        return Status;
-    }
-
-    return Status;
-}
-
-ULONG
-GetDeviceIndexFromPnpName(
-    IN PDEVICE_OBJECT DeviceObject,
-    LPWSTR Device)
-{
-    ULONG Count, Index;
-    LPWSTR DeviceName;
-    NTSTATUS Status;
-
-    /* get device count */
-    Count = GetSysAudioDeviceCount(DeviceObject);
-
-    if (!Count)
-        return MAXULONG;
-
-    for(Index = 0; Index < Count; Index++)
-    {
-        /* get device name */
-        Status = GetSysAudioDevicePnpName(DeviceObject, Index, &DeviceName);
-        if (NT_SUCCESS(Status))
-        {
-            if (!wcsicmp(Device, DeviceName))
-            {
-                /* found device index */
-                ExFreePool(DeviceName);
-                return Index;
-            }
-            ExFreePool(DeviceName);
-        }
-    }
-
-    return MAXULONG;
-}
-
-
-NTSTATUS
-OpenDevice(
-    IN LPWSTR Device,
-    OUT PHANDLE DeviceHandle,
-    OUT PFILE_OBJECT * FileObject)
-{
-    NTSTATUS Status;
-    HANDLE hDevice;
-
-    /* now open the device */
-    Status = WdmAudOpenSysAudioDevice(Device, &hDevice);
-
-    if (!NT_SUCCESS(Status))
-    {
-        return Status;
-    }
-
-    *DeviceHandle = hDevice;
-
-    if (FileObject)
-    {
-        Status = ObReferenceObjectByHandle(hDevice, FILE_READ_DATA | FILE_WRITE_DATA, IoFileObjectType, KernelMode, (PVOID*)FileObject, NULL);
-
-        if (!NT_SUCCESS(Status))
-        {
-            ZwClose(hDevice);
-        }
-    }
-
-    return Status;
-
-}
-
-
-NTSTATUS
-OpenSysAudioDeviceByIndex(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  ULONG DeviceIndex,
-    IN  PHANDLE DeviceHandle,
-    IN  PFILE_OBJECT * FileObject)
-{
-    LPWSTR Device = NULL;
-    NTSTATUS Status;
-
-    Status = GetSysAudioDevicePnpName(DeviceObject, DeviceIndex, &Device);
-    if (!NT_SUCCESS(Status))
-        return Status;
-
-    Status = OpenDevice(Device, DeviceHandle, FileObject);
-
-    /* free device buffer */
-    ExFreePool(Device);
-
-    return Status;
-}
-
-NTSTATUS
-GetFilterNodeProperty(
-    IN PFILE_OBJECT FileObject,
-    IN ULONG PropertyId,
-    PKSMULTIPLE_ITEM * Item)
-{
-    NTSTATUS Status;
-    ULONG BytesReturned;
-    PKSMULTIPLE_ITEM MultipleItem;
-    KSPROPERTY Property;
-
-    /* setup query request */
-    Property.Id = PropertyId;
-    Property.Flags = KSPROPERTY_TYPE_GET;
-    Property.Set = KSPROPSETID_Topology;
-
-    /* query for required size */
-    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &BytesReturned);
-
-    /* check for success */
-    if (Status != STATUS_MORE_ENTRIES)
-        return Status;
-
-    /* allocate buffer */
-    MultipleItem = (PKSMULTIPLE_ITEM)ExAllocatePool(NonPagedPool, BytesReturned);
-    if (!MultipleItem)
-        return STATUS_INSUFFICIENT_RESOURCES;
-
-    /* query for required size */
-    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)MultipleItem, BytesReturned, &BytesReturned);
-
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed */
-        ExFreePool(MultipleItem);
-        return Status;
-    }
-
-    *Item = MultipleItem;
-    return Status;
-}
-
-ULONG
-CountNodeType(
-    PKSMULTIPLE_ITEM MultipleItem,
-    LPGUID NodeType)
-{
-    ULONG Count;
-    ULONG Index;
-    LPGUID Guid;
-
-    Count = 0;
-    Guid = (LPGUID)(MultipleItem+1);
-
-    /* iterate through node type array */
-    for(Index = 0; Index < MultipleItem->Count; Index++)
-    {
-        if (IsEqualGUIDAligned(NodeType, Guid))
-        {
-            /* found matching guid */
-            Count++;
-        }
-        Guid++;
-    }
-    return Count;
-}
-
-ULONG
-GetNodeTypeIndex(
-    PKSMULTIPLE_ITEM MultipleItem,
-    LPGUID NodeType)
-{
-    ULONG Index;
-    LPGUID Guid;
-
-    Guid = (LPGUID)(MultipleItem+1);
-
-    /* iterate through node type array */
-    for(Index = 0; Index < MultipleItem->Count; Index++)
-    {
-        if (IsEqualGUIDAligned(NodeType, Guid))
-        {
-            /* found matching guid */
-            return Index;
-        }
-        Guid++;
-    }
-    return MAXULONG;
-}
-
-ULONG
-GetControlTypeFromTopologyNode(
-    IN LPGUID NodeType)
-{
-    if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_AGC))
-    {
-        // automatic gain control
-        return MIXERCONTROL_CONTROLTYPE_ONOFF;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_LOUDNESS))
-    {
-        // loudness control
-        return MIXERCONTROL_CONTROLTYPE_LOUDNESS;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUTE ))
-    {
-        // mute control
-        return MIXERCONTROL_CONTROLTYPE_MUTE;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_TONE))
-    {
-        // tpne control
-        //FIXME
-        // MIXERCONTROL_CONTROLTYPE_ONOFF if KSPROPERTY_AUDIO_BASS_BOOST is supported
-        // MIXERCONTROL_CONTROLTYPE_BASS if KSPROPERTY_AUDIO_BASS is supported
-        // MIXERCONTROL_CONTROLTYPE_TREBLE if KSPROPERTY_AUDIO_TREBLE is supported
-        UNIMPLEMENTED;
-        return MIXERCONTROL_CONTROLTYPE_ONOFF;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_VOLUME))
-    {
-        // volume control
-        return MIXERCONTROL_CONTROLTYPE_VOLUME;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_PEAKMETER))
-    {
-        // peakmeter control
-        return MIXERCONTROL_CONTROLTYPE_PEAKMETER;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX))
-    {
-        // mux control
-        return MIXERCONTROL_CONTROLTYPE_MUX;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX))
-    {
-        // mux control
-        return MIXERCONTROL_CONTROLTYPE_MUX;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_STEREO_WIDE))
-    {
-        // stero wide control
-        return MIXERCONTROL_CONTROLTYPE_FADER;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_CHORUS))
-    {
-        // chorus control
-        return MIXERCONTROL_CONTROLTYPE_FADER;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_REVERB))
-    {
-        // reverb control
-        return MIXERCONTROL_CONTROLTYPE_FADER;
-    }
-    else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_SUPERMIX))
-    {
-        // supermix control
-        // MIXERCONTROL_CONTROLTYPE_MUTE if KSPROPERTY_AUDIO_MUTE is supported 
-        UNIMPLEMENTED;
-        return MIXERCONTROL_CONTROLTYPE_VOLUME;
-    }
-    UNIMPLEMENTED
-    return 0;
-}
-
-NTSTATUS
-GetPhysicalConnection(
-    IN PFILE_OBJECT FileObject,
-    IN ULONG PinId,
-    OUT PKSPIN_PHYSICALCONNECTION *OutConnection)
-{
-    KSP_PIN Pin;
-    NTSTATUS Status;
-    ULONG BytesReturned;
-    PKSPIN_PHYSICALCONNECTION Connection;
-
-    /* setup the request */
-    Pin.Property.Flags = KSPROPERTY_TYPE_GET;
-    Pin.Property.Id = KSPROPERTY_PIN_PHYSICALCONNECTION;
-    Pin.Property.Set = KSPROPSETID_Pin;
-    Pin.PinId = PinId;
-
-    /* query the pin for the physical connection */
-    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned);
-
-    if (Status == STATUS_NOT_FOUND)
-    {
-        /* pin does not have a physical connection */
-        return Status;
-    }
-
-    Connection = ExAllocatePool(NonPagedPool, BytesReturned);
-    if (!Connection)
-    {
-        /* not enough memory */
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    /* query the pin for the physical connection */
-    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)Connection, BytesReturned, &BytesReturned);
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed to query the physical connection */
-        ExFreePool(Connection);
-        return Status;
-    }
-
-    /* store connection */
-    *OutConnection = Connection;
-    return Status;
-}
-
-NTSTATUS
-GetNodeIndexes(
-    IN PKSMULTIPLE_ITEM MultipleItem,
-    IN ULONG NodeIndex,
-    IN ULONG bNode,
-    IN ULONG bFrom,
-    OUT PULONG NodeReferenceCount,
-    OUT PULONG *NodeReference)
-{
-    ULONG Index, Count = 0;
-    PKSTOPOLOGY_CONNECTION Connection;
-    PULONG Refs;
-
-    /* KSMULTIPLE_ITEM is followed by several KSTOPOLOGY_CONNECTION */
-    Connection = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1);
-
-    /* first count all referenced nodes */
-    for(Index = 0; Index < MultipleItem->Count; Index++)
-    {
-        //DbgPrint("FromPin %u FromNode %u ToPin %u ToNode %u\n", Connection->FromNodePin, Connection->FromNode, Connection->ToNodePin, Connection->ToNode);
-        if (bNode)
-        {
-            if (bFrom)
-            {
-                if (Connection->FromNode == NodeIndex)
-                {
-                    /* node id has a connection */
-                    Count++;
-                }
-            }
-            else
-            {
-                if (Connection->ToNode == NodeIndex)
-                {
-                    /* node id has a connection */
-                    Count++;
-                }
-            }
-        }
-        else
-        {
-            if (bFrom)
-            {
-                if (Connection->FromNodePin == NodeIndex && Connection->FromNode == KSFILTER_NODE)
-                {
-                    /* node id has a connection */
-                    Count++;
-                }
-            }
-            else
-            {
-                if (Connection->ToNodePin == NodeIndex && Connection->ToNode == KSFILTER_NODE)
-                {
-                    /* node id has a connection */
-                    Count++;
-                }
-            }
-        }
-
-
-        /* move to next connection */
-        Connection++;
-    }
-
-    ASSERT(Count != 0);
-
-    /* now allocate node index array */
-    Refs = ExAllocatePool(NonPagedPool, sizeof(ULONG) * Count);
-    if (!Refs)
-    {
-        /* not enough memory */
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    /* clear node index array */
-    RtlZeroMemory(Refs, Count * sizeof(ULONG));
-
-    Count = 0;
-    Connection = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1);
-    for(Index = 0; Index < MultipleItem->Count; Index++)
-    {
-        if (bNode)
-        {
-            if (bFrom)
-            {
-                if (Connection->FromNode == NodeIndex)
-                {
-                    /* node id has a connection */
-                    Refs[Count] = Index;
-                    Count++;
-                }
-            }
-            else
-            {
-                if (Connection->ToNode == NodeIndex)
-                {
-                    /* node id has a connection */
-                    Refs[Count] = Index;
-                    Count++;
-                }
-            }
-        }
-        else
-        {
-            if (bFrom)
-            {
-                if (Connection->FromNodePin == NodeIndex && Connection->FromNode == KSFILTER_NODE)
-                {
-                    /* node id has a connection */
-                    Refs[Count] = Index;
-                    Count++;
-                }
-            }
-            else
-            {
-                if (Connection->ToNodePin == NodeIndex && Connection->ToNode == KSFILTER_NODE)
-                {
-                    /* node id has a connection */
-                    Refs[Count] = Index;
-                    Count++;
-                }
-            }
-        }
-
-        /* move to next connection */
-        Connection++;
-    }
-
-    /* store result */
-    *NodeReference = Refs;
-    *NodeReferenceCount = Count;
-
-    return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-GetTargetPinsByNodeConnectionIndex(
-    IN PKSMULTIPLE_ITEM NodeConnections,
-    IN PKSMULTIPLE_ITEM NodeTypes,
-    IN ULONG bUpDirection,
-    IN ULONG NodeConnectionIndex,
-    OUT PULONG Pins)
-{
-    PKSTOPOLOGY_CONNECTION Connection;
-    ULONG PinId, NodeConnectionCount, Index;
-    PULONG NodeConnection;
-    NTSTATUS Status;
-
-
-    /* sanity check */
-    ASSERT(NodeConnectionIndex < NodeConnections->Count);
-
-    Connection = (PKSTOPOLOGY_CONNECTION)(NodeConnections + 1);
-
-    DPRINT("FromNode %u FromNodePin %u -> ToNode %u ToNodePin %u\n", Connection[NodeConnectionIndex].FromNode, Connection[NodeConnectionIndex].FromNodePin, Connection[NodeConnectionIndex].ToNode, Connection[NodeConnectionIndex].ToNodePin );
-
-    if ((Connection[NodeConnectionIndex].ToNode == KSFILTER_NODE && bUpDirection == FALSE) ||
-        (Connection[NodeConnectionIndex].FromNode == KSFILTER_NODE && bUpDirection == TRUE))
-    {
-        /* iteration stops here */
-       if (bUpDirection)
-           PinId = Connection[NodeConnectionIndex].FromNodePin;
-       else
-           PinId = Connection[NodeConnectionIndex].ToNodePin;
-
-       DPRINT("GetTargetPinsByNodeIndex FOUND Target Pin %u Parsed %u\n", PinId, Pins[PinId]);
-
-       /* mark pin index as a target pin */
-       Pins[PinId] = TRUE;
-       return STATUS_SUCCESS;
-    }
-
-    /* get all node indexes referenced by that node */
-    if (bUpDirection)
-    {
-        Status = GetNodeIndexes(NodeConnections, Connection[NodeConnectionIndex].FromNode, TRUE, FALSE, &NodeConnectionCount, &NodeConnection);
-    }
-    else
-    {
-        Status = GetNodeIndexes(NodeConnections, Connection[NodeConnectionIndex].ToNode, TRUE, TRUE, &NodeConnectionCount, &NodeConnection);
-    }
-
-    if (NT_SUCCESS(Status))
-    {
-        for(Index = 0; Index < NodeConnectionCount; Index++)
-        {
-            /* iterate recursively into the nodes */
-            Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Pins);
-            ASSERT(Status == STATUS_SUCCESS);
-        }
-        /* free node connection indexes */
-        ExFreePool(NodeConnection);
-    }
-
-    return Status;
-}
-
-
-
-NTSTATUS
-GetTargetPins(
-    PKSMULTIPLE_ITEM NodeTypes,
-    PKSMULTIPLE_ITEM NodeConnections,
-    IN ULONG NodeIndex,
-    IN ULONG bUpDirection,
-    PULONG Pins,
-    ULONG PinCount)
-{
-    ULONG NodeConnectionCount, Index;
-    NTSTATUS Status;
-    PULONG NodeConnection;
-
-    /* sanity check */
-    ASSERT(NodeIndex != (ULONG)-1);
-
-    /* get all node indexes referenced by that pin */
-    if (bUpDirection)
-        Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, FALSE, &NodeConnectionCount, &NodeConnection);
-    else
-        Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection);
-
-    DPRINT("NodeIndex %u Status %x Count %u\n", NodeIndex, Status, NodeConnectionCount);
-
-    if (NT_SUCCESS(Status))
-    {
-        for(Index = 0; Index < NodeConnectionCount; Index++)
-        {
-            Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Pins);
-            ASSERT(Status == STATUS_SUCCESS);
-        }
-        ExFreePool(NodeConnection);
-    }
-
-    return Status;
-}
-
-PULONG
-AllocatePinArray(
-    ULONG PinCount)
-{
-    PULONG Pins = ExAllocatePool(NonPagedPool, PinCount * sizeof(ULONG));
-    if (!Pins)
-        return NULL;
-
-    RtlZeroMemory(Pins, sizeof(ULONG) * PinCount);
-
-    return Pins;
-}
-
-PKSTOPOLOGY_CONNECTION
-GetConnectionByIndex(
-    IN PKSMULTIPLE_ITEM MultipleItem,
-    IN ULONG Index)
-{
-    PKSTOPOLOGY_CONNECTION Descriptor;
-
-    ASSERT(Index < MultipleItem->Count);
-
-    Descriptor = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1);
-    return &Descriptor[Index];
-}
-
-LPGUID
-GetNodeType(
-    IN PKSMULTIPLE_ITEM MultipleItem,
-    IN ULONG Index)
-{
-    LPGUID NodeType;
-
-    ASSERT(Index < MultipleItem->Count);
-
-    NodeType = (LPGUID)(MultipleItem + 1);
-    return &NodeType[Index];
-}
-
-NTSTATUS
-GetControlsFromPinByConnectionIndex(
-    IN PKSMULTIPLE_ITEM NodeConnections,
-    IN PKSMULTIPLE_ITEM NodeTypes,
-    IN ULONG bUpDirection,
-    IN ULONG NodeConnectionIndex,
-    OUT PULONG Nodes)
-{
-    PKSTOPOLOGY_CONNECTION CurConnection;
-    LPGUID NodeType;
-    ULONG NodeIndex;
-    NTSTATUS Status;
-    ULONG NodeConnectionCount, Index;
-    PULONG NodeConnection;
-
-
-    /* get current connection */
-    CurConnection = GetConnectionByIndex(NodeConnections, NodeConnectionIndex);
-
-    if (bUpDirection)
-        NodeIndex = CurConnection->FromNode;
-    else
-        NodeIndex = CurConnection->ToNode;
-
-    /* get target node type of current connection */
-    NodeType = GetNodeType(NodeTypes, NodeIndex);
-
-    if (IsEqualGUIDAligned(NodeType, &KSNODETYPE_SUM) || IsEqualGUIDAligned(NodeType, &KSNODETYPE_MUX))
-    {
-        if (bUpDirection)
-        {
-            /* add the sum / mux node to destination line */
-            Nodes[NodeIndex] = TRUE;
-        }
-
-        return STATUS_SUCCESS;
-    }
-
-    /* now add the node */
-    Nodes[NodeIndex] = TRUE;
-
-
-    /* get all node indexes referenced by that node */
-    if (bUpDirection)
-    {
-        Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, FALSE, &NodeConnectionCount, &NodeConnection);
-    }
-    else
-    {
-        Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection);
-    }
-
-    if (NT_SUCCESS(Status))
-    {
-        for(Index = 0; Index < NodeConnectionCount; Index++)
-        {
-            /* iterate recursively into the nodes */
-            Status = GetControlsFromPinByConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Nodes);
-            ASSERT(Status == STATUS_SUCCESS);
-        }
-        /* free node connection indexes */
-        ExFreePool(NodeConnection);
-    }
-
-    return Status;
-}
-
-NTSTATUS
-GetControlsFromPin(
-    IN PKSMULTIPLE_ITEM NodeConnections,
-    IN PKSMULTIPLE_ITEM NodeTypes,
-    IN ULONG PinId,
-    IN ULONG bUpDirection,
-    OUT PULONG Nodes)
-{
-    ULONG NodeConnectionCount, Index;
-    NTSTATUS Status;
-    PULONG NodeConnection;
-
-    /* sanity check */
-    ASSERT(PinId != (ULONG)-1);
-
-    /* get all node indexes referenced by that pin */
-    if (bUpDirection)
-        Status = GetNodeIndexes(NodeConnections, PinId, FALSE, FALSE, &NodeConnectionCount, &NodeConnection);
-    else
-        Status = GetNodeIndexes(NodeConnections, PinId, FALSE, TRUE, &NodeConnectionCount, &NodeConnection);
-
-    for(Index = 0; Index < NodeConnectionCount; Index++)
-    {
-        /* get all associated controls */
-        Status = GetControlsFromPinByConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Nodes);
-    }
-
-    ExFreePool(NodeConnection);
-
-    return Status;
-}
-
-NTSTATUS
-AddMixerControl(
-    IN LPMIXER_INFO MixerInfo,
-    IN PFILE_OBJECT FileObject,
-    IN PKSMULTIPLE_ITEM NodeTypes,
-    IN ULONG NodeIndex,
-    IN LPMIXERLINE_EXT MixerLine,
-    OUT LPMIXERCONTROLW MixerControl)
-{
-    LPGUID NodeType;
-    KSP_NODE Node;
-    ULONG BytesReturned;
-    NTSTATUS Status;
-    LPWSTR Name;
-
-    /* initialize mixer control */
-    MixerControl->cbStruct = sizeof(MIXERCONTROLW);
-    MixerControl->dwControlID = MixerInfo->ControlId;
-
-    /* get node type */
-    NodeType = GetNodeType(NodeTypes, NodeIndex);
-    /* store control type */
-    MixerControl->dwControlType = GetControlTypeFromTopologyNode(NodeType);
-
-    MixerControl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; //FIXME
-    MixerControl->cMultipleItems = 0; //FIXME
-
-    if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
-    {
-        MixerControl->Bounds.dwMinimum = 0;
-        MixerControl->Bounds.dwMaximum = 1;
-    }
-    else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
-    {
-        MixerControl->Bounds.dwMinimum = 0;
-        MixerControl->Bounds.dwMaximum = 0xFFFF;
-        MixerControl->Metrics.cSteps = 0xC0; //FIXME
-    }
-
-    /* setup request to retrieve name */
-    Node.NodeId = NodeIndex;
-    Node.Property.Id = KSPROPERTY_TOPOLOGY_NAME;
-    Node.Property.Flags = KSPROPERTY_TYPE_GET;
-    Node.Property.Set = KSPROPSETID_Topology;
-    Node.Reserved = 0;
-
-    /* get node name size */
-    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), NULL, 0, &BytesReturned);
-
-    if (Status == STATUS_BUFFER_TOO_SMALL)
-    {
-        ASSERT(BytesReturned != 0);
-        Name = ExAllocatePool(NonPagedPool, BytesReturned);
-        if (!Name)
-        {
-            /* not enough memory */
-            return STATUS_INSUFFICIENT_RESOURCES;
-        }
-
-        /* get node name */
-        Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), (LPVOID)Name, BytesReturned, &BytesReturned);
-        if (NT_SUCCESS(Status))
-        {
-            RtlMoveMemory(MixerControl->szShortName, Name, (min(MIXER_SHORT_NAME_CHARS, wcslen(Name)+1)) * sizeof(WCHAR));
-            MixerControl->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
-
-            RtlMoveMemory(MixerControl->szName, Name, (min(MIXER_LONG_NAME_CHARS, wcslen(Name)+1)) * sizeof(WCHAR));
-            MixerControl->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
-        }
-
-        /* free name buffer */
-        ExFreePool(Name);
-    }
-
-    MixerInfo->ControlId++;
-#if 0
-    if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUX)
-    {
-        KSNODEPROPERTY Property;
-        ULONG PinId = 2;
-
-        /* setup the request */
-        RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY));
-
-        Property.NodeId = NodeIndex;
-        Property.Property.Id = KSPROPERTY_AUDIO_MUX_SOURCE;
-        Property.Property.Flags = KSPROPERTY_TYPE_SET;
-        Property.Property.Set = KSPROPSETID_Audio;
-
-        /* get node volume level info */
-        Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY), (PVOID)&PinId, sizeof(ULONG), &BytesReturned);
-
-        DPRINT1("Status %x NodeIndex %u PinId %u\n", Status, NodeIndex, PinId);
-        //DbgBreakPoint();
-    }else
-#endif
-    if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
-    {
-        KSNODEPROPERTY_AUDIO_CHANNEL Property;
-        ULONG Length;
-        PKSPROPERTY_DESCRIPTION Desc;
-        PKSPROPERTY_MEMBERSHEADER Members;
-        PKSPROPERTY_STEPPING_LONG Range;
-
-        Length = sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG);
-        Desc = ExAllocatePool(NonPagedPool, Length);
-        ASSERT(Desc);
-        RtlZeroMemory(Desc, Length);
-
-        /* setup the request */
-        RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL));
-
-        Property.NodeProperty.NodeId = NodeIndex;
-        Property.NodeProperty.Property.Id = KSPROPERTY_AUDIO_VOLUMELEVEL;
-        Property.NodeProperty.Property.Flags = KSPROPERTY_TYPE_BASICSUPPORT;
-        Property.NodeProperty.Property.Set = KSPROPSETID_Audio;
-
-        /* get node volume level info */
-        Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), Desc, Length, &BytesReturned);
-
-        if (NT_SUCCESS(Status))
-        {
-            LPMIXERVOLUME_DATA VolumeData;
-            ULONG Steps, MaxRange, Index;
-            LONG Value;
-
-            Members = (PKSPROPERTY_MEMBERSHEADER)(Desc + 1);
-            Range = (PKSPROPERTY_STEPPING_LONG)(Members + 1); //98304
-
-            DPRINT("NodeIndex %u Range Min %d Max %d Steps %x UMin %x UMax %x\n", NodeIndex, Range->Bounds.SignedMinimum, Range->Bounds.SignedMaximum, Range->SteppingDelta, Range->Bounds.UnsignedMinimum, Range->Bounds.UnsignedMaximum);
-
-            MaxRange = Range->Bounds.UnsignedMaximum  - Range->Bounds.UnsignedMinimum;
-
-            if (MaxRange)
-            {
-                ASSERT(MaxRange);
-                VolumeData = ExAllocatePool(NonPagedPool, sizeof(MIXERVOLUME_DATA));
-                if (!VolumeData)
-                    return STATUS_INSUFFICIENT_RESOURCES;
-
-                Steps = MaxRange / Range->SteppingDelta + 1;
-
-                /* store mixer control info there */
-                VolumeData->Header.dwControlID = MixerControl->dwControlID;
-                VolumeData->SignedMaximum = Range->Bounds.SignedMaximum;
-                VolumeData->SignedMinimum = Range->Bounds.SignedMinimum;
-                VolumeData->SteppingDelta = Range->SteppingDelta;
-                VolumeData->ValuesCount = Steps;
-                VolumeData->InputSteppingDelta = 0x10000 / Steps;
-
-                VolumeData->Values = ExAllocatePool(NonPagedPool, sizeof(LONG) * Steps);
-                if (!VolumeData->Values)
-                {
-                    ExFreePool(Desc);
-                    ExFreePool(VolumeData);
-
-                    return STATUS_INSUFFICIENT_RESOURCES;
-                }
-
-                Value = Range->Bounds.SignedMinimum;
-                for(Index = 0; Index < Steps; Index++)
-                {
-                    VolumeData->Values[Index] = Value;
-                    Value += Range->SteppingDelta;
-                }
-                InsertTailList(&MixerLine->LineControlsExtraData, &VolumeData->Header.Entry);
-           }
-       }
-       ExFreePool(Desc);
-    }
-
-
-    DPRINT("Status %x Name %S\n", Status, MixerControl->szName);
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-AddMixerSourceLine(
-    IN OUT LPMIXER_INFO MixerInfo,
-    IN PFILE_OBJECT FileObject,
-    IN PKSMULTIPLE_ITEM NodeConnections,
-    IN PKSMULTIPLE_ITEM NodeTypes,
-    IN ULONG DeviceIndex,
-    IN ULONG PinId,
-    IN ULONG bBridgePin,
-    IN ULONG bTargetPin)
-{
-    LPMIXERLINE_EXT SrcLine, DstLine;
-    NTSTATUS Status;
-    KSP_PIN Pin;
-    LPWSTR PinName;
-    GUID NodeType;
-    ULONG BytesReturned, ControlCount, Index;
-    PULONG Nodes;
-
-    if (!bTargetPin)
-    {
-        /* allocate src mixer line */
-        SrcLine = (LPMIXERLINE_EXT)ExAllocatePool(NonPagedPool, sizeof(MIXERLINE_EXT));
-
-        if (!SrcLine)
-            return STATUS_INSUFFICIENT_RESOURCES;
-
-        /* zero struct */
-        RtlZeroMemory(SrcLine, sizeof(MIXERLINE_EXT));
-
-    }
-    else
-    {
-        ASSERT(!IsListEmpty(&MixerInfo->LineList));
-        SrcLine = GetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE);
-    }
-
-    /* get destination line */
-    DstLine = GetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE);
-    ASSERT(DstLine);
-
-
-    if (!bTargetPin)
-    {
-        /* initialize mixer src line */
-        SrcLine->DeviceIndex = DeviceIndex;
-        SrcLine->PinId = PinId;
-        SrcLine->Line.cbStruct = sizeof(MIXERLINEW);
-
-        /* initialize mixer destination line */
-        SrcLine->Line.cbStruct = sizeof(MIXERLINEW);
-        SrcLine->Line.dwDestination = 0;
-        SrcLine->Line.dwSource = DstLine->Line.cConnections;
-        SrcLine->Line.dwLineID = (DstLine->Line.cConnections * 0x10000);
-        SrcLine->Line.fdwLine = MIXERLINE_LINEF_ACTIVE | MIXERLINE_LINEF_SOURCE;
-        SrcLine->Line.dwUser = 0;
-        SrcLine->Line.cChannels = DstLine->Line.cChannels;
-        SrcLine->Line.cConnections = 0;
-        SrcLine->Line.Target.dwType = 1;
-        SrcLine->Line.Target.dwDeviceID = DstLine->Line.Target.dwDeviceID;
-        SrcLine->Line.Target.wMid = MixerInfo->MixCaps.wMid;
-        SrcLine->Line.Target.wPid = MixerInfo->MixCaps.wPid;
-        SrcLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion;
-        InitializeListHead(&SrcLine->LineControlsExtraData);
-        wcscpy(SrcLine->Line.Target.szPname, MixerInfo->MixCaps.szPname);
-
-    }
-
-    /* allocate a node arrary */
-    Nodes = ExAllocatePool(NonPagedPool, sizeof(ULONG) * NodeTypes->Count);
-
-    if (!Nodes)
-    {
-        /* not enough memory */
-        if (!bTargetPin)
-        {
-            ExFreePool(SrcLine);
-        }
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    /* clear nodes array */
-    RtlZeroMemory(Nodes, sizeof(ULONG) * NodeTypes->Count);
-
-    Status = GetControlsFromPin(NodeConnections, NodeTypes, PinId, bTargetPin, Nodes);
-    if (!NT_SUCCESS(Status))
-    {
-        /* something went wrong */
-        if (!bTargetPin)
-        {
-            ExFreePool(SrcLine);
-        }
-        ExFreePool(Nodes);
-        return Status;
-    }
-
-    /* now count all nodes controlled by that pin */
-    ControlCount = 0;
-    for(Index = 0; Index < NodeTypes->Count; Index++)
-    {
-        if (Nodes[Index])
-            ControlCount++;
-    }
-
-    /* now allocate the line controls */
-    if (ControlCount)
-    {
-        SrcLine->LineControls = ExAllocatePool(NonPagedPool, sizeof(MIXERCONTROLW) * ControlCount);
-
-        if (!SrcLine->LineControls)
-        {
-            /* no memory available */
-            if (!bTargetPin)
-            {
-                ExFreePool(SrcLine);
-            }
-            ExFreePool(Nodes);
-            return STATUS_INSUFFICIENT_RESOURCES;
-        }
-
-        SrcLine->NodeIds = ExAllocatePool(NonPagedPool, sizeof(ULONG) * ControlCount);
-        if (!SrcLine->NodeIds)
-        {
-            /* no memory available */
-            ExFreePool(SrcLine->LineControls);
-            if (!bTargetPin)
-            {
-                ExFreePool(SrcLine);
-            }
-            ExFreePool(Nodes);
-            return STATUS_INSUFFICIENT_RESOURCES;
-        }
-
-        /* zero line controls */
-        RtlZeroMemory(SrcLine->LineControls, sizeof(MIXERCONTROLW) * ControlCount);
-        RtlZeroMemory(SrcLine->NodeIds, sizeof(ULONG) * ControlCount);
-
-        ControlCount = 0;
-        for(Index = 0; Index < NodeTypes->Count; Index++)
-        {
-            if (Nodes[Index])
-            {
-                /* store the node index for retrieving / setting details */
-                SrcLine->NodeIds[ControlCount] = Index;
-
-                Status = AddMixerControl(MixerInfo, FileObject, NodeTypes, Index, SrcLine, &SrcLine->LineControls[ControlCount]);
-                if (NT_SUCCESS(Status))
-                {
-                    /* increment control count on success */
-                    ControlCount++;
-                }
-            }
-        }
-        /* store control count */
-        SrcLine->Line.cControls = ControlCount;
-    }
-
-    /* release nodes array */
-    ExFreePool(Nodes);
-
-    /* get pin category */
-    Pin.PinId = PinId;
-    Pin.Reserved = 0;
-    Pin.Property.Flags = KSPROPERTY_TYPE_GET;
-    Pin.Property.Set = KSPROPSETID_Pin;
-    Pin.Property.Id = KSPROPERTY_PIN_CATEGORY;
-
-    /* try get pin category */
-    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (LPVOID)&NodeType, sizeof(GUID), &BytesReturned);
-    if (NT_SUCCESS(Status))
-    {
-        //FIXME
-        //map component type
-    }
-
-    /* retrieve pin name */
-    Pin.PinId = PinId;
-    Pin.Reserved = 0;
-    Pin.Property.Flags = KSPROPERTY_TYPE_GET;
-    Pin.Property.Set = KSPROPSETID_Pin;
-    Pin.Property.Id = KSPROPERTY_PIN_NAME;
-
-    /* try get pin name size */
-    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned);
-
-    if (Status != STATUS_MORE_ENTRIES)
-    {
-        SrcLine->Line.szShortName[0] = L'\0';
-        SrcLine->Line.szName[0] = L'\0';
-    }
-    else
-    {
-        PinName = (LPWSTR)ExAllocatePool(NonPagedPool, BytesReturned);
-        if (PinName)
-        {
-            /* try get pin name */
-            Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (LPVOID)PinName, BytesReturned, &BytesReturned);
-
-            if (NT_SUCCESS(Status))
-            {
-                RtlMoveMemory(SrcLine->Line.szShortName, PinName, (min(MIXER_SHORT_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR));
-                SrcLine->Line.szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
-
-                RtlMoveMemory(SrcLine->Line.szName, PinName, (min(MIXER_LONG_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR));
-                SrcLine->Line.szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
-            }
-            ExFreePool(PinName);
-        }
-    }
-
-    /* insert src line */
-    if (!bTargetPin)
-    {
-        InsertTailList(&MixerInfo->LineList, &SrcLine->Entry);
-        DstLine->Line.cConnections++;
-    }
-
-    return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-AddMixerSourceLines(
-    IN OUT LPMIXER_INFO MixerInfo,
-    IN PFILE_OBJECT FileObject,
-    IN PKSMULTIPLE_ITEM NodeConnections,
-    IN PKSMULTIPLE_ITEM NodeTypes,
-    IN ULONG DeviceIndex,
-    IN ULONG PinsCount,
-    IN ULONG BridgePinIndex,
-    IN ULONG TargetPinIndex,
-    IN PULONG Pins)
-{
-    ULONG Index;
-    NTSTATUS Status = STATUS_SUCCESS;
-
-    for(Index = PinsCount; Index > 0; Index--)
-    {
-        if (Pins[Index-1])
-        {
-            AddMixerSourceLine(MixerInfo, FileObject, NodeConnections, NodeTypes, DeviceIndex, Index-1, (Index -1 == BridgePinIndex), (Index -1 == TargetPinIndex));
-        }
-    }
-    return Status;
-}
-
-
-
-NTSTATUS
-HandlePhysicalConnection(
-    IN OUT LPMIXER_INFO MixerInfo,
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG bInput,
-    IN PKSPIN_PHYSICALCONNECTION OutConnection)
-{
-    PULONG PinsRef = NULL, PinConnectionIndex = NULL, PinsSrcRef;
-    ULONG PinsRefCount, Index, PinConnectionIndexCount, DeviceIndex;
-    NTSTATUS Status;
-    HANDLE hDevice = NULL;
-    PFILE_OBJECT FileObject = NULL;
-    PKSMULTIPLE_ITEM NodeTypes = NULL;
-    PKSMULTIPLE_ITEM NodeConnections = NULL;
-    PULONG MixerControls;
-    ULONG MixerControlsCount;
-
-
-    /* open the connected filter */
-    Status = OpenDevice(OutConnection->SymbolicLinkName, &hDevice, &FileObject);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("OpenDevice failed with %x\n", Status);
-        return Status;
-    }
-
-    /* get device index */
-    DeviceIndex = GetDeviceIndexFromPnpName(DeviceObject, OutConnection->SymbolicLinkName);
-
-    /* get connected filter pin count */
-    PinsRefCount = GetPinCount(FileObject);
-    ASSERT(PinsRefCount);
-
-    PinsRef = AllocatePinArray(PinsRefCount);
-    if (!PinsRef)
-    {
-        /* no memory */
-        Status = STATUS_INSUFFICIENT_RESOURCES;
-        goto cleanup;
-    }
-
-    /* get topology node types */
-    Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("GetFilterNodeProperty failed with %x\n", Status);
-        goto cleanup;
-    }
-
-    /* get topology connections */
-    Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_CONNECTIONS, &NodeConnections);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("GetFilterNodeProperty failed with %x\n", Status);
-        goto cleanup;
-    }
-    /*  gets connection index of the bridge pin which connects to a node */
-    DPRINT("Pin %u\n", OutConnection->Pin);
-    Status = GetNodeIndexes(NodeConnections, OutConnection->Pin, FALSE, !bInput, &PinConnectionIndexCount, &PinConnectionIndex);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("GetNodeIndexes failed with %x\n", Status);
-        goto cleanup;
-    }
-
-    /* there should be no split in the bride pin */
-    ASSERT(PinConnectionIndexCount == 1);
-
-    /* find all target pins of this connection */
-    Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, FALSE, PinConnectionIndex[0], PinsRef);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("GetTargetPinsByNodeConnectionIndex failed with %x\n", Status);
-        goto cleanup;
-    }
-
-    for(Index = 0; Index < PinsRefCount; Index++)
-    {
-        if (PinsRef[Index])
-        {
-
-            /* found a target pin, now get all references */
-            Status = GetNodeIndexes(NodeConnections, Index, FALSE, FALSE, &MixerControlsCount, &MixerControls);
-            if (!NT_SUCCESS(Status))
-                break;
-
-            /* sanity check */
-            ASSERT(MixerControlsCount == 1);
-
-
-            PinsSrcRef = AllocatePinArray(PinsRefCount);
-            if (!PinsSrcRef)
-            {
-                /* no memory */
-                ExFreePool(MixerControls);
-                Status = STATUS_INSUFFICIENT_RESOURCES;
-                goto cleanup;
-            }
-            /* now get all connected source pins */
-            Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, TRUE, MixerControls[0], PinsSrcRef);
-            if (!NT_SUCCESS(Status))
-            {
-                /* no memory */
-                ExFreePool(MixerControls);
-                ExFreePool(PinsSrcRef);
-                Status = STATUS_INSUFFICIENT_RESOURCES;
-                goto cleanup;
-            }
-
-            /* add pins from target line */
-            if (!bInput)
-            {
-                // dont add bridge pin for input mixers
-                PinsSrcRef[Index] = TRUE;
-                PinsSrcRef[OutConnection->Pin] = TRUE;
-            }
-            PinsSrcRef[OutConnection->Pin] = TRUE;
-
-            Status = AddMixerSourceLines(MixerInfo, FileObject, NodeConnections, NodeTypes, DeviceIndex, PinsRefCount, OutConnection->Pin, Index, PinsSrcRef);
-
-            ExFreePool(MixerControls);
-            ExFreePool(PinsSrcRef);
-        }
-    }
-
-cleanup:
-
-    if (PinsRef)
-        ExFreePool(PinsRef);
-
-    if (NodeConnections)
-        ExFreePool(NodeConnections);
-
-    if (NodeTypes)
-        ExFreePool(NodeTypes);
-
-    if (FileObject)
-        ObDereferenceObject(FileObject);
-
-    if (hDevice)
-        ZwClose(hDevice);
-
-    if (PinConnectionIndex)
-        ExFreePool(PinConnectionIndex);
-
-
-    return Status;
-}
-
-
-
-NTSTATUS
-InitializeMixer(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG DeviceIndex,
-    IN OUT LPMIXER_INFO MixerInfo,
-    IN HANDLE hDevice,
-    IN PFILE_OBJECT FileObject,
-    IN ULONG PinCount,
-    IN PKSMULTIPLE_ITEM NodeTypes,
-    IN PKSMULTIPLE_ITEM NodeConnections,
-    IN ULONG NodeIndex,
-    IN ULONG bInput)
-{
-    WCHAR Buffer[100];
-    LPWSTR Device;
-    NTSTATUS Status;
-    PULONG Pins;
-    ULONG Index;
-    PKSPIN_PHYSICALCONNECTION OutConnection;
-    LPMIXERLINE_EXT DestinationLine;
-
-    DestinationLine = ExAllocatePool(NonPagedPool, sizeof(MIXERLINE_EXT));
-    if (!DestinationLine)
-        return STATUS_INSUFFICIENT_RESOURCES;
-
-    /* intialize mixer caps */
-    MixerInfo->MixCaps.wMid = MM_MICROSOFT; //FIXME
-    MixerInfo->MixCaps.wPid = MM_PID_UNMAPPED; //FIXME
-    MixerInfo->MixCaps.vDriverVersion = 1; //FIXME
-    MixerInfo->MixCaps.fdwSupport = 0;
-    MixerInfo->MixCaps.cDestinations = 1;
-    MixerInfo->DeviceIndex = DeviceIndex;
-
-    /* get target pnp name */
-    Status = GetSysAudioDevicePnpName(DeviceObject, DeviceIndex, &Device);
-    if (NT_SUCCESS(Status))
-    {
-        /* find product name */
-        Status = FindProductName(Device, sizeof(Buffer) / sizeof(WCHAR), Buffer);
-        if (NT_SUCCESS(Status))
-        {
-            if (bInput)
-                wcscat(Buffer, L" Input");
-            else
-                wcscat(Buffer, L" output");
-            RtlMoveMemory(MixerInfo->MixCaps.szPname, Buffer, min(MAXPNAMELEN, wcslen(Buffer)+1) * sizeof(WCHAR));
-            MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] = L'\0';
-        }
-        ExFreePool(Device);
-    }
-
-    /* initialize mixer destination line */
-    RtlZeroMemory(DestinationLine, sizeof(MIXERLINE_EXT));
-    DestinationLine->Line.cbStruct = sizeof(MIXERLINEW);
-    DestinationLine->Line.dwSource = MAXULONG;
-    DestinationLine->Line.dwLineID = DESTINATION_LINE;
-    DestinationLine->Line.fdwLine = MIXERLINE_LINEF_ACTIVE;
-    DestinationLine->Line.dwUser = 0;
-    DestinationLine->Line.dwComponentType = (bInput == 0 ? MIXERLINE_COMPONENTTYPE_DST_SPEAKERS : MIXERLINE_COMPONENTTYPE_DST_WAVEIN);
-    DestinationLine->Line.cChannels = 2; //FIXME
-    wcscpy(DestinationLine->Line.szShortName, L"Summe"); //FIXME
-    wcscpy(DestinationLine->Line.szName, L"Summe"); //FIXME
-    DestinationLine->Line.Target.dwType = (bInput == 0 ? MIXERLINE_TARGETTYPE_WAVEOUT : MIXERLINE_TARGETTYPE_WAVEIN);
-    DestinationLine->Line.Target.dwDeviceID = !bInput;
-    DestinationLine->Line.Target.wMid = MixerInfo->MixCaps.wMid;
-    DestinationLine->Line.Target.wPid = MixerInfo->MixCaps.wPid;
-    DestinationLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion;
-    wcscpy(DestinationLine->Line.Target.szPname, MixerInfo->MixCaps.szPname);
-
-    /* initialize source line list */
-    InitializeListHead(&MixerInfo->LineList);
-    InitializeListHead(&DestinationLine->LineControlsExtraData);
-
-    /* insert destination line */
-    InsertHeadList(&MixerInfo->LineList, &DestinationLine->Entry);
-
-    Pins = AllocatePinArray(PinCount);
-    if (!Pins)
-        return STATUS_INSUFFICIENT_RESOURCES;
-
-    if (bInput)
-    {
-        Status = GetTargetPins(NodeTypes, NodeConnections, NodeIndex, TRUE, Pins, PinCount);
-    }
-    else
-    {
-        Status = GetTargetPins(NodeTypes, NodeConnections, NodeIndex, FALSE, Pins, PinCount);
-    }
-
-    for(Index = 0; Index < PinCount; Index++)
-    {
-        if (Pins[Index])
-        {
-            Status = GetPhysicalConnection(FileObject, Index, &OutConnection);
-            if (NT_SUCCESS(Status))
-            {
-                Status = HandlePhysicalConnection(MixerInfo, DeviceObject, bInput, OutConnection);
-                ExFreePool(OutConnection);
-            }
-        }
-    }
-    ExFreePool(Pins);
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-WdmAudMixerInitialize(
-    IN PDEVICE_OBJECT DeviceObject)
-{
-    ULONG DeviceCount, Index, Count, NodeIndex, PinCount;
-    NTSTATUS Status;
-    HANDLE hDevice;
-    PFILE_OBJECT FileObject;
-    PKSMULTIPLE_ITEM NodeTypes, NodeConnections;
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-
-    /* get number of devices */
-    DeviceCount = GetSysAudioDeviceCount(DeviceObject);
-
-    if (!DeviceCount)
-    {
-        /* no audio devices available atm */
-        DeviceExtension->MixerInfoCount = 0;
-        DeviceExtension->MixerInfo = NULL;
-        return STATUS_SUCCESS;
-    }
-
-    /* each virtual audio device can at most have an input + output mixer */
-    DeviceExtension->MixerInfo = ExAllocatePool(NonPagedPool, sizeof(MIXER_INFO) * DeviceCount * 2);
-    if (!DeviceExtension->MixerInfo)
-    {
-        /* not enough memory */
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    /* clear mixer info */
-    RtlZeroMemory(DeviceExtension->MixerInfo, sizeof(MIXER_INFO) * DeviceCount * 2);
-
-    Index = 0;
-    Count = 0;
-    do
-    {
-        /* open the virtual audio device */
-        Status = OpenSysAudioDeviceByIndex(DeviceObject, Index, &hDevice, &FileObject);
-
-        if (NT_SUCCESS(Status))
-        {
-            /* retrieve all available node types */
-            Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes);
-            if (!NT_SUCCESS(Status))
-            {
-                ObDereferenceObject(FileObject);
-                ZwClose(hDevice);
-                break;
-            }
-
-            Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_CONNECTIONS, &NodeConnections);
-            if (!NT_SUCCESS(Status))
-            {
-                ObDereferenceObject(FileObject);
-                ZwClose(hDevice);
-                ExFreePool(NodeTypes);
-                break;
-            }
-
-            /* get num of pins */
-            PinCount = GetPinCount(FileObject);
-            /* get the first available dac node index */
-            NodeIndex = GetNodeTypeIndex(NodeTypes, (LPGUID)&KSNODETYPE_DAC);
-            if (NodeIndex != (ULONG)-1)
-            {
-                Status = InitializeMixer(DeviceObject, Index, &DeviceExtension->MixerInfo[Count], hDevice, FileObject, PinCount, NodeTypes, NodeConnections, NodeIndex, FALSE);
-                if (NT_SUCCESS(Status))
-                {
-                    /* increment mixer offset */
-                    Count++;
-                }
-            }
-
-            /* get the first available adc node index */
-            NodeIndex = GetNodeTypeIndex(NodeTypes, (LPGUID)&KSNODETYPE_ADC);
-            if (NodeIndex != (ULONG)-1)
-            {
-                Status = InitializeMixer(DeviceObject, Index, &DeviceExtension->MixerInfo[Count], hDevice, FileObject, PinCount, NodeTypes, NodeConnections, NodeIndex, TRUE);
-                if (NT_SUCCESS(Status))
-                {
-                    /* increment mixer offset */
-                    Count++;
-                }
-            }
-
-            /* free node connections array */
-            ExFreePool(NodeTypes);
-            ExFreePool(NodeConnections);
-
-            /* close virtual audio device */
-            ObDereferenceObject(FileObject);
-            ZwClose(hDevice);
-
-        }
-        /* increment virtual audio device index */
-        Index++;
-    }while(Index < DeviceCount);
-
-    /* store mixer count */
-    DeviceExtension->MixerInfoCount = Count;
-
-    return Status;
-}
-
-
-
-NTSTATUS
-WdmAudMixerCapabilities(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN  PWDMAUD_CLIENT ClientInfo,
-    IN PWDMAUD_DEVICE_EXTENSION DeviceExtension)
-{
-    if ((ULONG)DeviceInfo->DeviceIndex >= DeviceExtension->MixerInfoCount)
-    {
-        /* invalid parameter */
-        return STATUS_INVALID_PARAMETER;
-    }
-
-    /* copy cached mixer caps */
-    RtlMoveMemory(&DeviceInfo->u.MixCaps, &DeviceExtension->MixerInfo[(ULONG)DeviceInfo->DeviceIndex].MixCaps, sizeof(MIXERCAPSW));
-
-    return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-WdmAudControlOpenMixer(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  PIRP Irp,
-    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN  PWDMAUD_CLIENT ClientInfo)
-{
-    ULONG Index;
-    PWDMAUD_HANDLE Handels;
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    NTSTATUS Status;
-    PKEVENT EventObject = NULL;
-
-    DPRINT("WdmAudControlOpenMixer\n");
-
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    if (DeviceInfo->DeviceIndex >= DeviceExtension->MixerInfoCount)
-    {
-        /* mixer index doesnt exist */
-        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
-    }
-
-    if (DeviceInfo->u.hNotifyEvent)
-    {
-        Status = ObReferenceObjectByHandle(DeviceInfo->u.hNotifyEvent, EVENT_MODIFY_STATE, ExEventObjectType, UserMode, (LPVOID*)&EventObject, NULL);
-
-        if (!NT_SUCCESS(Status))
-        {
-            DPRINT1("Invalid notify event passed %p from client %p\n", DeviceInfo->u.hNotifyEvent, ClientInfo);
-            DbgBreakPoint();
-            return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
-        }
-    }
-
-
-    for(Index = 0; Index < ClientInfo->NumPins; Index++)
-    {
-        if (ClientInfo->hPins[Index].Handle == (HANDLE)DeviceInfo->DeviceIndex && ClientInfo->hPins[Index].Type == MIXER_DEVICE_TYPE)
-        {
-            /* re-use pseudo handle */
-            DeviceInfo->hDevice = (HANDLE)DeviceInfo->DeviceIndex;
-            ClientInfo->hPins[Index].NotifyEvent = EventObject;
-            return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-        }
-    }
-
-    Handels = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1));
-
-    if (Handels)
-    {
-        if (ClientInfo->NumPins)
-        {
-            RtlMoveMemory(Handels, ClientInfo->hPins, sizeof(WDMAUD_HANDLE) * ClientInfo->NumPins);
-            ExFreePool(ClientInfo->hPins);
-        }
-
-        ClientInfo->hPins = Handels;
-        ClientInfo->hPins[ClientInfo->NumPins].Handle = (HANDLE)DeviceInfo->DeviceIndex;
-        ClientInfo->hPins[ClientInfo->NumPins].Type = MIXER_DEVICE_TYPE;
-        ClientInfo->hPins[ClientInfo->NumPins].NotifyEvent = EventObject;
-        ClientInfo->NumPins++;
-    }
-    else
-    {
-        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO));
-    }
-    DeviceInfo->hDevice = (HANDLE)DeviceInfo->DeviceIndex;
-
-    return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-}
-
-NTSTATUS
-NTAPI
-WdmAudGetLineInfo(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  PIRP Irp,
-    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN  PWDMAUD_CLIENT ClientInfo)
-{
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    LPMIXERLINE_EXT MixerLineSrc;
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
-
-    if (DeviceInfo->Flags == MIXER_GETLINEINFOF_DESTINATION)
-    {
-        if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount)
-        {
-            /* invalid parameter */
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-
-        if (DeviceInfo->u.MixLine.dwDestination != 0)
-        {
-            /* invalid parameter */
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-        MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DESTINATION_LINE);
-        ASSERT(MixerLineSrc);
-
-        /* copy cached data */
-        RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
-        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-    }
-    else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_SOURCE)
-    {
-        if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount)
-        {
-            /* invalid parameter */
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-
-        MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DESTINATION_LINE);
-        ASSERT(MixerLineSrc);
-
-        if (DeviceInfo->u.MixLine.dwSource >= MixerLineSrc->Line.cConnections)
-        {
-            DPRINT1("dwSource %u > Destinations %u\n", DeviceInfo->u.MixLine.dwSource, MixerLineSrc->Line.cConnections);
-            /* invalid parameter */
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-
-        MixerLineSrc = GetSourceMixerLine(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwSource);
-        if (MixerLineSrc)
-        {
-            DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
-            RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
-        }
-        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-    }
-    else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_LINEID)
-    {
-        if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount)
-        {
-            /* invalid parameter */
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-
-        MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwLineID);
-        if (!MixerLineSrc)
-        {
-            DPRINT1("Failed to find Line with id %u\n", DeviceInfo->u.MixLine.dwLineID);
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-
-        /* copy cached data */
-        RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
-        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-    }
-    else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_COMPONENTTYPE)
-    {
-        if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount)
-        {
-            /* invalid parameter */
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-
-        MixerLineSrc = GetSourceMixerLineByComponentType(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwComponentType);
-        if (!MixerLineSrc)
-        {
-            DPRINT1("Failed to find component type %x\n", DeviceInfo->u.MixLine.dwComponentType);
-            return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
-        }
-
-        ASSERT(MixerLineSrc);
-
-        /* copy cached data */
-        RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
-        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-    }
-
-    DPRINT("Flags %x\n", DeviceInfo->Flags);
-    UNIMPLEMENTED;
-
-    //DbgBreakPoint();
-    return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0);
-
-}
-
-NTSTATUS
-NTAPI
-WdmAudGetLineControls(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  PIRP Irp,
-    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN  PWDMAUD_CLIENT ClientInfo)
-{
-    LPMIXERLINE_EXT MixerLineSrc;
-    LPMIXERCONTROLW MixerControl;
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    ULONG Index;
-    NTSTATUS Status;
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
-
-    if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ALL)
-    {
-        if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount)
-        {
-            /* invalid parameter */
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-
-        MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID);
-        ASSERT(MixerLineSrc);
-        if (MixerLineSrc)
-        {
-            RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, MixerLineSrc->LineControls, min(MixerLineSrc->Line.cControls, DeviceInfo->u.MixControls.cControls) * sizeof(MIXERCONTROLW));
-        }
-        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-    }
-    else if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ONEBYTYPE)
-    {
-        if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount)
-        {
-            /* invalid parameter */
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-
-        MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID);
-        ASSERT(MixerLineSrc);
-
-        Index = 0;
-        for(Index = 0; Index < MixerLineSrc->Line.cControls; Index++)
-        {
-            DPRINT("dwControlType %x\n", MixerLineSrc->LineControls[Index].dwControlType);
-            if (DeviceInfo->u.MixControls.dwControlType == MixerLineSrc->LineControls[Index].dwControlType)
-            {
-                RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, &MixerLineSrc->LineControls[Index], sizeof(MIXERCONTROLW));
-                return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-            }
-        }
-        DPRINT("DeviceInfo->u.MixControls.dwControlType %x not found in Line %x cControls %u \n", DeviceInfo->u.MixControls.dwControlType, DeviceInfo->u.MixControls.dwLineID, MixerLineSrc->Line.cControls);
-        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO));
-    }
-    else if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ONEBYID)
-    {
-        if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount)
-        {
-            /* invalid parameter */
-            return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-        }
-        DPRINT("MixerId %u ControlId %u\n",(ULONG_PTR)DeviceInfo->hDevice,  DeviceInfo->u.MixControls.dwControlID);
-        Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwControlID, NULL, &MixerControl, NULL);
-        if (NT_SUCCESS(Status))
-        {
-            RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, MixerControl, sizeof(MIXERCONTROLW));
-        }
-        return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
-    }
-
-    UNIMPLEMENTED;
-    //DbgBreakPoint();
-    return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0);
-
-}
-
-NTSTATUS
-SetGetControlDetails(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG DeviceId,
-    IN ULONG NodeId,
-    IN PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN ULONG bSet,
-    IN ULONG PropertyId,
-    IN ULONG Channel,
-    IN PLONG InputValue)
-{
-    KSNODEPROPERTY_AUDIO_CHANNEL Property;
-    NTSTATUS Status;
-    HANDLE hDevice;
-    PFILE_OBJECT FileObject;
-    LONG Value;
-    ULONG BytesReturned;
-
-    if (bSet)
-        Value = *InputValue;
-
-    /* open virtual audio device */
-    Status = OpenSysAudioDeviceByIndex(DeviceObject, DeviceId, &hDevice, &FileObject);
-
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed */
-        return Status;
-    }
-
-    /* setup the request */
-    RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL));
-
-    Property.NodeProperty.NodeId = NodeId;
-    Property.NodeProperty.Property.Id = PropertyId;
-    Property.NodeProperty.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY;
-    Property.NodeProperty.Property.Set = KSPROPSETID_Audio;
-    Property.Channel = Channel;
-
-    if (bSet)
-        Property.NodeProperty.Property.Flags |= KSPROPERTY_TYPE_SET;
-    else
-        Property.NodeProperty.Property.Flags |= KSPROPERTY_TYPE_GET;
-
-    /* send the request */
-    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), (PVOID)&Value, sizeof(LONG), &BytesReturned);
-
-    ObDereferenceObject(FileObject);
-    ZwClose(hDevice);
-
-    if (!bSet)
-    {
-        *InputValue = Value;
-    }
-
-    DPRINT("Status %x bSet %u NodeId %u Value %d PropertyId %u\n", Status, bSet, NodeId, Value, PropertyId);
-    return Status;
-}
-
-NTSTATUS
-NotifyWdmAudClients(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG NotificationType,
-    IN HANDLE hMixer,
-    IN ULONG Value)
-{
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    PLIST_ENTRY Entry;
-    PWDMAUD_CLIENT CurClient;
-    PMIXER_EVENT Event;
-    KIRQL OldIrql;
-    ULONG Index;
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    /* acquire client context lock */
-    KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql);
-
-    /* point to first entry */
-    Entry = DeviceExtension->WdmAudClientList.Flink;
-
-    /* iterate through all clients */
-    while(Entry != &DeviceExtension->WdmAudClientList)
-    {
-        /* get client context */
-        CurClient = (PWDMAUD_CLIENT)CONTAINING_RECORD(Entry, WDMAUD_CLIENT, Entry);
-
-        /* now iterate through all pins and try to find an matching handle */
-        for(Index = 0; Index < CurClient->NumPins; Index++)
-        {
-            if (CurClient->hPins[Index].Handle == hMixer && CurClient->hPins[Index].Type == MIXER_DEVICE_TYPE && CurClient->hPins[Index].NotifyEvent)
-            {
-                /* allocate event entry */
-                Event = (PMIXER_EVENT)ExAllocatePool(NonPagedPool, sizeof(MIXER_EVENT));
-                if (!Event)
-                {
-                    /* no memory */
-                    return STATUS_INSUFFICIENT_RESOURCES;
-                }
-
-                /* initialize event entry */
-                Event->hMixer = hMixer;
-                Event->NotificationType = NotificationType;
-                Event->Value = Value;
-
-                /* insert event entry */
-                InsertTailList(&CurClient->MixerEventList, &Event->Entry);
-
-                DPRINT("Notifying %p hMixer %p Value %x NotificationType %u\n", CurClient->hPins[Index].NotifyEvent, hMixer, Value, NotificationType);
-
-                /* now signal the event */
-                KeSetEvent(CurClient->hPins[Index].NotifyEvent, 0, FALSE);
-
-
-
-                /* search next client */
-                break;
-            }
-        }
-
-        /* move to next client */
-        Entry = Entry->Flink;
-    }
-
-    /* release client context lock */
-    KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql);
-
-    /* done */
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-SetGetMuteControlDetails(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG DeviceId,
-    IN ULONG NodeId,
-    IN ULONG dwLineID,
-    IN PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN ULONG bSet)
-{
-    LPMIXERCONTROLDETAILS_BOOLEAN Input;
-    LONG Value;
-    NTSTATUS Status;
-
-    if (DeviceInfo->u.MixDetails.cbDetails != sizeof(MIXERCONTROLDETAILS_BOOLEAN))
-        return STATUS_INVALID_PARAMETER;
-
-    /* get input */
-    Input = (LPMIXERCONTROLDETAILS_BOOLEAN)DeviceInfo->u.MixDetails.paDetails;
-
-    /* FIXME SEH */
-    if (bSet)
-        Value = Input->fValue;
-
-    /* set control details */
-    Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_MUTE, 0, &Value);
-
-    if (!NT_SUCCESS(Status))
-        return Status;
-
-    /* FIXME SEH */
-    if (!bSet)
-    {
-        Input->fValue = Value;
-        return Status;
-    }
-    else
-    {
-        /* notify clients of a line change */
-        NotifyWdmAudClients(DeviceObject, MM_MIXM_LINE_CHANGE, DeviceInfo->hDevice, dwLineID);
-    }
-
-
-    return Status;
-}
-
-ULONG
-GetVolumeControlIndex(
-    LPMIXERVOLUME_DATA VolumeData,
-    LONG Value)
-{
-    ULONG Index;
-
-    for(Index = 0; Index < VolumeData->ValuesCount; Index++)
-    {
-        if (VolumeData->Values[Index] > Value)
-        {
-            return VolumeData->InputSteppingDelta * Index;
-        }
-    }
-    return VolumeData->InputSteppingDelta * (VolumeData->ValuesCount-1);
-}
-
-
-NTSTATUS
-SetGetVolumeControlDetails(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG DeviceId,
-    IN ULONG NodeId,
-    IN PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN ULONG bSet,
-    LPMIXERCONTROLW MixerControl,
-    LPMIXERLINE_EXT MixerLine)
-{
-    LPMIXERCONTROLDETAILS_UNSIGNED Input;
-    LONG Value, Index, Channel = 0;
-    ULONG dwValue;
-    NTSTATUS Status;
-    LPMIXERVOLUME_DATA VolumeData;
-
-    if (DeviceInfo->u.MixDetails.cbDetails != sizeof(MIXERCONTROLDETAILS_SIGNED))
-        return STATUS_INVALID_PARAMETER;
-
-    VolumeData = (LPMIXERVOLUME_DATA)GetMixerControlDataById(&MixerLine->LineControlsExtraData, MixerControl->dwControlID);
-    if (!VolumeData)
-        return STATUS_INSUFFICIENT_RESOURCES;
-
-
-    /* get input */
-    Input = (LPMIXERCONTROLDETAILS_UNSIGNED)DeviceInfo->u.MixDetails.paDetails;
-
-    if (bSet)
-    {
-        /* FIXME SEH */
-        Value = Input->dwValue;
-        Index = Value / VolumeData->InputSteppingDelta;
-
-        if (Index >= VolumeData->ValuesCount)
-        {
-            DPRINT1("Index %u out of bounds %u \n", Index, VolumeData->ValuesCount);
-            DbgBreakPoint();
-            return STATUS_INVALID_PARAMETER;
-        }
-
-        Value = VolumeData->Values[Index];
-    }
-
-    /* set control details */
-    if (bSet)
-    {
-        Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 0, &Value);
-        Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 1, &Value);
-    }
-    else
-    {
-        Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, Channel, &Value);
-    }
-
-    if (!bSet)
-    {
-        dwValue = GetVolumeControlIndex(VolumeData, (LONG)Value);
-        /* FIXME SEH */
-        Input->dwValue = dwValue;
-    }
-    else
-        {
-        /* notify clients of a line change */
-        NotifyWdmAudClients(DeviceObject, MM_MIXM_CONTROL_CHANGE, DeviceInfo->hDevice, MixerControl->dwControlID);
-    }
-                return Status;
-            }
-
-NTSTATUS
-NTAPI
-WdmAudGetMixerEvent(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  PIRP Irp,
-    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN  PWDMAUD_CLIENT ClientInfo)
-{
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    PMIXER_EVENT Event = NULL;
-    PLIST_ENTRY Entry;
-    KIRQL OldIrql;
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    /* acquire client context lock */
-    KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql);
-
-    /* point to first entry */
-    Entry = ClientInfo->MixerEventList.Flink;
-
-    while(Entry != &ClientInfo->MixerEventList)
-    {
-        /* get mixer event */
-        Event = (PMIXER_EVENT)CONTAINING_RECORD(Entry, MIXER_EVENT, Entry);
-
-        if (Event->hMixer == DeviceInfo->hDevice)
-        {
-            /* found an event for that particular device */
-            RemoveEntryList(&Event->Entry);
-            break;
-        }
-
-        /* no match found */
-        Event = NULL;
-
-        /* move to next entry */
-        Entry = Entry->Flink;
-    }
-
-    /* release client context lock */
-    KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql);
-
-    if (!Event)
-    {
-        /* no events available */
-        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
-}
-
-    /* store event result */
-    DeviceInfo->u.MixerEvent.hMixer = Event->hMixer;
-    DeviceInfo->u.MixerEvent.NotificationType = Event->NotificationType;
-    DeviceInfo->u.MixerEvent.Value = Event->Value;
-
-    /* free event info */
-    ExFreePool(Event);
-
-    /* done */
-    return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-}
-
-NTSTATUS
-NTAPI
-WdmAudSetControlDetails(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  PIRP Irp,
-    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN  PWDMAUD_CLIENT ClientInfo)
-{
-    LPMIXERLINE_EXT MixerLine;
-    LPMIXERCONTROLW MixerControl;
-    ULONG NodeId;
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    NTSTATUS Status;
-
-    DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
-
-    DPRINT("cbStruct %u Expected %u dwControlID %u cChannels %u cMultipleItems %u cbDetails %u paDetails %p Flags %x\n", 
-            DeviceInfo->u.MixDetails.cbStruct, sizeof(MIXERCONTROLDETAILS), DeviceInfo->u.MixDetails.dwControlID, DeviceInfo->u.MixDetails.cChannels, DeviceInfo->u.MixDetails.cMultipleItems, DeviceInfo->u.MixDetails.cbDetails, DeviceInfo->u.MixDetails.paDetails, DeviceInfo->Flags);
-
-    if (DeviceInfo->Flags & MIXER_GETCONTROLDETAILSF_LISTTEXT)
-    {
-        UNIMPLEMENTED;
-        return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0);
-    }
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    /* get mixer control */
-     Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId);
-
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("MixerControl %x not found\n", DeviceInfo->u.MixDetails.dwControlID);
-        return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-    }
-
-    Status = STATUS_NOT_IMPLEMENTED;
-    DPRINT("dwLineId %x dwControlID %x dwControlType %x\n", MixerLine->Line.dwLineID, MixerControl->dwControlID, MixerControl->dwControlType);
-    if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
-    {
-        /* send the request */
-        Status = SetGetMuteControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, MixerLine->Line.dwLineID, DeviceInfo, TRUE);
-    }
-    else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
-    {
-        Status = SetGetVolumeControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, DeviceInfo, TRUE, MixerControl, MixerLine);
-    }
-    return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
-
-}
-
-NTSTATUS
-NTAPI
-WdmAudGetControlDetails(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  PIRP Irp,
-    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN  PWDMAUD_CLIENT ClientInfo)
-{
-    LPMIXERLINE_EXT MixerLine;
-    LPMIXERCONTROLW MixerControl;
-    ULONG NodeId;
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    NTSTATUS Status;
-
-    DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
-
-    DPRINT("cbStruct %u Expected %u dwControlID %u cChannels %u cMultipleItems %u cbDetails %u paDetails %p Flags %x\n", 
-            DeviceInfo->u.MixDetails.cbStruct, sizeof(MIXERCONTROLDETAILS), DeviceInfo->u.MixDetails.dwControlID, DeviceInfo->u.MixDetails.cChannels, DeviceInfo->u.MixDetails.cMultipleItems, DeviceInfo->u.MixDetails.cbDetails, DeviceInfo->u.MixDetails.paDetails, DeviceInfo->Flags);
-
-    if (DeviceInfo->Flags & MIXER_GETCONTROLDETAILSF_LISTTEXT)
-    {
-        UNIMPLEMENTED;
-        return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0);
-    }
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    /* get mixer control */
-     Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId);
-
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("MixerControl %x not found\n", DeviceInfo->u.MixDetails.dwControlID);
-        return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
-    }
-
-    Status = STATUS_NOT_IMPLEMENTED;
-    DPRINT("dwLineId %x dwControlID %x dwControlType %x\n", MixerLine->Line.dwLineID, MixerControl->dwControlID, MixerControl->dwControlType);
-    if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
-    {
-        /* send the request */
-        Status = SetGetMuteControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, MixerLine->Line.dwLineID, DeviceInfo, FALSE);
-    }
-    else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
-    {
-        Status = SetGetVolumeControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, DeviceInfo, FALSE, MixerControl, MixerLine);
-    }
-
-    return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
-
-}
-
diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c
new file mode 100644 (file)
index 0000000..cf58846
--- /dev/null
@@ -0,0 +1,665 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Kernel Streaming
+ * FILE:            drivers/wdm/audio/legacy/wdmaud/mmixer.c
+ * PURPOSE:         WDM Legacy Mixer
+ * PROGRAMMER:      Johannes Anderwald
+ */
+
+#include "wdmaud.h"
+
+
+PVOID Alloc(ULONG NumBytes);
+MIXER_STATUS Close(HANDLE hDevice);
+VOID Free(PVOID Block);
+VOID Copy(PVOID Src, PVOID Dst, ULONG NumBytes);
+MIXER_STATUS Open(IN LPWSTR DevicePath, OUT PHANDLE hDevice);
+MIXER_STATUS Control(IN HANDLE hMixer, IN ULONG dwIoControlCode, IN PVOID lpInBuffer, IN ULONG nInBufferSize, OUT PVOID lpOutBuffer, ULONG nOutBufferSize, PULONG lpBytesReturned);
+MIXER_STATUS Enum(IN  PVOID EnumContext, IN  ULONG DeviceIndex, OUT LPWSTR * DeviceName, OUT PHANDLE OutHandle, OUT PHANDLE OutKey);
+MIXER_STATUS OpenKey(IN HANDLE hKey, IN LPWSTR SubKey, IN ULONG DesiredAccess, OUT PHANDLE OutKey);
+MIXER_STATUS CloseKey(IN HANDLE hKey);
+MIXER_STATUS QueryKeyValue(IN HANDLE hKey, IN LPWSTR KeyName, OUT PVOID * ResultBuffer, OUT PULONG ResultLength, OUT PULONG KeyType);
+PVOID AllocEventData(IN ULONG ExtraSize);
+VOID FreeEventData(IN PVOID EventData);
+
+MIXER_CONTEXT MixerContext =
+{
+    sizeof(MIXER_CONTEXT),
+    NULL,
+    Alloc,
+    Control,
+    Free,
+    Open,
+    Close,
+    Copy,
+    OpenKey,
+    QueryKeyValue,
+    CloseKey,
+    AllocEventData,
+    FreeEventData
+};
+
+GUID CategoryGuid = {STATIC_KSCATEGORY_AUDIO};
+
+MIXER_STATUS
+QueryKeyValue(
+    IN HANDLE hKey,
+    IN LPWSTR lpKeyName,
+    OUT PVOID * ResultBuffer,
+    OUT PULONG ResultLength,
+    OUT PULONG KeyType)
+{
+    NTSTATUS Status;
+    UNICODE_STRING KeyName;
+    ULONG Length;
+    PKEY_VALUE_PARTIAL_INFORMATION PartialInformation;
+
+    /* initialize key name */
+    RtlInitUnicodeString(&KeyName, lpKeyName);
+
+    /* now query MatchingDeviceId key */
+    Status = ZwQueryValueKey(hKey, &KeyName, KeyValuePartialInformation, NULL, 0, &Length);
+
+    /* check for success */
+    if (Status != STATUS_BUFFER_TOO_SMALL)
+        return MM_STATUS_UNSUCCESSFUL;
+
+    /* allocate a buffer for key data */
+    PartialInformation = ExAllocatePool(NonPagedPool, Length);
+
+    if (!PartialInformation)
+        return MM_STATUS_NO_MEMORY;
+
+
+    /* now query MatchingDeviceId key */
+    Status = ZwQueryValueKey(hKey, &KeyName, KeyValuePartialInformation, PartialInformation, Length, &Length);
+
+    /* check for success */
+    if (!NT_SUCCESS(Status))
+    {
+        ExFreePool(PartialInformation);
+        return MM_STATUS_UNSUCCESSFUL;
+    }
+
+    if (KeyType)
+    {
+        /* return key type */
+        *KeyType = PartialInformation->Type;
+    }
+
+    if (ResultLength)
+    {
+        /* return data length */
+        *ResultLength = PartialInformation->DataLength;
+    }
+
+    *ResultBuffer = ExAllocatePool(NonPagedPool, PartialInformation->DataLength);
+    if (!*ResultBuffer)
+    {
+        /* not enough memory */
+        ExFreePool(PartialInformation);
+        return MM_STATUS_NO_MEMORY;
+    }
+
+    /* copy key value */
+    RtlMoveMemory(*ResultBuffer, PartialInformation->Data, PartialInformation->DataLength);
+
+    /* free key info */
+    ExFreePool(PartialInformation);
+
+    return MM_STATUS_SUCCESS;
+}
+
+MIXER_STATUS
+OpenKey(
+    IN HANDLE hKey,
+    IN LPWSTR lpSubKeyName,
+    IN ULONG DesiredAccess,
+    OUT PHANDLE OutKey)
+{
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    UNICODE_STRING SubKeyName;
+    NTSTATUS Status;
+
+    /* initialize sub key name */
+    RtlInitUnicodeString(&SubKeyName, lpSubKeyName);
+
+    /* initialize key attributes */
+    InitializeObjectAttributes(&ObjectAttributes, &SubKeyName, OBJ_CASE_INSENSITIVE | OBJ_OPENIF, hKey, NULL);
+
+    /* open the key */
+    Status = ZwOpenKey(OutKey, DesiredAccess, &ObjectAttributes);
+
+    if (NT_SUCCESS(Status))
+        return MM_STATUS_SUCCESS;
+    else
+        return MM_STATUS_UNSUCCESSFUL;
+}
+
+MIXER_STATUS
+CloseKey(
+    IN HANDLE hKey)
+{
+    if (ZwClose(hKey) == STATUS_SUCCESS)
+        return MM_STATUS_SUCCESS;
+    else
+        return MM_STATUS_UNSUCCESSFUL;
+}
+
+
+PVOID Alloc(ULONG NumBytes)
+{
+    PVOID Mem = ExAllocatePool(NonPagedPool, NumBytes);
+    if (!Mem)
+        return Mem;
+
+    RtlZeroMemory(Mem, NumBytes);
+    return Mem;
+}
+
+MIXER_STATUS
+Close(HANDLE hDevice)
+{
+    if (ZwClose(hDevice) == STATUS_SUCCESS)
+        return MM_STATUS_SUCCESS;
+    else
+        return MM_STATUS_UNSUCCESSFUL;
+}
+
+VOID
+Free(PVOID Block)
+{
+    ExFreePool(Block);
+}
+
+VOID
+Copy(PVOID Src, PVOID Dst, ULONG NumBytes)
+{
+    RtlMoveMemory(Src, Dst, NumBytes);
+}
+
+MIXER_STATUS
+Open(
+    IN LPWSTR DevicePath,
+    OUT PHANDLE hDevice)
+{
+    if (WdmAudOpenSysAudioDevice(DevicePath, hDevice) == STATUS_SUCCESS)
+        return MM_STATUS_SUCCESS;
+    else
+        return MM_STATUS_UNSUCCESSFUL;
+}
+
+MIXER_STATUS
+Control(
+    IN HANDLE hMixer,
+    IN ULONG dwIoControlCode,
+    IN PVOID lpInBuffer,
+    IN ULONG nInBufferSize,
+    OUT PVOID lpOutBuffer,
+    ULONG nOutBufferSize,
+    PULONG lpBytesReturned)
+{
+    NTSTATUS Status;
+    PFILE_OBJECT FileObject;
+
+    /* get file object */
+    Status = ObReferenceObjectByHandle(hMixer, GENERIC_READ | GENERIC_WRITE, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("failed to reference %p with %lx\n", hMixer, Status);
+        return MM_STATUS_UNSUCCESSFUL;
+    }
+
+    /* perform request */
+    Status = KsSynchronousIoControlDevice(FileObject, KernelMode, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned);
+
+    /* release object reference */
+    ObDereferenceObject(FileObject);
+
+    if (Status == STATUS_MORE_ENTRIES || Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL)
+    {
+        /* more data is available */
+        return MM_STATUS_MORE_ENTRIES;
+    }
+    else if (Status == STATUS_SUCCESS)
+    {
+        /* operation succeeded */
+        return MM_STATUS_SUCCESS;
+    }
+    else
+    {
+        DPRINT("Failed with %lx\n", Status);
+        return MM_STATUS_UNSUCCESSFUL;
+    }
+}
+
+MIXER_STATUS
+Enum(
+    IN  PVOID EnumContext,
+    IN  ULONG DeviceIndex,
+    OUT LPWSTR * DeviceName,
+    OUT PHANDLE OutHandle,
+    OUT PHANDLE OutKey)
+{
+    PDEVICE_OBJECT DeviceObject;
+    ULONG DeviceCount;
+    NTSTATUS Status;
+    UNICODE_STRING KeyName;
+
+    /* get enumeration context */
+    DeviceObject = (PDEVICE_OBJECT)EnumContext;
+
+    /* get device count */
+    DeviceCount = GetSysAudioDeviceCount(DeviceObject);
+
+    if (DeviceIndex >= DeviceCount)
+    {
+        /* no more devices */
+        return MM_STATUS_NO_MORE_DEVICES;
+    }
+
+    /* get device name */
+    Status = GetSysAudioDevicePnpName(DeviceObject, DeviceIndex, DeviceName);
+
+    if (!NT_SUCCESS(Status))
+    {
+        /* failed to retrieve device name */
+        return MM_STATUS_UNSUCCESSFUL;
+    }
+
+    /* intialize key name */
+    RtlInitUnicodeString(&KeyName, *DeviceName);
+
+    /* open device interface key */
+    Status = IoOpenDeviceInterfaceRegistryKey(&KeyName, GENERIC_READ | GENERIC_WRITE, OutKey);
+#if 0
+    if (!NT_SUCCESS(Status))
+    {
+        /* failed to open key */
+        DPRINT("IoOpenDeviceInterfaceRegistryKey failed with %lx\n", Status);
+        ExFreePool(*DeviceName);
+        return MM_STATUS_UNSUCCESSFUL;
+    }
+#endif
+
+    /* open device handle */
+    Status = OpenDevice(*DeviceName, OutHandle, NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        /* failed to open device */
+        return MM_STATUS_UNSUCCESSFUL;
+    }
+
+    return MM_STATUS_SUCCESS;
+}
+
+PVOID
+AllocEventData(
+    IN ULONG ExtraSize)
+{
+    PKSEVENTDATA Data = (PKSEVENTDATA)ExAllocatePool(NonPagedPool, sizeof(KSEVENTDATA) + ExtraSize);
+    if (!Data)
+        return NULL;
+
+    Data->EventObject.Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
+    if (!Data->EventHandle.Event)
+    {
+        ExFreePool(Data);
+        return NULL;
+    }
+
+    KeInitializeEvent(Data->EventObject.Event, NotificationEvent, FALSE);
+
+    Data->NotificationType = KSEVENTF_EVENT_HANDLE;
+    return Data;
+}
+
+VOID
+FreeEventData(IN PVOID EventData)
+{
+    PKSEVENTDATA Data = (PKSEVENTDATA)EventData;
+
+    ExFreePool(Data->EventHandle.Event);
+    ExFreePool(Data);
+}
+
+NTSTATUS
+WdmAudMixerInitialize(
+    IN PDEVICE_OBJECT DeviceObject)
+{
+    MIXER_STATUS Status;
+
+    /* initialize the mixer library */
+    Status = MMixerInitialize(&MixerContext, Enum, (PVOID)DeviceObject);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        /* failed to initialize mmixer library */
+        DPRINT("MMixerInitialize failed with %lx\n", Status);
+    }
+
+    return Status;
+}
+
+NTSTATUS
+WdmAudMixerCapabilities(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN  PWDMAUD_CLIENT ClientInfo,
+    IN PWDMAUD_DEVICE_EXTENSION DeviceExtension)
+{
+    if (MMixerGetCapabilities(&MixerContext, DeviceInfo->DeviceIndex, &DeviceInfo->u.MixCaps) == MM_STATUS_SUCCESS)
+        return STATUS_SUCCESS;
+
+    return STATUS_INVALID_PARAMETER;
+}
+
+NTSTATUS
+WdmAudControlOpenMixer(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp,
+    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN  PWDMAUD_CLIENT ClientInfo)
+{
+    HANDLE hMixer;
+    PWDMAUD_HANDLE Handles;
+    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
+    NTSTATUS Status;
+    PKEVENT EventObject = NULL;
+
+    DPRINT("WdmAudControlOpenMixer\n");
+
+    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    if (DeviceInfo->u.hNotifyEvent)
+    {
+        Status = ObReferenceObjectByHandle(DeviceInfo->u.hNotifyEvent, EVENT_MODIFY_STATE, ExEventObjectType, UserMode, (LPVOID*)&EventObject, NULL);
+
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("Invalid notify event passed %p from client %p\n", DeviceInfo->u.hNotifyEvent, ClientInfo);
+            DbgBreakPoint();
+            return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
+        }
+    }
+
+    if (MMixerOpen(&MixerContext, DeviceInfo->DeviceIndex, EventObject, NULL /* FIXME */, &hMixer) != MM_STATUS_SUCCESS)
+    {
+        ObDereferenceObject(EventObject);
+        DPRINT1("Failed to open mixer\n");
+        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
+    }
+
+
+    Handles = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1));
+
+    if (Handles)
+    {
+        if (ClientInfo->NumPins)
+        {
+            RtlMoveMemory(Handles, ClientInfo->hPins, sizeof(WDMAUD_HANDLE) * ClientInfo->NumPins);
+            ExFreePool(ClientInfo->hPins);
+        }
+
+        ClientInfo->hPins = Handles;
+        ClientInfo->hPins[ClientInfo->NumPins].Handle = hMixer;
+        ClientInfo->hPins[ClientInfo->NumPins].Type = MIXER_DEVICE_TYPE;
+        ClientInfo->hPins[ClientInfo->NumPins].NotifyEvent = EventObject;
+        ClientInfo->NumPins++;
+    }
+    else
+    {
+        ObDereferenceObject(EventObject);
+        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO));
+    }
+
+    DeviceInfo->hDevice = hMixer;
+
+    return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
+}
+
+NTSTATUS
+NTAPI
+WdmAudGetControlDetails(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp,
+    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN  PWDMAUD_CLIENT ClientInfo)
+{
+    MIXER_STATUS Status;
+
+    /* clear hmixer type flag */
+    DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
+
+    /* query mmixer library */
+    Status = MMixerGetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixDetails);
+
+    if (Status == MM_STATUS_SUCCESS)
+        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
+    else
+        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO));
+}
+
+NTSTATUS
+NTAPI
+WdmAudGetLineInfo(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp,
+    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN  PWDMAUD_CLIENT ClientInfo)
+{
+    MIXER_STATUS Status;
+
+    /* clear hmixer type flag */
+    DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
+
+    /* query mixer library */
+    Status = MMixerGetLineInfo(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixLine);
+
+    if (Status == MM_STATUS_SUCCESS)
+        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
+    else
+        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO));
+}
+
+NTSTATUS
+NTAPI
+WdmAudGetLineControls(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp,
+    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN  PWDMAUD_CLIENT ClientInfo)
+{
+    MIXER_STATUS Status;
+
+    /* clear hmixer type flag */
+    DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
+
+    /* query mixer library */
+    Status = MMixerGetLineControls(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixControls);
+
+    if (Status == MM_STATUS_SUCCESS)
+        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
+    else
+        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO));
+
+
+}
+
+NTSTATUS
+NTAPI
+WdmAudSetControlDetails(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp,
+    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN  PWDMAUD_CLIENT ClientInfo)
+{
+    MIXER_STATUS Status;
+
+    /* clear hmixer type flag */
+    DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
+
+    /* query mixer library */
+    Status = MMixerSetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixDetails);
+
+    if (Status == MM_STATUS_SUCCESS)
+        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
+    else
+        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO));
+}
+
+NTSTATUS
+NTAPI
+WdmAudGetMixerEvent(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp,
+    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN  PWDMAUD_CLIENT ClientInfo)
+{
+    UNIMPLEMENTED
+    return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO));
+}
+
+ULONG
+WdmAudGetMixerDeviceCount()
+{
+    return MMixerGetCount(&MixerContext);
+}
+
+ULONG
+WdmAudGetWaveInDeviceCount()
+{
+    return MMixerGetWaveInCount(&MixerContext);
+}
+
+ULONG
+WdmAudGetWaveOutDeviceCount()
+{
+    return MMixerGetWaveOutCount(&MixerContext);
+}
+
+NTSTATUS
+WdmAudGetMixerPnpNameByIndex(
+    IN  ULONG DeviceIndex,
+    OUT LPWSTR * Device)
+{
+    UNIMPLEMENTED
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+WdmAudGetPnpNameByIndexAndType(
+    IN ULONG DeviceIndex, 
+    IN SOUND_DEVICE_TYPE DeviceType, 
+    OUT LPWSTR *DevicePath)
+{
+    if (MMixerGetWaveDevicePath(&MixerContext, DeviceType == WAVE_IN_DEVICE_TYPE, DeviceIndex, DevicePath) == MM_STATUS_SUCCESS)
+        return STATUS_SUCCESS;
+    else
+        return STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS
+WdmAudWaveCapabilities(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN PWDMAUD_CLIENT ClientInfo,
+    IN PWDMAUD_DEVICE_EXTENSION DeviceExtension)
+{
+    MIXER_STATUS Status;
+
+    if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE)
+    {
+        /* get capabilities */
+        Status = MMixerWaveInCapabilities(&MixerContext, DeviceInfo->DeviceIndex, &DeviceInfo->u.WaveInCaps);
+    }
+    else if (DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE)
+    {
+        /* get capabilities */
+        Status = MMixerWaveOutCapabilities(&MixerContext, DeviceInfo->DeviceIndex, &DeviceInfo->u.WaveOutCaps);
+    }
+    else
+    {
+        ASSERT(0);
+        return STATUS_UNSUCCESSFUL;
+    }
+
+    if (Status == MM_STATUS_SUCCESS)
+        return STATUS_SUCCESS;
+    else
+        return STATUS_UNSUCCESSFUL;
+}
+
+
+MIXER_STATUS
+CreatePinCallback(
+    IN PVOID Ctx,
+    IN ULONG VirtualDeviceId,
+    IN ULONG PinId,
+    IN HANDLE hFilter,
+    IN PKSPIN_CONNECT PinConnect,
+    IN ACCESS_MASK DesiredAccess,
+    OUT PHANDLE PinHandle)
+{
+    ULONG BytesReturned;
+    SYSAUDIO_INSTANCE_INFO InstanceInfo;
+    NTSTATUS Status;
+    ULONG FreeIndex;
+    PPIN_CREATE_CONTEXT Context = (PPIN_CREATE_CONTEXT)Ctx;
+
+    /* setup property request */
+    InstanceInfo.Property.Set = KSPROPSETID_Sysaudio;
+    InstanceInfo.Property.Id = KSPROPERTY_SYSAUDIO_INSTANCE_INFO;
+    InstanceInfo.Property.Flags = KSPROPERTY_TYPE_SET;
+    InstanceInfo.Flags = 0;
+    InstanceInfo.DeviceNumber = VirtualDeviceId;
+
+    /* attach to virtual device */
+    Status = KsSynchronousIoControlDevice(Context->DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&InstanceInfo, sizeof(SYSAUDIO_INSTANCE_INFO), NULL, 0, &BytesReturned);
+
+    if (!NT_SUCCESS(Status))
+        return MM_STATUS_UNSUCCESSFUL;
+
+    /* close existing pin */
+    FreeIndex = ClosePin(Context->ClientInfo, VirtualDeviceId, PinId, Context->DeviceType);
+
+    /* now create the pin */
+    Status = KsCreatePin(Context->DeviceExtension->hSysAudio, PinConnect, DesiredAccess, PinHandle);
+
+    /* check for success */
+    if (!NT_SUCCESS(Status))
+        return MM_STATUS_UNSUCCESSFUL;
+
+    /* store the handle */
+    Status = InsertPinHandle(Context->ClientInfo, VirtualDeviceId, PinId, Context->DeviceType, *PinHandle, FreeIndex);
+    if (!NT_SUCCESS(Status))
+    {
+        /* failed to insert handle */
+        ZwClose(*PinHandle);
+        return MM_STATUS_UNSUCCESSFUL;
+    }
+
+    return MM_STATUS_SUCCESS;
+}
+
+NTSTATUS
+WdmAudControlOpenWave(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  PIRP Irp,
+    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
+    IN  PWDMAUD_CLIENT ClientInfo)
+{
+    MIXER_STATUS Status;
+    PIN_CREATE_CONTEXT Context;
+
+    Context.ClientInfo = ClientInfo;
+    Context.DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+    Context.DeviceType = DeviceInfo->DeviceType;
+
+    Status = MMixerOpenWave(&MixerContext, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE, &DeviceInfo->u.WaveFormatEx, CreatePinCallback, &Context, &DeviceInfo->hDevice);
+
+    if (Status == MM_STATUS_SUCCESS)
+        return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
+    else
+        return SetIrpIoStatus(Irp, STATUS_NOT_SUPPORTED, sizeof(WDMAUD_DEVICE_INFO));
+}
index dd61c34..5820abc 100644 (file)
@@ -2,12 +2,37 @@
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS Kernel Streaming
  * FILE:            drivers/wdm/audio/legacy/wdmaud/sup.c
- * PURPOSE:         System Audio graph builder
+ * PURPOSE:         Misc support routines
  * PROGRAMMER:      Andrew Greenwood
  *                  Johannes Anderwald
  */
 #include "wdmaud.h"
 
+ULONG
+GetSysAudioDeviceCount(
+    IN  PDEVICE_OBJECT DeviceObject)
+{
+    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
+    KSPROPERTY Pin;
+    ULONG Count, BytesReturned;
+    NTSTATUS Status;
+
+    /* setup the query request */
+    Pin.Set = KSPROPSETID_Sysaudio;
+    Pin.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT;
+    Pin.Flags = KSPROPERTY_TYPE_GET;
+
+    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    /* query sysaudio for the device count */
+    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned);
+    if (!NT_SUCCESS(Status))
+        return 0;
+
+    return Count;
+}
+
+
 NTSTATUS
 SetIrpIoStatus(
     IN PIRP Irp,
@@ -21,7 +46,7 @@ SetIrpIoStatus(
 
 }
 
-NTSTATUS
+ULONG
 ClosePin(
     IN  PWDMAUD_CLIENT ClientInfo,
     IN  ULONG FilterId,
@@ -298,3 +323,83 @@ FindProductName(
     return Status;
 }
 
+NTSTATUS
+GetSysAudioDevicePnpName(
+    IN  PDEVICE_OBJECT DeviceObject,
+    IN  ULONG DeviceIndex,
+    OUT LPWSTR * Device)
+{
+    ULONG BytesReturned;
+    KSP_PIN Pin;
+    NTSTATUS Status;
+    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
+
+   /* first check if the device index is within bounds */
+   if (DeviceIndex >= GetSysAudioDeviceCount(DeviceObject))
+       return STATUS_INVALID_PARAMETER;
+
+    /* setup the query request */
+    Pin.Property.Set = KSPROPSETID_Sysaudio;
+    Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME;
+    Pin.Property.Flags = KSPROPERTY_TYPE_GET;
+    Pin.PinId = DeviceIndex;
+
+    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    /* query sysaudio for the device path */
+    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), NULL, 0, &BytesReturned);
+
+    /* check if the request failed */
+    if (Status != STATUS_BUFFER_TOO_SMALL || BytesReturned == 0)
+        return STATUS_UNSUCCESSFUL;
+
+    /* allocate buffer for the device */
+    *Device = ExAllocatePool(NonPagedPool, BytesReturned);
+    if (!Device)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* query sysaudio again for the device path */
+    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), (PVOID)*Device, BytesReturned, &BytesReturned);
+
+    if (!NT_SUCCESS(Status))
+    {
+        /* failed */
+        ExFreePool(*Device);
+        return Status;
+    }
+
+    return Status;
+}
+
+NTSTATUS
+OpenDevice(
+    IN LPWSTR Device,
+    OUT PHANDLE DeviceHandle,
+    OUT PFILE_OBJECT * FileObject)
+{
+    NTSTATUS Status;
+    HANDLE hDevice;
+
+    /* now open the device */
+    Status = WdmAudOpenSysAudioDevice(Device, &hDevice);
+
+    if (!NT_SUCCESS(Status))
+    {
+        return Status;
+    }
+
+    *DeviceHandle = hDevice;
+
+    if (FileObject)
+    {
+        Status = ObReferenceObjectByHandle(hDevice, FILE_READ_DATA | FILE_WRITE_DATA, IoFileObjectType, KernelMode, (PVOID*)FileObject, NULL);
+
+        if (!NT_SUCCESS(Status))
+        {
+            ZwClose(hDevice);
+        }
+    }
+
+    return Status;
+
+}
diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/wave.c b/reactos/drivers/wdm/audio/legacy/wdmaud/wave.c
deleted file mode 100644 (file)
index be57468..0000000
+++ /dev/null
@@ -1,756 +0,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS Kernel Streaming
- * FILE:            drivers/wdm/audio/legacy/wdmaud/wave.c
- * PURPOSE:         Wave Out enumeration
- * PROGRAMMER:      Andrew Greenwood
- *                  Johannes Anderwald
- */
-#include "wdmaud.h"
-
-
-typedef struct
-{
-    ULONG SampleRate;
-    ULONG Bit8Mono;
-    ULONG Bit8Stereo;
-    ULONG Bit16Mono;
-    ULONG Bit16Stereo;
-}AUDIO_RANGE;
-
-#define AUDIO_TEST_RANGE (5)
-
-static AUDIO_RANGE TestRange[AUDIO_TEST_RANGE] =
-{
-    {
-        11025,
-        WAVE_FORMAT_1M08,
-        WAVE_FORMAT_1S08,
-        WAVE_FORMAT_1M16,
-        WAVE_FORMAT_1S16
-    },
-    {
-        22050,
-        WAVE_FORMAT_2M08,
-        WAVE_FORMAT_2S08,
-        WAVE_FORMAT_2M16,
-        WAVE_FORMAT_2S16
-    },
-    {
-        44100,
-        WAVE_FORMAT_4M08,
-        WAVE_FORMAT_4S08,
-        WAVE_FORMAT_4M16,
-        WAVE_FORMAT_4S16
-    },
-    {
-        48000,
-        WAVE_FORMAT_48M08,
-        WAVE_FORMAT_48S08,
-        WAVE_FORMAT_48M16,
-        WAVE_FORMAT_48S16
-    },
-    {
-        96000,
-        WAVE_FORMAT_96M08,
-        WAVE_FORMAT_96S08,
-        WAVE_FORMAT_96M16,
-        WAVE_FORMAT_96S16
-    }
-};
-
-LPWAVE_INFO
-AllocateWaveInfo()
-{
-    /* allocate wav info */
-    LPWAVE_INFO WaveOutInfo = ExAllocatePool(NonPagedPool, sizeof(WAVE_INFO));
-    if (!WaveOutInfo)
-        return NULL;
-
-    /* zero wave info struct */
-    RtlZeroMemory(WaveOutInfo, sizeof(WAVE_INFO));
-
-    return WaveOutInfo;
-}
-
-PKSPIN_CONNECT
-AllocatePinConnect(
-    ULONG DataFormatSize)
-{
-    PKSPIN_CONNECT Connect = ExAllocatePool(NonPagedPool, sizeof(KSPIN_CONNECT) + DataFormatSize);
-    if (!Connect)
-        return NULL;
-
-    /* zero pin connect struct */
-    RtlZeroMemory(Connect, sizeof(KSPIN_CONNECT) + DataFormatSize);
-
-    return Connect;
-}
-
-NTSTATUS
-GetWaveInfoByIndexAndType(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  ULONG DeviceIndex,
-    IN  SOUND_DEVICE_TYPE DeviceType,
-    OUT LPWAVE_INFO *OutWaveInfo)
-{
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    ULONG Index = 0;
-    PLIST_ENTRY Entry, ListHead;
-    LPWAVE_INFO WaveInfo;
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    if (DeviceType == WAVE_IN_DEVICE_TYPE)
-        ListHead = &DeviceExtension->WaveInList;
-    else
-        ListHead = &DeviceExtension->WaveOutList;
-
-    /* get first entry */
-    Entry = ListHead->Flink;
-
-    while(Entry != ListHead)
-    {
-        WaveInfo = (LPWAVE_INFO)CONTAINING_RECORD(Entry, WAVE_INFO, Entry);
-
-        if (Index == DeviceIndex)
-        {
-            *OutWaveInfo = WaveInfo;
-            return STATUS_SUCCESS;
-        }
-        Index++;
-        Entry = Entry->Flink;
-    }
-
-    return STATUS_NOT_FOUND;
-}
-
-
-VOID
-InitializePinConnect(
-    IN OUT PKSPIN_CONNECT PinConnect,
-    IN ULONG PinId)
-{
-    PinConnect->Interface.Set = KSINTERFACESETID_Standard;
-    PinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING;
-    PinConnect->Interface.Flags = 0;
-    PinConnect->Medium.Set = KSMEDIUMSETID_Standard;
-    PinConnect->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE;
-    PinConnect->Medium.Flags = 0;
-    PinConnect->PinToHandle = NULL;
-    PinConnect->PinId = PinId;
-    PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL;
-    PinConnect->Priority.PrioritySubClass = 1;
-}
-
-VOID
-InitializeDataFormat(
-    IN PKSDATAFORMAT_WAVEFORMATEX DataFormat,
-    LPWAVEFORMATEX WaveFormatEx)
-{
-
-    DataFormat->WaveFormatEx.wFormatTag = WaveFormatEx->wFormatTag;
-    DataFormat->WaveFormatEx.nChannels = WaveFormatEx->nChannels;
-    DataFormat->WaveFormatEx.nSamplesPerSec = WaveFormatEx->nSamplesPerSec;
-    DataFormat->WaveFormatEx.nBlockAlign = WaveFormatEx->nBlockAlign;
-    DataFormat->WaveFormatEx.nAvgBytesPerSec = WaveFormatEx->nAvgBytesPerSec;
-    DataFormat->WaveFormatEx.wBitsPerSample = WaveFormatEx->wBitsPerSample;
-    DataFormat->WaveFormatEx.cbSize = 0;
-    DataFormat->DataFormat.FormatSize = sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX);
-    DataFormat->DataFormat.Flags = 0;
-    DataFormat->DataFormat.Reserved = 0;
-    DataFormat->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO;
-
-    DataFormat->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
-    DataFormat->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX;
-    DataFormat->DataFormat.SampleSize = 4;
-}
-
-
-NTSTATUS
-AttachToVirtualAudioDevice(
-    IN PWDMAUD_DEVICE_EXTENSION DeviceExtension,
-    IN ULONG VirtualDeviceId)
-{
-    ULONG BytesReturned;
-    SYSAUDIO_INSTANCE_INFO InstanceInfo;
-
-    /* setup property request */
-    InstanceInfo.Property.Set = KSPROPSETID_Sysaudio;
-    InstanceInfo.Property.Id = KSPROPERTY_SYSAUDIO_INSTANCE_INFO;
-    InstanceInfo.Property.Flags = KSPROPERTY_TYPE_SET;
-    InstanceInfo.Flags = 0;
-    InstanceInfo.DeviceNumber = VirtualDeviceId;
-
-    /* attach to virtual device */
-   return KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&InstanceInfo, sizeof(SYSAUDIO_INSTANCE_INFO), NULL, 0, &BytesReturned);
-
-}
-
-NTSTATUS
-GetAudioPinDataRanges(
-    IN PWDMAUD_DEVICE_EXTENSION DeviceExtension,
-    IN ULONG FilterId,
-    IN ULONG PinId,
-    IN OUT PKSMULTIPLE_ITEM * OutMultipleItem)
-{
-    KSP_PIN PinProperty;
-    ULONG BytesReturned = 0;
-    NTSTATUS Status;
-    PKSMULTIPLE_ITEM MultipleItem;
-
-    /* retrieve size of data ranges buffer */
-    PinProperty.Reserved = FilterId;
-    PinProperty.PinId = PinId;
-    PinProperty.Property.Set = KSPROPSETID_Pin;
-    PinProperty.Property.Id = KSPROPERTY_PIN_DATARANGES;
-    PinProperty.Property.Flags = KSPROPERTY_TYPE_GET;
-
-    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)NULL, 0, &BytesReturned);
-    if (Status != STATUS_MORE_ENTRIES)
-    {
-        return Status;
-    }
-
-    MultipleItem = ExAllocatePool(NonPagedPool, BytesReturned);
-    if (!MultipleItem)
-    {
-        /* not enough memory */
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)MultipleItem, BytesReturned, &BytesReturned);
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed */
-        ExFreePool(MultipleItem);
-        return Status;
-    }
-
-    /* save result */
-    *OutMultipleItem = MultipleItem;
-    return Status;
-}
-
-NTSTATUS
-FindAudioDataRange(
-    PKSMULTIPLE_ITEM MultipleItem,
-    PKSDATARANGE_AUDIO * OutDataRangeAudio)
-{
-    ULONG Index;
-    PKSDATARANGE_AUDIO DataRangeAudio;
-    PKSDATARANGE DataRange;
-
-    DataRange = (PKSDATARANGE) (MultipleItem + 1);
-    for(Index = 0; Index < MultipleItem->Count; Index++)
-    {
-        if (DataRange->FormatSize == sizeof(KSDATARANGE_AUDIO))
-        {
-            DataRangeAudio = (PKSDATARANGE_AUDIO)DataRange;
-            if (IsEqualGUIDAligned(&DataRangeAudio->DataRange.MajorFormat, &KSDATAFORMAT_TYPE_AUDIO) &&
-                IsEqualGUIDAligned(&DataRangeAudio->DataRange.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM) &&
-                IsEqualGUIDAligned(&DataRangeAudio->DataRange.Specifier, &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX))
-            {
-                DPRINT("Min Sample %u Max Sample %u Min Bits %u Max Bits %u Max Channel %u\n", DataRangeAudio->MinimumSampleFrequency, DataRangeAudio->MaximumSampleFrequency,
-                                                         DataRangeAudio->MinimumBitsPerSample, DataRangeAudio->MaximumBitsPerSample, DataRangeAudio->MaximumChannels);
-                *OutDataRangeAudio = DataRangeAudio;
-                return STATUS_SUCCESS;
-            }
-        }
-    }
-    return STATUS_UNSUCCESSFUL;
-}
-
-NTSTATUS
-NTAPI
-OpenWavePin(
-    IN PWDMAUD_DEVICE_EXTENSION DeviceExtension,
-    IN ULONG FilterId,
-    IN ULONG PinId,
-    IN LPWAVEFORMATEX WaveFormatEx,
-    IN ACCESS_MASK DesiredAccess,
-    OUT PHANDLE PinHandle)
-{
-    PKSPIN_CONNECT PinConnect;
-    PKSDATAFORMAT_WAVEFORMATEX DataFormat;
-    NTSTATUS Status;
-
-    /* allocate pin connect */
-    PinConnect = AllocatePinConnect(sizeof(KSDATAFORMAT_WAVEFORMATEX));
-    if (!PinConnect)
-    {
-        /* no memory */
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
-
-    /* initialize pin connect struct */
-    InitializePinConnect(PinConnect, PinId);
-
-    /* get offset to dataformat */
-    DataFormat = (PKSDATAFORMAT_WAVEFORMATEX) (PinConnect + 1);
-    /* initialize with requested wave format */
-    InitializeDataFormat(DataFormat, WaveFormatEx);
-
-    /* first attach to the virtual device */
-    Status = AttachToVirtualAudioDevice(DeviceExtension, FilterId);
-
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed */
-        ExFreePool(PinConnect);
-        return Status;
-    }
-
-    /* now create the pin */
-    Status = KsCreatePin(DeviceExtension->hSysAudio, PinConnect, DesiredAccess, PinHandle);
-
-    /* free create info */
-    ExFreePool(PinConnect);
-
-    return Status;
-}
-
-ULONG
-GetPinInstanceCount(
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension,
-    ULONG FilterId,
-    ULONG PinId)
-{
-    KSP_PIN PinRequest;
-    KSPIN_CINSTANCES PinInstances;
-    ULONG BytesReturned;
-    NTSTATUS Status;
-
-    /* query the instance count */
-    PinRequest.Reserved = FilterId;
-    PinRequest.PinId = PinId;
-    PinRequest.Property.Set = KSPROPSETID_Pin;
-    PinRequest.Property.Flags = KSPROPERTY_TYPE_GET;
-    PinRequest.Property.Id = KSPROPERTY_PIN_CINSTANCES;
-
-    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinRequest, sizeof(KSP_PIN), (PVOID)&PinInstances, sizeof(KSPIN_CINSTANCES), &BytesReturned);
-    ASSERT(Status == STATUS_SUCCESS);
-    return PinInstances.CurrentCount;
-}
-
-
-NTSTATUS
-CheckSampleFormat(
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension,
-    LPWAVE_INFO WaveInfo,
-    ULONG SampleRate,
-    ULONG NumChannels,
-    ULONG BitsPerSample)
-{
-    NTSTATUS Status = STATUS_SUCCESS;
-#if 0
-
-    WAVEFORMATEX WaveFormat;
-    HANDLE PinHandle;
-
-    /* clear wave format */
-    RtlZeroMemory(&WaveFormat, sizeof(WAVEFORMATEX));
-
-    WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
-    WaveFormat.nChannels = NumChannels;
-    WaveFormat.nSamplesPerSec = SampleRate;
-    WaveFormat.nAvgBytesPerSec = SampleRate * NumChannels * (BitsPerSample/8);
-    WaveFormat.nBlockAlign = (NumChannels * BitsPerSample) / 8;
-    WaveFormat.wBitsPerSample = BitsPerSample;
-    WaveFormat.cbSize = sizeof(WAVEFORMATEX);
-
-    Status = OpenWavePin(DeviceExtension, WaveInfo->FilterId, WaveInfo->PinId, &WaveFormat, GENERIC_READ | GENERIC_WRITE, &PinHandle);
-
-    if (NT_SUCCESS(Status))
-    {
-        /* success */
-        ZwClose(PinHandle);
-
-        while(GetPinInstanceCount(DeviceExtension, WaveInfo->FilterId, WaveInfo->PinId))
-            KeStallExecutionProcessor(5);
-    }
-
-    DPRINT("SampleRate %u BitsPerSample %u NumChannels %u Status %x bInput %u\n", SampleRate, BitsPerSample, NumChannels, Status, WaveInfo->bInput);
-#endif
-
-
-    return Status;
-}
-
-
-NTSTATUS
-CheckFormat(
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension,
-    PKSDATARANGE_AUDIO DataRangeAudio,
-    LPWAVE_INFO WaveInfo)
-{
-    ULONG Index, SampleFrequency;
-    ULONG Result = 0;
-    NTSTATUS Status;
-
-    for(Index = 0; Index < AUDIO_TEST_RANGE; Index++)
-    {
-        SampleFrequency = TestRange[Index].SampleRate;
-
-        if (DataRangeAudio->MinimumSampleFrequency <= SampleFrequency && DataRangeAudio->MaximumSampleFrequency >= SampleFrequency)
-        {
-            /* the audio adapter supports the sample frequency */
-            if (DataRangeAudio->MinimumBitsPerSample <= 8 && DataRangeAudio->MaximumBitsPerSample >= 8)
-            {
-                /* check if pin supports the sample rate in 8-Bit Mono */
-                Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 1, 8);
-                if (NT_SUCCESS(Status))
-                {
-                    Result |= TestRange[Index].Bit8Mono;
-                }
-
-                if (DataRangeAudio->MaximumChannels > 1)
-                {
-                    /* check if pin supports the sample rate in 8-Bit Stereo */
-                    Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 2, 8);
-                    if (NT_SUCCESS(Status))
-                    {
-                        Result |= TestRange[Index].Bit8Stereo;
-                    }
-                }
-            }
-
-            if (DataRangeAudio->MinimumBitsPerSample <= 16 && DataRangeAudio->MaximumBitsPerSample >= 16)
-            {
-                /* check if pin supports the sample rate in 16-Bit Mono */
-                Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 1, 16);
-                if (NT_SUCCESS(Status))
-                {
-                    Result |= TestRange[Index].Bit16Mono;
-                }
-
-                if (DataRangeAudio->MaximumChannels > 1)
-                {
-                    /* check if pin supports the sample rate in 16-Bit Stereo */
-                    Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 2, 16);
-                    if (NT_SUCCESS(Status))
-                    {
-                        Result |= TestRange[Index].Bit16Stereo;
-                    }
-                }
-            }
-        }
-    }
-
-
-    if (WaveInfo->bInput)
-        WaveInfo->u.InCaps.dwFormats = Result;
-    else
-        WaveInfo->u.OutCaps.dwFormats = Result;
-
-    DPRINT("Format %x bInput %u\n", Result, WaveInfo->bInput);
-
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-InitializeWaveInfo(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG FilterId,
-    IN ULONG PinId,
-    IN ULONG bInput)
-{
-    KSP_PIN PinProperty;
-    KSCOMPONENTID ComponentId;
-    NTSTATUS Status;
-    ULONG BytesReturned;
-    WCHAR DeviceName[MAX_PATH];
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    PKSMULTIPLE_ITEM MultipleItem;
-    PKSDATARANGE_AUDIO DataRangeAudio;
-    LPWAVE_INFO WaveInfo = AllocateWaveInfo();
-
-
-    if (!WaveInfo)
-        return STATUS_INSUFFICIENT_RESOURCES;
-
-    /* initialize wave info */
-    WaveInfo->bInput = bInput;
-    WaveInfo->FilterId = FilterId;
-    WaveInfo->PinId = PinId;
-
-    /* setup request to return component id */
-    PinProperty.PinId = FilterId;
-    PinProperty.Property.Set = KSPROPSETID_Sysaudio;
-    PinProperty.Property.Id = KSPROPERTY_SYSAUDIO_COMPONENT_ID;
-    PinProperty.Property.Flags = KSPROPERTY_TYPE_GET;
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    /* query sysaudio for component id */
-    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)&ComponentId, sizeof(KSCOMPONENTID), &BytesReturned);
-    if (NT_SUCCESS(Status))
-    {
-        if (bInput)
-        {
-            WaveInfo->u.InCaps.wMid = ComponentId.Manufacturer.Data1 - 0xd5a47fa7;
-            WaveInfo->u.InCaps.vDriverVersion = MAKELONG(ComponentId.Version, ComponentId.Revision);
-        }
-        else
-        {
-            WaveInfo->u.OutCaps.wMid = ComponentId.Manufacturer.Data1 - 0xd5a47fa7;
-            WaveInfo->u.OutCaps.vDriverVersion = MAKELONG(ComponentId.Version, ComponentId.Revision);
-        }
-    }
-    else
-    {
-        /* set up something useful */
-        if (bInput)
-        {
-            WaveInfo->u.InCaps.wMid = MM_MICROSOFT;
-            WaveInfo->u.InCaps.wPid = MM_PID_UNMAPPED;
-            WaveInfo->u.InCaps.vDriverVersion = 1;
-        }
-        else
-        {
-            WaveInfo->u.OutCaps.wMid = MM_MICROSOFT;
-            WaveInfo->u.OutCaps.wPid = MM_PID_UNMAPPED;
-            WaveInfo->u.OutCaps.vDriverVersion = 1;
-        }
-    }
-
-    /* retrieve pnp base name */
-    PinProperty.PinId = FilterId;
-    PinProperty.Property.Set = KSPROPSETID_Sysaudio;
-    PinProperty.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME;
-    PinProperty.Property.Flags = KSPROPERTY_TYPE_GET;
-
-    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)DeviceName, sizeof(DeviceName), &BytesReturned);
-    if (NT_SUCCESS(Status))
-    {
-        /* find product name */
-        if (bInput)
-            Status = FindProductName(DeviceName, MAXPNAMELEN, WaveInfo->u.OutCaps.szPname);
-        else
-            Status = FindProductName(DeviceName, MAXPNAMELEN, WaveInfo->u.InCaps.szPname);
-
-        /* check for success */
-        if (!NT_SUCCESS(Status))
-        {
-            if (bInput)
-                WaveInfo->u.OutCaps.szPname[0] = L'\0';
-            else
-                WaveInfo->u.InCaps.szPname[0] = L'\0';
-        }
-    }
-
-    Status = GetAudioPinDataRanges(DeviceExtension, FilterId, PinId, &MultipleItem);
-    if (NT_SUCCESS(Status))
-    {
-        /* find a audio data range */
-        Status = FindAudioDataRange(MultipleItem, &DataRangeAudio);
-
-        if (NT_SUCCESS(Status))
-        {
-            if (bInput)
-            {
-                WaveInfo->u.InCaps.wChannels = DataRangeAudio->MaximumChannels;
-            }
-            else
-            {
-                WaveInfo->u.OutCaps.wChannels = DataRangeAudio->MaximumChannels;
-            }
-            CheckFormat(DeviceExtension, DataRangeAudio, WaveInfo);
-        }
-        ExFreePool(MultipleItem);
-    }
-
-    if (bInput)
-    {
-        InsertTailList(&DeviceExtension->WaveInList, &WaveInfo->Entry);
-        DeviceExtension->WaveInDeviceCount++;
-    }
-    else
-    {
-        InsertTailList(&DeviceExtension->WaveOutList, &WaveInfo->Entry);
-        DeviceExtension->WaveOutDeviceCount++;
-    }
-
-
-    return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-NTAPI
-WdmAudWaveInitialize(
-    IN PDEVICE_OBJECT DeviceObject)
-{
-    KSP_PIN Pin;
-    ULONG Count, BytesReturned, Index, SubIndex, Result, NumPins;
-    NTSTATUS Status;
-    KSPIN_COMMUNICATION Communication;
-    KSPIN_DATAFLOW DataFlow;
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-
-    Pin.Property.Set = KSPROPSETID_Sysaudio;
-    Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT;
-    Pin.Property.Flags = KSPROPERTY_TYPE_GET;
-
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    /* set wave count to zero */
-    DeviceExtension->WaveInDeviceCount = 0;
-    DeviceExtension->WaveOutDeviceCount = 0;
-
-    /* intialize list head */
-    InitializeListHead(&DeviceExtension->WaveInList);
-    InitializeListHead(&DeviceExtension->WaveOutList);
-
-    Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned);
-    if (!NT_SUCCESS(Status))
-        return STATUS_UNSUCCESSFUL;
-
-    Result = 0;
-    for(Index = 0; Index < Count; Index++)
-    {
-        /* query number of pins */
-        Pin.Reserved = Index; // see sysaudio
-        Pin.Property.Flags = KSPROPERTY_TYPE_GET;
-        Pin.Property.Set = KSPROPSETID_Pin;
-        Pin.Property.Id = KSPROPERTY_PIN_CTYPES;
-        Pin.PinId = 0;
-
-        Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)&NumPins, sizeof(ULONG), &BytesReturned);
-        if (NT_SUCCESS(Status))
-        {
-            /* enumerate now all pins */
-            for(SubIndex = 0; SubIndex < NumPins; SubIndex++)
-            {
-                Pin.PinId = SubIndex;
-                Pin.Property.Id = KSPROPERTY_PIN_COMMUNICATION;
-                Communication = KSPIN_COMMUNICATION_NONE;
-
-                /* get pin communication type */
-                KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)&Communication, sizeof(KSPIN_COMMUNICATION), &BytesReturned);
-
-                Pin.Property.Id = KSPROPERTY_PIN_DATAFLOW;
-                DataFlow = 0;
-
-                /* get pin dataflow type */
-                KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)&DataFlow, sizeof(KSPIN_DATAFLOW), &BytesReturned);
-
-                if (Communication == KSPIN_COMMUNICATION_SINK && DataFlow == KSPIN_DATAFLOW_IN)
-                {
-                    /* found a wave out device */
-                    InitializeWaveInfo(DeviceObject, Index, SubIndex, FALSE);
-                }
-                else if (Communication == KSPIN_COMMUNICATION_SINK && DataFlow == KSPIN_DATAFLOW_OUT)
-                {
-                    /* found a wave in device */
-                    InitializeWaveInfo(DeviceObject, Index, SubIndex, TRUE);
-                }
-            }
-        }
-    }
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-WdmAudControlOpenWave(
-    IN  PDEVICE_OBJECT DeviceObject,
-    IN  PIRP Irp,
-    IN  PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN  PWDMAUD_CLIENT ClientInfo)
-{
-    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
-    LPWAVE_INFO WaveInfo;
-    NTSTATUS Status;
-    ACCESS_MASK DesiredAccess = 0;
-    HANDLE PinHandle;
-    ULONG FreeIndex;
-
-    if (DeviceInfo->u.WaveFormatEx.wFormatTag != WAVE_FORMAT_PCM)
-    {
-        DPRINT("FIXME: Only WAVE_FORMAT_PCM is supported RequestFormat %x\n", DeviceInfo->u.WaveFormatEx.wFormatTag);
-        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
-    }
-
-    /* get device extension */
-    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    /* find destination wave */
-    Status = GetWaveInfoByIndexAndType(DeviceObject, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &WaveInfo);
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed to find wave info */
-        DbgBreakPoint();
-        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
-    }
-
-    /* close pin handle which uses same virtual audio device id and pin id */
-    FreeIndex = ClosePin(ClientInfo, WaveInfo->FilterId, WaveInfo->PinId, DeviceInfo->DeviceType);
-
-    /* get desired access */
-    if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE)
-    {
-        DesiredAccess |= GENERIC_READ;
-    }
-     else if (DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE)
-    {
-        DesiredAccess |= GENERIC_WRITE;
-    }
-
-    /* now try open the pin */
-    Status = OpenWavePin(DeviceExtension, WaveInfo->FilterId, WaveInfo->PinId, &DeviceInfo->u.WaveFormatEx, DesiredAccess, &PinHandle);
-
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed to open the pin */
-        return SetIrpIoStatus(Irp, STATUS_NOT_SUPPORTED, 0);
-    }
-
-    /* store the handle */
-    Status = InsertPinHandle(ClientInfo, WaveInfo->FilterId, WaveInfo->PinId, DeviceInfo->DeviceType, PinHandle, FreeIndex);
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed to insert handle */
-        ZwClose(PinHandle);
-        return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
-    }
-
-    /* store pin handle */
-    DeviceInfo->hDevice = PinHandle;
-    return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
-}
-
-NTSTATUS
-WdmAudWaveCapabilities(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN PWDMAUD_DEVICE_INFO DeviceInfo,
-    IN PWDMAUD_CLIENT ClientInfo,
-    IN PWDMAUD_DEVICE_EXTENSION DeviceExtension)
-{
-    LPWAVE_INFO WaveInfo;
-    NTSTATUS Status;
-
-    /* find destination wave */
-    Status = GetWaveInfoByIndexAndType(DeviceObject, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &WaveInfo);
-    if (!NT_SUCCESS(Status))
-    {
-        /* failed to find wave info */
-        DbgBreakPoint();
-        return STATUS_UNSUCCESSFUL;
-    }
-
-    if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE)
-    {
-        RtlMoveMemory(&DeviceInfo->u.WaveInCaps, &WaveInfo->u.InCaps, sizeof(WAVEINCAPSW));
-    }
-    else
-    {
-        RtlMoveMemory(&DeviceInfo->u.WaveOutCaps, &WaveInfo->u.OutCaps, sizeof(WAVEOUTCAPSW));
-    }
-
-    return STATUS_SUCCESS;
-}
-
index c8e5332..459b6c7 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef WDMAUD_H__
-#define WDMAUD_H__
+#pragma once
 
 #include <pseh/pseh2.h>
 #include <ntddk.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <wchar.h>
+#include "mmixer.h"
 
 #include "interface.h"
 
-typedef struct
-{
-    LIST_ENTRY Entry;
-    HANDLE hMixer;
-    ULONG NotificationType;
-    ULONG Value;
-}MIXER_EVENT, *PMIXER_EVENT;
-
-
 typedef struct
 {
     HANDLE Handle;
@@ -44,60 +35,6 @@ typedef struct
     LIST_ENTRY MixerEventList;
 }WDMAUD_CLIENT, *PWDMAUD_CLIENT;
 
-typedef struct
-{
-    LIST_ENTRY Entry;
-    ULONG dwControlID;
-}MIXERCONTROL_DATA, *LPMIXERCONTROL_DATA;
-
-typedef struct
-{
-    MIXERCONTROL_DATA Header;
-    LONG SignedMinimum;
-    LONG SignedMaximum;
-    LONG SteppingDelta;
-    ULONG InputSteppingDelta;
-    ULONG ValuesCount;
-    PLONG Values;
-}MIXERVOLUME_DATA, *LPMIXERVOLUME_DATA;
-
-
-
-typedef struct
-{
-    LIST_ENTRY Entry;
-    ULONG PinId;
-    ULONG DeviceIndex;
-    MIXERLINEW Line;
-    LPMIXERCONTROLW LineControls;
-    PULONG          NodeIds;
-    LIST_ENTRY LineControlsExtraData;
-}MIXERLINE_EXT, *LPMIXERLINE_EXT;
-
-
-typedef struct
-{
-    MIXERCAPSW    MixCaps;
-    ULONG DeviceIndex;
-    LIST_ENTRY    LineList;
-    ULONG ControlId;
-}MIXER_INFO, *LPMIXER_INFO;
-
-
-typedef struct
-{
-    LIST_ENTRY Entry;
-    ULONG FilterId;
-    ULONG PinId;
-    ULONG bInput;
-    union
-    {
-        WAVEOUTCAPSW OutCaps;
-        WAVEINCAPSW  InCaps;
-    }u;
-}WAVE_INFO, *LPWAVE_INFO;
-
-
 typedef struct
 {
     LIST_ENTRY Entry;
@@ -117,18 +54,17 @@ typedef struct
     HANDLE hSysAudio;
     PFILE_OBJECT FileObject;
 
-    ULONG MixerInfoCount;
-    LPMIXER_INFO MixerInfo;
-
-    ULONG WaveInDeviceCount;
-    LIST_ENTRY WaveInList;
-
-    ULONG WaveOutDeviceCount;
-    LIST_ENTRY WaveOutList;
-
     LIST_ENTRY WdmAudClientList;
 }WDMAUD_DEVICE_EXTENSION, *PWDMAUD_DEVICE_EXTENSION;
 
+typedef struct
+{
+    PWDMAUD_CLIENT ClientInfo;
+    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
+    SOUND_DEVICE_TYPE DeviceType;
+}PIN_CREATE_CONTEXT, *PPIN_CREATE_CONTEXT;
+
+
 NTSTATUS
 NTAPI
 OpenWavePin(
@@ -279,7 +215,7 @@ NTAPI
 WdmAudWaveInitialize(
     IN PDEVICE_OBJECT DeviceObject);
 
-NTSTATUS
+ULONG
 ClosePin(
     IN  PWDMAUD_CLIENT ClientInfo,
     IN  ULONG FilterId,
@@ -295,18 +231,48 @@ InsertPinHandle(
     IN  HANDLE PinHandle,
     IN  ULONG FreeIndex);
 
-
 NTSTATUS
-GetWaveInfoByIndexAndType(
+GetSysAudioDevicePnpName(
     IN  PDEVICE_OBJECT DeviceObject,
     IN  ULONG DeviceIndex,
-    IN  SOUND_DEVICE_TYPE DeviceType,
-    OUT LPWAVE_INFO *OutWaveInfo);
+    OUT LPWSTR * Device);
 
 NTSTATUS
-GetSysAudioDevicePnpName(
+OpenSysAudioDeviceByIndex(
     IN  PDEVICE_OBJECT DeviceObject,
+    IN  ULONG DeviceIndex,
+    IN  PHANDLE DeviceHandle,
+    IN  PFILE_OBJECT * FileObject);
+
+NTSTATUS
+OpenDevice(
+    IN LPWSTR Device,
+    OUT PHANDLE DeviceHandle,
+    OUT PFILE_OBJECT * FileObject);
+
+ULONG
+WdmAudGetMixerDeviceCount();
+
+ULONG
+WdmAudGetWaveInDeviceCount();
+
+ULONG
+WdmAudGetWaveOutDeviceCount();
+
+NTSTATUS
+WdmAudGetMixerPnpNameByIndex(
     IN  ULONG DeviceIndex,
     OUT LPWSTR * Device);
 
-#endif
+NTSTATUS
+WdmAudGetPnpNameByIndexAndType(
+    IN ULONG DeviceIndex, 
+    IN SOUND_DEVICE_TYPE DeviceType, 
+    OUT LPWSTR *Device);
+
+
+/* sup.c */
+
+ULONG
+GetSysAudioDeviceCount(
+    IN  PDEVICE_OBJECT DeviceObject);
index 1b3acd1..6c6595c 100644 (file)
@@ -2,17 +2,20 @@
 <!DOCTYPE module SYSTEM "../../../../../tools/rbuild/project.dtd">
 <module name="wdmaud_kernel" type="kernelmodedriver" installbase="system32/drivers" installname="wdmaud.sys">
        <include base="wdmaud_kernel">.</include>
-       <define name="_COMDDK_" />
+       <include base="mmixer">.</include>
        <include base="ReactOS">include/reactos/libs/sound</include>
+       <define name="_COMDDK_" />
+       <library>mmixer</library>
        <library>ntoskrnl</library>
+       <library>rtl</library>
+       <library>libcntpr</library>
        <library>ks</library>
        <library>pseh</library>
        <library>hal</library>
        <file>control.c</file>
        <file>deviface.c</file>
        <file>entry.c</file>
-       <file>mixer.c</file>
-       <file>wave.c</file>
+       <file>mmixer.c</file>
        <file>sup.c</file>
        <file>wdmaud.rc</file>
 </module>
index 15ca8ca..01537b0 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef SYSAUDIO_H__
-#define SYSAUDIO_H__
+#pragma once
 
 #include <ntifs.h>
 #include <ntddk.h>
@@ -133,6 +132,3 @@ ComputeCompatibleFormat(
     IN ULONG PinId,
     IN PKSDATAFORMAT_WAVEFORMATEX ClientFormat,
     OUT PKSDATAFORMAT_WAVEFORMATEX MixerFormat);
-
-
-#endif
index 1490374..0fd0fa6 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <stdio.h>
 #include <ntddk.h>
+#include <wmlib.h>
 
 #define NDEBUG
 #include <debug.h>
index 786372d..7419304 100644 (file)
@@ -46,7 +46,7 @@
 @ stdcall HalGetEnvironmentVariable(str long str)
 @ fastcall -arch=arm HalGetInterruptSource()
 @ stdcall HalGetInterruptVector(long long long long ptr ptr)
-@ stdcall HalHandleNMI(ptr)
+@ stdcall -arch=i386 HalHandleNMI(ptr)
 @ stdcall HalInitSystem(long ptr)
 @ stdcall HalInitializeProcessor(long ptr)
 @ stdcall HalMakeBeep(long)
index a7cf4bb..b846b04 100644 (file)
@@ -1,9 +1,12 @@
 <?xml version="1.0"?>
 <!DOCTYPE group SYSTEM "../tools/rbuild/project.dtd">
 <group xmlns:xi="http://www.w3.org/2001/XInclude">
-       <directory name="halx86">
-               <xi:include href="halx86/directory.rbuild" />
-       </directory>
+
+    <if property="ARCH" value="i386">
+           <directory name="halx86">
+                   <xi:include href="halx86/directory.rbuild" />
+           </directory>
+       </if>
 
        <if property="ARCH" value="powerpc">
                <directory name="halppc">
index 1e0c730..62b91a3 100644 (file)
@@ -1,10 +1,11 @@
 <?xml version="1.0"?>
 <!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
 <group xmlns:xi="http://www.w3.org/2001/XInclude">
-       <directory name="generic">
-               <xi:include href="generic/generic.rbuild" />
-       </directory>
-       <directory name="up">
-               <xi:include href="up/halup.rbuild" />
-       </directory>
+
+       <xi:include href="hal_generic.rbuild" />
+
+       <if property="SARCH" value="versatile">
+               <xi:include href="versa/halup.rbuild" />
+       </if>
+
 </group>
diff --git a/reactos/hal/halarm/generic/beep.c b/reactos/hal/halarm/generic/beep.c
new file mode 100644 (file)
index 0000000..bd27412
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/beep.c
+ * PURPOSE:         Speaker support (beeping)
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalMakeBeep(IN ULONG Frequency)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
diff --git a/reactos/hal/halarm/generic/bus.c b/reactos/hal/halarm/generic/bus.c
new file mode 100644 (file)
index 0000000..aeae3cb
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/bus.c
+ * PURPOSE:         Bus Support Routines
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+HalAdjustResourceList(IN PIO_RESOURCE_REQUIREMENTS_LIST *ResourceList)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return STATUS_SUCCESS;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+HalAssignSlotResources(IN PUNICODE_STRING RegistryPath,
+                       IN PUNICODE_STRING DriverClassName,
+                       IN PDRIVER_OBJECT DriverObject,
+                       IN PDEVICE_OBJECT DeviceObject,
+                       IN INTERFACE_TYPE BusType,
+                       IN ULONG BusNumber,
+                       IN ULONG SlotNumber,
+                       IN OUT PCM_RESOURCE_LIST *AllocatedResources)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return STATUS_SUCCESS;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+HalGetBusData(IN BUS_DATA_TYPE BusDataType,
+              IN ULONG BusNumber,
+              IN ULONG SlotNumber,
+              IN PVOID Buffer,
+              IN ULONG Length)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
+                      IN ULONG BusNumber,
+                      IN ULONG SlotNumber,
+                      IN PVOID Buffer,
+                      IN ULONG Offset,
+                      IN ULONG Length)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType,
+                      IN ULONG BusNumber,
+                      IN ULONG BusInterruptLevel,
+                      IN ULONG BusInterruptVector,
+                      OUT PKIRQL Irql,
+                      OUT PKAFFINITY Affinity)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+HalSetBusData(IN BUS_DATA_TYPE BusDataType,
+              IN ULONG BusNumber,
+              IN ULONG SlotNumber,
+              IN PVOID Buffer,
+              IN ULONG Length)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
+                      IN ULONG BusNumber,
+                      IN ULONG SlotNumber,
+                      IN PVOID Buffer,
+                      IN ULONG Offset,
+                      IN ULONG Length)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
+                       IN ULONG BusNumber,
+                       IN PHYSICAL_ADDRESS BusAddress,
+                       IN OUT PULONG AddressSpace,
+                       OUT PPHYSICAL_ADDRESS TranslatedAddress)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/cache.S b/reactos/hal/halarm/generic/cache.S
new file mode 100644 (file)
index 0000000..c4325a5
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * FILE:            hal/halarm/generic/cache.s
+ * PURPOSE:         Implements cache clean, invalidate routines for ARM machines
+ * PROGRAMMERS:     Copyright (C) 2005 ARM Ltd.
+ */
+
+    .title "ARM HAL Cache Routines"
+    .include "ntoskrnl/include/internal/arm/kxarm.h"
+    .include "ntoskrnl/include/internal/arm/ksarm.h"
+
+    NESTED_ENTRY v7_flush_dcache_all
+    PROLOG_END v7_flush_dcache_all
+    
+       mrc     p15, 1, r0, c0, c0, 1           // read clidr
+       ands    r3, r0, #0x7000000              // extract loc from clidr
+       mov     r3, r3, lsr #23             // left align loc bit field
+       beq     finished                    // if loc is 0, then no need to clean
+       mov     r10, #0                     // start clean at cache level 0
+loop1:
+       add     r2, r10, r10, lsr #1            // work out 3x current cache level
+       mov     r1, r0, lsr r2              // extract cache type bits from clidr
+       and     r1, r1, #7                  // mask of the bits for current cache only
+       cmp     r1, #2                      // see what cache we have at this level
+       blt     skip                        // skip if no cache, or just i-cache
+       mcr     p15, 2, r10, c0, c0, 0          // select current cache level in cssr
+       isb                             // isb to sych the new cssr&csidr
+       mrc     p15, 1, r1, c0, c0, 0           // read the new csidr
+       and     r2, r1, #7                  // extract the length of the cache lines
+       add     r2, r2, #4                  // add 4 (line length offset)
+       ldr     r4, =0x3ff
+       ands    r4, r4, r1, lsr #3              // find maximum number on the way size
+       clz     r5, r4                      // find bit position of way size increment
+       ldr     r7, =0x7fff
+       ands    r7, r7, r1, lsr #13             // extract max number of the index size
+loop2:
+       mov     r9, r4                      // create working copy of max way size
+loop3:
+       orr     r11, r10, r9, lsl r5            // factor way and cache number into r11
+       orr     r11, r11, r7, lsl r2            // factor index number into r11
+       mcr     p15, 0, r11, c7, c14, 2         // clean & invalidate by set/way
+       subs    r9, r9, #1              // decrement the way
+       bge     loop3
+       subs    r7, r7, #1              // decrement the index
+       bge     loop2
+skip:
+       add     r10, r10, #2                // increment cache number
+       cmp     r3, r10
+       bgt     loop1
+finished:
+       mov     r10, #0                     // swith back to cache level 0
+       mcr     p15, 2, r10, c0, c0, 0          // select current cache level in cssr
+       isb
+       mov     pc, lr
+    
+    ENTRY_END v7_flush_dcache_all
diff --git a/reactos/hal/halarm/generic/display.c b/reactos/hal/halarm/generic/display.c
new file mode 100644 (file)
index 0000000..f21ca6d
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/display.c
+ * PURPOSE:         Screen Display Routines, now useless since NT 5.1+
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+#include <ndk/inbvfuncs.h>
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalAcquireDisplayOwnership(IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters)
+{
+    /* Stub since Windows XP implemented Inbv */
+    return;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalDisplayString(IN PCH String)
+{
+    /* Call the Inbv driver */
+    InbvDisplayString(String);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalQueryDisplayParameters(OUT PULONG DispSizeX,
+                          OUT PULONG DispSizeY,
+                          OUT PULONG CursorPosX,
+                          OUT PULONG CursorPosY)
+{
+    /* Stub since Windows XP implemented Inbv */
+    return;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalSetDisplayParameters(IN ULONG CursorPosX,
+                        IN ULONG CursorPosY)
+{
+    /* Stub since Windows XP implemented Inbv */
+    return;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/dma.c b/reactos/hal/halarm/generic/dma.c
new file mode 100644 (file)
index 0000000..3070f25
--- /dev/null
@@ -0,0 +1,188 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/dma.c
+ * PURPOSE:         DMA Support
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS ******************************************************************/
+
+/*
+ * @unimplemented
+ */
+PADAPTER_OBJECT
+NTAPI
+HalGetAdapter(IN PDEVICE_DESCRIPTION DeviceDescription,
+              OUT PULONG NumberOfMapRegisters)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return NULL;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+HalPutDmaAdapter(IN PADAPTER_OBJECT AdapterObject)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+/*
+ * @unimplemented
+ */
+PVOID
+NTAPI
+HalAllocateCommonBuffer(IN PADAPTER_OBJECT AdapterObject,
+                        IN ULONG Length,
+                        IN PPHYSICAL_ADDRESS LogicalAddress,
+                        IN BOOLEAN CacheEnabled)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return NULL;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+HalFreeCommonBuffer(IN PADAPTER_OBJECT AdapterObject,
+                    IN ULONG Length,
+                    IN PHYSICAL_ADDRESS LogicalAddress,
+                    IN PVOID VirtualAddress,
+                    IN BOOLEAN CacheEnabled)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+NTAPI
+HalReadDmaCounter(IN PADAPTER_OBJECT AdapterObject)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+NTAPI
+HalAllocateAdapterChannel(IN PADAPTER_OBJECT AdapterObject,
+                          IN PWAIT_CONTEXT_BLOCK WaitContextBlock,
+                          IN ULONG NumberOfMapRegisters,
+                          IN PDRIVER_CONTROL ExecutionRoutine)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return STATUS_SUCCESS;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+IoFreeAdapterChannel(IN PADAPTER_OBJECT AdapterObject)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+IoFreeMapRegisters(IN PADAPTER_OBJECT AdapterObject,
+                   IN PVOID MapRegisterBase,
+                   IN ULONG NumberOfMapRegisters)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+IoFlushAdapterBuffers(IN PADAPTER_OBJECT AdapterObject,
+                      IN PMDL Mdl,
+                      IN PVOID MapRegisterBase,
+                      IN PVOID CurrentVa,
+                      IN ULONG Length,
+                      IN BOOLEAN WriteToDevice)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+PHYSICAL_ADDRESS
+NTAPI
+IoMapTransfer(IN PADAPTER_OBJECT AdapterObject,
+              IN PMDL Mdl,
+              IN PVOID MapRegisterBase,
+              IN PVOID CurrentVa,
+              IN OUT PULONG Length,
+              IN BOOLEAN WriteToDevice)
+{
+    PHYSICAL_ADDRESS Address;
+
+    UNIMPLEMENTED;
+    while (TRUE);
+    
+    Address.QuadPart = 0;
+    return Address;
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+HalFlushCommonBuffer(IN PADAPTER_OBJECT AdapterObject,
+                     IN ULONG Length,
+                     IN PHYSICAL_ADDRESS LogicalAddress,
+                     IN PVOID VirtualAddress)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+PVOID
+NTAPI
+HalAllocateCrashDumpRegisters(IN PADAPTER_OBJECT AdapterObject,
+                              IN OUT PULONG NumberOfMapRegisters)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return NULL;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/drive.c b/reactos/hal/halarm/generic/drive.c
new file mode 100644 (file)
index 0000000..b1140bc
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/drive.c
+ * PURPOSE:         HAL Stubs for Disk I/O Routines
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+NTAPI
+HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
+                       IN PSTRING NtDeviceName,
+                       OUT PUCHAR NtSystemPath,
+                       OUT PSTRING NtSystemPathString)
+{
+    /* Call the kernel */
+    IoAssignDriveLetters(LoaderBlock,
+                         NtDeviceName,
+                         NtSystemPath,
+                         NtSystemPathString);
+}
+
+NTSTATUS
+NTAPI
+HalpReadPartitionTable(IN PDEVICE_OBJECT DeviceObject,
+                       IN ULONG SectorSize,
+                       IN BOOLEAN ReturnRecognizedPartitions,
+                       IN OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
+{
+    /* Call the kernel */
+    return IoReadPartitionTable(DeviceObject,
+                                SectorSize,
+                                ReturnRecognizedPartitions,
+                                PartitionBuffer);
+}
+
+NTSTATUS
+NTAPI
+HalpWritePartitionTable(IN PDEVICE_OBJECT DeviceObject,
+                        IN ULONG SectorSize,
+                        IN ULONG SectorsPerTrack,
+                        IN ULONG NumberOfHeads,
+                        IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer)
+{
+    /* Call the kernel */
+    return IoWritePartitionTable(DeviceObject,
+                                 SectorSize,
+                                 SectorsPerTrack,
+                                 NumberOfHeads,
+                                 PartitionBuffer);
+}
+
+NTSTATUS
+NTAPI
+HalpSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject,
+                            IN ULONG SectorSize,
+                            IN ULONG PartitionNumber,
+                            IN ULONG PartitionType)
+{
+    /* Call the kernel */
+    return IoSetPartitionInformation(DeviceObject,
+                                     SectorSize,
+                                     PartitionNumber,
+                                     PartitionType);
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/fmutex.c b/reactos/hal/halarm/generic/fmutex.c
new file mode 100644 (file)
index 0000000..1187288
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/fmutex.c
+ * PURPOSE:         Fast Mutex Support
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+#undef ExAcquireFastMutex
+#undef ExReleaseFastMutex
+#undef ExTryToAcquireFastMutex
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+FASTCALL
+ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+FASTCALL
+ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+BOOLEAN
+FASTCALL
+ExTryToAcquireFastMutex(IN PFAST_MUTEX FastMutex)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return TRUE;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/generic.rbuild b/reactos/hal/halarm/generic/generic.rbuild
deleted file mode 100644 (file)
index 5f4ec64..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
-<module name="halarm_generic" type="objectlibrary">
-       <include base="halarm_generic">../include</include>
-       <include base="ntoskrnl">include</include>
-       <define name="_NTHAL_" />
-       <file>hal.c</file>
-       <pch>../include/hal.h</pch>
-</module>
diff --git a/reactos/hal/halarm/generic/hal.c b/reactos/hal/halarm/generic/hal.c
deleted file mode 100644 (file)
index 6724abd..0000000
+++ /dev/null
@@ -1,1540 +0,0 @@
-/*
- * PROJECT:         ReactOS HAL
- * LICENSE:         BSD - See COPYING.ARM in the top level directory
- * FILE:            hal/halarm/generic/hal.c
- * PURPOSE:         Hardware Abstraction Layer
- * PROGRAMMERS:     ReactOS Portable Systems Group
- */
-
-/* INCLUDES *******************************************************************/
-
-#include <hal.h>
-#define NDEBUG
-#include <debug.h>
-#include <ndk/inbvfuncs.h>
-
-#undef ExAcquireFastMutex
-#undef ExReleaseFastMutex
-#undef ExTryToAcquireFastMutex
-#undef KeAcquireSpinLock
-#undef KeLowerIrql
-#undef KeRaiseIrql
-#undef KeReleaseSpinLock
-
-#define READ_REGISTER_ULONG(r) (*((volatile ULONG * const)(r)))
-#define WRITE_REGISTER_ULONG(r, v) (*((volatile ULONG *)(r)) = (v))
-
-VOID
-FASTCALL
-KeUpdateSystemTime(
-    IN PKTRAP_FRAME TrapFrame,
-    IN ULONG Increment,
-    IN KIRQL OldIrql
-);
-
-/* DATA **********************************************************************/
-
-ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount;
-PUCHAR KdComPortInUse;
-
-ULONG HalpIrqlTable[HIGH_LEVEL + 1] =
-{
-    0xFFFFFFFF, // IRQL 0 PASSIVE_LEVEL
-    0xFFFFFFFD, // IRQL 1 APC_LEVEL
-    0xFFFFFFF9, // IRQL 2 DISPATCH_LEVEL
-    0xFFFFFFD9, // IRQL 3
-    0xFFFFFF99, // IRQL 4
-    0xFFFFFF19, // IRQL 5
-    0xFFFFFE19, // IRQL 6
-    0xFFFFFC19, // IRQL 7
-    0xFFFFF819, // IRQL 8
-    0xFFFFF019, // IRQL 9
-    0xFFFFE019, // IRQL 10
-    0xFFFFC019, // IRQL 11
-    0xFFFF8019, // IRQL 12
-    0xFFFF0019, // IRQL 13
-    0xFFFE0019, // IRQL 14
-    0xFFFC0019, // IRQL 15
-    0xFFF80019, // IRQL 16
-    0xFFF00019, // IRQL 17
-    0xFFE00019, // IRQL 18
-    0xFFC00019, // IRQL 19
-    0xFF800019, // IRQL 20
-    0xFF000019, // IRQL 21
-    0xFE000019, // IRQL 22
-    0xFC000019, // IRQL 23
-    0xF0000019, // IRQL 24
-    0x80000019, // IRQL 25
-    0x19,       // IRQL 26
-    0x18,       // IRQL 27 PROFILE_LEVEL
-    0x10,       // IRQL 28 CLOCK2_LEVEL
-    0x00,       // IRQL 29 IPI_LEVEL
-    0x00,       // IRQL 30 POWER_LEVEL
-    0x00,       // IRQL 31 HIGH_LEVEL
-};
-
-UCHAR HalpMaskTable[HIGH_LEVEL + 1] =
-{
-    PROFILE_LEVEL, // INT 0 WATCHDOG
-    APC_LEVEL,     // INT 1 SOFTWARE INTERRUPT
-    DISPATCH_LEVEL,// INT 2 COMM RX
-    IPI_LEVEL,     // INT 3 COMM TX
-    CLOCK2_LEVEL,  // INT 4 TIMER 0
-    3,
-    4,
-    5,
-    6,
-    7,
-    8,
-    9,
-    10,
-    11,
-    12,
-    13,
-    14,
-    15,
-    16,
-    17,
-    18,
-    19,
-    20,
-    21,
-    22,
-    23,
-    24,
-    25,
-    26,
-    26,
-    26
-};
-
-/* FUNCTIONS *****************************************************************/
-
-NTSTATUS
-NTAPI
-DriverEntry(
-  PDRIVER_OBJECT DriverObject,
-  PUNICODE_STRING RegistryPath)
-{
-  UNIMPLEMENTED;
-
-  return STATUS_SUCCESS;
-}
-
-/*
-* @unimplemented
-*/
-VOID
-NTAPI
-HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
-{
-    UNIMPLEMENTED;
-    return;
-}
-
-/*
-* @unimplemented
-*/
-VOID
-NTAPI
-HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
-{
-    UNIMPLEMENTED;
-    return;
-}
-
-/*
-* @unimplemented
-*/
-ULONG_PTR
-NTAPI
-HalSetProfileInterval(IN ULONG_PTR Interval)
-{
-    UNIMPLEMENTED;
-    return Interval;
-}
-
-VOID
-FASTCALL
-ExAcquireFastMutex(
-  PFAST_MUTEX FastMutex)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-FASTCALL
-ExReleaseFastMutex(
-  PFAST_MUTEX FastMutex)
-{
-  UNIMPLEMENTED;
-}
-
-
-BOOLEAN FASTCALL
-ExTryToAcquireFastMutex(
-  PFAST_MUTEX FastMutex)
-{
-  UNIMPLEMENTED;
-
-  return TRUE;
-}
-
-
-NTSTATUS
-NTAPI
-HalAdjustResourceList(
-  PCM_RESOURCE_LIST Resources)
-{
-  UNIMPLEMENTED;
-
-  return STATUS_SUCCESS;
-}
-
-
-/*
- * @implemented
- */
-BOOLEAN
-NTAPI
-HalAllProcessorsStarted(VOID)
-{
-    /* Do nothing */
-    return TRUE;
-}
-
-
-NTSTATUS
-NTAPI
-HalAllocateAdapterChannel(
-  PADAPTER_OBJECT AdapterObject,
-  PWAIT_CONTEXT_BLOCK WaitContextBlock,
-  ULONG NumberOfMapRegisters,
-  PDRIVER_CONTROL ExecutionRoutine)
-{
-  UNIMPLEMENTED;
-
-  return STATUS_SUCCESS;
-}
-
-
-PVOID
-NTAPI
-HalAllocateCommonBuffer(
-  PADAPTER_OBJECT AdapterObject,
-  ULONG Length,
-  PPHYSICAL_ADDRESS LogicalAddress,
-  BOOLEAN CacheEnabled)
-{
-  UNIMPLEMENTED;
-
-  return NULL;
-}
-
-
-PVOID
-NTAPI
-HalAllocateCrashDumpRegisters(
-  PADAPTER_OBJECT AdapterObject,
-  PULONG NumberOfMapRegisters)
-{
-  UNIMPLEMENTED;
-  return NULL;
-}
-
-
-NTSTATUS
-NTAPI
-HalAssignSlotResources(
-  PUNICODE_STRING RegistryPath,
-  PUNICODE_STRING DriverClassName,
-  PDRIVER_OBJECT DriverObject,
-  PDEVICE_OBJECT DeviceObject,
-  INTERFACE_TYPE BusType,
-  ULONG BusNumber,
-  ULONG SlotNumber,
-  PCM_RESOURCE_LIST *AllocatedResources)
-{
-  UNIMPLEMENTED;
-
-  return TRUE;
-}
-
-
-BOOLEAN
-NTAPI
-HalBeginSystemInterrupt(IN KIRQL Irql,
-                        IN UCHAR Vector,
-                        OUT PKIRQL OldIrql)
-{
-  UNIMPLEMENTED;
-
-  return TRUE;
-}
-
-
-VOID
-NTAPI
-HalCalibratePerformanceCounter(
-  volatile LONG *Count,
-  ULONGLONG NewCount)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-NTAPI
-HalDisableSystemInterrupt(ULONG Vector,
-  KIRQL Irql)
-{
-  UNIMPLEMENTED;
-}
-
-VOID
-NTAPI
-HalAcquireDisplayOwnership(IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters)
-{
-    //
-    // Stub since Windows XP implemented Inbv
-    //
-    return;
-}
-
-VOID
-NTAPI
-HalDisplayString(IN PCH String)
-{
-    //
-    // Call the Inbv driver
-    //
-    InbvDisplayString(String);
-}
-
-VOID
-NTAPI
-HalQueryDisplayParameters(OUT PULONG DispSizeX,
-                          OUT PULONG DispSizeY,
-                          OUT PULONG CursorPosX,
-                          OUT PULONG CursorPosY)
-{
-    //
-    // Stub since Windows XP implemented Inbv
-    //
-    return;
-}
-
-VOID
-NTAPI
-HalSetDisplayParameters(IN ULONG CursorPosX,
-                        IN ULONG CursorPosY)
-{
-    //
-    // Stub since Windows XP implemented Inbv
-    //
-    return;
-}
-
-BOOLEAN
-NTAPI
-HalEnableSystemInterrupt(IN UCHAR Vector,
-                         IN KIRQL Irql,
-                         IN KINTERRUPT_MODE InterruptMode)
-{
-  UNIMPLEMENTED;
-
-  return TRUE;
-}
-
-
-VOID
-NTAPI
-HalEndSystemInterrupt(IN KIRQL OldIrql,
-                      IN PKTRAP_FRAME TrapFrame)
-{
-  UNIMPLEMENTED;
-}
-
-
-BOOLEAN
-NTAPI
-HalFlushCommonBuffer(
-  ULONG Unknown1,
-  ULONG Unknown2,
-  ULONG Unknown3,
-  ULONG Unknown4,
-  ULONG Unknown5)
-{
-  UNIMPLEMENTED;
-
-   return TRUE;
-}
-
-
-VOID
-NTAPI
-HalFreeCommonBuffer(
-  PADAPTER_OBJECT AdapterObject,
-  ULONG Length,
-  PHYSICAL_ADDRESS LogicalAddress,
-  PVOID VirtualAddress,
-  BOOLEAN CacheEnabled)
-{
-  UNIMPLEMENTED;
-}
-
-
-PADAPTER_OBJECT
-NTAPI
-HalGetAdapter(
-  PDEVICE_DESCRIPTION DeviceDescription,
-  PULONG NumberOfMapRegisters)
-{
-  UNIMPLEMENTED;
-
-  return (PADAPTER_OBJECT)NULL;
-}
-
-
-ULONG
-NTAPI
-HalGetBusData(
-  BUS_DATA_TYPE BusDataType,
-  ULONG BusNumber,
-  ULONG SlotNumber,
-  PVOID Buffer,
-  ULONG Length)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-ULONG
-NTAPI
-HalGetBusDataByOffset(
-  BUS_DATA_TYPE BusDataType,
-  ULONG BusNumber,
-  ULONG SlotNumber,
-  PVOID Buffer,
-  ULONG Offset,
-  ULONG Length)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-ARC_STATUS
-NTAPI
-HalGetEnvironmentVariable(
-  PCH Name,
-  USHORT ValueLength,
-  PCH Value)
-{
-  UNIMPLEMENTED;
-
-  return ENOENT;
-}
-
-
-ULONG
-NTAPI
-HalGetInterruptVector(
-  INTERFACE_TYPE InterfaceType,
-  ULONG BusNumber,
-  ULONG BusInterruptLevel,
-  ULONG BusInterruptVector,
-  PKIRQL Irql,
-  PKAFFINITY Affinity)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-VOID
-NTAPI
-HalHandleNMI(
-  PVOID NmiData)
-{
-  UNIMPLEMENTED;
-}
-
-VOID
-NTAPI
-HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
-{
-    PCHAR CommandLine;
-    
-    /* Make sure we have a loader block and command line */
-    if ((LoaderBlock) && (LoaderBlock->LoadOptions))
-    {
-        /* Read the command line */
-        CommandLine = LoaderBlock->LoadOptions;
-        
-        /* Check for initial breakpoint */
-        if (strstr(CommandLine, "BREAK")) DbgBreakPoint();
-    }
-}
-
-ULONG
-HalGetInterruptSource(VOID)
-{
-    ULONG InterruptStatus;
-    
-    //
-    // Get the interrupt status, and return the highest bit set
-    //
-    InterruptStatus = READ_REGISTER_ULONG(VIC_INT_STATUS);
-    return 31 - _clz(InterruptStatus);
-}
-
-VOID
-HalpClockInterrupt(VOID)
-{   
-    //
-    // Clear the interrupt
-    //
-    ASSERT(KeGetCurrentIrql() == CLOCK2_LEVEL);
-    WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1);
-    
-    //
-    // FIXME: Update HAL Perf counters
-    //
-    
-    //
-    // FIXME: Check if someone changed the clockrate
-    //
-    
-    //
-    // Call the kernel
-    //
-    KeUpdateSystemTime(KeGetCurrentThread()->TrapFrame,
-                       CLOCK2_LEVEL,
-                       HalpCurrentTimeIncrement);
-    
-    //
-    // We're done
-    //
-}
-
-VOID
-HalpStallInterrupt(VOID)
-{   
-    //
-    // Clear the interrupt
-    //
-    WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1);
-}
-
-VOID
-HalpInitializeInterrupts(VOID)
-{
-    PKPCR Pcr = (PKPCR)KeGetPcr();
-    ULONG ClockInterval;
-    SP804_CONTROL_REGISTER ControlRegister;
-    
-    //
-    // Fill out the IRQL mappings
-    //
-    RtlCopyMemory(Pcr->IrqlTable, HalpIrqlTable, sizeof(Pcr->IrqlTable));
-    RtlCopyMemory(Pcr->IrqlMask, HalpMaskTable, sizeof(Pcr->IrqlMask));
-    
-    //
-    // Setup the clock and profile interrupt
-    //
-    Pcr->InterruptRoutine[CLOCK2_LEVEL] = HalpStallInterrupt;
-    
-    //
-    // Configure the interval to 10ms
-    //  (INTERVAL (10ms) * TIMCLKfreq (1MHz))
-    // --------------------------------------- == 10^4
-    //  (TIMCLKENXdiv (1) * PRESCALEdiv (1))
-    //
-    ClockInterval = 0x2710;
-    
-    //
-    // Configure the timer
-    //
-    ControlRegister.AsUlong = 0;
-    ControlRegister.Wide = TRUE;
-    ControlRegister.Periodic = TRUE;
-    ControlRegister.Interrupt = TRUE;
-    ControlRegister.Enabled = TRUE;
-    
-    //
-    // Enable the timer
-    //
-    WRITE_REGISTER_ULONG(TIMER0_LOAD, ClockInterval);
-    WRITE_REGISTER_ULONG(TIMER0_CONTROL, ControlRegister.AsUlong);
-}
-
-/*
- * @implemented
- */
-BOOLEAN
-NTAPI
-HalInitSystem(IN ULONG BootPhase,
-              IN PLOADER_PARAMETER_BLOCK LoaderBlock)
-{
-    PKPRCB Prcb = KeGetCurrentPrcb();
-    
-    //
-    // Check the boot phase
-    //
-    if (!BootPhase)
-    {
-        //
-        // Get command-line parameters
-        //
-        HalpGetParameters(LoaderBlock);
-        
-#if DBG
-        //
-        // Checked HAL requires checked kernel
-        //
-        if (!(Prcb->BuildType & PRCB_BUILD_DEBUG))
-        {
-            //
-            // No match, bugcheck
-            //
-            KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 1, 0);
-        }
-#else
-        //
-        // Release build requires release HAL
-        //
-        if (Prcb->BuildType & PRCB_BUILD_DEBUG)
-        {
-            //
-            // No match, bugcheck
-            //
-            KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0);
-        }
-#endif
-        
-#ifdef CONFIG_SMP
-        //
-        // SMP HAL requires SMP kernel
-        //
-        if (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR)
-        {
-            //
-            // No match, bugcheck
-            //
-            KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0);
-        }
-#endif
-        
-        //
-        // Validate the PRCB
-        //
-        if (Prcb->MajorVersion != PRCB_MAJOR_VERSION)
-        {
-            //
-            // Validation failed, bugcheck
-            //
-            KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0);
-        }
-        
-        //
-        // Setup time increments to 10ms and 1ms
-        //
-        HalpCurrentTimeIncrement = 100000;
-        HalpNextTimeIncrement = 100000;
-        HalpNextIntervalCount = 0;
-        KeSetTimeIncrement(100000, 10000);
-        
-        //
-        // Initialize interrupts
-        //
-        HalpInitializeInterrupts();
-    }
-    else if (BootPhase == 1)
-    {
-        //
-        // Switch to real clock interrupt
-        //
-        PCR->InterruptRoutine[CLOCK2_LEVEL] = HalpClockInterrupt;
-    }
-    
-    //
-    // All done, return
-    //
-    return TRUE;
-}
-
-
-VOID
-NTAPI
-HalInitializeProcessor(IN ULONG ProcessorNumber,
-                       IN PLOADER_PARAMETER_BLOCK LoaderBlock)
-{
-    //
-    // Nothing to do
-    //
-    return;
-}
-
-
-BOOLEAN
-NTAPI
-HalMakeBeep(
-  ULONG Frequency)
-{
-  UNIMPLEMENTED;
-
-  return TRUE;
-}
-
-
-VOID
-NTAPI
-HalProcessorIdle(VOID)
-{
-  UNIMPLEMENTED;
-}
-
-
-#define RTC_DATA   (PVOID)0xE00E8000
-
-BOOLEAN
-NTAPI
-HalQueryRealTimeClock(IN PTIME_FIELDS Time)
-{
-    LARGE_INTEGER LargeTime;
-    ULONG Seconds;
-    
-    //
-    // Query the RTC value
-    //
-    Seconds = READ_REGISTER_ULONG(RTC_DATA);
-    
-    //
-    // Convert to time
-    //
-    RtlSecondsSince1970ToTime(Seconds, &LargeTime);
-    
-    //
-    // Convert to time-fields
-    //
-    RtlTimeToTimeFields(&LargeTime, Time);
-    return TRUE;
-}
-
-ULONG
-NTAPI
-HalReadDmaCounter(
-  PADAPTER_OBJECT AdapterObject)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-VOID
-NTAPI
-HalReportResourceUsage(VOID)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-NTAPI
-HalRequestIpi(
-  ULONG Unknown)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-FASTCALL
-HalRequestSoftwareInterrupt(IN KIRQL Request)
-{
-    //
-    // Force a software interrupt
-    //
-    WRITE_REGISTER_ULONG(VIC_SOFT_INT, 1 << Request);
-}
-
-VOID
-FASTCALL
-HalClearSoftwareInterrupt(IN KIRQL Request)
-{    
-    //
-    // Clear a software interrupt
-    //
-    WRITE_REGISTER_ULONG(VIC_SOFT_INT_CLEAR, 1 << Request);
-}
-
-VOID
-NTAPI
-HalReturnToFirmware(
-  FIRMWARE_REENTRY Action)
-{
-  UNIMPLEMENTED;
-}
-
-
-ULONG
-NTAPI
-HalSetBusData(
-  BUS_DATA_TYPE BusDataType,
-  ULONG BusNumber,
-  ULONG SlotNumber,
-  PVOID Buffer,
-  ULONG Length)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-ULONG
-NTAPI
-HalSetBusDataByOffset(
-  BUS_DATA_TYPE BusDataType,
-  ULONG BusNumber,
-  ULONG SlotNumber,
-  PVOID Buffer,
-  ULONG Offset,
-  ULONG Length)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-ARC_STATUS
-NTAPI
-HalSetEnvironmentVariable(
-  PCH Name,
-  PCH Value)
-{
-  UNIMPLEMENTED;
-
-  return ESUCCESS;
-}
-
-
-BOOLEAN
-NTAPI
-HalSetRealTimeClock(
-  PTIME_FIELDS Time)
-{
-  UNIMPLEMENTED;
-
-  return TRUE;
-}
-
-
-ULONG
-NTAPI
-HalSetTimeIncrement(
-  ULONG Increment)
-{
-  UNIMPLEMENTED;
-
-  return Increment;
-}
-
-
-BOOLEAN
-NTAPI
-HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
-                      IN PKPROCESSOR_STATE ProcessorState)
-{
-  UNIMPLEMENTED;
-
-  return TRUE;
-}
-
-
-UCHAR
-FASTCALL
-HalSystemVectorDispatchEntry(IN ULONG Vector,
-                             OUT PKINTERRUPT_ROUTINE **FlatDispatch,
-                             OUT PKINTERRUPT_ROUTINE *NoConnection)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-BOOLEAN
-NTAPI
-HalTranslateBusAddress(
-  INTERFACE_TYPE InterfaceType,
-  ULONG BusNumber,
-  PHYSICAL_ADDRESS BusAddress,
-  PULONG AddressSpace,
-  PPHYSICAL_ADDRESS TranslatedAddress)
-{
-  UNIMPLEMENTED;
-
-  return TRUE;
-}
-
-
-VOID
-NTAPI
-HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
-                       IN PSTRING NtDeviceName,
-                       OUT PUCHAR NtSystemPath,
-                       OUT PSTRING NtSystemPathString)
-{
-    /* Call the kernel */
-    IoAssignDriveLetters(LoaderBlock,
-                                NtDeviceName,
-                                NtSystemPath,
-                                NtSystemPathString);
-}
-
-NTSTATUS
-NTAPI
-HalpReadPartitionTable(IN PDEVICE_OBJECT DeviceObject,
-                       IN ULONG SectorSize,
-                       IN BOOLEAN ReturnRecognizedPartitions,
-                       IN OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
-{
-    /* Call the kernel */
-    return IoReadPartitionTable(DeviceObject,
-                                SectorSize,
-                                ReturnRecognizedPartitions,
-                                PartitionBuffer);
-}
-
-NTSTATUS
-NTAPI
-HalpWritePartitionTable(IN PDEVICE_OBJECT DeviceObject,
-                        IN ULONG SectorSize,
-                        IN ULONG SectorsPerTrack,
-                        IN ULONG NumberOfHeads,
-                        IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer)
-{
-    /* Call the kernel */
-    return IoWritePartitionTable(DeviceObject,
-                                 SectorSize,
-                                 SectorsPerTrack,
-                                 NumberOfHeads,
-                                 PartitionBuffer);
-}
-
-NTSTATUS
-NTAPI
-HalpSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject,
-                            IN ULONG SectorSize,
-                            IN ULONG PartitionNumber,
-                            IN ULONG PartitionType)
-{
-    /* Call the kernel */
-    return IoSetPartitionInformation(DeviceObject,
-                                     SectorSize,
-                                     PartitionNumber,
-                                     PartitionType);
-}
-
-
-BOOLEAN
-NTAPI
-IoFlushAdapterBuffers(
-  PADAPTER_OBJECT AdapterObject,
-  PMDL Mdl,
-  PVOID MapRegisterBase,
-  PVOID CurrentVa,
-  ULONG Length,
-  BOOLEAN WriteToDevice)
-{
-  UNIMPLEMENTED;
-
-  return TRUE;
-}
-
-
-VOID
-NTAPI
-IoFreeAdapterChannel(
-  PADAPTER_OBJECT AdapterObject)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-NTAPI
-IoFreeMapRegisters(
-  PADAPTER_OBJECT AdapterObject,
-  PVOID MapRegisterBase,
-  ULONG NumberOfMapRegisters)
-{
-  UNIMPLEMENTED;
-}
-
-
-PHYSICAL_ADDRESS
-NTAPI
-IoMapTransfer(
-  PADAPTER_OBJECT AdapterObject,
-  PMDL Mdl,
-  PVOID MapRegisterBase,
-  PVOID CurrentVa,
-  PULONG Length,
-  BOOLEAN WriteToDevice)
-{
-  PHYSICAL_ADDRESS Address;
-
-  UNIMPLEMENTED;
-
-  Address.QuadPart = 0;
-
-  return Address;
-}
-
-VOID
-NTAPI
-KeFlushWriteBuffer(VOID)
-{
-  UNIMPLEMENTED;
-}
-
-LARGE_INTEGER
-NTAPI
-KeQueryPerformanceCounter(
-  PLARGE_INTEGER PerformanceFreq)
-{
-  LARGE_INTEGER Value;
-
-  UNIMPLEMENTED;
-
-  Value.QuadPart = 0;
-
-  return Value;
-}
-
-VOID
-NTAPI
-KeStallExecutionProcessor(IN ULONG Microseconds)
-{
-    SP804_CONTROL_REGISTER ControlRegister;
-    
-    //
-    // Enable the timer
-    //
-    WRITE_REGISTER_ULONG(TIMER1_LOAD, Microseconds);
-    
-    //
-    // Configure the timer
-    //
-    ControlRegister.AsUlong = 0;
-    ControlRegister.OneShot = TRUE;
-    ControlRegister.Wide = TRUE;
-    ControlRegister.Periodic = TRUE;
-    ControlRegister.Enabled = TRUE;
-    WRITE_REGISTER_ULONG(TIMER1_CONTROL, ControlRegister.AsUlong);
-    
-    //
-    // Now we will loop until the timer reached 0
-    //
-    while (READ_REGISTER_ULONG(TIMER1_VALUE));
-}
-
-VOID
-FASTCALL
-KfLowerIrql(IN KIRQL NewIrql)
-{
-    ULONG InterruptMask;
-    ARM_STATUS_REGISTER Flags;
-    PKPCR Pcr = (PKPCR)KeGetPcr();
-    
-    //
-    // Validate the new IRQL
-    //
-    Flags = KeArmStatusRegisterGet();
-    _disable();
-    ASSERT(NewIrql <= Pcr->CurrentIrql);
-    
-    //
-    // IRQLs are internally 8 bits
-    //
-    NewIrql &= 0xFF;
-    
-    //
-    // Setup the interrupt mask for this IRQL
-    //
-    InterruptMask = KeGetPcr()->IrqlTable[NewIrql];
-//    DPRINT1("[LOWER] IRQL: %d InterruptMask: %lx\n", NewIrql, InterruptMask);
-    
-    //
-    // Clear interrupts associated to the old IRQL
-    //
-    WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF);
-    
-    //
-    // Set the new interrupt mask
-    // PL190 VIC support only for now
-    //
-    WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask);
-    
-    //
-    // Save the new IRQL
-    //
-    Pcr->CurrentIrql = NewIrql;
-    if (!Flags.IrqDisable) _enable();
-}
-
-KIRQL
-FASTCALL
-KfRaiseIrql(IN KIRQL NewIrql)
-{
-    KIRQL OldIrql;
-    ULONG InterruptMask;
-    ARM_STATUS_REGISTER Flags;
-    PKPCR Pcr = (PKPCR)KeGetPcr();
-    
-    //
-    // Save the current IRQL
-    //
-    Flags = KeArmStatusRegisterGet();
-    _disable();
-    OldIrql = Pcr->CurrentIrql;
-    
-    //
-    // IRQLs are internally 8 bits
-    //
-    NewIrql &= 0xFF;
-    
-    //
-    // Setup the interrupt mask for this IRQL
-    //
-    InterruptMask = KeGetPcr()->IrqlTable[NewIrql];
-  //  DPRINT1("[RAISE] IRQL: %d InterruptMask: %lx\n", NewIrql, InterruptMask);
-    ASSERT(NewIrql >= OldIrql);
-    
-    //
-    // Clear interrupts associated to the old IRQL
-    //
-    WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF);
-    
-    //
-    // Set the new interrupt mask
-    // PL190 VIC support only for now
-    //
-    WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask);
-    
-    //
-    // Save the new IRQL
-    //
-    Pcr->CurrentIrql = NewIrql;
-    if (!Flags.IrqDisable) _enable();
-    return OldIrql;
-}
-
-VOID
-NTAPI
-READ_PORT_BUFFER_UCHAR(
-  PUCHAR Port,
-  PUCHAR Buffer,
-  ULONG Count)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-NTAPI
-READ_PORT_BUFFER_ULONG(
-  PULONG Port,
-  PULONG Buffer,
-  ULONG Count)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-NTAPI
-READ_PORT_BUFFER_USHORT(
-  PUSHORT Port,
-  PUSHORT Buffer,
-  ULONG Count)
-{
-  UNIMPLEMENTED;
-}
-
-
-UCHAR
-NTAPI
-READ_PORT_UCHAR(
-  PUCHAR Port)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-ULONG
-NTAPI
-READ_PORT_ULONG(
-  PULONG Port)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-USHORT
-NTAPI
-READ_PORT_USHORT(
-  PUSHORT Port)
-{
-  UNIMPLEMENTED;
-
-  return 0;
-}
-
-
-VOID
-NTAPI
-WRITE_PORT_BUFFER_UCHAR(
-  PUCHAR Port,
-  PUCHAR Buffer,
-  ULONG Count)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-NTAPI
-WRITE_PORT_BUFFER_USHORT(
-  PUSHORT Port,
-  PUSHORT Buffer,
-  ULONG Count)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-NTAPI
-WRITE_PORT_BUFFER_ULONG(
-  PULONG Port,
-  PULONG Buffer,
-  ULONG Count)
-{
-  UNIMPLEMENTED;
-}
-
-
-VOID
-NTAPI
-WRITE_PORT_UCHAR(
-  PUCHAR Port,
-  UCHAR Value)
-{
-  UNIMPLEMENTED;
-}
-
-VOID
-NTAPI
-WRITE_PORT_ULONG(
-  PULONG Port,
-  ULONG Value)
-{
-  UNIMPLEMENTED;
-}
-
-VOID
-NTAPI
-WRITE_PORT_USHORT(
-  PUSHORT Port,
-  USHORT Value)
-{
-  UNIMPLEMENTED;
-}
-
-KIRQL
-KeRaiseIrqlToDpcLevel(VOID)
-{
-    //
-    // Call the generic routine
-    //
-    return KfRaiseIrql(DISPATCH_LEVEL);
-}
-
-KIRQL
-KeRaiseIrqlToSynchLevel(VOID)
-{
-    //
-    // Call the generic routine
-    //
-    return KfRaiseIrql(DISPATCH_LEVEL);
-}
-
-BOOLEAN HalpProcessorIdentified;
-BOOLEAN HalpTestCleanSupported;
-
-VOID
-HalpIdentifyProcessor(VOID)
-{
-    ARM_ID_CODE_REGISTER IdRegister;
-
-    //
-    // Don't do it again
-    //
-    HalpProcessorIdentified = TRUE;
-    
-    //
-    // Read the ID Code
-    //
-    IdRegister = KeArmIdCodeRegisterGet();
-    
-    //
-    // Architecture "6" CPUs support test-and-clean (926EJ-S and 1026EJ-S)
-    //
-    HalpTestCleanSupported = (IdRegister.Architecture == 6);
-}
-
-VOID
-HalSweepDcache(VOID)
-{
-    //
-    // We get called very early on, before HalInitSystem or any of the Hal*
-    // processor routines, so we need to figure out what CPU we're on.
-    //
-    if (!HalpProcessorIdentified) HalpIdentifyProcessor();
-    
-    //
-    // Check if we can do it the ARMv5TE-J way
-    //
-    if (HalpTestCleanSupported)
-    {
-        //
-        // Test, clean, flush D-Cache
-        //
-        __asm__ __volatile__ ("1: mrc p15, 0, pc, c7, c14, 3; bne 1b");
-    }
-    else
-    {
-        //
-        // We need to do it it by set/way
-        //
-        UNIMPLEMENTED;
-    }
-}
-
-VOID
-HalSweepIcache(VOID)
-{
-    //
-    // All ARM cores support the same Icache flush command, no need for HAL work
-    //
-    KeArmFlushIcache();
-}
-
-/*
- * @implemented
- */
-#undef KeGetCurrentIrql
-KIRQL
-NTAPI
-KeGetCurrentIrql(VOID)
-{
-    /* Return IRQL */
-    return PCR->CurrentIrql;
-}
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-KeLowerIrql(KIRQL NewIrql)
-{
-    /* Call the fastcall function */
-    KfLowerIrql(NewIrql);
-}
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-KeRaiseIrql(KIRQL NewIrql,
-            PKIRQL OldIrql)
-{
-    /* Call the fastcall function */
-    *OldIrql = KfRaiseIrql(NewIrql);
-}
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-KeAcquireSpinLock(PKSPIN_LOCK SpinLock,
-                  PKIRQL OldIrql)
-{
-    /* Call the fastcall function */
-    *OldIrql = KfAcquireSpinLock(SpinLock);
-}
-
-/*
- * @implemented
- */
-KIRQL
-FASTCALL
-KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock)
-{
-    /* Simply raise to dispatch */
-    return KfRaiseIrql(DISPATCH_LEVEL);
-}
-
-/*
- * @implemented
- */
-VOID
-NTAPI
-KeReleaseSpinLock(PKSPIN_LOCK SpinLock,
-                  KIRQL NewIrql)
-{
-    /* Call the fastcall function */
-    KfReleaseSpinLock(SpinLock, NewIrql);
-}
-
-/*
- * @implemented
- */
-KIRQL
-FASTCALL
-KfAcquireSpinLock(PKSPIN_LOCK SpinLock)
-{
-    /* Simply raise to dispatch */
-    return KfRaiseIrql(DISPATCH_LEVEL);
-}
-
-/*
- * @implemented
- */
-VOID
-FASTCALL
-KfReleaseSpinLock(PKSPIN_LOCK SpinLock,
-                  KIRQL OldIrql)
-{
-    /* Simply lower IRQL back */
-    KfLowerIrql(OldIrql);
-}
-
-/*
- * @implemented
- */
-KIRQL
-FASTCALL
-KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
-{
-    /* Simply raise to dispatch */
-    return KfRaiseIrql(DISPATCH_LEVEL);
-}
-
-/*
- * @implemented
- */
-KIRQL
-FASTCALL
-KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
-{
-    /* Simply raise to dispatch */
-    return KfRaiseIrql(DISPATCH_LEVEL);
-}
-
-/*
- * @implemented
- */
-VOID
-FASTCALL
-KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock,
-                               IN PKLOCK_QUEUE_HANDLE LockHandle)
-{
-    /* Simply raise to dispatch */
-    LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
-}
-
-/*
- * @implemented
- */
-VOID
-FASTCALL
-KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock,
-                                           IN PKLOCK_QUEUE_HANDLE LockHandle)
-{
-    /* Simply raise to synch */
-    LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
-}
-
-/*
- * @implemented
- */
-VOID
-FASTCALL
-KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
-                        IN KIRQL OldIrql)
-{
-    /* Simply lower IRQL back */
-    KfLowerIrql(OldIrql);
-}
-
-/*
- * @implemented
- */
-VOID
-FASTCALL
-KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
-{
-    /* Simply lower IRQL back */
-    KfLowerIrql(LockHandle->OldIrql);
-}
-
-/*
- * @implemented
- */
-BOOLEAN
-FASTCALL
-KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
-                                         IN PKIRQL OldIrql)
-{
-    /* Simply raise to dispatch */
-    *OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
-    
-    /* Always return true on UP Machines */
-    return TRUE;
-}
-
-/*
- * @implemented
- */
-LOGICAL
-FASTCALL
-KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
-                             OUT PKIRQL OldIrql)
-{
-    /* Simply raise to dispatch */
-    *OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
-    
-    /* Always return true on UP Machines */
-    return TRUE;
-}
-
-/* EOF */
diff --git a/reactos/hal/halarm/generic/halinit.c b/reactos/hal/halarm/generic/halinit.c
new file mode 100644 (file)
index 0000000..6f63dc9
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/halinit.c
+ * PURPOSE:         HAL Entrypoint and Initialization
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+NTAPI
+HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    PCHAR CommandLine;
+
+    /* Make sure we have a loader block and command line */
+    if ((LoaderBlock) && (LoaderBlock->LoadOptions))
+    {
+        /* Read the command line */
+        CommandLine = LoaderBlock->LoadOptions;
+
+        /* Check for initial breakpoint */
+        if (strstr(CommandLine, "BREAK")) DbgBreakPoint();
+    }
+}
+
+/* FUNCTIONS ******************************************************************/
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalInitSystem(IN ULONG BootPhase,
+              IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    PKPRCB Prcb = KeGetCurrentPrcb();
+
+    /* Check the boot phase */
+    if (!BootPhase)
+    {
+        /* Get command-line parameters */
+        HalpGetParameters(LoaderBlock);
+
+        /* Checked HAL requires checked kernel */
+#if DBG
+        if (!(Prcb->BuildType & PRCB_BUILD_DEBUG))
+        {
+            /* No match, bugcheck */
+            KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 1, 0);
+        }
+#else
+        /* Release build requires release HAL */
+        if (Prcb->BuildType & PRCB_BUILD_DEBUG)
+        {
+            /* No match, bugcheck */
+            KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0);
+        }
+#endif
+
+#ifdef CONFIG_SMP
+        /* SMP HAL requires SMP kernel */
+        if (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR)
+        {
+            /* No match, bugcheck */
+            KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0);
+        }
+#endif
+
+        /* Validate the PRCB */
+        if (Prcb->MajorVersion != PRCB_MAJOR_VERSION)
+        {
+            /* Validation failed, bugcheck */
+            KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0);
+        }
+        
+        /* Initialize interrupts */
+        HalpInitializeInterrupts();
+
+        /* Force initial PIC state */
+        KfRaiseIrql(KeGetCurrentIrql());
+
+        /* Fill out the dispatch tables */
+        //HalQuerySystemInformation = NULL; // FIXME: TODO;
+        //HalSetSystemInformation = NULL; // FIXME: TODO;
+        //HalInitPnpDriver = NULL; // FIXME: TODO
+        //HalGetDmaAdapter = NULL; // FIXME: TODO;
+        //HalGetInterruptTranslator = NULL;  // FIXME: TODO
+        //HalResetDisplay = NULL; // FIXME: TODO;
+        //HalHaltSystem = NULL; // FIXME: TODO;
+
+        /* Setup I/O space */
+        //HalpDefaultIoSpace.Next = HalpAddressUsageList;
+        //HalpAddressUsageList = &HalpDefaultIoSpace;
+
+        /* Setup busy waiting */
+        //HalpCalibrateStallExecution();
+
+        /* Initialize the clock */
+        HalpInitializeClock();
+
+        /* Setup time increments to 10ms and 1ms */
+        HalpCurrentTimeIncrement = 100000;
+        HalpNextTimeIncrement = 100000;
+        HalpNextIntervalCount = 0;
+        KeSetTimeIncrement(100000, 10000);
+
+        /*
+         * We could be rebooting with a pending profile interrupt,
+         * so clear it here before interrupts are enabled
+         */
+        HalStopProfileInterrupt(ProfileTime);
+
+        /* Do some HAL-specific initialization */
+        HalpInitPhase0(LoaderBlock);
+    }
+    else if (BootPhase == 1)
+    {
+        /* Enable timer interrupt */
+        HalpEnableInterruptHandler(IDT_DEVICE,
+                                   0,
+                                   PRIMARY_VECTOR_BASE,
+                                   CLOCK2_LEVEL,
+                                   HalpClockInterrupt,
+                                   Latched);
+#if 0
+        /* Enable IRQ 8 */
+        HalpEnableInterruptHandler(IDT_DEVICE,
+                                   0,
+                                   PRIMARY_VECTOR_BASE + 8,
+                                   PROFILE_LEVEL,
+                                   HalpProfileInterrupt,
+                                   Latched);
+#endif
+        /* Initialize DMA. NT does this in Phase 0 */
+        //HalpInitDma();
+
+        /* Do some HAL-specific initialization */
+        HalpInitPhase1();
+    }
+
+    /* All done, return */
+    return TRUE;
+}
+
+#include <internal/kd.h>
+ULONG
+DbgPrintEarly(const char *fmt, ...)
+{
+    va_list args;
+    unsigned int i;
+    char Buffer[1024];
+    PCHAR String = Buffer;
+
+    va_start(args, fmt);
+    i = vsprintf(Buffer, fmt, args);
+    va_end(args);
+    
+    /* Output the message */
+    while (*String != 0)
+    {
+        if (*String == '\n')
+        {
+            KdPortPutByteEx(NULL, '\r');
+        }
+        KdPortPutByteEx(NULL, *String);
+        String++;
+    }
+    
+    return STATUS_SUCCESS;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/misc.c b/reactos/hal/halarm/generic/misc.c
new file mode 100644 (file)
index 0000000..86fbe76
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * PROJECT:         ReactOS Hardware Abstraction Layer (HAL)
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/misc.c
+ * PURPOSE:         Misc functions to move
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS  *******************************************************************/
+
+/* FUNCTIONS ******************************************************************/
+
+/*
+ * @implemented
+ */
+UCHAR
+FASTCALL
+HalSystemVectorDispatchEntry(IN ULONG Vector,
+                             OUT PKINTERRUPT_ROUTINE **FlatDispatch,
+                             OUT PKINTERRUPT_ROUTINE *NoConnection)
+{
+    /* Not implemented */
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeFlushWriteBuffer(VOID)
+{
+    /* Not implemented */
+    UNIMPLEMENTED;
+    while (TRUE);
+    return;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/pic.c b/reactos/hal/halarm/generic/pic.c
new file mode 100644 (file)
index 0000000..5be8c3f
--- /dev/null
@@ -0,0 +1,342 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/pic.c
+ * PURPOSE:         HAL PIC Management and Control Code
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+#undef KeGetCurrentIrql
+
+/* GLOBALS ********************************************************************/
+
+ULONG HalpIrqlTable[HIGH_LEVEL + 1] =
+{
+    0xFFFFFFFF, // IRQL 0 PASSIVE_LEVEL
+    0xFFFFFFFD, // IRQL 1 APC_LEVEL
+    0xFFFFFFF9, // IRQL 2 DISPATCH_LEVEL
+    0xFFFFFFD9, // IRQL 3
+    0xFFFFFF99, // IRQL 4
+    0xFFFFFF19, // IRQL 5
+    0xFFFFFE19, // IRQL 6
+    0xFFFFFC19, // IRQL 7
+    0xFFFFF819, // IRQL 8
+    0xFFFFF019, // IRQL 9
+    0xFFFFE019, // IRQL 10
+    0xFFFFC019, // IRQL 11
+    0xFFFF8019, // IRQL 12
+    0xFFFF0019, // IRQL 13
+    0xFFFE0019, // IRQL 14
+    0xFFFC0019, // IRQL 15
+    0xFFF80019, // IRQL 16
+    0xFFF00019, // IRQL 17
+    0xFFE00019, // IRQL 18
+    0xFFC00019, // IRQL 19
+    0xFF800019, // IRQL 20
+    0xFF000019, // IRQL 21
+    0xFE000019, // IRQL 22
+    0xFC000019, // IRQL 23
+    0xF0000019, // IRQL 24
+    0x80000019, // IRQL 25
+    0x19,       // IRQL 26
+    0x18,       // IRQL 27 PROFILE_LEVEL
+    0x10,       // IRQL 28 CLOCK2_LEVEL
+    0x00,       // IRQL 29 IPI_LEVEL
+    0x00,       // IRQL 30 POWER_LEVEL
+    0x00,       // IRQL 31 HIGH_LEVEL
+};
+
+UCHAR HalpMaskTable[HIGH_LEVEL + 1] =
+{
+    PROFILE_LEVEL, // INT 0 WATCHDOG
+    APC_LEVEL,     // INT 1 SOFTWARE INTERRUPT
+    DISPATCH_LEVEL,// INT 2 COMM RX
+    IPI_LEVEL,     // INT 3 COMM TX
+    CLOCK2_LEVEL,  // INT 4 TIMER 0
+    3,
+    4,
+    5,
+    6,
+    7,
+    8,
+    9,
+    10,
+    11,
+    12,
+    13,
+    14,
+    15,
+    16,
+    17,
+    18,
+    19,
+    20,
+    21,
+    22,
+    23,
+    24,
+    25,
+    26,
+    26,
+    26
+};
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+HalpInitializeInterrupts(VOID)
+{
+    PKIPCR Pcr = (PKIPCR)KeGetPcr();
+
+    /* Fill out the IRQL mappings */
+    RtlCopyMemory(Pcr->IrqlTable, HalpIrqlTable, sizeof(Pcr->IrqlTable));
+    RtlCopyMemory(Pcr->IrqlMask, HalpMaskTable, sizeof(Pcr->IrqlMask));
+}
+    
+/* IRQL MANAGEMENT ************************************************************/
+
+/*
+ * @implemented
+ */
+ULONG
+HalGetInterruptSource(VOID)
+{
+    ULONG InterruptStatus;
+    
+    /* Get the interrupt status, and return the highest bit set */
+    InterruptStatus = READ_REGISTER_ULONG(VIC_INT_STATUS);
+    return 31 - _clz(InterruptStatus);
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+NTAPI
+KeGetCurrentIrql(VOID)
+{
+    /* Return the IRQL */
+    return KeGetPcr()->Irql;
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+NTAPI
+KeRaiseIrqlToDpcLevel(VOID)
+{
+    PKPCR Pcr = KeGetPcr();
+    KIRQL CurrentIrql;
+    
+    /* Save and update IRQL */
+    CurrentIrql = Pcr->Irql;
+    Pcr->Irql = DISPATCH_LEVEL;
+    
+#ifdef IRQL_DEBUG
+    /* Validate correct raise */
+    if (CurrentIrql > DISPATCH_LEVEL) KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL);
+#endif
+
+    /* Return the previous value */
+    return CurrentIrql;
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+NTAPI
+KeRaiseIrqlToSynchLevel(VOID)
+{
+    PKPCR Pcr = KeGetPcr();
+    KIRQL CurrentIrql;
+    
+    /* Save and update IRQL */
+    CurrentIrql = Pcr->Irql;
+    Pcr->Irql = SYNCH_LEVEL;
+    
+#ifdef IRQL_DEBUG
+    /* Validate correct raise */
+    if (CurrentIrql > SYNCH_LEVEL)
+    {
+        /* Crash system */
+        KeBugCheckEx(IRQL_NOT_GREATER_OR_EQUAL,
+                     CurrentIrql,
+                     SYNCH_LEVEL,
+                     0,
+                     1);
+    }
+#endif
+
+    /* Return the previous value */
+    return CurrentIrql;
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+FASTCALL
+KfRaiseIrql(IN KIRQL NewIrql)
+{
+    ARM_STATUS_REGISTER Flags;
+    PKIPCR Pcr = (PKIPCR)KeGetPcr();
+    KIRQL CurrentIrql;
+    ULONG InterruptMask;
+    
+    /* Disable interrupts */
+    Flags = KeArmStatusRegisterGet();
+    _disable();
+
+    /* Read current IRQL */
+    CurrentIrql = Pcr->Irql;
+    
+#ifdef IRQL_DEBUG
+    /* Validate correct raise */
+    if (CurrentIrql > NewIrql)
+    {
+        /* Crash system */
+        Pcr->Irql = PASSIVE_LEVEL;
+        KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL);
+    }
+#endif
+    /* Clear interrupts associated to the old IRQL */
+    WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF);
+    
+    /* Set the new interrupt mask */
+    InterruptMask = Pcr->IrqlTable[NewIrql];
+    WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask);
+
+    /* Set new IRQL */
+    Pcr->Irql = NewIrql;
+    
+    /* Restore interrupt state */
+    if (!Flags.IrqDisable) _enable();
+    
+    /* Return old IRQL */
+    return CurrentIrql;
+}
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
+KfLowerIrql(IN KIRQL NewIrql)
+{
+    ARM_STATUS_REGISTER Flags;
+    PKIPCR Pcr = (PKIPCR)KeGetPcr();
+    ULONG InterruptMask;
+    
+    /* Disableinterrupts */
+    Flags = KeArmStatusRegisterGet();
+    _disable();    
+    
+#ifdef IRQL_DEBUG
+    /* Validate correct lower */
+    if (OldIrql > Pcr->Irql)
+    {
+        /* Crash system */
+        Pcr->Irql = HIGH_LEVEL;
+        KeBugCheck(IRQL_NOT_LESS_OR_EQUAL);
+    }
+#endif
+
+    /* Clear interrupts associated to the old IRQL */
+    WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF);
+    
+    /* Set the new interrupt mask */
+    InterruptMask = Pcr->IrqlTable[NewIrql];
+    WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask);
+    
+    /* Save the new IRQL and restore interrupt state */
+    Pcr->Irql = NewIrql;
+    if (!Flags.IrqDisable) _enable();
+}
+
+/* SOFTWARE INTERRUPTS ********************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
+HalRequestSoftwareInterrupt(IN KIRQL Irql)
+{
+    /* Force a software interrupt */
+    WRITE_REGISTER_ULONG(VIC_SOFT_INT, 1 << Irql);
+}
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
+HalClearSoftwareInterrupt(IN KIRQL Irql)
+{
+    /* Clear software interrupt */
+    WRITE_REGISTER_ULONG(VIC_SOFT_INT_CLEAR, 1 << Irql);
+}
+
+/* SYSTEM INTERRUPTS **********************************************************/
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalEnableSystemInterrupt(IN UCHAR Vector,
+                         IN KIRQL Irql,
+                         IN KINTERRUPT_MODE InterruptMode)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return FALSE;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalDisableSystemInterrupt(IN UCHAR Vector,
+                          IN KIRQL Irql)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalBeginSystemInterrupt(IN KIRQL Irql,
+                        IN UCHAR Vector,
+                        OUT PKIRQL OldIrql)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return FALSE;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalEndSystemInterrupt(IN KIRQL OldIrql,
+                      IN PKTRAP_FRAME TrapFrame)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/portio.c b/reactos/hal/halarm/generic/portio.c
new file mode 100644 (file)
index 0000000..91786b4
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/portio.c
+ * PURPOSE:         I/O Functions for access to ports
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+#undef READ_PORT_UCHAR
+#undef READ_PORT_USHORT
+#undef READ_PORT_ULONG
+#undef WRITE_PORT_UCHAR
+#undef WRITE_PORT_USHORT
+#undef WRITE_PORT_ULONG
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+NTAPI
+READ_PORT_BUFFER_UCHAR(IN PUCHAR Port,
+                       OUT PUCHAR Buffer,
+                       IN ULONG Count)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+NTAPI
+READ_PORT_BUFFER_USHORT(IN PUSHORT Port,
+                        OUT PUSHORT Buffer,
+                        IN ULONG Count)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+NTAPI
+READ_PORT_BUFFER_ULONG(IN PULONG Port,
+                       OUT PULONG Buffer,
+                       IN ULONG Count)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+UCHAR
+NTAPI
+READ_PORT_UCHAR(IN PUCHAR Port)
+{
+    return READ_REGISTER_UCHAR(Port);
+}
+
+USHORT
+NTAPI
+READ_PORT_USHORT(IN PUSHORT Port)
+{
+    return READ_REGISTER_USHORT(Port);
+}
+
+ULONG
+NTAPI
+READ_PORT_ULONG(IN PULONG Port)
+{
+    return READ_REGISTER_ULONG(Port);
+}
+
+VOID
+NTAPI
+WRITE_PORT_BUFFER_UCHAR(IN PUCHAR Port,
+                        IN PUCHAR Buffer,
+                        IN ULONG Count)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+NTAPI
+WRITE_PORT_BUFFER_USHORT(IN PUSHORT Port,
+                         IN PUSHORT Buffer,
+                         IN ULONG Count)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+NTAPI
+WRITE_PORT_BUFFER_ULONG(IN PULONG Port,
+                        IN PULONG Buffer,
+                        IN ULONG Count)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+NTAPI
+WRITE_PORT_UCHAR(IN PUCHAR Port,
+                 IN UCHAR Value)
+{
+    WRITE_REGISTER_UCHAR(Port, Value);
+}
+
+VOID
+NTAPI
+WRITE_PORT_USHORT(IN PUSHORT Port,
+                  IN USHORT Value)
+{
+    WRITE_REGISTER_USHORT(Port, Value);
+}
+
+VOID
+NTAPI
+WRITE_PORT_ULONG(IN PULONG Port,
+                 IN ULONG Value)
+{
+    WRITE_REGISTER_ULONG(Port, Value);
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/processor.c b/reactos/hal/halarm/generic/processor.c
new file mode 100644 (file)
index 0000000..b52ef5c
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/processor.c
+ * PURPOSE:         HAL Processor Routines
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
+LONG HalpActiveProcessors;
+KAFFINITY HalpDefaultInterruptAffinity;
+BOOLEAN HalpProcessorIdentified;
+BOOLEAN HalpTestCleanSupported;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+HalpIdentifyProcessor(VOID)
+{
+    ARM_ID_CODE_REGISTER IdRegister;
+
+    /* Don't do it again */
+    HalpProcessorIdentified = TRUE;
+    
+    // fixfix: Use Pcr->ProcessorId
+    
+    /* Read the ID Code */
+    IdRegister = KeArmIdCodeRegisterGet();
+    
+    /* Architecture "6" CPUs support test-and-clean (926EJ-S and 1026EJ-S) */
+    HalpTestCleanSupported = (IdRegister.Architecture == 6);
+}
+
+/* FUNCTIONS ******************************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalInitializeProcessor(IN ULONG ProcessorNumber,
+                       IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    /* Do nothing */
+    return;
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalAllProcessorsStarted(VOID)
+{
+    /* Do nothing */
+    return TRUE;
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+                      IN PKPROCESSOR_STATE ProcessorState)
+{
+    /* Ready to start */
+    return FALSE;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalProcessorIdle(VOID)
+{
+    /* Enable interrupts and halt the processor */
+    _enable();
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalRequestIpi(KAFFINITY TargetProcessors)
+{
+    /* Not implemented on UP */
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+/*
+ * @implemented
+ */
+VOID
+HalSweepDcache(VOID)
+{
+    /*
+     * We get called very early on, before HalInitSystem or any of the Hal*
+     * processor routines, so we need to figure out what CPU we're on.
+     */
+    if (!HalpProcessorIdentified) HalpIdentifyProcessor();
+    
+    /*
+     * Check if we can do it the ARMv5TE-J way
+     */
+    if (HalpTestCleanSupported)
+    {
+        /* Test, clean, flush D-Cache */
+        __asm__ __volatile__ ("1: mrc p15, 0, pc, c7, c14, 3; bne 1b");
+    }
+    else
+    {
+        /* We need to do it it by set/way. For now always call ARMv7 function */
+        //extern VOID v7_flush_dcache_all(VOID);
+        //v7_flush_dcache_all();
+    }
+}
+
+/*
+ * @implemented
+ */
+VOID
+HalSweepIcache(VOID)
+{
+    /* All ARM cores support the same Icache flush command */
+    KeArmFlushIcache();
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/profil.c b/reactos/hal/halarm/generic/profil.c
new file mode 100644 (file)
index 0000000..44f9e6f
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/profil.c
+ * PURPOSE:         System Profiling
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS ******************************************************************/
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
+{
+    UNIMPLEMENTED;
+    return;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
+{
+    UNIMPLEMENTED;
+    return;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG_PTR
+NTAPI
+HalSetProfileInterval(IN ULONG_PTR Interval)
+{
+    UNIMPLEMENTED;
+    return Interval;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/reboot.c b/reactos/hal/halarm/generic/reboot.c
new file mode 100644 (file)
index 0000000..51de486
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/reboot.c
+ * PURPOSE:         Reboot Function
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalReturnToFirmware(IN FIRMWARE_REENTRY Action)
+{
+    /* Check what kind of action this is */
+    switch (Action)
+    {
+        /* All recognized actions */
+        case HalHaltRoutine:
+        case HalRebootRoutine:
+
+            /* Acquire the display */
+            InbvAcquireDisplayOwnership();
+
+        /* Anything else */
+        default:
+
+            /* Print message and break */
+            DbgPrint("HalReturnToFirmware called!\n");
+            DbgBreakPoint();
+    }
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/rtc.c b/reactos/hal/halarm/generic/rtc.c
new file mode 100644 (file)
index 0000000..e2fe11e
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/rtc.c
+ * PURPOSE:         Real Time Clock and Environment Variable Support
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS ******************************************************************/
+
+#define RTC_DATA   (PVOID)0x101E8000
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalQueryRealTimeClock(IN PTIME_FIELDS Time)
+{
+    LARGE_INTEGER LargeTime;
+    ULONG Seconds;
+    
+    /* Query the RTC value */
+    Seconds = READ_REGISTER_ULONG(RTC_DATA);
+    
+    /* Convert to time */
+    RtlSecondsSince1970ToTime(Seconds, &LargeTime);
+    
+    /* Convert to time-fields */
+    RtlTimeToTimeFields(&LargeTime, Time);
+    return TRUE;
+}
+
+/*
+ * @unimplemented
+ */
+BOOLEAN
+NTAPI
+HalSetRealTimeClock(IN PTIME_FIELDS Time)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return TRUE;
+}
+
+/*
+ * @unimplemented
+ */
+ARC_STATUS
+NTAPI
+HalSetEnvironmentVariable(IN PCH Name,
+                          IN PCH Value)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return ESUCCESS;
+}
+
+/*
+ * @unimplemented
+ */
+ARC_STATUS
+NTAPI
+HalGetEnvironmentVariable(IN PCH Name,
+                          IN USHORT ValueLength,
+                          IN PCH Value)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return ENOENT;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/spinlock.c b/reactos/hal/halarm/generic/spinlock.c
new file mode 100644 (file)
index 0000000..ff53749
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/spinlock.c
+ * PURPOSE:         SpinLock Routines
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+/* INCLUDES ******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+#undef KeAcquireSpinLock
+#undef KeReleaseSpinLock
+#undef KeRaiseIrql
+#undef KeLowerIrql
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeRaiseIrql(KIRQL NewIrql,
+            PKIRQL OldIrql)
+{
+    /* Call the fastcall function */
+    *OldIrql = KfRaiseIrql(NewIrql);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeLowerIrql(KIRQL NewIrql)
+{
+    /* Call the fastcall function */
+    KfLowerIrql(NewIrql);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeAcquireSpinLock(PKSPIN_LOCK SpinLock,
+                  PKIRQL OldIrql)
+{
+    /* Call the fastcall function */
+    *OldIrql = KfAcquireSpinLock(SpinLock);
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+FASTCALL
+KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock)
+{
+    /* Simply raise to dispatch */
+    return KfRaiseIrql(DISPATCH_LEVEL);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeReleaseSpinLock(PKSPIN_LOCK SpinLock,
+                  KIRQL NewIrql)
+{
+    /* Call the fastcall function */
+    KfReleaseSpinLock(SpinLock, NewIrql);
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+FASTCALL
+KfAcquireSpinLock(PKSPIN_LOCK SpinLock)
+{
+    /* Simply raise to dispatch */
+    return KfRaiseIrql(DISPATCH_LEVEL);
+}
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
+KfReleaseSpinLock(PKSPIN_LOCK SpinLock,
+                  KIRQL OldIrql)
+{
+    /* Simply lower IRQL back */
+    KeLowerIrql(OldIrql);
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+FASTCALL
+KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
+{
+    /* Simply raise to dispatch */
+    return KfRaiseIrql(DISPATCH_LEVEL);
+}
+
+/*
+ * @implemented
+ */
+KIRQL
+FASTCALL
+KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
+{
+    /* Simply raise to dispatch */
+    return KfRaiseIrql(DISPATCH_LEVEL);
+}
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
+KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock,
+                               IN PKLOCK_QUEUE_HANDLE LockHandle)
+{
+    /* Simply raise to dispatch */
+    LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
+}
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
+KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock,
+                                           IN PKLOCK_QUEUE_HANDLE LockHandle)
+{
+    /* Simply raise to dispatch */
+    LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
+}
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
+KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
+                        IN KIRQL OldIrql)
+{
+    /* Simply lower IRQL back */
+    KfLowerIrql(OldIrql);
+}
+
+/*
+ * @implemented
+ */
+VOID
+FASTCALL
+KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
+{
+    /* Simply lower IRQL back */
+    KfLowerIrql(LockHandle->OldIrql);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+FASTCALL
+KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
+                                         IN PKIRQL OldIrql)
+{
+    /* Simply raise to synch */
+    KeRaiseIrql(SYNCH_LEVEL, OldIrql);
+
+    /* Always return true on UP Machines */
+    return TRUE;
+}
+
+/*
+ * @implemented
+ */
+LOGICAL
+FASTCALL
+KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber,
+                             OUT PKIRQL OldIrql)
+{
+    /* Simply raise to dispatch */
+    KeRaiseIrql(DISPATCH_LEVEL, OldIrql);
+
+    /* Always return true on UP Machines */
+    return TRUE;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/sysinfo.c b/reactos/hal/halarm/generic/sysinfo.c
new file mode 100644 (file)
index 0000000..f48ae96
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/spinlock.c
+ * PURPOSE:         HAL Information Routines
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS ******************************************************************/
+
+NTSTATUS
+NTAPI
+HaliQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass,
+                           IN ULONG BufferSize,
+                           IN OUT PVOID Buffer,
+                           OUT PULONG ReturnedLength)
+{
+       UNIMPLEMENTED;
+    while (TRUE);
+       return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+NTAPI
+HaliSetSystemInformation(IN HAL_SET_INFORMATION_CLASS InformationClass,
+                         IN ULONG BufferSize,
+                         IN OUT PVOID Buffer)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/timer.c b/reactos/hal/halarm/generic/timer.c
new file mode 100644 (file)
index 0000000..9ed2a2a
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/timer.c
+ * PURPOSE:         Timer Routines
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+VOID
+FASTCALL
+KeUpdateSystemTime(
+    IN PKTRAP_FRAME TrapFrame,
+    IN ULONG Increment,
+    IN KIRQL OldIrql
+);
+
+/* GLOBALS ********************************************************************/
+
+ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+HalpClockInterrupt(VOID)
+{   
+    /* Clear the interrupt */
+    ASSERT(KeGetCurrentIrql() == CLOCK2_LEVEL);
+    WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1);
+    
+    /* FIXME: Update HAL Perf counters */
+    
+    /* FIXME: Check if someone changed the clockrate */
+    
+    /* Call the kernel */
+    KeUpdateSystemTime(KeGetCurrentThread()->TrapFrame,
+                       HalpCurrentTimeIncrement,
+                       CLOCK2_LEVEL);
+}
+
+VOID
+HalpStallInterrupt(VOID)
+{   
+    /* Clear the interrupt */
+    WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1);
+}
+
+VOID
+HalpInitializeClock(VOID)
+{
+    PKIPCR Pcr = (PKIPCR)KeGetPcr();
+    ULONG ClockInterval;
+    SP804_CONTROL_REGISTER ControlRegister;
+    
+    /* Setup the clock and profile interrupt */
+    Pcr->InterruptRoutine[CLOCK2_LEVEL] = HalpStallInterrupt;
+    
+    /*
+     * Configure the interval to 10ms
+     * (INTERVAL (10ms) * TIMCLKfreq (1MHz))
+     * --------------------------------------- == 10^4
+     *  (TIMCLKENXdiv (1) * PRESCALEdiv (1))
+     */
+    ClockInterval = 0x2710;
+    
+    /* Configure the timer */
+    ControlRegister.AsUlong = 0;
+    ControlRegister.Wide = TRUE;
+    ControlRegister.Periodic = TRUE;
+    ControlRegister.Interrupt = TRUE;
+    ControlRegister.Enabled = TRUE;
+    
+    /* Enable the timer */
+    WRITE_REGISTER_ULONG(TIMER0_LOAD, ClockInterval);
+    WRITE_REGISTER_ULONG(TIMER0_CONTROL, ControlRegister.AsUlong);
+}
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalCalibratePerformanceCounter(IN volatile PLONG Count,
+                               IN ULONGLONG NewCount)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+HalSetTimeIncrement(IN ULONG Increment)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return Increment;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeStallExecutionProcessor(IN ULONG Microseconds)
+{
+    SP804_CONTROL_REGISTER ControlRegister;
+    
+    /* Enable the timer */
+    WRITE_REGISTER_ULONG(TIMER1_LOAD, Microseconds);
+    
+    /* Configure the timer */
+    ControlRegister.AsUlong = 0;
+    ControlRegister.OneShot = TRUE;
+    ControlRegister.Wide = TRUE;
+    ControlRegister.Periodic = TRUE;
+    ControlRegister.Enabled = TRUE;
+    WRITE_REGISTER_ULONG(TIMER1_CONTROL, ControlRegister.AsUlong);
+    
+    /* Now we will loop until the timer reached 0 */
+    while (READ_REGISTER_ULONG(TIMER1_VALUE));
+}
+
+/*
+ * @implemented
+ */
+LARGE_INTEGER
+NTAPI
+KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
+{
+    LARGE_INTEGER Value;
+
+    UNIMPLEMENTED;
+    while (TRUE);
+
+    Value.QuadPart = 0;
+    return Value;
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/generic/usage.c b/reactos/hal/halarm/generic/usage.c
new file mode 100644 (file)
index 0000000..248f383
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/generic/usage.c
+ * PURPOSE:         Resource Usage Management Routines
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
+PUCHAR KdComPortInUse;
+
+IDTUsageFlags HalpIDTUsageFlags[256];
+IDTUsage HalpIDTUsage[256];
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+NTAPI
+HalpReportResourceUsage(IN PUNICODE_STRING HalName,
+                        IN INTERFACE_TYPE InterfaceType)
+{
+    DbgPrint("%wZ has been initialized\n", HalName);
+}
+
+VOID
+NTAPI
+HalpRegisterVector(IN UCHAR Flags,
+                   IN ULONG BusVector,
+                   IN ULONG SystemVector,
+                   IN KIRQL Irql)
+{
+    /* Save the vector flags */
+    HalpIDTUsageFlags[SystemVector].Flags = Flags;
+
+    /* Save the vector data */
+    HalpIDTUsage[SystemVector].Irql  = Irql;
+    HalpIDTUsage[SystemVector].BusReleativeVector = BusVector;
+}
+
+VOID
+NTAPI
+HalpEnableInterruptHandler(IN UCHAR Flags,
+                           IN ULONG BusVector,
+                           IN ULONG SystemVector,
+                           IN KIRQL Irql,
+                           IN PVOID Handler,
+                           IN KINTERRUPT_MODE Mode)
+{
+    /* Register the routine */
+    ((PKIPCR)KeGetPcr())->InterruptRoutine[Irql] = Handler;
+}
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+/*
+ * @unimplemented
+ */
+VOID
+NTAPI
+HalReportResourceUsage(VOID)
+{
+    UNICODE_STRING HalString;
+
+    /* Build HAL usage */
+    RtlInitUnicodeString(&HalString, L"ARM Versatile HAL");
+    HalpReportResourceUsage(&HalString, Internal);
+}
+
+/* EOF */
diff --git a/reactos/hal/halarm/hal.rbuild b/reactos/hal/halarm/hal.rbuild
new file mode 100644 (file)
index 0000000..2a6086a
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
+<group xmlns:xi="http://www.w3.org/2001/XInclude">
+       <module name="hal" type="kernelmodedll" entrypoint="HalInitSystem@8" installbase="system32" installname="hal.dll">
+               <importlibrary base="hal" definition="../hal.pspec" />
+               <bootstrap installbase="$(CDOUTPUT)" />
+               <include>include</include>
+               <include base="ntoskrnl">include</include>
+               <define name="_NTHAL_" />
+               <library>hal_generic</library>
+               <library>ntoskrnl</library>
+
+               <directory name="versa">
+                       <file>halinit_up.c</file>
+                       <file>halup.rc</file>
+               </directory>
+       </module>
+</group>
diff --git a/reactos/hal/halarm/hal_generic.rbuild b/reactos/hal/halarm/hal_generic.rbuild
new file mode 100644 (file)
index 0000000..b861907
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
+<group>
+       <module name="hal_generic" type="objectlibrary">
+               <include>include</include>
+               <include base="ntoskrnl">include</include>
+               <define name="_NTHAL_" />
+               <directory name="generic">
+                       <file>beep.c</file>
+                       <file>bus.c</file>
+                       <file>cache.S</file>
+                       <file>dma.c</file>
+                       <file>drive.c</file>
+                       <file>display.c</file>
+                       <file>fmutex.c</file>
+                       <file>halinit.c</file>
+                       <file>misc.c</file>
+                       <file>pic.c</file>
+                       <file>portio.c</file>
+                       <file>processor.c</file>
+                       <file>profil.c</file>
+                       <file>reboot.c</file>
+                       <file>rtc.c</file>
+                       <file>spinlock.c</file>
+                       <file>sysinfo.c</file>
+                       <file>timer.c</file>
+                       <file>usage.c</file>
+               </directory>
+               <directory name="include">
+                       <pch>hal.h</pch>
+               </directory>
+       </module>
+</group>
index f2c8c2e..e6ae706 100644 (file)
@@ -9,6 +9,7 @@
 /* INCLUDES ******************************************************************/
 
 /* C Headers */
+#define DbgPrint DbgPrintEarly
 #include <stdio.h>
 
 /* WDK HAL Compilation hack */
@@ -22,6 +23,7 @@
 
 /* IFS/DDK/NDK Headers */
 #include <ntifs.h>
+#include <ioaccess.h>
 #include <bugcodes.h>
 #include <ntdddisk.h>
 #include <arc/arc.h>
@@ -29,6 +31,7 @@
 #include <kefuncs.h>
 #include <intrin.h>
 #include <halfuncs.h>
+#include <inbvfuncs.h>
 #include <iofuncs.h>
 #include <ldrtypes.h>
 #include <obfuncs.h>
index 98507b4..8a14dd3 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INTERNAL_HAL_HAL_H
-#define __INTERNAL_HAL_HAL_H
+#pragma once
 
 //
 // ARM Headers
 #include <peripherals/pl190.h>
 #include <peripherals/sp804.h>
 
-#endif /* __INTERNAL_HAL_HAL_H */
+#define PRIMARY_VECTOR_BASE     0x00
+
+/* Usage flags */
+#define IDT_REGISTERED          0x01
+#define IDT_LATCHED             0x02
+#define IDT_INTERNAL            0x11
+#define IDT_DEVICE              0x21
+
+typedef struct _IDTUsageFlags
+{
+    UCHAR Flags;
+} IDTUsageFlags;
+
+typedef struct
+{
+    KIRQL Irql;
+    UCHAR BusReleativeVector;
+} IDTUsage;
+
+VOID
+NTAPI
+HalpRegisterVector(IN UCHAR Flags,
+                   IN ULONG BusVector,
+                   IN ULONG SystemVector,
+                   IN KIRQL Irql);
+
+VOID
+NTAPI
+HalpEnableInterruptHandler(IN UCHAR Flags,
+                           IN ULONG BusVector,
+                           IN ULONG SystemVector,
+                           IN KIRQL Irql,
+                           IN PVOID Handler,
+                           IN KINTERRUPT_MODE Mode);
+
+VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock);
+VOID HalpInitPhase1(VOID);
+
+VOID HalpInitializeInterrupts(VOID);
+VOID HalpInitializeClock(VOID);
+VOID HalpClockInterrupt(VOID);
+VOID HalpProfileInterrupt(VOID);
+
+extern ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount;
diff --git a/reactos/hal/halarm/up/halinit_up.c b/reactos/hal/halarm/up/halinit_up.c
deleted file mode 100644 (file)
index cbb18bc..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $Id: halinit_up.c 24964 2006-11-29 08:28:20Z ion $
- *
- * COPYRIGHT:     See COPYING in the top level directory
- * PROJECT:       ReactOS kernel
- * FILE:          ntoskrnl/hal/x86/halinit.c
- * PURPOSE:       Initalize the x86 hal
- * PROGRAMMER:    David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- *              11/06/98: Created
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <hal.h>
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ***************************************************************/
-
-VOID
-HalpInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
-{
-
-}
-
-VOID
-HalpInitPhase1(VOID)
-{
-
-}
-
-/* EOF */
diff --git a/reactos/hal/halarm/versa/halinit_up.c b/reactos/hal/halarm/versa/halinit_up.c
new file mode 100644 (file)
index 0000000..0b96939
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * PROJECT:         ReactOS HAL
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            hal/halarm/versa/halinit_up.c
+ * PURPOSE:         Versatile Board-Specific HAL Initialization
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+HalpInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+
+}
+
+VOID
+HalpInitPhase1(VOID)
+{
+
+}
+
+/* EOF */
similarity index 59%
rename from reactos/hal/halarm/up/halup.rbuild
rename to reactos/hal/halarm/versa/halup.rbuild
index b443905..ac59afe 100644 (file)
@@ -1,13 +1,16 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <module name="hal" type="kernelmodedll" entrypoint="HalInitSystem" installbase="system32" installname="hal.dll">
-       <importlibrary base="hal" definition="../../hal.pspec" />
+       <importlibrary base="hal" definition="../hal.pspec" />
        <bootstrap installbase="$(CDOUTPUT)" nameoncd="hal.dll" />
-       <include base="halarm_generic">../include</include>
+       <include base="hal">include</include>
        <include base="ntoskrnl">include</include>
        <define name="_NTHAL_" />
-       <library>halarm_generic</library>
+       <library>hal_generic</library>
        <library>ntoskrnl</library>
-       <file>halinit_up.c</file>
-       <file>halup.rc</file>
+       <library>kdcom</library>
+       <directory name="versa">
+               <file>halinit_up.c</file>
+               <file>halup.rc</file>
+       </directory>
 </module>
index 8ec41f4..134ca7a 100644 (file)
@@ -39,7 +39,7 @@ ExAcquireFastMutex(PFAST_MUTEX FastMutex)
     {
         /* Someone is still holding it, use slow path */
         FastMutex->Contention++;
-        KeWaitForSingleObject(&FastMutex->Gate,
+        KeWaitForSingleObject(&FastMutex->Event,
                               WrExecutive,
                               KernelMode,
                               FALSE,
@@ -65,7 +65,7 @@ ExReleaseFastMutex(PFAST_MUTEX FastMutex)
     if (InterlockedIncrement(&FastMutex->Count) <= 0)
     {
         /* Someone was waiting for it, signal the waiter */
-        KeSetEventBoostPriority(&FastMutex->Gate, IO_NO_INCREMENT);
+        KeSetEventBoostPriority(&FastMutex->Event, IO_NO_INCREMENT);
     }
 
     /* Lower IRQL back */
index 92497b8..ee0089b 100644 (file)
@@ -2,8 +2,7 @@
  *
  */
 
-#ifndef __INTERNAL_HAL_APIC_H
-#define __INTERNAL_HAL_APIC_H
+#pragma once
 
 #define APIC_DEFAULT_BASE     0xFEE00000    /* Default Local APIC Base Register Address */
 
@@ -206,9 +205,4 @@ static __inline ULONG ThisCPU(VOID)
     return (APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
 }
 
-
-#endif
-
-
 /* EOF */
-
index 2c82d3e..e13c5ac 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INTERNAL_HAL_BUS_H
-#define __INTERNAL_HAL_BUS_H
+#pragma once
 
 //
 // Helper Macros
@@ -289,8 +288,4 @@ extern BOOLEAN HalpPCIConfigInitialized;
 extern BUS_HANDLER HalpFakePciBusHandler;
 extern ULONG HalpMinPciBus, HalpMaxPciBus;
 
-#endif /* __INTERNAL_HAL_BUS_H */
-
 /* EOF */
-
-
index 1770770..2da2c1f 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef HALDMA_H
-#define HALDMA_H
+#pragma once
 
 /*
  * DMA Page Register Structure
@@ -379,5 +378,3 @@ HalpGetDmaAdapter(
 ULONG NTAPI
 HalpDmaGetDmaAlignment(
    PADAPTER_OBJECT AdapterObject);
-
-#endif /* HALDMA_H */
index 5421415..c3cc625 100644 (file)
@@ -2,8 +2,7 @@
  * $Id: halirq.h 23669 2006-08-23 16:58:43Z ion $
  */
 
-#ifndef __INCLUDE_HAL_HALIRQ
-#define __INCLUDE_HAL_HALIRQ
+#pragma once
 
 #ifdef CONFIG_SMP
 
@@ -31,5 +30,3 @@
 #define IRQ2VECTOR(irq)                ((irq) + IRQ_BASE)
 
 #endif
-
-#endif /* __INCLUDE_HAL_HALIRQ */
index e88eec6..0b21d70 100644 (file)
@@ -2,8 +2,7 @@
  *
  */
 
-#ifndef __INTERNAL_HAL_HAL_H
-#define __INTERNAL_HAL_HAL_H
+#pragma once
 
 /* Temporary hack */
 #define KPCR_BASE   0xFF000000
@@ -125,5 +124,3 @@ typedef struct tagHALP_HOOKS
 
 extern HALP_HOOKS HalpHooks;
 extern KSPIN_LOCK HalpSystemHardwareLock;
-
-#endif /* __INTERNAL_HAL_HAL_H */
index bcdd7fe..7f4ab43 100644 (file)
@@ -2,8 +2,7 @@
  *
  */
 
-#ifndef __INTERNAL_HAL_IOAPIC_H
-#define __INTERNAL_HAL_IOAPIC_H
+#pragma once
 
 /* I/O APIC Register Address Map */
 #define IOAPIC_IOREGSEL 0x0000  /* I/O Register Select (index) (R/W) */
@@ -95,9 +94,4 @@ VOID HaliReconfigurePciInterrupts(VOID);
 /* For debugging */
 VOID IOAPICDump(VOID);
 
-#endif
-
-
-
 /* EOF */
-
index 83f9cfb..ba76695 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INCLUDE_HAL_MPS
-#define __INCLUDE_HAL_MPS
+#pragma once
 
 /* 
  * FIXME: This does not work if we have more than 24 IRQs (ie. more than one 
@@ -198,7 +197,4 @@ typedef struct _MP_CONFIGURATION_INTLOCAL
 
 VOID HalpInitMPS(VOID);
 
-
-#endif /* __INCLUDE_HAL_MPS */
-
 /* EOF */
index e10afdc..81a989f 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE group SYSTEM "../tools/rbuild/project.dtd">
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
 <group xmlns:xi="http://www.w3.org/2001/XInclude">
 
        <xi:include href="hal_generic.rbuild" />
index 206ca2d..5bffb2d 100644 (file)
@@ -12,6 +12,9 @@
 #include <hal.h>
 #define NDEBUG
 #include <debug.h>
+#include <setjmp.h>
+
+void HalpTrap0D();
 
 /* GLOBALS ********************************************************************/
 
@@ -47,24 +50,9 @@ ULONG_PTR HalpSavedEsp;
 /* Where the real mode code ends */
 extern PVOID HalpRealModeEnd;
 
-/* REAL MODE CODE AND STACK START HERE ****************************************/
-
-VOID
-DECLSPEC_NORETURN
-HalpRealModeStart(VOID)
-{
-    /* Do the video BIOS interrupt */
-    HalpCallBiosInterrupt(VIDEO_SERVICES, (SET_VIDEO_MODE << 8) | (GRAPHICS_MODE_12));
-    
-    /* Issue the BOP */
-    KiIssueBop();
-    
-    /* We want the stack to be inside this function so we can map real mode */
-    HalpRealModeStack(sizeof(ULONG), PAGE_SIZE / 2);
-    UNREACHABLE;
-}
+/* Context saved for return from v86 mode */
+jmp_buf HalpSavedContext;
 
-/* REAL MODE CODE AND STACK END HERE ******************************************/
 
 /* V86 OPCODE HANDLERS ********************************************************/
 
@@ -208,6 +196,7 @@ HalpDispatchV86Opcode(IN PKTRAP_FRAME TrapFrame)
 
 /* V86 TRAP HANDLERS **********************************************************/
 
+#ifndef _MINIHAL_
 VOID
 FASTCALL
 DECLSPEC_NORETURN
@@ -230,60 +219,45 @@ HalpTrap0DHandler(IN PKTRAP_FRAME TrapFrame)
     while (TRUE);
 }
 
-KiTrap(HalpTrap0D, 0);
-
 VOID
 DECLSPEC_NORETURN
-HalpTrap06(VOID)
+HalpTrap06()
 {
-    PKTRAP_FRAME TrapFrame;
-    
     /* Restore ES/DS to known good values first */
     Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
     Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
-    
-    /* Read trap frame address */
-    TrapFrame = (PKTRAP_FRAME)HalpSavedEsp;
-    
-    /* Restore segments from the trap frame */
-    Ke386SetGs(TrapFrame->SegGs);
-    Ke386SetFs(TrapFrame->SegFs);
-    Ke386SetEs(TrapFrame->SegEs);
-    Ke386SetDs(TrapFrame->SegDs);
-    
-    /* Restore EFlags */
-    __writeeflags(TrapFrame->EFlags);
-    
-    /* Exit the V86 mode trap frame */
-    KiCallReturn(TrapFrame);
+    Ke386SetFs(KGDT_R0_PCR);
+
+    /* Restore the stack */ 
+    KeGetPcr()->TSS->Esp0 = HalpSavedEsp0;
+
+    /* Return back to where we left */
+    longjmp(HalpSavedContext, 1);
+    UNREACHABLE;
 }
 
 /* V8086 ENTER ****************************************************************/
 
 VOID
-FASTCALL
-DECLSPEC_NORETURN
-HalpBiosCallHandler(IN PKTRAP_FRAME TrapFrame)
+NTAPI
+HalpBiosCall()
 {
     /* Must be volatile so it doesn't get optimized away! */
     volatile KTRAP_FRAME V86TrapFrame;
     ULONG_PTR StackOffset, CodeOffset;
     
-    /* Fill out the quick-n-dirty trap frame */
-    TrapFrame->EFlags = __readeflags();
-    TrapFrame->SegGs = Ke386GetGs();
-    TrapFrame->SegFs = Ke386GetFs();
-    TrapFrame->SegEs = Ke386GetEs();
-    TrapFrame->SegDs = Ke386GetDs();
-    
-    /* Our stack (the frame) */
-    HalpSavedEsp = (ULONG_PTR)TrapFrame;
+    /* Save the context, check for return */
+    if (_setjmp(HalpSavedContext))
+    {
+        /* Returned from v86 */
+        return;
+    }
     
     /* Kill alignment faults */
     __writecr0(__readcr0() & ~CR0_AM);
     
     /* Set new stack address */
-    KeGetPcr()->TSS->Esp0 = HalpSavedEsp - sizeof(FX_SAVE_AREA);
+    KeGetPcr()->TSS->Esp0 = (ULONG)&V86TrapFrame - 0x20 - sizeof(FX_SAVE_AREA);
 
     /* Compute segmented IP and SP offsets */
     StackOffset = (ULONG_PTR)&HalpRealModeEnd - 4 - (ULONG_PTR)HalpRealModeStart;
@@ -301,10 +275,9 @@ HalpBiosCallHandler(IN PKTRAP_FRAME TrapFrame)
     V86TrapFrame.Eip = CodeOffset;
     
     /* Exit to V86 mode */
-    KiDirectTrapReturn((PKTRAP_FRAME)&V86TrapFrame);
+    HalpExitToV86((PKTRAP_FRAME)&V86TrapFrame);
 }
-
-KiTrampoline(HalpBiosCall, KI_PUSH_FAKE_ERROR_CODE | KI_NONVOLATILES_ONLY);
+#endif
 
 /* FUNCTIONS ******************************************************************/
 
@@ -459,6 +432,7 @@ HalpRestoreIopm(VOID)
     while (i--) HalpSavedIoMap[HalpSavedIoMapData[i][0]] = HalpSavedIoMapData[i][1];
 }
 
+#ifndef _MINIHAL_
 VOID
 NTAPI
 HalpMapRealModeMemory(VOID)
@@ -546,6 +520,7 @@ HalpSwitchToRealModeTrapHandlers(VOID)
     //
     KeRegisterInterruptHandler(6, HalpTrap06);
 }
+#endif
 
 VOID
 NTAPI
@@ -655,6 +630,7 @@ HalpUnmapRealModeMemory(VOID)
     HalpFlushTLB();
 }
 
+#ifndef _MINIHAL_
 BOOLEAN
 NTAPI
 HalpBiosDisplayReset(VOID)
@@ -724,5 +700,6 @@ HalpBiosDisplayReset(VOID)
     __writeeflags(Flags);
     return TRUE;
 }
+#endif
 
 /* EOF */
index 8421b77..d8e478f 100644 (file)
@@ -27,8 +27,10 @@ HalpRegisterKdSupportFunctions(VOID)
     KdReleasePciDeviceforDebugging = HalpReleasePciDeviceForDebugging;
 
     /* Register memory functions */
+#ifndef _MINIHAL_
     KdMapPhysicalMemory64 = HalpMapPhysicalMemory64;
     KdUnmapVirtualAddress = HalpUnmapVirtualAddress;
+#endif
 
     /* Register ACPI stub */
     KdCheckPowerButton = HalpCheckPowerButton;
index a09f8bb..50f1add 100644 (file)
@@ -614,7 +614,7 @@ HalpAssignPCISlotResources(IN PBUS_HANDLER BusHandler,
     {
         if (0 != PciConfig.u.type0.BaseAddresses[Address])
         {
-            if (/*PCI_BASE_ADDRESS_SPACE_MEMORY*/ 0 ==
+            if (PCI_ADDRESS_MEMORY_SPACE ==
                 (PciConfig.u.type0.BaseAddresses[Address] & 0x1))
             {
                 Descriptor->Type = CmResourceTypeMemory;
@@ -702,6 +702,7 @@ PPCI_REGISTRY_INFO_INTERNAL
 NTAPI
 HalpQueryPciRegistryInfo(VOID)
 {
+#ifndef _MINIHAL_
     WCHAR NameBuffer[8];
     OBJECT_ATTRIBUTES  ObjectAttributes;
     UNICODE_STRING KeyName, ConfigName, IdentName;
@@ -924,6 +925,9 @@ HalpQueryPciRegistryInfo(VOID)
 
     /* Return it */
     return PciRegistryInfo;
+#else
+    return NULL;
+#endif
 }
 
 VOID
index 947128b..83ccece 100644 (file)
@@ -14,6 +14,7 @@
 
 /* GLOBALS *******************************************************************/
 
+#ifndef _MINIHAL_
 CHAR ClassTable[3922] =
 {
     0x43, 0x20, 0x30, 0x30, 0x20, 0x20, 0x55, 0x6E, 0x63, 0x6C, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 
@@ -40415,3 +40416,4 @@ CHAR VendorTable[642355] =
     0x20, 0x49, 0x6C, 0x6C, 0x65, 0x67, 0x61, 0x6C, 0x20, 0x56, 0x65, 0x6E, 0x64, 0x6F, 0x72, 0x20, 
     0x49, 0x44, 0x00, 
 };
+#endif
index 449ddc2..dc5f821 100644 (file)
@@ -31,8 +31,10 @@ VOID
 NTAPI
 HalDisplayString(IN PCH String)
 {
+#ifndef _MINIHAL_
     /* Call the Inbv driver */
     InbvDisplayString(String);
+#endif
 }
 
 /*
index 0b7b7f3..bdfae48 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
+#ifndef _MINIHAL_
 static KEVENT HalpDmaLock;
 static LIST_ENTRY HalpDmaAdapterList;
 static PADAPTER_OBJECT HalpEisaAdapter[8];
+#endif
 static BOOLEAN HalpEisaDma;
+#ifndef _MINIHAL_
 static PADAPTER_OBJECT HalpMasterAdapter;
+#endif
 
 static const ULONG_PTR HalpEisaPortPage[8] = {
    FIELD_OFFSET(DMA_PAGE, Channel0),
@@ -92,6 +96,7 @@ static const ULONG_PTR HalpEisaPortPage[8] = {
    FIELD_OFFSET(DMA_PAGE, Channel7)
 };
 
+#ifndef _MINIHAL_
 static DMA_OPERATIONS HalpDmaOperations = {
    sizeof(DMA_OPERATIONS),
    (PPUT_DMA_ADAPTER)HalPutDmaAdapter,
@@ -111,6 +116,7 @@ static DMA_OPERATIONS HalpDmaOperations = {
    NULL /*(PBUILD_SCATTER_GATHER_LIST)HalBuildScatterGatherList*/,
    NULL /*(PBUILD_MDL_FROM_SCATTER_GATHER_LIST)HalBuildMdlFromScatterGatherList*/
 };
+#endif
 
 #define MAX_MAP_REGISTERS 64
 
@@ -118,6 +124,7 @@ static DMA_OPERATIONS HalpDmaOperations = {
 
 /* FUNCTIONS *****************************************************************/
 
+#ifndef _MINIHAL_
 VOID
 HalpInitDma(VOID)
 {
@@ -154,6 +161,7 @@ HalpInitDma(VOID)
      */
     HalGetDmaAdapter = HalpGetDmaAdapter;
 }
+#endif
 
 /**
  * @name HalpGetAdapterMaximumPhysicalAddress
@@ -185,6 +193,7 @@ HalpGetAdapterMaximumPhysicalAddress(IN PADAPTER_OBJECT AdapterObject)
     return HighestAddress;
 }
 
+#ifndef _MINIHAL_
 /**
  * @name HalpGrowMapBuffers
  *
@@ -428,6 +437,7 @@ HalpDmaAllocateChildAdapter(IN ULONG NumberOfMapRegisters,
 
     return AdapterObject;
 }
+#endif
 
 /**
  * @name HalpDmaInitializeEisaAdapter
@@ -564,6 +574,7 @@ HalpDmaInitializeEisaAdapter(IN PADAPTER_OBJECT AdapterObject,
     return TRUE;
 }
 
+#ifndef _MINIHAL_
 /**
  * @name HalGetAdapter
  *
@@ -896,6 +907,7 @@ HalFreeCommonBuffer(IN PADAPTER_OBJECT AdapterObject,
                                        Length,
                                        CacheEnabled ? MmCached : MmNonCached);
 }
+#endif
 
 /**
  * @name HalpDmaGetDmaAlignment
@@ -984,6 +996,7 @@ HalReadDmaCounter(IN PADAPTER_OBJECT AdapterObject)
     return Count;
 }
 
+#ifndef _MINIHAL_
 /**
  * @name HalpGrowMapBufferWorker
  *
@@ -1893,6 +1906,7 @@ IoMapTransfer(IN PADAPTER_OBJECT AdapterObject,
      */
      return PhysicalAddress;
 }
+#endif
 
 /**
  * @name HalFlushCommonBuffer
index 1fb157f..498bf5c 100644 (file)
@@ -91,8 +91,10 @@ HalInitSystem(IN ULONG BootPhase,
             KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0);
         }
 
+#ifndef _MINIHAL_
         /* Initialize the PICs */
         HalpInitializePICs(TRUE);
+#endif
 
         /* Force initial PIC state */
         KfRaiseIrql(KeGetCurrentIrql());
@@ -107,9 +109,17 @@ HalInitSystem(IN ULONG BootPhase,
         HalQuerySystemInformation = HaliQuerySystemInformation;
         HalSetSystemInformation = HaliSetSystemInformation;
         HalInitPnpDriver = NULL; // FIXME: TODO
+#ifndef _MINIHAL_
         HalGetDmaAdapter = HalpGetDmaAdapter;
+#else
+        HalGetDmaAdapter = NULL;
+#endif
         HalGetInterruptTranslator = NULL;  // FIXME: TODO
+#ifndef _MINIHAL_
         HalResetDisplay = HalpBiosDisplayReset;
+#else
+        HalResetDisplay = NULL;
+#endif
         HalHaltSystem = HaliHaltSystem;
 
         /* Register IRQ 2 */
@@ -125,8 +135,10 @@ HalInitSystem(IN ULONG BootPhase,
         /* Setup busy waiting */
         HalpCalibrateStallExecution();
 
+#ifndef _MINIHAL_
         /* Initialize the clock */
         HalpInitializeClock();
+#endif
 
         /*
          * We could be rebooting with a pending profile interrupt,
@@ -142,6 +154,7 @@ HalInitSystem(IN ULONG BootPhase,
         /* Initialize bus handlers */
         HalpInitBusHandler();
 
+#ifndef _MINIHAL_
         /* Enable IRQ 0 */
         HalpEnableInterruptHandler(IDT_DEVICE,
                                    0,
@@ -160,6 +173,7 @@ HalInitSystem(IN ULONG BootPhase,
 
         /* Initialize DMA. NT does this in Phase 0 */
         HalpInitDma();
+#endif
 
         /* Do some HAL-specific initialization */
         HalpInitPhase1();
index 4f103ee..60684bf 100644 (file)
@@ -28,6 +28,7 @@ HalpCheckPowerButton(VOID)
     return;
 }
 
+#ifndef _MINIHAL_
 PVOID
 NTAPI
 HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress,
@@ -51,6 +52,7 @@ HalpUnmapVirtualAddress(IN PVOID VirtualAddress,
     //
     MmUnmapIoSpace(VirtualAddress, NumberPages << PAGE_SHIFT);
 }
+#endif
 
 VOID
 NTAPI
@@ -143,6 +145,7 @@ VOID
 NTAPI
 HalHandleNMI(IN PVOID NmiInfo)
 {
+#ifndef _MINIHAL_
     SYSTEM_CONTROL_PORT_B_REGISTER SystemControl;
 
     //
@@ -223,6 +226,7 @@ HalHandleNMI(IN PVOID NmiInfo)
     // Halt the system
     //
     InbvDisplayString("\n*** The system has halted ***\n");
+#endif
 
     //
     // Enter the debugger if possible
index 17adf0a..a710d86 100644 (file)
@@ -14,6 +14,7 @@
 
 /* GLOBALS ********************************************************************/
 
+#ifndef _MINIHAL_
 /*
  * This table basically keeps track of level vs edge triggered interrupts.
  * Windows has 250+ entries, but it seems stupid to replicate that since the PIC
@@ -1335,4 +1336,28 @@ HalpDispatchInterrupt2(VOID)
     }
 }
 
-KiTrap(HalpApcInterrupt,       KI_SOFTWARE_TRAP);
+#else
+
+KIRQL
+NTAPI
+KeGetCurrentIrql(VOID)
+{
+    return PASSIVE_LEVEL;
+}
+
+VOID
+FASTCALL
+KfLowerIrql(
+    IN KIRQL OldIrql)
+{
+}
+
+KIRQL
+FASTCALL
+KfRaiseIrql(
+    IN KIRQL NewIrql)
+{
+    return NewIrql;
+}
+
+#endif
index e6a5cff..c7eda5e 100644 (file)
@@ -98,8 +98,10 @@ HalReturnToFirmware(IN FIRMWARE_REENTRY Action)
         case HalHaltRoutine:
         case HalRebootRoutine:
 
+#ifndef _MINIHAL_
             /* Acquire the display */
             InbvAcquireDisplayOwnership();
+#endif
 
             /* Call the internal reboot function */
             HalpReboot();
index db12f00..d3a72c5 100644 (file)
@@ -49,6 +49,12 @@ HaliQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass,
                REPORT_THIS_CASE(HalPartitionIpiInterface);
                REPORT_THIS_CASE(HalPlatformInformation);
                REPORT_THIS_CASE(HalQueryProfileSourceList);
+               REPORT_THIS_CASE(HalInitLogInformation);
+               REPORT_THIS_CASE(HalFrequencyInformation);
+               REPORT_THIS_CASE(HalProcessorBrandString);
+               REPORT_THIS_CASE(HalHypervisorInformation);
+               REPORT_THIS_CASE(HalPlatformTimerInformation);
+               REPORT_THIS_CASE(HalAcpiAuditInformation);
        }
 #undef REPORT_THIS_CASE
 
index 2ed8c5b..524b6ce 100644 (file)
@@ -110,6 +110,7 @@ HalpInitializeClock(VOID)
 }
 
 #ifdef _M_IX86
+#ifndef _MINIHAL_
 VOID
 FASTCALL
 HalpClockInterruptHandler(IN PKTRAP_FRAME TrapFrame)
@@ -161,9 +162,8 @@ HalpProfileInterruptHandler(IN PKTRAP_FRAME TrapFrame)
     /* Spurious, just end the interrupt */
     KiEoiHelper(TrapFrame);
 }
+#endif
 
-KiTrap(HalpClockInterrupt,   KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE);
 #endif
 
 /* PUBLIC FUNCTIONS ***********************************************************/
diff --git a/reactos/hal/halx86/generic/trap.S b/reactos/hal/halx86/generic/trap.S
new file mode 100644 (file)
index 0000000..2ad319b
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * FILE:            ntoskrnl/ke/i386/trap.S
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PURPOSE:         System Traps, Entrypoints and Exitpoints
+ * PROGRAMMER:      Timo Kreuzer (timo.kreuzer@reactos.org)
+ * NOTE:            See asmmacro.S for the shared entry/exit code.
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <reactos/asm.h>
+#include <ndk/i386/asm.h>
+#include <internal/i386/asmmacro.S>
+
+.code32
+.text
+
+TRAP_ENTRY HalpTrap0D, 0
+TRAP_ENTRY HalpApcInterrupt, KI_SOFTWARE_TRAP
+TRAP_ENTRY HalpClockInterrupt, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE
+
+PUBLIC @HalpExitToV86@4
+@HalpExitToV86@4:
+    /* Point esp to the iret frame and return */
+    lea esp, [ecx + KTRAP_FRAME_EIP]
+    iret
+
+/* Here starts the real mode code */
+.code16
+PUBLIC _HalpRealModeStart
+_HalpRealModeStart:
+    /* INT 0x10: AH = 0 (Set video Mode), AL = 0x12 (Mode 12) */
+    mov eax, HEX(12)
+    int HEX(10)
+
+    /* BOP */
+    .byte HEX(C4), HEX(C4)
+
+/* The real mode stack */
+.align 4
+.space 2048
+_HalpRealModeEnd:
+PUBLIC _HalpRealModeEnd
+
index 3493113..d35a3e3 100644 (file)
@@ -63,6 +63,7 @@ HalpRegisterVector(IN UCHAR Flags,
     HalpIDTUsage[SystemVector].BusReleativeVector = BusVector;
 }
 
+#ifndef _MINIHAL_
 VOID
 NTAPI
 HalpEnableInterruptHandler(IN UCHAR Flags,
@@ -87,6 +88,7 @@ HalpEnableInterruptHandler(IN UCHAR Flags,
     /* Enable the interrupt */
     HalEnableSystemInterrupt(SystemVector, Irql, Mode);
 }
+#endif
 
 /*
  * @unimplemented
index e4f7ea6..2c672c2 100644 (file)
@@ -6,10 +6,12 @@
                <bootstrap installbase="$(CDOUTPUT)" />
                <include>include</include>
                <include base="ntoskrnl">include</include>
+               <define name="_NTHALDLL_" />
                <define name="_NTHAL_" />
                <library>hal_generic</library>
                <library>hal_generic_up</library>
                <library>ntoskrnl</library>
+               <library>libcntpr</library>
                <directory name="up">
                        <file>halinit_up.c</file>
                        <file>halup.rc</file>
index 9d92019..98cb36b 100644 (file)
@@ -1,9 +1,10 @@
 <?xml version="1.0"?>
-<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
 <group>
        <module name="hal_generic" type="objectlibrary">
                <include>include</include>
                <include base="ntoskrnl">include</include>
+               <define name="_NTHALDLL_" />
                <define name="_NTHAL_" />
                <directory name="generic">
                        <directory name="bus">
@@ -28,6 +29,7 @@
                                <file>halinit.c</file>
                                <file>misc.c</file>
                                <file>pic.c</file>
+                               <file>trap.S</file>
                                <file>usage.c</file>
                                <directory name="i386">
                                        <file>portio.c</file>
                        <pch>hal.h</pch>
                </directory>
        </module>
+       <module name="mini_hal" type="objectlibrary">
+               <include>include</include>
+               <include base="ntoskrnl">include</include>
+               <define name="_NTHALDLL_" />
+               <define name="_NTHAL_" />
+               <define name="_BLDR_" />
+               <define name="_MINIHAL_" />
+               <directory name="generic">
+                       <directory name="bus">
+                               <file>bushndlr.c</file>
+                               <file>isabus.c</file>
+                               <file>halbus.c</file>
+                               <file>pcibus.c</file>
+                               <file>pcidata.c</file>
+                               <file>sysbus.c</file>
+                       </directory>
+                       <file>beep.c</file>
+                       <file>bios.c</file>
+                       <file>cmos.c</file>
+                       <file>dma.c</file>
+                       <file>display.c</file>
+                       <file>drive.c</file>
+                       <file>misc.c</file>
+                       <file>pic.c</file>
+                       <file>portio.c</file>
+                       <file>processor.c</file>
+                       <file>profil.c</file>
+                       <file>reboot.c</file>
+                       <file>spinlock.c</file>
+                       <file>sysinfo.c</file>
+                       <file>systimer.S</file>
+                       <file>timer.c</file>
+                       <file>usage.c</file>
+               </directory>
+               <directory name="up">
+                       <file>halinit_up.c</file>
+               </directory>
+       </module>
 </group>
index 1a3593c..5063a04 100644 (file)
@@ -1,9 +1,10 @@
 <?xml version="1.0"?>
-<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
 <group>
        <module name="hal_generic_mp" type="objectlibrary">
                <include>include</include>
                <include base="ntoskrnl">include</include>
+               <define name="_NTHALDLL_" />
                <define name="_NTHAL_" />
                <define name="CONFIG_SMP" />
                <directory name="generic">
index b9c40a2..6338b1d 100644 (file)
@@ -1,9 +1,10 @@
 <?xml version="1.0"?>
-<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
 <group>
        <module name="hal_generic_up" type="objectlibrary">
                <include>include</include>
                <include base="ntoskrnl">include</include>
+               <define name="_NTHALDLL_" />
                <define name="_NTHAL_" />
                <directory name="generic">
                        <file>spinlock.c</file>
index 0d13b7c..abdd17b 100644 (file)
@@ -7,10 +7,12 @@
                <include>include</include>
                <include base="ntoskrnl">include</include>
                <define name="CONFIG_SMP" />
+               <define name="_NTHALDLL_" />
                <define name="_NTHAL_" />
                <library>hal_generic</library>
                <library>hal_generic_mp</library>
                <library>ntoskrnl</library>
+               <library>libcntpr</library>
                <directory name="mp">
                        <file>mpsirql.c</file>
                        <directory name="i386">
index 7996e65..cee7f61 100644 (file)
@@ -5,11 +5,13 @@
                <importlibrary base="hal" definition="../hal.pspec" />
                <include>include</include>
                <include base="ntoskrnl">include</include>
+               <define name="_NTHALDLL_" />
                <define name="_NTHAL_" />
                <define name="SARCH_XBOX" />
                <library>hal_generic</library>
                <library>hal_generic_up</library>
                <library>ntoskrnl</library>
+               <library>libcntpr</library>
                <directory name="xbox">
                        <file>halinit_xbox.c</file>
                        <file>part_xbox.c</file>
index 1625e9d..315af0a 100644 (file)
@@ -2,8 +2,7 @@
  *
  */
 
-#ifndef __INTERNAL_HAL_APIC_H
-#define __INTERNAL_HAL_APIC_H
+#pragma once
 
 #ifdef _M_AMD64
 #define APIC_DEFAULT_BASE     0xfffffffffee00000ULL;
@@ -251,6 +250,4 @@ static __inline VOID APICSendEOI(VOID)
     APICWrite(APIC_EOI, 0);
 }
 
-#endif /* __INTERNAL_HAL_APIC_H */
-
 /* EOF */
index 295bc5d..3e07190 100644 (file)
@@ -1,5 +1,6 @@
-#ifndef __INTERNAL_HAL_BUS_H
-#define __INTERNAL_HAL_BUS_H
+#pragma once
+
+#define PCI_ADDRESS_MEMORY_SPACE            0x00000000
 
 //
 // Helper Macros
@@ -363,8 +364,4 @@ extern BOOLEAN HalpPCIConfigInitialized;
 extern BUS_HANDLER HalpFakePciBusHandler;
 extern ULONG HalpMinPciBus, HalpMaxPciBus;
 
-#endif /* __INTERNAL_HAL_BUS_H */
-
 /* EOF */
-
-
index 2efb0a5..284d2c5 100644 (file)
 /* WDK HAL Compilation hack */
 #include <excpt.h>
 #include <ntdef.h>
-#undef _NTHAL_
-#undef DECLSPEC_IMPORT
-#define DECLSPEC_IMPORT
+#ifndef _MINIHAL_
 #undef NTSYSAPI
 #define NTSYSAPI __declspec(dllimport)
+#else
+#undef NTSYSAPI
+#define NTSYSAPI
+#endif
 
 /* IFS/DDK/NDK Headers */
 #include <ntifs.h>
index 1770770..2da2c1f 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef HALDMA_H
-#define HALDMA_H
+#pragma once
 
 /*
  * DMA Page Register Structure
@@ -379,5 +378,3 @@ HalpGetDmaAdapter(
 ULONG NTAPI
 HalpDmaGetDmaAlignment(
    PADAPTER_OBJECT AdapterObject);
-
-#endif /* HALDMA_H */
index baec1f8..63dec6e 100644 (file)
@@ -2,8 +2,7 @@
  * $Id$
  */
 
-#ifndef __INCLUDE_HAL_HALIRQ
-#define __INCLUDE_HAL_HALIRQ
+#pragma once
 
 #ifdef CONFIG_SMP
 
@@ -31,5 +30,3 @@
 #define IRQ2VECTOR(irq)                ((irq) + IRQ_BASE)
 
 #endif
-
-#endif /* __INCLUDE_HAL_HALIRQ */
index 726c8bb..2d487c9 100644 (file)
@@ -2,8 +2,7 @@
  *
  */
 
-#ifndef __INTERNAL_HAL_HAL_H
-#define __INTERNAL_HAL_HAL_H
+#pragma once
 
 typedef struct _HAL_BIOS_FRAME
 {
@@ -74,44 +73,6 @@ DECLSPEC_NORETURN
 //
 #define GRAPHICS_MODE_12 0x12           /* 80x30        8x16  640x480   16/256K */
 
-//
-// Generates a 16-bit (real-mode or Virtual 8086) BIOS interrupt with a given AX */
-//
-VOID
-FORCEINLINE
-HalpCallBiosInterrupt(IN ULONG Interrupt,
-                      IN ULONG Ax)
-{
-    __asm__ __volatile__
-    (
-        ".byte 0x66\n"
-        "movl $%c[v], %%eax\n"
-        "int $%c[i]\n"
-        :
-        : [v] "i"(Ax),
-          [i] "i"(Interrupt)
-    );
-}
-
-//
-// Constructs a stack of the given size and alignment in the real-mode .text region */
-//
-VOID
-FORCEINLINE
-HalpRealModeStack(IN ULONG Alignment,
-                  IN ULONG Size)
-{
-    __asm__ __volatile__
-    (
-        ".align %c[v]\n"
-        ".space %c[i]\n"
-        ".globl _HalpRealModeEnd\n_HalpRealModeEnd:\n"
-        :
-        : [v] "i"(Alignment),
-          [i] "i"(Size)
-    );
-}
-
 //
 // Commonly stated as being 1.19318MHz
 //
@@ -675,6 +636,18 @@ HalpBiosDisplayReset(
     VOID
 );
 
+VOID
+FASTCALL
+HalpExitToV86(
+    PKTRAP_FRAME TrapFrame
+);
+
+VOID
+DECLSPEC_NORETURN
+HalpRealModeStart(
+    VOID
+);
+
 //
 // Processor Halt Routine
 //
@@ -732,5 +705,3 @@ extern KSPIN_LOCK HalpSystemHardwareLock;
 extern PADDRESS_USAGE HalpAddressUsageList;
 
 extern LARGE_INTEGER HalpPerfCounter;
-
-#endif /* __INTERNAL_HAL_HAL_H */
index c038c2a..28225c5 100644 (file)
@@ -2,8 +2,7 @@
  *
  */
 
-#ifndef __INTERNAL_HAL_IOAPIC_H
-#define __INTERNAL_HAL_IOAPIC_H
+#pragma once
 
 /* I/O APIC Register Address Map */
 #define IOAPIC_IOREGSEL 0x0000  /* I/O Register Select (index) (R/W) */
@@ -95,9 +94,4 @@ VOID HaliReconfigurePciInterrupts(VOID);
 /* For debugging */
 VOID IOAPICDump(VOID);
 
-#endif
-
-
-
 /* EOF */
-
index 83f9cfb..ba76695 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INCLUDE_HAL_MPS
-#define __INCLUDE_HAL_MPS
+#pragma once
 
 /* 
  * FIXME: This does not work if we have more than 24 IRQs (ie. more than one 
@@ -198,7 +197,4 @@ typedef struct _MP_CONFIGURATION_INTLOCAL
 
 VOID HalpInitMPS(VOID);
 
-
-#endif /* __INCLUDE_HAL_MPS */
-
 /* EOF */
index 2257c18..4c6cff7 100644 (file)
@@ -1074,4 +1074,25 @@ HaliStartApplicationProcessor(ULONG Cpu, ULONG Stack)
 
 #endif
 
+VOID
+FASTCALL
+DECLSPEC_NORETURN
+HalpApcInterruptHandler(IN PKTRAP_FRAME TrapFrame)
+{
+    /* Set up a fake INT Stack */
+    TrapFrame->EFlags = __readeflags();
+    TrapFrame->SegCs = KGDT_R0_CODE;
+    TrapFrame->Eip = TrapFrame->Eax;
+    
+    /* Build the trap frame */
+    KiEnterInterruptTrap(TrapFrame);
+    
+    /* unimplemented */
+    UNIMPLEMENTED;
+    
+    /* Exit the interrupt */
+    KiEoiHelper(TrapFrame); 
+
+}
+
 /* EOF */
index 684fb98..d5b9d37 100644 (file)
 /* TODO: Mark (almost) all CRT functions as __MINGW_NOTHROW.  This will
 allow GCC to optimize away some EH unwind code, at least in DW2 case.  */
 
+#ifndef __MINGW_EXTENSION
+#if defined(__GNUC__) || defined(__GNUG__)
+#define __MINGW_EXTENSION       __extension__
+#else
+#define __MINGW_EXTENSION
+#endif
+#endif
+
 #ifndef __MSVCRT_VERSION__
 /*  High byte is the major version, low byte is the minor. */
 # define __MSVCRT_VERSION__ 0x0700
index c941eae..8ff8d0d 100644 (file)
@@ -245,7 +245,7 @@ extern "C" {
 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
   typedef unsigned int size_t __attribute__ ((mode (DI)));
 #else
-  typedef unsigned __int64 size_t;
+  __MINGW_EXTENSION typedef unsigned __int64 size_t;
 #endif
 #else
   typedef unsigned int size_t;
@@ -261,7 +261,7 @@ extern "C" {
 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
   typedef int intptr_t __attribute__ ((mode (DI)));
 #else
-  typedef __int64 intptr_t;
+  __MINGW_EXTENSION typedef __int64 intptr_t;
 #endif
 #else
   typedef int intptr_t;
@@ -278,7 +278,7 @@ extern "C" {
 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
   typedef unsigned int uintptr_t __attribute__ ((mode (DI)));
 #else
-  typedef unsigned __int64 uintptr_t;
+  __MINGW_EXTENSION typedef unsigned __int64 uintptr_t;
 #endif
 #else
   typedef unsigned int uintptr_t;
@@ -294,7 +294,7 @@ extern "C" {
 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
   typedef int ptrdiff_t __attribute__ ((mode (DI)));
 #else
-  typedef __int64 ptrdiff_t;
+  __MINGW_EXTENSION typedef __int64 ptrdiff_t;
 #endif
 #else
   typedef int ptrdiff_t;
@@ -329,7 +329,7 @@ extern "C" {
 #ifndef _TIME64_T_DEFINED
 #define _TIME64_T_DEFINED
 #if _INTEGRAL_MAX_BITS >= 64
-  typedef __int64 __time64_t;
+  __MINGW_EXTENSION typedef __int64 __time64_t;
 #endif
 #endif
 
index 8a7badb..d0d3ef0 100644 (file)
@@ -34,7 +34,7 @@ typedef enum _EXCEPTION_DISPOSITION
   struct _CONTEXT;
   struct _DISPATCHER_CONTEXT;
 
-  _CRTIMP EXCEPTION_DISPOSITION __cdecl __C_specific_handler (struct _EXCEPTION_RECORD *_ExceptionRecord,unsigned __int64 _MemoryStackFp,unsigned __int64 _BackingStoreFp,struct _CONTEXT *_ContextRecord,struct _DISPATCHER_CONTEXT *_DispatcherContext,unsigned __int64 _GlobalPointer);
+  __MINGW_EXTENSION _CRTIMP EXCEPTION_DISPOSITION __cdecl __C_specific_handler (struct _EXCEPTION_RECORD *_ExceptionRecord,unsigned __int64 _MemoryStackFp,unsigned __int64 _BackingStoreFp,struct _CONTEXT *_ContextRecord,struct _DISPATCHER_CONTEXT *_DispatcherContext,unsigned __int64 _GlobalPointer);
 #elif defined(__x86_64)
 
   struct _EXCEPTION_RECORD;
index 74afa77..3fd5d53 100644 (file)
@@ -49,7 +49,7 @@ extern "C" {
   typedef int _I32;
   typedef unsigned short _U16;
   typedef unsigned int _U32;
-  typedef __int64 _Q64;
+  __MINGW_EXTENSION typedef __int64 _Q64;
 
   typedef struct
 #if defined(__ia64__)
index 2eaae8f..4a3f37d 100644 (file)
@@ -51,7 +51,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int);
     time_t time_create;
     time_t time_access;
     time_t time_write;
-    __int64 size;
+    __MINGW_EXTENSION __int64 size;
     char name[260];
   };
 
@@ -60,7 +60,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int);
     __time32_t time_create;
     __time32_t time_access;
     __time32_t time_write;
-    __int64 size;
+    __MINGW_EXTENSION __int64 size;
     char name[260];
   };
 
@@ -78,7 +78,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int);
     __time64_t time_create;
     __time64_t time_access;
     __time64_t time_write;
-    __int64 size;
+    __MINGW_EXTENSION __int64 size;
     char name[260];
   };
 #endif /* _INTEGRAL_MAX_BITS >= 64 */
@@ -113,7 +113,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int);
     time_t time_create;
     time_t time_access;
     time_t time_write;
-    __int64 size;
+    __MINGW_EXTENSION __int64 size;
     wchar_t name[260];
   };
 
@@ -122,7 +122,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int);
     __time32_t time_create;
     __time32_t time_access;
     __time32_t time_write;
-    __int64 size;
+    __MINGW_EXTENSION __int64 size;
     wchar_t name[260];
   };
 
@@ -140,7 +140,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int);
     __time64_t time_create;
     __time64_t time_access;
     __time64_t time_write;
-    __int64 size;
+    __MINGW_EXTENSION __int64 size;
     wchar_t name[260];
   };
 #endif
@@ -200,15 +200,15 @@ _CRTIMP char* __cdecl _getcwd (char*, int);
   _CRTIMP int __cdecl _write(int _FileHandle,const void *_Buf,unsigned int _MaxCharCount);
 
 #if _INTEGRAL_MAX_BITS >= 64
-  _CRTIMP __int64 __cdecl _filelengthi64(int _FileHandle);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _filelengthi64(int _FileHandle);
   _CRTIMP intptr_t __cdecl _findfirst32i64(const char *_Filename,struct _finddata32i64_t *_FindData);
   _CRTIMP intptr_t __cdecl _findfirst64i32(const char *_Filename,struct _finddata64i32_t *_FindData);
   _CRTIMP intptr_t __cdecl _findfirst64(const char *_Filename,struct __finddata64_t *_FindData);
   _CRTIMP int __cdecl _findnext32i64(intptr_t _FindHandle,struct _finddata32i64_t *_FindData);
   _CRTIMP int __cdecl _findnext64i32(intptr_t _FindHandle,struct _finddata64i32_t *_FindData);
   _CRTIMP int __cdecl _findnext64(intptr_t _FindHandle,struct __finddata64_t *_FindData);
-  _CRTIMP __int64 __cdecl _lseeki64(int _FileHandle,__int64 _Offset,int _Origin);
-  _CRTIMP __int64 __cdecl _telli64(int _FileHandle);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _lseeki64(int _FileHandle,__int64 _Offset,int _Origin);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _telli64(int _FileHandle);
 #ifdef __cplusplus
 #include <string.h>
 #endif
index a576184..b75bb91 100644 (file)
@@ -598,23 +598,23 @@ __CRT_INLINE int isinf (double d) {
     return retval;
   }
 
-  __CRT_INLINE long long __cdecl llrint (double x)
+  __MINGW_EXTENSION __CRT_INLINE long long __cdecl llrint (double x)
   {
-    long long retval;
+    __MINGW_EXTENSION long long retval;
     __fistpll(x, retval);
     return retval;
   }
 
-  __CRT_INLINE long long __cdecl llrintf (float x)
+  __MINGW_EXTENSION __CRT_INLINE long long __cdecl llrintf (float x)
   {
-    long long retval;
+    __MINGW_EXTENSION long long retval;
     __fistpll(x, retval);
     return retval;
   }
 
-  __CRT_INLINE long long __cdecl llrintl (long double x)
+  __MINGW_EXTENSION __CRT_INLINE long long __cdecl llrintl (long double x)
   {
-    long long retval;
+    __MINGW_EXTENSION long long retval;
     __fistpll(x, retval);
     return retval;
   }
@@ -630,9 +630,9 @@ __CRT_INLINE int isinf (double d) {
   extern long __cdecl lroundf (float);
   extern long __cdecl lroundl (long double);
 
-  extern long long __cdecl llround (double);
-  extern long long __cdecl llroundf (float);
-  extern long long __cdecl llroundl (long double);
+  __MINGW_EXTENSION extern long long __cdecl llround (double);
+  __MINGW_EXTENSION extern long long __cdecl llroundf (float);
+  __MINGW_EXTENSION extern long long __cdecl llroundl (long double);
 
   /* 7.12.9.8 */
   /* round towards zero, regardless of fpu control word settings */
index 9b3c48a..3816f2d 100644 (file)
@@ -70,10 +70,10 @@ extern "C" {
 
   char __fastcall _RTC_Check_2_to_1(short _Src);
   char __fastcall _RTC_Check_4_to_1(int _Src);
-  char __fastcall _RTC_Check_8_to_1(__int64 _Src);
+  __MINGW_EXTENSION char __fastcall _RTC_Check_8_to_1(__int64 _Src);
   short __fastcall _RTC_Check_4_to_2(int _Src);
-  short __fastcall _RTC_Check_8_to_2(__int64 _Src);
-  int __fastcall _RTC_Check_8_to_4(__int64 _Src);
+  __MINGW_EXTENSION short __fastcall _RTC_Check_8_to_2(__int64 _Src);
+  __MINGW_EXTENSION int __fastcall _RTC_Check_8_to_4(__int64 _Src);
 
 #if (defined(_X86_) && !defined(__x86_64))
   void __cdecl _RTC_CheckEsp();
index 3c27ff4..66246a4 100644 (file)
@@ -40,8 +40,8 @@ extern "C" {
 #elif defined(__ia64__)
 
   typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
-    __int64 LowPart;
-    __int64 HighPart;
+    __MINGW_EXTENSION __int64 LowPart;
+    __MINGW_EXTENSION __int64 HighPart;
   } SETJMP_FLOAT128;
 
 #define _JBLEN 33
@@ -78,49 +78,49 @@ extern "C" {
     SETJMP_FLOAT128 FltS17;
     SETJMP_FLOAT128 FltS18;
     SETJMP_FLOAT128 FltS19;
-    __int64 FPSR;
-    __int64 StIIP;
-    __int64 BrS0;
-    __int64 BrS1;
-    __int64 BrS2;
-    __int64 BrS3;
-    __int64 BrS4;
-    __int64 IntS0;
-    __int64 IntS1;
-    __int64 IntS2;
-    __int64 IntS3;
-    __int64 RsBSP;
-    __int64 RsPFS;
-    __int64 ApUNAT;
-    __int64 ApLC;
-    __int64 IntSp;
-    __int64 IntNats;
-    __int64 Preds;
+    __MINGW_EXTENSION __int64 FPSR;
+    __MINGW_EXTENSION __int64 StIIP;
+    __MINGW_EXTENSION __int64 BrS0;
+    __MINGW_EXTENSION __int64 BrS1;
+    __MINGW_EXTENSION __int64 BrS2;
+    __MINGW_EXTENSION __int64 BrS3;
+    __MINGW_EXTENSION __int64 BrS4;
+    __MINGW_EXTENSION __int64 IntS0;
+    __MINGW_EXTENSION __int64 IntS1;
+    __MINGW_EXTENSION __int64 IntS2;
+    __MINGW_EXTENSION __int64 IntS3;
+    __MINGW_EXTENSION __int64 RsBSP;
+    __MINGW_EXTENSION __int64 RsPFS;
+    __MINGW_EXTENSION __int64 ApUNAT;
+    __MINGW_EXTENSION __int64 ApLC;
+    __MINGW_EXTENSION __int64 IntSp;
+    __MINGW_EXTENSION __int64 IntNats;
+    __MINGW_EXTENSION __int64 Preds;
 
   } _JUMP_BUFFER;
 
 #elif defined(__x86_64)
 
   typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
-    unsigned __int64 Part[2];
+    __MINGW_EXTENSION unsigned __int64 Part[2];
   } SETJMP_FLOAT128;
 
 #define _JBLEN 16
   typedef SETJMP_FLOAT128 _JBTYPE;
 
   typedef struct _JUMP_BUFFER {
-    unsigned __int64 Frame;
-    unsigned __int64 Rbx;
-    unsigned __int64 Rsp;
-    unsigned __int64 Rbp;
-    unsigned __int64 Rsi;
-    unsigned __int64 Rdi;
-    unsigned __int64 R12;
-    unsigned __int64 R13;
-    unsigned __int64 R14;
-    unsigned __int64 R15;
-    unsigned __int64 Rip;
-    unsigned __int64 Spare;
+    __MINGW_EXTENSION unsigned __int64 Frame;
+    __MINGW_EXTENSION unsigned __int64 Rbx;
+    __MINGW_EXTENSION unsigned __int64 Rsp;
+    __MINGW_EXTENSION unsigned __int64 Rbp;
+    __MINGW_EXTENSION unsigned __int64 Rsi;
+    __MINGW_EXTENSION unsigned __int64 Rdi;
+    __MINGW_EXTENSION unsigned __int64 R12;
+    __MINGW_EXTENSION unsigned __int64 R13;
+    __MINGW_EXTENSION unsigned __int64 R14;
+    __MINGW_EXTENSION unsigned __int64 R15;
+    __MINGW_EXTENSION unsigned __int64 Rip;
+    __MINGW_EXTENSION unsigned __int64 Spare;
     SETJMP_FLOAT128 Xmm6;
     SETJMP_FLOAT128 Xmm7;
     SETJMP_FLOAT128 Xmm8;
index 8aa692e..9482677 100644 (file)
@@ -148,7 +148,7 @@ _TYPE_wchar_t;
 #endif
 #ifndef _PTRDIFF_T_DEFINED
 #define _PTRDIFF_T_DEFINED
-typedef __PTRDIFF_TYPE__ ptrdiff_t;
+__MINGW_EXTENSION typedef __PTRDIFF_TYPE__ ptrdiff_t;
 #endif
 #endif /* _GCC_PTRDIFF_T */
 #endif /* ___int_ptrdiff_t_h */
@@ -215,7 +215,7 @@ typedef __PTRDIFF_TYPE__ ptrdiff_t;
 #endif
 #endif
 #if !(defined (__GNUG__) && defined (size_t))
-typedef __SIZE_TYPE__ size_t;
+__MINGW_EXTENSION typedef __SIZE_TYPE__ size_t;
 #ifdef __BEOS__
 typedef long ssize_t;
 #endif /* __BEOS__ */
index 30f58bd..4c99ed0 100644 (file)
@@ -38,8 +38,8 @@ typedef short  int16_t;
 typedef unsigned short  uint16_t;
 typedef int  int32_t;
 typedef unsigned   uint32_t;
-typedef long long  int64_t;
-typedef unsigned long long   uint64_t;
+__MINGW_EXTENSION typedef long long  int64_t;
+__MINGW_EXTENSION typedef unsigned long long   uint64_t;
 
 /* 7.18.1.2  Minimum-width integer types */
 typedef signed char int_least8_t;
@@ -48,8 +48,8 @@ typedef short  int_least16_t;
 typedef unsigned short  uint_least16_t;
 typedef int  int_least32_t;
 typedef unsigned   uint_least32_t;
-typedef long long  int_least64_t;
-typedef unsigned long long   uint_least64_t;
+__MINGW_EXTENSION typedef long long  int_least64_t;
+__MINGW_EXTENSION typedef unsigned long long   uint_least64_t;
 
 /*  7.18.1.3  Fastest minimum-width integer types
  *  Not actually guaranteed to be fastest for all purposes
@@ -61,12 +61,12 @@ typedef short  int_fast16_t;
 typedef unsigned short  uint_fast16_t;
 typedef int  int_fast32_t;
 typedef unsigned  int  uint_fast32_t;
-typedef long long  int_fast64_t;
-typedef unsigned long long   uint_fast64_t;
+__MINGW_EXTENSION typedef long long  int_fast64_t;
+__MINGW_EXTENSION typedef unsigned long long   uint_fast64_t;
 
 /* 7.18.1.5  Greatest-width integer types */
-typedef long long  intmax_t;
-typedef unsigned long long   uintmax_t;
+__MINGW_EXTENSION typedef long long  intmax_t;
+__MINGW_EXTENSION typedef unsigned long long   uintmax_t;
 
 /* 7.18.2  Limits of specified-width integer types */
 #if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS)
index 8c4e5be..c73c5b2 100644 (file)
@@ -87,9 +87,9 @@ extern "C" {
 
 #ifndef _OFF64_T_DEFINED
 #define _OFF64_T_DEFINED
-  typedef long long _off64_t;
+  __MINGW_EXTENSION typedef long long _off64_t;
 #if !defined(NO_OLDNAMES) || defined(_POSIX)
-  typedef long long off64_t;
+  __MINGW_EXTENSION typedef long long off64_t;
 #endif
 #endif
 
@@ -106,10 +106,10 @@ extern "C" {
 #undef _FPOSOFF
 
 #if (!defined(NO_OLDNAMES) || defined(__GNUC__)) && _INTEGRAL_MAX_BITS >= 64
-  typedef __int64 fpos_t;
+  __MINGW_EXTENSION typedef __int64 fpos_t;
 #define _FPOSOFF(fp) ((long)(fp))
 #else
-  typedef long long fpos_t;
+  __MINGW_EXTENSION typedef long long fpos_t;
 #define _FPOSOFF(fp) ((long)(fp))
 #endif
 
@@ -179,8 +179,8 @@ extern "C" {
   _CRTIMP int __cdecl fsetpos(FILE *_File,const fpos_t *_Pos);
   _CRTIMP int __cdecl fseek(FILE *_File,long _Offset,int _Origin);
   _CRTIMP long __cdecl ftell(FILE *_File);
-  _CRTIMP int __cdecl _fseeki64(FILE *_File,__int64 _Offset,int _Origin);
-  _CRTIMP __int64 __cdecl _ftelli64(FILE *_File);
+  __MINGW_EXTENSION _CRTIMP int __cdecl _fseeki64(FILE *_File,__int64 _Offset,int _Origin);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _ftelli64(FILE *_File);
   _CRTIMP size_t __cdecl fwrite(const void *_Str,size_t _Size,size_t _Count,FILE *_File);
   _CRTIMP int __cdecl getc(FILE *_File);
   _CRTIMP int __cdecl getchar(void);
@@ -381,8 +381,8 @@ extern "C" {
   _CRTIMP size_t __cdecl _fread_nolock(void *_DstBuf,size_t _ElementSize,size_t _Count,FILE *_File);
   _CRTIMP int __cdecl _fseek_nolock(FILE *_File,long _Offset,int _Origin);
   _CRTIMP long __cdecl _ftell_nolock(FILE *_File);
-  _CRTIMP int __cdecl _fseeki64_nolock(FILE *_File,__int64 _Offset,int _Origin);
-  _CRTIMP __int64 __cdecl _ftelli64_nolock(FILE *_File);
+  __MINGW_EXTENSION _CRTIMP int __cdecl _fseeki64_nolock(FILE *_File,__int64 _Offset,int _Origin);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _ftelli64_nolock(FILE *_File);
   _CRTIMP size_t __cdecl _fwrite_nolock(const void *_DstBuf,size_t _Size,size_t _Count,FILE *_File);
   _CRTIMP int __cdecl _ungetc_nolock(int _Ch,FILE *_File);
 
index 09dd4a5..baa0d8d 100644 (file)
@@ -328,7 +328,7 @@ extern "C" {
 #endif
 
 #if _INTEGRAL_MAX_BITS >= 64
-  __int64 __cdecl _abs64(__int64);
+  __MINGW_EXTENSION __int64 __cdecl _abs64(__int64);
 #endif
   int __cdecl atexit(void (__cdecl *)(void));
 #ifndef _CRT_ATOF_DEFINED
@@ -348,20 +348,20 @@ extern "C" {
   unsigned short __cdecl _byteswap_ushort(unsigned short _Short);
   /*unsigned long __cdecl _byteswap_ulong (unsigned long _Long); */
 #if _INTEGRAL_MAX_BITS >= 64
-  unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64);
+  __MINGW_EXTENSION unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64);
 #endif
   div_t __cdecl div(int _Numerator,int _Denominator);
   char *__cdecl getenv(const char *_VarName);
   _CRTIMP char *__cdecl _itoa(int _Value,char *_Dest,int _Radix);
 #if _INTEGRAL_MAX_BITS >= 64
-  _CRTIMP char *__cdecl _i64toa(__int64 _Val,char *_DstBuf,int _Radix);
-  _CRTIMP char *__cdecl _ui64toa(unsigned __int64 _Val,char *_DstBuf,int _Radix);
-  _CRTIMP __int64 __cdecl _atoi64(const char *_String);
-  _CRTIMP __int64 __cdecl _atoi64_l(const char *_String,_locale_t _Locale);
-  _CRTIMP __int64 __cdecl _strtoi64(const char *_String,char **_EndPtr,int _Radix);
-  _CRTIMP __int64 __cdecl _strtoi64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale);
-  _CRTIMP unsigned __int64 __cdecl _strtoui64(const char *_String,char **_EndPtr,int _Radix);
-  _CRTIMP unsigned __int64 __cdecl _strtoui64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale);
+  __MINGW_EXTENSION _CRTIMP char *__cdecl _i64toa(__int64 _Val,char *_DstBuf,int _Radix);
+  __MINGW_EXTENSION _CRTIMP char *__cdecl _ui64toa(unsigned __int64 _Val,char *_DstBuf,int _Radix);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _atoi64(const char *_String);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _atoi64_l(const char *_String,_locale_t _Locale);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _strtoi64(const char *_String,char **_EndPtr,int _Radix);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _strtoi64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale);
+  __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _strtoui64(const char *_String,char **_EndPtr,int _Radix);
+  __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _strtoui64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale);
 #endif
   ldiv_t __cdecl ldiv(long _Numerator,long _Denominator);
   _CRTIMP char *__cdecl _ltoa(long _Value,char *_Dest,int _Radix);
@@ -445,14 +445,14 @@ extern "C" {
   _CRTIMP long __cdecl _wtol_l(const wchar_t *_Str,_locale_t _Locale);
 
 #if _INTEGRAL_MAX_BITS >= 64
-  _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix);
-  _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix);
-  _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str);
-  _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale);
-  _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);
-  _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);
-  _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);
-  _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str ,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);
+  __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix);
+  __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);
+  __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);
+  __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str ,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);
 #endif
 #endif
 
@@ -480,11 +480,11 @@ extern "C" {
   _CRTIMP int __cdecl _putenv(const char *_EnvString);
   unsigned int __cdecl _rotl(unsigned int _Val,int _Shift);
 #if _INTEGRAL_MAX_BITS >= 64
-  unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val,int _Shift);
+  __MINGW_EXTENSION unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val,int _Shift);
 #endif
   unsigned int __cdecl _rotr(unsigned int _Val,int _Shift);
 #if _INTEGRAL_MAX_BITS >= 64
-  unsigned __int64 __cdecl _rotr64(unsigned __int64 _Val,int _Shift);
+  __MINGW_EXTENSION unsigned __int64 __cdecl _rotr64(unsigned __int64 _Val,int _Shift);
 #endif
   _CRTIMP void __cdecl _searchenv(const char *_Filename,const char *_EnvVar,char *_ResultPath);
   _CRTIMP void __cdecl _splitpath(const char *_FullPath,char *_Drive,char *_Dir,char *_Filename,char *_Ext);
@@ -541,32 +541,32 @@ extern "C" {
 
 #if !defined __NO_ISOCEXT /* externs in static libmingwex.a */
 
-  typedef struct { long long quot, rem; } lldiv_t;
+  __MINGW_EXTENSION typedef struct { long long quot, rem; } lldiv_t;
 
-  lldiv_t __cdecl lldiv(long long, long long);
+  __MINGW_EXTENSION lldiv_t __cdecl lldiv(long long, long long);
 
-  __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); }
+  __MINGW_EXTENSION __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); }
 
-  long long  __cdecl strtoll(const char* __restrict__, char** __restrict, int);
-  unsigned long long  __cdecl strtoull(const char* __restrict__, char** __restrict__, int);
+  __MINGW_EXTENSION long long  __cdecl strtoll(const char* __restrict__, char** __restrict, int);
+  __MINGW_EXTENSION unsigned long long  __cdecl strtoull(const char* __restrict__, char** __restrict__, int);
 
   /* these are stubs for MS _i64 versions */
-  long long  __cdecl atoll (const char *);
+  __MINGW_EXTENSION long long  __cdecl atoll (const char *);
 
 #ifndef __STRICT_ANSI__
-  long long  __cdecl wtoll (const wchar_t *);
-  char *__cdecl lltoa (long long, char *, int);
-  char *__cdecl ulltoa (unsigned long long , char *, int);
-  wchar_t *__cdecl lltow (long long, wchar_t *, int);
-  wchar_t *__cdecl ulltow (unsigned long long, wchar_t *, int);
+  __MINGW_EXTENSION long long  __cdecl wtoll (const wchar_t *);
+  __MINGW_EXTENSION char *__cdecl lltoa (long long, char *, int);
+  __MINGW_EXTENSION char *__cdecl ulltoa (unsigned long long , char *, int);
+  __MINGW_EXTENSION wchar_t *__cdecl lltow (long long, wchar_t *, int);
+  __MINGW_EXTENSION wchar_t *__cdecl ulltow (unsigned long long, wchar_t *, int);
 
   /* __CRT_INLINE using non-ansi functions */
-  __CRT_INLINE long long  __cdecl atoll (const char * _c) { return _atoi64 (_c); }
-  __CRT_INLINE char *__cdecl lltoa (long long _n, char * _c, int _i) { return _i64toa (_n, _c, _i); }
-  __CRT_INLINE char *__cdecl ulltoa (unsigned long long _n, char * _c, int _i) { return _ui64toa (_n, _c, _i); }
-  __CRT_INLINE long long  __cdecl wtoll (const wchar_t * _w) { return _wtoi64 (_w); }
-  __CRT_INLINE wchar_t *__cdecl lltow (long long _n, wchar_t * _w, int _i) { return _i64tow (_n, _w, _i); }
-  __CRT_INLINE wchar_t *__cdecl ulltow (unsigned long long _n, wchar_t * _w, int _i) { return _ui64tow (_n, _w, _i); }
+  __MINGW_EXTENSION __CRT_INLINE long long  __cdecl atoll (const char * _c) { return _atoi64 (_c); }
+  __MINGW_EXTENSION __CRT_INLINE char *__cdecl lltoa (long long _n, char * _c, int _i) { return _i64toa (_n, _c, _i); }
+  __MINGW_EXTENSION __CRT_INLINE char *__cdecl ulltoa (unsigned long long _n, char * _c, int _i) { return _ui64toa (_n, _c, _i); }
+  __MINGW_EXTENSION __CRT_INLINE long long  __cdecl wtoll (const wchar_t * _w) { return _wtoi64 (_w); }
+  __MINGW_EXTENSION __CRT_INLINE wchar_t *__cdecl lltow (long long _n, wchar_t * _w, int _i) { return _i64tow (_n, _w, _i); }
+  __MINGW_EXTENSION __CRT_INLINE wchar_t *__cdecl ulltow (unsigned long long _n, wchar_t * _w, int _i) { return _ui64tow (_n, _w, _i); }
 #endif /* (__STRICT_ANSI__)  */
 
 #endif /* !__NO_ISOCEXT */
index 123f6d8..d7c3147 100644 (file)
@@ -108,10 +108,11 @@ extern "C" {
   typedef wint_t _TINT;
 #endif
 
+#ifndef NO_OLDNAMES
 #ifndef _TCHAR_DEFINED
 #define _TCHAR_DEFINED
-#ifndef        NO_OLDNAMES
-  typedef wchar_t TCHAR;
+  typedef wchar_t TCHAR,*PTCHAR;
+  typedef wchar_t TBYTE,*PTBYTE;
 #endif
 #endif
 
@@ -771,11 +772,12 @@ extern "C" {
 #define __TCHAR_DEFINED
 #endif
 
+#ifndef NO_OLDNAMES
 #ifndef _TCHAR_DEFINED
-#ifndef        NO_OLDNAMES
-  typedef char TCHAR;
-#endif
 #define _TCHAR_DEFINED
+  typedef char TCHAR,*PTCHAR;
+  typedef unsigned char TBYTE,*PTBYTE;
+#endif
 #endif
 
 #ifdef _MB_MAP_DIRECT
index 7e51c95..49f23d8 100644 (file)
@@ -29,7 +29,7 @@ extern "C" {
 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
   typedef int _time64_t __attribute__ ((mode (DI)));
 #else
-  typedef __int64 __time64_t;
+  __MINGW_EXTENSION typedef __int64 __time64_t;
 #endif
 #endif
 #endif
@@ -55,7 +55,7 @@ extern "C" {
 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
   typedef unsigned int size_t __attribute__ ((mode (DI)));
 #else
-  typedef unsigned __int64 size_t;
+  __MINGW_EXTENSION typedef unsigned __int64 size_t;
 #endif
 #else
   typedef unsigned int size_t;
index 280d0ff..23a9920 100644 (file)
@@ -29,7 +29,7 @@ extern "C" {
 #if defined(__GNUC__) && defined(__STRICT_ANSI__)
   typedef unsigned int uintptr_t __attribute__ ((mode (DI)));
 #else
-  typedef unsigned __int64 uintptr_t;
+  __MINGW_EXTENSION typedef unsigned __int64 uintptr_t;
 #endif
 #else
   typedef unsigned long uintptr_t;
index 5e4896f..dbcf4ef 100644 (file)
@@ -93,7 +93,7 @@ extern "C" {
     time_t time_create;
     time_t time_access;
     time_t time_write;
-    __int64 size;
+    __MINGW_EXTENSION __int64 size;
     wchar_t name[260];
   };
 
@@ -102,7 +102,7 @@ extern "C" {
     __time32_t time_create;
     __time32_t time_access;
     __time32_t time_write;
-    __int64 size;
+    __MINGW_EXTENSION __int64 size;
     wchar_t name[260];
   };
 
@@ -120,7 +120,7 @@ extern "C" {
     __time64_t time_create;
     __time64_t time_access;
     __time64_t time_write;
-    __int64 size;
+    __MINGW_EXTENSION __int64 size;
     wchar_t name[260];
   };
 #endif
@@ -352,9 +352,9 @@ _CRTIMP int __cdecl iswblank(wint_t _C);
 
 #ifndef _OFF64_T_DEFINED
 #define _OFF64_T_DEFINED
-  typedef long long _off64_t;
+  __MINGW_EXTENSION typedef long long _off64_t;
 #ifndef NO_OLDNAMES
-  typedef long long off64_t;
+  __MINGW_EXTENSION typedef long long off64_t;
 #endif
 #endif
 
@@ -415,7 +415,7 @@ _CRTIMP int __cdecl iswblank(wint_t _C);
     short st_uid;
     short st_gid;
     _dev_t st_rdev;
-    __int64 st_size;
+    __MINGW_EXTENSION __int64 st_size;
     __time32_t st_atime;
     __time32_t st_mtime;
     __time32_t st_ctime;
@@ -443,7 +443,7 @@ _CRTIMP int __cdecl iswblank(wint_t _C);
     short st_uid;
     short st_gid;
     _dev_t st_rdev;
-    __int64 st_size;
+    __MINGW_EXTENSION __int64 st_size;
     __time64_t st_atime;
     __time64_t st_mtime;
     __time64_t st_ctime;
@@ -645,14 +645,14 @@ _CRTIMP int __cdecl iswblank(wint_t _C);
   _CRTIMP long __cdecl _wtol_l(const wchar_t *_Str,_locale_t _Locale);
 
 #if _INTEGRAL_MAX_BITS >= 64
-  _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix);
-  _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix);
-  _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str);
-  _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale);
-  _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);
-  _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);
-  _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);
-  _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);
+  __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix);
+  __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);
+  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);
+  __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix);
+  __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale);
 #endif
 #endif
 
@@ -792,8 +792,8 @@ __CRT_INLINE errno_t _wctime_s(wchar_t *_Buffer, size_t _SizeInWords,const time_
   int wmemcmp(const wchar_t *s1, const wchar_t *s2,size_t n);
   wchar_t *__cdecl wmemcpy(wchar_t *s1,const wchar_t *s2,size_t n);
   wchar_t *__cdecl wmemmove(wchar_t *s1, const wchar_t *s2, size_t n);
-  long long __cdecl wcstoll(const wchar_t *nptr,wchar_t **endptr, int base);
-  unsigned long long __cdecl wcstoull(const wchar_t *nptr,wchar_t **endptr, int base);
+  __MINGW_EXTENSION long long __cdecl wcstoll(const wchar_t *nptr,wchar_t **endptr, int base);
+  __MINGW_EXTENSION unsigned long long __cdecl wcstoull(const wchar_t *nptr,wchar_t **endptr, int base);
 #endif /* __NO_ISOCEXT */
 
   void *__cdecl memmove(void *_Dst,const void *_Src,size_t _MaxCount);
index 9f99412..10b812d 100644 (file)
@@ -1,11 +1,13 @@
 /**
  * This file has no copyright assigned and is placed in the Public Domain.
  * This file is part of the w64 mingw-runtime package.
- * No warranty is given; refer to the file DISCLAIMER within this package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
  */
 #ifndef _YVALS
 #define _YVALS
 
+#include <_mingw.h>
+/* TODO, don't include crtdef.h.  */
 #include <crtdefs.h>
 
 #pragma pack(push,_CRT_PACKING)
@@ -168,10 +170,10 @@ typedef bool _Bool;
 _STD_END
 #endif
 
-#define _LONGLONG __int64
-#define _ULONGLONG unsigned __int64
-#define _LLONG_MAX 0x7fffffffffffffff
-#define _ULLONG_MAX 0xffffffffffffffff
+#define _LONGLONG /* __MINGW_EXTENSION */ __int64
+#define _ULONGLONG /* __MINGW_EXTENSION */ unsigned __int64
+#define _LLONG_MAX 0x7fffffffffffffffLL
+#define _ULLONG_MAX 0xffffffffffffffffULL
 
 #define _C2 1
 
@@ -179,8 +181,8 @@ _STD_END
 #define _MAX_INT_DIG 32
 #define _MAX_SIG_DIG 36
 
-typedef _LONGLONG _Longlong;
-typedef _ULONGLONG _ULonglong;
+__MINGW_EXTENSION typedef _LONGLONG _Longlong;
+__MINGW_EXTENSION typedef _ULONGLONG _ULonglong;
 
 #define _Filet _iobuf
 
diff --git a/reactos/include/ddk/acpiioct.h b/reactos/include/ddk/acpiioct.h
new file mode 100644 (file)
index 0000000..a51cc3d
--- /dev/null
@@ -0,0 +1,190 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ACPI_EVAL_INPUT_BUFFER_SIGNATURE                    'BieA'
+#define ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE     'IieA'
+#define ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_SIGNATURE      'SieA'
+#define ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE            'CieA'
+#define ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE                   'BoeA'
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define ACPI_EVAL_INPUT_BUFFER_SIGNATURE_EX                 'AieA'
+#define ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE_EX  'DieA'
+#define ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_SIGNATURE_EX   'EieA'
+#define ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE_EX         'FieA'
+#define ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE          'GieA'
+#define ACPI_ENUM_CHILDREN_INPUT_BUFFER_SIGNATURE           'HieA'
+#endif
+
+#define ACPI_METHOD_ARGUMENT_INTEGER                      0x0
+#define ACPI_METHOD_ARGUMENT_STRING                       0x1
+#define ACPI_METHOD_ARGUMENT_BUFFER                       0x2
+#define ACPI_METHOD_ARGUMENT_PACKAGE                      0x3
+#define ACPI_METHOD_ARGUMENT_PACKAGE_EX                   0x4
+
+#define ACPI_ACQUIRE_GLOBAL_LOCK_SIGNATURE              'LgaA'
+#define ACPI_RELEASE_GLOBAL_LOCK_SIGNATURE              'LgrA'
+
+#define ACPI_OBJECT_HAS_CHILDREN            0x1
+
+#define ENUM_CHILDREN_IMMEDIATE_ONLY        0x1
+#define ENUM_CHILDREN_MULTILEVEL            0x2
+#define ENUM_CHILDREN_NAME_IS_FILTER        0x4
+
+typedef struct _ACPI_EVAL_INPUT_BUFFER {
+  ULONG Signature;
+  union {
+    UCHAR MethodName[4];
+    ULONG MethodNameAsUlong;
+  } DUMMYUNIONNAME;
+} ACPI_EVAL_INPUT_BUFFER, *PACPI_EVAL_INPUT_BUFFER;
+
+typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER {
+  ULONG Signature;
+  union {
+    UCHAR MethodName[4];
+    ULONG MethodNameAsUlong;
+  } DUMMYUNIONNAME;
+  ULONG IntegerArgument;
+} ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER, *PACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER;
+
+typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING {
+  ULONG Signature;
+  union {
+    UCHAR MethodName[4];
+    ULONG MethodNameAsUlong;
+  } DUMMYUNIONNAME;
+  ULONG StringLength;
+  UCHAR String[ANYSIZE_ARRAY];
+} ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING, *PACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING;
+
+typedef struct _ACPI_METHOD_ARGUMENT {
+  USHORT Type;
+  USHORT DataLength;
+  union {
+    ULONG Argument;
+    UCHAR Data[ANYSIZE_ARRAY];
+  } DUMMYUNIONNAME;
+} ACPI_METHOD_ARGUMENT;
+typedef ACPI_METHOD_ARGUMENT UNALIGNED *PACPI_METHOD_ARGUMENT;
+
+typedef struct _ACPI_EVAL_INPUT_BUFFER_COMPLEX {
+  ULONG Signature;
+  union {
+    UCHAR MethodName[4];
+    ULONG MethodNameAsUlong;
+  } DUMMYUNIONNAME;
+  ULONG Size;
+  ULONG ArgumentCount;
+  ACPI_METHOD_ARGUMENT Argument[ANYSIZE_ARRAY];
+} ACPI_EVAL_INPUT_BUFFER_COMPLEX, *PACPI_EVAL_INPUT_BUFFER_COMPLEX;
+
+typedef struct _ACPI_EVAL_OUTPUT_BUFFER {
+  ULONG Signature;
+  ULONG Length;
+  ULONG Count;
+  ACPI_METHOD_ARGUMENT Argument[ANYSIZE_ARRAY];
+} ACPI_EVAL_OUTPUT_BUFFER;
+typedef ACPI_EVAL_OUTPUT_BUFFER UNALIGNED *PACPI_EVAL_OUTPUT_BUFFER;
+
+typedef struct _ACPI_MANIPULATE_GLOBAL_LOCK_BUFFER {
+  ULONG Signature;
+  PVOID LockObject;
+} ACPI_MANIPULATE_GLOBAL_LOCK_BUFFER, *PACPI_MANIPULATE_GLOBAL_LOCK_BUFFER;
+
+typedef struct _ACPI_EVAL_INPUT_BUFFER_EX {
+  ULONG Signature;
+  CHAR MethodName[256];
+} ACPI_EVAL_INPUT_BUFFER_EX, *PACPI_EVAL_INPUT_BUFFER_EX;
+
+typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_EX {
+  ULONG Signature;
+  CHAR MethodName[256];
+  ULONG64 IntegerArgument;
+} ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_EX, *PACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_EX;
+
+typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_EX {
+  ULONG Signature;
+  CHAR MethodName[256];
+  ULONG StringLength;
+  UCHAR String[ANYSIZE_ARRAY];
+} ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_EX, *PACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_EX;
+
+typedef struct _ACPI_EVAL_INPUT_BUFFER_COMPLEX_EX {
+  ULONG Signature;
+  CHAR MethodName[256];
+  ULONG Size;
+  ULONG ArgumentCount;
+  ACPI_METHOD_ARGUMENT Argument[ANYSIZE_ARRAY];
+} ACPI_EVAL_INPUT_BUFFER_COMPLEX_EX, *PACPI_EVAL_INPUT_BUFFER_COMPLEX_EX;
+
+typedef struct _ACPI_ENUM_CHILDREN_INPUT_BUFFER {
+  ULONG Signature;
+  ULONG Flags;
+  ULONG NameLength;
+  CHAR Name[ANYSIZE_ARRAY];
+} ACPI_ENUM_CHILDREN_INPUT_BUFFER, *PACPI_ENUM_CHILDREN_INPUT_BUFFER;
+
+typedef struct _ACPI_ENUM_CHILD {
+  ULONG Flags;
+  ULONG NameLength;
+  CHAR Name[ANYSIZE_ARRAY];
+} ACPI_ENUM_CHILD;
+typedef ACPI_ENUM_CHILD UNALIGNED *PACPI_ENUM_CHILD;
+
+typedef struct _ACPI_ENUM_CHILDREN_OUTPUT_BUFFER {
+  ULONG Signature;
+  ULONG NumberOfChildren;
+  ACPI_ENUM_CHILD Children[ANYSIZE_ARRAY];
+} ACPI_ENUM_CHILDREN_OUTPUT_BUFFER; 
+typedef ACPI_ENUM_CHILDREN_OUTPUT_BUFFER UNALIGNED *PACPI_ENUM_CHILDREN_OUTPUT_BUFFER;
+
+#define ACPI_METHOD_ARGUMENT_LENGTH( DataLength )                           \
+    (FIELD_OFFSET(ACPI_METHOD_ARGUMENT, Data) + max(sizeof(ULONG), DataLength))
+
+#define ACPI_METHOD_ARGUMENT_LENGTH_FROM_ARGUMENT( Argument )               \
+    (ACPI_METHOD_ARGUMENT_LENGTH(((PACPI_METHOD_ARGUMENT)Argument)->DataLength))
+
+#define ACPI_METHOD_NEXT_ARGUMENT( Argument )                               \
+    (PACPI_METHOD_ARGUMENT) ( (PUCHAR) Argument +                           \
+    ACPI_METHOD_ARGUMENT_LENGTH_FROM_ARGUMENT( Argument ) )
+
+
+#define ACPI_METHOD_SET_ARGUMENT_INTEGER( MethodArgument, IntData )         \
+    { MethodArgument->Type = ACPI_METHOD_ARGUMENT_INTEGER;                  \
+      MethodArgument->DataLength = sizeof(ULONG);                           \
+      MethodArgument->Argument = IntData; }
+
+#define ACPI_METHOD_SET_ARGUMENT_STRING( Argument, StrData )                \
+    { Argument->Type = ACPI_METHOD_ARGUMENT_STRING;                         \
+      Argument->DataLength = strlen((PUCHAR)StrData) + sizeof(UCHAR);       \
+      RtlCopyMemory(&Argument->Data[0],(PUCHAR)StrData,Argument->DataLength); }
+
+#define ACPI_METHOD_SET_ARGUMENT_BUFFER( Argument, BuffData, BuffLength )   \
+    { Argument->Type = ACPI_METHOD_ARGUMENT_BUFFER;                         \
+      Argument->DataLength = BuffLength;                                    \
+      RtlCopyMemory(&Argument->Data[0],(PUCHAR)BuffData,Argument->DataLength); }
+
+#define ACPI_ENUM_CHILD_LENGTH_FROM_CHILD( Child )              \
+    ( (2* sizeof (ULONG)) + Child->NameLength )
+
+#define ACPI_ENUM_CHILD_NEXT( Child )                           \
+    (PACPI_ENUM_CHILD) ( (PUCHAR) Child +                       \
+    ACPI_ENUM_CHILD_LENGTH_FROM_CHILD( Child ) )
+
+#define IOCTL_ACPI_ASYNC_EVAL_METHOD             CTL_CODE(FILE_DEVICE_ACPI, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_ACPI_EVAL_METHOD                   CTL_CODE(FILE_DEVICE_ACPI, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_ACPI_ACQUIRE_GLOBAL_LOCK           CTL_CODE(FILE_DEVICE_ACPI, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_ACPI_RELEASE_GLOBAL_LOCK           CTL_CODE(FILE_DEVICE_ACPI, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define IOCTL_ACPI_EVAL_METHOD_EX                CTL_CODE(FILE_DEVICE_ACPI, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_ACPI_ASYNC_EVAL_METHOD_EX          CTL_CODE(FILE_DEVICE_ACPI, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_ACPI_ENUM_CHILDREN                 CTL_CODE(FILE_DEVICE_ACPI, 8, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
index 0342cea..0bdd590 100644 (file)
@@ -2,6 +2,15 @@
 extern "C" {
 #endif
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #define STDMETHODCALLTYPE __stdcall
 typedef GUID *PGUID;
 
@@ -26,6 +35,18 @@ typedef struct _BDA_FILTER_TEMPLATE
     const BDA_PIN_PAIRING *pPinPairs;
 } BDA_FILTER_TEMPLATE, *PBDA_FILTER_TEMPLATE;
 
+
+typedef struct _KSM_PIN
+{
+    KSMETHOD    Method;
+    __GNU_EXTENSION union
+    {
+        ULONG       PinId;
+        ULONG       PinType;
+    };
+    ULONG       Reserved;
+} KSM_PIN, * PKSM_PIN;
+
 /* Functions */
 
 STDMETHODIMP_(NTSTATUS) BdaCheckChanges(IN PIRP  Irp);
index e01e833..99056f6 100644 (file)
@@ -1,7 +1,17 @@
 /*
  * Cancel-Safe Queue Library
- * Copyright (c) 2004, Vizzini (vizzini@plasmic.com)
- * Licensed under the GNU GPL for the ReactOS project
+ * Created in 2004 by Vizzini (vizzini@plasmic.com)
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
  *
  * This header defines the interface to the ReactOS Cancel-Safe Queue library.
  * This interface is based on and is similar to the Microsoft Cancel-Safe
index 7cbe1e9..d4ecc2c 100644 (file)
 #ifndef _D3DHAL_H_
 #define _D3DHAL_H_
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -787,7 +796,7 @@ typedef struct _DD_GETD3DQUERYCOUNTDATA
 typedef struct _DD_GETD3DQUERYDATA
 {
     DD_GETDRIVERINFO2DATA gdi2;
-    union
+    __GNU_EXTENSION union
     {
         DWORD dwQueryIndex;
         D3DQUERYTYPE QueryType;
index b7bb06e..b396e6f 100644 (file)
@@ -9,6 +9,15 @@
 #include <d3dtypes.h>
 #include <d3dcaps.h>
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -22,17 +31,17 @@ DEFINE_GUID(GUID_DDStereoMode,                   0xF828169C, 0xA8E8, 0x11D2, 0xA
 
 typedef struct _D3DNTHAL_CONTEXTCREATEDATA
 {
-    union
+    __GNU_EXTENSION union
     {
         PDD_DIRECTDRAW_GLOBAL lpDDGbl;
         PDD_DIRECTDRAW_LOCAL lpDDLcl;
     };
-    union
+    __GNU_EXTENSION union
     {
         PDD_SURFACE_LOCAL lpDDS;
         PDD_SURFACE_LOCAL lpDDSLcl;
     };
-    union
+    __GNU_EXTENSION union
     {
         PDD_SURFACE_LOCAL lpDDSZ;
         PDD_SURFACE_LOCAL lpDDSZLcl;
@@ -223,7 +232,7 @@ typedef struct _D3DNTHAL_DRAWPRIMITIVES2DATA
     PDD_SURFACE_LOCAL lpDDCommands;
     DWORD dwCommandOffset;
     DWORD dwCommandLength;
-    union
+    __GNU_EXTENSION union
     {
         PDD_SURFACE_LOCAL lpDDVertex;
         LPVOID lpVertices;
@@ -233,7 +242,7 @@ typedef struct _D3DNTHAL_DRAWPRIMITIVES2DATA
     DWORD dwReqVertexBufSize;
     DWORD dwReqCommandBufSize;
     LPDWORD lpdwRStates;
-    union
+    __GNU_EXTENSION union
     {
         DWORD dwVertexSize;
         HRESULT ddrval;
index 88d52ec..fdd23a9 100644 (file)
 #ifndef __DDKMAPI_INCLUDED__
 #define __DDKMAPI_INCLUDED__
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
 
 #if defined(_DXAPI_)
   #define DXAPI
@@ -219,17 +227,17 @@ typedef struct _DDLOCKOUT
   DWORD  dwFormatFlags;
   DWORD  dwFormatFourCC;
   DWORD  dwFormatBitCount;
-  union
+  __GNU_EXTENSION union
   {
     DWORD  dwRBitMask;
     DWORD  dwYBitMask;
   };
-  union
+  __GNU_EXTENSION union
   {
     DWORD  dwGBitMask;
     DWORD  dwUBitMask;
   };
-  union
+  __GNU_EXTENSION union
   {
     DWORD  dwBBitMask;
     DWORD  dwVBitMask;
index a133f71..6b658ff 100644 (file)
 #ifndef __DDRAWI_INCLUDED__
 #define __DDRAWI_INCLUDED__
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -203,13 +212,13 @@ typedef struct _DDHALMODEINFO {
 typedef struct _VIDMEM {
     DWORD      dwFlags;
     FLATPTR    fpStart;
-    union {
+    __GNU_EXTENSION union {
        FLATPTR         fpEnd;
        DWORD           dwWidth;
     };
     DDSCAPS    ddsCaps;
     DDSCAPS    ddsCapsAlt;
-    union {
+    __GNU_EXTENSION union {
        LPVMEMHEAP      lpHeap;
        DWORD           dwHeight;
     };
@@ -1404,21 +1413,21 @@ typedef struct _DDRAWI_DDRAWSURFACE_INT {
 typedef struct _DDRAWI_DDRAWSURFACE_GBL {
     DWORD                      dwRefCnt;
     DWORD                      dwGlobalFlags;
-    union {
+    __GNU_EXTENSION union {
        LPACCESSRECTLIST        lpRectList;
        DWORD                       dwBlockSizeY;
        LONG                lSlicePitch;
     };
-    union {
+    __GNU_EXTENSION union {
        LPVMEMHEAP              lpVidMemHeap;
        DWORD                   dwBlockSizeX;
     };
-    union {
+    __GNU_EXTENSION union {
        LPDDRAWI_DIRECTDRAW_GBL lpDD;
        LPVOID                  lpDDHandle;
     };
     FLATPTR                    fpVidMem;
-    union {
+    __GNU_EXTENSION union {
        LONG                    lPitch;
        DWORD                   dwLinearSize;
     };
@@ -1454,7 +1463,7 @@ typedef struct _DDRAWI_DDRAWSURFACE_GBL {
 
 typedef struct _DDRAWI_DDRAWSURFACE_GBL_MORE {
     DWORD                      dwSize;
-    union {
+    __GNU_EXTENSION union {
        DWORD                   dwPhysicalPageTable;
        FLATPTR                 fpPhysicalVidMem;
     };
@@ -1551,15 +1560,15 @@ typedef struct _DDRAWI_DDRAWSURFACE_LCL {
     DWORD                      dwProcessId;
     DWORD                      dwFlags;
     DDSCAPS                    ddsCaps;
-       union
+    __GNU_EXTENSION union
     {
-    LPDDRAWI_DDRAWPALETTE_INT  lpDDPalette;
+       LPDDRAWI_DDRAWPALETTE_INT       lpDDPalette;
        LPDDRAWI_DDRAWPALETTE_INT   lp16DDPalette;
-       };
-       union
+    };
+    __GNU_EXTENSION union
     {
-    LPDDRAWI_DDRAWCLIPPER_LCL   lpDDClipper;
-    LPDDRAWI_DDRAWCLIPPER_INT   lp16DDClipper;
+       LPDDRAWI_DDRAWCLIPPER_LCL   lpDDClipper;
+       LPDDRAWI_DDRAWCLIPPER_INT   lp16DDClipper;
     };
     DWORD                      dwModeCreatedIn;
     DWORD                      dwBackBufferCount;
@@ -1628,7 +1637,7 @@ typedef struct _DDRAWI_DDRAWPALETTE_GBL {
     LPDDRAWI_DIRECTDRAW_LCL    lpDD_lcl;
     DWORD                      dwProcessId;
     LPPALETTEENTRY             lpColorTable;
-    union {
+    __GNU_EXTENSION union {
        ULONG_PTR               dwReserved1;
        HPALETTE                hHELGDIPalette;
     };
@@ -1762,7 +1771,7 @@ typedef struct _DDMCBUFFERINFO
 
 typedef struct _DDHAL_GETDRIVERSTATEDATA {
     DWORD                       dwFlags;
-    union
+    __GNU_EXTENSION union
     {
         ULONG_PTR               dwhContext;
     };
index b1af17b..b78c209 100644 (file)
@@ -5,6 +5,14 @@
 #ifndef __DD_INCLUDED__
 #define __DD_INCLUDED__
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
 
 DEFINE_GUID( GUID_MiscellaneousCallbacks,  0xEFD60CC0, 0x49e7, 0x11d0, 0x88, 0x9d, 0x0, 0xaa, 0x0, 0xbb, 0xb7, 0x6a);
 DEFINE_GUID( GUID_Miscellaneous2Callbacks, 0x406B2F00, 0x3E5A, 0x11D1, 0xB6, 0x40, 0x00, 0xAA, 0x00, 0xA1, 0xF9, 0x6A);
@@ -81,14 +89,14 @@ typedef struct _VIDEOMEMORY
 {
     DWORD          dwFlags;
     FLATPTR        fpStart;
-    union
+    __GNU_EXTENSION union
     {
         FLATPTR    fpEnd;
         DWORD      dwWidth;
     };
     DDSCAPS        ddsCaps;
     DDSCAPS        ddsCapsAlt;
-    union
+    __GNU_EXTENSION union
     {
         struct _VMEMHEAP *lpHeap;
         DWORD      dwHeight;
@@ -128,13 +136,13 @@ typedef struct _DD_DIRECTDRAW_LOCAL
 
 typedef struct _DD_SURFACE_GLOBAL
 {
-    union
+    __GNU_EXTENSION union
     {
         DWORD        dwBlockSizeY;
         LONG         lSlicePitch;
     };
 
-    union
+    __GNU_EXTENSION union
     {
         PVIDEOMEMORY lpVidMemHeap;
         DWORD        dwBlockSizeX;
@@ -142,7 +150,7 @@ typedef struct _DD_SURFACE_GLOBAL
     };
 
     FLATPTR          fpVidMem;
-    union
+    __GNU_EXTENSION union
     {
         LONG         lPitch;
         DWORD        dwLinearSize;
@@ -174,12 +182,12 @@ typedef struct _DD_SURFACE_LOCAL
        DWORD              dwFlags;
        DDSCAPS            ddsCaps;
        ULONG_PTR          dwReserved1;
-       union
+       __GNU_EXTENSION union
        {
                DDCOLORKEY     ddckCKSrcOverlay;
                DDCOLORKEY     ddckCKSrcBlt;
        };
-       union
+       __GNU_EXTENSION union
        {
                DDCOLORKEY     ddckCKDestOverlay;
                DDCOLORKEY     ddckCKDestBlt;
@@ -591,7 +599,7 @@ typedef DWORD (WINAPI *PDD_CREATESURFACEEX)(PDD_CREATESURFACEEXDATA);
 typedef struct _DD_GETDRIVERSTATEDATA
 {
        DWORD                     dwFlags;
-       union
+       __GNU_EXTENSION union
        {
                PDD_DIRECTDRAW_GLOBAL lpDD;
                DWORD_PTR             dwhContext;
index ee9b0a9..3d11f0b 100644 (file)
 #ifndef __DMEMMGR_INCLUDED__
 #define __DMEMMGR_INCLUDED__
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -70,7 +79,7 @@ typedef struct _VMEMR
 
 typedef struct _SURFACEALIGNMENT
 {
-  union
+  __GNU_EXTENSION union
   {
     struct
     {
diff --git a/reactos/include/ddk/hubbusif.h b/reactos/include/ddk/hubbusif.h
new file mode 100644 (file)
index 0000000..e03f19e
--- /dev/null
@@ -0,0 +1,782 @@
+#pragma once
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+typedef PVOID PUSB_DEVICE_HANDLE;
+
+typedef struct _ROOTHUB_PDO_EXTENSION {
+  ULONG Signature;
+} ROOTHUB_PDO_EXTENSION, *PROOTHUB_PDO_EXTENSION;
+
+#define USBD_DEVHACK_SLOW_ENUMERATION   0x00000001
+#define USBD_DEVHACK_DISABLE_SN         0x00000002
+#define USBD_DEVHACK_SET_DIAG_ID        0x00000004
+
+#ifndef USB_BUSIFFN
+#define USB_BUSIFFN __stdcall
+#endif
+
+#define CD_ERR_V1       0x00000001
+
+#define ID_ERR_V1       0x00000001
+
+#define USBD_KEEP_DEVICE_DATA   0x00000001
+#define USBD_MARK_DEVICE_BUSY   0x00000002
+
+#define USB_IDLE_NOT_READY                      0
+#define USB_IDLE_READY                          1
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_CREATE_USB_DEVICE (
+  IN PVOID BusContext,
+  OUT PUSB_DEVICE_HANDLE *NewDeviceHandle,
+  IN PUSB_DEVICE_HANDLE HubDeviceHandle,
+  IN USHORT PortStatus,
+  IN USHORT PortNumber);
+
+typedef USB_BUSIFFN_CREATE_USB_DEVICE *PUSB_BUSIFFN_CREATE_USB_DEVICE;
+
+typedef enum _USBPORT_CREATEDEV_ERROR {
+  CreateDevErrNotSet = 0,
+  CreateDevBadHubDevHandle,
+  CreateDevFailedAllocDevHandle,
+  CreateDevFailedOpenEndpoint,
+  CreateDevFailedAllocDsBuff,
+  CreateDevFailedGetDs,
+  CreateDevTtNotFound,
+  CreateDevBadDevHandlePtr
+} USBPORT_CREATEDEV_ERROR;
+
+typedef struct _USB_CD_ERROR_INFORMATION {
+  ULONG  Version;
+  USBPORT_CREATEDEV_ERROR  PathError;
+  ULONG  UlongArg1;
+  ULONG  UlongArg2;
+  NTSTATUS  NtStatus;
+  UCHAR  XtraInfo[64];
+} USB_CD_ERROR_INFORMATION, *PUSB_CD_ERROR_INFORMATION;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_CREATE_USB_DEVICE_EX (
+  IN PVOID  BusContext,
+  OUT PUSB_DEVICE_HANDLE  *NewDeviceHandle,
+  IN PUSB_DEVICE_HANDLE  HsHubDeviceHandle,
+  IN USHORT  PortStatus,
+  IN USHORT  PortNumber,
+  OUT PUSB_CD_ERROR_INFORMATION  CdErrorInfo,
+  IN USHORT TtPortNumber);
+
+typedef USB_BUSIFFN_CREATE_USB_DEVICE_EX *PUSB_BUSIFFN_CREATE_USB_DEVICE_EX;
+
+typedef struct _USB_PORT_PATH {
+  ULONG  PortPathDepth;
+  ULONG  PortPath[6];
+} USB_PORT_PATH, *PUSB_PORT_PATH;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_CREATE_USB_DEVICE_V7 (
+  IN PVOID  BusContext,
+  OUT PUSB_DEVICE_HANDLE  *NewDeviceHandle,
+  IN PUSB_DEVICE_HANDLE  HsHubDeviceHandle,
+  IN USHORT  PortStatus,
+  IN PUSB_PORT_PATH  PortPath,
+  OUT PUSB_CD_ERROR_INFORMATION  CdErrorInfo,
+  IN USHORT  TtPortNumber,
+  IN PDEVICE_OBJECT  PdoDeviceObject,
+  IN PUNICODE_STRING  PhysicalDeviceObjectName);
+
+typedef USB_BUSIFFN_CREATE_USB_DEVICE_V7 *PUSB_BUSIFFN_CREATE_USB_DEVICE_V7;
+
+typedef enum _USBPORT_INITDEV_ERROR {
+  InitDevErrNotSet = 0,
+  InitDevFailedSetAddress,
+  InitDevFailedPokeEndpoint,
+  InitDevBadDeviceDescriptor
+} USBPORT_INITDEV_ERROR;
+
+typedef struct _USB_ID_ERROR_INFORMATION {
+  ULONG Version;
+  USBPORT_INITDEV_ERROR PathError;
+  ULONG Arg1;
+  ULONG UsbAddress;
+  NTSTATUS NtStatus;
+  USBD_STATUS UsbdStatus;
+  UCHAR XtraInfo[64];
+} USB_ID_ERROR_INFORMATION, *PUSB_ID_ERROR_INFORMATION;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_INITIALIZE_USB_DEVICE (
+  IN PVOID  BusContext,
+  IN OUT PUSB_DEVICE_HANDLE  DeviceHandle);
+
+typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX (
+  IN PVOID  BusContext,
+  IN OUT PUSB_DEVICE_HANDLE  DeviceHandle,
+  OUT PUSB_ID_ERROR_INFORMATION  IdErrInfo);
+
+typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_REMOVE_USB_DEVICE (
+  IN PVOID  BusContext,
+  IN OUT PUSB_DEVICE_HANDLE  DeviceHandle,
+  IN ULONG  Flags);
+
+typedef USB_BUSIFFN_REMOVE_USB_DEVICE *PUSB_BUSIFFN_REMOVE_USB_DEVICE;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_GET_USB_DESCRIPTORS (
+  IN PVOID BusContext,
+  IN OUT PUSB_DEVICE_HANDLE DeviceHandle,
+  OUT PUCHAR DeviceDescriptorBuffer,
+  IN OUT PULONG DeviceDescriptorBufferLength,
+  OUT PUCHAR ConfigDescriptorBuffer,
+  IN OUT PULONG ConfigDescriptorBufferLength);
+
+typedef USB_BUSIFFN_GET_USB_DESCRIPTORS *PUSB_BUSIFFN_GET_USB_DESCRIPTORS;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_RESTORE_DEVICE (
+  IN PVOID BusContext,
+  IN OUT PUSB_DEVICE_HANDLE OldDeviceHandle,
+  IN OUT PUSB_DEVICE_HANDLE NewDeviceHandle);
+
+typedef USB_BUSIFFN_RESTORE_DEVICE *PUSB_BUSIFFN_RESTORE_DEVICE;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_GET_POTRTHACK_FLAGS (
+  IN PVOID BusContext,
+  IN OUT PULONG Flags);
+
+typedef USB_BUSIFFN_GET_POTRTHACK_FLAGS *PUSB_BUSIFFN_GET_POTRTHACK_FLAGS;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_GET_DEVICE_INFORMATION (
+  IN PVOID BusContext,
+  IN PUSB_DEVICE_HANDLE DeviceHandle,
+  OUT PVOID DeviceInformationBuffer,
+  IN ULONG DeviceInformationBufferLength,
+  IN OUT PULONG LengthOfDataCopied);
+
+typedef USB_BUSIFFN_GET_DEVICE_INFORMATION *PUSB_BUSIFFN_GET_DEVICE_INFORMATION;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_GET_CONTROLLER_INFORMATION (
+  IN PVOID BusContext,
+  IN OUT PVOID ControllerInformationBuffer,
+  IN ULONG ControllerInformationBufferLength,
+  IN OUT PULONG LengthOfDataCopied);
+
+typedef USB_BUSIFFN_GET_CONTROLLER_INFORMATION *PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND (
+  IN PVOID BusContext,
+  IN BOOLEAN Enable);
+
+typedef USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND *PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_GET_EXTENDED_HUB_INFO (
+  IN PVOID BusContext,
+  IN PDEVICE_OBJECT HubPhysicalDeviceObject,
+  IN PVOID HubInformationBuffer,
+  IN ULONG HubInformationBufferLength,
+  OUT PULONG LengthOfDataCopied);
+
+typedef USB_BUSIFFN_GET_EXTENDED_HUB_INFO *PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_GET_ROOTHUB_SYM_NAME (
+  IN PVOID BusContext,
+  IN PVOID HubSymNameBuffer,
+  IN ULONG HubSymNameBufferLength,
+  OUT PULONG HubSymNameActualLength);
+
+typedef USB_BUSIFFN_GET_ROOTHUB_SYM_NAME *PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME;
+
+typedef
+PVOID
+USB_BUSIFFN
+USB_BUSIFFN_GET_DEVICE_BUSCONTEXT (
+  IN PVOID HubBusContext,
+  IN PVOID DeviceHandle);
+
+typedef USB_BUSIFFN_GET_DEVICE_BUSCONTEXT *PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_INITIALIZE_20HUB (
+  IN PVOID BusContext,
+  IN PUSB_DEVICE_HANDLE HubDeviceHandle,
+  IN ULONG TtCount);
+
+typedef USB_BUSIFFN_INITIALIZE_20HUB *PUSB_BUSIFFN_INITIALIZE_20HUB;
+
+typedef
+BOOLEAN
+USB_BUSIFFN
+USB_BUSIFFN_IS_ROOT (
+  IN PVOID BusContext,
+  IN PVOID DeviceObject);
+
+typedef USB_BUSIFFN_IS_ROOT *PUSB_BUSIFFN_IS_ROOT;
+
+typedef
+VOID
+USB_BUSIFFN
+USB_BUSIFFN_ACQUIRE_SEMAPHORE (
+  IN PVOID BusContext);
+
+typedef USB_BUSIFFN_ACQUIRE_SEMAPHORE *PUSB_BUSIFFN_ACQUIRE_SEMAPHORE;
+
+typedef
+VOID
+USB_BUSIFFN
+USB_BUSIFFN_RELEASE_SEMAPHORE (
+  IN PVOID BusContext);
+
+typedef USB_BUSIFFN_RELEASE_SEMAPHORE *PUSB_BUSIFFN_RELEASE_SEMAPHORE;
+
+typedef
+VOID
+__stdcall
+RH_INIT_CALLBACK (
+  IN PVOID CallBackContext);
+
+typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_ROOTHUB_INIT_NOTIFY (
+  IN PVOID BusContext,
+  IN PVOID CallbackContext,
+  IN PRH_INIT_CALLBACK CallbackRoutine);
+
+typedef USB_BUSIFFN_ROOTHUB_INIT_NOTIFY *PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY;
+
+typedef
+VOID
+USB_BUSIFFN
+USB_BUSIFFN_FLUSH_TRANSFERS (
+  IN PVOID BusContext,
+  IN PVOID DeviceHandle);
+
+typedef USB_BUSIFFN_FLUSH_TRANSFERS *PUSB_BUSIFFN_FLUSH_TRANSFERS;
+
+typedef
+ULONG
+USB_BUSIFFN
+USB_BUSIFFN_CALC_PIPE_BANDWIDTH (
+  IN PVOID BusContext,
+  IN PUSBD_PIPE_INFORMATION PipeInfo,
+  IN USB_DEVICE_SPEED DeviceSpeed);
+
+typedef USB_BUSIFFN_CALC_PIPE_BANDWIDTH *PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH;
+
+typedef
+VOID
+USB_BUSIFFN
+USB_BUSIFFN_SET_BUS_WAKE_MODE (
+  IN PVOID BusContext,
+  IN ULONG Mode);
+
+typedef USB_BUSIFFN_SET_BUS_WAKE_MODE *PUSB_BUSIFFN_SET_BUS_WAKE_MODE;
+
+typedef
+VOID
+USB_BUSIFFN
+USB_BUSIFFN_SET_DEVICE_FLAG (
+  IN PVOID BusContext,
+  IN GUID *DeviceFlagGuid,
+  IN PVOID ValueData,
+  IN ULONG ValueLength);
+
+typedef USB_BUSIFFN_SET_DEVICE_FLAG *PUSB_BUSIFFN_SET_DEVICE_FLAG;
+
+typedef
+VOID
+USB_BUSIFFN
+USB_BUSIFFN_SET_DEVHANDLE_DATA (
+  IN PVOID BusContext,
+  IN PVOID DeviceHandle,
+  IN PDEVICE_OBJECT UsbDevicePdo);
+
+typedef USB_BUSIFFN_SET_DEVHANDLE_DATA *PUSB_BUSIFFN_SET_DEVHANDLE_DATA;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_TEST_POINT (
+  IN PVOID BusContext,
+  IN PVOID DeviceHandle,
+  IN ULONG Opcode,
+  IN PVOID TestData);
+
+typedef USB_BUSIFFN_TEST_POINT *PUSB_BUSIFFN_TEST_POINT;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO (
+  IN PVOID BusContext,
+  IN PUSB_DEVICE_HANDLE DeviceHandle,
+  OUT PVOID DeviceInformationBuffer,
+  IN ULONG DeviceInformationBufferLength,
+  IN OUT PULONG LengthOfDataCopied);
+
+typedef USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO *PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_WAIT_ASYNC_POWERUP (
+  IN PVOID BusContext);
+
+typedef USB_BUSIFFN_WAIT_ASYNC_POWERUP *PUSB_BUSIFFN_WAIT_ASYNC_POWERUP;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_GET_DEVICE_ADDRESS (
+  IN PVOID BusContext,
+  IN PUSB_DEVICE_HANDLE DeviceHandle,
+  OUT PUSHORT DeviceAddress);
+
+typedef USB_BUSIFFN_GET_DEVICE_ADDRESS *PUSB_BUSIFFN_GET_DEVICE_ADDRESS;
+
+typedef
+VOID
+USB_BUSIFFN
+USB_BUSIFFN_DEREF_DEVICE_HANDLE (
+  IN PVOID BusContext,
+  IN PUSB_DEVICE_HANDLE DeviceHandle,
+  IN PVOID Object,
+  IN ULONG Tag);
+
+typedef USB_BUSIFFN_DEREF_DEVICE_HANDLE *PUSB_BUSIFFN_DEREF_DEVICE_HANDLE;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_REF_DEVICE_HANDLE (
+  IN PVOID BusContext,
+  IN PUSB_DEVICE_HANDLE DeviceHandle,
+  IN PVOID Object,
+  IN ULONG Tag);
+
+typedef USB_BUSIFFN_REF_DEVICE_HANDLE *PUSB_BUSIFFN_REF_DEVICE_HANDLE;
+
+typedef
+ULONG
+USB_BUSIFFN
+USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE (
+  IN PVOID BusContext,
+  IN PUSB_DEVICE_HANDLE DeviceHandle,
+  IN ULONG NewIdleReadyState);
+
+typedef USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE *PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT (
+  IN PVOID BusContext,
+  IN USHORT PortNumber,
+  OUT LPGUID ContainerId);
+
+typedef USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT;
+
+typedef
+VOID
+USB_BUSIFFN
+USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT (
+  IN PVOID BusContext,
+  IN USHORT PortNumber,
+  IN LPGUID ContainerId);
+
+typedef USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT;
+
+typedef
+NTSTATUS
+USB_BUSIFFN
+USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES (
+  IN PVOID BusContext,
+  IN PUSB_DEVICE_HANDLE DeviceHandle);
+
+typedef USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES *PUSB_BUSIFFN_ABORT_ALL_DEVICE_PIPES;
+
+#define ERRATA_FLAG_RESET_TT_ON_CANCEL              1
+#define ERRATA_FLAG_NO_CLEAR_TT_BUFFER_ON_CANCEL    2
+
+#define USB_BUSIF_HUB_VERSION_0         0x0000
+#define USB_BUSIF_HUB_VERSION_1         0x0001
+#define USB_BUSIF_HUB_VERSION_2         0x0002
+#define USB_BUSIF_HUB_VERSION_3         0x0003
+#define USB_BUSIF_HUB_VERSION_4         0x0004
+#define USB_BUSIF_HUB_VERSION_5         0x0005
+#define USB_BUSIF_HUB_VERSION_6         0x0006
+#define USB_BUSIF_HUB_VERSION_7         0x0007
+
+#define USB_BUSIF_HUB_MIDUMP_VERSION_0  0x0000
+
+#define USB_BUSIF_HUB_SS_VERSION_0      0x0000
+
+typedef
+VOID
+USB_BUSIFFN
+USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG (
+  IN PVOID BusContext,
+  IN PUSB_DEVICE_HANDLE DeviceHandle,
+  IN ULONG DeviceErrataFlag);
+
+typedef USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG *PUSB_BUSIFFN_SET_DEVICE_ERRATA_FLAG;
+
+DEFINE_GUID(USB_BUS_INTERFACE_HUB_GUID,
+0xb2bb8c0a, 0x5ab4, 0x11d3, 0xa8, 0xcd, 0x0, 0xc0, 0x4f, 0x68, 0x74, 0x7a);
+
+typedef struct _USB_BUS_INTERFACE_HUB_V0 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+} USB_BUS_INTERFACE_HUB_V0, *PUSB_BUS_INTERFACE_HUB_V0;
+
+typedef struct _USB_BUS_INTERFACE_HUB_V1 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
+  PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
+  PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
+  PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
+  PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
+  PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
+  PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
+} USB_BUS_INTERFACE_HUB_V1, *PUSB_BUS_INTERFACE_HUB_V1;
+
+typedef struct _USB_BUS_INTERFACE_HUB_V2 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
+  PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
+  PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
+  PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
+  PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
+  PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
+  PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
+  PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
+  PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
+  PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
+  PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
+  PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;    
+  PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
+} USB_BUS_INTERFACE_HUB_V2, *PUSB_BUS_INTERFACE_HUB_V2;
+
+typedef struct _USB_BUS_INTERFACE_HUB_V3 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
+  PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
+  PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
+  PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
+  PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
+  PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
+  PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
+  PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
+  PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
+  PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
+  PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
+  PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
+  PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
+  PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
+} USB_BUS_INTERFACE_HUB_V3, *PUSB_BUS_INTERFACE_HUB_V3;
+
+typedef struct _USB_BUS_INTERFACE_HUB_V4 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
+  PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
+  PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
+  PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
+  PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
+  PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
+  PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
+  PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
+  PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
+  PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
+  PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
+  PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
+  PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
+  PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
+  PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
+} USB_BUS_INTERFACE_HUB_V4, *PUSB_BUS_INTERFACE_HUB_V4;
+
+typedef struct _USB_BUS_INTERFACE_HUB_V5 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice;
+  PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice;
+  PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
+  PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
+  PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
+  PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
+  PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
+  PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
+  PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
+  PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
+  PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
+  PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
+  PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
+  PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
+  PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
+  PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData;
+} USB_BUS_INTERFACE_HUB_V5, *PUSB_BUS_INTERFACE_HUB_V5;
+
+typedef struct _USB_BUS_INTERFACE_HUB_V6 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_CREATE_USB_DEVICE_EX CreateUsbDevice;
+  PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX InitializeUsbDevice;
+  PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
+  PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
+  PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
+  PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
+  PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
+  PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
+  PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
+  PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
+  PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
+  PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
+  PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
+  PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
+  PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
+  PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData;
+  PUSB_BUSIFFN_IS_ROOT HubIsRoot;
+  PUSB_BUSIFFN_ACQUIRE_SEMAPHORE AcquireBusSemaphore;
+  PUSB_BUSIFFN_RELEASE_SEMAPHORE ReleaseBusSemaphore;
+  PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH CaculatePipeBandwidth;
+  PUSB_BUSIFFN_SET_BUS_WAKE_MODE SetBusSystemWakeMode;
+  PUSB_BUSIFFN_SET_DEVICE_FLAG SetDeviceFlag;
+  PUSB_BUSIFFN_TEST_POINT HubTestPoint;
+  PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO GetDevicePerformanceInfo;
+  PUSB_BUSIFFN_WAIT_ASYNC_POWERUP WaitAsyncPowerUp;
+  PUSB_BUSIFFN_GET_DEVICE_ADDRESS GetDeviceAddress;
+  PUSB_BUSIFFN_REF_DEVICE_HANDLE RefDeviceHandle;
+  PUSB_BUSIFFN_DEREF_DEVICE_HANDLE DerefDeviceHandle;
+  PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE SetDeviceHandleIdleReadyState;
+} USB_BUS_INTERFACE_HUB_V6, *PUSB_BUS_INTERFACE_HUB_V6;
+
+typedef struct _USB_BUS_INTERFACE_HUB_V7 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_CREATE_USB_DEVICE_EX CreateUsbDevice;
+  PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX InitializeUsbDevice;
+  PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors;
+  PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice;
+  PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice;
+  PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags;
+  PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation;
+  PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation;
+  PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend;
+  PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation;
+  PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName;
+  PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext;
+  PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub;
+  PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification;
+  PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers;
+  PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData;
+  PUSB_BUSIFFN_IS_ROOT HubIsRoot;
+  PUSB_BUSIFFN_ACQUIRE_SEMAPHORE AcquireBusSemaphore;
+  PUSB_BUSIFFN_RELEASE_SEMAPHORE ReleaseBusSemaphore;
+  PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH CaculatePipeBandwidth;
+  PUSB_BUSIFFN_SET_BUS_WAKE_MODE SetBusSystemWakeMode;
+  PUSB_BUSIFFN_SET_DEVICE_FLAG SetDeviceFlag;
+  PUSB_BUSIFFN_TEST_POINT HubTestPoint;
+  PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO GetDevicePerformanceInfo;
+  PUSB_BUSIFFN_WAIT_ASYNC_POWERUP WaitAsyncPowerUp;
+  PUSB_BUSIFFN_GET_DEVICE_ADDRESS GetDeviceAddress;
+  PUSB_BUSIFFN_REF_DEVICE_HANDLE RefDeviceHandle;
+  PUSB_BUSIFFN_DEREF_DEVICE_HANDLE DerefDeviceHandle;
+  PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE SetDeviceHandleIdleReadyState;
+  PUSB_BUSIFFN_CREATE_USB_DEVICE_V7 CreateUsbDeviceV7;
+  PUSB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT GetContainerIdForPort;
+  PUSB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT SetContainerIdForPort;
+  PUSB_BUSIFFN_ABORT_ALL_DEVICE_PIPES AbortAllDevicePipes;
+  PUSB_BUSIFFN_SET_DEVICE_ERRATA_FLAG SetDeviceErrataFlag;
+} USB_BUS_INTERFACE_HUB_V7, *PUSB_BUS_INTERFACE_HUB_V7;
+
+DEFINE_GUID(USB_BUS_INTERFACE_HUB_MINIDUMP_GUID,
+0xc5485f21, 0x4e81, 0x4a23, 0xa8, 0xf9, 0xd8, 0x51, 0x8a, 0xf4, 0x5c, 0x38);
+
+typedef VOID
+(USB_BUSIFFN *PUSB_BUSIFFN_SET_MINIDUMP_FLAGS) (
+  IN PVOID);
+
+typedef struct _USB_BUS_INTERFACE_HUB_MINIDUMP {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_SET_MINIDUMP_FLAGS SetUsbPortMiniDumpFlags;
+} USB_BUS_INTERFACE_HUB_MINIDUMP, *PUSB_BUS_INTERFACE_HUB_MINIDUMP;
+
+DEFINE_GUID(USB_BUS_INTERFACE_HUB_SS_GUID, 
+0xbfc3f363, 0x8ba1, 0x4c7b, 0x97, 0xba, 0x9b, 0x12, 0xb1, 0xca, 0x13, 0x2f);
+
+typedef NTSTATUS
+(USB_BUSIFFN *PUSB_BUSIFFN_SUSPEND_HUB) (
+  PDEVICE_OBJECT Pdo);
+
+typedef NTSTATUS
+(USB_BUSIFFN *PUSB_BUSIFFN_RESUME_HUB) (
+  PDEVICE_OBJECT Pdo);
+
+typedef struct _USB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND {
+  USHORT  Size;
+  USHORT  Version;
+  PVOID  BusContext;
+  PINTERFACE_REFERENCE  InterfaceReference;
+  PINTERFACE_DEREFERENCE  InterfaceDereference;
+  PUSB_BUSIFFN_SUSPEND_HUB  SuspendHub;
+  PUSB_BUSIFFN_RESUME_HUB  ResumeHub;
+} USB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND, *PUSB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND;
+
+#include <pshpack1.h>
+
+typedef struct _USB_PIPE_INFORMATION_0 {
+  USB_ENDPOINT_DESCRIPTOR  EndpointDescriptor;
+  UCHAR  ED_Pad[1];
+  ULONG  ScheduleOffset;
+} USB_PIPE_INFORMATION_0, *PUSB_PIPE_INFORMATION_0;
+
+typedef struct _USB_LEVEL_INFORMATION {
+  ULONG  InformationLevel;
+  ULONG  ActualLength;
+} USB_LEVEL_INFORMATION, *PUSB_LEVEL_INFORMATION;
+
+typedef struct _USB_DEVICE_INFORMATION_0 {
+  ULONG  InformationLevel;
+  ULONG  ActualLength;
+  ULONG  PortNumber;
+  USB_DEVICE_DESCRIPTOR  DeviceDescriptor;
+  UCHAR  DD_pad[2];
+  UCHAR  CurrentConfigurationValue;
+  UCHAR  ReservedMBZ;
+  USHORT  DeviceAddress;
+  ULONG  HubAddress;
+  USB_DEVICE_SPEED  DeviceSpeed;
+  USB_DEVICE_TYPE  DeviceType;
+  ULONG  NumberOfOpenPipes;
+  USB_PIPE_INFORMATION_0  PipeList[1];
+} USB_DEVICE_INFORMATION_0, *PUSB_DEVICE_INFORMATION_0;
+
+typedef struct _USB_CONTROLLER_INFORMATION_0 {
+  ULONG  InformationLevel;
+  ULONG  ActualLength;
+  BOOLEAN  SelectiveSuspendEnabled;
+  BOOLEAN  IsHighSpeedController;
+} USB_CONTROLLER_INFORMATION_0, *PUSB_CONTROLLER_INFORMATION_0;
+
+typedef struct _USB_CONTROLLER_INFORMATION_1 {
+  ULONG  InformationLevel;
+  ULONG  ActualLength;
+  BOOLEAN  SelectiveSuspendEnabled;
+  BOOLEAN  IsHighSpeedController;
+  ULONG  HcBusNumber;
+  ULONG  HcBusDevice;
+  ULONG  HcBusFunction;
+} USB_CONTROLLER_INFORMATION_1, *PUSB_CONTROLLER_INFORMATION_1;
+
+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_DEVICE_PERFORMANCE_INFO_0 {
+  ULONG  InformationLevel;
+  ULONG  ActualLength;
+  ULONG  BulkBytes;
+  ULONG  BulkUrbCount;
+  ULONG  ControlDataBytes;
+  ULONG  ControlUrbCount;
+  ULONG  IsoBytes;
+  ULONG  IsoUrbCount;
+  ULONG  InterruptBytes;
+  ULONG  InterruptUrbCount;
+  ULONG  AllocedInterrupt[6];
+  ULONG  AllocedIso;
+  ULONG  Total32secBandwidth;
+  ULONG  TotalTtBandwidth;
+  ULONG  TotalIsoLatency;
+  ULONG  DroppedIsoPackets;
+  ULONG  TransferErrors;
+} USB_DEVICE_PERFORMANCE_INFO_0, *PUSB_DEVICE_PERFORMANCE_INFO_0;
+
+#include <poppack.h>
+
+#endif
index 83da58a..5744a3f 100644 (file)
 #ifndef __IDE_H
 #define __IDE_H
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -104,7 +113,7 @@ typedef struct _EXTENDED_IDENTIFY_DATA {
   USHORT UnformattedBytesPerTrack;   /* 08 */
   USHORT UnformattedBytesPerSector;  /* 10 */
   USHORT NumSectorsPerTrack;         /* 12 */
-  union
+  __GNU_EXTENSION union
   {
     USHORT VendorUnique1[3];         /* 14 */
     struct
index f9776bf..0f1877f 100755 (executable)
@@ -41,6 +41,8 @@ extern "C" {
 #define WRITE_PORT_USHORT(p, v) __outword (H2I(p), (v))
 #define WRITE_PORT_ULONG(p, v) __outdword (H2I(p), (v))
 
+#define MEMORY_BARRIER()    
+
 #elif defined(_PPC_) || defined(_MIPS_) || defined(_ARM_)
 
 #define READ_REGISTER_UCHAR(r)      (*(volatile UCHAR * const)(r))
index b147c25..59fcc52 100644 (file)
@@ -63,6 +63,193 @@ typedef VOID
   IN ULONG  ReadBank,
   IN ULONG  WriteBank,
   IN PVOID  Context);
+  
+#ifndef __BROKEN__
+
+typedef enum _INTERFACE_TYPE {
+    InterfaceTypeUndefined = -1,
+    Internal,
+    Isa,
+    Eisa,
+    MicroChannel,
+    TurboChannel,
+    PCIBus,
+    VMEBus,
+    NuBus,
+    PCMCIABus,
+    CBus,
+    MPIBus,
+    MPSABus,
+    ProcessorInternal,
+    InternalPowerBus,
+    PNPISABus,
+    PNPBus,
+    Vmcs,
+    MaximumInterfaceType
+}INTERFACE_TYPE, *PINTERFACE_TYPE;
+
+typedef enum _KINTERRUPT_MODE {
+    LevelSensitive,
+    Latched
+} KINTERRUPT_MODE;
+
+typedef VOID (*PINTERFACE_REFERENCE)(PVOID Context);
+typedef VOID (*PINTERFACE_DEREFERENCE)(PVOID Context);
+
+typedef enum _BUS_DATA_TYPE {
+    ConfigurationSpaceUndefined = -1,
+    Cmos,
+    EisaConfiguration,
+    Pos,
+    CbusConfiguration,
+    PCIConfiguration,
+    VMEConfiguration,
+    NuBusConfiguration,
+    PCMCIAConfiguration,
+    MPIConfiguration,
+    MPSAConfiguration,
+    PNPISAConfiguration,
+    SgiInternalConfiguration,
+    MaximumBusDataType
+} BUS_DATA_TYPE, *PBUS_DATA_TYPE;
+
+typedef enum _DMA_WIDTH {
+    Width8Bits,
+    Width16Bits,
+    Width32Bits,
+    MaximumDmaWidth
+}DMA_WIDTH, *PDMA_WIDTH;
+
+typedef enum _DMA_SPEED {
+    Compatible,
+    TypeA,
+    TypeB,
+    TypeC,
+    TypeF,
+    MaximumDmaSpeed
+}DMA_SPEED, *PDMA_SPEED;
+
+typedef struct _INTERFACE {
+    USHORT Size;
+    USHORT Version;
+    PVOID Context;
+    PINTERFACE_REFERENCE InterfaceReference;
+    PINTERFACE_DEREFERENCE InterfaceDereference;
+} INTERFACE, *PINTERFACE;
+
+typedef enum _IRQ_DEVICE_POLICY {
+    IrqPolicyMachineDefault = 0,
+    IrqPolicyAllCloseProcessors,
+    IrqPolicyOneCloseProcessor,
+    IrqPolicyAllProcessorsInMachine,
+    IrqPolicySpecifiedProcessors,
+    IrqPolicySpreadMessagesAcrossAllProcessors
+} IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
+
+typedef enum _IRQ_PRIORITY {
+    IrqPriorityUndefined = 0,
+    IrqPriorityLow,
+    IrqPriorityNormal,
+    IrqPriorityHigh
+} IRQ_PRIORITY, *PIRQ_PRIORITY;
+
+typedef struct _IO_RESOURCE_DESCRIPTOR {
+    UCHAR Option;
+    UCHAR Type;                         // use CM_RESOURCE_TYPE
+    UCHAR ShareDisposition;             // use CM_SHARE_DISPOSITION
+    UCHAR Spare1;
+    USHORT Flags;                       // use CM resource flag defines
+    USHORT Spare2;                      // align
+
+    union {
+        struct {
+            ULONG Length;
+            ULONG Alignment;
+            PHYSICAL_ADDRESS MinimumAddress;
+            PHYSICAL_ADDRESS MaximumAddress;
+        } Port;
+
+        struct {
+            ULONG Length;
+            ULONG Alignment;
+            PHYSICAL_ADDRESS MinimumAddress;
+            PHYSICAL_ADDRESS MaximumAddress;
+        } Memory;
+
+        struct {
+            ULONG MinimumVector;
+            ULONG MaximumVector;
+            IRQ_DEVICE_POLICY AffinityPolicy;
+            IRQ_PRIORITY PriorityPolicy;
+            KAFFINITY TargetedProcessors;
+        } Interrupt;
+
+        struct {
+            ULONG MinimumChannel;
+            ULONG MaximumChannel;
+        } Dma;
+
+        struct {
+            ULONG Length;
+            ULONG Alignment;
+            PHYSICAL_ADDRESS MinimumAddress;
+            PHYSICAL_ADDRESS MaximumAddress;
+        } Generic;
+
+        struct {
+            ULONG Data[3];
+        } DevicePrivate;
+
+        //
+        // Bus Number information.
+        //
+
+        struct {
+            ULONG Length;
+            ULONG MinBusNumber;
+            ULONG MaxBusNumber;
+            ULONG Reserved;
+        } BusNumber;
+
+        struct {
+            ULONG Priority;   // use LCPRI_Xxx values in cfg.h
+            ULONG Reserved1;
+            ULONG Reserved2;
+        } ConfigData;
+
+        //
+        // The following structures provide descriptions
+        // for memory resource requirement greater than MAXULONG
+        //
+
+        struct {
+            ULONG Length40;
+            ULONG Alignment40;
+            PHYSICAL_ADDRESS MinimumAddress;
+            PHYSICAL_ADDRESS MaximumAddress;
+        } Memory40;
+
+        struct {
+            ULONG Length48;
+            ULONG Alignment48;
+            PHYSICAL_ADDRESS MinimumAddress;
+            PHYSICAL_ADDRESS MaximumAddress;
+        } Memory48;
+
+        struct {
+            ULONG Length64;
+            ULONG Alignment64;
+            PHYSICAL_ADDRESS MinimumAddress;
+            PHYSICAL_ADDRESS MaximumAddress;
+        } Memory64;
+
+
+    } u;
+
+} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
+
+#include <guiddef.h>
+#endif
 
 #ifdef __cplusplus
 }
index f1d2b22..d8f7532 100644 (file)
 #ifndef __MINITAPE_H
 #define __MINITAPE_H
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -77,9 +86,9 @@ typedef struct _INQUIRYDATA {
        UCHAR  DeviceTypeQualifier : 3;
        UCHAR  DeviceTypeModifier : 7;
        UCHAR  RemovableMedia : 1;
-       union {
+       __GNU_EXTENSION union {
                UCHAR  Versions;
-               struct {
+               __GNU_EXTENSION struct {
                        UCHAR  ANSIVersion : 3;
                        UCHAR  ECMAVersion : 3;
                        UCHAR  ISOVersion : 2;
index 023b103..b08fb68 100644 (file)
 #ifndef __NDIS_H
 #define __NDIS_H
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #include "ntddk.h"
 #include "ntddndis.h"
 #include "netpnp.h"
@@ -238,8 +247,8 @@ typedef union _NDIS_RW_LOCK_REFCOUNT {
 } NDIS_RW_LOCK_REFCOUNT;
 
 typedef struct _NDIS_RW_LOCK {
-  union {
-    struct {
+  __GNU_EXTENSION union {
+    __GNU_EXTENSION struct {
       KSPIN_LOCK  SpinLock;
       PVOID  Context;
     };
@@ -380,16 +389,16 @@ typedef struct _NDIS_PACKET_PRIVATE {
 
 typedef struct _NDIS_PACKET {
   NDIS_PACKET_PRIVATE  Private;
-  union {
-    struct {
+  __GNU_EXTENSION union {
+    __GNU_EXTENSION struct {
       UCHAR  MiniportReserved[2 * sizeof(PVOID)];
       UCHAR  WrapperReserved[2 * sizeof(PVOID)];
     };
-    struct {
+    __GNU_EXTENSION struct {
       UCHAR  MiniportReservedEx[3 * sizeof(PVOID)];
       UCHAR  WrapperReservedEx[sizeof(PVOID)];
     };
-    struct {
+    __GNU_EXTENSION struct {
       UCHAR  MacReserved[4 * sizeof(PVOID)];
     };
   };
@@ -474,7 +483,7 @@ typedef struct _NDIS_REQUEST {
  } DATA;
 #if (defined(NDIS50) || defined(NDIS51))
   UCHAR  NdisReserved[9 * sizeof(PVOID)];
-  union {
+  __GNU_EXTENSION union {
     UCHAR  CallMgrReserved[2 * sizeof(PVOID)];
     UCHAR  ProtocolReserved[2 * sizeof(PVOID)];
   };
index 716609b..c475f2c 100644 (file)
 #ifndef __NTDDDISK_H
 #define __NTDDDISK_H
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #include "ntddstor.h"
 
 #ifdef __cplusplus
@@ -326,6 +335,12 @@ typedef struct _PARTITION_INFORMATION_GPT {
   WCHAR Name  [36];
 } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
 
+typedef enum _PARTITION_STYLE {
+  PARTITION_STYLE_MBR,
+  PARTITION_STYLE_GPT,
+  PARTITION_STYLE_RAW
+} PARTITION_STYLE;
+
 typedef struct _DISK_PARTITION_INFO {
   ULONG  SizeOfPartitionInfo;
   PARTITION_STYLE  PartitionStyle;
@@ -394,7 +409,7 @@ typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
 typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
   ULONG  PartitionStyle;
   ULONG  PartitionCount;
-  union {
+  __GNU_EXTENSION union {
     DRIVE_LAYOUT_INFORMATION_MBR  Mbr;
     DRIVE_LAYOUT_INFORMATION_GPT  Gpt;
   };
index ab3ec37..0475b3a 100644 (file)
 #ifndef _NTDDK_
 #define _NTDDK_
 
-//
-// Dependencies
-//
+#if !defined(_NTHAL_) && !defined(_NTIFS_)
+#define _NTDDK_INCLUDED_
+#define _DDK_DRIVER_
+#endif
+
+/* Dependencies */
+
 #define NT_INCLUDED
+#define _CTYPE_DISABLE_MACROS
+
 #include <wdm.h>
 #include <excpt.h>
 #include <ntdef.h>
 #include <ntstatus.h>
 
+/* FIXME
+#include <bugcodes.h>
+#include <ntiologc.h>
+*/
+
 #include <stdarg.h> // FIXME
 #include <basetyps.h> // FIXME
 
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _LOADER_PARAMETER_BLOCK;
+struct _CREATE_DISK;
+struct _DRIVE_LAYOUT_INFORMATION_EX;
+struct _SET_PARTITION_INFORMATION_EX;
 
 //
 // GUID and UUID
 #endif
 typedef GUID UUID;
 
+typedef struct _BUS_HANDLER *PBUS_HANDLER;
+
+#define EXCEPTION_READ_FAULT    0
+#define EXCEPTION_WRITE_FAULT   1
+#define EXCEPTION_EXECUTE_FAULT 8
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+extern NTSYSAPI volatile CCHAR KeNumberProcessors;
+#elif (NTDDI_VERSION >= NTDDI_WINXP)
+extern NTSYSAPI CCHAR KeNumberProcessors;
+#else
+extern PCCHAR KeNumberProcessors;
+#endif
+
+#define MAX_WOW64_SHARED_ENTRIES 16
+
+#define NX_SUPPORT_POLICY_ALWAYSOFF 0
+#define NX_SUPPORT_POLICY_ALWAYSON 1
+#define NX_SUPPORT_POLICY_OPTIN 2
+#define NX_SUPPORT_POLICY_OPTOUT 3
+
+/*
+** IRP function codes
+*/
+
+#define IRP_MN_QUERY_DIRECTORY            0x01
+#define IRP_MN_NOTIFY_CHANGE_DIRECTORY    0x02
+
+#define IRP_MN_USER_FS_REQUEST            0x00
+#define IRP_MN_MOUNT_VOLUME               0x01
+#define IRP_MN_VERIFY_VOLUME              0x02
+#define IRP_MN_LOAD_FILE_SYSTEM           0x03
+#define IRP_MN_TRACK_LINK                 0x04
+#define IRP_MN_KERNEL_CALL                0x04
+
+#define IRP_MN_LOCK                       0x01
+#define IRP_MN_UNLOCK_SINGLE              0x02
+#define IRP_MN_UNLOCK_ALL                 0x03
+#define IRP_MN_UNLOCK_ALL_BY_KEY          0x04
+
+#define IRP_MN_FLUSH_AND_PURGE          0x01
+
+#define IRP_MN_NORMAL                     0x00
+#define IRP_MN_DPC                        0x01
+#define IRP_MN_MDL                        0x02
+#define IRP_MN_COMPLETE                   0x04
+#define IRP_MN_COMPRESSED                 0x08
+
+#define IRP_MN_MDL_DPC                    (IRP_MN_MDL | IRP_MN_DPC)
+#define IRP_MN_COMPLETE_MDL               (IRP_MN_COMPLETE | IRP_MN_MDL)
+#define IRP_MN_COMPLETE_MDL_DPC           (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
+
+#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
+
+typedef struct _IO_COUNTERS {
+  ULONGLONG ReadOperationCount;
+  ULONGLONG WriteOperationCount;
+  ULONGLONG OtherOperationCount;
+  ULONGLONG ReadTransferCount;
+  ULONGLONG WriteTransferCount;
+  ULONGLONG OtherTransferCount;
+} IO_COUNTERS, *PIO_COUNTERS;
+
+typedef struct _VM_COUNTERS {
+  SIZE_T PeakVirtualSize;
+  SIZE_T VirtualSize;
+  ULONG PageFaultCount;
+  SIZE_T PeakWorkingSetSize;
+  SIZE_T WorkingSetSize;
+  SIZE_T QuotaPeakPagedPoolUsage;
+  SIZE_T QuotaPagedPoolUsage;
+  SIZE_T QuotaPeakNonPagedPoolUsage;
+  SIZE_T QuotaNonPagedPoolUsage;
+  SIZE_T PagefileUsage;
+  SIZE_T PeakPagefileUsage;
+} VM_COUNTERS, *PVM_COUNTERS;
+
+typedef struct _VM_COUNTERS_EX
+{
+  SIZE_T PeakVirtualSize;
+  SIZE_T VirtualSize;
+  ULONG PageFaultCount;
+  SIZE_T PeakWorkingSetSize;
+  SIZE_T WorkingSetSize;
+  SIZE_T QuotaPeakPagedPoolUsage;
+  SIZE_T QuotaPagedPoolUsage;
+  SIZE_T QuotaPeakNonPagedPoolUsage;
+  SIZE_T QuotaNonPagedPoolUsage;
+  SIZE_T PagefileUsage;
+  SIZE_T PeakPagefileUsage;
+  SIZE_T PrivateUsage;
+} VM_COUNTERS_EX, *PVM_COUNTERS_EX;
+
+typedef struct _POOLED_USAGE_AND_LIMITS
+{
+  SIZE_T PeakPagedPoolUsage;
+  SIZE_T PagedPoolUsage;
+  SIZE_T PagedPoolLimit;
+  SIZE_T PeakNonPagedPoolUsage;
+  SIZE_T NonPagedPoolUsage;
+  SIZE_T NonPagedPoolLimit;
+  SIZE_T PeakPagefileUsage;
+  SIZE_T PagefileUsage;
+  SIZE_T PagefileLimit;
+} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
+
+/* DEVICE_OBJECT.Flags */
+
+#define DO_VERIFY_VOLUME                    0x00000002
+#define DO_BUFFERED_IO                      0x00000004
+#define DO_EXCLUSIVE                        0x00000008
+#define DO_DIRECT_IO                        0x00000010
+#define DO_MAP_IO_BUFFER                    0x00000020
+#define DO_DEVICE_HAS_NAME                  0x00000040
+#define DO_DEVICE_INITIALIZING              0x00000080
+#define DO_SYSTEM_BOOT_PARTITION            0x00000100
+#define DO_LONG_TERM_REQUESTS               0x00000200
+#define DO_NEVER_LAST_DEVICE                0x00000400
+#define DO_SHUTDOWN_REGISTERED              0x00000800
+#define DO_BUS_ENUMERATED_DEVICE            0x00001000
+#define DO_POWER_PAGABLE                    0x00002000
+#define DO_POWER_INRUSH                     0x00004000
+#define DO_LOW_PRIORITY_FILESYSTEM          0x00010000
+#define DO_SUPPORTS_TRANSACTIONS            0x00040000
+#define DO_FORCE_NEITHER_IO                 0x00080000
+#define DO_VOLUME_DEVICE_OBJECT             0x00100000
+#define DO_SYSTEM_SYSTEM_PARTITION          0x00200000
+#define DO_SYSTEM_CRITICAL_PARTITION        0x00400000
+#define DO_DISALLOW_EXECUTE                 0x00800000
+
+#define DRVO_REINIT_REGISTERED          0x00000008
+#define DRVO_INITIALIZED                0x00000010
+#define DRVO_BOOTREINIT_REGISTERED      0x00000020
+#define DRVO_LEGACY_RESOURCES           0x00000040
+
+typedef enum _ARBITER_REQUEST_SOURCE {
+  ArbiterRequestUndefined = -1,
+  ArbiterRequestLegacyReported,
+  ArbiterRequestHalReported,
+  ArbiterRequestLegacyAssigned,
+  ArbiterRequestPnpDetected,
+  ArbiterRequestPnpEnumerated
+} ARBITER_REQUEST_SOURCE;
+
+typedef enum _ARBITER_RESULT {
+  ArbiterResultUndefined = -1,
+  ArbiterResultSuccess,
+  ArbiterResultExternalConflict,
+  ArbiterResultNullRequest
+} ARBITER_RESULT;
+
+typedef enum _ARBITER_ACTION {
+  ArbiterActionTestAllocation,
+  ArbiterActionRetestAllocation,
+  ArbiterActionCommitAllocation,
+  ArbiterActionRollbackAllocation,
+  ArbiterActionQueryAllocatedResources,
+  ArbiterActionWriteReservedResources,
+  ArbiterActionQueryConflict,
+  ArbiterActionQueryArbitrate,
+  ArbiterActionAddReserved,
+  ArbiterActionBootAllocation
+} ARBITER_ACTION, *PARBITER_ACTION;
+
+typedef struct _ARBITER_CONFLICT_INFO {
+  PDEVICE_OBJECT OwningObject;
+  ULONGLONG Start;
+  ULONGLONG End;
+} ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
+
+typedef struct _ARBITER_PARAMETERS {
+  union {
+    struct {
+      IN OUT PLIST_ENTRY ArbitrationList;
+      IN ULONG AllocateFromCount;
+      IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
+    } TestAllocation;
+    struct {
+      IN OUT PLIST_ENTRY ArbitrationList;
+      IN ULONG AllocateFromCount;
+      IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
+    } RetestAllocation;
+    struct {
+      IN OUT PLIST_ENTRY ArbitrationList;
+    } BootAllocation;
+    struct {
+      OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
+    } QueryAllocatedResources;
+    struct {
+      IN PDEVICE_OBJECT PhysicalDeviceObject;
+      IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
+      OUT PULONG ConflictCount;
+      OUT PARBITER_CONFLICT_INFO *Conflicts;
+    } QueryConflict;
+    struct {
+      IN PLIST_ENTRY ArbitrationList;
+    } QueryArbitrate;
+    struct {
+      IN PDEVICE_OBJECT ReserveDevice;
+    } AddReserved;
+  } Parameters;
+} ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
+
+#define ARBITER_FLAG_BOOT_CONFIG 0x00000001
+
+typedef struct _ARBITER_LIST_ENTRY {
+  LIST_ENTRY ListEntry;
+  ULONG AlternativeCount;
+  PIO_RESOURCE_DESCRIPTOR Alternatives;
+  PDEVICE_OBJECT PhysicalDeviceObject;
+  ARBITER_REQUEST_SOURCE RequestSource;
+  ULONG Flags;
+  LONG_PTR WorkSpace;
+  INTERFACE_TYPE InterfaceType;
+  ULONG SlotNumber;
+  ULONG BusNumber;
+  PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
+  PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
+  ARBITER_RESULT Result;
+} ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
+
+typedef NTSTATUS
+(NTAPI *PARBITER_HANDLER)(
+  IN OUT PVOID Context,
+  IN ARBITER_ACTION Action,
+  IN OUT PARBITER_PARAMETERS Parameters);
+
+#define ARBITER_PARTIAL 0x00000001
+
+typedef struct _ARBITER_INTERFACE {
+  USHORT Size;
+  USHORT Version;
+  PVOID Context;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PARBITER_HANDLER ArbiterHandler;
+  ULONG Flags;
+} ARBITER_INTERFACE, *PARBITER_INTERFACE;
+
+typedef enum _HAL_QUERY_INFORMATION_CLASS {
+  HalInstalledBusInformation,
+  HalProfileSourceInformation,
+  HalInformationClassUnused1,
+  HalPowerInformation,
+  HalProcessorSpeedInformation,
+  HalCallbackInformation,
+  HalMapRegisterInformation,
+  HalMcaLogInformation,
+  HalFrameBufferCachingInformation,
+  HalDisplayBiosInformation,
+  HalProcessorFeatureInformation,
+  HalNumaTopologyInterface,
+  HalErrorInformation,
+  HalCmcLogInformation,
+  HalCpeLogInformation,
+  HalQueryMcaInterface,
+  HalQueryAMLIIllegalIOPortAddresses,
+  HalQueryMaxHotPlugMemoryAddress,
+  HalPartitionIpiInterface,
+  HalPlatformInformation,
+  HalQueryProfileSourceList,
+  HalInitLogInformation,
+  HalFrequencyInformation,
+  HalProcessorBrandString,
+  HalHypervisorInformation,
+  HalPlatformTimerInformation,
+  HalAcpiAuditInformation
+} HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
+
+typedef enum _HAL_SET_INFORMATION_CLASS {
+  HalProfileSourceInterval,
+  HalProfileSourceInterruptHandler,
+  HalMcaRegisterDriver,
+  HalKernelErrorHandler,
+  HalCmcRegisterDriver,
+  HalCpeRegisterDriver,
+  HalMcaLog,
+  HalCmcLog,
+  HalCpeLog,
+  HalGenerateCmcInterrupt,
+  HalProfileSourceTimerHandler,
+  HalEnlightenment,
+  HalProfileDpgoSourceInterruptHandler
+} HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
+
+typedef struct _HAL_PROFILE_SOURCE_INTERVAL {
+  KPROFILE_SOURCE Source;
+  ULONG_PTR Interval;
+} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
+
+typedef struct _HAL_PROFILE_SOURCE_INFORMATION {
+  KPROFILE_SOURCE Source;
+  BOOLEAN Supported;
+  ULONG Interval;
+} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
+
+typedef struct _MAP_REGISTER_ENTRY {
+  PVOID MapRegister;
+  BOOLEAN WriteToDevice;
+} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
+
+typedef struct _DEBUG_DEVICE_ADDRESS {
+  UCHAR Type;
+  BOOLEAN Valid;
+  UCHAR Reserved[2];
+  PUCHAR TranslatedAddress;
+  ULONG Length;
+} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
+
+typedef struct _DEBUG_MEMORY_REQUIREMENTS {
+  PHYSICAL_ADDRESS Start;
+  PHYSICAL_ADDRESS MaxEnd;
+  PVOID VirtualAddress;
+  ULONG Length;
+  BOOLEAN Cached;
+  BOOLEAN Aligned;
+} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
+
+typedef struct _DEBUG_DEVICE_DESCRIPTOR {
+  ULONG Bus;
+  ULONG Slot;
+  USHORT Segment;
+  USHORT VendorID;
+  USHORT DeviceID;
+  UCHAR BaseClass;
+  UCHAR SubClass;
+  UCHAR ProgIf;
+  BOOLEAN Initialized;
+  BOOLEAN Configured;
+  DEBUG_DEVICE_ADDRESS BaseAddress[6];
+  DEBUG_MEMORY_REQUIREMENTS Memory;
+} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
+
+typedef struct _PM_DISPATCH_TABLE {
+  ULONG Signature;
+  ULONG Version;
+  PVOID Function[1];
+} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
+
+typedef enum _RESOURCE_TRANSLATION_DIRECTION {
+  TranslateChildToParent,
+  TranslateParentToChild
+} RESOURCE_TRANSLATION_DIRECTION;
+
+typedef NTSTATUS
+(NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
+  IN OUT PVOID Context,
+  IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
+  IN RESOURCE_TRANSLATION_DIRECTION Direction,
+  IN ULONG AlternativesCount OPTIONAL,
+  IN IO_RESOURCE_DESCRIPTOR Alternatives[],
+  IN PDEVICE_OBJECT PhysicalDeviceObject,
+  OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
+
+typedef NTSTATUS
+(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
+  IN PVOID Context OPTIONAL,
+  IN PIO_RESOURCE_DESCRIPTOR Source,
+  IN PDEVICE_OBJECT PhysicalDeviceObject,
+  OUT PULONG TargetCount,
+  OUT PIO_RESOURCE_DESCRIPTOR *Target);
+
+typedef struct _TRANSLATOR_INTERFACE {
+  USHORT Size;
+  USHORT Version;
+  PVOID Context;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PTRANSLATE_RESOURCE_HANDLER TranslateResources;
+  PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
+} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
+
+typedef VOID
+(FASTCALL *pHalExamineMBR)(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG SectorSize,
+  IN ULONG MBRTypeIdentifier,
+  OUT PVOID *Buffer);
+
+typedef NTSTATUS
+(FASTCALL *pHalIoReadPartitionTable)(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG SectorSize,
+  IN BOOLEAN ReturnRecognizedPartitions,
+  OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
+
+typedef NTSTATUS
+(FASTCALL *pHalIoSetPartitionInformation)(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG SectorSize,
+  IN ULONG PartitionNumber,
+  IN ULONG PartitionType);
+
+typedef NTSTATUS
+(FASTCALL *pHalIoWritePartitionTable)(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG SectorSize,
+  IN ULONG SectorsPerTrack,
+  IN ULONG NumberOfHeads,
+  IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
+
+typedef PBUS_HANDLER
+(FASTCALL *pHalHandlerForBus)(
+  IN INTERFACE_TYPE InterfaceType,
+  IN ULONG BusNumber);
+
+typedef VOID
+(FASTCALL *pHalReferenceBusHandler)(
+  IN PBUS_HANDLER BusHandler);
+
+typedef NTSTATUS
+(NTAPI *pHalQuerySystemInformation)(
+  IN HAL_QUERY_INFORMATION_CLASS InformationClass,
+  IN ULONG BufferSize,
+  IN OUT PVOID Buffer,
+  OUT PULONG ReturnedLength);
+
+typedef NTSTATUS
+(NTAPI *pHalSetSystemInformation)(
+  IN HAL_SET_INFORMATION_CLASS InformationClass,
+  IN ULONG BufferSize,
+  IN PVOID Buffer);
+
+typedef NTSTATUS
+(NTAPI *pHalQueryBusSlots)(
+  IN PBUS_HANDLER BusHandler,
+  IN ULONG BufferSize,
+  OUT PULONG SlotNumbers,
+  OUT PULONG ReturnedLength);
+
+typedef NTSTATUS
+(NTAPI *pHalInitPnpDriver)(
+  VOID);
+
+typedef NTSTATUS
+(NTAPI *pHalInitPowerManagement)(
+  IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
+  OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
+
+typedef struct _DMA_ADAPTER*
+(NTAPI *pHalGetDmaAdapter)(
+  IN PVOID Context,
+  IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
+  OUT PULONG NumberOfMapRegisters);
+
+typedef NTSTATUS
+(NTAPI *pHalGetInterruptTranslator)(
+  IN INTERFACE_TYPE ParentInterfaceType,
+  IN ULONG ParentBusNumber,
+  IN INTERFACE_TYPE BridgeInterfaceType,
+  IN USHORT Size,
+  IN USHORT Version,
+  OUT PTRANSLATOR_INTERFACE Translator,
+  OUT PULONG BridgeBusNumber);
+
+typedef NTSTATUS
+(NTAPI *pHalStartMirroring)(
+  VOID);
+
+typedef NTSTATUS
+(NTAPI *pHalEndMirroring)(
+  IN ULONG PassNumber);
+
+typedef NTSTATUS
+(NTAPI *pHalMirrorPhysicalMemory)(
+  IN PHYSICAL_ADDRESS PhysicalAddress,
+  IN LARGE_INTEGER NumberOfBytes);
+
+typedef NTSTATUS
+(NTAPI *pHalMirrorVerify)(
+  IN PHYSICAL_ADDRESS PhysicalAddress,
+  IN LARGE_INTEGER NumberOfBytes);
+
+typedef VOID
+(NTAPI *pHalEndOfBoot)(
+  VOID);
+
+typedef
+BOOLEAN
+(NTAPI *pHalTranslateBusAddress)(
+  IN INTERFACE_TYPE InterfaceType,
+  IN ULONG BusNumber,
+  IN PHYSICAL_ADDRESS BusAddress,
+  IN OUT PULONG AddressSpace,
+  OUT PPHYSICAL_ADDRESS TranslatedAddress);
+
+typedef
+NTSTATUS
+(NTAPI *pHalAssignSlotResources)(
+  IN PUNICODE_STRING RegistryPath,
+  IN PUNICODE_STRING DriverClassName OPTIONAL,
+  IN PDRIVER_OBJECT DriverObject,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN INTERFACE_TYPE BusType,
+  IN ULONG BusNumber,
+  IN ULONG SlotNumber,
+  IN OUT PCM_RESOURCE_LIST *AllocatedResources);
+
+typedef
+VOID
+(NTAPI *pHalHaltSystem)(
+  VOID);
+
+typedef
+BOOLEAN
+(NTAPI *pHalResetDisplay)(
+  VOID);
+
+typedef
+UCHAR
+(NTAPI *pHalVectorToIDTEntry)(
+  ULONG Vector);
+
+typedef
+BOOLEAN
+(NTAPI *pHalFindBusAddressTranslation)(
+  IN PHYSICAL_ADDRESS BusAddress,
+  IN OUT PULONG AddressSpace,
+  OUT PPHYSICAL_ADDRESS TranslatedAddress,
+  IN OUT PULONG_PTR Context,
+  IN BOOLEAN NextBus);
+
+typedef
+NTSTATUS
+(NTAPI *pKdSetupPciDeviceForDebugging)(
+  IN PVOID LoaderBlock OPTIONAL,
+  IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
+
+typedef
+NTSTATUS
+(NTAPI *pKdReleasePciDeviceForDebugging)(
+  IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
+
+typedef
+PVOID
+(NTAPI *pKdGetAcpiTablePhase0)(
+  IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
+  IN ULONG Signature);
+
+typedef
+PVOID
+(NTAPI *pHalGetAcpiTable)(
+  IN ULONG Signature,
+  IN PCSTR OemId OPTIONAL,
+  IN PCSTR OemTableId OPTIONAL);
+  
+typedef
+VOID
+(NTAPI *pKdCheckPowerButton)(
+  VOID);
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+typedef
+PVOID
+(NTAPI *pKdMapPhysicalMemory64)(
+  IN PHYSICAL_ADDRESS PhysicalAddress,
+  IN ULONG NumberPages,
+  IN BOOLEAN FlushCurrentTLB);
+
+typedef
+VOID
+(NTAPI *pKdUnmapVirtualAddress)(
+  IN PVOID VirtualAddress,
+  IN ULONG NumberPages,
+  IN BOOLEAN FlushCurrentTLB);
+#else
+typedef
+PVOID
+(NTAPI *pKdMapPhysicalMemory64)(
+  IN PHYSICAL_ADDRESS PhysicalAddress,
+  IN ULONG NumberPages);
+
+typedef
+VOID
+(NTAPI *pKdUnmapVirtualAddress)(
+  IN PVOID VirtualAddress,
+  IN ULONG NumberPages);
+#endif
+
+
+typedef
+ULONG
+(NTAPI *pKdGetPciDataByOffset)(
+  IN ULONG BusNumber,
+  IN ULONG SlotNumber,
+  OUT PVOID Buffer,
+  IN ULONG Offset,
+  IN ULONG Length);
+
+typedef
+ULONG
+(NTAPI *pKdSetPciDataByOffset)(
+  IN ULONG BusNumber,
+  IN ULONG SlotNumber,
+  IN PVOID Buffer,
+  IN ULONG Offset,
+  IN ULONG Length);
+
+typedef BOOLEAN
+(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
+  IN ULONG Columns,
+  IN ULONG Rows);
+
+typedef
+VOID
+(NTAPI *PCI_ERROR_HANDLER_CALLBACK)(
+  VOID);
+
+typedef
+VOID
+(NTAPI *pHalSetPciErrorHandlerCallback)(
+  IN PCI_ERROR_HANDLER_CALLBACK Callback);
+
+#if 1 /* Not present in WDK 7600 */
+typedef VOID
+(FASTCALL *pHalIoAssignDriveLetters)(
+  IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
+  IN PSTRING NtDeviceName,
+  OUT PUCHAR NtSystemPath,
+  OUT PSTRING NtSystemPathString);
+#endif
+
+typedef struct {
+  ULONG Version;
+  pHalQuerySystemInformation HalQuerySystemInformation;
+  pHalSetSystemInformation HalSetSystemInformation;
+  pHalQueryBusSlots HalQueryBusSlots;
+  ULONG Spare1;
+  pHalExamineMBR HalExamineMBR;
+#if 1 /* Not present in WDK 7600 */
+  pHalIoAssignDriveLetters HalIoAssignDriveLetters;
+#endif
+  pHalIoReadPartitionTable HalIoReadPartitionTable;
+  pHalIoSetPartitionInformation HalIoSetPartitionInformation;
+  pHalIoWritePartitionTable HalIoWritePartitionTable;
+  pHalHandlerForBus HalReferenceHandlerForBus;
+  pHalReferenceBusHandler HalReferenceBusHandler;
+  pHalReferenceBusHandler HalDereferenceBusHandler;
+  pHalInitPnpDriver HalInitPnpDriver;
+  pHalInitPowerManagement HalInitPowerManagement;
+  pHalGetDmaAdapter HalGetDmaAdapter;
+  pHalGetInterruptTranslator HalGetInterruptTranslator;
+  pHalStartMirroring HalStartMirroring;
+  pHalEndMirroring HalEndMirroring;
+  pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
+  pHalEndOfBoot HalEndOfBoot;
+  pHalMirrorVerify HalMirrorVerify;
+  pHalGetAcpiTable HalGetCachedAcpiTable;
+  pHalSetPciErrorHandlerCallback  HalSetPciErrorHandlerCallback;
+#if defined(_IA64_)
+  pHalGetErrorCapList HalGetErrorCapList;
+  pHalInjectError HalInjectError;
+#endif
+} HAL_DISPATCH, *PHAL_DISPATCH;
+
+/* GCC/MSVC and WDK compatible declaration */
+extern NTKERNELAPI HAL_DISPATCH HalDispatchTable;
+
+#if defined(_NTOSKRNL_) || defined(_BLDR_)
+#define HALDISPATCH (&HalDispatchTable)
+#else
+/* This is a WDK compatibility definition */
+#define HalDispatchTable (&HalDispatchTable)
+#define HALDISPATCH HalDispatchTable
+#endif
+
+#define HAL_DISPATCH_VERSION            3 /* FIXME: when to use 4? */
+#define HalDispatchTableVersion         HALDISPATCH->Version
+#define HalQuerySystemInformation       HALDISPATCH->HalQuerySystemInformation
+#define HalSetSystemInformation         HALDISPATCH->HalSetSystemInformation
+#define HalQueryBusSlots                HALDISPATCH->HalQueryBusSlots
+#define HalReferenceHandlerForBus       HALDISPATCH->HalReferenceHandlerForBus
+#define HalReferenceBusHandler          HALDISPATCH->HalReferenceBusHandler
+#define HalDereferenceBusHandler        HALDISPATCH->HalDereferenceBusHandler
+#define HalInitPnpDriver                HALDISPATCH->HalInitPnpDriver
+#define HalInitPowerManagement          HALDISPATCH->HalInitPowerManagement
+#define HalGetDmaAdapter                HALDISPATCH->HalGetDmaAdapter
+#define HalGetInterruptTranslator       HALDISPATCH->HalGetInterruptTranslator
+#define HalStartMirroring               HALDISPATCH->HalStartMirroring
+#define HalEndMirroring                 HALDISPATCH->HalEndMirroring
+#define HalMirrorPhysicalMemory         HALDISPATCH->HalMirrorPhysicalMemory
+#define HalEndOfBoot                    HALDISPATCH->HalEndOfBoot
+#define HalMirrorVerify                 HALDISPATCH->HalMirrorVerify
+
+typedef struct _FILE_ALIGNMENT_INFORMATION {
+  ULONG AlignmentRequirement;
+} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
+
+typedef struct _FILE_NAME_INFORMATION {
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
+
+
+typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
+  ULONG FileAttributes;
+  ULONG ReparseTag;
+} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
+
+typedef struct _FILE_DISPOSITION_INFORMATION {
+  BOOLEAN DeleteFile;
+} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
+
+typedef struct _FILE_END_OF_FILE_INFORMATION {
+  LARGE_INTEGER EndOfFile;
+} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
+
+typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
+  LARGE_INTEGER ValidDataLength;
+} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
+
+typedef union _FILE_SEGMENT_ELEMENT {
+  PVOID64 Buffer;
+  ULONGLONG Alignment;
+}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
+
+#define SE_UNSOLICITED_INPUT_PRIVILEGE    6
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSYSAPI
+ULONGLONG
+NTAPI
+VerSetConditionMask(
+  IN ULONGLONG ConditionMask,
+  IN ULONG TypeMask,
+  IN UCHAR Condition);
+#endif
+
+#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType)  \
+        ((ConditionMask) = VerSetConditionMask((ConditionMask), \
+        (TypeBitMask), (ComparisonType)))
+
+/* RtlVerifyVersionInfo() TypeMask */
+
+#define VER_MINORVERSION                  0x0000001
+#define VER_MAJORVERSION                  0x0000002
+#define VER_BUILDNUMBER                   0x0000004
+#define VER_PLATFORMID                    0x0000008
+#define VER_SERVICEPACKMINOR              0x0000010
+#define VER_SERVICEPACKMAJOR              0x0000020
+#define VER_SUITENAME                     0x0000040
+#define VER_PRODUCT_TYPE                  0x0000080
+
+/* RtlVerifyVersionInfo() ComparisonType */
+
+#define VER_EQUAL                       1
+#define VER_GREATER                     2
+#define VER_GREATER_EQUAL               3
+#define VER_LESS                        4
+#define VER_LESS_EQUAL                  5
+#define VER_AND                         6
+#define VER_OR                          7
+
+#define VER_CONDITION_MASK              7
+#define VER_NUM_BITS_PER_CONDITION_MASK 3
+
+typedef struct _IMAGE_INFO {
+  _ANONYMOUS_UNION union {
+    ULONG Properties;
+    _ANONYMOUS_STRUCT struct {
+      ULONG ImageAddressingMode:8;
+      ULONG SystemModeImage:1;
+      ULONG ImageMappedToAllPids:1;
+      ULONG ExtendedInfoPresent:1;
+      ULONG Reserved:22;
+    } DUMMYSTRUCTNAME;
+  } DUMMYUNIONNAME;
+  PVOID ImageBase;
+  ULONG ImageSelector;
+  SIZE_T ImageSize;
+  ULONG ImageSectionNumber;
+} IMAGE_INFO, *PIMAGE_INFO;
+
+#define IMAGE_ADDRESSING_MODE_32BIT       3
+
+typedef enum _BUS_DATA_TYPE {
+  ConfigurationSpaceUndefined = -1,
+  Cmos,
+  EisaConfiguration,
+  Pos,
+  CbusConfiguration,
+  PCIConfiguration,
+  VMEConfiguration,
+  NuBusConfiguration,
+  PCMCIAConfiguration,
+  MPIConfiguration,
+  MPSAConfiguration,
+  PNPISAConfiguration,
+  SgiInternalConfiguration,
+  MaximumBusDataType
+} BUS_DATA_TYPE, *PBUS_DATA_TYPE;
+
+typedef struct _NT_TIB {
+  struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
+  PVOID StackBase;
+  PVOID StackLimit;
+  PVOID SubSystemTib;
+  _ANONYMOUS_UNION union {
+    PVOID FiberData;
+    ULONG Version;
+  } DUMMYUNIONNAME;
+  PVOID ArbitraryUserPointer;
+  struct _NT_TIB *Self;
+} NT_TIB, *PNT_TIB;
+
+typedef struct _NT_TIB32 {
+  ULONG ExceptionList;
+  ULONG StackBase;
+  ULONG StackLimit;
+  ULONG SubSystemTib;
+  __GNU_EXTENSION union {
+    ULONG FiberData;
+    ULONG Version;
+  };
+  ULONG ArbitraryUserPointer;
+  ULONG Self;
+} NT_TIB32,*PNT_TIB32;
+
+typedef struct _NT_TIB64 {
+  ULONG64 ExceptionList;
+  ULONG64 StackBase;
+  ULONG64 StackLimit;
+  ULONG64 SubSystemTib;
+  __GNU_EXTENSION union {
+    ULONG64 FiberData;
+    ULONG Version;
+  };
+  ULONG64 ArbitraryUserPointer;
+  ULONG64 Self;
+} NT_TIB64,*PNT_TIB64;
+
+typedef enum _PROCESSINFOCLASS {
+  ProcessBasicInformation,
+  ProcessQuotaLimits,
+  ProcessIoCounters,
+  ProcessVmCounters,
+  ProcessTimes,
+  ProcessBasePriority,
+  ProcessRaisePriority,
+  ProcessDebugPort,
+  ProcessExceptionPort,
+  ProcessAccessToken,
+  ProcessLdtInformation,
+  ProcessLdtSize,
+  ProcessDefaultHardErrorMode,
+  ProcessIoPortHandlers,
+  ProcessPooledUsageAndLimits,
+  ProcessWorkingSetWatch,
+  ProcessUserModeIOPL,
+  ProcessEnableAlignmentFaultFixup,
+  ProcessPriorityClass,
+  ProcessWx86Information,
+  ProcessHandleCount,
+  ProcessAffinityMask,
+  ProcessPriorityBoost,
+  ProcessDeviceMap,
+  ProcessSessionInformation,
+  ProcessForegroundInformation,
+  ProcessWow64Information,
+  ProcessImageFileName,
+  ProcessLUIDDeviceMapsEnabled,
+  ProcessBreakOnTermination,
+  ProcessDebugObjectHandle,
+  ProcessDebugFlags,
+  ProcessHandleTracing,
+  ProcessIoPriority,
+  ProcessExecuteFlags,
+  ProcessTlsInformation,
+  ProcessCookie,
+  ProcessImageInformation,
+  ProcessCycleTime,
+  ProcessPagePriority,
+  ProcessInstrumentationCallback,
+  ProcessThreadStackAllocation,
+  ProcessWorkingSetWatchEx,
+  ProcessImageFileNameWin32,
+  ProcessImageFileMapping,
+  ProcessAffinityUpdateMode,
+  ProcessMemoryAllocationMode,
+  ProcessGroupInformation,
+  ProcessTokenVirtualizationEnabled,
+  ProcessConsoleHostProcess,
+  ProcessWindowInformation,
+  MaxProcessInfoClass
+} PROCESSINFOCLASS;
+
+typedef enum _THREADINFOCLASS {
+  ThreadBasicInformation,
+  ThreadTimes,
+  ThreadPriority,
+  ThreadBasePriority,
+  ThreadAffinityMask,
+  ThreadImpersonationToken,
+  ThreadDescriptorTableEntry,
+  ThreadEnableAlignmentFaultFixup,
+  ThreadEventPair_Reusable,
+  ThreadQuerySetWin32StartAddress,
+  ThreadZeroTlsCell,
+  ThreadPerformanceCount,
+  ThreadAmILastThread,
+  ThreadIdealProcessor,
+  ThreadPriorityBoost,
+  ThreadSetTlsArrayAddress,
+  ThreadIsIoPending,
+  ThreadHideFromDebugger,
+  ThreadBreakOnTermination,
+  ThreadSwitchLegacyState,
+  ThreadIsTerminated,
+  ThreadLastSystemCall,
+  ThreadIoPriority,
+  ThreadCycleTime,
+  ThreadPagePriority,
+  ThreadActualBasePriority,
+  ThreadTebInformation,
+  ThreadCSwitchMon,
+  ThreadCSwitchPmu,
+  ThreadWow64Context,
+  ThreadGroupInformation,
+  ThreadUmsInformation,
+  ThreadCounterProfiling,
+  ThreadIdealProcessorEx,
+  MaxThreadInfoClass
+} THREADINFOCLASS;
+
+typedef struct _PROCESS_BASIC_INFORMATION {
+  NTSTATUS ExitStatus;
+  struct _PEB *PebBaseAddress;
+  ULONG_PTR AffinityMask;
+  KPRIORITY BasePriority;
+  ULONG_PTR UniqueProcessId;
+  ULONG_PTR InheritedFromUniqueProcessId;
+} PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
+
+typedef struct _PROCESS_WS_WATCH_INFORMATION {
+  PVOID FaultingPc;
+  PVOID FaultingVa;
+} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
+
+typedef struct _PROCESS_DEVICEMAP_INFORMATION {
+  __GNU_EXTENSION union {
+    struct {
+      HANDLE DirectoryHandle;
+    } Set;
+    struct {
+      ULONG DriveMap;
+      UCHAR DriveType[32];
+    } Query;
+  };
+} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
+
+typedef struct _KERNEL_USER_TIMES {
+  LARGE_INTEGER CreateTime;
+  LARGE_INTEGER ExitTime;
+  LARGE_INTEGER KernelTime;
+  LARGE_INTEGER UserTime;
+} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
+
+typedef struct _PROCESS_ACCESS_TOKEN {
+  HANDLE Token;
+  HANDLE Thread;
+} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
+
+typedef struct _PROCESS_SESSION_INFORMATION {
+  ULONG SessionId;
+} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
+
+typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
+  IoQueryDeviceIdentifier = 0,
+  IoQueryDeviceConfigurationData,
+  IoQueryDeviceComponentInformation,
+  IoQueryDeviceMaxData
+} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
+
+typedef struct _DISK_SIGNATURE {
+  ULONG PartitionStyle;
+  _ANONYMOUS_UNION union {
+    struct {
+      ULONG Signature;
+      ULONG CheckSum;
+    } Mbr;
+    struct {
+      GUID DiskId;
+    } Gpt;
+  } DUMMYUNIONNAME;
+} DISK_SIGNATURE, *PDISK_SIGNATURE;
+
+typedef ULONG_PTR
+(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
+  IN PVOID Context);
+
+typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
+  PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
+  PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
+} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
+
+#define DRIVER_VERIFIER_SPECIAL_POOLING             0x0001
+#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING         0x0002
+#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES  0x0004
+#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS      0x0008
+#define DRIVER_VERIFIER_IO_CHECKING                 0x0010
+
+typedef VOID
+(NTAPI *PTIMER_APC_ROUTINE)(
+  IN PVOID TimerContext,
+  IN ULONG TimerLowValue,
+  IN LONG TimerHighValue);
+
+typedef struct _KUSER_SHARED_DATA
+{
+    ULONG TickCountLowDeprecated;
+    ULONG TickCountMultiplier;
+    volatile KSYSTEM_TIME InterruptTime;
+    volatile KSYSTEM_TIME SystemTime;
+    volatile KSYSTEM_TIME TimeZoneBias;
+    USHORT ImageNumberLow;
+    USHORT ImageNumberHigh;
+    WCHAR NtSystemRoot[260];
+    ULONG MaxStackTraceDepth;
+    ULONG CryptoExponent;
+    ULONG TimeZoneId;
+    ULONG LargePageMinimum;
+    ULONG Reserved2[7];
+    NT_PRODUCT_TYPE NtProductType;
+    BOOLEAN ProductTypeIsValid;
+    ULONG NtMajorVersion;
+    ULONG NtMinorVersion;
+    BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
+    ULONG Reserved1;
+    ULONG Reserved3;
+    volatile ULONG TimeSlip;
+    ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
+    ULONG AltArchitecturePad[1];
+    LARGE_INTEGER SystemExpirationDate;
+    ULONG SuiteMask;
+    BOOLEAN KdDebuggerEnabled;
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+    UCHAR NXSupportPolicy;
+#endif
+    volatile ULONG ActiveConsoleId;
+    volatile ULONG DismountCount;
+    ULONG ComPlusPackage;
+    ULONG LastSystemRITEventTickCount;
+    ULONG NumberOfPhysicalPages;
+    BOOLEAN SafeBootMode;
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+    union {
+        UCHAR TscQpcData;
+        struct {
+            UCHAR TscQpcEnabled:1;
+            UCHAR TscQpcSpareFlag:1;
+            UCHAR TscQpcShift:6;
+        } DUMMYSTRUCTNAME;
+    } DUMMYUNIONNAME;
+    UCHAR TscQpcPad[2];
+#endif
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+    union {
+        ULONG SharedDataFlags;
+        struct {
+            ULONG DbgErrorPortPresent:1;
+            ULONG DbgElevationEnabled:1;
+            ULONG DbgVirtEnabled:1;
+            ULONG DbgInstallerDetectEnabled:1;
+            ULONG DbgSystemDllRelocated:1;
+            ULONG DbgDynProcessorEnabled:1;
+            ULONG DbgSEHValidationEnabled:1;
+            ULONG SpareBits:25;
+        } DUMMYSTRUCTNAME2;
+    } DUMMYUNIONNAME2;
+#else
+    ULONG TraceLogging;
+#endif
+    ULONG DataFlagsPad[1];
+    ULONGLONG TestRetInstruction;
+    ULONG SystemCall;
+    ULONG SystemCallReturn;
+    ULONGLONG SystemCallPad[3];
+    _ANONYMOUS_UNION union {
+        volatile KSYSTEM_TIME TickCount;
+        volatile ULONG64 TickCountQuad;
+        _ANONYMOUS_STRUCT struct {
+            ULONG ReservedTickCountOverlay[3];
+            ULONG TickCountPad[1];
+        } DUMMYSTRUCTNAME;
+    } DUMMYUNIONNAME3;
+    ULONG Cookie;
+    ULONG CookiePad[1];
+#if (NTDDI_VERSION >= NTDDI_WS03)
+    LONGLONG ConsoleSessionForegroundProcessId;
+    ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
+#endif
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+    USHORT UserModeGlobalLogger[16];
+#else
+    USHORT UserModeGlobalLogger[8];
+    ULONG HeapTracingPid[2];
+    ULONG CritSecTracingPid[2];
+#endif
+    ULONG ImageFileExecutionOptions;
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+    ULONG LangGenerationCount;
+#else
+    /* 4 bytes padding */
+#endif
+    ULONGLONG Reserved5;
+    volatile ULONG64 InterruptTimeBias;
+#endif
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+    volatile ULONG64 TscQpcBias;
+    volatile ULONG ActiveProcessorCount;
+    volatile USHORT ActiveGroupCount;
+    USHORT Reserved4;
+    volatile ULONG AitSamplingValue;
+    volatile ULONG AppCompatFlag;
+    ULONGLONG SystemDllNativeRelocation;
+    ULONG SystemDllWowRelocation;
+    ULONG XStatePad[1];
+    XSTATE_CONFIGURATION XState;
+#endif
+} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
+
+extern NTKERNELAPI PVOID MmHighestUserAddress;
+extern NTKERNELAPI PVOID MmSystemRangeStart;
+extern NTKERNELAPI ULONG MmUserProbeAddress;
+
+
+#ifdef _X86_
+
+#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
+#define MM_SYSTEM_RANGE_START MmSystemRangeStart
+#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
+#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
+extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
+#else
+#define MM_USER_PROBE_ADDRESS MmUserProbeAddress
+#endif
+#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
+#define MM_KSEG0_BASE       MM_SYSTEM_RANGE_START
+#define MM_SYSTEM_SPACE_END 0xFFFFFFFF
+#if !defined (_X86PAE_)
+#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
+#else
+#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
+#endif
+
+#define KeGetPcr()                      PCR
+
+#define KERNEL_STACK_SIZE                   12288
+#define KERNEL_LARGE_STACK_SIZE             61440
+#define KERNEL_LARGE_STACK_COMMIT           12288
+
+#define SIZE_OF_80387_REGISTERS   80
+
+#define PCR_MINOR_VERSION 1
+#define PCR_MAJOR_VERSION 1
+
+#if !defined(RC_INVOKED)
+
+#define CONTEXT_i386               0x10000
+#define CONTEXT_i486               0x10000
+#define CONTEXT_CONTROL            (CONTEXT_i386|0x00000001L)
+#define CONTEXT_INTEGER            (CONTEXT_i386|0x00000002L)
+#define CONTEXT_SEGMENTS           (CONTEXT_i386|0x00000004L)
+#define CONTEXT_FLOATING_POINT     (CONTEXT_i386|0x00000008L)
+#define CONTEXT_DEBUG_REGISTERS    (CONTEXT_i386|0x00000010L)
+#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
+
+#define CONTEXT_FULL  (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
+
+#endif /* !defined(RC_INVOKED) */
+
+typedef struct _KPCR {
+  union {
+    NT_TIB NtTib;
+    struct {
+      struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
+      PVOID Used_StackBase;
+      PVOID Spare2;
+      PVOID TssCopy;
+      ULONG ContextSwitches;
+      KAFFINITY SetMemberCopy;
+      PVOID Used_Self;
+    };
+  };
+  struct _KPCR *SelfPcr;
+  struct _KPRCB *Prcb;
+  KIRQL Irql;
+  ULONG IRR;
+  ULONG IrrActive;
+  ULONG IDR;
+  PVOID KdVersionBlock;
+  struct _KIDTENTRY *IDT;
+  struct _KGDTENTRY *GDT;
+  struct _KTSS *TSS;
+  USHORT MajorVersion;
+  USHORT MinorVersion;
+  KAFFINITY SetMember;
+  ULONG StallScaleFactor;
+  UCHAR SpareUnused;
+  UCHAR Number;
+  UCHAR Spare0;
+  UCHAR SecondLevelCacheAssociativity;
+  ULONG VdmAlert;
+  ULONG KernelReserved[14];
+  ULONG SecondLevelCacheSize;
+  ULONG HalReserved[16];
+} KPCR, *PKPCR;
+
+FORCEINLINE
+ULONG
+KeGetCurrentProcessorNumber(VOID)
+{
+    return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
+}
+
+typedef struct _FLOATING_SAVE_AREA {
+  ULONG ControlWord;
+  ULONG StatusWord;
+  ULONG TagWord;
+  ULONG ErrorOffset;
+  ULONG ErrorSelector;
+  ULONG DataOffset;
+  ULONG DataSelector;
+  UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
+  ULONG Cr0NpxState;
+} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
+
+#include "pshpack4.h"
+typedef struct _CONTEXT {
+  ULONG ContextFlags;
+  ULONG Dr0;
+  ULONG Dr1;
+  ULONG Dr2;
+  ULONG Dr3;
+  ULONG Dr6;
+  ULONG Dr7;
+  FLOATING_SAVE_AREA FloatSave;
+  ULONG SegGs;
+  ULONG SegFs;
+  ULONG SegEs;
+  ULONG SegDs;
+  ULONG Edi;
+  ULONG Esi;
+  ULONG Ebx;
+  ULONG Edx;
+  ULONG Ecx;
+  ULONG Eax;
+  ULONG Ebp;
+  ULONG Eip;
+  ULONG SegCs;
+  ULONG EFlags;
+  ULONG Esp;
+  ULONG SegSs;
+  UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
+} CONTEXT;
+#include "poppack.h"
+
+#endif /* _X86_ */
+
+#ifdef _AMD64_
+
+#define PTI_SHIFT  12L
+#define PDI_SHIFT  21L
+#define PPI_SHIFT  30L
+#define PXI_SHIFT  39L
+#define PTE_PER_PAGE 512
+#define PDE_PER_PAGE 512
+#define PPE_PER_PAGE 512
+#define PXE_PER_PAGE 512
+#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
+#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
+#define PPI_MASK (PPE_PER_PAGE - 1)
+#define PXI_MASK (PXE_PER_PAGE - 1)
+
+#define PXE_BASE    0xFFFFF6FB7DBED000ULL
+#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
+#define PPE_BASE    0xFFFFF6FB7DA00000ULL
+#define PDE_BASE    0xFFFFF6FB40000000ULL
+#define PTE_BASE    0xFFFFF68000000000ULL
+#define PXE_TOP     0xFFFFF6FB7DBEDFFFULL
+#define PPE_TOP     0xFFFFF6FB7DBFFFFFULL
+#define PDE_TOP     0xFFFFF6FB7FFFFFFFULL
+#define PTE_TOP     0xFFFFF6FFFFFFFFFFULL
+
+#define MM_HIGHEST_USER_ADDRESS           MmHighestUserAddress
+#define MM_SYSTEM_RANGE_START             MmSystemRangeStart
+#define MM_USER_PROBE_ADDRESS             MmUserProbeAddress
+#define MM_LOWEST_USER_ADDRESS   (PVOID)0x10000
+#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
+#define KI_USER_SHARED_DATA       0xFFFFF78000000000ULL
+
+typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
+    ULONG64 P1Home;
+    ULONG64 P2Home;
+    ULONG64 P3Home;
+    ULONG64 P4Home;
+    ULONG64 P5Home;
+    ULONG64 P6Home;
+
+    /* Control flags */
+    ULONG ContextFlags;
+    ULONG MxCsr;
+
+    /* Segment */
+    USHORT SegCs;
+    USHORT SegDs;
+    USHORT SegEs;
+    USHORT SegFs;
+    USHORT SegGs;
+    USHORT SegSs;
+    ULONG EFlags;
+
+    /* Debug */
+    ULONG64 Dr0;
+    ULONG64 Dr1;
+    ULONG64 Dr2;
+    ULONG64 Dr3;
+    ULONG64 Dr6;
+    ULONG64 Dr7;
+
+    /* Integer */
+    ULONG64 Rax;
+    ULONG64 Rcx;
+    ULONG64 Rdx;
+    ULONG64 Rbx;
+    ULONG64 Rsp;
+    ULONG64 Rbp;
+    ULONG64 Rsi;
+    ULONG64 Rdi;
+    ULONG64 R8;
+    ULONG64 R9;
+    ULONG64 R10;
+    ULONG64 R11;
+    ULONG64 R12;
+    ULONG64 R13;
+    ULONG64 R14;
+    ULONG64 R15;
+
+    /* Counter */
+    ULONG64 Rip;
+
+   /* Floating point */
+   union {
+       XMM_SAVE_AREA32 FltSave;
+       struct {
+           M128A Header[2];
+           M128A Legacy[8];
+           M128A Xmm0;
+           M128A Xmm1;
+           M128A Xmm2;
+           M128A Xmm3;
+           M128A Xmm4;
+           M128A Xmm5;
+           M128A Xmm6;
+           M128A Xmm7;
+           M128A Xmm8;
+           M128A Xmm9;
+           M128A Xmm10;
+           M128A Xmm11;
+           M128A Xmm12;
+           M128A Xmm13;
+           M128A Xmm14;
+           M128A Xmm15;
+      } DUMMYSTRUCTNAME;
+    } DUMMYUNIONNAME;
+
+     /* Vector */
+    M128A VectorRegister[26];
+    ULONG64 VectorControl;
+
+    /* Debug control */
+    ULONG64 DebugControl;
+    ULONG64 LastBranchToRip;
+    ULONG64 LastBranchFromRip;
+    ULONG64 LastExceptionToRip;
+    ULONG64 LastExceptionFromRip;
+} CONTEXT;
+
+typedef struct _KPCR
+{
+    _ANONYMOUS_UNION union
+    {
+        NT_TIB NtTib;
+        _ANONYMOUS_STRUCT struct
+        {
+            union _KGDTENTRY64 *GdtBase;
+            struct _KTSS64 *TssBase;
+            ULONG64 UserRsp;
+            struct _KPCR *Self;
+            struct _KPRCB *CurrentPrcb;
+            PKSPIN_LOCK_QUEUE LockArray;
+            PVOID Used_Self;
+        };
+    };
+    union _KIDTENTRY64 *IdtBase;
+    ULONG64 Unused[2];
+    KIRQL Irql;
+    UCHAR SecondLevelCacheAssociativity;
+    UCHAR ObsoleteNumber;
+    UCHAR Fill0;
+    ULONG Unused0[3];
+    USHORT MajorVersion;
+    USHORT MinorVersion;
+    ULONG StallScaleFactor;
+    PVOID Unused1[3];
+    ULONG KernelReserved[15];
+    ULONG SecondLevelCacheSize;
+    ULONG HalReserved[16];
+    ULONG Unused2;
+    PVOID KdVersionBlock;
+    PVOID Unused3;
+    ULONG PcrAlign1[24];
+} KPCR, *PKPCR;
+
+FORCEINLINE
+PKPCR
+KeGetPcr(VOID)
+{
+    return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
+}
+
+FORCEINLINE
+ULONG
+KeGetCurrentProcessorNumber(VOID)
+{
+    return (ULONG)__readgsword(0x184);
+}
+
+#if !defined(RC_INVOKED)
+
+#define CONTEXT_AMD64 0x100000
+
+#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
+#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
+#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
+#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
+
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
+#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
+
+#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
+
+#define CONTEXT_EXCEPTION_ACTIVE 0x8000000
+#define CONTEXT_SERVICE_ACTIVE 0x10000000
+#define CONTEXT_EXCEPTION_REQUEST 0x40000000
+#define CONTEXT_EXCEPTION_REPORTING 0x80000000
+
+#endif /* RC_INVOKED */
+
+#endif /* _AMD64_ */
+
+typedef enum _INTERLOCKED_RESULT {
+  ResultNegative = RESULT_NEGATIVE,
+  ResultZero = RESULT_ZERO,
+  ResultPositive = RESULT_POSITIVE
+} INTERLOCKED_RESULT;
+
+typedef struct _OSVERSIONINFOA {
+  ULONG dwOSVersionInfoSize;
+  ULONG dwMajorVersion;
+  ULONG dwMinorVersion;
+  ULONG dwBuildNumber;
+  ULONG dwPlatformId;
+  CHAR szCSDVersion[128];
+} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
+
+typedef struct _OSVERSIONINFOW {
+  ULONG dwOSVersionInfoSize;
+  ULONG dwMajorVersion;
+  ULONG dwMinorVersion;
+  ULONG dwBuildNumber;
+  ULONG dwPlatformId;
+  WCHAR szCSDVersion[128];
+} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
+
+typedef struct _OSVERSIONINFOEXA {
+  ULONG dwOSVersionInfoSize;
+  ULONG dwMajorVersion;
+  ULONG dwMinorVersion;
+  ULONG dwBuildNumber;
+  ULONG dwPlatformId;
+  CHAR szCSDVersion[128];
+  USHORT wServicePackMajor;
+  USHORT wServicePackMinor;
+  USHORT wSuiteMask;
+  UCHAR wProductType;
+  UCHAR wReserved;
+} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
+
+typedef struct _OSVERSIONINFOEXW {
+  ULONG dwOSVersionInfoSize;
+  ULONG dwMajorVersion;
+  ULONG dwMinorVersion;
+  ULONG dwBuildNumber;
+  ULONG dwPlatformId;
+  WCHAR szCSDVersion[128];
+  USHORT wServicePackMajor;
+  USHORT wServicePackMinor;
+  USHORT wSuiteMask;
+  UCHAR wProductType;
+  UCHAR wReserved;
+} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
+
+#ifdef UNICODE
+typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
+typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
+typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
+typedef OSVERSIONINFOW OSVERSIONINFO;
+typedef POSVERSIONINFOW POSVERSIONINFO;
+typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
+#else
+typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
+typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
+typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
+typedef OSVERSIONINFOA OSVERSIONINFO;
+typedef POSVERSIONINFOA POSVERSIONINFO;
+typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
+#endif /* UNICODE */
+
+/* Executive Types */
+
+#define PROTECTED_POOL                    0x80000000
+
+typedef struct _ZONE_SEGMENT_HEADER {
+  SINGLE_LIST_ENTRY SegmentList;
+  PVOID Reserved;
+} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
+
+typedef struct _ZONE_HEADER {
+  SINGLE_LIST_ENTRY FreeList;
+  SINGLE_LIST_ENTRY SegmentList;
+  ULONG BlockSize;
+  ULONG TotalSegmentSize;
+} ZONE_HEADER, *PZONE_HEADER;
+
+/* Executive Functions */
+
+static __inline PVOID
+ExAllocateFromZone(
+  IN PZONE_HEADER Zone)
+{
+  if (Zone->FreeList.Next)
+    Zone->FreeList.Next = Zone->FreeList.Next->Next;
+  return (PVOID) Zone->FreeList.Next;
+}
+
+static __inline PVOID
+ExFreeToZone(
+  IN PZONE_HEADER  Zone,
+  IN PVOID  Block)
+{
+  ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
+  Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
+  return ((PSINGLE_LIST_ENTRY) Block)->Next;
+}
+
+/*
+ * PVOID
+ * ExInterlockedAllocateFromZone(
+ *   IN PZONE_HEADER  Zone,
+ *   IN PKSPIN_LOCK  Lock)
+ */
+#define ExInterlockedAllocateFromZone(Zone, Lock) \
+    ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
+
+/* PVOID
+ * ExInterlockedFreeToZone(
+ *  IN PZONE_HEADER  Zone,
+ *  IN PVOID  Block,
+ *  IN PKSPIN_LOCK  Lock);
+ */
+#define ExInterlockedFreeToZone(Zone, Block, Lock) \
+    ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
+
+/*
+ * BOOLEAN
+ * ExIsFullZone(
+ *  IN PZONE_HEADER  Zone)
+ */
+#define ExIsFullZone(Zone) \
+  ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
+
+/* BOOLEAN
+ * ExIsObjectInFirstZoneSegment(
+ *     IN PZONE_HEADER Zone,
+ *     IN PVOID Object);
+ */
+#define ExIsObjectInFirstZoneSegment(Zone,Object) \
+    ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
+                ((PUCHAR)(Object) <  (PUCHAR)(Zone)->SegmentList.Next + \
+                         (Zone)->TotalSegmentSize)) )
+
+#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
+#define ExAcquireResourceShared ExAcquireResourceSharedLite
+#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
+#define ExDeleteResource ExDeleteResourceLite
+#define ExInitializeResource ExInitializeResourceLite
+#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
+#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
+#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
+#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
 
-/* Windows Device Driver Kit */
-#include "winddk.h"
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExExtendZone(
+  IN OUT PZONE_HEADER Zone,
+  IN OUT PVOID Segment,
+  IN ULONG SegmentSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInitializeZone(
+  OUT PZONE_HEADER Zone,
+  IN ULONG BlockSize,
+  IN OUT PVOID InitialSegment,
+  IN ULONG InitialSegmentSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInterlockedExtendZone(
+  IN OUT PZONE_HEADER Zone,
+  IN OUT PVOID Segment,
+  IN ULONG SegmentSize,
+  IN OUT PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExUuidCreate(
+  OUT UUID *Uuid);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseAccessViolation(
+  VOID);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseDatatypeMisalignment(
+  VOID);
+
+#endif
+
+#ifdef _X86_
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedIncrementLong(
+  IN OUT LONG volatile *Addend);
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedDecrementLong(
+  IN PLONG  Addend);
+
+NTKERNELAPI
+ULONG
+FASTCALL
+Exfi386InterlockedExchangeUlong(
+  IN PULONG  Target,
+  IN ULONG  Value);
+
+#endif /* _X86_ */
+
+#ifndef _ARC_DDK_
+#define _ARC_DDK_
+typedef enum _CONFIGURATION_TYPE {
+  ArcSystem,
+  CentralProcessor,
+  FloatingPointProcessor,
+  PrimaryIcache,
+  PrimaryDcache,
+  SecondaryIcache,
+  SecondaryDcache,
+  SecondaryCache,
+  EisaAdapter,
+  TcAdapter,
+  ScsiAdapter,
+  DtiAdapter,
+  MultiFunctionAdapter,
+  DiskController,
+  TapeController,
+  CdromController,
+  WormController,
+  SerialController,
+  NetworkController,
+  DisplayController,
+  ParallelController,
+  PointerController,
+  KeyboardController,
+  AudioController,
+  OtherController,
+  DiskPeripheral,
+  FloppyDiskPeripheral,
+  TapePeripheral,
+  ModemPeripheral,
+  MonitorPeripheral,
+  PrinterPeripheral,
+  PointerPeripheral,
+  KeyboardPeripheral,
+  TerminalPeripheral,
+  OtherPeripheral,
+  LinePeripheral,
+  NetworkPeripheral,
+  SystemMemory,
+  DockingInformation,
+  RealModeIrqRoutingTable,
+  RealModePCIEnumeration,
+  MaximumType
+} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
+#endif /* !_ARC_DDK_ */
+
+typedef struct _CONTROLLER_OBJECT {
+  CSHORT Type;
+  CSHORT Size;
+  PVOID ControllerExtension;
+  KDEVICE_QUEUE DeviceWaitQueue;
+  ULONG Spare1;
+  LARGE_INTEGER Spare2;
+} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
+
+typedef struct _CONFIGURATION_INFORMATION {
+  ULONG DiskCount;
+  ULONG FloppyCount;
+  ULONG CdRomCount;
+  ULONG TapeCount;
+  ULONG ScsiPortCount;
+  ULONG SerialCount;
+  ULONG ParallelCount;
+  BOOLEAN AtDiskPrimaryAddressClaimed;
+  BOOLEAN AtDiskSecondaryAddressClaimed;
+  ULONG Version;
+  ULONG MediumChangerCount;
+} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
+
+typedef
+NTSTATUS
+(NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
+  IN PVOID Context,
+  IN PUNICODE_STRING PathName,
+  IN INTERFACE_TYPE BusType,
+  IN ULONG BusNumber,
+  IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
+  IN CONFIGURATION_TYPE ControllerType,
+  IN ULONG ControllerNumber,
+  IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
+  IN CONFIGURATION_TYPE PeripheralType,
+  IN ULONG PeripheralNumber,
+  IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
+
+typedef
+VOID
+(NTAPI DRIVER_REINITIALIZE)(
+  IN struct _DRIVER_OBJECT *DriverObject,
+  IN PVOID Context,
+  IN ULONG Count);
+
+typedef DRIVER_REINITIALIZE *PDRIVER_REINITIALIZE;
+
+/** Filesystem runtime library routines **/
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsTotalDeviceFailure(
+  IN NTSTATUS Status);
+#endif
+
+/* Hardware Abstraction Layer Types */
+
+typedef VOID
+(NTAPI *PciPin2Line)(
+  IN struct _BUS_HANDLER *BusHandler,
+  IN struct _BUS_HANDLER *RootHandler,
+  IN PCI_SLOT_NUMBER SlotNumber,
+  IN PPCI_COMMON_CONFIG PciData);
+
+typedef VOID
+(NTAPI *PciLine2Pin)(
+  IN struct _BUS_HANDLER *BusHandler,
+  IN struct _BUS_HANDLER *RootHandler,
+  IN PCI_SLOT_NUMBER SlotNumber,
+  IN PPCI_COMMON_CONFIG PciNewData,
+  IN PPCI_COMMON_CONFIG PciOldData);
+
+typedef VOID
+(NTAPI *PciReadWriteConfig)(
+  IN struct _BUS_HANDLER *BusHandler,
+  IN PCI_SLOT_NUMBER Slot,
+  IN PVOID Buffer,
+  IN ULONG Offset,
+  IN ULONG Length);
+
+#define PCI_DATA_TAG ' ICP'
+#define PCI_DATA_VERSION 1
+
+typedef struct _PCIBUSDATA {
+  ULONG Tag;
+  ULONG Version;
+  PciReadWriteConfig ReadConfig;
+  PciReadWriteConfig WriteConfig;
+  PciPin2Line Pin2Line;
+  PciLine2Pin Line2Pin;
+  PCI_SLOT_NUMBER ParentSlot;
+  PVOID Reserved[4];
+} PCIBUSDATA, *PPCIBUSDATA;
+
+/* Hardware Abstraction Layer Functions */
+
+#if !defined(NO_LEGACY_DRIVERS)
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTHALAPI
+NTSTATUS
+NTAPI
+HalAssignSlotResources(
+  IN PUNICODE_STRING RegistryPath,
+  IN PUNICODE_STRING DriverClassName,
+  IN PDRIVER_OBJECT DriverObject,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN INTERFACE_TYPE BusType,
+  IN ULONG BusNumber,
+  IN ULONG SlotNumber,
+  IN OUT PCM_RESOURCE_LIST *AllocatedResources);
+
+NTHALAPI
+ULONG
+NTAPI
+HalGetInterruptVector(
+  IN INTERFACE_TYPE InterfaceType,
+  IN ULONG BusNumber,
+  IN ULONG BusInterruptLevel,
+  IN ULONG BusInterruptVector,
+  OUT PKIRQL Irql,
+  OUT PKAFFINITY Affinity);
+
+NTHALAPI
+ULONG
+NTAPI
+HalSetBusData(
+  IN BUS_DATA_TYPE BusDataType,
+  IN ULONG BusNumber,
+  IN ULONG SlotNumber,
+  IN PVOID Buffer,
+  IN ULONG Length);
+
+#endif
+
+#endif /* !defined(NO_LEGACY_DRIVERS) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTHALAPI
+PADAPTER_OBJECT
+NTAPI
+HalGetAdapter(
+  IN PDEVICE_DESCRIPTION DeviceDescription,
+  IN OUT PULONG NumberOfMapRegisters);
+
+NTHALAPI
+BOOLEAN
+NTAPI
+HalMakeBeep(
+  IN ULONG Frequency);
+
+VOID
+NTAPI
+HalPutDmaAdapter(
+  IN PADAPTER_OBJECT DmaAdapter);
+
+NTHALAPI
+VOID
+NTAPI
+HalAcquireDisplayOwnership(
+  IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
+
+NTHALAPI
+ULONG
+NTAPI
+HalGetBusData(
+  IN BUS_DATA_TYPE BusDataType,
+  IN ULONG BusNumber,
+  IN ULONG SlotNumber,
+  OUT PVOID Buffer,
+  IN ULONG Length);
+
+NTHALAPI
+ULONG
+NTAPI
+HalGetBusDataByOffset(
+  IN BUS_DATA_TYPE BusDataType,
+  IN ULONG BusNumber,
+  IN ULONG SlotNumber,
+  OUT PVOID Buffer,
+  IN ULONG Offset,
+  IN ULONG Length);
+
+NTHALAPI
+ULONG
+NTAPI
+HalSetBusDataByOffset(
+  IN BUS_DATA_TYPE BusDataType,
+  IN ULONG BusNumber,
+  IN ULONG SlotNumber,
+  IN PVOID Buffer,
+  IN ULONG Offset,
+  IN ULONG Length);
+
+NTHALAPI
+BOOLEAN
+NTAPI
+HalTranslateBusAddress(
+  IN INTERFACE_TYPE InterfaceType,
+  IN ULONG BusNumber,
+  IN PHYSICAL_ADDRESS BusAddress,
+  IN OUT PULONG AddressSpace,
+  OUT PPHYSICAL_ADDRESS TranslatedAddress);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+VOID
+FASTCALL
+HalExamineMBR(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG SectorSize,
+  IN ULONG MBRTypeIdentifier,
+  OUT PVOID *Buffer);
+#endif
+
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) 
+// nothing here
+#else
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+VOID
+NTAPI
+IoFreeAdapterChannel(
+  IN PADAPTER_OBJECT AdapterObject);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+BOOLEAN
+NTAPI
+IoFlushAdapterBuffers(
+  IN PADAPTER_OBJECT AdapterObject,
+  IN PMDL Mdl,
+  IN PVOID MapRegisterBase,
+  IN PVOID CurrentVa,
+  IN ULONG Length,
+  IN BOOLEAN WriteToDevice);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+VOID
+NTAPI
+IoFreeMapRegisters(
+  IN PADAPTER_OBJECT AdapterObject,
+  IN PVOID MapRegisterBase,
+  IN ULONG NumberOfMapRegisters);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+PVOID
+NTAPI
+HalAllocateCommonBuffer(
+  IN PADAPTER_OBJECT AdapterObject,
+  IN ULONG Length,
+  OUT PPHYSICAL_ADDRESS LogicalAddress,
+  IN BOOLEAN CacheEnabled);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+VOID
+NTAPI
+HalFreeCommonBuffer(
+  IN PADAPTER_OBJECT AdapterObject,
+  IN ULONG Length,
+  IN PHYSICAL_ADDRESS LogicalAddress,
+  IN PVOID VirtualAddress,
+  IN BOOLEAN CacheEnabled);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+ULONG
+NTAPI
+HalReadDmaCounter(
+  IN PADAPTER_OBJECT AdapterObject);
+
+NTHALAPI
+NTSTATUS
+NTAPI
+HalAllocateAdapterChannel(
+  IN PADAPTER_OBJECT  AdapterObject,
+  IN PWAIT_CONTEXT_BLOCK  Wcb,
+  IN ULONG  NumberOfMapRegisters,
+  IN PDRIVER_CONTROL  ExecutionRoutine);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)  */
+
+/* I/O Manager Functions */
+
+/*
+ * VOID IoAssignArcName(
+ *   IN PUNICODE_STRING  ArcName,
+ *   IN PUNICODE_STRING  DeviceName);
+ */
+#define IoAssignArcName(_ArcName, _DeviceName) ( \
+  IoCreateSymbolicLink((_ArcName), (_DeviceName)))
+
+/*
+ * VOID
+ * IoDeassignArcName(
+ *   IN PUNICODE_STRING  ArcName)
+ */
+#define IoDeassignArcName IoDeleteSymbolicLink
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+#if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAllocateAdapterChannel(
+  IN PADAPTER_OBJECT AdapterObject,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG NumberOfMapRegisters,
+  IN PDRIVER_CONTROL ExecutionRoutine,
+  IN PVOID Context);
+#endif
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+PHYSICAL_ADDRESS
+NTAPI
+IoMapTransfer(
+  IN PADAPTER_OBJECT AdapterObject,
+  IN PMDL Mdl,
+  IN PVOID MapRegisterBase,
+  IN PVOID CurrentVa,
+  IN OUT PULONG Length,
+  IN BOOLEAN WriteToDevice);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoAllocateController(
+  IN PCONTROLLER_OBJECT ControllerObject,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PDRIVER_CONTROL ExecutionRoutine,
+  IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+PCONTROLLER_OBJECT
+NTAPI
+IoCreateController(
+  IN ULONG Size);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoDeleteController(
+  IN PCONTROLLER_OBJECT ControllerObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeController(
+  IN PCONTROLLER_OBJECT ControllerObject);
+
+NTKERNELAPI
+PCONFIGURATION_INFORMATION
+NTAPI
+IoGetConfigurationInformation(
+  VOID);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetDeviceToVerify(
+  IN PETHREAD Thread);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoCancelFileOpen(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+PGENERIC_MAPPING
+NTAPI
+IoGetFileObjectGenericMapping(
+  VOID);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoMakeAssociatedIrp(
+  IN PIRP Irp,
+  IN CCHAR StackSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoQueryDeviceDescription(
+  IN PINTERFACE_TYPE BusType OPTIONAL,
+  IN PULONG BusNumber OPTIONAL,
+  IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
+  IN PULONG ControllerNumber OPTIONAL,
+  IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
+  IN PULONG PeripheralNumber OPTIONAL,
+  IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
+  IN OUT PVOID Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRaiseHardError(
+  IN PIRP Irp,
+  IN PVPB Vpb OPTIONAL,
+  IN PDEVICE_OBJECT RealDeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoRaiseInformationalHardError(
+  IN NTSTATUS ErrorStatus,
+  IN PUNICODE_STRING String OPTIONAL,
+  IN PKTHREAD Thread OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRegisterBootDriverReinitialization(
+  IN PDRIVER_OBJECT DriverObject,
+  IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
+  IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRegisterDriverReinitialization(
+  IN PDRIVER_OBJECT DriverObject,
+  IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
+  IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAttachDeviceByPointer(
+  IN PDEVICE_OBJECT SourceDevice,
+  IN PDEVICE_OBJECT TargetDevice);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportDetectedDevice(
+  IN PDRIVER_OBJECT DriverObject,
+  IN INTERFACE_TYPE LegacyBusType,
+  IN ULONG BusNumber,
+  IN ULONG SlotNumber,
+  IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
+  IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
+  IN BOOLEAN ResourceAssigned,
+  IN OUT PDEVICE_OBJECT *DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportResourceForDetection(
+  IN PDRIVER_OBJECT DriverObject,
+  IN PCM_RESOURCE_LIST DriverList OPTIONAL,
+  IN ULONG DriverListSize OPTIONAL,
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+  IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
+  IN ULONG DeviceListSize OPTIONAL,
+  OUT PBOOLEAN ConflictDetected);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportResourceUsage(
+  IN PUNICODE_STRING DriverClassName OPTIONAL,
+  IN PDRIVER_OBJECT DriverObject,
+  IN PCM_RESOURCE_LIST DriverList OPTIONAL,
+  IN ULONG DriverListSize OPTIONAL,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
+  IN ULONG DeviceListSize OPTIONAL,
+  IN BOOLEAN OverrideConflict,
+  OUT PBOOLEAN ConflictDetected);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoSetHardErrorOrVerifyDevice(
+  IN PIRP Irp,
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAssignResources(
+  IN PUNICODE_STRING RegistryPath,
+  IN PUNICODE_STRING DriverClassName OPTIONAL,
+  IN PDRIVER_OBJECT DriverObject,
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+  IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
+  IN OUT PCM_RESOURCE_LIST *AllocatedResources);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateDisk(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN struct _CREATE_DISK* Disk OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReadDiskSignature(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG BytesPerSector,
+  OUT PDISK_SIGNATURE Signature);
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoReadPartitionTable(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG SectorSize,
+  IN BOOLEAN ReturnRecognizedPartitions,
+  OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReadPartitionTableEx(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoSetPartitionInformation(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG SectorSize,
+  IN ULONG PartitionNumber,
+  IN ULONG PartitionType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetPartitionInformationEx(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG PartitionNumber,
+  IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetSystemPartition(
+  IN PUNICODE_STRING VolumeNameString);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoSetThreadHardErrorMode(
+  IN BOOLEAN EnableHardErrors);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoVerifyPartitionTable(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN BOOLEAN FixErrors);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoVolumeDeviceToDosName(
+  IN PVOID VolumeDeviceObject,
+  OUT PUNICODE_STRING DosName);
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoWritePartitionTable(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG SectorSize,
+  IN ULONG SectorsPerTrack,
+  IN ULONG NumberOfHeads,
+  IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWritePartitionTableEx(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+/** Kernel debugger routines **/
+
+NTSYSAPI
+ULONG
+NTAPI
+DbgPrompt(
+  IN PCCH Prompt,
+  OUT PCH Response,
+  IN ULONG MaximumResponseLength);
+
+/* Kernel Functions */
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+KeBugCheck(
+  IN ULONG BugCheckCode);
+
+NTKERNELAPI
+LONG
+NTAPI
+KePulseEvent(
+  IN OUT PRKEVENT Event,
+  IN KPRIORITY Increment,
+  IN BOOLEAN Wait);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeSetBasePriorityThread(
+  IN OUT PRKTHREAD Thread,
+  IN LONG Increment);
+
+#endif
+
+/* Memory Manager Types */
+
+typedef struct _PHYSICAL_MEMORY_RANGE {
+  PHYSICAL_ADDRESS BaseAddress;
+  LARGE_INTEGER NumberOfBytes;
+} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
+
+/* Memory Manager Functions */
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+PPHYSICAL_MEMORY_RANGE
+NTAPI
+MmGetPhysicalMemoryRanges(
+  VOID);
+
+NTKERNELAPI
+PHYSICAL_ADDRESS
+NTAPI
+MmGetPhysicalAddress(
+  IN PVOID BaseAddress);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsNonPagedSystemAddressValid(
+  IN PVOID VirtualAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateNonCachedMemory(
+  IN SIZE_T NumberOfBytes);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeNonCachedMemory(
+  IN PVOID BaseAddress,
+  IN SIZE_T NumberOfBytes);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmGetVirtualForPhysical(
+  IN PHYSICAL_ADDRESS PhysicalAddress);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmMapUserAddressesToPage(
+  IN PVOID BaseAddress,
+  IN SIZE_T NumberOfBytes,
+  IN PVOID PageAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapVideoDisplay(
+  IN PHYSICAL_ADDRESS PhysicalAddress,
+  IN SIZE_T NumberOfBytes,
+  IN MEMORY_CACHING_TYPE CacheType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmMapViewInSessionSpace(
+  IN PVOID Section,
+  OUT PVOID *MappedBase,
+  IN OUT PSIZE_T ViewSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmMapViewInSystemSpace(
+  IN PVOID Section,
+  OUT PVOID *MappedBase,
+  IN OUT PSIZE_T ViewSize);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsAddressValid(
+  IN PVOID VirtualAddress);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsThisAnNtAsSystem(
+  VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmLockPagableSectionByHandle(
+  IN PVOID ImageSectionHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmUnmapViewInSessionSpace(
+  IN PVOID MappedBase);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmUnmapViewInSystemSpace(
+  IN PVOID MappedBase);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnsecureVirtualMemory(
+  IN HANDLE SecureHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmRemovePhysicalMemory(
+  IN PPHYSICAL_ADDRESS StartAddress,
+  IN OUT PLARGE_INTEGER NumberOfBytes);
+
+NTKERNELAPI
+HANDLE
+NTAPI
+MmSecureVirtualMemory(
+  IN PVOID Address,
+  IN SIZE_T Size,
+  IN ULONG ProbeMode);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnmapVideoDisplay(
+  IN PVOID BaseAddress,
+  IN SIZE_T NumberOfBytes);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+/* NtXxx Functions */
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenProcess(
+  OUT PHANDLE ProcessHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN PCLIENT_ID ClientId OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryInformationProcess(
+  IN HANDLE ProcessHandle,
+  IN PROCESSINFOCLASS ProcessInformationClass,
+  OUT PVOID ProcessInformation OPTIONAL,
+  IN ULONG ProcessInformationLength,
+  OUT PULONG ReturnLength OPTIONAL);
+
+/** Process manager types **/
+
+typedef VOID
+(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
+  IN HANDLE ParentId,
+  IN HANDLE ProcessId,
+  IN BOOLEAN Create);
+
+typedef VOID
+(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
+  IN HANDLE ProcessId,
+  IN HANDLE ThreadId,
+  IN BOOLEAN Create);
+
+typedef VOID
+(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
+  IN PUNICODE_STRING FullImageName,
+  IN HANDLE ProcessId,
+  IN PIMAGE_INFO ImageInfo);
+
+/** Process manager routines **/
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsSetLoadImageNotifyRoutine(
+  IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsSetCreateThreadNotifyRoutine(
+  IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsSetCreateProcessNotifyRoutine(
+  IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
+  IN BOOLEAN Remove);
+
+NTKERNELAPI
+HANDLE
+NTAPI
+PsGetCurrentProcessId(
+  VOID);
+
+NTKERNELAPI
+HANDLE
+NTAPI
+PsGetCurrentThreadId(
+  VOID);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PsGetVersion(
+  OUT PULONG MajorVersion OPTIONAL,
+  OUT PULONG MinorVersion OPTIONAL,
+  OUT PULONG BuildNumber OPTIONAL,
+  OUT PUNICODE_STRING CSDVersion OPTIONAL);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+HANDLE
+NTAPI
+PsGetProcessId(
+  IN PEPROCESS Process);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsRemoveCreateThreadNotifyRoutine(
+  IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsRemoveLoadImageNotifyRoutine(
+  IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+extern NTKERNELAPI PEPROCESS PsInitialSystemProcess;
+
+/* RTL Types */
+
+typedef struct _RTL_SPLAY_LINKS {
+  struct _RTL_SPLAY_LINKS *Parent;
+  struct _RTL_SPLAY_LINKS *LeftChild;
+  struct _RTL_SPLAY_LINKS *RightChild;
+} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
+
+/* RTL Functions */
+
+#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
+
+#define RtlGetCallersAddress(CallersAddress, CallersCaller) \
+    *CallersAddress = (PVOID)_ReturnAddress(); \
+    *CallersCaller = NULL;
+#else
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSYSAPI
+VOID
+NTAPI
+RtlGetCallersAddress(
+  OUT PVOID *CallersAddress,
+  OUT PVOID *CallersCaller);
+#endif
+
+#endif
+
+#if !defined(MIDL_PASS)
+
+FORCEINLINE
+LUID
+NTAPI_INLINE
+RtlConvertLongToLuid(
+  IN LONG Val)
+{
+  LUID Luid;
+  LARGE_INTEGER Temp;
+
+  Temp.QuadPart = Val;
+  Luid.LowPart = Temp.u.LowPart;
+  Luid.HighPart = Temp.u.HighPart;
+  return Luid;
+}
+
+FORCEINLINE
+LUID
+NTAPI_INLINE
+RtlConvertUlongToLuid(
+  IN ULONG Val)
+{
+  LUID Luid;
+
+  Luid.LowPart = Val;
+  Luid.HighPart = 0;
+  return Luid;
+}
+
+#endif
+
+#if defined(_AMD64_) || defined(_IA64_)
+//DECLSPEC_DEPRECATED_DDK_WINXP
+__inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlLargeIntegerDivide(
+  IN LARGE_INTEGER Dividend,
+  IN LARGE_INTEGER Divisor,
+  OUT PLARGE_INTEGER Remainder OPTIONAL)
+{
+  LARGE_INTEGER ret;
+  ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
+  if (Remainder)
+    Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
+  return ret;
+}
+
+#else
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlLargeIntegerDivide(
+  IN LARGE_INTEGER Dividend,
+  IN LARGE_INTEGER Divisor,
+  OUT PLARGE_INTEGER Remainder OPTIONAL);
+#endif
+
+#endif /* defined(_AMD64_) || defined(_IA64_) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlPrefixUnicodeString(
+  IN PCUNICODE_STRING  String1,
+  IN PCUNICODE_STRING  String2,
+  IN BOOLEAN  CaseInSensitive);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlUpperString(
+  IN OUT PSTRING  DestinationString,
+  IN const PSTRING  SourceString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeString(
+  IN OUT PUNICODE_STRING DestinationString,
+  IN PCUNICODE_STRING  SourceString,
+  IN BOOLEAN  AllocateDestinationString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlMapGenericMask(
+  IN OUT PACCESS_MASK AccessMask,
+  IN PGENERIC_MAPPING GenericMapping);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlVolumeDeviceToDosName(
+  IN PVOID VolumeDeviceObject,
+  OUT PUNICODE_STRING DosName);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetVersion(
+  IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlVerifyVersionInfo(
+  IN PRTL_OSVERSIONINFOEXW VersionInfo,
+  IN ULONG TypeMask,
+  IN ULONGLONG ConditionMask);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareString(
+  IN const PSTRING String1,
+  IN const PSTRING String2,
+  BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyString(
+  OUT PSTRING DestinationString,
+  IN const PSTRING SourceString OPTIONAL);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualString(
+  IN const PSTRING String1,
+  IN const PSTRING String2,
+  IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCharToInteger(
+  IN PCSZ String,
+  IN ULONG Base OPTIONAL,
+  OUT PULONG Value);
+
+NTSYSAPI
+CHAR
+NTAPI
+RtlUpperChar(
+  IN CHAR Character);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlWalkFrameChain(
+  OUT PVOID *Callers,
+  IN ULONG Count,
+  IN ULONG Flags);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+/* Security reference monitor routines */
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeSinglePrivilegeCheck(
+  IN LUID PrivilegeValue,
+  IN KPROCESSOR_MODE PreviousMode);
+#endif
+
+/* ZwXxx Functions */
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTSTATUS
+NTAPI
+ZwCancelTimer(
+  IN HANDLE TimerHandle,
+  OUT PBOOLEAN CurrentState OPTIONAL);
+
+NTSTATUS
+NTAPI
+ZwCreateTimer(
+  OUT PHANDLE TimerHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN TIMER_TYPE TimerType);
+
+NTSTATUS
+NTAPI
+ZwOpenTimer(
+  OUT PHANDLE TimerHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetInformationThread(
+  IN HANDLE ThreadHandle,
+  IN THREADINFOCLASS ThreadInformationClass,
+  IN PVOID ThreadInformation,
+  IN ULONG ThreadInformationLength);
+
+NTSTATUS
+NTAPI
+ZwSetTimer(
+  IN HANDLE TimerHandle,
+  IN PLARGE_INTEGER DueTime,
+  IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
+  IN PVOID TimerContext OPTIONAL,
+  IN BOOLEAN ResumeTimer,
+  IN LONG Period OPTIONAL,
+  OUT PBOOLEAN PreviousState OPTIONAL);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
 
 
 #endif /* _NTDDK_ */
index c452234..f2fdc5b 100644 (file)
@@ -35,6 +35,41 @@ extern "C" {
 DEFINE_GUID(GUID_DEVINTERFACE_DISPLAY_ADAPTER, \
   0x5b45201d, 0xf2f2, 0x4f3b, 0x85, 0xbb, 0x30, 0xff, 0x1f, 0x95, 0x35, 0x99);
 
+#define IOCTL_VIDEO_ENABLE_VDM \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x00, METHOD_BUFFERED, FILE_ANY_ACCESS)
+    
+#define IOCTL_VIDEO_DISABLE_VDM \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x01, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_REGISTER_VDM \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x02, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_SET_OUTPUT_DEVICE_POWER_STATE \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x03, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_GET_OUTPUT_DEVICE_POWER_STATE \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x04, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_MONITOR_DEVICE \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x05, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_ENUM_MONITOR_PDO \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x06, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_INIT_WIN32K_CALLBACKS \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x07, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_HANDLE_VIDEOPARAMETERS \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x08, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_IS_VGA_DEVICE \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x09, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_USE_DEVICE_IN_SESSION \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x0a, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_VIDEO_PREPARE_FOR_EARECOVERY \
+  CTL_CODE(FILE_DEVICE_VIDEO, 0x0b, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
 #define IOCTL_VIDEO_DISABLE_CURSOR \
   CTL_CODE (FILE_DEVICE_VIDEO, 0x109, METHOD_BUFFERED, FILE_ANY_ACCESS)
@@ -60,9 +95,6 @@ DEFINE_GUID(GUID_DEVINTERFACE_DISPLAY_ADAPTER, \
 #define IOCTL_VIDEO_GET_POWER_MANAGEMENT \
   CTL_CODE(FILE_DEVICE_VIDEO, 0x11c, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
-#define IOCTL_VIDEO_HANDLE_VIDEOPARAMETERS \
-  CTL_CODE(FILE_DEVICE_VIDEO, 0x08, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
 #define IOCTL_VIDEO_LOAD_AND_SET_FONT \
   CTL_CODE(FILE_DEVICE_VIDEO, 0x105, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
index ae1e502..5f03272 100644 (file)
  *
  */
 
-#ifndef _NTIFS_
-#define _NTIFS_
-#define _GNU_NTIFS_
+#pragma once
 
-#define NTKERNELAPI DECLSPEC_IMPORT
+#define _NTIFS_INCLUDED_
+#define _GNU_NTIFS_
 
-#include <ntddk.h>
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
 
-#define _NTIFS_INCLUDED_
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#pragma pack(push,4)
+#if !defined(_NTHALDLL_) && !defined(_BLDR_)
+#define NTHALAPI DECLSPEC_IMPORT
+#else
+#define NTHALAPI
+#endif
 
-#ifndef VER_PRODUCTBUILD
-#define VER_PRODUCTBUILD 10000
+/* For ReactOS */
+#if !defined(_NTOSKRNL_) && !defined(_BLDR_)
+#define NTKERNELAPI DECLSPEC_IMPORT
+#else
+#define NTKERNELAPI
 #endif
 
-#define EX_PUSH_LOCK ULONG_PTR
-#define PEX_PUSH_LOCK PULONG_PTR
+/* Dependencies */
+#include <ntddk.h>
+#include <excpt.h>
+#include <ntdef.h>
+#include <ntnls.h>
+#include <ntstatus.h>
+#include <bugcodes.h>
+/* FIXME : #include <ntiologc.h> */
 
-    
 #ifndef FlagOn
 #define FlagOn(_F,_SF)        ((_F) & (_SF))
 #endif
-    
+
 #ifndef BooleanFlagOn
 #define BooleanFlagOn(F,SF)   ((BOOLEAN)(((F) & (SF)) != 0))
 #endif
-    
+
 #ifndef SetFlag
 #define SetFlag(_F,_SF)       ((_F) |= (_SF))
 #endif
-    
+
 #ifndef ClearFlag
 #define ClearFlag(_F,_SF)     ((_F) &= ~(_SF))
 #endif
-    
-#include "csq.h"
 
-#ifdef _NTOSKRNL_
-extern PUCHAR                       FsRtlLegalAnsiCharacterArray;
+#define PsGetCurrentProcess IoGetCurrentProcess
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+extern NTSYSAPI volatile CCHAR KeNumberProcessors;
+#elif (NTDDI_VERSION >= NTDDI_WINXP)
+extern NTSYSAPI CCHAR KeNumberProcessors;
 #else
-extern DECLSPEC_IMPORT PUCHAR       FsRtlLegalAnsiCharacterArray;
+extern PCCHAR KeNumberProcessors;
 #endif
-extern PACL                         SePublicDefaultDacl;
-extern PACL                         SeSystemDefaultDacl;
-
-extern KSPIN_LOCK                   IoStatisticsLock;
-extern ULONG                        IoReadOperationCount;
-extern ULONG                        IoWriteOperationCount;
-extern ULONG                        IoOtherOperationCount;
-extern LARGE_INTEGER                IoReadTransferCount;
-extern LARGE_INTEGER                IoWriteTransferCount;
-extern LARGE_INTEGER                IoOtherTransferCount;
 
+typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;
 typedef STRING LSA_STRING, *PLSA_STRING;
-typedef ULONG  LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE;
+typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES;
 
-typedef enum _SECURITY_LOGON_TYPE
-{
-    UndefinedLogonType = 0,
-    Interactive = 2,
-    Network,
-    Batch,
-    Service,
-    Proxy,
-    Unlock,
-    NetworkCleartext,
-    NewCredentials,
-#if (_WIN32_WINNT >= 0x0501)
-    RemoteInteractive,
-    CachedInteractive,
+#ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
+#define SID_IDENTIFIER_AUTHORITY_DEFINED
+typedef struct _SID_IDENTIFIER_AUTHORITY {
+  UCHAR Value[6];
+} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
 #endif
-#if (_WIN32_WINNT >= 0x0502)
-    CachedRemoteInteractive,
-    CachedUnlock
+
+#ifndef SID_DEFINED
+#define SID_DEFINED
+typedef struct _SID {
+   UCHAR  Revision;
+   UCHAR  SubAuthorityCount;
+   SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
+   ULONG SubAuthority[ANYSIZE_ARRAY];
+} SID, *PISID;
 #endif
-} SECURITY_LOGON_TYPE, *PSECURITY_LOGON_TYPE;
 
-#define ANSI_DOS_STAR                   ('<')
-#define ANSI_DOS_QM                     ('>')
-#define ANSI_DOS_DOT                    ('"')
+#define SID_REVISION                    1
+#define SID_MAX_SUB_AUTHORITIES         15
+#define SID_RECOMMENDED_SUB_AUTHORITIES 1
 
-#define DOS_STAR                        (L'<')
-#define DOS_QM                          (L'>')
-#define DOS_DOT                         (L'"')
+typedef enum _SID_NAME_USE {
+    SidTypeUser = 1,
+    SidTypeGroup,
+    SidTypeDomain,
+    SidTypeAlias,
+    SidTypeWellKnownGroup,
+    SidTypeDeletedAccount,
+    SidTypeInvalid,
+    SidTypeUnknown,
+    SidTypeComputer,
+    SidTypeLabel
+} SID_NAME_USE, *PSID_NAME_USE;
+
+typedef struct _SID_AND_ATTRIBUTES {
+  PSID Sid;
+  ULONG Attributes;
+} SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES;
+typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
+typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
+
+#define SID_HASH_SIZE 32
+typedef ULONG_PTR SID_HASH_ENTRY, *PSID_HASH_ENTRY;
+
+typedef struct _SID_AND_ATTRIBUTES_HASH {
+  ULONG SidCount;
+  PSID_AND_ATTRIBUTES SidAttr;
+  SID_HASH_ENTRY Hash[SID_HASH_SIZE];
+} SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH;
+
+/* Universal well-known SIDs */
+
+#define SECURITY_NULL_SID_AUTHORITY         {0,0,0,0,0,0}
+#define SECURITY_WORLD_SID_AUTHORITY        {0,0,0,0,0,1}
+#define SECURITY_LOCAL_SID_AUTHORITY        {0,0,0,0,0,2}
+#define SECURITY_CREATOR_SID_AUTHORITY      {0,0,0,0,0,3}
+#define SECURITY_NON_UNIQUE_AUTHORITY       {0,0,0,0,0,4}
+#define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}
+
+#define SECURITY_NULL_RID                 (0x00000000L)
+#define SECURITY_WORLD_RID                (0x00000000L)
+#define SECURITY_LOCAL_RID                (0x00000000L)
+#define SECURITY_LOCAL_LOGON_RID          (0x00000001L)
+
+#define SECURITY_CREATOR_OWNER_RID        (0x00000000L)
+#define SECURITY_CREATOR_GROUP_RID        (0x00000001L)
+#define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
+#define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
+#define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L)
+
+/* NT well-known SIDs */
+
+#define SECURITY_NT_AUTHORITY           {0,0,0,0,0,5}
+
+#define SECURITY_DIALUP_RID             (0x00000001L)
+#define SECURITY_NETWORK_RID            (0x00000002L)
+#define SECURITY_BATCH_RID              (0x00000003L)
+#define SECURITY_INTERACTIVE_RID        (0x00000004L)
+#define SECURITY_LOGON_IDS_RID          (0x00000005L)
+#define SECURITY_LOGON_IDS_RID_COUNT    (3L)
+#define SECURITY_SERVICE_RID            (0x00000006L)
+#define SECURITY_ANONYMOUS_LOGON_RID    (0x00000007L)
+#define SECURITY_PROXY_RID              (0x00000008L)
+#define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)
+#define SECURITY_SERVER_LOGON_RID       SECURITY_ENTERPRISE_CONTROLLERS_RID
+#define SECURITY_PRINCIPAL_SELF_RID     (0x0000000AL)
+#define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)
+#define SECURITY_RESTRICTED_CODE_RID    (0x0000000CL)
+#define SECURITY_TERMINAL_SERVER_RID    (0x0000000DL)
+#define SECURITY_REMOTE_LOGON_RID       (0x0000000EL)
+#define SECURITY_THIS_ORGANIZATION_RID  (0x0000000FL)
+#define SECURITY_IUSER_RID              (0x00000011L)
+#define SECURITY_LOCAL_SYSTEM_RID       (0x00000012L)
+#define SECURITY_LOCAL_SERVICE_RID      (0x00000013L)
+#define SECURITY_NETWORK_SERVICE_RID    (0x00000014L)
+#define SECURITY_NT_NON_UNIQUE          (0x00000015L)
+#define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT  (3L)
+#define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L)
+
+#define SECURITY_BUILTIN_DOMAIN_RID     (0x00000020L)
+#define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L)
+
+
+#define SECURITY_PACKAGE_BASE_RID       (0x00000040L)
+#define SECURITY_PACKAGE_RID_COUNT      (2L)
+#define SECURITY_PACKAGE_NTLM_RID       (0x0000000AL)
+#define SECURITY_PACKAGE_SCHANNEL_RID   (0x0000000EL)
+#define SECURITY_PACKAGE_DIGEST_RID     (0x00000015L)
+
+#define SECURITY_CRED_TYPE_BASE_RID             (0x00000041L)
+#define SECURITY_CRED_TYPE_RID_COUNT            (2L)
+#define SECURITY_CRED_TYPE_THIS_ORG_CERT_RID    (0x00000001L)
+
+#define SECURITY_MIN_BASE_RID          (0x00000050L)
+#define SECURITY_SERVICE_ID_BASE_RID    (0x00000050L)
+#define SECURITY_SERVICE_ID_RID_COUNT   (6L)
+#define SECURITY_RESERVED_ID_BASE_RID   (0x00000051L)
+#define SECURITY_APPPOOL_ID_BASE_RID    (0x00000052L)
+#define SECURITY_APPPOOL_ID_RID_COUNT   (6L)
+#define SECURITY_VIRTUALSERVER_ID_BASE_RID    (0x00000053L)
+#define SECURITY_VIRTUALSERVER_ID_RID_COUNT   (6L)
+#define SECURITY_USERMODEDRIVERHOST_ID_BASE_RID  (0x00000054L)
+#define SECURITY_USERMODEDRIVERHOST_ID_RID_COUNT (6L)
+#define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_BASE_RID  (0x00000055L)
+#define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_RID_COUNT (6L)
+#define SECURITY_WMIHOST_ID_BASE_RID  (0x00000056L)
+#define SECURITY_WMIHOST_ID_RID_COUNT (6L)
+#define SECURITY_TASK_ID_BASE_RID                 (0x00000057L)
+#define SECURITY_NFS_ID_BASE_RID        (0x00000058L)
+#define SECURITY_COM_ID_BASE_RID        (0x00000059L)
+#define SECURITY_VIRTUALACCOUNT_ID_RID_COUNT   (6L)
+
+#define SECURITY_MAX_BASE_RID          (0x0000006FL)
+
+#define SECURITY_MAX_ALWAYS_FILTERED    (0x000003E7L)
+#define SECURITY_MIN_NEVER_FILTERED     (0x000003E8L)
+
+#define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L)
+
+#define SECURITY_WINDOWSMOBILE_ID_BASE_RID (0x00000070L)
+
+/* Well-known domain relative sub-authority values (RIDs) */
+
+#define DOMAIN_GROUP_RID_ENTERPRISE_READONLY_DOMAIN_CONTROLLERS (0x000001F2L)
+
+#define FOREST_USER_RID_MAX            (0x000001F3L)
+
+/* Well-known users */
+
+#define DOMAIN_USER_RID_ADMIN          (0x000001F4L)
+#define DOMAIN_USER_RID_GUEST          (0x000001F5L)
+#define DOMAIN_USER_RID_KRBTGT         (0x000001F6L)
+
+#define DOMAIN_USER_RID_MAX            (0x000003E7L)
+
+/* Well-known groups */
+
+#define DOMAIN_GROUP_RID_ADMINS        (0x00000200L)
+#define DOMAIN_GROUP_RID_USERS         (0x00000201L)
+#define DOMAIN_GROUP_RID_GUESTS        (0x00000202L)
+#define DOMAIN_GROUP_RID_COMPUTERS     (0x00000203L)
+#define DOMAIN_GROUP_RID_CONTROLLERS   (0x00000204L)
+#define DOMAIN_GROUP_RID_CERT_ADMINS   (0x00000205L)
+#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)
+#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)
+#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)
+#define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)
+
+/* Well-known aliases */
+
+#define DOMAIN_ALIAS_RID_ADMINS                         (0x00000220L)
+#define DOMAIN_ALIAS_RID_USERS                          (0x00000221L)
+#define DOMAIN_ALIAS_RID_GUESTS                         (0x00000222L)
+#define DOMAIN_ALIAS_RID_POWER_USERS                    (0x00000223L)
+
+#define DOMAIN_ALIAS_RID_ACCOUNT_OPS                    (0x00000224L)
+#define DOMAIN_ALIAS_RID_SYSTEM_OPS                     (0x00000225L)
+#define DOMAIN_ALIAS_RID_PRINT_OPS                      (0x00000226L)
+#define DOMAIN_ALIAS_RID_BACKUP_OPS                     (0x00000227L)
+
+#define DOMAIN_ALIAS_RID_REPLICATOR                     (0x00000228L)
+#define DOMAIN_ALIAS_RID_RAS_SERVERS                    (0x00000229L)
+#define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS               (0x0000022AL)
+#define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS           (0x0000022BL)
+#define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS      (0x0000022CL)
+#define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL)
+
+#define DOMAIN_ALIAS_RID_MONITORING_USERS               (0x0000022EL)
+#define DOMAIN_ALIAS_RID_LOGGING_USERS                  (0x0000022FL)
+#define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS            (0x00000230L)
+#define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS             (0x00000231L)
+#define DOMAIN_ALIAS_RID_DCOM_USERS                     (0x00000232L)
+#define DOMAIN_ALIAS_RID_IUSERS                         (0x00000238L)
+#define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS               (0x00000239L)
+#define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP     (0x0000023BL)
+#define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL)
+#define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP        (0x0000023DL)
+#define DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP      (0x0000023EL)
+
+#define SECURITY_MANDATORY_LABEL_AUTHORITY          {0,0,0,0,0,16}
+#define SECURITY_MANDATORY_UNTRUSTED_RID            (0x00000000L)
+#define SECURITY_MANDATORY_LOW_RID                  (0x00001000L)
+#define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)
+#define SECURITY_MANDATORY_HIGH_RID                 (0x00003000L)
+#define SECURITY_MANDATORY_SYSTEM_RID               (0x00004000L)
+#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID    (0x00005000L)
+
+/* SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that
+   can be set by a usermode caller.*/
+
+#define SECURITY_MANDATORY_MAXIMUM_USER_RID   SECURITY_MANDATORY_SYSTEM_RID
+
+#define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000)
+
+/* Allocate the System Luid.  The first 1000 LUIDs are reserved.
+   Use #999 here (0x3e7 = 999) */
+
+#define SYSTEM_LUID                     { 0x3e7, 0x0 }
+#define ANONYMOUS_LOGON_LUID            { 0x3e6, 0x0 }
+#define LOCALSERVICE_LUID               { 0x3e5, 0x0 }
+#define NETWORKSERVICE_LUID             { 0x3e4, 0x0 }
+#define IUSER_LUID                      { 0x3e3, 0x0 }
+
+typedef struct _ACE_HEADER {
+  UCHAR AceType;
+  UCHAR AceFlags;
+  USHORT AceSize;
+} ACE_HEADER, *PACE_HEADER;
 
 /* also in winnt.h */
 #define ACCESS_MIN_MS_ACE_TYPE                  (0x0)
@@ -134,5489 +344,8792 @@ typedef enum _SECURITY_LOGON_TYPE
 #define SYSTEM_ALARM_CALLBACK_ACE_TYPE          (0xE)
 #define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE   (0xF)
 #define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE   (0x10)
-#define ACCESS_MAX_MS_V5_ACE_TYPE               (0x10)
+#define ACCESS_MAX_MS_V5_ACE_TYPE               (0x11)
+#define SYSTEM_MANDATORY_LABEL_ACE_TYPE         (0x11)
 
-#define COMPRESSION_FORMAT_NONE         (0x0000)
-#define COMPRESSION_FORMAT_DEFAULT      (0x0001)
-#define COMPRESSION_FORMAT_LZNT1        (0x0002)
-#define COMPRESSION_ENGINE_STANDARD     (0x0000)
-#define COMPRESSION_ENGINE_MAXIMUM      (0x0100)
-#define COMPRESSION_ENGINE_HIBER        (0x0200)
+/* The following are the inherit flags that go into the AceFlags field
+   of an Ace header. */
 
-#define FILE_ACTION_ADDED                   0x00000001
-#define FILE_ACTION_REMOVED                 0x00000002
-#define FILE_ACTION_MODIFIED                0x00000003
-#define FILE_ACTION_RENAMED_OLD_NAME        0x00000004
-#define FILE_ACTION_RENAMED_NEW_NAME        0x00000005
-#define FILE_ACTION_ADDED_STREAM            0x00000006
-#define FILE_ACTION_REMOVED_STREAM          0x00000007
-#define FILE_ACTION_MODIFIED_STREAM         0x00000008
-#define FILE_ACTION_REMOVED_BY_DELETE       0x00000009
-#define FILE_ACTION_ID_NOT_TUNNELLED        0x0000000A
-#define FILE_ACTION_TUNNELLED_ID_COLLISION  0x0000000B
-/* end  winnt.h */
+#define OBJECT_INHERIT_ACE                (0x1)
+#define CONTAINER_INHERIT_ACE             (0x2)
+#define NO_PROPAGATE_INHERIT_ACE          (0x4)
+#define INHERIT_ONLY_ACE                  (0x8)
+#define INHERITED_ACE                     (0x10)
+#define VALID_INHERIT_FLAGS               (0x1F)
 
-#define FILE_EA_TYPE_BINARY             0xfffe
-#define FILE_EA_TYPE_ASCII              0xfffd
-#define FILE_EA_TYPE_BITMAP             0xfffb
-#define FILE_EA_TYPE_METAFILE           0xfffa
-#define FILE_EA_TYPE_ICON               0xfff9
-#define FILE_EA_TYPE_EA                 0xffee
-#define FILE_EA_TYPE_MVMT               0xffdf
-#define FILE_EA_TYPE_MVST               0xffde
-#define FILE_EA_TYPE_ASN1               0xffdd
-#define FILE_EA_TYPE_FAMILY_IDS         0xff01
+#define SUCCESSFUL_ACCESS_ACE_FLAG       (0x40)
+#define FAILED_ACCESS_ACE_FLAG           (0x80)
 
-#define FILE_NEED_EA                    0x00000080
+typedef struct _ACCESS_ALLOWED_ACE {
+  ACE_HEADER Header;
+  ACCESS_MASK Mask;
+  ULONG SidStart;
+} ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE;
 
-/* also in winnt.h */
-#define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001
-#define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002
-#define FILE_NOTIFY_CHANGE_NAME         0x00000003
-#define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004
-#define FILE_NOTIFY_CHANGE_SIZE         0x00000008
-#define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010
-#define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020
-#define FILE_NOTIFY_CHANGE_CREATION     0x00000040
-#define FILE_NOTIFY_CHANGE_EA           0x00000080
-#define FILE_NOTIFY_CHANGE_SECURITY     0x00000100
-#define FILE_NOTIFY_CHANGE_STREAM_NAME  0x00000200
-#define FILE_NOTIFY_CHANGE_STREAM_SIZE  0x00000400
-#define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
-#define FILE_NOTIFY_VALID_MASK          0x00000fff
-/* end winnt.h */
+typedef struct _ACCESS_DENIED_ACE {
+  ACE_HEADER Header;
+  ACCESS_MASK Mask;
+  ULONG SidStart;
+} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE;
 
-#define FILE_OPLOCK_BROKEN_TO_LEVEL_2   0x00000007
-#define FILE_OPLOCK_BROKEN_TO_NONE      0x00000008
+typedef struct _SYSTEM_AUDIT_ACE {
+  ACE_HEADER Header;
+  ACCESS_MASK Mask;
+  ULONG SidStart;
+} SYSTEM_AUDIT_ACE, *PSYSTEM_AUDIT_ACE;
 
-#define FILE_OPBATCH_BREAK_UNDERWAY     0x00000009
+typedef struct _SYSTEM_ALARM_ACE {
+  ACE_HEADER Header;
+  ACCESS_MASK Mask;
+  ULONG SidStart;
+} SYSTEM_ALARM_ACE, *PSYSTEM_ALARM_ACE;
 
-#define FILE_CASE_SENSITIVE_SEARCH      0x00000001
-#define FILE_CASE_PRESERVED_NAMES       0x00000002
-#define FILE_UNICODE_ON_DISK            0x00000004
-#define FILE_PERSISTENT_ACLS            0x00000008
-#define FILE_FILE_COMPRESSION           0x00000010
-#define FILE_VOLUME_QUOTAS              0x00000020
-#define FILE_SUPPORTS_SPARSE_FILES      0x00000040
-#define FILE_SUPPORTS_REPARSE_POINTS    0x00000080
-#define FILE_SUPPORTS_REMOTE_STORAGE    0x00000100
-#define FS_LFN_APIS                     0x00004000
-#define FILE_VOLUME_IS_COMPRESSED       0x00008000
-#define FILE_SUPPORTS_OBJECT_IDS        0x00010000
-#define FILE_SUPPORTS_ENCRYPTION        0x00020000
-#define FILE_NAMED_STREAMS              0x00040000
-#define FILE_READ_ONLY_VOLUME           0x00080000
-#define FILE_SEQUENTIAL_WRITE_ONCE      0x00100000
-#define FILE_SUPPORTS_TRANSACTIONS      0x00200000
-    
-#define FILE_PIPE_BYTE_STREAM_TYPE      0x00000000
-#define FILE_PIPE_MESSAGE_TYPE          0x00000001
+typedef struct _SYSTEM_MANDATORY_LABEL_ACE {
+  ACE_HEADER Header;
+  ACCESS_MASK Mask;
+  ULONG SidStart;
+} SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;
 
-#define FILE_PIPE_BYTE_STREAM_MODE      0x00000000
-#define FILE_PIPE_MESSAGE_MODE          0x00000001
+#define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP         0x1
+#define SYSTEM_MANDATORY_LABEL_NO_READ_UP          0x2
+#define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP       0x4
+#define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP   | \
+                                           SYSTEM_MANDATORY_LABEL_NO_READ_UP    | \
+                                           SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP)
 
-#define FILE_PIPE_QUEUE_OPERATION       0x00000000
-#define FILE_PIPE_COMPLETE_OPERATION    0x00000001
+#define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR))
 
-#define FILE_PIPE_INBOUND               0x00000000
-#define FILE_PIPE_OUTBOUND              0x00000001
-#define FILE_PIPE_FULL_DUPLEX           0x00000002
+typedef USHORT SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL;
 
-#define FILE_PIPE_DISCONNECTED_STATE    0x00000001
-#define FILE_PIPE_LISTENING_STATE       0x00000002
-#define FILE_PIPE_CONNECTED_STATE       0x00000003
-#define FILE_PIPE_CLOSING_STATE         0x00000004
+#define SE_OWNER_DEFAULTED              0x0001
+#define SE_GROUP_DEFAULTED              0x0002
+#define SE_DACL_PRESENT                 0x0004
+#define SE_DACL_DEFAULTED               0x0008
+#define SE_SACL_PRESENT                 0x0010
+#define SE_SACL_DEFAULTED               0x0020
+#define SE_DACL_UNTRUSTED               0x0040
+#define SE_SERVER_SECURITY              0x0080
+#define SE_DACL_AUTO_INHERIT_REQ        0x0100
+#define SE_SACL_AUTO_INHERIT_REQ        0x0200
+#define SE_DACL_AUTO_INHERITED          0x0400
+#define SE_SACL_AUTO_INHERITED          0x0800
+#define SE_DACL_PROTECTED               0x1000
+#define SE_SACL_PROTECTED               0x2000
+#define SE_RM_CONTROL_VALID             0x4000
+#define SE_SELF_RELATIVE                0x8000
 
-#define FILE_PIPE_CLIENT_END            0x00000000
-#define FILE_PIPE_SERVER_END            0x00000001
+typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
+  UCHAR Revision;
+  UCHAR Sbz1;
+  SECURITY_DESCRIPTOR_CONTROL Control;
+  ULONG Owner;
+  ULONG Group;
+  ULONG Sacl;
+  ULONG Dacl;
+} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
 
-#define FILE_PIPE_READ_DATA             0x00000000
-#define FILE_PIPE_WRITE_SPACE           0x00000001
+typedef struct _SECURITY_DESCRIPTOR {
+  UCHAR Revision;
+  UCHAR Sbz1;
+  SECURITY_DESCRIPTOR_CONTROL Control;
+  PSID Owner;
+  PSID Group;
+  PACL Sacl;
+  PACL Dacl;
+} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
 
-#define FILE_STORAGE_TYPE_SPECIFIED             0x00000041  /* FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE */
-#define FILE_STORAGE_TYPE_DEFAULT               (StorageTypeDefault << FILE_STORAGE_TYPE_SHIFT)
-#define FILE_STORAGE_TYPE_DIRECTORY             (StorageTypeDirectory << FILE_STORAGE_TYPE_SHIFT)
-#define FILE_STORAGE_TYPE_FILE                  (StorageTypeFile << FILE_STORAGE_TYPE_SHIFT)
-#define FILE_STORAGE_TYPE_DOCFILE               (StorageTypeDocfile << FILE_STORAGE_TYPE_SHIFT)
-#define FILE_STORAGE_TYPE_JUNCTION_POINT        (StorageTypeJunctionPoint << FILE_STORAGE_TYPE_SHIFT)
-#define FILE_STORAGE_TYPE_CATALOG               (StorageTypeCatalog << FILE_STORAGE_TYPE_SHIFT)
-#define FILE_STORAGE_TYPE_STRUCTURED_STORAGE    (StorageTypeStructuredStorage << FILE_STORAGE_TYPE_SHIFT)
-#define FILE_STORAGE_TYPE_EMBEDDING             (StorageTypeEmbedding << FILE_STORAGE_TYPE_SHIFT)
-#define FILE_STORAGE_TYPE_STREAM                (StorageTypeStream << FILE_STORAGE_TYPE_SHIFT)
-#define FILE_MINIMUM_STORAGE_TYPE               FILE_STORAGE_TYPE_DEFAULT
-#define FILE_MAXIMUM_STORAGE_TYPE               FILE_STORAGE_TYPE_STREAM
-#define FILE_STORAGE_TYPE_MASK                  0x000f0000
-#define FILE_STORAGE_TYPE_SHIFT                 16
+typedef struct _OBJECT_TYPE_LIST {
+  USHORT Level;
+  USHORT Sbz;
+  GUID *ObjectType;
+} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
+
+#define ACCESS_OBJECT_GUID       0
+#define ACCESS_PROPERTY_SET_GUID 1
+#define ACCESS_PROPERTY_GUID     2
+#define ACCESS_MAX_LEVEL         4
+
+typedef enum _AUDIT_EVENT_TYPE {
+  AuditEventObjectAccess,
+  AuditEventDirectoryServiceAccess
+} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
 
-#define FILE_VC_QUOTA_NONE              0x00000000
-#define FILE_VC_QUOTA_TRACK             0x00000001
-#define FILE_VC_QUOTA_ENFORCE           0x00000002
-#define FILE_VC_QUOTA_MASK              0x00000003
+#define AUDIT_ALLOW_NO_PRIVILEGE 0x1
 
-#define FILE_VC_QUOTAS_LOG_VIOLATIONS   0x00000004
-#define FILE_VC_CONTENT_INDEX_DISABLED  0x00000008
+#define ACCESS_DS_SOURCE_A "DS"
+#define ACCESS_DS_SOURCE_W L"DS"
+#define ACCESS_DS_OBJECT_TYPE_NAME_A "Directory Service Object"
+#define ACCESS_DS_OBJECT_TYPE_NAME_W L"Directory Service Object"
+
+#define ACCESS_REASON_TYPE_MASK 0xffff0000
+#define ACCESS_REASON_DATA_MASK 0x0000ffff
+
+typedef enum _ACCESS_REASON_TYPE {
+  AccessReasonNone = 0x00000000,
+  AccessReasonAllowedAce = 0x00010000,
+  AccessReasonDeniedAce = 0x00020000,
+  AccessReasonAllowedParentAce = 0x00030000,
+  AccessReasonDeniedParentAce = 0x00040000,
+  AccessReasonMissingPrivilege = 0x00100000,
+  AccessReasonFromPrivilege = 0x00200000,
+  AccessReasonIntegrityLevel = 0x00300000,
+  AccessReasonOwnership = 0x00400000,
+  AccessReasonNullDacl = 0x00500000,
+  AccessReasonEmptyDacl = 0x00600000,
+  AccessReasonNoSD = 0x00700000,
+  AccessReasonNoGrant = 0x00800000
+} ACCESS_REASON_TYPE;
+
+typedef ULONG ACCESS_REASON;
+
+typedef struct _ACCESS_REASONS {
+  ACCESS_REASON Data[32];
+} ACCESS_REASONS, *PACCESS_REASONS;
+
+#define SE_SECURITY_DESCRIPTOR_FLAG_NO_OWNER_ACE    0x00000001
+#define SE_SECURITY_DESCRIPTOR_FLAG_NO_LABEL_ACE    0x00000002
+#define SE_SECURITY_DESCRIPTOR_VALID_FLAGS          0x00000003
+
+typedef struct _SE_SECURITY_DESCRIPTOR {
+  ULONG Size;
+  ULONG Flags;
+  PSECURITY_DESCRIPTOR SecurityDescriptor;
+} SE_SECURITY_DESCRIPTOR, *PSE_SECURITY_DESCRIPTOR;
+
+typedef struct _SE_ACCESS_REQUEST {
+  ULONG Size;
+  PSE_SECURITY_DESCRIPTOR SeSecurityDescriptor;
+  ACCESS_MASK DesiredAccess;
+  ACCESS_MASK PreviouslyGrantedAccess;
+  PSID PrincipalSelfSid;
+  PGENERIC_MAPPING GenericMapping;
+  ULONG ObjectTypeListCount;
+  POBJECT_TYPE_LIST ObjectTypeList;
+} SE_ACCESS_REQUEST, *PSE_ACCESS_REQUEST;
+
+typedef struct _SE_ACCESS_REPLY {
+  ULONG Size;
+  ULONG ResultListCount;
+  PACCESS_MASK GrantedAccess;
+  PNTSTATUS AccessStatus;
+  PACCESS_REASONS AccessReason;
+  PPRIVILEGE_SET* Privileges;
+} SE_ACCESS_REPLY, *PSE_ACCESS_REPLY;
+
+typedef enum _SE_AUDIT_OPERATION {
+  AuditPrivilegeObject,
+  AuditPrivilegeService,
+  AuditAccessCheck,
+  AuditOpenObject,
+  AuditOpenObjectWithTransaction,
+  AuditCloseObject,
+  AuditDeleteObject,
+  AuditOpenObjectForDelete,
+  AuditOpenObjectForDeleteWithTransaction,
+  AuditCloseNonObject,
+  AuditOpenNonObject,
+  AuditObjectReference,
+  AuditHandleCreation,
+} SE_AUDIT_OPERATION, *PSE_AUDIT_OPERATION;
+
+typedef struct _SE_AUDIT_INFO {
+  ULONG Size;
+  AUDIT_EVENT_TYPE AuditType;
+  SE_AUDIT_OPERATION AuditOperation;
+  ULONG AuditFlags;
+  UNICODE_STRING SubsystemName;
+  UNICODE_STRING ObjectTypeName;
+  UNICODE_STRING ObjectName;
+  PVOID HandleId;
+  GUID* TransactionId;
+  LUID* OperationId;
+  BOOLEAN ObjectCreation;
+  BOOLEAN GenerateOnClose;
+} SE_AUDIT_INFO, *PSE_AUDIT_INFO;
 
-#define FILE_VC_LOG_QUOTA_THRESHOLD     0x00000010
-#define FILE_VC_LOG_QUOTA_LIMIT         0x00000020
-#define FILE_VC_LOG_VOLUME_THRESHOLD    0x00000040
-#define FILE_VC_LOG_VOLUME_LIMIT        0x00000080
+#define TOKEN_ASSIGN_PRIMARY            (0x0001)
+#define TOKEN_DUPLICATE                 (0x0002)
+#define TOKEN_IMPERSONATE               (0x0004)
+#define TOKEN_QUERY                     (0x0008)
+#define TOKEN_QUERY_SOURCE              (0x0010)
+#define TOKEN_ADJUST_PRIVILEGES         (0x0020)
+#define TOKEN_ADJUST_GROUPS             (0x0040)
+#define TOKEN_ADJUST_DEFAULT            (0x0080)
+#define TOKEN_ADJUST_SESSIONID          (0x0100)
 
-#define FILE_VC_QUOTAS_INCOMPLETE       0x00000100
-#define FILE_VC_QUOTAS_REBUILDING       0x00000200
+#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED  |\
+                            TOKEN_ASSIGN_PRIMARY      |\
+                            TOKEN_DUPLICATE           |\
+                            TOKEN_IMPERSONATE         |\
+                            TOKEN_QUERY               |\
+                            TOKEN_QUERY_SOURCE        |\
+                            TOKEN_ADJUST_PRIVILEGES   |\
+                            TOKEN_ADJUST_GROUPS       |\
+                            TOKEN_ADJUST_DEFAULT )
+
+#if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT)))
+#define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P |\
+                           TOKEN_ADJUST_SESSIONID )
+#else
+#define TOKEN_ALL_ACCESS  (TOKEN_ALL_ACCESS_P)
+#endif
 
-#define FILE_VC_VALID_MASK              0x000003ff
+#define TOKEN_READ       (STANDARD_RIGHTS_READ     |\
+                          TOKEN_QUERY)
 
-#define FSRTL_FLAG_FILE_MODIFIED        (0x01)
-#define FSRTL_FLAG_FILE_LENGTH_CHANGED  (0x02)
-#define FSRTL_FLAG_LIMIT_MODIFIED_PAGES (0x04)
-#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_EX (0x08)
-#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_SH (0x10)
-#define FSRTL_FLAG_USER_MAPPED_FILE     (0x20)
-#define FSRTL_FLAG_ADVANCED_HEADER      (0x40)
-#define FSRTL_FLAG_EOF_ADVANCE_ACTIVE   (0x80)
+#define TOKEN_WRITE      (STANDARD_RIGHTS_WRITE    |\
+                          TOKEN_ADJUST_PRIVILEGES  |\
+                          TOKEN_ADJUST_GROUPS      |\
+                          TOKEN_ADJUST_DEFAULT)
 
-#define FSRTL_FLAG2_DO_MODIFIED_WRITE        (0x01)
-#define FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS (0x02)
-#define FSRTL_FLAG2_PURGE_WHEN_MAPPED        (0x04)
-#define FSRTL_FLAG2_IS_PAGING_FILE           (0x08)
+#define TOKEN_EXECUTE    (STANDARD_RIGHTS_EXECUTE)
 
-#define FSRTL_FSP_TOP_LEVEL_IRP         (0x01)
-#define FSRTL_CACHE_TOP_LEVEL_IRP       (0x02)
-#define FSRTL_MOD_WRITE_TOP_LEVEL_IRP   (0x03)
-#define FSRTL_FAST_IO_TOP_LEVEL_IRP     (0x04)
-#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG    (0x04)
+typedef enum _TOKEN_TYPE {
+  TokenPrimary = 1,
+  TokenImpersonation
+} TOKEN_TYPE,*PTOKEN_TYPE;
 
-#define FSRTL_VOLUME_DISMOUNT           1
-#define FSRTL_VOLUME_DISMOUNT_FAILED    2
-#define FSRTL_VOLUME_LOCK               3
-#define FSRTL_VOLUME_LOCK_FAILED        4
-#define FSRTL_VOLUME_UNLOCK             5
-#define FSRTL_VOLUME_MOUNT              6
+typedef enum _TOKEN_INFORMATION_CLASS {
+  TokenUser = 1,
+  TokenGroups,
+  TokenPrivileges,
+  TokenOwner,
+  TokenPrimaryGroup,
+  TokenDefaultDacl,
+  TokenSource,
+  TokenType,
+  TokenImpersonationLevel,
+  TokenStatistics,
+  TokenRestrictedSids,
+  TokenSessionId,
+  TokenGroupsAndPrivileges,
+  TokenSessionReference,
+  TokenSandBoxInert,
+  TokenAuditPolicy,
+  TokenOrigin,
+  TokenElevationType,
+  TokenLinkedToken,
+  TokenElevation,
+  TokenHasRestrictions,
+  TokenAccessInformation,
+  TokenVirtualizationAllowed,
+  TokenVirtualizationEnabled,
+  TokenIntegrityLevel,
+  TokenUIAccess,
+  TokenMandatoryPolicy,
+  TokenLogonSid,
+  MaxTokenInfoClass
+} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
 
-#define FSRTL_WILD_CHARACTER            0x08
+typedef struct _TOKEN_USER {
+  SID_AND_ATTRIBUTES User;
+} TOKEN_USER, *PTOKEN_USER;
 
-#define FSRTL_FAT_LEGAL                 0x01
-#define FSRTL_HPFS_LEGAL                0x02
-#define FSRTL_NTFS_LEGAL                0x04
-#define FSRTL_WILD_CHARACTER            0x08
-#define FSRTL_OLE_LEGAL                 0x10
-#define FSRTL_NTFS_STREAM_LEGAL         0x14
+typedef struct _TOKEN_GROUPS {
+  ULONG GroupCount;
+  SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
+} TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS;
 
-#ifdef _X86_
-#define HARDWARE_PTE    HARDWARE_PTE_X86
-#define PHARDWARE_PTE   PHARDWARE_PTE_X86
-#endif
+typedef struct _TOKEN_PRIVILEGES {
+  ULONG PrivilegeCount;
+  LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
+} TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES;
 
-#define IO_CHECK_CREATE_PARAMETERS      0x0200
-#define IO_ATTACH_DEVICE                0x0400
+typedef struct _TOKEN_OWNER {
+  PSID Owner;
+} TOKEN_OWNER,*PTOKEN_OWNER;
 
-#define IO_ATTACH_DEVICE_API            0x80000000
+typedef struct _TOKEN_PRIMARY_GROUP {
+  PSID PrimaryGroup;
+} TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP;
 
-#define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE    64
-#define IO_FILE_OBJECT_PAGED_POOL_CHARGE        1024
+typedef struct _TOKEN_DEFAULT_DACL {
+  PACL DefaultDacl;
+} TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL;
 
-#define IO_TYPE_APC                     18
-#define IO_TYPE_DPC                     19
-#define IO_TYPE_DEVICE_QUEUE            20
-#define IO_TYPE_EVENT_PAIR              21
-#define IO_TYPE_INTERRUPT               22
-#define IO_TYPE_PROFILE                 23
+typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
+  ULONG SidCount;
+  ULONG SidLength;
+  PSID_AND_ATTRIBUTES Sids;
+  ULONG RestrictedSidCount;
+  ULONG RestrictedSidLength;
+  PSID_AND_ATTRIBUTES RestrictedSids;
+  ULONG PrivilegeCount;
+  ULONG PrivilegeLength;
+  PLUID_AND_ATTRIBUTES Privileges;
+  LUID AuthenticationId;
+} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
 
-#define IRP_BEING_VERIFIED              0x10
+typedef struct _TOKEN_LINKED_TOKEN {
+  HANDLE LinkedToken;
+} TOKEN_LINKED_TOKEN, *PTOKEN_LINKED_TOKEN;
 
-#define MAILSLOT_CLASS_FIRSTCLASS       1
-#define MAILSLOT_CLASS_SECONDCLASS      2
+typedef struct _TOKEN_ELEVATION {
+  ULONG TokenIsElevated;
+} TOKEN_ELEVATION, *PTOKEN_ELEVATION;
 
-#define MAILSLOT_SIZE_AUTO              0
+typedef struct _TOKEN_MANDATORY_LABEL {
+  SID_AND_ATTRIBUTES Label;
+} TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;
 
-#define MEM_DOS_LIM                     0x40000000
+#define TOKEN_MANDATORY_POLICY_OFF             0x0
+#define TOKEN_MANDATORY_POLICY_NO_WRITE_UP     0x1
+#define TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN 0x2
 
-#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1
+#define TOKEN_MANDATORY_POLICY_VALID_MASK    (TOKEN_MANDATORY_POLICY_NO_WRITE_UP | \
+                                              TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN)
 
-#define OB_TYPE_TYPE                    1
-#define OB_TYPE_DIRECTORY               2
-#define OB_TYPE_SYMBOLIC_LINK           3
-#define OB_TYPE_TOKEN                   4
-#define OB_TYPE_PROCESS                 5
-#define OB_TYPE_THREAD                  6
-#define OB_TYPE_EVENT                   7
-#define OB_TYPE_EVENT_PAIR              8
-#define OB_TYPE_MUTANT                  9
-#define OB_TYPE_SEMAPHORE               10
-#define OB_TYPE_TIMER                   11
-#define OB_TYPE_PROFILE                 12
-#define OB_TYPE_WINDOW_STATION          13
-#define OB_TYPE_DESKTOP                 14
-#define OB_TYPE_SECTION                 15
-#define OB_TYPE_KEY                     16
-#define OB_TYPE_PORT                    17
-#define OB_TYPE_ADAPTER                 18
-#define OB_TYPE_CONTROLLER              19
-#define OB_TYPE_DEVICE                  20
-#define OB_TYPE_DRIVER                  21
-#define OB_TYPE_IO_COMPLETION           22
-#define OB_TYPE_FILE                    23
+typedef struct _TOKEN_MANDATORY_POLICY {
+  ULONG Policy;
+} TOKEN_MANDATORY_POLICY, *PTOKEN_MANDATORY_POLICY;
 
-#define PIN_WAIT                        (1)
-#define PIN_EXCLUSIVE                   (2)
-#define PIN_NO_READ                     (4)
-#define PIN_IF_BCB                      (8)
+typedef struct _TOKEN_ACCESS_INFORMATION {
+  PSID_AND_ATTRIBUTES_HASH SidHash;
+  PSID_AND_ATTRIBUTES_HASH RestrictedSidHash;
+  PTOKEN_PRIVILEGES Privileges;
+  LUID AuthenticationId;
+  TOKEN_TYPE TokenType;
+  SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+  TOKEN_MANDATORY_POLICY MandatoryPolicy;
+  ULONG Flags;
+} TOKEN_ACCESS_INFORMATION, *PTOKEN_ACCESS_INFORMATION;
 
-#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
-#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
+#define POLICY_AUDIT_SUBCATEGORY_COUNT (53)
 
-#define SEC_BASED      0x00200000
+typedef struct _TOKEN_AUDIT_POLICY {
+  UCHAR PerUserPolicy[((POLICY_AUDIT_SUBCATEGORY_COUNT) >> 1) + 1];
+} TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;
 
-#define SECURITY_WORLD_SID_AUTHORITY    {0,0,0,0,0,1}
-#define SECURITY_WORLD_RID              (0x00000000L)
+#define TOKEN_SOURCE_LENGTH 8
 
-#define SID_REVISION                    1
-#define SID_MAX_SUB_AUTHORITIES         15
-#define SID_RECOMMENDED_SUB_AUTHORITIES 1
+typedef struct _TOKEN_SOURCE {
+  CHAR SourceName[TOKEN_SOURCE_LENGTH];
+  LUID SourceIdentifier;
+} TOKEN_SOURCE,*PTOKEN_SOURCE;
 
-#define TOKEN_ASSIGN_PRIMARY            (0x0001)
-#define TOKEN_DUPLICATE                 (0x0002)
-#define TOKEN_IMPERSONATE               (0x0004)
-#define TOKEN_QUERY                     (0x0008)
-#define TOKEN_QUERY_SOURCE              (0x0010)
-#define TOKEN_ADJUST_PRIVILEGES         (0x0020)
-#define TOKEN_ADJUST_GROUPS             (0x0040)
-#define TOKEN_ADJUST_DEFAULT            (0x0080)
-#define TOKEN_ADJUST_SESSIONID          (0x0100)
+typedef struct _TOKEN_STATISTICS {
+  LUID TokenId;
+  LUID AuthenticationId;
+  LARGE_INTEGER ExpirationTime;
+  TOKEN_TYPE TokenType;
+  SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+  ULONG DynamicCharged;
+  ULONG DynamicAvailable;
+  ULONG GroupCount;
+  ULONG PrivilegeCount;
+  LUID ModifiedId;
+} TOKEN_STATISTICS, *PTOKEN_STATISTICS;
 
-#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
-                          TOKEN_ASSIGN_PRIMARY     |\
-                          TOKEN_DUPLICATE          |\
-                          TOKEN_IMPERSONATE        |\
-                          TOKEN_QUERY              |\
-                          TOKEN_QUERY_SOURCE       |\
-                          TOKEN_ADJUST_PRIVILEGES  |\
-                          TOKEN_ADJUST_GROUPS      |\
-                          TOKEN_ADJUST_DEFAULT     |\
-                          TOKEN_ADJUST_SESSIONID)
+typedef struct _TOKEN_CONTROL {
+  LUID TokenId;
+  LUID AuthenticationId;
+  LUID ModifiedId;
+  TOKEN_SOURCE TokenSource;
+} TOKEN_CONTROL,*PTOKEN_CONTROL;
 
-#define TOKEN_READ       (STANDARD_RIGHTS_READ     |\
-                          TOKEN_QUERY)
+typedef struct _TOKEN_ORIGIN {
+  LUID OriginatingLogonSession;
+} TOKEN_ORIGIN, *PTOKEN_ORIGIN;
 
-#define TOKEN_WRITE      (STANDARD_RIGHTS_WRITE    |\
-                          TOKEN_ADJUST_PRIVILEGES  |\
-                          TOKEN_ADJUST_GROUPS      |\
-                          TOKEN_ADJUST_DEFAULT)
+typedef enum _MANDATORY_LEVEL {
+  MandatoryLevelUntrusted = 0,
+  MandatoryLevelLow,
+  MandatoryLevelMedium,
+  MandatoryLevelHigh,
+  MandatoryLevelSystem,
+  MandatoryLevelSecureProcess,
+  MandatoryLevelCount
+} MANDATORY_LEVEL, *PMANDATORY_LEVEL;
+
+typedef enum _OBJECT_INFORMATION_CLASS {
+  ObjectBasicInformation = 0,
+  ObjectNameInformation = 1, /* FIXME, not in WDK */
+  ObjectTypeInformation = 2,
+  ObjectTypesInformation = 3, /* FIXME, not in WDK */
+  ObjectHandleFlagInformation = 4, /* FIXME, not in WDK */
+  ObjectSessionInformation = 5, /* FIXME, not in WDK */
+  MaxObjectInfoClass /* FIXME, not in WDK */
+} OBJECT_INFORMATION_CLASS;
 
-#define TOKEN_EXECUTE    (STANDARD_RIGHTS_EXECUTE)
+#if (NTDDI_VERSION >= NTDDI_NT4)
 
-#define TOKEN_SOURCE_LENGTH 8
-/* end winnt.h */
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryObject(
+  IN HANDLE Handle OPTIONAL,
+  IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
+  OUT PVOID ObjectInformation OPTIONAL,
+  IN ULONG ObjectInformationLength,
+  OUT PULONG ReturnLength OPTIONAL);
 
-#define TOKEN_HAS_TRAVERSE_PRIVILEGE    0x01
-#define TOKEN_HAS_BACKUP_PRIVILEGE      0x02
-#define TOKEN_HAS_RESTORE_PRIVILEGE     0x04
-#define TOKEN_HAS_ADMIN_GROUP           0x08
-#define TOKEN_WRITE_RESTRICTED          0x08
-#define TOKEN_IS_RESTRICTED             0x10
-#define SE_BACKUP_PRIVILEGES_CHECKED    0x0100
+#endif
 
-#define VACB_MAPPING_GRANULARITY        (0x40000)
-#define VACB_OFFSET_SHIFT               (18)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
-#define SE_OWNER_DEFAULTED              0x0001
-#define SE_GROUP_DEFAULTED              0x0002
-#define SE_DACL_PRESENT                 0x0004
-#define SE_DACL_DEFAULTED               0x0008
-#define SE_SACL_PRESENT                 0x0010
-#define SE_SACL_DEFAULTED               0x0020
-#define SE_DACL_UNTRUSTED               0x0040
-#define SE_SERVER_SECURITY              0x0080
-#define SE_DACL_AUTO_INHERIT_REQ        0x0100
-#define SE_SACL_AUTO_INHERIT_REQ        0x0200
-#define SE_DACL_AUTO_INHERITED          0x0400
-#define SE_SACL_AUTO_INHERITED          0x0800
-#define SE_DACL_PROTECTED               0x1000
-#define SE_SACL_PROTECTED               0x2000
-#define SE_RM_CONTROL_VALID             0x4000
-#define SE_SELF_RELATIVE                0x8000
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenThreadToken(
+  IN HANDLE ThreadHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN BOOLEAN OpenAsSelf,
+  OUT PHANDLE TokenHandle);
 
-#ifndef _WINNT_H
-#define _AUDIT_EVENT_TYPE_HACK 0
-#endif
-#if (_AUDIT_EVENT_TYPE_HACK == 1)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenProcessToken(
+  IN HANDLE ProcessHandle,
+  IN ACCESS_MASK DesiredAccess,
+  OUT PHANDLE TokenHandle);
 
-#else
-typedef enum _AUDIT_EVENT_TYPE
-{
-    AuditEventObjectAccess,
-    AuditEventDirectoryServiceAccess
-} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
-#endif
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryInformationToken(
+  IN HANDLE TokenHandle,
+  IN TOKEN_INFORMATION_CLASS TokenInformationClass,
+  OUT PVOID TokenInformation OPTIONAL,
+  IN ULONG TokenInformationLength,
+  OUT PULONG ReturnLength);
 
-#define AUDIT_ALLOW_NO_PRIVILEGE 0x1
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAdjustPrivilegesToken(
+  IN HANDLE TokenHandle,
+  IN BOOLEAN DisableAllPrivileges,
+  IN PTOKEN_PRIVILEGES NewState OPTIONAL,
+  IN ULONG BufferLength,
+  OUT PTOKEN_PRIVILEGES PreviousState,
+  OUT PULONG ReturnLength OPTIONAL);
 
-#define FSCTL_REQUEST_OPLOCK_LEVEL_1    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_REQUEST_OPLOCK_LEVEL_2    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_REQUEST_BATCH_OPLOCK      CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_OPLOCK_BREAK_NOTIFY       CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_UNLOCK_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_DISMOUNT_VOLUME           CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtCreateFile(
+  OUT PHANDLE FileHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN PLARGE_INTEGER AllocationSize OPTIONAL,
+  IN ULONG FileAttributes,
+  IN ULONG ShareAccess,
+  IN ULONG CreateDisposition,
+  IN ULONG CreateOptions,
+  IN PVOID EaBuffer,
+  IN ULONG EaLength);
 
-#define FSCTL_IS_VOLUME_MOUNTED         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_IS_PATHNAME_VALID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_MARK_VOLUME_DIRTY         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtDeviceIoControlFile(
+  IN HANDLE FileHandle,
+  IN HANDLE Event OPTIONAL,
+  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+  IN PVOID ApcContext OPTIONAL,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG IoControlCode,
+  IN PVOID InputBuffer OPTIONAL,
+  IN ULONG InputBufferLength,
+  OUT PVOID OutputBuffer OPTIONAL,
+  IN ULONG OutputBufferLength);
 
-#define FSCTL_QUERY_RETRIEVAL_POINTERS  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14,  METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_GET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_SET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtFsControlFile(
+  IN HANDLE FileHandle,
+  IN HANDLE Event OPTIONAL,
+  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+  IN PVOID ApcContext OPTIONAL,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG FsControlCode,
+  IN PVOID InputBuffer OPTIONAL,
+  IN ULONG InputBufferLength,
+  OUT PVOID OutputBuffer OPTIONAL,
+  IN ULONG OutputBufferLength);
 
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtLockFile(
+  IN HANDLE FileHandle,
+  IN HANDLE Event OPTIONAL,
+  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+  IN PVOID ApcContext OPTIONAL,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN PLARGE_INTEGER ByteOffset,
+  IN PLARGE_INTEGER Length,
+  IN ULONG Key,
+  IN BOOLEAN FailImmediately,
+  IN BOOLEAN ExclusiveLock);
 
-#define FSCTL_MARK_AS_SYSTEM_HIVE       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19,  METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_OPLOCK_BREAK_ACK_NO_2     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_INVALIDATE_VOLUMES        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_QUERY_FAT_BPB             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_REQUEST_FILTER_OPLOCK     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenFile(
+  OUT PHANDLE FileHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG ShareAccess,
+  IN ULONG OpenOptions);
 
-#if (VER_PRODUCTBUILD >= 1381)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryDirectoryFile(
+  IN HANDLE FileHandle,
+  IN HANDLE Event OPTIONAL,
+  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+  IN PVOID ApcContext OPTIONAL,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  OUT PVOID FileInformation,
+  IN ULONG Length,
+  IN FILE_INFORMATION_CLASS FileInformationClass,
+  IN BOOLEAN ReturnSingleEntry,
+  IN PUNICODE_STRING FileName OPTIONAL,
+  IN BOOLEAN RestartScan);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryInformationFile(
+  IN HANDLE FileHandle,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  OUT PVOID FileInformation,
+  IN ULONG Length,
+  IN FILE_INFORMATION_CLASS FileInformationClass);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryQuotaInformationFile(
+  IN HANDLE FileHandle,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  OUT PVOID Buffer,
+  IN ULONG Length,
+  IN BOOLEAN ReturnSingleEntry,
+  IN PVOID SidList,
+  IN ULONG SidListLength,
+  IN PSID StartSid OPTIONAL,
+  IN BOOLEAN RestartScan);
 
-#define FSCTL_GET_NTFS_VOLUME_DATA      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_GET_NTFS_FILE_RECORD      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_GET_VOLUME_BITMAP         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27,  METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_GET_RETRIEVAL_POINTERS    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28,  METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_MOVE_FILE                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_IS_VOLUME_DIRTY           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_GET_HFS_INFORMATION       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_ALLOW_EXTENDED_DASD_IO    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER,  FILE_ANY_ACCESS)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryVolumeInformationFile(
+  IN HANDLE FileHandle,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  OUT PVOID FsInformation,
+  IN ULONG Length,
+  IN FS_INFORMATION_CLASS FsInformationClass);
 
-#endif /* (VER_PRODUCTBUILD >= 1381) */
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtReadFile(
+  IN HANDLE FileHandle,
+  IN HANDLE Event OPTIONAL,
+  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+  IN PVOID ApcContext OPTIONAL,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  OUT PVOID Buffer,
+  IN ULONG Length,
+  IN PLARGE_INTEGER ByteOffset OPTIONAL,
+  IN PULONG Key OPTIONAL);
 
-#if (VER_PRODUCTBUILD >= 2195)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetInformationFile(
+  IN HANDLE FileHandle,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN PVOID FileInformation,
+  IN ULONG Length,
+  IN FILE_INFORMATION_CLASS FileInformationClass);
 
-#define FSCTL_READ_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 33, METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_WRITE_PROPERTY_DATA       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 34, METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_FIND_FILES_BY_SID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetQuotaInformationFile(
+  IN HANDLE FileHandle,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN PVOID Buffer,
+  IN ULONG Length);
 
-#define FSCTL_DUMP_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 37,  METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_SET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_GET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_DELETE_OBJECT_ID          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_SET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_GET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_DELETE_REPARSE_POINT      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_ENUM_USN_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44,  METHOD_NEITHER, FILE_READ_DATA)
-#define FSCTL_SECURITY_ID_CHECK         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45,  METHOD_NEITHER, FILE_READ_DATA)
-#define FSCTL_READ_USN_JOURNAL          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46,  METHOD_NEITHER, FILE_READ_DATA)
-#define FSCTL_SET_OBJECT_ID_EXTENDED    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_CREATE_OR_GET_OBJECT_ID   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_SET_SPARSE                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_SET_ZERO_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_QUERY_ALLOCATED_RANGES    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51,  METHOD_NEITHER, FILE_READ_DATA)
-#define FSCTL_ENABLE_UPGRADE            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_SET_ENCRYPTION            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_ENCRYPTION_FSCTL_IO       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54,  METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_WRITE_RAW_ENCRYPTED       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55,  METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_READ_RAW_ENCRYPTED        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56,  METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_CREATE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57,  METHOD_NEITHER, FILE_READ_DATA)
-#define FSCTL_READ_FILE_USN_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58,  METHOD_NEITHER, FILE_READ_DATA)
-#define FSCTL_WRITE_USN_CLOSE_RECORD    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59,  METHOD_NEITHER, FILE_READ_DATA)
-#define FSCTL_EXTEND_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_QUERY_USN_JOURNAL         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_DELETE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_MARK_HANDLE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_SIS_COPYFILE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_SIS_LINK_FILES            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
-#define FSCTL_HSM_MSG                   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 66, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
-#define FSCTL_NSS_CONTROL               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 67, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_HSM_DATA                  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 68, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
-#define FSCTL_RECALL_FILE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_NSS_RCONTROL              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 70, METHOD_BUFFERED, FILE_READ_DATA)
-#define FSCTL_READ_FROM_PLEX            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
-#define FSCTL_FILE_PREFETCH             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetVolumeInformationFile(
+  IN HANDLE FileHandle,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN PVOID FsInformation,
+  IN ULONG Length,
+  IN FS_INFORMATION_CLASS FsInformationClass);
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtWriteFile(
+  IN HANDLE FileHandle,
+  IN HANDLE Event OPTIONAL,
+  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+  IN PVOID ApcContext OPTIONAL,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN PVOID Buffer,
+  IN ULONG Length,
+  IN PLARGE_INTEGER ByteOffset OPTIONAL,
+  IN PULONG Key OPTIONAL);
 
-#define FSCTL_MAILSLOT_PEEK             CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtUnlockFile(
+  IN HANDLE FileHandle,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN PLARGE_INTEGER ByteOffset,
+  IN PLARGE_INTEGER Length,
+  IN ULONG Key);
 
-#define FSCTL_NETWORK_SET_CONFIGURATION_INFO    CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 102, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
-#define FSCTL_NETWORK_GET_CONFIGURATION_INFO    CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 103, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
-#define FSCTL_NETWORK_GET_CONNECTION_INFO       CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 104, METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_NETWORK_ENUMERATE_CONNECTIONS     CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 105, METHOD_NEITHER, FILE_ANY_ACCESS)
-#define FSCTL_NETWORK_DELETE_CONNECTION         CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 107, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_NETWORK_GET_STATISTICS            CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 116, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_NETWORK_SET_DOMAIN_NAME           CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT     CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetSecurityObject(
+  IN HANDLE Handle,
+  IN SECURITY_INFORMATION SecurityInformation,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor);
 
-#define FSCTL_PIPE_ASSIGN_EVENT         CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_DISCONNECT           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_LISTEN               CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_PEEK                 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
-#define FSCTL_PIPE_QUERY_EVENT          CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_TRANSCEIVE           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER,  FILE_READ_DATA | FILE_WRITE_DATA)
-#define FSCTL_PIPE_WAIT                 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_IMPERSONATE          CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_SET_CLIENT_PROCESS   CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_INTERNAL_READ        CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
-#define FSCTL_PIPE_INTERNAL_WRITE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_PIPE_INTERNAL_TRANSCEIVE  CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
-#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQuerySecurityObject(
+  IN HANDLE Handle,
+  IN SECURITY_INFORMATION SecurityInformation,
+  OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN ULONG Length,
+  OUT PULONG LengthNeeded);
 
-#define IOCTL_REDIR_QUERY_PATH          CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtClose(
+  IN HANDLE Handle);
 
-typedef PVOID OPLOCK, *POPLOCK;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAllocateVirtualMemory(
+  IN HANDLE ProcessHandle,
+  IN OUT PVOID *BaseAddress,
+  IN ULONG_PTR ZeroBits,
+  IN OUT PSIZE_T RegionSize,
+  IN ULONG AllocationType,
+  IN ULONG Protect);
 
-//
-// Forwarders
-//
-struct _RTL_AVL_TABLE;
-struct _RTL_GENERIC_TABLE;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtFreeVirtualMemory(
+  IN HANDLE ProcessHandle,
+  IN OUT PVOID *BaseAddress,
+  IN OUT PSIZE_T RegionSize,
+  IN ULONG FreeType);
 
-typedef ULONG LBN;
-typedef LBN *PLBN;
+#endif
 
-typedef ULONG VBN;
-typedef VBN *PVBN;
+#if (NTDDI_VERSION >= NTDDI_WINXP)
 
-typedef PVOID PNOTIFY_SYNC;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenThreadTokenEx(
+  IN HANDLE ThreadHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN BOOLEAN OpenAsSelf,
+  IN ULONG HandleAttributes,
+  OUT PHANDLE TokenHandle);
 
-typedef enum _FAST_IO_POSSIBLE {
-    FastIoIsNotPossible,
-    FastIoIsPossible,
-    FastIoIsQuestionable
-} FAST_IO_POSSIBLE;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenProcessTokenEx(
+  IN HANDLE ProcessHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN ULONG HandleAttributes,
+  OUT PHANDLE TokenHandle);
 
-typedef enum _FILE_STORAGE_TYPE {
-    StorageTypeDefault = 1,
-    StorageTypeDirectory,
-    StorageTypeFile,
-    StorageTypeJunctionPoint,
-    StorageTypeCatalog,
-    StorageTypeStructuredStorage,
-    StorageTypeEmbedding,
-    StorageTypeStream
-} FILE_STORAGE_TYPE;
+NTSYSAPI
+NTSTATUS
+NTAPI
+NtOpenJobObjectToken(
+  IN HANDLE JobHandle,
+  IN ACCESS_MASK DesiredAccess,
+  OUT PHANDLE TokenHandle);
 
-typedef enum _OBJECT_INFORMATION_CLASS
-{
-    ObjectBasicInformation,
-    ObjectNameInformation,
-    ObjectTypeInformation,
-    ObjectTypesInformation,
-    ObjectHandleFlagInformation,
-    ObjectSessionInformation,
-    MaxObjectInfoClass
-} OBJECT_INFORMATION_CLASS;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtDuplicateToken(
+  IN HANDLE ExistingTokenHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN BOOLEAN EffectiveOnly,
+  IN TOKEN_TYPE TokenType,
+  OUT PHANDLE NewTokenHandle);
 
-typedef struct _OBJECT_BASIC_INFORMATION
-{
-    ULONG Attributes;
-    ACCESS_MASK GrantedAccess;
-    ULONG HandleCount;
-    ULONG PointerCount;
-    ULONG PagedPoolCharge;
-    ULONG NonPagedPoolCharge;
-    ULONG Reserved[ 3 ];
-    ULONG NameInfoSize;
-    ULONG TypeInfoSize;
-    ULONG SecurityDescriptorSize;
-    LARGE_INTEGER CreationTime;
-} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtFilterToken(
+  IN HANDLE ExistingTokenHandle,
+  IN ULONG Flags,
+  IN PTOKEN_GROUPS SidsToDisable OPTIONAL,
+  IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL,
+  IN PTOKEN_GROUPS RestrictedSids OPTIONAL,
+  OUT PHANDLE NewTokenHandle);
 
-typedef struct _KAPC_STATE {
-    LIST_ENTRY  ApcListHead[2];
-    PKPROCESS   Process;
-    BOOLEAN     KernelApcInProgress;
-    BOOLEAN     KernelApcPending;
-    BOOLEAN     UserApcPending;
-} KAPC_STATE, *PKAPC_STATE, *RESTRICTED_POINTER PRKAPC_STATE;
-#define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN))
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtImpersonateAnonymousToken(
+  IN HANDLE ThreadHandle);
 
-typedef struct _BITMAP_RANGE {
-    LIST_ENTRY      Links;
-    LONGLONG        BasePage;
-    ULONG           FirstDirtyPage;
-    ULONG           LastDirtyPage;
-    ULONG           DirtyPages;
-    PULONG          Bitmap;
-} BITMAP_RANGE, *PBITMAP_RANGE;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetInformationToken(
+  IN HANDLE TokenHandle,
+  IN TOKEN_INFORMATION_CLASS TokenInformationClass,
+  IN PVOID TokenInformation,
+  IN ULONG TokenInformationLength);
 
-typedef struct _CACHE_UNINITIALIZE_EVENT {
-    struct _CACHE_UNINITIALIZE_EVENT    *Next;
-    KEVENT                              Event;
-} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAdjustGroupsToken(
+  IN HANDLE TokenHandle,
+  IN BOOLEAN ResetToDefault,
+  IN PTOKEN_GROUPS NewState OPTIONAL,
+  IN ULONG BufferLength OPTIONAL,
+  OUT PTOKEN_GROUPS PreviousState,
+  OUT PULONG ReturnLength);
 
-typedef struct _CC_FILE_SIZES {
-    LARGE_INTEGER AllocationSize;
-    LARGE_INTEGER FileSize;
-    LARGE_INTEGER ValidDataLength;
-} CC_FILE_SIZES, *PCC_FILE_SIZES;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtPrivilegeCheck(
+  IN HANDLE ClientToken,
+  IN OUT PPRIVILEGE_SET RequiredPrivileges,
+  OUT PBOOLEAN Result);
 
-typedef struct _COMPRESSED_DATA_INFO {
-    USHORT  CompressionFormatAndEngine;
-    UCHAR   CompressionUnitShift;
-    UCHAR   ChunkShift;
-    UCHAR   ClusterShift;
-    UCHAR   Reserved;
-    USHORT  NumberOfChunks;
-    ULONG   CompressedChunkSizes[ANYSIZE_ARRAY];
-} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAccessCheckAndAuditAlarm(
+  IN PUNICODE_STRING SubsystemName,
+  IN PVOID HandleId OPTIONAL,
+  IN PUNICODE_STRING ObjectTypeName,
+  IN PUNICODE_STRING ObjectName,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN ACCESS_MASK DesiredAccess,
+  IN PGENERIC_MAPPING GenericMapping,
+  IN BOOLEAN ObjectCreation,
+  OUT PACCESS_MASK GrantedAccess,
+  OUT PNTSTATUS AccessStatus,
+  OUT PBOOLEAN GenerateOnClose);
 
-typedef struct _SID_IDENTIFIER_AUTHORITY {
-       UCHAR Value[6];
-} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAccessCheckByTypeAndAuditAlarm(
+  IN PUNICODE_STRING SubsystemName,
+  IN PVOID HandleId,
+  IN PUNICODE_STRING ObjectTypeName,
+  IN PUNICODE_STRING ObjectName,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSID PrincipalSelfSid OPTIONAL,
+  IN ACCESS_MASK DesiredAccess,
+  IN AUDIT_EVENT_TYPE AuditType,
+  IN ULONG Flags,
+  IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
+  IN ULONG ObjectTypeLength,
+  IN PGENERIC_MAPPING GenericMapping,
+  IN BOOLEAN ObjectCreation,
+  OUT PACCESS_MASK GrantedAccess,
+  OUT PNTSTATUS AccessStatus,
+  OUT PBOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAccessCheckByTypeResultListAndAuditAlarm(
+  IN PUNICODE_STRING SubsystemName,
+  IN PVOID HandleId OPTIONAL,
+  IN PUNICODE_STRING ObjectTypeName,
+  IN PUNICODE_STRING ObjectName,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSID PrincipalSelfSid OPTIONAL,
+  IN ACCESS_MASK DesiredAccess,
+  IN AUDIT_EVENT_TYPE AuditType,
+  IN ULONG Flags,
+  IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
+  IN ULONG ObjectTypeLength,
+  IN PGENERIC_MAPPING GenericMapping,
+  IN BOOLEAN ObjectCreation,
+  OUT PACCESS_MASK GrantedAccess,
+  OUT PNTSTATUS AccessStatus,
+  OUT PBOOLEAN GenerateOnClose);
 
-typedef struct _SID {
-   UCHAR  Revision;
-   UCHAR  SubAuthorityCount;
-   SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
-   ULONG SubAuthority[ANYSIZE_ARRAY];
-} SID, *PISID;
-typedef struct _SID_AND_ATTRIBUTES {
-       PSID Sid;
-       ULONG Attributes;
-} SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES;
-typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
-typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
+NTSTATUS
+NTAPI
+NtAccessCheckByTypeResultListAndAuditAlarmByHandle(
+  IN PUNICODE_STRING SubsystemName,
+  IN PVOID HandleId OPTIONAL,
+  IN HANDLE ClientToken,
+  IN PUNICODE_STRING ObjectTypeName,
+  IN PUNICODE_STRING ObjectName,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSID PrincipalSelfSid OPTIONAL,
+  IN ACCESS_MASK DesiredAccess,
+  IN AUDIT_EVENT_TYPE AuditType,
+  IN ULONG Flags,
+  IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
+  IN ULONG ObjectTypeLength,
+  IN PGENERIC_MAPPING GenericMapping,
+  IN BOOLEAN ObjectCreation,
+  OUT PACCESS_MASK GrantedAccess,
+  OUT PNTSTATUS AccessStatus,
+  OUT PBOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenObjectAuditAlarm(
+  IN PUNICODE_STRING SubsystemName,
+  IN PVOID HandleId OPTIONAL,
+  IN PUNICODE_STRING ObjectTypeName,
+  IN PUNICODE_STRING ObjectName,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+  IN HANDLE ClientToken,
+  IN ACCESS_MASK DesiredAccess,
+  IN ACCESS_MASK GrantedAccess,
+  IN PPRIVILEGE_SET Privileges OPTIONAL,
+  IN BOOLEAN ObjectCreation,
+  IN BOOLEAN AccessGranted,
+  OUT PBOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtPrivilegeObjectAuditAlarm(
+  IN PUNICODE_STRING SubsystemName,
+  IN PVOID HandleId OPTIONAL,
+  IN HANDLE ClientToken,
+  IN ACCESS_MASK DesiredAccess,
+  IN PPRIVILEGE_SET Privileges,
+  IN BOOLEAN AccessGranted);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtCloseObjectAuditAlarm(
+  IN PUNICODE_STRING SubsystemName,
+  IN PVOID HandleId OPTIONAL,
+  IN BOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtDeleteObjectAuditAlarm(
+  IN PUNICODE_STRING SubsystemName,
+  IN PVOID HandleId OPTIONAL,
+  IN BOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtPrivilegedServiceAuditAlarm(
+  IN PUNICODE_STRING SubsystemName,
+  IN PUNICODE_STRING ServiceName,
+  IN HANDLE ClientToken,
+  IN PPRIVILEGE_SET Privileges,
+  IN BOOLEAN AccessGranted);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetInformationThread(
+  IN HANDLE ThreadHandle,
+  IN THREADINFOCLASS ThreadInformationClass,
+  IN PVOID ThreadInformation,
+  IN ULONG ThreadInformationLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtCreateSection(
+  OUT PHANDLE SectionHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN PLARGE_INTEGER MaximumSize OPTIONAL,
+  IN ULONG SectionPageProtection,
+  IN ULONG AllocationAttributes,
+  IN HANDLE FileHandle OPTIONAL);
 
+#endif
 
+typedef NTSTATUS
+(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) (
+  IN PVOID Base,
+  IN OUT PVOID *CommitAddress,
+  IN OUT PSIZE_T CommitSize);
 
-//
-// Universal well-known SIDs
-//
-#define SECURITY_NULL_SID_AUTHORITY         {0,0,0,0,0,0}
-#define SECURITY_WORLD_SID_AUTHORITY        {0,0,0,0,0,1}
-#define SECURITY_LOCAL_SID_AUTHORITY        {0,0,0,0,0,2}
-#define SECURITY_CREATOR_SID_AUTHORITY      {0,0,0,0,0,3}
-#define SECURITY_NON_UNIQUE_AUTHORITY       {0,0,0,0,0,4}
-#define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}
+typedef struct _RTL_HEAP_PARAMETERS {
+  ULONG Length;
+  SIZE_T SegmentReserve;
+  SIZE_T SegmentCommit;
+  SIZE_T DeCommitFreeBlockThreshold;
+  SIZE_T DeCommitTotalFreeThreshold;
+  SIZE_T MaximumAllocationSize;
+  SIZE_T VirtualMemoryThreshold;
+  SIZE_T InitialCommit;
+  SIZE_T InitialReserve;
+  PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
+  SIZE_T Reserved[2];
+} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
 
-#define SECURITY_NULL_RID                 (0x00000000L)
-#define SECURITY_WORLD_RID                (0x00000000L)
-#define SECURITY_LOCAL_RID                (0x00000000L)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
-#define SECURITY_CREATOR_OWNER_RID        (0x00000000L)
-#define SECURITY_CREATOR_GROUP_RID        (0x00000001L)
+NTSYSAPI
+PVOID
+NTAPI
+RtlAllocateHeap(
+  IN HANDLE HeapHandle,
+  IN ULONG Flags OPTIONAL,
+  IN SIZE_T Size);
 
-#define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
-#define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlFreeHeap(
+  IN PVOID HeapHandle,
+  IN ULONG Flags OPTIONAL,
+  IN PVOID BaseAddress);
 
-#define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L)
+NTSYSAPI
+VOID
+NTAPI
+RtlCaptureContext(
+  OUT PCONTEXT ContextRecord);
 
+NTSYSAPI
+ULONG
+NTAPI
+RtlRandom(
+  IN OUT PULONG Seed);
 
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlCreateUnicodeString(
+  OUT PUNICODE_STRING DestinationString,
+  IN PCWSTR SourceString);
 
-//
-// NT well-known SIDs
-//
-#define SECURITY_NT_AUTHORITY           {0,0,0,0,0,5}
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAppendStringToString(
+  IN OUT PSTRING Destination,
+  IN const STRING *Source);
 
-#define SECURITY_DIALUP_RID             (0x00000001L)
-#define SECURITY_NETWORK_RID            (0x00000002L)
-#define SECURITY_BATCH_RID              (0x00000003L)
-#define SECURITY_INTERACTIVE_RID        (0x00000004L)
-#define SECURITY_LOGON_IDS_RID          (0x00000005L)
-#define SECURITY_LOGON_IDS_RID_COUNT    (3L)
-#define SECURITY_SERVICE_RID            (0x00000006L)
-#define SECURITY_ANONYMOUS_LOGON_RID    (0x00000007L)
-#define SECURITY_PROXY_RID              (0x00000008L)
-#define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)
-#define SECURITY_SERVER_LOGON_RID       SECURITY_ENTERPRISE_CONTROLLERS_RID
-#define SECURITY_PRINCIPAL_SELF_RID     (0x0000000AL)
-#define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)
-#define SECURITY_RESTRICTED_CODE_RID    (0x0000000CL)
-#define SECURITY_TERMINAL_SERVER_RID    (0x0000000DL)
-#define SECURITY_REMOTE_LOGON_RID       (0x0000000EL)
-#define SECURITY_THIS_ORGANIZATION_RID  (0x0000000FL)
-#define SECURITY_IUSER_RID              (0x00000011L)
-#define SECURITY_LOCAL_SYSTEM_RID       (0x00000012L)
-#define SECURITY_LOCAL_SERVICE_RID      (0x00000013L)
-#define SECURITY_NETWORK_SERVICE_RID    (0x00000014L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlOemStringToUnicodeString(
+  IN OUT PUNICODE_STRING DestinationString,
+  IN PCOEM_STRING SourceString,
+  IN BOOLEAN AllocateDestinationString);
 
-#define SECURITY_NT_NON_UNIQUE          (0x00000015L)
-#define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT  (3L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToOemString(
+  IN OUT POEM_STRING DestinationString,
+  IN PCUNICODE_STRING SourceString,
+  IN BOOLEAN AllocateDestinationString);
 
-#define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeStringToOemString(
+  IN OUT POEM_STRING DestinationString,
+  IN PCUNICODE_STRING SourceString,
+  IN BOOLEAN AllocateDestinationString);
 
-#define SECURITY_BUILTIN_DOMAIN_RID     (0x00000020L)
-#define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlOemStringToCountedUnicodeString(
+  IN OUT PUNICODE_STRING DestinationString,
+  IN PCOEM_STRING SourceString,
+  IN BOOLEAN AllocateDestinationString);
 
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToCountedOemString(
+  IN OUT POEM_STRING DestinationString,
+  IN PCUNICODE_STRING SourceString,
+  IN BOOLEAN AllocateDestinationString);
 
-#define SECURITY_PACKAGE_BASE_RID       (0x00000040L)
-#define SECURITY_PACKAGE_RID_COUNT      (2L)
-#define SECURITY_PACKAGE_NTLM_RID       (0x0000000AL)
-#define SECURITY_PACKAGE_SCHANNEL_RID   (0x0000000EL)
-#define SECURITY_PACKAGE_DIGEST_RID     (0x00000015L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeStringToCountedOemString(
+  IN OUT POEM_STRING DestinationString,
+  IN PCUNICODE_STRING SourceString,
+  IN BOOLEAN AllocateDestinationString);
 
-#define SECURITY_MIN_BASE_RID          (0x00000050L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDowncaseUnicodeString(
+  IN OUT PUNICODE_STRING UniDest,
+  IN PCUNICODE_STRING UniSource,
+  IN BOOLEAN AllocateDestinationString);
 
-#define SECURITY_SERVICE_ID_BASE_RID    (0x00000050L)
-#define SECURITY_SERVICE_ID_RID_COUNT   (6L)
+NTSYSAPI
+VOID
+NTAPI
+RtlFreeOemString (
+  IN OUT POEM_STRING OemString);
 
-#define SECURITY_RESERVED_ID_BASE_RID   (0x00000051L)
+NTSYSAPI
+ULONG
+NTAPI
+RtlxUnicodeStringToOemSize(
+  IN PCUNICODE_STRING UnicodeString);
 
-#define SECURITY_APPPOOL_ID_BASE_RID    (0x00000052L)
-#define SECURITY_APPPOOL_ID_RID_COUNT   (6L)
+NTSYSAPI
+ULONG
+NTAPI
+RtlxOemStringToUnicodeSize(
+  IN PCOEM_STRING OemString);
 
-#define SECURITY_VIRTUALSERVER_ID_BASE_RID    (0x00000053L)
-#define SECURITY_VIRTUALSERVER_ID_RID_COUNT   (6L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlMultiByteToUnicodeN(
+  OUT PWCH UnicodeString,
+  IN ULONG MaxBytesInUnicodeString,
+  OUT PULONG BytesInUnicodeString OPTIONAL,
+  IN const CHAR *MultiByteString,
+  IN ULONG BytesInMultiByteString);
 
-#define SECURITY_MAX_BASE_RID          (0x0000006FL)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlMultiByteToUnicodeSize(
+  OUT PULONG BytesInUnicodeString,
+  IN const CHAR *MultiByteString,
+  IN ULONG BytesInMultiByteString);
 
-#define SECURITY_MAX_ALWAYS_FILTERED    (0x000003E7L)
-#define SECURITY_MIN_NEVER_FILTERED     (0x000003E8L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToMultiByteSize(
+  OUT PULONG BytesInMultiByteString,
+  IN PCWCH UnicodeString,
+  IN ULONG BytesInUnicodeString);
 
-#define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToMultiByteN(
+  OUT PCHAR MultiByteString,
+  IN ULONG MaxBytesInMultiByteString,
+  OUT PULONG BytesInMultiByteString OPTIONAL,
+  IN PWCH UnicodeString,
+  IN ULONG BytesInUnicodeString);
 
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeToMultiByteN(
+  OUT PCHAR MultiByteString,
+  IN ULONG MaxBytesInMultiByteString,
+  OUT PULONG BytesInMultiByteString OPTIONAL,
+  IN PCWCH UnicodeString,
+  IN ULONG BytesInUnicodeString);
 
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlOemToUnicodeN(
+  OUT PWSTR UnicodeString,
+  IN ULONG MaxBytesInUnicodeString,
+  OUT PULONG BytesInUnicodeString OPTIONAL,
+  IN PCCH OemString,
+  IN ULONG BytesInOemString);
 
-//
-// Well-known domain relative sub-authority values (RIDs)
-//
-#define DOMAIN_GROUP_RID_ENTERPRISE_READONLY_DOMAIN_CONTROLLERS (0x000001F2L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToOemN(
+  OUT PCHAR OemString,
+  IN ULONG MaxBytesInOemString,
+  OUT PULONG BytesInOemString OPTIONAL,
+  IN PCWCH UnicodeString,
+  IN ULONG BytesInUnicodeString);
 
-#define FOREST_USER_RID_MAX            (0x000001F3L)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeToOemN(
+  OUT PCHAR OemString,
+  IN ULONG MaxBytesInOemString,
+  OUT PULONG BytesInOemString OPTIONAL,
+  IN PCWCH UnicodeString,
+  IN ULONG BytesInUnicodeString);
 
-//
-// Well-known users
-//
-#define DOMAIN_USER_RID_ADMIN          (0x000001F4L)
-#define DOMAIN_USER_RID_GUEST          (0x000001F5L)
-#define DOMAIN_USER_RID_KRBTGT         (0x000001F6L)
+typedef struct _GENERATE_NAME_CONTEXT {
+  USHORT Checksum;
+  BOOLEAN CheckSumInserted;
+  UCHAR NameLength;
+  WCHAR NameBuffer[8];
+  ULONG ExtensionLength;
+  WCHAR ExtensionBuffer[4];
+  ULONG LastIndexValue;
+} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
 
-#define DOMAIN_USER_RID_MAX            (0x000003E7L)
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGenerate8dot3Name(
+  IN PCUNICODE_STRING Name,
+  IN BOOLEAN AllowExtendedCharacters,
+  IN OUT PGENERATE_NAME_CONTEXT Context,
+  IN OUT PUNICODE_STRING Name8dot3);
+#else
+NTSYSAPI
+VOID
+NTAPI
+RtlGenerate8dot3Name(
+  IN PCUNICODE_STRING Name,
+  IN BOOLEAN AllowExtendedCharacters,
+  IN OUT PGENERATE_NAME_CONTEXT Context,
+  IN OUT PUNICODE_STRING Name8dot3);
+#endif
 
-//
-// Well-known groups
-//
-#define DOMAIN_GROUP_RID_ADMINS        (0x00000200L)
-#define DOMAIN_GROUP_RID_USERS         (0x00000201L)
-#define DOMAIN_GROUP_RID_GUESTS        (0x00000202L)
-#define DOMAIN_GROUP_RID_COMPUTERS     (0x00000203L)
-#define DOMAIN_GROUP_RID_CONTROLLERS   (0x00000204L)
-#define DOMAIN_GROUP_RID_CERT_ADMINS   (0x00000205L)
-#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)
-#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)
-#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)
-#define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsNameLegalDOS8Dot3(
+  IN PCUNICODE_STRING Name,
+  IN OUT POEM_STRING OemName OPTIONAL,
+  IN OUT PBOOLEAN NameContainsSpaces OPTIONAL);
 
-//
-// Well-known aliases
-//
-#define DOMAIN_ALIAS_RID_ADMINS                         (0x00000220L)
-#define DOMAIN_ALIAS_RID_USERS                          (0x00000221L)
-#define DOMAIN_ALIAS_RID_GUESTS                         (0x00000222L)
-#define DOMAIN_ALIAS_RID_POWER_USERS                    (0x00000223L)
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsValidOemCharacter(
+  IN OUT PWCHAR Char);
 
-#define DOMAIN_ALIAS_RID_ACCOUNT_OPS                    (0x00000224L)
-#define DOMAIN_ALIAS_RID_SYSTEM_OPS                     (0x00000225L)
-#define DOMAIN_ALIAS_RID_PRINT_OPS                      (0x00000226L)
-#define DOMAIN_ALIAS_RID_BACKUP_OPS                     (0x00000227L)
+typedef struct _PREFIX_TABLE_ENTRY {
+  CSHORT NodeTypeCode;
+  CSHORT NameLength;
+  struct _PREFIX_TABLE_ENTRY *NextPrefixTree;
+  RTL_SPLAY_LINKS Links;
+  PSTRING Prefix;
+} PREFIX_TABLE_ENTRY, *PPREFIX_TABLE_ENTRY;
 
-#define DOMAIN_ALIAS_RID_REPLICATOR                     (0x00000228L)
-#define DOMAIN_ALIAS_RID_RAS_SERVERS                    (0x00000229L)
-#define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS               (0x0000022AL)
-#define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS           (0x0000022BL)
-#define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS      (0x0000022CL)
-#define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL)
+typedef struct _PREFIX_TABLE {
+  CSHORT NodeTypeCode;
+  CSHORT NameLength;
+  PPREFIX_TABLE_ENTRY NextPrefixTree;
+} PREFIX_TABLE, *PPREFIX_TABLE;
 
-#define DOMAIN_ALIAS_RID_MONITORING_USERS               (0x0000022EL)
-#define DOMAIN_ALIAS_RID_LOGGING_USERS                  (0x0000022FL)
-#define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS            (0x00000230L)
-#define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS             (0x00000231L)
-#define DOMAIN_ALIAS_RID_DCOM_USERS                     (0x00000232L)
-#define DOMAIN_ALIAS_RID_IUSERS                         (0x00000238L)
-#define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS               (0x00000239L)
-#define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP     (0x0000023BL)
-#define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL)
-#define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP        (0x0000023DL)
-#define DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP      (0x0000023EL)
+NTSYSAPI
+VOID
+NTAPI
+PfxInitialize(
+  OUT PPREFIX_TABLE PrefixTable);
 
+NTSYSAPI
+BOOLEAN
+NTAPI
+PfxInsertPrefix(
+  IN PPREFIX_TABLE PrefixTable,
+  IN PSTRING Prefix,
+  OUT PPREFIX_TABLE_ENTRY PrefixTableEntry);
 
-#define SECURITY_MANDATORY_LABEL_AUTHORITY          {0,0,0,0,0,16}
-#define SECURITY_MANDATORY_UNTRUSTED_RID            (0x00000000L)
-#define SECURITY_MANDATORY_LOW_RID                  (0x00001000L)
-#define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)
-#define SECURITY_MANDATORY_HIGH_RID                 (0x00003000L)
-#define SECURITY_MANDATORY_SYSTEM_RID               (0x00004000L)
-#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID    (0x00005000L)
+NTSYSAPI
+VOID
+NTAPI
+PfxRemovePrefix(
+  IN PPREFIX_TABLE PrefixTable,
+  IN PPREFIX_TABLE_ENTRY PrefixTableEntry);
 
-//
-// SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that
-// can be set by a usermode caller.
-//
-#define SECURITY_MANDATORY_MAXIMUM_USER_RID   SECURITY_MANDATORY_SYSTEM_RID
+NTSYSAPI
+PPREFIX_TABLE_ENTRY
+NTAPI
+PfxFindPrefix(
+  IN PPREFIX_TABLE PrefixTable,
+  IN PSTRING FullName);
 
-#define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000)
+typedef struct _UNICODE_PREFIX_TABLE_ENTRY {
+  CSHORT NodeTypeCode;
+  CSHORT NameLength;
+  struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree;
+  struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch;
+  RTL_SPLAY_LINKS Links;
+  PUNICODE_STRING Prefix;
+} UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY;
 
-//
-// Allocate the System Luid.  The first 1000 LUIDs are reserved.
-// Use #999 here (0x3e7 = 999)
-//
-#define SYSTEM_LUID                     { 0x3e7, 0x0 }
-#define ANONYMOUS_LOGON_LUID            { 0x3e6, 0x0 }
-#define LOCALSERVICE_LUID               { 0x3e5, 0x0 }
-#define NETWORKSERVICE_LUID             { 0x3e4, 0x0 }
-#define IUSER_LUID                      { 0x3e3, 0x0 }
+typedef struct _UNICODE_PREFIX_TABLE {
+  CSHORT NodeTypeCode;
+  CSHORT NameLength;
+  PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
+  PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
+} UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
 
+NTSYSAPI
+VOID
+NTAPI
+RtlInitializeUnicodePrefix(
+  OUT PUNICODE_PREFIX_TABLE PrefixTable);
 
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlInsertUnicodePrefix(
+  IN PUNICODE_PREFIX_TABLE PrefixTable,
+  IN PUNICODE_STRING Prefix,
+  OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
 
-typedef struct _TOKEN_SOURCE {
-       CHAR SourceName[TOKEN_SOURCE_LENGTH];
-       LUID SourceIdentifier;
-} TOKEN_SOURCE,*PTOKEN_SOURCE;
-typedef struct _TOKEN_CONTROL {
-       LUID TokenId;
-       LUID AuthenticationId;
-       LUID ModifiedId;
-       TOKEN_SOURCE TokenSource;
-} TOKEN_CONTROL,*PTOKEN_CONTROL;
-typedef struct _TOKEN_DEFAULT_DACL {
-       PACL DefaultDacl;
-} TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL;
-typedef struct _TOKEN_GROUPS {
-       ULONG GroupCount;
-       SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
-} TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS;
-typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
-       ULONG SidCount;
-       ULONG SidLength;
-       PSID_AND_ATTRIBUTES Sids;
-       ULONG RestrictedSidCount;
-       ULONG RestrictedSidLength;
-       PSID_AND_ATTRIBUTES RestrictedSids;
-       ULONG PrivilegeCount;
-       ULONG PrivilegeLength;
-       PLUID_AND_ATTRIBUTES Privileges;
-       LUID AuthenticationId;
-} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
-typedef struct _TOKEN_ORIGIN {
-       LUID OriginatingLogonSession;
-} TOKEN_ORIGIN, *PTOKEN_ORIGIN;
-typedef struct _TOKEN_OWNER {
-       PSID Owner;
-} TOKEN_OWNER,*PTOKEN_OWNER;
-typedef struct _TOKEN_PRIMARY_GROUP {
-       PSID PrimaryGroup;
-} TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP;
-typedef struct _TOKEN_PRIVILEGES {
-       ULONG PrivilegeCount;
-       LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
-} TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES;
-typedef enum tagTOKEN_TYPE {
-       TokenPrimary = 1,
-       TokenImpersonation
-} TOKEN_TYPE,*PTOKEN_TYPE;
-typedef struct _TOKEN_STATISTICS {
-       LUID TokenId;
-       LUID AuthenticationId;
-       LARGE_INTEGER ExpirationTime;
-       TOKEN_TYPE TokenType;
-       SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
-       ULONG DynamicCharged;
-       ULONG DynamicAvailable;
-       ULONG GroupCount;
-       ULONG PrivilegeCount;
-       LUID ModifiedId;
-} TOKEN_STATISTICS, *PTOKEN_STATISTICS;
-typedef struct _TOKEN_USER {
-       SID_AND_ATTRIBUTES User;
-} TOKEN_USER, *PTOKEN_USER;
-typedef USHORT SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL;
-typedef struct _SECURITY_DESCRIPTOR {
-       UCHAR Revision;
-       UCHAR Sbz1;
-       SECURITY_DESCRIPTOR_CONTROL Control;
-       PSID Owner;
-       PSID Group;
-       PACL Sacl;
-       PACL Dacl;
-} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
+NTSYSAPI
+VOID
+NTAPI
+RtlRemoveUnicodePrefix(
+  IN PUNICODE_PREFIX_TABLE PrefixTable,
+  IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
 
-#define SECURITY_DESCRIPTOR_MIN_LENGTH   (sizeof(SECURITY_DESCRIPTOR))
+NTSYSAPI
+PUNICODE_PREFIX_TABLE_ENTRY
+NTAPI
+RtlFindUnicodePrefix(
+  IN PUNICODE_PREFIX_TABLE PrefixTable,
+  IN PUNICODE_STRING FullName,
+  IN ULONG CaseInsensitiveIndex);
 
-typedef struct _OBJECT_TYPE_LIST {
-    USHORT Level;
-    USHORT Sbz;
-    GUID *ObjectType;
-    } OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
-    
-typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
-    UCHAR Revision;
-    UCHAR Sbz1;
-    SECURITY_DESCRIPTOR_CONTROL Control;
-    ULONG Owner;
-    ULONG Group;
-    ULONG Sacl;
-    ULONG Dacl;
-} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
-typedef enum _TOKEN_INFORMATION_CLASS {
-       TokenUser=1,TokenGroups,TokenPrivileges,TokenOwner,
-       TokenPrimaryGroup,TokenDefaultDacl,TokenSource,TokenType,
-       TokenImpersonationLevel,TokenStatistics,TokenRestrictedSids,
-       TokenSessionId,TokenGroupsAndPrivileges,TokenSessionReference,
-       TokenSandBoxInert,TokenAuditPolicy,TokenOrigin,
-} TOKEN_INFORMATION_CLASS;
+NTSYSAPI
+PUNICODE_PREFIX_TABLE_ENTRY
+NTAPI
+RtlNextUnicodePrefix(
+  IN PUNICODE_PREFIX_TABLE PrefixTable,
+  IN BOOLEAN Restart);
 
-#define SYMLINK_FLAG_RELATIVE   1
+NTSYSAPI
+SIZE_T
+NTAPI
+RtlCompareMemoryUlong(
+  IN PVOID Source,
+  IN SIZE_T Length,
+  IN ULONG Pattern);
 
-typedef struct _REPARSE_DATA_BUFFER {
-    ULONG  ReparseTag;
-    USHORT ReparseDataLength;
-    USHORT Reserved;
-    union {
-        struct {
-            USHORT SubstituteNameOffset;
-            USHORT SubstituteNameLength;
-            USHORT PrintNameOffset;
-            USHORT PrintNameLength;
-            ULONG Flags;
-            WCHAR PathBuffer[1];
-        } SymbolicLinkReparseBuffer;
-        struct {
-            USHORT SubstituteNameOffset;
-            USHORT SubstituteNameLength;
-            USHORT PrintNameOffset;
-            USHORT PrintNameLength;
-            WCHAR PathBuffer[1];
-        } MountPointReparseBuffer;
-        struct {
-            UCHAR  DataBuffer[1];
-        } GenericReparseBuffer;
-    };
-} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTimeToSecondsSince1980(
+  IN PLARGE_INTEGER Time,
+  OUT PULONG ElapsedSeconds);
 
+NTSYSAPI
+VOID
+NTAPI
+RtlSecondsSince1980ToTime(
+  IN ULONG ElapsedSeconds,
+  OUT PLARGE_INTEGER Time);
 
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTimeToSecondsSince1970(
+  IN PLARGE_INTEGER Time,
+  OUT PULONG ElapsedSeconds);
 
-//
-// MicroSoft reparse point tags
-//
-#define IO_REPARSE_TAG_MOUNT_POINT              (0xA0000003L)
-#define IO_REPARSE_TAG_HSM                      (0xC0000004L)
-#define IO_REPARSE_TAG_DRIVE_EXTENDER           (0x80000005L)
-#define IO_REPARSE_TAG_HSM2                     (0x80000006L)
-#define IO_REPARSE_TAG_SIS                      (0x80000007L)
-#define IO_REPARSE_TAG_DFS                      (0x8000000AL)
-#define IO_REPARSE_TAG_FILTER_MANAGER           (0x8000000BL)
-#define IO_REPARSE_TAG_SYMLINK                  (0xA000000CL)
-#define IO_REPARSE_TAG_IIS_CACHE                (0xA0000010L)
-#define IO_REPARSE_TAG_DFSR                     (0x80000012L)
+NTSYSAPI
+VOID
+NTAPI
+RtlSecondsSince1970ToTime(
+  IN ULONG ElapsedSeconds,
+  OUT PLARGE_INTEGER Time);
 
-//
-// Reserved reparse tags
-//
-#define IO_REPARSE_TAG_RESERVED_ZERO            (0)
-#define IO_REPARSE_TAG_RESERVED_ONE             (1)
-#define IO_REPARSE_TAG_RESERVED_RANGE           IO_REPARSE_TAG_RESERVED_ONE
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlValidSid(
+  IN PSID Sid);
 
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualSid(
+  IN PSID Sid1,
+  IN PSID Sid2);
 
-#define REPARSE_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualPrefixSid(
+  IN PSID Sid1,
+  IN PSID Sid2);
 
-typedef struct _FILE_ACCESS_INFORMATION {
-    ACCESS_MASK AccessFlags;
-} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
+NTSYSAPI
+ULONG
+NTAPI
+RtlLengthRequiredSid(
+  IN ULONG SubAuthorityCount);
 
-typedef struct _FILE_ALLOCATION_INFORMATION {
-    LARGE_INTEGER AllocationSize;
-} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
+NTSYSAPI
+PVOID
+NTAPI
+RtlFreeSid(
+  IN PSID Sid);
 
-typedef struct _FILE_BOTH_DIR_INFORMATION {
-    ULONG           NextEntryOffset;
-    ULONG           FileIndex;
-    LARGE_INTEGER   CreationTime;
-    LARGE_INTEGER   LastAccessTime;
-    LARGE_INTEGER   LastWriteTime;
-    LARGE_INTEGER   ChangeTime;
-    LARGE_INTEGER   EndOfFile;
-    LARGE_INTEGER   AllocationSize;
-    ULONG           FileAttributes;
-    ULONG           FileNameLength;
-    ULONG           EaSize;
-    CCHAR           ShortNameLength;
-    WCHAR           ShortName[12];
-    WCHAR           FileName[1];
-} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAllocateAndInitializeSid(
+  IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
+  IN UCHAR SubAuthorityCount,
+  IN ULONG SubAuthority0,
+  IN ULONG SubAuthority1,
+  IN ULONG SubAuthority2,
+  IN ULONG SubAuthority3,
+  IN ULONG SubAuthority4,
+  IN ULONG SubAuthority5,
+  IN ULONG SubAuthority6,
+  IN ULONG SubAuthority7,
+  OUT PSID *Sid);
 
-typedef struct _FILE_COMPLETION_INFORMATION {
-    HANDLE  Port;
-    PVOID   Key;
-} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInitializeSid(
+  OUT PSID Sid,
+  IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
+  IN UCHAR SubAuthorityCount);
 
-typedef struct _FILE_COMPRESSION_INFORMATION {
-    LARGE_INTEGER   CompressedFileSize;
-    USHORT          CompressionFormat;
-    UCHAR           CompressionUnitShift;
-    UCHAR           ChunkShift;
-    UCHAR           ClusterShift;
-    UCHAR           Reserved[3];
-} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
+NTSYSAPI
+PULONG
+NTAPI
+RtlSubAuthoritySid(
+  IN PSID Sid,
+  IN ULONG SubAuthority);
 
-typedef struct _FILE_COPY_ON_WRITE_INFORMATION {
-    BOOLEAN ReplaceIfExists;
-    HANDLE  RootDirectory;
-    ULONG   FileNameLength;
-    WCHAR   FileName[1];
-} FILE_COPY_ON_WRITE_INFORMATION, *PFILE_COPY_ON_WRITE_INFORMATION;
+NTSYSAPI
+ULONG
+NTAPI
+RtlLengthSid(
+  IN PSID Sid);
 
-typedef struct _FILE_DIRECTORY_INFORMATION {
-    ULONG           NextEntryOffset;
-    ULONG           FileIndex;
-    LARGE_INTEGER   CreationTime;
-    LARGE_INTEGER   LastAccessTime;
-    LARGE_INTEGER   LastWriteTime;
-    LARGE_INTEGER   ChangeTime;
-    LARGE_INTEGER   EndOfFile;
-    LARGE_INTEGER   AllocationSize;
-    ULONG           FileAttributes;
-    ULONG           FileNameLength;
-    WCHAR           FileName[1];
-} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCopySid(
+  IN ULONG Length,
+  IN PSID Destination,
+  IN PSID Source);
 
-typedef struct _FILE_FULL_DIRECTORY_INFORMATION {
-    ULONG           NextEntryOffset;
-    ULONG           FileIndex;
-    LARGE_INTEGER   CreationTime;
-    LARGE_INTEGER   LastAccessTime;
-    LARGE_INTEGER   LastWriteTime;
-    LARGE_INTEGER   ChangeTime;
-    LARGE_INTEGER   EndOfFile;
-    LARGE_INTEGER   AllocationSize;
-    ULONG           FileAttributes;
-    ULONG           FileNameLength;
-    ULONG           EaSize;
-    WCHAR           FileName[ANYSIZE_ARRAY];
-} FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;
-    
-typedef struct _FILE_ID_FULL_DIR_INFORMATION {
-    ULONG NextEntryOffset;
-    ULONG FileIndex;
-    LARGE_INTEGER CreationTime;
-    LARGE_INTEGER LastAccessTime;
-    LARGE_INTEGER LastWriteTime;
-    LARGE_INTEGER ChangeTime;
-    LARGE_INTEGER EndOfFile;
-    LARGE_INTEGER AllocationSize;
-    ULONG FileAttributes;
-    ULONG FileNameLength;
-    ULONG EaSize;
-    LARGE_INTEGER FileId;
-    WCHAR FileName[1];
-} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlConvertSidToUnicodeString(
+  IN OUT PUNICODE_STRING UnicodeString,
+  IN PSID Sid,
+  IN BOOLEAN AllocateDestinationString);
 
-typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
-    ULONG NextEntryOffset;
-    ULONG FileIndex;
-    LARGE_INTEGER CreationTime;
-    LARGE_INTEGER LastAccessTime;
-    LARGE_INTEGER LastWriteTime;
-    LARGE_INTEGER ChangeTime;
-    LARGE_INTEGER EndOfFile;
-    LARGE_INTEGER AllocationSize;
-    ULONG FileAttributes;
-    ULONG FileNameLength;
-    ULONG EaSize;
-    CCHAR ShortNameLength;
-    WCHAR ShortName[12];
-    LARGE_INTEGER FileId;
-    WCHAR FileName[1];
-} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyLuid(
+  OUT PLUID DestinationLuid,
+  IN PLUID SourceLuid);
 
-typedef struct _FILE_EA_INFORMATION {
-    ULONG EaSize;
-} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateAcl(
+  OUT PACL Acl,
+  IN ULONG AclLength,
+  IN ULONG AclRevision);
 
-typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
-    ULONG   FileSystemAttributes;
-    ULONG   MaximumComponentNameLength;
-    ULONG   FileSystemNameLength;
-    WCHAR   FileSystemName[1];
-} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAddAce(
+  IN OUT PACL Acl,
+  IN ULONG AceRevision,
+  IN ULONG StartingAceIndex,
+  IN PVOID AceList,
+  IN ULONG AceListLength);
 
-typedef struct _FILE_FS_CONTROL_INFORMATION {
-    LARGE_INTEGER   FreeSpaceStartFiltering;
-    LARGE_INTEGER   FreeSpaceThreshold;
-    LARGE_INTEGER   FreeSpaceStopFiltering;
-    LARGE_INTEGER   DefaultQuotaThreshold;
-    LARGE_INTEGER   DefaultQuotaLimit;
-    ULONG           FileSystemControlFlags;
-} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDeleteAce(
+  IN OUT PACL Acl,
+  IN ULONG AceIndex);
 
-typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
-    LARGE_INTEGER   TotalAllocationUnits;
-    LARGE_INTEGER   CallerAvailableAllocationUnits;
-    LARGE_INTEGER   ActualAvailableAllocationUnits;
-    ULONG           SectorsPerAllocationUnit;
-    ULONG           BytesPerSector;
-} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetAce(
+  IN PACL Acl,
+  IN ULONG AceIndex,
+  OUT PVOID *Ace);
 
-typedef struct _FILE_FS_LABEL_INFORMATION {
-    ULONG VolumeLabelLength;
-    WCHAR VolumeLabel[1];
-} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAddAccessAllowedAce(
+  IN OUT PACL Acl,
+  IN ULONG AceRevision,
+  IN ACCESS_MASK AccessMask,
+  IN PSID Sid);
 
-#if (VER_PRODUCTBUILD >= 2195)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAddAccessAllowedAceEx(
+  IN OUT PACL Acl,
+  IN ULONG AceRevision,
+  IN ULONG AceFlags,
+  IN ACCESS_MASK AccessMask,
+  IN PSID Sid);
 
-typedef struct _FILE_FS_OBJECT_ID_INFORMATION {
-    UCHAR ObjectId[16];
-    UCHAR ExtendedInfo[48];
-} FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateSecurityDescriptorRelative(
+  OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
+  IN ULONG Revision);
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetDaclSecurityDescriptor(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  OUT PBOOLEAN DaclPresent,
+  OUT PACL *Dacl,
+  OUT PBOOLEAN DaclDefaulted);
 
-typedef struct _FILE_FS_SIZE_INFORMATION {
-    LARGE_INTEGER   TotalAllocationUnits;
-    LARGE_INTEGER   AvailableAllocationUnits;
-    ULONG           SectorsPerAllocationUnit;
-    ULONG           BytesPerSector;
-} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetOwnerSecurityDescriptor(
+  IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSID Owner OPTIONAL,
+  IN BOOLEAN OwnerDefaulted);
 
-typedef struct _FILE_FS_VOLUME_INFORMATION {
-    LARGE_INTEGER   VolumeCreationTime;
-    ULONG           VolumeSerialNumber;
-    ULONG           VolumeLabelLength;
-    BOOLEAN         SupportsObjects;
-    WCHAR           VolumeLabel[1];
-} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetOwnerSecurityDescriptor(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  OUT PSID *Owner,
+  OUT PBOOLEAN OwnerDefaulted);
 
-typedef struct _FILE_FS_OBJECTID_INFORMATION
-{
-    UCHAR ObjectId[16];
-    UCHAR ExtendedInfo[48];
-} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
+NTSYSAPI
+ULONG
+NTAPI
+RtlNtStatusToDosError(
+  IN NTSTATUS Status);
 
-typedef struct _FILE_FS_DRIVER_PATH_INFORMATION
-{
-    BOOLEAN DriverInPath;
-    ULONG DriverNameLength;
-    WCHAR DriverName[1];
-} FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCustomCPToUnicodeN(
+  IN PCPTABLEINFO CustomCP,
+  OUT PWCH UnicodeString,
+  IN ULONG MaxBytesInUnicodeString,
+  OUT PULONG BytesInUnicodeString OPTIONAL,
+  IN PCH CustomCPString,
+  IN ULONG BytesInCustomCPString);
 
-typedef struct _FILE_FULL_DIR_INFORMATION {
-    ULONG           NextEntryOffset;
-    ULONG           FileIndex;
-    LARGE_INTEGER   CreationTime;
-    LARGE_INTEGER   LastAccessTime;
-    LARGE_INTEGER   LastWriteTime;
-    LARGE_INTEGER   ChangeTime;
-    LARGE_INTEGER   EndOfFile;
-    LARGE_INTEGER   AllocationSize;
-    ULONG           FileAttributes;
-    ULONG           FileNameLength;
-    ULONG           EaSize;
-    WCHAR           FileName[1];
-} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToCustomCPN(
+  IN PCPTABLEINFO CustomCP,
+  OUT PCH CustomCPString,
+  IN ULONG MaxBytesInCustomCPString,
+  OUT PULONG BytesInCustomCPString OPTIONAL,
+  IN PWCH UnicodeString,
+  IN ULONG BytesInUnicodeString);
 
-typedef struct _FILE_GET_EA_INFORMATION {
-    ULONG   NextEntryOffset;
-    UCHAR   EaNameLength;
-    CHAR    EaName[1];
-} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeToCustomCPN(
+  IN PCPTABLEINFO CustomCP,
+  OUT PCH CustomCPString,
+  IN ULONG MaxBytesInCustomCPString,
+  OUT PULONG BytesInCustomCPString OPTIONAL,
+  IN PWCH UnicodeString,
+  IN ULONG BytesInUnicodeString);
 
-typedef struct _FILE_GET_QUOTA_INFORMATION {
-    ULONG   NextEntryOffset;
-    ULONG   SidLength;
-    SID     Sid;
-} FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
+NTSYSAPI
+VOID
+NTAPI
+RtlInitCodePageTable(
+  IN PUSHORT TableBase,
+  IN OUT PCPTABLEINFO CodePageTable);
 
-typedef struct _FILE_QUOTA_INFORMATION
-{
-    ULONG NextEntryOffset;
-    ULONG SidLength;
-    LARGE_INTEGER ChangeTime;
-    LARGE_INTEGER QuotaUsed;
-    LARGE_INTEGER QuotaThreshold;
-    LARGE_INTEGER QuotaLimit;
-    SID Sid;
-} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
+#endif
 
-typedef struct _FILE_INTERNAL_INFORMATION {
-    LARGE_INTEGER IndexNumber;
-} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
+#if (NTDDI_VERSION >= NTDDI_WINXP)
 
-typedef struct _FILE_LINK_INFORMATION {
-    BOOLEAN ReplaceIfExists;
-    HANDLE  RootDirectory;
-    ULONG   FileNameLength;
-    WCHAR   FileName[1];
-} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
+NTSYSAPI
+PVOID
+NTAPI
+RtlCreateHeap(
+  IN ULONG Flags,
+  IN PVOID HeapBase OPTIONAL,
+  IN SIZE_T ReserveSize OPTIONAL,
+  IN SIZE_T CommitSize OPTIONAL,
+  IN PVOID Lock OPTIONAL,
+  IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL);
 
-typedef struct _FILE_LOCK_INFO
-{
-    LARGE_INTEGER StartingByte;
-    LARGE_INTEGER Length;
-    BOOLEAN ExclusiveLock;
-    ULONG Key;
-    PFILE_OBJECT FileObject;
-    PVOID ProcessId;
-    LARGE_INTEGER EndingByte;
-} FILE_LOCK_INFO, *PFILE_LOCK_INFO;
+NTSYSAPI
+PVOID
+NTAPI
+RtlDestroyHeap(
+  IN PVOID HeapHandle);
 
-typedef struct _FILE_REPARSE_POINT_INFORMATION
-{
-    LONGLONG FileReference;
-    ULONG Tag;
-} FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
+NTSYSAPI
+USHORT
+NTAPI
+RtlCaptureStackBackTrace(
+  IN ULONG FramesToSkip,
+  IN ULONG FramesToCapture,
+  OUT PVOID *BackTrace,
+  OUT PULONG BackTraceHash OPTIONAL);
 
-typedef struct _FILE_MOVE_CLUSTER_INFORMATION
-{
-    ULONG ClusterCount;
-    HANDLE RootDirectory;
-    ULONG FileNameLength;
-    WCHAR FileName[1];
-} FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
+NTSYSAPI
+ULONG
+NTAPI
+RtlRandomEx(
+  IN OUT PULONG Seed);
 
-typedef struct _FILE_NOTIFY_INFORMATION
-{
-    ULONG NextEntryOffset;
-    ULONG Action;
-    ULONG FileNameLength;
-    WCHAR FileName[1];
-} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInitUnicodeStringEx(
+  OUT PUNICODE_STRING DestinationString,
+  IN PCWSTR SourceString OPTIONAL);
 
-/* raw internal file lock struct returned from FsRtlGetNextFileLock */
-typedef struct _FILE_SHARED_LOCK_ENTRY {
-    PVOID           Unknown1;
-    PVOID           Unknown2;
-    FILE_LOCK_INFO  FileLock;
-} FILE_SHARED_LOCK_ENTRY, *PFILE_SHARED_LOCK_ENTRY;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlValidateUnicodeString(
+  IN ULONG Flags,
+  IN PCUNICODE_STRING String);
 
-/* raw internal file lock struct returned from FsRtlGetNextFileLock */
-typedef struct _FILE_EXCLUSIVE_LOCK_ENTRY {
-    LIST_ENTRY      ListEntry;
-    PVOID           Unknown1;
-    PVOID           Unknown2;
-    FILE_LOCK_INFO  FileLock;
-} FILE_EXCLUSIVE_LOCK_ENTRY, *PFILE_EXCLUSIVE_LOCK_ENTRY;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDuplicateUnicodeString(
+  IN ULONG Flags,
+  IN PCUNICODE_STRING SourceString,
+  OUT PUNICODE_STRING DestinationString);
 
-typedef NTSTATUS (NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) (
-    IN PVOID    Context,
-    IN PIRP     Irp
-);
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetCompressionWorkSpaceSize(
+  IN USHORT CompressionFormatAndEngine,
+  OUT PULONG CompressBufferWorkSpaceSize,
+  OUT PULONG CompressFragmentWorkSpaceSize);
 
-typedef VOID (NTAPI *PUNLOCK_ROUTINE) (
-    IN PVOID            Context,
-    IN PFILE_LOCK_INFO  FileLockInfo
-);
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCompressBuffer(
+  IN USHORT CompressionFormatAndEngine,
+  IN PUCHAR UncompressedBuffer,
+  IN ULONG UncompressedBufferSize,
+  OUT PUCHAR CompressedBuffer,
+  IN ULONG CompressedBufferSize,
+  IN ULONG UncompressedChunkSize,
+  OUT PULONG FinalCompressedSize,
+  IN PVOID WorkSpace);
 
-typedef struct _FILE_LOCK {
-    PCOMPLETE_LOCK_IRP_ROUTINE  CompleteLockIrpRoutine;
-    PUNLOCK_ROUTINE             UnlockRoutine;
-    BOOLEAN                     FastIoIsQuestionable;
-    BOOLEAN                     Pad[3];
-    PVOID                       LockInformation;
-    FILE_LOCK_INFO              LastReturnedLockInfo;
-    PVOID                       LastReturnedLock;
-} FILE_LOCK, *PFILE_LOCK;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDecompressBuffer(
+  IN USHORT CompressionFormat,
+  OUT PUCHAR UncompressedBuffer,
+  IN ULONG UncompressedBufferSize,
+  IN PUCHAR CompressedBuffer,
+  IN ULONG CompressedBufferSize,
+  OUT PULONG FinalUncompressedSize);
 
-typedef struct _FILE_MAILSLOT_PEEK_BUFFER {
-    ULONG ReadDataAvailable;
-    ULONG NumberOfMessages;
-    ULONG MessageLength;
-} FILE_MAILSLOT_PEEK_BUFFER, *PFILE_MAILSLOT_PEEK_BUFFER;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDecompressFragment(
+  IN USHORT CompressionFormat,
+  OUT PUCHAR UncompressedFragment,
+  IN ULONG UncompressedFragmentSize,
+  IN PUCHAR CompressedBuffer,
+  IN ULONG CompressedBufferSize,
+  IN ULONG FragmentOffset,
+  OUT PULONG FinalUncompressedSize,
+  IN PVOID WorkSpace);
 
-typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
-    ULONG           MaximumMessageSize;
-    ULONG           MailslotQuota;
-    ULONG           NextMessageSize;
-    ULONG           MessagesAvailable;
-    LARGE_INTEGER   ReadTimeout;
-} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDescribeChunk(
+  IN USHORT CompressionFormat,
+  IN OUT PUCHAR *CompressedBuffer,
+  IN PUCHAR EndOfCompressedBufferPlus1,
+  OUT PUCHAR *ChunkBuffer,
+  OUT PULONG ChunkSize);
 
-typedef struct _FILE_MAILSLOT_SET_INFORMATION {
-    PLARGE_INTEGER ReadTimeout;
-} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlReserveChunk(
+  IN USHORT CompressionFormat,
+  IN OUT PUCHAR *CompressedBuffer,
+  IN PUCHAR EndOfCompressedBufferPlus1,
+  OUT PUCHAR *ChunkBuffer,
+  IN ULONG ChunkSize);
 
-typedef struct _FILE_MODE_INFORMATION {
-    ULONG Mode;
-} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
+typedef struct _COMPRESSED_DATA_INFO {
+  USHORT CompressionFormatAndEngine;
+  UCHAR CompressionUnitShift;
+  UCHAR ChunkShift;
+  UCHAR ClusterShift;
+  UCHAR Reserved;
+  USHORT NumberOfChunks;
+  ULONG CompressedChunkSizes[ANYSIZE_ARRAY];
+} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
 
-typedef struct _FILE_ALL_INFORMATION {
-    FILE_BASIC_INFORMATION      BasicInformation;
-    FILE_STANDARD_INFORMATION   StandardInformation;
-    FILE_INTERNAL_INFORMATION   InternalInformation;
-    FILE_EA_INFORMATION         EaInformation;
-    FILE_ACCESS_INFORMATION     AccessInformation;
-    FILE_POSITION_INFORMATION   PositionInformation;
-    FILE_MODE_INFORMATION       ModeInformation;
-    FILE_ALIGNMENT_INFORMATION  AlignmentInformation;
-    FILE_NAME_INFORMATION       NameInformation;
-} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDecompressChunks(
+  OUT PUCHAR UncompressedBuffer,
+  IN ULONG UncompressedBufferSize,
+  IN PUCHAR CompressedBuffer,
+  IN ULONG CompressedBufferSize,
+  IN PUCHAR CompressedTail,
+  IN ULONG CompressedTailSize,
+  IN PCOMPRESSED_DATA_INFO CompressedDataInfo);
 
-typedef struct _FILE_NAMES_INFORMATION {
-    ULONG NextEntryOffset;
-    ULONG FileIndex;
-    ULONG FileNameLength;
-    WCHAR FileName[1];
-} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCompressChunks(
+  IN PUCHAR UncompressedBuffer,
+  IN ULONG UncompressedBufferSize,
+  OUT PUCHAR CompressedBuffer,
+  IN ULONG CompressedBufferSize,
+  IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo,
+  IN ULONG CompressedDataInfoLength,
+  IN PVOID WorkSpace);
 
-typedef struct _FILE_OBJECTID_INFORMATION {
-    LONGLONG        FileReference;
-    UCHAR           ObjectId[16];
-    _ANONYMOUS_UNION union {
-        struct {
-            UCHAR   BirthVolumeId[16];
-            UCHAR   BirthObjectId[16];
-            UCHAR   DomainId[16];
-        } ;
-        UCHAR       ExtendedInfo[48];
-    } DUMMYUNIONNAME;
-} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
+NTSYSAPI
+PSID_IDENTIFIER_AUTHORITY
+NTAPI
+RtlIdentifierAuthoritySid(
+  IN PSID Sid);
 
-typedef struct _FILE_OLE_CLASSID_INFORMATION {
-    GUID ClassId;
-} FILE_OLE_CLASSID_INFORMATION, *PFILE_OLE_CLASSID_INFORMATION;
+NTSYSAPI
+PUCHAR
+NTAPI
+RtlSubAuthorityCountSid(
+  IN PSID Sid);
 
-typedef struct _FILE_OLE_ALL_INFORMATION {
-    FILE_BASIC_INFORMATION          BasicInformation;
-    FILE_STANDARD_INFORMATION       StandardInformation;
-    FILE_INTERNAL_INFORMATION       InternalInformation;
-    FILE_EA_INFORMATION             EaInformation;
-    FILE_ACCESS_INFORMATION         AccessInformation;
-    FILE_POSITION_INFORMATION       PositionInformation;
-    FILE_MODE_INFORMATION           ModeInformation;
-    FILE_ALIGNMENT_INFORMATION      AlignmentInformation;
-    USN                             LastChangeUsn;
-    USN                             ReplicationUsn;
-    LARGE_INTEGER                   SecurityChangeTime;
-    FILE_OLE_CLASSID_INFORMATION    OleClassIdInformation;
-    FILE_OBJECTID_INFORMATION       ObjectIdInformation;
-    FILE_STORAGE_TYPE               StorageType;
-    ULONG                           OleStateBits;
-    ULONG                           OleId;
-    ULONG                           NumberOfStreamReferences;
-    ULONG                           StreamIndex;
-    ULONG                           SecurityId;
-    BOOLEAN                         ContentIndexDisable;
-    BOOLEAN                         InheritContentIndexDisable;
-    FILE_NAME_INFORMATION           NameInformation;
-} FILE_OLE_ALL_INFORMATION, *PFILE_OLE_ALL_INFORMATION;
+NTSYSAPI
+ULONG
+NTAPI
+RtlNtStatusToDosErrorNoTeb(
+  IN NTSTATUS Status);
 
-typedef struct _FILE_OLE_DIR_INFORMATION {
-    ULONG               NextEntryOffset;
-    ULONG               FileIndex;
-    LARGE_INTEGER       CreationTime;
-    LARGE_INTEGER       LastAccessTime;
-    LARGE_INTEGER       LastWriteTime;
-    LARGE_INTEGER       ChangeTime;
-    LARGE_INTEGER       EndOfFile;
-    LARGE_INTEGER       AllocationSize;
-    ULONG               FileAttributes;
-    ULONG               FileNameLength;
-    FILE_STORAGE_TYPE   StorageType;
-    GUID                OleClassId;
-    ULONG               OleStateBits;
-    BOOLEAN             ContentIndexDisable;
-    BOOLEAN             InheritContentIndexDisable;
-    WCHAR               FileName[1];
-} FILE_OLE_DIR_INFORMATION, *PFILE_OLE_DIR_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateSystemVolumeInformationFolder(
+  IN PCUNICODE_STRING VolumeRootPath);
 
-typedef struct _FILE_OLE_INFORMATION {
-    LARGE_INTEGER                   SecurityChangeTime;
-    FILE_OLE_CLASSID_INFORMATION    OleClassIdInformation;
-    FILE_OBJECTID_INFORMATION       ObjectIdInformation;
-    FILE_STORAGE_TYPE               StorageType;
-    ULONG                           OleStateBits;
-    BOOLEAN                         ContentIndexDisable;
-    BOOLEAN                         InheritContentIndexDisable;
-} FILE_OLE_INFORMATION, *PFILE_OLE_INFORMATION;
+#endif
 
-typedef struct _FILE_OLE_STATE_BITS_INFORMATION {
-    ULONG StateBits;
-    ULONG StateBitsMask;
-} FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION;
+#if defined(_M_AMD64)
 
-typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
-    HANDLE  EventHandle;
-    ULONG   KeyValue;
-} FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;
+FORCEINLINE
+VOID
+RtlFillMemoryUlong (
+  OUT PVOID Destination,
+  IN SIZE_T Length,
+  IN ULONG Pattern)
+{
+  PULONG Address = (PULONG)Destination;
+  if ((Length /= 4) != 0) {
+    if (((ULONG64)Address & 4) != 0) {
+      *Address = Pattern;
+      if ((Length -= 1) == 0) {
+        return;
+      }
+    Address += 1;
+    }
+    __stosq((PULONG64)(Address), Pattern | ((ULONG64)Pattern << 32), Length / 2);
+    if ((Length & 1) != 0) Address[Length - 1] = Pattern;
+  }
+  return;
+}
 
-typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER {
-    PVOID ClientSession;
-    PVOID ClientProcess;
-} FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;
+#define RtlFillMemoryUlonglong(Destination, Length, Pattern)                \
+    __stosq((PULONG64)(Destination), Pattern, (Length) / 8)
 
-typedef struct _FILE_PIPE_EVENT_BUFFER {
-    ULONG NamedPipeState;
-    ULONG EntryType;
-    ULONG ByteCount;
-    ULONG KeyValue;
-    ULONG NumberRequests;
-} FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;
+#else
 
-typedef struct _FILE_PIPE_PEEK_BUFFER
-{
-    ULONG NamedPipeState;
-    ULONG ReadDataAvailable;
-    ULONG NumberOfMessages;
-    ULONG MessageLength;
-    CHAR Data[1];
-} FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
+#if (NTDDI_VERSION >= NTDDI_WINXP)
 
-typedef struct _FILE_PIPE_INFORMATION {
-    ULONG ReadMode;
-    ULONG CompletionMode;
-} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
+NTSYSAPI
+VOID
+NTAPI
+RtlFillMemoryUlong(
+  OUT PVOID Destination,
+  IN SIZE_T Length,
+  IN ULONG Pattern);
 
-typedef struct _FILE_PIPE_LOCAL_INFORMATION {
-    ULONG NamedPipeType;
-    ULONG NamedPipeConfiguration;
-    ULONG MaximumInstances;
-    ULONG CurrentInstances;
-    ULONG InboundQuota;
-    ULONG ReadDataAvailable;
-    ULONG OutboundQuota;
-    ULONG WriteQuotaAvailable;
-    ULONG NamedPipeState;
-    ULONG NamedPipeEnd;
-} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
+NTSYSAPI
+VOID
+NTAPI
+RtlFillMemoryUlonglong(
+  OUT PVOID Destination,
+  IN SIZE_T Length,
+  IN ULONGLONG Pattern);
 
-typedef struct _FILE_PIPE_REMOTE_INFORMATION {
-    LARGE_INTEGER   CollectDataTime;
-    ULONG           MaximumCollectionCount;
-} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
+#endif
 
-typedef struct _FILE_PIPE_WAIT_FOR_BUFFER {
-    LARGE_INTEGER   Timeout;
-    ULONG           NameLength;
-    BOOLEAN         TimeoutSpecified;
-    WCHAR           Name[1];
-} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
+#endif // defined(_M_AMD64)
 
-typedef struct _FILE_RENAME_INFORMATION {
-    BOOLEAN ReplaceIfExists;
-    HANDLE  RootDirectory;
-    ULONG   FileNameLength;
-    WCHAR   FileName[1];
-} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
+#if (NTDDI_VERSION >= NTDDI_WS03)
 
-typedef struct _FILE_STREAM_INFORMATION {
-    ULONG           NextEntryOffset;
-    ULONG           StreamNameLength;
-    LARGE_INTEGER   StreamSize;
-    LARGE_INTEGER   StreamAllocationSize;
-    WCHAR           StreamName[1];
-} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInitAnsiStringEx(
+  OUT PANSI_STRING DestinationString,
+  IN PCSZ SourceString OPTIONAL);
 
-typedef struct _FILE_TRACKING_INFORMATION {
-    HANDLE  DestinationFile;
-    ULONG   ObjectInformationLength;
-    CHAR    ObjectInformation[1];
-} FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
+#endif
 
-#if (VER_PRODUCTBUILD >= 2195)
-typedef struct _FILE_ZERO_DATA_INFORMATION {
-    LARGE_INTEGER FileOffset;
-    LARGE_INTEGER BeyondFinalZero;
-} FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
 
-typedef struct FILE_ALLOCATED_RANGE_BUFFER {
-    LARGE_INTEGER FileOffset;
-    LARGE_INTEGER Length;
-} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetSaclSecurityDescriptor(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  OUT PBOOLEAN SaclPresent,
+  OUT PACL *Sacl,
+  OUT PBOOLEAN SaclDefaulted);
 
-#define FSRTL_FCB_HEADER_V0             (0x00)
-#define FSRTL_FCB_HEADER_V1             (0x01)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetGroupSecurityDescriptor(
+  IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSID Group OPTIONAL,
+  IN BOOLEAN GroupDefaulted OPTIONAL);
 
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetGroupSecurityDescriptor(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  OUT PSID *Group,
+  OUT PBOOLEAN GroupDefaulted);
 
-typedef struct _FSRTL_COMMON_FCB_HEADER {
-    CSHORT          NodeTypeCode;
-    CSHORT          NodeByteSize;
-    UCHAR           Flags;
-    UCHAR           IsFastIoPossible;
-#if (VER_PRODUCTBUILD >= 1381)
-    UCHAR           Flags2;
-    UCHAR           Reserved;
-#endif /* (VER_PRODUCTBUILD >= 1381) */
-    PERESOURCE      Resource;
-    PERESOURCE      PagingIoResource;
-    LARGE_INTEGER   AllocationSize;
-    LARGE_INTEGER   FileSize;
-    LARGE_INTEGER   ValidDataLength;
-} FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER;
-
-typedef enum _FSRTL_COMPARISON_RESULT
-{
-    LessThan = -1,
-    EqualTo = 0,
-    GreaterThan = 1
-} FSRTL_COMPARISON_RESULT;
-    
-#if (VER_PRODUCTBUILD >= 2600)
-
-typedef struct _FSRTL_ADVANCED_FCB_HEADER {
-    CSHORT          NodeTypeCode;
-    CSHORT          NodeByteSize;
-    UCHAR           Flags;
-    UCHAR           IsFastIoPossible;
-    UCHAR           Flags2;
-    UCHAR           Reserved: 4;
-    UCHAR           Version: 4;
-    PERESOURCE      Resource;
-    PERESOURCE      PagingIoResource;
-    LARGE_INTEGER   AllocationSize;
-    LARGE_INTEGER   FileSize;
-    LARGE_INTEGER   ValidDataLength;
-    PFAST_MUTEX     FastMutex;
-    LIST_ENTRY      FilterContexts;
-    EX_PUSH_LOCK    PushLock;
-    PVOID           *FileContextSupportPointer;
-} FSRTL_ADVANCED_FCB_HEADER, *PFSRTL_ADVANCED_FCB_HEADER;
-
-typedef struct _FSRTL_PER_STREAM_CONTEXT {
-    LIST_ENTRY     Links;
-    PVOID          OwnerId;
-    PVOID          InstanceId;
-    PFREE_FUNCTION FreeCallback;
-} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT;
-
-typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT
-{
-    LIST_ENTRY Links;
-    PVOID OwnerId;
-    PVOID InstanceId;
-} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAbsoluteToSelfRelativeSD(
+  IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
+  OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL,
+  IN OUT PULONG BufferLength);
 
-#endif /* (VER_PRODUCTBUILD >= 2600) */
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSelfRelativeToAbsoluteSD(
+  IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
+  OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL,
+  IN OUT PULONG AbsoluteSecurityDescriptorSize,
+  OUT PACL Dacl OPTIONAL,
+  IN OUT PULONG DaclSize,
+  OUT PACL Sacl OPTIONAL,
+  IN OUT PULONG SaclSize,
+  OUT PSID Owner OPTIONAL,
+  IN OUT PULONG OwnerSize,
+  OUT PSID PrimaryGroup OPTIONAL,
+  IN OUT PULONG PrimaryGroupSize);
 
-typedef struct _BASE_MCB
-{
-    ULONG MaximumPairCount;
-    ULONG PairCount;
-    USHORT PoolType;
-    USHORT Flags;
-    PVOID Mapping;
-} BASE_MCB, *PBASE_MCB;
+#endif
 
-typedef struct _LARGE_MCB
-{
-    PKGUARDED_MUTEX GuardedMutex;
-    BASE_MCB BaseMcb;
-} LARGE_MCB, *PLARGE_MCB;
+#if (NTDDI_VERSION >= NTDDI_VISTA)
 
-typedef struct _MCB
-{
-    LARGE_MCB DummyFieldThatSizesThisStructureCorrectly;
-} MCB, *PMCB;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlNormalizeString(
+  IN ULONG NormForm,
+  IN PCWSTR SourceString,
+  IN LONG SourceStringLength,
+  OUT PWSTR DestinationString,
+  IN OUT PLONG DestinationStringLength);
 
-typedef struct _GENERATE_NAME_CONTEXT {
-    USHORT  Checksum;
-    BOOLEAN CheckSumInserted;
-    UCHAR   NameLength;
-    WCHAR   NameBuffer[8];
-    ULONG   ExtensionLength;
-    WCHAR   ExtensionBuffer[4];
-    ULONG   LastIndexValue;
-} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIsNormalizedString(
+  IN ULONG NormForm,
+  IN PCWSTR SourceString,
+  IN LONG SourceStringLength,
+  OUT PBOOLEAN Normalized);
 
-typedef struct _MAPPING_PAIR {
-    ULONGLONG Vcn;
-    ULONGLONG Lcn;
-} MAPPING_PAIR, *PMAPPING_PAIR;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIdnToAscii(
+  IN ULONG Flags,
+  IN PCWSTR SourceString,
+  IN LONG SourceStringLength,
+  OUT PWSTR DestinationString,
+  IN OUT PLONG DestinationStringLength);
 
-typedef struct _GET_RETRIEVAL_DESCRIPTOR {
-    ULONG           NumberOfPairs;
-    ULONGLONG       StartVcn;
-    MAPPING_PAIR    Pair[1];
-} GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIdnToUnicode(
+  IN ULONG Flags,
+  IN PCWSTR SourceString,
+  IN LONG SourceStringLength,
+  OUT PWSTR DestinationString,
+  IN OUT PLONG DestinationStringLength);
 
-typedef struct _KQUEUE {
-    DISPATCHER_HEADER   Header;
-    LIST_ENTRY          EntryListHead;
-    ULONG               CurrentCount;
-    ULONG               MaximumCount;
-    LIST_ENTRY          ThreadListHead;
-} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIdnToNameprepUnicode(
+  IN ULONG Flags,
+  IN PCWSTR SourceString,
+  IN LONG SourceStringLength,
+  OUT PWSTR DestinationString,
+  IN OUT PLONG DestinationStringLength);
 
-#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject);
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateServiceSid(
+  IN PUNICODE_STRING ServiceName,
+  OUT PSID ServiceSid,
+  IN OUT PULONG ServiceSidLength);
 
-typedef struct _MBCB {
-    CSHORT          NodeTypeCode;
-    CSHORT          NodeIsInZone;
-    ULONG           PagesToWrite;
-    ULONG           DirtyPages;
-    ULONG           Reserved;
-    LIST_ENTRY      BitmapRanges;
-    LONGLONG        ResumeWritePage;
-    BITMAP_RANGE    BitmapRange1;
-    BITMAP_RANGE    BitmapRange2;
-    BITMAP_RANGE    BitmapRange3;
-} MBCB, *PMBCB;
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareAltitudes(
+  IN PCUNICODE_STRING Altitude1,
+  IN PCUNICODE_STRING Altitude2);
 
-typedef struct _MOVEFILE_DESCRIPTOR {
-     HANDLE         FileHandle;
-     ULONG          Reserved;
-     LARGE_INTEGER  StartVcn;
-     LARGE_INTEGER  TargetLcn;
-     ULONG          NumVcns;
-     ULONG          Reserved1;
-} MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR;
+#endif
 
-typedef struct _OBJECT_BASIC_INFO {
-    ULONG           Attributes;
-    ACCESS_MASK     GrantedAccess;
-    ULONG           HandleCount;
-    ULONG           ReferenceCount;
-    ULONG           PagedPoolUsage;
-    ULONG           NonPagedPoolUsage;
-    ULONG           Reserved[3];
-    ULONG           NameInformationLength;
-    ULONG           TypeInformationLength;
-    ULONG           SecurityDescriptorLength;
-    LARGE_INTEGER   CreateTime;
-} OBJECT_BASIC_INFO, *POBJECT_BASIC_INFO;
+#if (NTDDI_VERSION >= NTDDI_WIN7)
 
-typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFO {
-    BOOLEAN Inherit;
-    BOOLEAN ProtectFromClose;
-} OBJECT_HANDLE_ATTRIBUTE_INFO, *POBJECT_HANDLE_ATTRIBUTE_INFO;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToUTF8N(
+  OUT PCHAR UTF8StringDestination,
+  IN ULONG UTF8StringMaxByteCount,
+  OUT PULONG UTF8StringActualByteCount,
+  IN PCWCH UnicodeStringSource,
+  IN ULONG UnicodeStringByteCount);
 
-typedef struct _OBJECT_NAME_INFO {
-    UNICODE_STRING  ObjectName;
-    WCHAR           ObjectNameBuffer[1];
-} OBJECT_NAME_INFO, *POBJECT_NAME_INFO;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUTF8ToUnicodeN(
+  OUT PWSTR UnicodeStringDestination,
+  IN ULONG UnicodeStringMaxByteCount,
+  OUT PULONG UnicodeStringActualByteCount,
+  IN PCCH UTF8StringSource,
+  IN ULONG UTF8StringByteCount);
 
-typedef struct _OBJECT_PROTECTION_INFO {
-    BOOLEAN Inherit;
-    BOOLEAN ProtectHandle;
-} OBJECT_PROTECTION_INFO, *POBJECT_PROTECTION_INFO;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlReplaceSidInSd(
+  IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSID OldSid,
+  IN PSID NewSid,
+  OUT ULONG *NumChanges);
 
-typedef struct _OBJECT_TYPE_INFO {
-    UNICODE_STRING  ObjectTypeName;
-    UCHAR           Unknown[0x58];
-    WCHAR           ObjectTypeNameBuffer[1];
-} OBJECT_TYPE_INFO, *POBJECT_TYPE_INFO;
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateVirtualAccountSid(
+  IN PCUNICODE_STRING Name,
+  IN ULONG BaseSubAuthority,
+  OUT PSID Sid,
+  IN OUT PULONG SidLength);
 
-typedef struct _OBJECT_ALL_TYPES_INFO {
-    ULONG               NumberOfObjectTypes;
-    OBJECT_TYPE_INFO    ObjectsTypeInfo[1];
-} OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO;
+#endif
 
+#define HEAP_NO_SERIALIZE               0x00000001
+#define HEAP_GROWABLE                   0x00000002
+#define HEAP_GENERATE_EXCEPTIONS        0x00000004
+#define HEAP_ZERO_MEMORY                0x00000008
+#define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010
+#define HEAP_TAIL_CHECKING_ENABLED      0x00000020
+#define HEAP_FREE_CHECKING_ENABLED      0x00000040
+#define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080
 
-typedef struct _PATHNAME_BUFFER {
-    ULONG PathNameLength;
-    WCHAR Name[1];
-} PATHNAME_BUFFER, *PPATHNAME_BUFFER;
+#define HEAP_CREATE_ALIGN_16            0x00010000
+#define HEAP_CREATE_ENABLE_TRACING      0x00020000
+#define HEAP_CREATE_ENABLE_EXECUTE      0x00040000
 
-typedef enum _RTL_GENERIC_COMPARE_RESULTS
+#define HEAP_SETTABLE_USER_VALUE        0x00000100
+#define HEAP_SETTABLE_USER_FLAG1        0x00000200
+#define HEAP_SETTABLE_USER_FLAG2        0x00000400
+#define HEAP_SETTABLE_USER_FLAG3        0x00000800
+#define HEAP_SETTABLE_USER_FLAGS        0x00000E00
+
+#define HEAP_CLASS_0                    0x00000000
+#define HEAP_CLASS_1                    0x00001000
+#define HEAP_CLASS_2                    0x00002000
+#define HEAP_CLASS_3                    0x00003000
+#define HEAP_CLASS_4                    0x00004000
+#define HEAP_CLASS_5                    0x00005000
+#define HEAP_CLASS_6                    0x00006000
+#define HEAP_CLASS_7                    0x00007000
+#define HEAP_CLASS_8                    0x00008000
+#define HEAP_CLASS_MASK                 0x0000F000
+
+#define HEAP_MAXIMUM_TAG                0x0FFF
+#define HEAP_GLOBAL_TAG                 0x0800
+#define HEAP_PSEUDO_TAG_FLAG            0x8000
+#define HEAP_TAG_SHIFT                  18
+#define HEAP_TAG_MASK                  (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)
+
+#define HEAP_CREATE_VALID_MASK         (HEAP_NO_SERIALIZE |             \
+                                        HEAP_GROWABLE |                 \
+                                        HEAP_GENERATE_EXCEPTIONS |      \
+                                        HEAP_ZERO_MEMORY |              \
+                                        HEAP_REALLOC_IN_PLACE_ONLY |    \
+                                        HEAP_TAIL_CHECKING_ENABLED |    \
+                                        HEAP_FREE_CHECKING_ENABLED |    \
+                                        HEAP_DISABLE_COALESCE_ON_FREE | \
+                                        HEAP_CLASS_MASK |               \
+                                        HEAP_CREATE_ALIGN_16 |          \
+                                        HEAP_CREATE_ENABLE_TRACING |    \
+                                        HEAP_CREATE_ENABLE_EXECUTE)
+
+FORCEINLINE
+ULONG
+HEAP_MAKE_TAG_FLAGS(
+  IN ULONG TagBase,
+  IN ULONG Tag)
 {
-    GenericLessThan,
-    GenericGreaterThan,
-    GenericEqual
-} RTL_GENERIC_COMPARE_RESULTS;
+  //__assume_bound(TagBase); // FIXME
+  return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));
+}
 
-typedef enum _TABLE_SEARCH_RESULT
-{
-    TableEmptyTree,
-    TableFoundNode,
-    TableInsertAsLeft,
-    TableInsertAsRight
-} TABLE_SEARCH_RESULT;
+#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
+#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
 
-typedef NTSTATUS
-(NTAPI *PRTL_AVL_MATCH_FUNCTION)(
-    struct _RTL_AVL_TABLE *Table,
-    PVOID UserData,
-    PVOID MatchData
-);
+#define RtlUnicodeStringToOemSize(STRING) (NLS_MB_OEM_CODE_PAGE_TAG ?                                \
+                                           RtlxUnicodeStringToOemSize(STRING) :                      \
+                                           ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
+)
 
-typedef RTL_GENERIC_COMPARE_RESULTS
-(NTAPI *PRTL_AVL_COMPARE_ROUTINE) (
-    struct _RTL_AVL_TABLE *Table,
-    PVOID FirstStruct,
-    PVOID SecondStruct
-);
+#define RtlOemStringToUnicodeSize(STRING) (                 \
+    NLS_MB_OEM_CODE_PAGE_TAG ?                              \
+    RtlxOemStringToUnicodeSize(STRING) :                    \
+    ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)  \
+)
 
-typedef RTL_GENERIC_COMPARE_RESULTS
-(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) (
-    struct _RTL_GENERIC_TABLE *Table,
-    PVOID FirstStruct,
-    PVOID SecondStruct
-);
+#define RtlOemStringToCountedUnicodeSize(STRING) (                    \
+    (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
+)
 
 typedef PVOID
-(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) (
-    struct _RTL_GENERIC_TABLE *Table,
-    CLONG ByteSize
-);
+(NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)(
+  IN SIZE_T NumberOfBytes);
 
-typedef VOID
-(NTAPI *PRTL_GENERIC_FREE_ROUTINE) (
-    struct _RTL_GENERIC_TABLE *Table,
-    PVOID Buffer
-);
+#if _WIN32_WINNT >= 0x0600
 
 typedef PVOID
-(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) (
-    struct _RTL_AVL_TABLE *Table,
-    CLONG ByteSize
-);
+(NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)(
+  IN SIZE_T NumberOfBytes,
+  IN PVOID Buffer);
 
-typedef VOID
-(NTAPI *PRTL_AVL_FREE_ROUTINE) (
-    struct _RTL_AVL_TABLE *Table,
-    PVOID Buffer
-);
+#endif
 
-typedef struct _PUBLIC_BCB {
-    CSHORT          NodeTypeCode;
-    CSHORT          NodeByteSize;
-    ULONG           MappedLength;
-    LARGE_INTEGER   MappedFileOffset;
-} PUBLIC_BCB, *PPUBLIC_BCB;
+typedef VOID
+(NTAPI *PRTL_FREE_STRING_ROUTINE)(
+  IN PVOID Buffer);
 
-typedef struct _QUERY_PATH_REQUEST {
-    ULONG                   PathNameLength;
-    PIO_SECURITY_CONTEXT    SecurityContext;
-    WCHAR                   FilePathName[1];
-} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST;
+extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine;
+extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine;
 
-typedef struct _QUERY_PATH_RESPONSE {
-    ULONG LengthAccepted;
-} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE;
+#if _WIN32_WINNT >= 0x0600
+extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine;
+#endif
 
-typedef struct _RETRIEVAL_POINTERS_BUFFER {
-    ULONG               ExtentCount;
-    LARGE_INTEGER       StartingVcn;
-    struct {
-        LARGE_INTEGER   NextVcn;
-        LARGE_INTEGER   Lcn;
-    } Extents[1];
-} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
+#define COMPRESSION_FORMAT_NONE         (0x0000)
+#define COMPRESSION_FORMAT_DEFAULT      (0x0001)
+#define COMPRESSION_FORMAT_LZNT1        (0x0002)
+#define COMPRESSION_ENGINE_STANDARD     (0x0000)
+#define COMPRESSION_ENGINE_MAXIMUM      (0x0100)
+#define COMPRESSION_ENGINE_HIBER        (0x0200)
 
-typedef struct _RTL_SPLAY_LINKS {
-    struct _RTL_SPLAY_LINKS *Parent;
-    struct _RTL_SPLAY_LINKS *LeftChild;
-    struct _RTL_SPLAY_LINKS *RightChild;
-} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
+#define RtlOffsetToPointer(B,O)  ((PCHAR)( ((PCHAR)(B)) + ((ULONG_PTR)(O))  ))
+#define RtlPointerToOffset(B,P)  ((ULONG)( ((PCHAR)(P)) - ((PCHAR)(B))  ))
+
+#define MAX_UNICODE_STACK_BUFFER_LENGTH 256
+
+#define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER    L"System Volume Information"
+
+#define DEVICE_TYPE ULONG
+
+#define FILE_DEVICE_BEEP                0x00000001
+#define FILE_DEVICE_CD_ROM              0x00000002
+#define FILE_DEVICE_CD_ROM_FILE_SYSTEM  0x00000003
+#define FILE_DEVICE_CONTROLLER          0x00000004
+#define FILE_DEVICE_DATALINK            0x00000005
+#define FILE_DEVICE_DFS                 0x00000006
+#define FILE_DEVICE_DISK                0x00000007
+#define FILE_DEVICE_DISK_FILE_SYSTEM    0x00000008
+#define FILE_DEVICE_FILE_SYSTEM         0x00000009
+#define FILE_DEVICE_INPORT_PORT         0x0000000a
+#define FILE_DEVICE_KEYBOARD            0x0000000b
+#define FILE_DEVICE_MAILSLOT            0x0000000c
+#define FILE_DEVICE_MIDI_IN             0x0000000d
+#define FILE_DEVICE_MIDI_OUT            0x0000000e
+#define FILE_DEVICE_MOUSE               0x0000000f
+#define FILE_DEVICE_MULTI_UNC_PROVIDER  0x00000010
+#define FILE_DEVICE_NAMED_PIPE          0x00000011
+#define FILE_DEVICE_NETWORK             0x00000012
+#define FILE_DEVICE_NETWORK_BROWSER     0x00000013
+#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
+#define FILE_DEVICE_NULL                0x00000015
+#define FILE_DEVICE_PARALLEL_PORT       0x00000016
+#define FILE_DEVICE_PHYSICAL_NETCARD    0x00000017
+#define FILE_DEVICE_PRINTER             0x00000018
+#define FILE_DEVICE_SCANNER             0x00000019
+#define FILE_DEVICE_SERIAL_MOUSE_PORT   0x0000001a
+#define FILE_DEVICE_SERIAL_PORT         0x0000001b
+#define FILE_DEVICE_SCREEN              0x0000001c
+#define FILE_DEVICE_SOUND               0x0000001d
+#define FILE_DEVICE_STREAMS             0x0000001e
+#define FILE_DEVICE_TAPE                0x0000001f
+#define FILE_DEVICE_TAPE_FILE_SYSTEM    0x00000020
+#define FILE_DEVICE_TRANSPORT           0x00000021
+#define FILE_DEVICE_UNKNOWN             0x00000022
+#define FILE_DEVICE_VIDEO               0x00000023
+#define FILE_DEVICE_VIRTUAL_DISK        0x00000024
+#define FILE_DEVICE_WAVE_IN             0x00000025
+#define FILE_DEVICE_WAVE_OUT            0x00000026
+#define FILE_DEVICE_8042_PORT           0x00000027
+#define FILE_DEVICE_NETWORK_REDIRECTOR  0x00000028
+#define FILE_DEVICE_BATTERY             0x00000029
+#define FILE_DEVICE_BUS_EXTENDER        0x0000002a
+#define FILE_DEVICE_MODEM               0x0000002b
+#define FILE_DEVICE_VDM                 0x0000002c
+#define FILE_DEVICE_MASS_STORAGE        0x0000002d
+#define FILE_DEVICE_SMB                 0x0000002e
+#define FILE_DEVICE_KS                  0x0000002f
+#define FILE_DEVICE_CHANGER             0x00000030
+#define FILE_DEVICE_SMARTCARD           0x00000031
+#define FILE_DEVICE_ACPI                0x00000032
+#define FILE_DEVICE_DVD                 0x00000033
+#define FILE_DEVICE_FULLSCREEN_VIDEO    0x00000034
+#define FILE_DEVICE_DFS_FILE_SYSTEM     0x00000035
+#define FILE_DEVICE_DFS_VOLUME          0x00000036
+#define FILE_DEVICE_SERENUM             0x00000037
+#define FILE_DEVICE_TERMSRV             0x00000038
+#define FILE_DEVICE_KSEC                0x00000039
+#define FILE_DEVICE_FIPS                0x0000003A
+#define FILE_DEVICE_INFINIBAND          0x0000003B
+#define FILE_DEVICE_VMBUS               0x0000003E
+#define FILE_DEVICE_CRYPT_PROVIDER      0x0000003F
+#define FILE_DEVICE_WPD                 0x00000040
+#define FILE_DEVICE_BLUETOOTH           0x00000041
+#define FILE_DEVICE_MT_COMPOSITE        0x00000042
+#define FILE_DEVICE_MT_TRANSPORT        0x00000043
+#define FILE_DEVICE_BIOMETRIC           0x00000044
+#define FILE_DEVICE_PMI                 0x00000045
+
+#define CTL_CODE(DeviceType, Function, Method, Access) \
+  (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
+
+#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
+
+#define METHOD_FROM_CTL_CODE(ctrlCode)          ((ULONG)(ctrlCode & 3))
+
+#define METHOD_BUFFERED                 0
+#define METHOD_IN_DIRECT                1
+#define METHOD_OUT_DIRECT               2
+#define METHOD_NEITHER                  3
+#define METHOD_DIRECT_TO_HARDWARE       METHOD_IN_DIRECT
+#define METHOD_DIRECT_FROM_HARDWARE     METHOD_OUT_DIRECT
+
+#define FILE_ANY_ACCESS                   0x00000000
+#define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
+#define FILE_READ_ACCESS                  0x00000001
+#define FILE_WRITE_ACCESS                 0x00000002
 
-typedef struct _RTL_BALANCED_LINKS
-{
-    struct _RTL_BALANCED_LINKS *Parent;
-    struct _RTL_BALANCED_LINKS *LeftChild;
-    struct _RTL_BALANCED_LINKS *RightChild;
-    CHAR Balance;
-    UCHAR Reserved[3];
-} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
+typedef ULONG  LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE;
 
-typedef struct _RTL_GENERIC_TABLE
-{
-    PRTL_SPLAY_LINKS TableRoot;
-    LIST_ENTRY InsertOrderList;
-    PLIST_ENTRY OrderedPointer;
-    ULONG WhichOrderedElement;
-    ULONG NumberGenericTableElements;
-    PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;
-    PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;
-    PRTL_GENERIC_FREE_ROUTINE FreeRoutine;
-    PVOID TableContext;
-} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
+typedef enum _SECURITY_LOGON_TYPE {
+  UndefinedLogonType = 0,
+  Interactive = 2,
+  Network,
+  Batch,
+  Service,
+  Proxy,
+  Unlock,
+  NetworkCleartext,
+  NewCredentials,
+#if (_WIN32_WINNT >= 0x0501)
+  RemoteInteractive,
+  CachedInteractive,
+#endif
+#if (_WIN32_WINNT >= 0x0502)
+  CachedRemoteInteractive,
+  CachedUnlock
+#endif
+} SECURITY_LOGON_TYPE, *PSECURITY_LOGON_TYPE;
 
-typedef struct _UNICODE_PREFIX_TABLE_ENTRY
-{
-    CSHORT NodeTypeCode;
-    CSHORT NameLength;
-    struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree;
-    struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch;
-    RTL_SPLAY_LINKS Links;
-    PUNICODE_STRING Prefix;
-} UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY;
-    
-typedef struct _UNICODE_PREFIX_TABLE
-{
-    CSHORT NodeTypeCode;
-    CSHORT NameLength;
-    PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
-    PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
-} UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
-    
-NTSYSAPI
-VOID
-NTAPI
-RtlInitializeUnicodePrefix (
-    IN PUNICODE_PREFIX_TABLE PrefixTable
-);
-    
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlInsertUnicodePrefix (
-    IN PUNICODE_PREFIX_TABLE PrefixTable,
-    IN PUNICODE_STRING Prefix,
-    IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry
-);
-    
-NTSYSAPI
-VOID
+#ifndef _NTLSA_AUDIT_
+#define _NTLSA_AUDIT_
+
+#ifndef GUID_DEFINED
+#include <guiddef.h>
+#endif
+
+#endif /* _NTLSA_AUDIT_ */
+
+NTSTATUS
 NTAPI
-RtlRemoveUnicodePrefix (
-    IN PUNICODE_PREFIX_TABLE PrefixTable,
-    IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry
-);
+LsaRegisterLogonProcess(
+  IN PLSA_STRING LogonProcessName,
+  OUT PHANDLE LsaHandle,
+  OUT PLSA_OPERATIONAL_MODE SecurityMode);
 
-NTSYSAPI
-PUNICODE_PREFIX_TABLE_ENTRY
+NTSTATUS
 NTAPI
-RtlFindUnicodePrefix (
-    IN PUNICODE_PREFIX_TABLE PrefixTable,
-    IN PUNICODE_STRING FullName,
-    IN ULONG CaseInsensitiveIndex
-);
-    
-NTSYSAPI
-PUNICODE_PREFIX_TABLE_ENTRY
+LsaLogonUser(
+  IN HANDLE LsaHandle,
+  IN PLSA_STRING OriginName,
+  IN SECURITY_LOGON_TYPE LogonType,
+  IN ULONG AuthenticationPackage,
+  IN PVOID AuthenticationInformation,
+  IN ULONG AuthenticationInformationLength,
+  IN PTOKEN_GROUPS LocalGroups OPTIONAL,
+  IN PTOKEN_SOURCE SourceContext,
+  OUT PVOID *ProfileBuffer,
+  OUT PULONG ProfileBufferLength,
+  OUT PLUID LogonId,
+  OUT PHANDLE Token,
+  OUT PQUOTA_LIMITS Quotas,
+  OUT PNTSTATUS SubStatus);
+
+NTSTATUS
 NTAPI
-RtlNextUnicodePrefix (
-    IN PUNICODE_PREFIX_TABLE PrefixTable,
-    IN BOOLEAN Restart
-);
+LsaFreeReturnBuffer(
+  IN PVOID Buffer);
 
-#undef PRTL_GENERIC_COMPARE_ROUTINE
-#undef PRTL_GENERIC_ALLOCATE_ROUTINE
-#undef PRTL_GENERIC_FREE_ROUTINE
-#undef RTL_GENERIC_TABLE
-#undef PRTL_GENERIC_TABLE
+#ifndef _NTLSA_IFS_
+#define _NTLSA_IFS_
+#endif
 
-#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE
-#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE
-#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE
-#define RTL_GENERIC_TABLE RTL_AVL_TABLE
-#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE
+#define MSV1_0_PACKAGE_NAME     "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0"
+#define MSV1_0_PACKAGE_NAMEW    L"MICROSOFT_AUTHENTICATION_PACKAGE_V1_0"
+#define MSV1_0_PACKAGE_NAMEW_LENGTH sizeof(MSV1_0_PACKAGE_NAMEW) - sizeof(WCHAR)
 
-#define RtlInitializeGenericTable               RtlInitializeGenericTableAvl
-#define RtlInsertElementGenericTable            RtlInsertElementGenericTableAvl
-#define RtlInsertElementGenericTableFull        RtlInsertElementGenericTableFullAvl
-#define RtlDeleteElementGenericTable            RtlDeleteElementGenericTableAvl
-#define RtlLookupElementGenericTable            RtlLookupElementGenericTableAvl
-#define RtlLookupElementGenericTableFull        RtlLookupElementGenericTableFullAvl
-#define RtlEnumerateGenericTable                RtlEnumerateGenericTableAvl
-#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
-#define RtlGetElementGenericTable               RtlGetElementGenericTableAvl
-#define RtlNumberGenericTableElements           RtlNumberGenericTableElementsAvl
-#define RtlIsGenericTableEmpty                  RtlIsGenericTableEmptyAvl
+#define MSV1_0_SUBAUTHENTICATION_KEY "SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0"
+#define MSV1_0_SUBAUTHENTICATION_VALUE "Auth"
 
-typedef struct _RTL_AVL_TABLE
-{
-    RTL_BALANCED_LINKS BalancedRoot;
-    PVOID OrderedPointer;
-    ULONG WhichOrderedElement;
-    ULONG NumberGenericTableElements;
-    ULONG DepthOfTree;
-    PRTL_BALANCED_LINKS RestartKey;
-    ULONG DeleteCount;
-    PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
-    PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
-    PRTL_AVL_FREE_ROUTINE FreeRoutine;
-    PVOID TableContext;
-} RTL_AVL_TABLE, *PRTL_AVL_TABLE;
+#define MSV1_0_CHALLENGE_LENGTH 8
+#define MSV1_0_USER_SESSION_KEY_LENGTH 16
+#define MSV1_0_LANMAN_SESSION_KEY_LENGTH 8
 
-NTSYSAPI
-VOID
-NTAPI
-RtlInitializeGenericTableAvl(
-    PRTL_AVL_TABLE Table,
-    PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
-    PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
-    PRTL_AVL_FREE_ROUTINE FreeRoutine,
-    PVOID TableContext
-);
+#define MSV1_0_CLEARTEXT_PASSWORD_ALLOWED    0x02
+#define MSV1_0_UPDATE_LOGON_STATISTICS       0x04
+#define MSV1_0_RETURN_USER_PARAMETERS        0x08
+#define MSV1_0_DONT_TRY_GUEST_ACCOUNT        0x10
+#define MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT    0x20
+#define MSV1_0_RETURN_PASSWORD_EXPIRY        0x40
+#define MSV1_0_USE_CLIENT_CHALLENGE          0x80
+#define MSV1_0_TRY_GUEST_ACCOUNT_ONLY        0x100
+#define MSV1_0_RETURN_PROFILE_PATH           0x200
+#define MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY     0x400
+#define MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT 0x800
 
-NTSYSAPI
-PVOID
-NTAPI
-RtlInsertElementGenericTableAvl (
-    PRTL_AVL_TABLE Table,
-    PVOID Buffer,
-    CLONG BufferSize,
-    PBOOLEAN NewElement OPTIONAL
-    );
-    
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlDeleteElementGenericTableAvl (
-    PRTL_AVL_TABLE Table,
-    PVOID Buffer
-    );
-    
-NTSYSAPI
-PVOID
-NTAPI
-RtlLookupElementGenericTableAvl (
-    PRTL_AVL_TABLE Table,
-    PVOID Buffer
-    );
-    
-NTSYSAPI
-PVOID
-NTAPI
-RtlEnumerateGenericTableWithoutSplayingAvl (
-    PRTL_AVL_TABLE Table,
-    PVOID *RestartKey
-    );
+#define MSV1_0_DISABLE_PERSONAL_FALLBACK     0x00001000
+#define MSV1_0_ALLOW_FORCE_GUEST             0x00002000
 
-#if defined(USE_LPC6432)
-#define LPC_CLIENT_ID CLIENT_ID64
-#define LPC_SIZE_T ULONGLONG
-#define LPC_PVOID ULONGLONG
-#define LPC_HANDLE ULONGLONG
-#else
-#define LPC_CLIENT_ID CLIENT_ID
-#define LPC_SIZE_T SIZE_T
-#define LPC_PVOID PVOID
-#define LPC_HANDLE HANDLE
+#if (_WIN32_WINNT >= 0x0502)
+#define MSV1_0_CLEARTEXT_PASSWORD_SUPPLIED   0x00004000
+#define MSV1_0_USE_DOMAIN_FOR_ROUTING_ONLY   0x00008000
 #endif
 
-typedef struct _PORT_MESSAGE
-{
-    union
-    {
-        struct
-        {
-            CSHORT DataLength;
-            CSHORT TotalLength;
-        } s1;
-        ULONG Length;
-    } u1;
-    union
-    {
-        struct
-        {
-            CSHORT Type;
-            CSHORT DataInfoOffset;
-        } s2;
-        ULONG ZeroInit;
-    } u2;
-    union
-    {
-        LPC_CLIENT_ID ClientId;
-        double DoNotUseThisField;
-    };
-    ULONG MessageId;
-    union
-    {
-        LPC_SIZE_T ClientViewSize;
-        ULONG CallbackId;
-    };
-} PORT_MESSAGE, *PPORT_MESSAGE;
-
-#define LPC_KERNELMODE_MESSAGE      (CSHORT)((USHORT)0x8000)
+#define MSV1_0_SUBAUTHENTICATION_DLL_EX      0x00100000
+#define MSV1_0_ALLOW_MSVCHAPV2               0x00010000
 
-typedef struct _PORT_VIEW
-{
-    ULONG Length;
-    LPC_HANDLE SectionHandle;
-    ULONG SectionOffset;
-    LPC_SIZE_T ViewSize;
-    LPC_PVOID ViewBase;
-    LPC_PVOID ViewRemoteBase;
-} PORT_VIEW, *PPORT_VIEW;
+#if (_WIN32_WINNT >= 0x0600)
+#define MSV1_0_S4U2SELF                      0x00020000
+#define MSV1_0_CHECK_LOGONHOURS_FOR_S4U      0x00040000
+#endif
 
-typedef struct _REMOTE_PORT_VIEW
-{
-    ULONG Length;
-    LPC_SIZE_T ViewSize;
-    LPC_PVOID ViewBase;
-} REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW;
+#define MSV1_0_SUBAUTHENTICATION_DLL         0xFF000000
+#define MSV1_0_SUBAUTHENTICATION_DLL_SHIFT   24
+#define MSV1_0_MNS_LOGON                     0x01000000
+
+#define MSV1_0_SUBAUTHENTICATION_DLL_RAS     2
+#define MSV1_0_SUBAUTHENTICATION_DLL_IIS     132
+
+#define LOGON_GUEST                 0x01
+#define LOGON_NOENCRYPTION          0x02
+#define LOGON_CACHED_ACCOUNT        0x04
+#define LOGON_USED_LM_PASSWORD      0x08
+#define LOGON_EXTRA_SIDS            0x20
+#define LOGON_SUBAUTH_SESSION_KEY   0x40
+#define LOGON_SERVER_TRUST_ACCOUNT  0x80
+#define LOGON_NTLMV2_ENABLED        0x100
+#define LOGON_RESOURCE_GROUPS       0x200
+#define LOGON_PROFILE_PATH_RETURNED 0x400
+#define LOGON_NT_V2                 0x800
+#define LOGON_LM_V2                 0x1000
+#define LOGON_NTLM_V2               0x2000
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define LOGON_OPTIMIZED             0x4000
+#define LOGON_WINLOGON              0x8000
+#define LOGON_PKINIT               0x10000
+#define LOGON_NO_OPTIMIZED         0x20000
 
-typedef struct _SE_EXPORTS {
+#endif
 
-    LUID    SeCreateTokenPrivilege;
-    LUID    SeAssignPrimaryTokenPrivilege;
-    LUID    SeLockMemoryPrivilege;
-    LUID    SeIncreaseQuotaPrivilege;
-    LUID    SeUnsolicitedInputPrivilege;
-    LUID    SeTcbPrivilege;
-    LUID    SeSecurityPrivilege;
-    LUID    SeTakeOwnershipPrivilege;
-    LUID    SeLoadDriverPrivilege;
-    LUID    SeCreatePagefilePrivilege;
-    LUID    SeIncreaseBasePriorityPrivilege;
-    LUID    SeSystemProfilePrivilege;
-    LUID    SeSystemtimePrivilege;
-    LUID    SeProfileSingleProcessPrivilege;
-    LUID    SeCreatePermanentPrivilege;
-    LUID    SeBackupPrivilege;
-    LUID    SeRestorePrivilege;
-    LUID    SeShutdownPrivilege;
-    LUID    SeDebugPrivilege;
-    LUID    SeAuditPrivilege;
-    LUID    SeSystemEnvironmentPrivilege;
-    LUID    SeChangeNotifyPrivilege;
-    LUID    SeRemoteShutdownPrivilege;
-
-    PSID    SeNullSid;
-    PSID    SeWorldSid;
-    PSID    SeLocalSid;
-    PSID    SeCreatorOwnerSid;
-    PSID    SeCreatorGroupSid;
-
-    PSID    SeNtAuthoritySid;
-    PSID    SeDialupSid;
-    PSID    SeNetworkSid;
-    PSID    SeBatchSid;
-    PSID    SeInteractiveSid;
-    PSID    SeLocalSystemSid;
-    PSID    SeAliasAdminsSid;
-    PSID    SeAliasUsersSid;
-    PSID    SeAliasGuestsSid;
-    PSID    SeAliasPowerUsersSid;
-    PSID    SeAliasAccountOpsSid;
-    PSID    SeAliasSystemOpsSid;
-    PSID    SeAliasPrintOpsSid;
-    PSID    SeAliasBackupOpsSid;
-
-    PSID    SeAuthenticatedUsersSid;
-
-    PSID    SeRestrictedSid;
-    PSID    SeAnonymousLogonSid;
-
-    LUID    SeUndockPrivilege;
-    LUID    SeSyncAgentPrivilege;
-    LUID    SeEnableDelegationPrivilege;
+#define MSV1_0_SUBAUTHENTICATION_FLAGS 0xFF000000
 
-} SE_EXPORTS, *PSE_EXPORTS;
+#define LOGON_GRACE_LOGON              0x01000000
 
-extern PSE_EXPORTS SeExports;
+#define MSV1_0_OWF_PASSWORD_LENGTH 16
+#define MSV1_0_CRED_LM_PRESENT 0x1
+#define MSV1_0_CRED_NT_PRESENT 0x2
+#define MSV1_0_CRED_VERSION 0
 
-typedef struct
-{
-  LARGE_INTEGER StartingLcn;
-} STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
+#define MSV1_0_NTLM3_RESPONSE_LENGTH 16
+#define MSV1_0_NTLM3_OWF_LENGTH 16
 
-typedef struct _STARTING_VCN_INPUT_BUFFER {
-    LARGE_INTEGER StartingVcn;
-} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
+#if (_WIN32_WINNT == 0x0500)
+#define MSV1_0_MAX_NTLM3_LIFE 1800
+#else
+#define MSV1_0_MAX_NTLM3_LIFE 129600
+#endif
+#define MSV1_0_MAX_AVL_SIZE 64000
 
-typedef struct _SECURITY_CLIENT_CONTEXT {
-    SECURITY_QUALITY_OF_SERVICE SecurityQos;
-    PACCESS_TOKEN               ClientToken;
-    BOOLEAN                     DirectlyAccessClientToken;
-    BOOLEAN                     DirectAccessEffectiveOnly;
-    BOOLEAN                     ServerIsRemote;
-    TOKEN_CONTROL               ClientTokenControl;
-} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;
+#if (_WIN32_WINNT >= 0x0501)
 
-//
-//  The following are the inherit flags that go into the AceFlags field
-//  of an Ace header.
-//
-#define OBJECT_INHERIT_ACE                (0x1)
-#define CONTAINER_INHERIT_ACE             (0x2)
-#define NO_PROPAGATE_INHERIT_ACE          (0x4)
-#define INHERIT_ONLY_ACE                  (0x8)
-#define INHERITED_ACE                     (0x10)
-#define VALID_INHERIT_FLAGS               (0x1F)
+#define MSV1_0_AV_FLAG_FORCE_GUEST                  0x00000001
 
-typedef struct _ACE_HEADER
-{
-    UCHAR AceType;
-    UCHAR AceFlags;
-    USHORT AceSize;
-} ACE_HEADER, *PACE_HEADER;
+#if (_WIN32_WINNT >= 0x0600)
+#define MSV1_0_AV_FLAG_MIC_HANDSHAKE_MESSAGES       0x00000002
+#endif
 
-typedef struct _ACCESS_ALLOWED_ACE
-{
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    ULONG SidStart;
-} ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE;
+#endif
 
-typedef struct _ACCESS_DENIED_ACE
-{
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    ULONG SidStart;
-} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE;
+#define MSV1_0_NTLM3_INPUT_LENGTH (sizeof(MSV1_0_NTLM3_RESPONSE) - MSV1_0_NTLM3_RESPONSE_LENGTH)
 
-typedef struct _SYSTEM_AUDIT_ACE
-{
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    ULONG SidStart;
-} SYSTEM_AUDIT_ACE, *PSYSTEM_AUDIT_ACE;
+#if(_WIN32_WINNT >= 0x0502)
+#define MSV1_0_NTLM3_MIN_NT_RESPONSE_LENGTH RTL_SIZEOF_THROUGH_FIELD(MSV1_0_NTLM3_RESPONSE, AvPairsOff)
+#endif
 
-typedef struct _SYSTEM_ALARM_ACE
-{
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    ULONG SidStart;
-} SYSTEM_ALARM_ACE, *PSYSTEM_ALARM_ACE;
+#define USE_PRIMARY_PASSWORD            0x01
+#define RETURN_PRIMARY_USERNAME         0x02
+#define RETURN_PRIMARY_LOGON_DOMAINNAME 0x04
+#define RETURN_NON_NT_USER_SESSION_KEY  0x08
+#define GENERATE_CLIENT_CHALLENGE       0x10
+#define GCR_NTLM3_PARMS                 0x20
+#define GCR_TARGET_INFO                 0x40
+#define RETURN_RESERVED_PARAMETER       0x80
+#define GCR_ALLOW_NTLM                 0x100
+#define GCR_USE_OEM_SET                0x200
+#define GCR_MACHINE_CREDENTIAL         0x400
+#define GCR_USE_OWF_PASSWORD           0x800
+#define GCR_ALLOW_LM                  0x1000
+#define GCR_ALLOW_NO_TARGET           0x2000
+
+typedef enum _MSV1_0_LOGON_SUBMIT_TYPE {
+  MsV1_0InteractiveLogon = 2,
+  MsV1_0Lm20Logon,
+  MsV1_0NetworkLogon,
+  MsV1_0SubAuthLogon,
+  MsV1_0WorkstationUnlockLogon = 7,
+  MsV1_0S4ULogon = 12,
+  MsV1_0VirtualLogon = 82
+} MSV1_0_LOGON_SUBMIT_TYPE, *PMSV1_0_LOGON_SUBMIT_TYPE;
+
+typedef enum _MSV1_0_PROFILE_BUFFER_TYPE {
+  MsV1_0InteractiveProfile = 2,
+  MsV1_0Lm20LogonProfile,
+  MsV1_0SmartCardProfile
+} MSV1_0_PROFILE_BUFFER_TYPE, *PMSV1_0_PROFILE_BUFFER_TYPE;
+
+typedef struct _MSV1_0_INTERACTIVE_LOGON {
+  MSV1_0_LOGON_SUBMIT_TYPE MessageType;
+  UNICODE_STRING LogonDomainName;
+  UNICODE_STRING UserName;
+  UNICODE_STRING Password;
+} MSV1_0_INTERACTIVE_LOGON, *PMSV1_0_INTERACTIVE_LOGON;
+
+typedef struct _MSV1_0_INTERACTIVE_PROFILE {
+  MSV1_0_PROFILE_BUFFER_TYPE MessageType;
+  USHORT LogonCount;
+  USHORT BadPasswordCount;
+  LARGE_INTEGER LogonTime;
+  LARGE_INTEGER LogoffTime;
+  LARGE_INTEGER KickOffTime;
+  LARGE_INTEGER PasswordLastSet;
+  LARGE_INTEGER PasswordCanChange;
+  LARGE_INTEGER PasswordMustChange;
+  UNICODE_STRING LogonScript;
+  UNICODE_STRING HomeDirectory;
+  UNICODE_STRING FullName;
+  UNICODE_STRING ProfilePath;
+  UNICODE_STRING HomeDirectoryDrive;
+  UNICODE_STRING LogonServer;
+  ULONG UserFlags;
+} MSV1_0_INTERACTIVE_PROFILE, *PMSV1_0_INTERACTIVE_PROFILE;
+
+typedef struct _MSV1_0_LM20_LOGON {
+  MSV1_0_LOGON_SUBMIT_TYPE MessageType;
+  UNICODE_STRING LogonDomainName;
+  UNICODE_STRING UserName;
+  UNICODE_STRING Workstation;
+  UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+  STRING CaseSensitiveChallengeResponse;
+  STRING CaseInsensitiveChallengeResponse;
+  ULONG ParameterControl;
+} MSV1_0_LM20_LOGON, * PMSV1_0_LM20_LOGON;
+
+typedef struct _MSV1_0_SUBAUTH_LOGON {
+  MSV1_0_LOGON_SUBMIT_TYPE MessageType;
+  UNICODE_STRING LogonDomainName;
+  UNICODE_STRING UserName;
+  UNICODE_STRING Workstation;
+  UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+  STRING AuthenticationInfo1;
+  STRING AuthenticationInfo2;
+  ULONG ParameterControl;
+  ULONG SubAuthPackageId;
+} MSV1_0_SUBAUTH_LOGON, * PMSV1_0_SUBAUTH_LOGON;
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define MSV1_0_S4U_LOGON_FLAG_CHECK_LOGONHOURS 0x2
+
+typedef struct _MSV1_0_S4U_LOGON {
+  MSV1_0_LOGON_SUBMIT_TYPE MessageType;
+  ULONG Flags;
+  UNICODE_STRING UserPrincipalName;
+  UNICODE_STRING DomainName;
+} MSV1_0_S4U_LOGON, *PMSV1_0_S4U_LOGON;
 
-typedef struct _SYSTEM_MANDATORY_LABEL_ACE
-{
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    ULONG SidStart;
-} SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;
+#endif
 
-typedef struct _TUNNEL {
-    FAST_MUTEX          Mutex;
-    PRTL_SPLAY_LINKS    Cache;
-    LIST_ENTRY          TimerQueue;
-    USHORT              NumEntries;
-} TUNNEL, *PTUNNEL;
+typedef struct _MSV1_0_LM20_LOGON_PROFILE {
+  MSV1_0_PROFILE_BUFFER_TYPE MessageType;
+  LARGE_INTEGER KickOffTime;
+  LARGE_INTEGER LogoffTime;
+  ULONG UserFlags;
+  UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH];
+  UNICODE_STRING LogonDomainName;
+  UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH];
+  UNICODE_STRING LogonServer;
+  UNICODE_STRING UserParameters;
+} MSV1_0_LM20_LOGON_PROFILE, * PMSV1_0_LM20_LOGON_PROFILE;
+
+typedef struct _MSV1_0_SUPPLEMENTAL_CREDENTIAL {
+  ULONG Version;
+  ULONG Flags;
+  UCHAR LmPassword[MSV1_0_OWF_PASSWORD_LENGTH];
+  UCHAR NtPassword[MSV1_0_OWF_PASSWORD_LENGTH];
+} MSV1_0_SUPPLEMENTAL_CREDENTIAL, *PMSV1_0_SUPPLEMENTAL_CREDENTIAL;
+
+typedef struct _MSV1_0_NTLM3_RESPONSE {
+  UCHAR Response[MSV1_0_NTLM3_RESPONSE_LENGTH];
+  UCHAR RespType;
+  UCHAR HiRespType;
+  USHORT Flags;
+  ULONG MsgWord;
+  ULONGLONG TimeStamp;
+  UCHAR ChallengeFromClient[MSV1_0_CHALLENGE_LENGTH];
+  ULONG AvPairsOff;
+  UCHAR Buffer[1];
+} MSV1_0_NTLM3_RESPONSE, *PMSV1_0_NTLM3_RESPONSE;
+
+typedef enum _MSV1_0_AVID {
+  MsvAvEOL,
+  MsvAvNbComputerName,
+  MsvAvNbDomainName,
+  MsvAvDnsComputerName,
+  MsvAvDnsDomainName,
+#if (_WIN32_WINNT >= 0x0501)
+  MsvAvDnsTreeName,
+  MsvAvFlags,
+#if (_WIN32_WINNT >= 0x0600)
+  MsvAvTimestamp,
+  MsvAvRestrictions,
+  MsvAvTargetName,
+  MsvAvChannelBindings,
+#endif
+#endif
+} MSV1_0_AVID;
+
+typedef struct _MSV1_0_AV_PAIR {
+  USHORT AvId;
+  USHORT AvLen;
+} MSV1_0_AV_PAIR, *PMSV1_0_AV_PAIR;
+
+typedef enum _MSV1_0_PROTOCOL_MESSAGE_TYPE {
+  MsV1_0Lm20ChallengeRequest = 0,
+  MsV1_0Lm20GetChallengeResponse,
+  MsV1_0EnumerateUsers,
+  MsV1_0GetUserInfo,
+  MsV1_0ReLogonUsers,
+  MsV1_0ChangePassword,
+  MsV1_0ChangeCachedPassword,
+  MsV1_0GenericPassthrough,
+  MsV1_0CacheLogon,
+  MsV1_0SubAuth,
+  MsV1_0DeriveCredential,
+  MsV1_0CacheLookup,
+#if (_WIN32_WINNT >= 0x0501)
+  MsV1_0SetProcessOption,
+#endif
+#if (_WIN32_WINNT >= 0x0600)
+  MsV1_0ConfigLocalAliases,
+  MsV1_0ClearCachedCredentials,
+#endif
+} MSV1_0_PROTOCOL_MESSAGE_TYPE, *PMSV1_0_PROTOCOL_MESSAGE_TYPE;
+
+typedef struct _MSV1_0_LM20_CHALLENGE_REQUEST {
+  MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+} MSV1_0_LM20_CHALLENGE_REQUEST, *PMSV1_0_LM20_CHALLENGE_REQUEST;
+
+typedef struct _MSV1_0_LM20_CHALLENGE_RESPONSE {
+  MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+  UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+} MSV1_0_LM20_CHALLENGE_RESPONSE, *PMSV1_0_LM20_CHALLENGE_RESPONSE;
+
+typedef struct _MSV1_0_GETCHALLENRESP_REQUEST_V1 {
+  MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+  ULONG ParameterControl;
+  LUID LogonId;
+  UNICODE_STRING Password;
+  UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+} MSV1_0_GETCHALLENRESP_REQUEST_V1, *PMSV1_0_GETCHALLENRESP_REQUEST_V1;
+
+typedef struct _MSV1_0_GETCHALLENRESP_REQUEST {
+  MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+  ULONG ParameterControl;
+  LUID LogonId;
+  UNICODE_STRING Password;
+  UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+  UNICODE_STRING UserName;
+  UNICODE_STRING LogonDomainName;
+  UNICODE_STRING ServerName;
+} MSV1_0_GETCHALLENRESP_REQUEST, *PMSV1_0_GETCHALLENRESP_REQUEST;
+
+typedef struct _MSV1_0_GETCHALLENRESP_RESPONSE {
+  MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+  STRING CaseSensitiveChallengeResponse;
+  STRING CaseInsensitiveChallengeResponse;
+  UNICODE_STRING UserName;
+  UNICODE_STRING LogonDomainName;
+  UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH];
+  UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH];
+} MSV1_0_GETCHALLENRESP_RESPONSE, *PMSV1_0_GETCHALLENRESP_RESPONSE;
+
+typedef struct _MSV1_0_ENUMUSERS_REQUEST {
+  MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+} MSV1_0_ENUMUSERS_REQUEST, *PMSV1_0_ENUMUSERS_REQUEST;
+
+typedef struct _MSV1_0_ENUMUSERS_RESPONSE {
+  MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+  ULONG NumberOfLoggedOnUsers;
+  PLUID LogonIds;
+  PULONG EnumHandles;
+} MSV1_0_ENUMUSERS_RESPONSE, *PMSV1_0_ENUMUSERS_RESPONSE;
+
+typedef struct _MSV1_0_GETUSERINFO_REQUEST {
+  MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+  LUID LogonId;
+} MSV1_0_GETUSERINFO_REQUEST, *PMSV1_0_GETUSERINFO_REQUEST;
+
+typedef struct _MSV1_0_GETUSERINFO_RESPONSE {
+  MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+  PSID UserSid;
+  UNICODE_STRING UserName;
+  UNICODE_STRING LogonDomainName;
+  UNICODE_STRING LogonServer;
+  SECURITY_LOGON_TYPE LogonType;
+} MSV1_0_GETUSERINFO_RESPONSE, *PMSV1_0_GETUSERINFO_RESPONSE;
 
-typedef struct _VAD_HEADER {
-    PVOID       StartVPN;
-    PVOID       EndVPN;
-    struct _VAD_HEADER* ParentLink;
-    struct _VAD_HEADER* LeftLink;
-    struct _VAD_HEADER* RightLink;
-    ULONG       Flags;          /* LSB = CommitCharge */
-    PVOID       ControlArea;
-    PVOID       FirstProtoPte;
-    PVOID       LastPTE;
-    ULONG       Unknown;
-    LIST_ENTRY  Secured;
-} VAD_HEADER, *PVAD_HEADER;
+#define FILE_OPLOCK_BROKEN_TO_LEVEL_2   0x00000007
+#define FILE_OPLOCK_BROKEN_TO_NONE      0x00000008
+#define FILE_OPBATCH_BREAK_UNDERWAY     0x00000009
 
-typedef struct
-{
-  LARGE_INTEGER StartingLcn;
-  LARGE_INTEGER BitmapSize;
-  UCHAR Buffer[1];
-} VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
+/* also in winnt.h */
+#define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001
+#define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002
+#define FILE_NOTIFY_CHANGE_NAME         0x00000003
+#define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004
+#define FILE_NOTIFY_CHANGE_SIZE         0x00000008
+#define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010
+#define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020
+#define FILE_NOTIFY_CHANGE_CREATION     0x00000040
+#define FILE_NOTIFY_CHANGE_EA           0x00000080
+#define FILE_NOTIFY_CHANGE_SECURITY     0x00000100
+#define FILE_NOTIFY_CHANGE_STREAM_NAME  0x00000200
+#define FILE_NOTIFY_CHANGE_STREAM_SIZE  0x00000400
+#define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
+#define FILE_NOTIFY_VALID_MASK          0x00000fff
 
-#if (VER_PRODUCTBUILD >= 2600)
+#define FILE_ACTION_ADDED                   0x00000001
+#define FILE_ACTION_REMOVED                 0x00000002
+#define FILE_ACTION_MODIFIED                0x00000003
+#define FILE_ACTION_RENAMED_OLD_NAME        0x00000004
+#define FILE_ACTION_RENAMED_NEW_NAME        0x00000005
+#define FILE_ACTION_ADDED_STREAM            0x00000006
+#define FILE_ACTION_REMOVED_STREAM          0x00000007
+#define FILE_ACTION_MODIFIED_STREAM         0x00000008
+#define FILE_ACTION_REMOVED_BY_DELETE       0x00000009
+#define FILE_ACTION_ID_NOT_TUNNELLED        0x0000000A
+#define FILE_ACTION_TUNNELLED_ID_COLLISION  0x0000000B
+/* end  winnt.h */
 
-typedef BOOLEAN
-(NTAPI *PFILTER_REPORT_CHANGE) (
-    IN PVOID  NotifyContext,
-    IN PVOID  FilterContext
-);
+#define FILE_PIPE_BYTE_STREAM_TYPE      0x00000000
+#define FILE_PIPE_MESSAGE_TYPE          0x00000001
 
-typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
-    SyncTypeOther = 0,
-    SyncTypeCreateSection
-} FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
+#define FILE_PIPE_ACCEPT_REMOTE_CLIENTS     0x00000000
+#define FILE_PIPE_REJECT_REMOTE_CLIENTS     0x00000002
 
-typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
-    NotifyTypeCreate = 0,
-    NotifyTypeRetired
-} FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
+#define FILE_PIPE_ACCEPT_REMOTE_CLIENTS     0x00000000
+#define FILE_PIPE_REJECT_REMOTE_CLIENTS     0x00000002
+#define FILE_PIPE_TYPE_VALID_MASK           0x00000003
 
-typedef union _FS_FILTER_PARAMETERS {
-    struct {
-        PLARGE_INTEGER  EndingOffset;
-        PERESOURCE *ResourceToRelease;
-    } AcquireForModifiedPageWriter;
+#define FILE_PIPE_BYTE_STREAM_MODE      0x00000000
+#define FILE_PIPE_MESSAGE_MODE          0x00000001
 
-    struct {
-        PERESOURCE  ResourceToRelease;
-    } ReleaseForModifiedPageWriter;
+#define FILE_PIPE_QUEUE_OPERATION       0x00000000
+#define FILE_PIPE_COMPLETE_OPERATION    0x00000001
 
-    struct {
-        FS_FILTER_SECTION_SYNC_TYPE  SyncType;
-        ULONG  PageProtection;
-    } AcquireForSectionSynchronization;
+#define FILE_PIPE_INBOUND               0x00000000
+#define FILE_PIPE_OUTBOUND              0x00000001
+#define FILE_PIPE_FULL_DUPLEX           0x00000002
 
-    struct {
-        FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
-        BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
-    } NotifyStreamFileObject;
+#define FILE_PIPE_DISCONNECTED_STATE    0x00000001
+#define FILE_PIPE_LISTENING_STATE       0x00000002
+#define FILE_PIPE_CONNECTED_STATE       0x00000003
+#define FILE_PIPE_CLOSING_STATE         0x00000004
 
-    struct {
-        PVOID  Argument1;
-        PVOID  Argument2;
-        PVOID  Argument3;
-        PVOID  Argument4;
-        PVOID  Argument5;
-    } Others;
-} FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
+#define FILE_PIPE_CLIENT_END            0x00000000
+#define FILE_PIPE_SERVER_END            0x00000001
 
-typedef struct _FS_FILTER_CALLBACK_DATA {
-    ULONG                  SizeOfFsFilterCallbackData;
-    UCHAR                  Operation;
-    UCHAR                  Reserved;
-    struct _DEVICE_OBJECT  *DeviceObject;
-    struct _FILE_OBJECT    *FileObject;
-    FS_FILTER_PARAMETERS   Parameters;
-} FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
+#define FILE_CASE_SENSITIVE_SEARCH        0x00000001
+#define FILE_CASE_PRESERVED_NAMES         0x00000002
+#define FILE_UNICODE_ON_DISK              0x00000004
+#define FILE_PERSISTENT_ACLS              0x00000008
+#define FILE_FILE_COMPRESSION             0x00000010
+#define FILE_VOLUME_QUOTAS                0x00000020
+#define FILE_SUPPORTS_SPARSE_FILES        0x00000040
+#define FILE_SUPPORTS_REPARSE_POINTS      0x00000080
+#define FILE_SUPPORTS_REMOTE_STORAGE      0x00000100
+#define FILE_VOLUME_IS_COMPRESSED         0x00008000
+#define FILE_SUPPORTS_OBJECT_IDS          0x00010000
+#define FILE_SUPPORTS_ENCRYPTION          0x00020000
+#define FILE_NAMED_STREAMS                0x00040000
+#define FILE_READ_ONLY_VOLUME             0x00080000
+#define FILE_SEQUENTIAL_WRITE_ONCE        0x00100000
+#define FILE_SUPPORTS_TRANSACTIONS        0x00200000
+#define FILE_SUPPORTS_HARD_LINKS          0x00400000
+#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
+#define FILE_SUPPORTS_OPEN_BY_FILE_ID     0x01000000
+#define FILE_SUPPORTS_USN_JOURNAL         0x02000000
 
-typedef NTSTATUS
-(NTAPI *PFS_FILTER_CALLBACK) (
-    IN PFS_FILTER_CALLBACK_DATA  Data,
-    OUT PVOID                    *CompletionContext
-);
+#define FILE_NEED_EA                    0x00000080
 
-typedef VOID
-(NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
-    IN PFS_FILTER_CALLBACK_DATA  Data,
-    IN NTSTATUS                  OperationStatus,
-    IN PVOID                     CompletionContext
-);
+#define FILE_EA_TYPE_BINARY             0xfffe
+#define FILE_EA_TYPE_ASCII              0xfffd
+#define FILE_EA_TYPE_BITMAP             0xfffb
+#define FILE_EA_TYPE_METAFILE           0xfffa
+#define FILE_EA_TYPE_ICON               0xfff9
+#define FILE_EA_TYPE_EA                 0xffee
+#define FILE_EA_TYPE_MVMT               0xffdf
+#define FILE_EA_TYPE_MVST               0xffde
+#define FILE_EA_TYPE_ASN1               0xffdd
+#define FILE_EA_TYPE_FAMILY_IDS         0xff01
 
-typedef struct _FS_FILTER_CALLBACKS {
-    ULONG                           SizeOfFsFilterCallbacks;
-    ULONG                           Reserved;
-    PFS_FILTER_CALLBACK             PreAcquireForSectionSynchronization;
-    PFS_FILTER_COMPLETION_CALLBACK  PostAcquireForSectionSynchronization;
-    PFS_FILTER_CALLBACK             PreReleaseForSectionSynchronization;
-    PFS_FILTER_COMPLETION_CALLBACK  PostReleaseForSectionSynchronization;
-    PFS_FILTER_CALLBACK             PreAcquireForCcFlush;
-    PFS_FILTER_COMPLETION_CALLBACK  PostAcquireForCcFlush;
-    PFS_FILTER_CALLBACK             PreReleaseForCcFlush;
-    PFS_FILTER_COMPLETION_CALLBACK  PostReleaseForCcFlush;
-    PFS_FILTER_CALLBACK             PreAcquireForModifiedPageWriter;
-    PFS_FILTER_COMPLETION_CALLBACK  PostAcquireForModifiedPageWriter;
-    PFS_FILTER_CALLBACK             PreReleaseForModifiedPageWriter;
-    PFS_FILTER_COMPLETION_CALLBACK  PostReleaseForModifiedPageWriter;
-} FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
+typedef struct _FILE_NOTIFY_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG Action;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
 
-typedef struct _READ_LIST {
-    PFILE_OBJECT          FileObject;
-    ULONG                 NumberOfEntries;
-    LOGICAL               IsImage;
-    FILE_SEGMENT_ELEMENT  List[ANYSIZE_ARRAY];
-} READ_LIST, *PREAD_LIST;
+typedef struct _FILE_DIRECTORY_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG FileIndex;
+  LARGE_INTEGER CreationTime;
+  LARGE_INTEGER LastAccessTime;
+  LARGE_INTEGER LastWriteTime;
+  LARGE_INTEGER ChangeTime;
+  LARGE_INTEGER EndOfFile;
+  LARGE_INTEGER AllocationSize;
+  ULONG FileAttributes;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
 
-#endif
+typedef struct _FILE_FULL_DIR_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG FileIndex;
+  LARGE_INTEGER CreationTime;
+  LARGE_INTEGER LastAccessTime;
+  LARGE_INTEGER LastWriteTime;
+  LARGE_INTEGER ChangeTime;
+  LARGE_INTEGER EndOfFile;
+  LARGE_INTEGER AllocationSize;
+  ULONG FileAttributes;
+  ULONG FileNameLength;
+  ULONG EaSize;
+  WCHAR FileName[1];
+} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
 
-typedef NTSTATUS
-(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) (
-    IN PVOID  Base,
-    IN OUT PVOID  *CommitAddress,
-    IN OUT PSIZE_T  CommitSize
-);
+typedef struct _FILE_ID_FULL_DIR_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG FileIndex;
+  LARGE_INTEGER CreationTime;
+  LARGE_INTEGER LastAccessTime;
+  LARGE_INTEGER LastWriteTime;
+  LARGE_INTEGER ChangeTime;
+  LARGE_INTEGER EndOfFile;
+  LARGE_INTEGER AllocationSize;
+  ULONG FileAttributes;
+  ULONG FileNameLength;
+  ULONG EaSize;
+  LARGE_INTEGER FileId;
+  WCHAR FileName[1];
+} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
 
-typedef struct _RTL_HEAP_PARAMETERS {
-    ULONG                     Length;
-    SIZE_T                    SegmentReserve;
-    SIZE_T                    SegmentCommit;
-    SIZE_T                    DeCommitFreeBlockThreshold;
-    SIZE_T                    DeCommitTotalFreeThreshold;
-    SIZE_T                    MaximumAllocationSize;
-    SIZE_T                    VirtualMemoryThreshold;
-    SIZE_T                    InitialCommit;
-    SIZE_T                    InitialReserve;
-    PRTL_HEAP_COMMIT_ROUTINE  CommitRoutine;
-    SIZE_T                    Reserved[2];
-} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
+typedef struct _FILE_BOTH_DIR_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG FileIndex;
+  LARGE_INTEGER CreationTime;
+  LARGE_INTEGER LastAccessTime;
+  LARGE_INTEGER LastWriteTime;
+  LARGE_INTEGER ChangeTime;
+  LARGE_INTEGER EndOfFile;
+  LARGE_INTEGER AllocationSize;
+  ULONG FileAttributes;
+  ULONG FileNameLength;
+  ULONG EaSize;
+  CCHAR ShortNameLength;
+  WCHAR ShortName[12];
+  WCHAR FileName[1];
+} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-CcCanIWrite (
-    IN PFILE_OBJECT FileObject,
-    IN ULONG        BytesToWrite,
-    IN BOOLEAN      Wait,
-    IN BOOLEAN      Retrying
-);
+typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG FileIndex;
+  LARGE_INTEGER CreationTime;
+  LARGE_INTEGER LastAccessTime;
+  LARGE_INTEGER LastWriteTime;
+  LARGE_INTEGER ChangeTime;
+  LARGE_INTEGER EndOfFile;
+  LARGE_INTEGER AllocationSize;
+  ULONG FileAttributes;
+  ULONG FileNameLength;
+  ULONG EaSize;
+  CCHAR ShortNameLength;
+  WCHAR ShortName[12];
+  LARGE_INTEGER FileId;
+  WCHAR FileName[1];
+} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-CcCopyRead (
-    IN PFILE_OBJECT         FileObject,
-    IN PLARGE_INTEGER       FileOffset,
-    IN ULONG                Length,
-    IN BOOLEAN              Wait,
-    OUT PVOID               Buffer,
-    OUT PIO_STATUS_BLOCK    IoStatus
-);
+typedef struct _FILE_NAMES_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG FileIndex;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-CcCopyWrite (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN ULONG            Length,
-    IN BOOLEAN          Wait,
-    IN PVOID            Buffer
-);
+typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG FileIndex;
+  LARGE_INTEGER CreationTime;
+  LARGE_INTEGER LastAccessTime;
+  LARGE_INTEGER LastWriteTime;
+  LARGE_INTEGER ChangeTime;
+  LARGE_INTEGER EndOfFile;
+  LARGE_INTEGER AllocationSize;
+  ULONG FileAttributes;
+  ULONG FileNameLength;
+  LARGE_INTEGER FileId;
+  GUID LockingTransactionId;
+  ULONG TxInfoFlags;
+  WCHAR FileName[1];
+} FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;
+
+#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED         0x00000001
+#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX       0x00000002
+#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX  0x00000004
 
-#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000)
+typedef struct _FILE_OBJECTID_INFORMATION {
+  LONGLONG FileReference;
+  UCHAR ObjectId[16];
+  _ANONYMOUS_UNION union {
+    __GNU_EXTENSION struct {
+      UCHAR BirthVolumeId[16];
+      UCHAR BirthObjectId[16];
+      UCHAR DomainId[16];
+    };
+    UCHAR ExtendedInfo[48];
+  } DUMMYUNIONNAME;
+} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
 
-typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) (
-    IN PVOID Context1,
-    IN PVOID Context2
-);
+#define ANSI_DOS_STAR                   ('<')
+#define ANSI_DOS_QM                     ('>')
+#define ANSI_DOS_DOT                    ('"')
 
-NTKERNELAPI
-VOID
-NTAPI
-CcDeferWrite (
-    IN PFILE_OBJECT             FileObject,
-    IN PCC_POST_DEFERRED_WRITE  PostRoutine,
-    IN PVOID                    Context1,
-    IN PVOID                    Context2,
-    IN ULONG                    BytesToWrite,
-    IN BOOLEAN                  Retrying
-);
+#define DOS_STAR                        (L'<')
+#define DOS_QM                          (L'>')
+#define DOS_DOT                         (L'"')
 
-NTKERNELAPI
-VOID
-NTAPI
-CcFastCopyRead (
-    IN PFILE_OBJECT         FileObject,
-    IN ULONG                FileOffset,
-    IN ULONG                Length,
-    IN ULONG                PageCount,
-    OUT PVOID               Buffer,
-    OUT PIO_STATUS_BLOCK    IoStatus
-);
+typedef struct _FILE_INTERNAL_INFORMATION {
+  LARGE_INTEGER IndexNumber;
+} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
 
-NTKERNELAPI
-VOID
-NTAPI
-CcFastCopyWrite (
-    IN PFILE_OBJECT FileObject,
-    IN ULONG        FileOffset,
-    IN ULONG        Length,
-    IN PVOID        Buffer
-);
+typedef struct _FILE_EA_INFORMATION {
+  ULONG EaSize;
+} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
 
-NTKERNELAPI
-VOID
-NTAPI
-CcFlushCache (
-    IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
-    IN PLARGE_INTEGER           FileOffset OPTIONAL,
-    IN ULONG                    Length,
-    OUT PIO_STATUS_BLOCK        IoStatus OPTIONAL
-);
+typedef struct _FILE_ACCESS_INFORMATION {
+  ACCESS_MASK AccessFlags;
+} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
 
-typedef VOID (NTAPI *PDIRTY_PAGE_ROUTINE) (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN ULONG            Length,
-    IN PLARGE_INTEGER   OldestLsn,
-    IN PLARGE_INTEGER   NewestLsn,
-    IN PVOID            Context1,
-    IN PVOID            Context2
-);
+typedef struct _FILE_MODE_INFORMATION {
+  ULONG Mode;
+} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
 
-NTKERNELAPI
-LARGE_INTEGER
-NTAPI
-CcGetDirtyPages (
-    IN PVOID                LogHandle,
-    IN PDIRTY_PAGE_ROUTINE  DirtyPageRoutine,
-    IN PVOID                Context1,
-    IN PVOID                Context2
-);
+typedef struct _FILE_ALL_INFORMATION {
+  FILE_BASIC_INFORMATION BasicInformation;
+  FILE_STANDARD_INFORMATION StandardInformation;
+  FILE_INTERNAL_INFORMATION InternalInformation;
+  FILE_EA_INFORMATION EaInformation;
+  FILE_ACCESS_INFORMATION AccessInformation;
+  FILE_POSITION_INFORMATION PositionInformation;
+  FILE_MODE_INFORMATION ModeInformation;
+  FILE_ALIGNMENT_INFORMATION AlignmentInformation;
+  FILE_NAME_INFORMATION NameInformation;
+} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
 
-NTKERNELAPI
-PFILE_OBJECT
-NTAPI
-CcGetFileObjectFromBcb (
-    IN PVOID Bcb
-);
+typedef struct _FILE_ALLOCATION_INFORMATION {
+  LARGE_INTEGER AllocationSize;
+} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
 
-NTKERNELAPI
-PFILE_OBJECT
-NTAPI
-CcGetFileObjectFromSectionPtrs (
-    IN PSECTION_OBJECT_POINTERS SectionObjectPointer
-);
+typedef struct _FILE_COMPRESSION_INFORMATION {
+  LARGE_INTEGER CompressedFileSize;
+  USHORT CompressionFormat;
+  UCHAR CompressionUnitShift;
+  UCHAR ChunkShift;
+  UCHAR ClusterShift;
+  UCHAR Reserved[3];
+} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
 
-#define CcGetFileSizePointer(FO) (                                     \
-    ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \
-)
+typedef struct _FILE_LINK_INFORMATION {
+  BOOLEAN ReplaceIfExists;
+  HANDLE RootDirectory;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
 
-#if (VER_PRODUCTBUILD >= 2195)
-
-NTKERNELAPI
-LARGE_INTEGER
-NTAPI
-CcGetFlushedValidData (
-    IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
-    IN BOOLEAN                  BcbListHeld
-);
-
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+typedef struct _FILE_MOVE_CLUSTER_INFORMATION {
+  ULONG ClusterCount;
+  HANDLE RootDirectory;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
 
-NTKERNELAPI
-LARGE_INTEGER
-NTAPI
-CcGetLsnForFileObject (
-    IN PFILE_OBJECT     FileObject,
-    OUT PLARGE_INTEGER  OldestLsn OPTIONAL
-);
+typedef struct _FILE_RENAME_INFORMATION {
+  BOOLEAN ReplaceIfExists;
+  HANDLE RootDirectory;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
 
-typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) (
-    IN PVOID    Context,
-    IN BOOLEAN  Wait
-);
+typedef struct _FILE_STREAM_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG StreamNameLength;
+  LARGE_INTEGER StreamSize;
+  LARGE_INTEGER StreamAllocationSize;
+  WCHAR StreamName[1];
+} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
 
-typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) (
-    IN PVOID Context
-);
+typedef struct _FILE_TRACKING_INFORMATION {
+  HANDLE DestinationFile;
+  ULONG ObjectInformationLength;
+  CHAR ObjectInformation[1];
+} FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
 
-typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) (
-    IN PVOID    Context,
-    IN BOOLEAN  Wait
-);
+typedef struct _FILE_COMPLETION_INFORMATION {
+  HANDLE Port;
+  PVOID Key;
+} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
 
-typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) (
-    IN PVOID Context
-);
+typedef struct _FILE_PIPE_INFORMATION {
+  ULONG ReadMode;
+  ULONG CompletionMode;
+} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
 
-typedef struct _CACHE_MANAGER_CALLBACKS {
-    PACQUIRE_FOR_LAZY_WRITE     AcquireForLazyWrite;
-    PRELEASE_FROM_LAZY_WRITE    ReleaseFromLazyWrite;
-    PACQUIRE_FOR_READ_AHEAD     AcquireForReadAhead;
-    PRELEASE_FROM_READ_AHEAD    ReleaseFromReadAhead;
-} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS;
+typedef struct _FILE_PIPE_LOCAL_INFORMATION {
+  ULONG NamedPipeType;
+  ULONG NamedPipeConfiguration;
+  ULONG MaximumInstances;
+  ULONG CurrentInstances;
+  ULONG InboundQuota;
+  ULONG ReadDataAvailable;
+  ULONG OutboundQuota;
+  ULONG WriteQuotaAvailable;
+  ULONG NamedPipeState;
+  ULONG NamedPipeEnd;
+} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
 
-NTKERNELAPI
-VOID
-NTAPI
-CcInitializeCacheMap (
-    IN PFILE_OBJECT             FileObject,
-    IN PCC_FILE_SIZES           FileSizes,
-    IN BOOLEAN                  PinAccess,
-    IN PCACHE_MANAGER_CALLBACKS Callbacks,
-    IN PVOID                    LazyWriteContext
-);
+typedef struct _FILE_PIPE_REMOTE_INFORMATION {
+  LARGE_INTEGER CollectDataTime;
+  ULONG MaximumCollectionCount;
+} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
 
-#define CcIsFileCached(FO) (                                                         \
-    ((FO)->SectionObjectPointer != NULL) &&                                          \
-    (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \
-)
+typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
+  ULONG MaximumMessageSize;
+  ULONG MailslotQuota;
+  ULONG NextMessageSize;
+  ULONG MessagesAvailable;
+  LARGE_INTEGER ReadTimeout;
+} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
 
-extern ULONG CcFastMdlReadWait;
+typedef struct _FILE_MAILSLOT_SET_INFORMATION {
+  PLARGE_INTEGER ReadTimeout;
+} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-CcIsThereDirtyData (
-    IN PVPB Vpb
-);
+typedef struct _FILE_REPARSE_POINT_INFORMATION {
+  LONGLONG FileReference;
+  ULONG Tag;
+} FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-CcMapData (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN ULONG            Length,
-    IN ULONG            Flags,
-    OUT PVOID           *Bcb,
-    OUT PVOID           *Buffer
-);
+typedef struct _FILE_LINK_ENTRY_INFORMATION {
+  ULONG NextEntryOffset;
+  LONGLONG ParentFileId;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;
+
+typedef struct _FILE_LINKS_INFORMATION {
+  ULONG BytesNeeded;
+  ULONG EntriesReturned;
+  FILE_LINK_ENTRY_INFORMATION Entry;
+} FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION;
+
+typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
+
+typedef struct _FILE_STANDARD_LINK_INFORMATION {
+  ULONG NumberOfAccessibleLinks;
+  ULONG TotalNumberOfLinks;
+  BOOLEAN DeletePending;
+  BOOLEAN Directory;
+} FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION;
 
-NTKERNELAPI
-VOID
-NTAPI
-CcMdlRead (
-    IN PFILE_OBJECT         FileObject,
-    IN PLARGE_INTEGER       FileOffset,
-    IN ULONG                Length,
-    OUT PMDL                *MdlChain,
-    OUT PIO_STATUS_BLOCK    IoStatus
-);
+typedef struct _FILE_GET_EA_INFORMATION {
+  ULONG NextEntryOffset;
+  UCHAR EaNameLength;
+  CHAR  EaName[1];
+} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
 
-NTKERNELAPI
-VOID
-NTAPI
-CcMdlReadComplete (
-    IN PFILE_OBJECT FileObject,
-    IN PMDL         MdlChain
-);
+#define REMOTE_PROTOCOL_FLAG_LOOPBACK       0x00000001
+#define REMOTE_PROTOCOL_FLAG_OFFLINE        0x00000002
+
+typedef struct _FILE_REMOTE_PROTOCOL_INFORMATION {
+  USHORT StructureVersion;
+  USHORT StructureSize;
+  ULONG  Protocol;
+  USHORT ProtocolMajorVersion;
+  USHORT ProtocolMinorVersion;
+  USHORT ProtocolRevision;
+  USHORT Reserved;
+  ULONG  Flags;
+  struct {
+    ULONG Reserved[8];
+  } GenericReserved;
+  struct {
+    ULONG Reserved[16];
+  } ProtocolSpecificReserved;
+} FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION;
 
-NTKERNELAPI
-VOID
-NTAPI
-CcMdlWriteComplete (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN PMDL             MdlChain
-);
+typedef struct _FILE_GET_QUOTA_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG SidLength;
+  SID Sid;
+} FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
 
-#define MAP_WAIT        1
+typedef struct _FILE_QUOTA_INFORMATION {
+  ULONG NextEntryOffset;
+  ULONG SidLength;
+  LARGE_INTEGER ChangeTime;
+  LARGE_INTEGER QuotaUsed;
+  LARGE_INTEGER QuotaThreshold;
+  LARGE_INTEGER QuotaLimit;
+  SID Sid;
+} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-CcPinMappedData (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN ULONG            Length,
-    IN ULONG            Flags,
-    IN OUT PVOID        *Bcb
-);
+typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
+  ULONG FileSystemAttributes;
+  ULONG MaximumComponentNameLength;
+  ULONG FileSystemNameLength;
+  WCHAR FileSystemName[1];
+} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-CcPinRead (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN ULONG            Length,
-    IN ULONG            Flags,
-    OUT PVOID           *Bcb,
-    OUT PVOID           *Buffer
-);
+typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
+  BOOLEAN DriverInPath;
+  ULONG DriverNameLength;
+  WCHAR DriverName[1];
+} FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
 
-NTKERNELAPI
-VOID
-NTAPI
-CcPrepareMdlWrite (
-    IN PFILE_OBJECT         FileObject,
-    IN PLARGE_INTEGER       FileOffset,
-    IN ULONG                Length,
-    OUT PMDL                *MdlChain,
-    OUT PIO_STATUS_BLOCK    IoStatus
-);
+typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
+  ULONG Flags;
+} FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-CcPreparePinWrite (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN ULONG            Length,
-    IN BOOLEAN          Zero,
-    IN ULONG            Flags,
-    OUT PVOID           *Bcb,
-    OUT PVOID           *Buffer
-);
+#define FILE_VC_QUOTA_NONE              0x00000000
+#define FILE_VC_QUOTA_TRACK             0x00000001
+#define FILE_VC_QUOTA_ENFORCE           0x00000002
+#define FILE_VC_QUOTA_MASK              0x00000003
+#define FILE_VC_CONTENT_INDEX_DISABLED  0x00000008
+#define FILE_VC_LOG_QUOTA_THRESHOLD     0x00000010
+#define FILE_VC_LOG_QUOTA_LIMIT         0x00000020
+#define FILE_VC_LOG_VOLUME_THRESHOLD    0x00000040
+#define FILE_VC_LOG_VOLUME_LIMIT        0x00000080
+#define FILE_VC_QUOTAS_INCOMPLETE       0x00000100
+#define FILE_VC_QUOTAS_REBUILDING       0x00000200
+#define FILE_VC_VALID_MASK              0x000003ff
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-CcPurgeCacheSection (
-    IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
-    IN PLARGE_INTEGER           FileOffset OPTIONAL,
-    IN ULONG                    Length,
-    IN BOOLEAN                  UninitializeCacheMaps
-);
+typedef struct _FILE_FS_CONTROL_INFORMATION {
+  LARGE_INTEGER FreeSpaceStartFiltering;
+  LARGE_INTEGER FreeSpaceThreshold;
+  LARGE_INTEGER FreeSpaceStopFiltering;
+  LARGE_INTEGER DefaultQuotaThreshold;
+  LARGE_INTEGER DefaultQuotaLimit;
+  ULONG FileSystemControlFlags;
+} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
 
-#define CcReadAhead(FO, FOFF, LEN) (                \
-    if ((LEN) >= 256) {                             \
-        CcScheduleReadAhead((FO), (FOFF), (LEN));   \
-    }                                               \
-)
+#ifndef _FILESYSTEMFSCTL_
+#define _FILESYSTEMFSCTL_
 
-#if (VER_PRODUCTBUILD >= 2195)
+#define FSCTL_REQUEST_OPLOCK_LEVEL_1    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_REQUEST_OPLOCK_LEVEL_2    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_REQUEST_BATCH_OPLOCK      CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_OPLOCK_BREAK_NOTIFY       CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_UNLOCK_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DISMOUNT_VOLUME           CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_VOLUME_MOUNTED         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_PATHNAME_VALID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_MARK_VOLUME_DIRTY         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_RETRIEVAL_POINTERS  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER,  FILE_ANY_ACCESS)
+#define FSCTL_GET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_SET_BOOTLOADER_ACCESSED   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER,  FILE_ANY_ACCESS)
 
-NTKERNELAPI
-PVOID
-NTAPI
-CcRemapBcb (
-    IN PVOID Bcb
-);
+#define FSCTL_OPLOCK_BREAK_ACK_NO_2     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_INVALIDATE_VOLUMES        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_FAT_BPB             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_REQUEST_FILTER_OPLOCK     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+#if (_WIN32_WINNT >= 0x0400)
 
-NTKERNELAPI
-VOID
-NTAPI
-CcRepinBcb (
-    IN PVOID Bcb
-);
+#define FSCTL_GET_NTFS_VOLUME_DATA      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_NTFS_FILE_RECORD      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_VOLUME_BITMAP         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER,  FILE_ANY_ACCESS)
+#define FSCTL_GET_RETRIEVAL_POINTERS    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER,  FILE_ANY_ACCESS)
+#define FSCTL_MOVE_FILE                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_VOLUME_DIRTY           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_ALLOW_EXTENDED_DASD_IO    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER,  FILE_ANY_ACCESS)
 
-NTKERNELAPI
-VOID
-NTAPI
-CcScheduleReadAhead (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN ULONG            Length
-);
+#endif
 
-NTKERNELAPI
-VOID
-NTAPI
-CcSetAdditionalCacheAttributes (
-    IN PFILE_OBJECT FileObject,
-    IN BOOLEAN      DisableReadAhead,
-    IN BOOLEAN      DisableWriteBehind
-);
+#if (_WIN32_WINNT >= 0x0500)
 
-NTKERNELAPI
-VOID
-NTAPI
-CcSetBcbOwnerPointer (
-    IN PVOID Bcb,
-    IN PVOID OwnerPointer
-);
+#define FSCTL_FIND_FILES_BY_SID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER,  FILE_ANY_ACCESS)
+#define FSCTL_SET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_GET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DELETE_OBJECT_ID          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_GET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DELETE_REPARSE_POINT      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_ENUM_USN_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER,  FILE_READ_DATA)
+#define FSCTL_SECURITY_ID_CHECK         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER,  FILE_READ_DATA)
+#define FSCTL_READ_USN_JOURNAL          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER,  FILE_READ_DATA)
+#define FSCTL_SET_OBJECT_ID_EXTENDED    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_CREATE_OR_GET_OBJECT_ID   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SET_SPARSE                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_ZERO_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_QUERY_ALLOCATED_RANGES    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER,  FILE_READ_DATA)
+#define FSCTL_ENABLE_UPGRADE            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_ENCRYPTION            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_ENCRYPTION_FSCTL_IO       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER,  FILE_ANY_ACCESS)
+#define FSCTL_WRITE_RAW_ENCRYPTED       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER,  FILE_ANY_ACCESS)
+#define FSCTL_READ_RAW_ENCRYPTED        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER,  FILE_ANY_ACCESS)
+#define FSCTL_CREATE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER,  FILE_READ_DATA)
+#define FSCTL_READ_FILE_USN_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER,  FILE_READ_DATA)
+#define FSCTL_WRITE_USN_CLOSE_RECORD    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER,  FILE_READ_DATA)
+#define FSCTL_EXTEND_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_USN_JOURNAL         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DELETE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_MARK_HANDLE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SIS_COPYFILE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SIS_LINK_FILES            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_RECALL_FILE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_READ_FROM_PLEX            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
+#define FSCTL_FILE_PREFETCH             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define FSCTL_MAKE_MEDIA_COMPATIBLE         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_DEFECT_MANAGEMENT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_QUERY_SPARING_INFO            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_ON_DISK_VOLUME_INFO     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SET_VOLUME_COMPRESSION_STATE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#define FSCTL_TXFS_MODIFY_RM                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 81, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_QUERY_RM_INFORMATION     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 82, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_ROLLFORWARD_REDO         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 84, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_ROLLFORWARD_UNDO         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 85, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_START_RM                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 86, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_SHUTDOWN_RM              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_READ_BACKUP_INFORMATION  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 88, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 89, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_CREATE_SECONDARY_RM      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 90, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_GET_METADATA_INFO        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 91, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_GET_TRANSACTED_VERSION   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 92, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_SAVEPOINT_INFORMATION    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 94, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_CREATE_MINIVERSION       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_TRANSACTION_ACTIVE       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 99, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_SET_ZERO_ON_DEALLOCATION      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#define FSCTL_SET_REPAIR                    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_REPAIR                    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_WAIT_FOR_REPAIR               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_INITIATE_REPAIR               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_CSC_INTERNAL                  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER,  FILE_ANY_ACCESS)
+#define FSCTL_SHRINK_VOLUME                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#define FSCTL_SET_SHORT_NAME_BEHAVIOR       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DFSR_SET_GHOST_HANDLE_STATE   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES \
+                                            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_LIST_TRANSACTIONS        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_QUERY_PAGEFILE_ENCRYPTION     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0601)
+
+#define FSCTL_QUERY_DEPENDENT_VOLUME        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 124, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SD_GLOBAL_CHANGE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 125, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_LOOKUP_STREAM_FROM_CLUSTER    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 127, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 128, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_FILE_TYPE_NOTIFICATION        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 129, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_BOOT_AREA_INFO            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 140, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_RETRIEVAL_POINTER_BASE    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SET_PERSISTENT_VOLUME_STATE   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define FSCTL_REQUEST_OPLOCK                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define FSCTL_CSV_TUNNEL_REQUEST            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_CSV_FILE                   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 147, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_CSV_GET_VOLUME_PATH_NAME      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 148, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150,  METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_FILE_ON_CSV_VOLUME         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151,  METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _CSV_NAMESPACE_INFO {
+  ULONG Version;
+  ULONG DeviceNumber;
+  LARGE_INTEGER StartingOffset;
+  ULONG SectorSize;
+} CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO;
+
+#define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO))
+#define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF
+
+#endif
+
+#define FSCTL_MARK_AS_SYSTEM_HIVE           FSCTL_SET_BOOTLOADER_ACCESSED
+
+typedef struct _PATHNAME_BUFFER {
+  ULONG PathNameLength;
+  WCHAR Name[1];
+} PATHNAME_BUFFER, *PPATHNAME_BUFFER;
+
+typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
+  UCHAR First0x24BytesOfBootSector[0x24];
+} FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
+
+#if (_WIN32_WINNT >= 0x0400)
+
+typedef struct _NTFS_VOLUME_DATA_BUFFER {
+  LARGE_INTEGER VolumeSerialNumber;
+  LARGE_INTEGER NumberSectors;
+  LARGE_INTEGER TotalClusters;
+  LARGE_INTEGER FreeClusters;
+  LARGE_INTEGER TotalReserved;
+  ULONG BytesPerSector;
+  ULONG BytesPerCluster;
+  ULONG BytesPerFileRecordSegment;
+  ULONG ClustersPerFileRecordSegment;
+  LARGE_INTEGER MftValidDataLength;
+  LARGE_INTEGER MftStartLcn;
+  LARGE_INTEGER Mft2StartLcn;
+  LARGE_INTEGER MftZoneStart;
+  LARGE_INTEGER MftZoneEnd;
+} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
+
+typedef struct _NTFS_EXTENDED_VOLUME_DATA {
+  ULONG ByteCount;
+  USHORT MajorVersion;
+  USHORT MinorVersion;
+} NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
+
+typedef struct _STARTING_LCN_INPUT_BUFFER {
+  LARGE_INTEGER StartingLcn;
+} STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
+
+typedef struct _VOLUME_BITMAP_BUFFER {
+  LARGE_INTEGER StartingLcn;
+  LARGE_INTEGER BitmapSize;
+  UCHAR Buffer[1];
+} VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
+
+typedef struct _STARTING_VCN_INPUT_BUFFER {
+  LARGE_INTEGER StartingVcn;
+} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
+
+typedef struct _RETRIEVAL_POINTERS_BUFFER {
+  ULONG ExtentCount;
+  LARGE_INTEGER StartingVcn;
+  struct {
+    LARGE_INTEGER NextVcn;
+    LARGE_INTEGER Lcn;
+  } Extents[1];
+} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
+
+typedef struct _NTFS_FILE_RECORD_INPUT_BUFFER {
+  LARGE_INTEGER FileReferenceNumber;
+} NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
+
+typedef struct _NTFS_FILE_RECORD_OUTPUT_BUFFER {
+  LARGE_INTEGER FileReferenceNumber;
+  ULONG FileRecordLength;
+  UCHAR FileRecordBuffer[1];
+} NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
+
+typedef struct _MOVE_FILE_DATA {
+  HANDLE FileHandle;
+  LARGE_INTEGER StartingVcn;
+  LARGE_INTEGER StartingLcn;
+  ULONG ClusterCount;
+} MOVE_FILE_DATA, *PMOVE_FILE_DATA;
+
+typedef struct _MOVE_FILE_RECORD_DATA {
+  HANDLE FileHandle;
+  LARGE_INTEGER SourceFileRecord;
+  LARGE_INTEGER TargetFileRecord;
+} MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA;
+
+#if defined(_WIN64)
+typedef struct _MOVE_FILE_DATA32 {
+  UINT32 FileHandle;
+  LARGE_INTEGER StartingVcn;
+  LARGE_INTEGER StartingLcn;
+  ULONG ClusterCount;
+} MOVE_FILE_DATA32, *PMOVE_FILE_DATA32;
+#endif
+
+#endif /* (_WIN32_WINNT >= 0x0400) */
+
+#if (_WIN32_WINNT >= 0x0500)
+
+typedef struct _FIND_BY_SID_DATA {
+  ULONG Restart;
+  SID Sid;
+} FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
+
+typedef struct _FIND_BY_SID_OUTPUT {
+  ULONG NextEntryOffset;
+  ULONG FileIndex;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
+
+typedef struct _MFT_ENUM_DATA {
+  ULONGLONG StartFileReferenceNumber;
+  USN LowUsn;
+  USN HighUsn;
+} MFT_ENUM_DATA, *PMFT_ENUM_DATA;
+
+typedef struct _CREATE_USN_JOURNAL_DATA {
+  ULONGLONG MaximumSize;
+  ULONGLONG AllocationDelta;
+} CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
+
+typedef struct _READ_USN_JOURNAL_DATA {
+  USN StartUsn;
+  ULONG ReasonMask;
+  ULONG ReturnOnlyOnClose;
+  ULONGLONG Timeout;
+  ULONGLONG BytesToWaitFor;
+  ULONGLONG UsnJournalID;
+} READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
+
+typedef struct _USN_RECORD {
+  ULONG RecordLength;
+  USHORT MajorVersion;
+  USHORT MinorVersion;
+  ULONGLONG FileReferenceNumber;
+  ULONGLONG ParentFileReferenceNumber;
+  USN Usn;
+  LARGE_INTEGER TimeStamp;
+  ULONG Reason;
+  ULONG SourceInfo;
+  ULONG SecurityId;
+  ULONG FileAttributes;
+  USHORT FileNameLength;
+  USHORT FileNameOffset;
+  WCHAR FileName[1];
+} USN_RECORD, *PUSN_RECORD;
+
+#define USN_PAGE_SIZE                    (0x1000)
+
+#define USN_REASON_DATA_OVERWRITE        (0x00000001)
+#define USN_REASON_DATA_EXTEND           (0x00000002)
+#define USN_REASON_DATA_TRUNCATION       (0x00000004)
+#define USN_REASON_NAMED_DATA_OVERWRITE  (0x00000010)
+#define USN_REASON_NAMED_DATA_EXTEND     (0x00000020)
+#define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
+#define USN_REASON_FILE_CREATE           (0x00000100)
+#define USN_REASON_FILE_DELETE           (0x00000200)
+#define USN_REASON_EA_CHANGE             (0x00000400)
+#define USN_REASON_SECURITY_CHANGE       (0x00000800)
+#define USN_REASON_RENAME_OLD_NAME       (0x00001000)
+#define USN_REASON_RENAME_NEW_NAME       (0x00002000)
+#define USN_REASON_INDEXABLE_CHANGE      (0x00004000)
+#define USN_REASON_BASIC_INFO_CHANGE     (0x00008000)
+#define USN_REASON_HARD_LINK_CHANGE      (0x00010000)
+#define USN_REASON_COMPRESSION_CHANGE    (0x00020000)
+#define USN_REASON_ENCRYPTION_CHANGE     (0x00040000)
+#define USN_REASON_OBJECT_ID_CHANGE      (0x00080000)
+#define USN_REASON_REPARSE_POINT_CHANGE  (0x00100000)
+#define USN_REASON_STREAM_CHANGE         (0x00200000)
+#define USN_REASON_TRANSACTED_CHANGE     (0x00400000)
+#define USN_REASON_CLOSE                 (0x80000000)
+
+typedef struct _USN_JOURNAL_DATA {
+  ULONGLONG UsnJournalID;
+  USN FirstUsn;
+  USN NextUsn;
+  USN LowestValidUsn;
+  USN MaxUsn;
+  ULONGLONG MaximumSize;
+  ULONGLONG AllocationDelta;
+} USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
+
+typedef struct _DELETE_USN_JOURNAL_DATA {
+  ULONGLONG UsnJournalID;
+  ULONG DeleteFlags;
+} DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
+
+#define USN_DELETE_FLAG_DELETE              (0x00000001)
+#define USN_DELETE_FLAG_NOTIFY              (0x00000002)
+#define USN_DELETE_VALID_FLAGS              (0x00000003)
+
+typedef struct _MARK_HANDLE_INFO {
+  ULONG UsnSourceInfo;
+  HANDLE VolumeHandle;
+  ULONG HandleInfo;
+} MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
+
+#if defined(_WIN64)
+typedef struct _MARK_HANDLE_INFO32 {
+  ULONG UsnSourceInfo;
+  UINT32 VolumeHandle;
+  ULONG HandleInfo;
+} MARK_HANDLE_INFO32, *PMARK_HANDLE_INFO32;
+#endif
+
+#define USN_SOURCE_DATA_MANAGEMENT          (0x00000001)
+#define USN_SOURCE_AUXILIARY_DATA           (0x00000002)
+#define USN_SOURCE_REPLICATION_MANAGEMENT   (0x00000004)
+
+#define MARK_HANDLE_PROTECT_CLUSTERS        (0x00000001)
+#define MARK_HANDLE_TXF_SYSTEM_LOG          (0x00000004)
+#define MARK_HANDLE_NOT_TXF_SYSTEM_LOG      (0x00000008)
+
+typedef struct _BULK_SECURITY_TEST_DATA {
+  ACCESS_MASK DesiredAccess;
+  ULONG SecurityIds[1];
+} BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
+
+#define VOLUME_IS_DIRTY                  (0x00000001)
+#define VOLUME_UPGRADE_SCHEDULED         (0x00000002)
+#define VOLUME_SESSION_OPEN              (0x00000004)
+
+typedef struct _FILE_PREFETCH {
+  ULONG Type;
+  ULONG Count;
+  ULONGLONG Prefetch[1];
+} FILE_PREFETCH, *PFILE_PREFETCH;
+
+typedef struct _FILE_PREFETCH_EX {
+  ULONG Type;
+  ULONG Count;
+  PVOID Context;
+  ULONGLONG Prefetch[1];
+} FILE_PREFETCH_EX, *PFILE_PREFETCH_EX;
+
+#define FILE_PREFETCH_TYPE_FOR_CREATE       0x1
+#define FILE_PREFETCH_TYPE_FOR_DIRENUM      0x2
+#define FILE_PREFETCH_TYPE_FOR_CREATE_EX    0x3
+#define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX   0x4
+
+#define FILE_PREFETCH_TYPE_MAX              0x4
+
+typedef struct _FILE_OBJECTID_BUFFER {
+  UCHAR ObjectId[16];
+  union {
+    struct {
+      UCHAR BirthVolumeId[16];
+      UCHAR BirthObjectId[16];
+      UCHAR DomainId[16];
+    } DUMMYSTRUCTNAME;
+    UCHAR ExtendedInfo[48];
+  } DUMMYUNIONNAME;
+} FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
+
+typedef struct _FILE_SET_SPARSE_BUFFER {
+  BOOLEAN SetSparse;
+} FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
+
+typedef struct _FILE_ZERO_DATA_INFORMATION {
+  LARGE_INTEGER FileOffset;
+  LARGE_INTEGER BeyondFinalZero;
+} FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
+
+typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
+  LARGE_INTEGER FileOffset;
+  LARGE_INTEGER Length;
+} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
+
+typedef struct _ENCRYPTION_BUFFER {
+  ULONG EncryptionOperation;
+  UCHAR Private[1];
+} ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
+
+#define FILE_SET_ENCRYPTION         0x00000001
+#define FILE_CLEAR_ENCRYPTION       0x00000002
+#define STREAM_SET_ENCRYPTION       0x00000003
+#define STREAM_CLEAR_ENCRYPTION     0x00000004
+
+#define MAXIMUM_ENCRYPTION_VALUE    0x00000004
+
+typedef struct _DECRYPTION_STATUS_BUFFER {
+  BOOLEAN NoEncryptedStreams;
+} DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
+
+#define ENCRYPTION_FORMAT_DEFAULT        (0x01)
+
+#define COMPRESSION_FORMAT_SPARSE        (0x4000)
+
+typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
+  LONGLONG FileOffset;
+  ULONG Length;
+} REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
+
+typedef struct _ENCRYPTED_DATA_INFO {
+  ULONGLONG StartingFileOffset;
+  ULONG OutputBufferOffset;
+  ULONG BytesWithinFileSize;
+  ULONG BytesWithinValidDataLength;
+  USHORT CompressionFormat;
+  UCHAR DataUnitShift;
+  UCHAR ChunkShift;
+  UCHAR ClusterShift;
+  UCHAR EncryptionFormat;
+  USHORT NumberOfDataBlocks;
+  ULONG DataBlockSize[ANYSIZE_ARRAY];
+} ENCRYPTED_DATA_INFO, *PENCRYPTED_DATA_INFO;
+
+typedef struct _PLEX_READ_DATA_REQUEST {
+  LARGE_INTEGER ByteOffset;
+  ULONG ByteLength;
+  ULONG PlexNumber;
+} PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
+
+typedef struct _SI_COPYFILE {
+  ULONG SourceFileNameLength;
+  ULONG DestinationFileNameLength;
+  ULONG Flags;
+  WCHAR FileNameBuffer[1];
+} SI_COPYFILE, *PSI_COPYFILE;
+
+#define COPYFILE_SIS_LINK       0x0001
+#define COPYFILE_SIS_REPLACE    0x0002
+#define COPYFILE_SIS_FLAGS      0x0003
+
+#endif /* (_WIN32_WINNT >= 0x0500) */
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
+  BOOLEAN CloseDisc;
+} FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
+
+typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
+    BOOLEAN Disable;
+} FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
+
+typedef struct _FILE_QUERY_SPARING_BUFFER {
+  ULONG SparingUnitBytes;
+  BOOLEAN SoftwareSparing;
+  ULONG TotalSpareBlocks;
+  ULONG FreeSpareBlocks;
+} FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
+
+typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
+  LARGE_INTEGER DirectoryCount;
+  LARGE_INTEGER FileCount;
+  USHORT FsFormatMajVersion;
+  USHORT FsFormatMinVersion;
+  WCHAR FsFormatName[12];
+  LARGE_INTEGER FormatTime;
+  LARGE_INTEGER LastUpdateTime;
+  WCHAR CopyrightInfo[34];
+  WCHAR AbstractInfo[34];
+  WCHAR FormattingImplementationInfo[34];
+  WCHAR LastModifyingImplementationInfo[34];
+} FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
+
+#define SET_REPAIR_ENABLED                                      (0x00000001)
+#define SET_REPAIR_VOLUME_BITMAP_SCAN                           (0x00000002)
+#define SET_REPAIR_DELETE_CROSSLINK                             (0x00000004)
+#define SET_REPAIR_WARN_ABOUT_DATA_LOSS                         (0x00000008)
+#define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT             (0x00000010)
+#define SET_REPAIR_VALID_MASK                                   (0x0000001F)
+
+typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
+  ShrinkPrepare = 1,
+  ShrinkCommit,
+  ShrinkAbort
+} SHRINK_VOLUME_REQUEST_TYPES, *PSHRINK_VOLUME_REQUEST_TYPES;
+
+typedef struct _SHRINK_VOLUME_INFORMATION {
+  SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
+  ULONGLONG Flags;
+  LONGLONG NewNumberOfSectors;
+} SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
+
+#define TXFS_RM_FLAG_LOGGING_MODE                           0x00000001
+#define TXFS_RM_FLAG_RENAME_RM                              0x00000002
+#define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX                0x00000004
+#define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN                0x00000008
+#define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS    0x00000010
+#define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT           0x00000020
+#define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE             0x00000040
+#define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX             0x00000080
+#define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN             0x00000100
+#define TXFS_RM_FLAG_GROW_LOG                               0x00000400
+#define TXFS_RM_FLAG_SHRINK_LOG                             0x00000800
+#define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                   0x00001000
+#define TXFS_RM_FLAG_PRESERVE_CHANGES                       0x00002000
+#define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                 0x00004000
+#define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START          0x00008000
+#define TXFS_RM_FLAG_PREFER_CONSISTENCY                     0x00010000
+#define TXFS_RM_FLAG_PREFER_AVAILABILITY                    0x00020000
+
+#define TXFS_LOGGING_MODE_SIMPLE        (0x0001)
+#define TXFS_LOGGING_MODE_FULL          (0x0002)
+
+#define TXFS_TRANSACTION_STATE_NONE         0x00
+#define TXFS_TRANSACTION_STATE_ACTIVE       0x01
+#define TXFS_TRANSACTION_STATE_PREPARED     0x02
+#define TXFS_TRANSACTION_STATE_NOTACTIVE    0x03
+
+#define TXFS_MODIFY_RM_VALID_FLAGS                                      \
+                (TXFS_RM_FLAG_LOGGING_MODE                          |   \
+                 TXFS_RM_FLAG_RENAME_RM                             |   \
+                 TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX               |   \
+                 TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN               |   \
+                 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS   |   \
+                 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT          |   \
+                 TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE            |   \
+                 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX            |   \
+                 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN            |   \
+                 TXFS_RM_FLAG_SHRINK_LOG                            |   \
+                 TXFS_RM_FLAG_GROW_LOG                              |   \
+                 TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                  |   \
+                 TXFS_RM_FLAG_PRESERVE_CHANGES                      |   \
+                 TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                |   \
+                 TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START         |   \
+                 TXFS_RM_FLAG_PREFER_CONSISTENCY                    |   \
+                 TXFS_RM_FLAG_PREFER_AVAILABILITY)
+
+typedef struct _TXFS_MODIFY_RM {
+  ULONG Flags;
+  ULONG LogContainerCountMax;
+  ULONG LogContainerCountMin;
+  ULONG LogContainerCount;
+  ULONG LogGrowthIncrement;
+  ULONG LogAutoShrinkPercentage;
+  ULONGLONG Reserved;
+  USHORT LoggingMode;
+} TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
+
+#define TXFS_RM_STATE_NOT_STARTED       0
+#define TXFS_RM_STATE_STARTING          1
+#define TXFS_RM_STATE_ACTIVE            2
+#define TXFS_RM_STATE_SHUTTING_DOWN     3
+
+#define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS                           \
+                (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS   |   \
+                 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT          |   \
+                 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX            |   \
+                 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN            |   \
+                 TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                |   \
+                 TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START         |   \
+                 TXFS_RM_FLAG_PREFER_CONSISTENCY                    |   \
+                 TXFS_RM_FLAG_PREFER_AVAILABILITY)
+
+typedef struct _TXFS_QUERY_RM_INFORMATION {
+  ULONG BytesRequired;
+  ULONGLONG TailLsn;
+  ULONGLONG CurrentLsn;
+  ULONGLONG ArchiveTailLsn;
+  ULONGLONG LogContainerSize;
+  LARGE_INTEGER HighestVirtualClock;
+  ULONG LogContainerCount;
+  ULONG LogContainerCountMax;
+  ULONG LogContainerCountMin;
+  ULONG LogGrowthIncrement;
+  ULONG LogAutoShrinkPercentage;
+  ULONG Flags;
+  USHORT LoggingMode;
+  USHORT Reserved;
+  ULONG RmState;
+  ULONGLONG LogCapacity;
+  ULONGLONG LogFree;
+  ULONGLONG TopsSize;
+  ULONGLONG TopsUsed;
+  ULONGLONG TransactionCount;
+  ULONGLONG OnePCCount;
+  ULONGLONG TwoPCCount;
+  ULONGLONG NumberLogFileFull;
+  ULONGLONG OldestTransactionAge;
+  GUID RMName;
+  ULONG TmLogPathOffset;
+} TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
+
+#define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN        0x01
+#define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK   0x02
+
+#define TXFS_ROLLFORWARD_REDO_VALID_FLAGS                               \
+                (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN |         \
+                 TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
+
+typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
+  LARGE_INTEGER LastVirtualClock;
+  ULONGLONG LastRedoLsn;
+  ULONGLONG HighestRecoveryLsn;
+  ULONG Flags;
+} TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
+
+#define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX              0x00000001
+#define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN              0x00000002
+#define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                   0x00000004
+#define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS  0x00000008
+#define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT         0x00000010
+#define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE           0x00000020
+#define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX           0x00000040
+#define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN           0x00000080
+
+#define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                  0x00000200
+#define TXFS_START_RM_FLAG_LOGGING_MODE                         0x00000400
+#define TXFS_START_RM_FLAG_PRESERVE_CHANGES                     0x00000800
+
+#define TXFS_START_RM_FLAG_PREFER_CONSISTENCY                   0x00001000
+#define TXFS_START_RM_FLAG_PREFER_AVAILABILITY                  0x00002000
+
+#define TXFS_START_RM_VALID_FLAGS                                           \
+                (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX             |   \
+                 TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN             |   \
+                 TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                  |   \
+                 TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS |   \
+                 TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        |   \
+                 TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          |   \
+                 TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                 |   \
+                 TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          |   \
+                 TXFS_START_RM_FLAG_LOGGING_MODE                        |   \
+                 TXFS_START_RM_FLAG_PRESERVE_CHANGES                    |   \
+                 TXFS_START_RM_FLAG_PREFER_CONSISTENCY                  |   \
+                 TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
+
+typedef struct _TXFS_START_RM_INFORMATION {
+  ULONG Flags;
+  ULONGLONG LogContainerSize;
+  ULONG LogContainerCountMin;
+  ULONG LogContainerCountMax;
+  ULONG LogGrowthIncrement;
+  ULONG LogAutoShrinkPercentage;
+  ULONG TmLogPathOffset;
+  USHORT TmLogPathLength;
+  USHORT LoggingMode;
+  USHORT LogPathLength;
+  USHORT Reserved;
+  WCHAR LogPath[1];
+} TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
+
+typedef struct _TXFS_GET_METADATA_INFO_OUT {
+  struct {
+    LONGLONG LowPart;
+    LONGLONG HighPart;
+  } TxfFileId;
+  GUID LockingTransaction;
+  ULONGLONG LastLsn;
+  ULONG TransactionState;
+} TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
+
+#define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED   0x00000001
+#define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED   0x00000002
+
+typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
+  ULONGLONG Offset;
+  ULONG NameFlags;
+  LONGLONG FileId;
+  ULONG Reserved1;
+  ULONG Reserved2;
+  LONGLONG Reserved3;
+  WCHAR FileName[1];
+} TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
+
+typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
+  GUID KtmTransaction;
+  ULONGLONG NumberOfFiles;
+  ULONGLONG BufferSizeRequired;
+  ULONGLONG Offset;
+} TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
+
+typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
+  GUID TransactionId;
+  ULONG TransactionState;
+  ULONG Reserved1;
+  ULONG Reserved2;
+  LONGLONG Reserved3;
+} TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
+
+typedef struct _TXFS_LIST_TRANSACTIONS {
+  ULONGLONG NumberOfTransactions;
+  ULONGLONG BufferSizeRequired;
+} TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
+
+typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
+  union {
+    ULONG BufferLength;
+    UCHAR Buffer[1];
+  } DUMMYUNIONNAME;
+} TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
+
+typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
+  UCHAR Buffer[1];
+} TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
+
+#define TXFS_TRANSACTED_VERSION_NONTRANSACTED   0xFFFFFFFE
+#define TXFS_TRANSACTED_VERSION_UNCOMMITTED     0xFFFFFFFF
+
+typedef struct _TXFS_GET_TRANSACTED_VERSION {
+  ULONG ThisBaseVersion;
+  ULONG LatestVersion;
+  USHORT ThisMiniVersion;
+  USHORT FirstMiniVersion;
+  USHORT LatestMiniVersion;
+} TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
+
+#define TXFS_SAVEPOINT_SET                      0x00000001
+#define TXFS_SAVEPOINT_ROLLBACK                 0x00000002
+#define TXFS_SAVEPOINT_CLEAR                    0x00000004
+#define TXFS_SAVEPOINT_CLEAR_ALL                0x00000010
+
+typedef struct _TXFS_SAVEPOINT_INFORMATION {
+  HANDLE KtmTransaction;
+  ULONG ActionCode;
+  ULONG SavepointId;
+} TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
+
+typedef struct _TXFS_CREATE_MINIVERSION_INFO {
+  USHORT StructureVersion;
+  USHORT StructureLength;
+  ULONG BaseVersion;
+  USHORT MiniVersion;
+} TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
+
+typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
+  BOOLEAN TransactionsActiveAtSnapshot;
+} TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#if (_WIN32_WINNT >= 0x0601)
+
+#define MARK_HANDLE_REALTIME                (0x00000020)
+#define MARK_HANDLE_NOT_REALTIME            (0x00000040)
+
+#define NO_8DOT3_NAME_PRESENT               (0x00000001)
+#define REMOVED_8DOT3_NAME                  (0x00000002)
+
+#define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED        (0x00000001)
+
+typedef struct _BOOT_AREA_INFO {
+  ULONG BootSectorCount;
+  struct {
+    LARGE_INTEGER Offset;
+  } BootSectors[2];
+} BOOT_AREA_INFO, *PBOOT_AREA_INFO;
+
+typedef struct _RETRIEVAL_POINTER_BASE {
+  LARGE_INTEGER FileAreaOffset;
+} RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
+
+typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION {
+  ULONG VolumeFlags;
+  ULONG FlagMask;
+  ULONG Version;
+  ULONG Reserved;
+} FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION;
+
+typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
+  CHAR FileSystem[9];
+} FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
+
+#define OPLOCK_LEVEL_CACHE_READ         (0x00000001)
+#define OPLOCK_LEVEL_CACHE_HANDLE       (0x00000002)
+#define OPLOCK_LEVEL_CACHE_WRITE        (0x00000004)
+
+#define REQUEST_OPLOCK_INPUT_FLAG_REQUEST               (0x00000001)
+#define REQUEST_OPLOCK_INPUT_FLAG_ACK                   (0x00000002)
+#define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004)
+
+#define REQUEST_OPLOCK_CURRENT_VERSION          1
+
+typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
+  USHORT StructureVersion;
+  USHORT StructureLength;
+  ULONG RequestedOplockLevel;
+  ULONG Flags;
+} REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
+
+#define REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED     (0x00000001)
+#define REQUEST_OPLOCK_OUTPUT_FLAG_MODES_PROVIDED   (0x00000002)
+
+typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
+  USHORT StructureVersion;
+  USHORT StructureLength;
+  ULONG OriginalOplockLevel;
+  ULONG NewOplockLevel;
+  ULONG Flags;
+  ACCESS_MASK AccessMode;
+  USHORT ShareMode;
+} REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
+
+#define SD_GLOBAL_CHANGE_TYPE_MACHINE_SID   1
+
+typedef struct _SD_CHANGE_MACHINE_SID_INPUT {
+  USHORT CurrentMachineSIDOffset;
+  USHORT CurrentMachineSIDLength;
+  USHORT NewMachineSIDOffset;
+  USHORT NewMachineSIDLength;
+} SD_CHANGE_MACHINE_SID_INPUT, *PSD_CHANGE_MACHINE_SID_INPUT;
+
+typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT {
+  ULONGLONG NumSDChangedSuccess;
+  ULONGLONG NumSDChangedFail;
+  ULONGLONG NumSDUnused;
+  ULONGLONG NumSDTotal;
+  ULONGLONG NumMftSDChangedSuccess;
+  ULONGLONG NumMftSDChangedFail;
+  ULONGLONG NumMftSDTotal;
+} SD_CHANGE_MACHINE_SID_OUTPUT, *PSD_CHANGE_MACHINE_SID_OUTPUT;
+
+typedef struct _SD_GLOBAL_CHANGE_INPUT {
+  ULONG Flags;
+  ULONG ChangeType;
+  union {
+    SD_CHANGE_MACHINE_SID_INPUT SdChange;
+  };
+} SD_GLOBAL_CHANGE_INPUT, *PSD_GLOBAL_CHANGE_INPUT;
+
+typedef struct _SD_GLOBAL_CHANGE_OUTPUT {
+  ULONG Flags;
+  ULONG ChangeType;
+  union {
+    SD_CHANGE_MACHINE_SID_OUTPUT SdChange;
+  };
+} SD_GLOBAL_CHANGE_OUTPUT, *PSD_GLOBAL_CHANGE_OUTPUT;
+
+#define ENCRYPTED_DATA_INFO_SPARSE_FILE    1
+
+typedef struct _EXTENDED_ENCRYPTED_DATA_INFO {
+  ULONG ExtendedCode;
+  ULONG Length;
+  ULONG Flags;
+  ULONG Reserved;
+} EXTENDED_ENCRYPTED_DATA_INFO, *PEXTENDED_ENCRYPTED_DATA_INFO;
+
+typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
+  ULONG Flags;
+  ULONG NumberOfClusters;
+  LARGE_INTEGER Cluster[1];
+} LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
+
+typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
+  ULONG Offset;
+  ULONG NumberOfMatches;
+  ULONG BufferSizeRequired;
+} LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
+
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE          0x00000001
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET    0x00000002
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE     0x00000004
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE    0x00000008
+
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK          0xff000000
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA          0x01000000
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX         0x02000000
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM        0x03000000
+
+typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
+  ULONG OffsetToNext;
+  ULONG Flags;
+  LARGE_INTEGER Reserved;
+  LARGE_INTEGER Cluster;
+  WCHAR FileName[1];
+} LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
+
+typedef struct _FILE_TYPE_NOTIFICATION_INPUT {
+  ULONG Flags;
+  ULONG NumFileTypeIDs;
+  GUID FileTypeID[1];
+} FILE_TYPE_NOTIFICATION_INPUT, *PFILE_TYPE_NOTIFICATION_INPUT;
+
+#define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN     0x00000001
+#define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END       0x00000002
+
+DEFINE_GUID( FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE,         0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c );
+DEFINE_GUID( FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE,  0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7 );
+DEFINE_GUID( FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE,    0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9 );
+
+#ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
+#define _VIRTUAL_STORAGE_TYPE_DEFINED
+typedef struct _VIRTUAL_STORAGE_TYPE {
+  ULONG DeviceId;
+  GUID  VendorId;
+} VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
+#endif
+
+typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST {
+  ULONG RequestLevel;
+  ULONG RequestFlags;
+} STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST, *PSTORAGE_QUERY_DEPENDENT_VOLUME_REQUEST;
+
+#define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_HOST_VOLUMES    0x1
+#define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_GUEST_VOLUMES   0x2
+
+typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY {
+  ULONG EntryLength;
+  ULONG DependencyTypeFlags;
+  ULONG ProviderSpecificFlags;
+  VIRTUAL_STORAGE_TYPE VirtualStorageType;
+} STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY;
+
+typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY {
+  ULONG EntryLength;
+  ULONG DependencyTypeFlags;
+  ULONG ProviderSpecificFlags;
+  VIRTUAL_STORAGE_TYPE VirtualStorageType;
+  ULONG AncestorLevel;
+  ULONG HostVolumeNameOffset;
+  ULONG HostVolumeNameSize;
+  ULONG DependentVolumeNameOffset;
+  ULONG DependentVolumeNameSize;
+  ULONG RelativePathOffset;
+  ULONG RelativePathSize;
+  ULONG DependentDeviceNameOffset;
+  ULONG DependentDeviceNameSize;
+} STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY;
+
+typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE {
+  ULONG ResponseLevel;
+  ULONG NumberEntries;
+  union {
+    STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY Lev1Depends[];
+    STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY Lev2Depends[];
+  };
+} STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE, *PSTORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE;
+
+#endif /* (_WIN32_WINNT >= 0x0601) */
+
+typedef struct _FILESYSTEM_STATISTICS {
+  USHORT FileSystemType;
+  USHORT Version;
+  ULONG SizeOfCompleteStructure;
+  ULONG UserFileReads;
+  ULONG UserFileReadBytes;
+  ULONG UserDiskReads;
+  ULONG UserFileWrites;
+  ULONG UserFileWriteBytes;
+  ULONG UserDiskWrites;
+  ULONG MetaDataReads;
+  ULONG MetaDataReadBytes;
+  ULONG MetaDataDiskReads;
+  ULONG MetaDataWrites;
+  ULONG MetaDataWriteBytes;
+  ULONG MetaDataDiskWrites;
+} FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;
+
+#define FILESYSTEM_STATISTICS_TYPE_NTFS     1
+#define FILESYSTEM_STATISTICS_TYPE_FAT      2
+#define FILESYSTEM_STATISTICS_TYPE_EXFAT    3
+
+typedef struct _FAT_STATISTICS {
+  ULONG CreateHits;
+  ULONG SuccessfulCreates;
+  ULONG FailedCreates;
+  ULONG NonCachedReads;
+  ULONG NonCachedReadBytes;
+  ULONG NonCachedWrites;
+  ULONG NonCachedWriteBytes;
+  ULONG NonCachedDiskReads;
+  ULONG NonCachedDiskWrites;
+} FAT_STATISTICS, *PFAT_STATISTICS;
+
+typedef struct _EXFAT_STATISTICS {
+  ULONG CreateHits;
+  ULONG SuccessfulCreates;
+  ULONG FailedCreates;
+  ULONG NonCachedReads;
+  ULONG NonCachedReadBytes;
+  ULONG NonCachedWrites;
+  ULONG NonCachedWriteBytes;
+  ULONG NonCachedDiskReads;
+  ULONG NonCachedDiskWrites;
+} EXFAT_STATISTICS, *PEXFAT_STATISTICS;
+
+typedef struct _NTFS_STATISTICS {
+  ULONG LogFileFullExceptions;
+  ULONG OtherExceptions;
+  ULONG MftReads;
+  ULONG MftReadBytes;
+  ULONG MftWrites;
+  ULONG MftWriteBytes;
+  struct {
+    USHORT Write;
+    USHORT Create;
+    USHORT SetInfo;
+    USHORT Flush;
+  } MftWritesUserLevel;
+  USHORT MftWritesFlushForLogFileFull;
+  USHORT MftWritesLazyWriter;
+  USHORT MftWritesUserRequest;
+  ULONG Mft2Writes;
+  ULONG Mft2WriteBytes;
+  struct {
+    USHORT Write;
+    USHORT Create;
+    USHORT SetInfo;
+    USHORT Flush;
+  } Mft2WritesUserLevel;
+  USHORT Mft2WritesFlushForLogFileFull;
+  USHORT Mft2WritesLazyWriter;
+  USHORT Mft2WritesUserRequest;
+  ULONG RootIndexReads;
+  ULONG RootIndexReadBytes;
+  ULONG RootIndexWrites;
+  ULONG RootIndexWriteBytes;
+  ULONG BitmapReads;
+  ULONG BitmapReadBytes;
+  ULONG BitmapWrites;
+  ULONG BitmapWriteBytes;
+  USHORT BitmapWritesFlushForLogFileFull;
+  USHORT BitmapWritesLazyWriter;
+  USHORT BitmapWritesUserRequest;
+  struct {
+    USHORT Write;
+    USHORT Create;
+    USHORT SetInfo;
+  } BitmapWritesUserLevel;
+  ULONG MftBitmapReads;
+  ULONG MftBitmapReadBytes;
+  ULONG MftBitmapWrites;
+  ULONG MftBitmapWriteBytes;
+  USHORT MftBitmapWritesFlushForLogFileFull;
+  USHORT MftBitmapWritesLazyWriter;
+  USHORT MftBitmapWritesUserRequest;
+  struct {
+    USHORT Write;
+    USHORT Create;
+    USHORT SetInfo;
+    USHORT Flush;
+  } MftBitmapWritesUserLevel;
+  ULONG UserIndexReads;
+  ULONG UserIndexReadBytes;
+  ULONG UserIndexWrites;
+  ULONG UserIndexWriteBytes;
+  ULONG LogFileReads;
+  ULONG LogFileReadBytes;
+  ULONG LogFileWrites;
+  ULONG LogFileWriteBytes;
+  struct {
+    ULONG Calls;
+    ULONG Clusters;
+    ULONG Hints;
+    ULONG RunsReturned;
+    ULONG HintsHonored;
+    ULONG HintsClusters;
+    ULONG Cache;
+    ULONG CacheClusters;
+    ULONG CacheMiss;
+    ULONG CacheMissClusters;
+  } Allocate;
+} NTFS_STATISTICS, *PNTFS_STATISTICS;
+
+#endif // _FILESYSTEMFSCTL_
+
+#define SYMLINK_FLAG_RELATIVE   1
+
+typedef struct _REPARSE_DATA_BUFFER {
+  ULONG ReparseTag;
+  USHORT ReparseDataLength;
+  USHORT Reserved;
+  __GNU_EXTENSION union {
+    struct {
+      USHORT SubstituteNameOffset;
+      USHORT SubstituteNameLength;
+      USHORT PrintNameOffset;
+      USHORT PrintNameLength;
+      ULONG Flags;
+      WCHAR PathBuffer[1];
+    } SymbolicLinkReparseBuffer;
+    struct {
+      USHORT SubstituteNameOffset;
+      USHORT SubstituteNameLength;
+      USHORT PrintNameOffset;
+      USHORT PrintNameLength;
+      WCHAR PathBuffer[1];
+    } MountPointReparseBuffer;
+    struct {
+      UCHAR DataBuffer[1];
+    } GenericReparseBuffer;
+  };
+} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+
+#define REPARSE_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
+
+typedef struct _REPARSE_GUID_DATA_BUFFER {
+  ULONG ReparseTag;
+  USHORT ReparseDataLength;
+  USHORT Reserved;
+  GUID ReparseGuid;
+  struct {
+    UCHAR DataBuffer[1];
+  } GenericReparseBuffer;
+} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
+
+#define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
+
+#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE      ( 16 * 1024 )
+
+/* Reserved reparse tags */
+#define IO_REPARSE_TAG_RESERVED_ZERO            (0)
+#define IO_REPARSE_TAG_RESERVED_ONE             (1)
+#define IO_REPARSE_TAG_RESERVED_RANGE           IO_REPARSE_TAG_RESERVED_ONE
+
+#define IsReparseTagMicrosoft(_tag) (((_tag) & 0x80000000))
+#define IsReparseTagNameSurrogate(_tag) (((_tag) & 0x20000000))
+
+#define IO_REPARSE_TAG_VALID_VALUES     (0xF000FFFF)
+
+#define IsReparseTagValid(tag) (                               \
+                  !((tag) & ~IO_REPARSE_TAG_VALID_VALUES) &&   \
+                  ((tag) > IO_REPARSE_TAG_RESERVED_RANGE)      \
+                 )
+
+/* MicroSoft reparse point tags */
+#define IO_REPARSE_TAG_MOUNT_POINT              (0xA0000003L)
+#define IO_REPARSE_TAG_HSM                      (0xC0000004L)
+#define IO_REPARSE_TAG_DRIVE_EXTENDER           (0x80000005L)
+#define IO_REPARSE_TAG_HSM2                     (0x80000006L)
+#define IO_REPARSE_TAG_SIS                      (0x80000007L)
+#define IO_REPARSE_TAG_WIM                      (0x80000008L)
+#define IO_REPARSE_TAG_CSV                      (0x80000009L)
+#define IO_REPARSE_TAG_DFS                      (0x8000000AL)
+#define IO_REPARSE_TAG_FILTER_MANAGER           (0x8000000BL)
+#define IO_REPARSE_TAG_SYMLINK                  (0xA000000CL)
+#define IO_REPARSE_TAG_IIS_CACHE                (0xA0000010L)
+#define IO_REPARSE_TAG_DFSR                     (0x80000012L)
+
+#pragma pack(4)
+typedef struct _REPARSE_INDEX_KEY {
+  ULONG FileReparseTag;
+  LARGE_INTEGER FileId;
+} REPARSE_INDEX_KEY, *PREPARSE_INDEX_KEY;
+#pragma pack()
+
+#define FSCTL_LMR_GET_LINK_TRACKING_INFORMATION   CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,58,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION   CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,59,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define FSCTL_PIPE_ASSIGN_EVENT         CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_DISCONNECT           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_LISTEN               CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_PEEK                 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_PIPE_QUERY_EVENT          CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_TRANSCEIVE           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER,  FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_PIPE_WAIT                 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_IMPERSONATE          CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_CLIENT_PROCESS   CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_GET_PIPE_ATTRIBUTE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_PIPE_ATTRIBUTE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_FLUSH                    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA)
+
+#define FSCTL_PIPE_INTERNAL_READ        CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_PIPE_INTERNAL_WRITE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_PIPE_INTERNAL_TRANSCEIVE  CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
+
+#define FILE_PIPE_READ_DATA             0x00000000
+#define FILE_PIPE_WRITE_SPACE           0x00000001
+
+typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
+  HANDLE EventHandle;
+  ULONG KeyValue;
+} FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;
+
+typedef struct _FILE_PIPE_EVENT_BUFFER {
+  ULONG NamedPipeState;
+  ULONG EntryType;
+  ULONG ByteCount;
+  ULONG KeyValue;
+  ULONG NumberRequests;
+} FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;
+
+typedef struct _FILE_PIPE_PEEK_BUFFER {
+  ULONG NamedPipeState;
+  ULONG ReadDataAvailable;
+  ULONG NumberOfMessages;
+  ULONG MessageLength;
+  CHAR Data[1];
+} FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
+
+typedef struct _FILE_PIPE_WAIT_FOR_BUFFER {
+  LARGE_INTEGER Timeout;
+  ULONG NameLength;
+  BOOLEAN TimeoutSpecified;
+  WCHAR Name[1];
+} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
+
+typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER {
+#if !defined(BUILD_WOW6432)
+  PVOID ClientSession;
+  PVOID ClientProcess;
+#else
+  ULONGLONG ClientSession;
+  ULONGLONG ClientProcess;
+#endif
+} FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;
+
+#define FILE_PIPE_COMPUTER_NAME_LENGTH 15
+
+typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_EX {
+#if !defined(BUILD_WOW6432)
+  PVOID ClientSession;
+  PVOID ClientProcess;
+#else
+  ULONGLONG ClientSession;
+  ULONGLONG ClientProcess;
+#endif
+  USHORT ClientComputerNameLength;
+  WCHAR ClientComputerBuffer[FILE_PIPE_COMPUTER_NAME_LENGTH+1];
+} FILE_PIPE_CLIENT_PROCESS_BUFFER_EX, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX;
+
+#define FSCTL_MAILSLOT_PEEK             CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
+
+typedef enum _LINK_TRACKING_INFORMATION_TYPE {
+  NtfsLinkTrackingInformation,
+  DfsLinkTrackingInformation
+} LINK_TRACKING_INFORMATION_TYPE, *PLINK_TRACKING_INFORMATION_TYPE;
+
+typedef struct _LINK_TRACKING_INFORMATION {
+  LINK_TRACKING_INFORMATION_TYPE Type;
+  UCHAR VolumeId[16];
+} LINK_TRACKING_INFORMATION, *PLINK_TRACKING_INFORMATION;
+
+typedef struct _REMOTE_LINK_TRACKING_INFORMATION {
+  PVOID TargetFileObject;
+  ULONG TargetLinkTrackingInformationLength;
+  UCHAR TargetLinkTrackingInformationBuffer[1];
+} REMOTE_LINK_TRACKING_INFORMATION, *PREMOTE_LINK_TRACKING_INFORMATION;
+
+typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION {
+  ULONG Attributes;
+  ACCESS_MASK GrantedAccess;
+  ULONG HandleCount;
+  ULONG PointerCount;
+  ULONG Reserved[10];
+} PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;
+
+typedef struct _PUBLIC_OBJECT_TYPE_INFORMATION {
+  UNICODE_STRING TypeName;
+  ULONG Reserved [22];
+} PUBLIC_OBJECT_TYPE_INFORMATION, *PPUBLIC_OBJECT_TYPE_INFORMATION;
+
+typedef struct _SECURITY_CLIENT_CONTEXT {
+  SECURITY_QUALITY_OF_SERVICE SecurityQos;
+  PACCESS_TOKEN ClientToken;
+  BOOLEAN DirectlyAccessClientToken;
+  BOOLEAN DirectAccessEffectiveOnly;
+  BOOLEAN ServerIsRemote;
+  TOKEN_CONTROL ClientTokenControl;
+} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;
+
+#define SYSTEM_PAGE_PRIORITY_BITS       3
+#define SYSTEM_PAGE_PRIORITY_LEVELS     (1 << SYSTEM_PAGE_PRIORITY_BITS)
+
+typedef struct _KAPC_STATE {
+  LIST_ENTRY ApcListHead[MaximumMode];
+  PKPROCESS Process;
+  BOOLEAN KernelApcInProgress;
+  BOOLEAN KernelApcPending;
+  BOOLEAN UserApcPending;
+} KAPC_STATE, *PKAPC_STATE, *RESTRICTED_POINTER PRKAPC_STATE;
+
+#define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN))
+
+typedef struct _KQUEUE {
+  DISPATCHER_HEADER Header;
+  LIST_ENTRY EntryListHead;
+  volatile ULONG CurrentCount;
+  ULONG MaximumCount;
+  LIST_ENTRY ThreadListHead;
+} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
 NTKERNELAPI
 VOID
 NTAPI
-CcSetDirtyPageThreshold (
-    IN PFILE_OBJECT FileObject,
-    IN ULONG        DirtyPageThreshold
-);
+KeInitializeMutant(
+  OUT PRKMUTANT Mutant,
+  IN BOOLEAN InitialOwner);
 
 NTKERNELAPI
-VOID
+LONG
 NTAPI
-CcSetDirtyPinnedData (
-    IN PVOID            BcbVoid,
-    IN PLARGE_INTEGER   Lsn OPTIONAL
-);
+KeReadStateMutant(
+  IN PRKMUTANT Mutant);
 
 NTKERNELAPI
-VOID
+LONG
 NTAPI
-CcSetFileSizes (
-    IN PFILE_OBJECT     FileObject,
-    IN PCC_FILE_SIZES   FileSizes
-);
-
-typedef VOID (NTAPI *PFLUSH_TO_LSN) (
-    IN PVOID            LogHandle,
-    IN LARGE_INTEGER    Lsn
-);
+KeReleaseMutant(
+  IN OUT PRKMUTANT Mutant,
+  IN KPRIORITY Increment,
+  IN BOOLEAN Abandoned,
+  IN BOOLEAN Wait);
 
 NTKERNELAPI
 VOID
 NTAPI
-CcSetLogHandleForFile (
-    IN PFILE_OBJECT     FileObject,
-    IN PVOID            LogHandle,
-    IN PFLUSH_TO_LSN    FlushToLsnRoutine
-);
+KeInitializeQueue(
+  OUT PRKQUEUE Queue,
+  IN ULONG Count);
 
 NTKERNELAPI
-VOID
+LONG
 NTAPI
-CcSetReadAheadGranularity (
-    IN PFILE_OBJECT FileObject,
-    IN ULONG        Granularity     /* default: PAGE_SIZE */
-                                    /* allowed: 2^n * PAGE_SIZE */
-);
+KeReadStateQueue(
+  IN PRKQUEUE Queue);
 
 NTKERNELAPI
-BOOLEAN
+LONG
 NTAPI
-CcUninitializeCacheMap (
-    IN PFILE_OBJECT                 FileObject,
-    IN PLARGE_INTEGER               TruncateSize OPTIONAL,
-    IN PCACHE_UNINITIALIZE_EVENT    UninitializeCompleteEvent OPTIONAL
-);
+KeInsertQueue(
+  IN OUT PRKQUEUE Queue,
+  IN OUT PLIST_ENTRY Entry);
 
 NTKERNELAPI
-VOID
+LONG
 NTAPI
-CcUnpinData (
-    IN PVOID Bcb
-);
+KeInsertHeadQueue(
+  IN OUT PRKQUEUE Queue,
+  IN OUT PLIST_ENTRY Entry);
 
 NTKERNELAPI
-VOID
+PLIST_ENTRY
 NTAPI
-CcUnpinDataForThread (
-    IN PVOID            Bcb,
-    IN ERESOURCE_THREAD ResourceThreadId
-);
+KeRemoveQueue(
+  IN OUT PRKQUEUE Queue,
+  IN KPROCESSOR_MODE WaitMode,
+  IN PLARGE_INTEGER Timeout OPTIONAL);
 
 NTKERNELAPI
 VOID
 NTAPI
-CcUnpinRepinnedBcb (
-    IN PVOID                Bcb,
-    IN BOOLEAN              WriteThrough,
-    OUT PIO_STATUS_BLOCK    IoStatus
-);
-
-#if (VER_PRODUCTBUILD >= 2195)
+KeAttachProcess(
+  IN OUT PKPROCESS Process);
 
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-CcWaitForCurrentLazyWriterActivity (
-    VOID
-);
-
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+KeDetachProcess(
+  VOID);
 
 NTKERNELAPI
-BOOLEAN
+PLIST_ENTRY
 NTAPI
-CcZeroData (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   StartOffset,
-    IN PLARGE_INTEGER   EndOffset,
-    IN BOOLEAN          Wait
-);
+KeRundownQueue(
+  IN OUT PRKQUEUE Queue);
 
 NTKERNELAPI
 VOID
 NTAPI
-ExDisableResourceBoostLite (
-    IN PERESOURCE  Resource
-);
+KeStackAttachProcess(
+  IN OUT PKPROCESS Process,
+  OUT PKAPC_STATE ApcState);
 
 NTKERNELAPI
-SIZE_T
+VOID
 NTAPI
-ExQueryPoolBlockSize (
-    IN PVOID      PoolBlock,
-    OUT PBOOLEAN  QuotaCharged
-);
+KeUnstackDetachProcess(
+  IN PKAPC_STATE ApcState);
 
-#if (VER_PRODUCTBUILD >= 2600)
-
-#ifndef __NTOSKRNL__
 NTKERNELAPI
-VOID
-FASTCALL
-ExInitializeRundownProtection (
-    IN PEX_RUNDOWN_REF  RunRef
-);
-
-NTKERNELAPI
-VOID
-FASTCALL
-ExReInitializeRundownProtection (
-    IN PEX_RUNDOWN_REF  RunRef
-);
+UCHAR
+NTAPI
+KeSetIdealProcessorThread(
+  IN OUT PKTHREAD Thread,
+  IN UCHAR Processor);
 
 NTKERNELAPI
 BOOLEAN
-FASTCALL
-ExAcquireRundownProtection (
-    IN PEX_RUNDOWN_REF  RunRef
-);
+NTAPI
+KeSetKernelStackSwapEnable(
+  IN BOOLEAN Enable);
 
+#if defined(_X86_)
+NTHALAPI
+KIRQL
+FASTCALL
+KeAcquireSpinLockRaiseToSynch(
+  IN OUT PKSPIN_LOCK SpinLock);
+#else
 NTKERNELAPI
-BOOLEAN
+KIRQL
+KeAcquireSpinLockRaiseToSynch(
+  IN OUT PKSPIN_LOCK SpinLock);
+#endif
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+_DECL_HAL_KE_IMPORT
+KIRQL
 FASTCALL
-ExAcquireRundownProtectionEx (
-    IN PEX_RUNDOWN_REF  RunRef,
-    IN ULONG            Count
-);
+KeAcquireQueuedSpinLock(
+  IN OUT KSPIN_LOCK_QUEUE_NUMBER Number);
 
-NTKERNELAPI
+NTHALAPI
 VOID
 FASTCALL
-ExReleaseRundownProtection (
-    IN PEX_RUNDOWN_REF  RunRef
-);
+KeReleaseQueuedSpinLock(
+  IN OUT KSPIN_LOCK_QUEUE_NUMBER Number,
+  IN KIRQL OldIrql);
+
+_DECL_HAL_KE_IMPORT
+LOGICAL
+FASTCALL
+KeTryToAcquireQueuedSpinLock(
+  IN KSPIN_LOCK_QUEUE_NUMBER Number,
+  OUT PKIRQL OldIrql);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
 
 NTKERNELAPI
 VOID
-FASTCALL
-ExReleaseRundownProtectionEx (
-    IN PEX_RUNDOWN_REF  RunRef,
-    IN ULONG            Count
-);
+KeQueryOwnerMutant(
+  IN PKMUTANT Mutant,
+  OUT PCLIENT_ID ClientId);
+
+NTKERNELAPI
+ULONG
+KeRemoveQueueEx (
+  IN OUT PKQUEUE Queue,
+  IN KPROCESSOR_MODE WaitMode,
+  IN BOOLEAN Alertable,
+  IN PLARGE_INTEGER Timeout OPTIONAL,
+  OUT PLIST_ENTRY *EntryArray,
+  IN ULONG Count);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#define INVALID_PROCESSOR_INDEX     0xffffffff
+
+NTSTATUS
+NTAPI
+KeGetProcessorNumberFromIndex(
+  IN ULONG ProcIndex,
+  OUT PPROCESSOR_NUMBER ProcNumber);
+
+ULONG
+NTAPI
+KeGetProcessorIndexFromNumber(
+  IN PPROCESSOR_NUMBER ProcNumber);
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
 NTKERNELAPI
+SIZE_T
+NTAPI
+ExQueryPoolBlockSize(
+  IN PVOID PoolBlock,
+  OUT PBOOLEAN QuotaCharged);
+
 VOID
-FASTCALL
-ExRundownCompleted (
-    IN PEX_RUNDOWN_REF  RunRef
-);
+ExAdjustLookasideDepth(
+  VOID);
 
 NTKERNELAPI
 VOID
+NTAPI
+ExDisableResourceBoostLite(
+  IN PERESOURCE Resource);
+
+#endif
+
+#define ExDisableResourceBoost ExDisableResourceBoostLite
+
+#define EX_PUSH_LOCK ULONG_PTR
+#define PEX_PUSH_LOCK PULONG_PTR
+
+VOID
+ExInitializePushLock (
+  OUT PEX_PUSH_LOCK PushLock);
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+PSLIST_ENTRY
 FASTCALL
-ExWaitForRundownProtectionRelease (
-    IN PEX_RUNDOWN_REF  RunRef
-);
+InterlockedPushListSList(
+  IN OUT PSLIST_HEADER ListHead,
+  IN OUT PSLIST_ENTRY List,
+  IN OUT PSLIST_ENTRY ListEnd,
+  IN ULONG Count);
 
 #endif
-#endif /* (VER_PRODUCTBUILD >= 2600) */
 
+/* #if !defined(_X86AMD64_)  FIXME : WHAT ?! */
+#if defined(_WIN64)
 
-#define FsRtlSetupAdvancedHeader( _advhdr, _fmutx )                         \
-{                                                                           \
-    SetFlag( (_advhdr)->Flags, FSRTL_FLAG_ADVANCED_HEADER );                \
-    SetFlag( (_advhdr)->Flags2, FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS );     \
-    (_advhdr)->Version = FSRTL_FCB_HEADER_V1;                               \
-    InitializeListHead( &(_advhdr)->FilterContexts );                       \
-    if ((_fmutx) != NULL) {                                                 \
-        (_advhdr)->FastMutex = (_fmutx);                                    \
-    }                                                                       \
-    *((PULONG_PTR)(&(_advhdr)->PushLock)) = 0;                              \
-    /*ExInitializePushLock( &(_advhdr)->PushLock ); API Not avaliable downlevel*/\
-    (_advhdr)->FileContextSupportPointer = NULL;                            \
+C_ASSERT(sizeof(ERESOURCE) == 0x68);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x18);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x1a);
+
+#else
+
+C_ASSERT(sizeof(ERESOURCE) == 0x38);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x0c);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x0e);
+
+#endif
+/* #endif */
+
+#define TOKEN_HAS_TRAVERSE_PRIVILEGE    0x0001
+#define TOKEN_HAS_BACKUP_PRIVILEGE      0x0002
+#define TOKEN_HAS_RESTORE_PRIVILEGE     0x0004
+#define TOKEN_WRITE_RESTRICTED          0x0008
+#define TOKEN_IS_RESTRICTED             0x0010
+#define TOKEN_SESSION_NOT_REFERENCED    0x0020
+#define TOKEN_SANDBOX_INERT             0x0040
+#define TOKEN_HAS_IMPERSONATE_PRIVILEGE 0x0080
+#define SE_BACKUP_PRIVILEGES_CHECKED    0x0100
+#define TOKEN_VIRTUALIZE_ALLOWED        0x0200
+#define TOKEN_VIRTUALIZE_ENABLED        0x0400
+#define TOKEN_IS_FILTERED               0x0800
+#define TOKEN_UIACCESS                  0x1000
+#define TOKEN_NOT_LOW                   0x2000
+
+typedef struct _SE_EXPORTS {
+  LUID SeCreateTokenPrivilege;
+  LUID SeAssignPrimaryTokenPrivilege;
+  LUID SeLockMemoryPrivilege;
+  LUID SeIncreaseQuotaPrivilege;
+  LUID SeUnsolicitedInputPrivilege;
+  LUID SeTcbPrivilege;
+  LUID SeSecurityPrivilege;
+  LUID SeTakeOwnershipPrivilege;
+  LUID SeLoadDriverPrivilege;
+  LUID SeCreatePagefilePrivilege;
+  LUID SeIncreaseBasePriorityPrivilege;
+  LUID SeSystemProfilePrivilege;
+  LUID SeSystemtimePrivilege;
+  LUID SeProfileSingleProcessPrivilege;
+  LUID SeCreatePermanentPrivilege;
+  LUID SeBackupPrivilege;
+  LUID SeRestorePrivilege;
+  LUID SeShutdownPrivilege;
+  LUID SeDebugPrivilege;
+  LUID SeAuditPrivilege;
+  LUID SeSystemEnvironmentPrivilege;
+  LUID SeChangeNotifyPrivilege;
+  LUID SeRemoteShutdownPrivilege;
+  PSID SeNullSid;
+  PSID SeWorldSid;
+  PSID SeLocalSid;
+  PSID SeCreatorOwnerSid;
+  PSID SeCreatorGroupSid;
+  PSID SeNtAuthoritySid;
+  PSID SeDialupSid;
+  PSID SeNetworkSid;
+  PSID SeBatchSid;
+  PSID SeInteractiveSid;
+  PSID SeLocalSystemSid;
+  PSID SeAliasAdminsSid;
+  PSID SeAliasUsersSid;
+  PSID SeAliasGuestsSid;
+  PSID SeAliasPowerUsersSid;
+  PSID SeAliasAccountOpsSid;
+  PSID SeAliasSystemOpsSid;
+  PSID SeAliasPrintOpsSid;
+  PSID SeAliasBackupOpsSid;
+  PSID SeAuthenticatedUsersSid;
+  PSID SeRestrictedSid;
+  PSID SeAnonymousLogonSid;
+  LUID SeUndockPrivilege;
+  LUID SeSyncAgentPrivilege;
+  LUID SeEnableDelegationPrivilege;
+  PSID SeLocalServiceSid;
+  PSID SeNetworkServiceSid;
+  LUID SeManageVolumePrivilege;
+  LUID SeImpersonatePrivilege;
+  LUID SeCreateGlobalPrivilege;
+  LUID SeTrustedCredManAccessPrivilege;
+  LUID SeRelabelPrivilege;
+  LUID SeIncreaseWorkingSetPrivilege;
+  LUID SeTimeZonePrivilege;
+  LUID SeCreateSymbolicLinkPrivilege;
+  PSID SeIUserSid;
+  PSID SeUntrustedMandatorySid;
+  PSID SeLowMandatorySid;
+  PSID SeMediumMandatorySid;
+  PSID SeHighMandatorySid;
+  PSID SeSystemMandatorySid;
+  PSID SeOwnerRightsSid;
+} SE_EXPORTS, *PSE_EXPORTS;
+
+typedef NTSTATUS
+(NTAPI *PSE_LOGON_SESSION_TERMINATED_ROUTINE)(
+  IN PLUID LogonId);
+
+#define SeLengthSid( Sid ) \
+    (8 + (4 * ((SID *)Sid)->SubAuthorityCount))
+
+#define SeDeleteClientSecurity(C)  {                                           \
+            if (SeTokenType((C)->ClientToken) == TokenPrimary) {               \
+                PsDereferencePrimaryToken( (C)->ClientToken );                 \
+            } else {                                                           \
+                PsDereferenceImpersonationToken( (C)->ClientToken );           \
+            }                                                                  \
 }
 
+#define SeStopImpersonatingClient() PsRevertToSelf()
+
+#define SeQuerySubjectContextToken( SubjectContext )                \
+    ( ARGUMENT_PRESENT(                                             \
+        ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken   \
+        ) ?                                                         \
+    ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken :     \
+    ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken )
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
 NTKERNELAPI
-BOOLEAN
+VOID
 NTAPI
-FsRtlAddBaseMcbEntry (
-    IN PBASE_MCB  Mcb,
-    IN LONGLONG   Vbn,
-    IN LONGLONG   Lbn,
-    IN LONGLONG   SectorCount
-);
+SeCaptureSubjectContext(
+  OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
 
 NTKERNELAPI
-BOOLEAN
+VOID
 NTAPI
-FsRtlAddLargeMcbEntry (
-    IN PLARGE_MCB  Mcb,
-    IN LONGLONG    Vbn,
-    IN LONGLONG    Lbn,
-    IN LONGLONG    SectorCount
-);
+SeLockSubjectContext(
+  IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
 
 NTKERNELAPI
-BOOLEAN
+VOID
 NTAPI
-FsRtlAddMcbEntry (
-    IN PMCB   Mcb,
-    IN VBN    Vbn,
-    IN LBN    Lbn,
-    IN ULONG  SectorCount
-);
+SeUnlockSubjectContext(
+  IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlAddToTunnelCache (
-    IN PTUNNEL          Cache,
-    IN ULONGLONG        DirectoryKey,
-    IN PUNICODE_STRING  ShortName,
-    IN PUNICODE_STRING  LongName,
-    IN BOOLEAN          KeyByShortName,
-    IN ULONG            DataLength,
-    IN PVOID            Data
-);
-
-#if (VER_PRODUCTBUILD >= 2195)
+SeReleaseSubjectContext(
+  IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
 
-PFILE_LOCK
+NTKERNELAPI
+BOOLEAN
 NTAPI
-FsRtlAllocateFileLock (
-    IN PCOMPLETE_LOCK_IRP_ROUTINE   CompleteLockIrpRoutine OPTIONAL,
-    IN PUNLOCK_ROUTINE              UnlockRoutine OPTIONAL
-);
-
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+SePrivilegeCheck(
+  IN OUT PPRIVILEGE_SET RequiredPrivileges,
+  IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
+  IN KPROCESSOR_MODE AccessMode);
 
 NTKERNELAPI
-PVOID
+VOID
 NTAPI
-FsRtlAllocatePool (
-    IN POOL_TYPE    PoolType,
-    IN ULONG        NumberOfBytes
-);
+SeOpenObjectAuditAlarm(
+  IN PUNICODE_STRING ObjectTypeName,
+  IN PVOID Object OPTIONAL,
+  IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PACCESS_STATE AccessState,
+  IN BOOLEAN ObjectCreated,
+  IN BOOLEAN AccessGranted,
+  IN KPROCESSOR_MODE AccessMode,
+  OUT PBOOLEAN GenerateOnClose);
 
 NTKERNELAPI
-PVOID
+VOID
 NTAPI
-FsRtlAllocatePoolWithQuota (
-    IN POOL_TYPE    PoolType,
-    IN ULONG        NumberOfBytes
-);
+SeOpenObjectForDeleteAuditAlarm(
+  IN PUNICODE_STRING ObjectTypeName,
+  IN PVOID Object OPTIONAL,
+  IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PACCESS_STATE AccessState,
+  IN BOOLEAN ObjectCreated,
+  IN BOOLEAN AccessGranted,
+  IN KPROCESSOR_MODE AccessMode,
+  OUT PBOOLEAN GenerateOnClose);
 
 NTKERNELAPI
-PVOID
+VOID
 NTAPI
-FsRtlAllocatePoolWithQuotaTag (
-    IN POOL_TYPE    PoolType,
-    IN ULONG        NumberOfBytes,
-    IN ULONG        Tag
-);
+SeDeleteObjectAuditAlarm(
+  IN PVOID Object,
+  IN HANDLE Handle);
 
 NTKERNELAPI
-PVOID
+TOKEN_TYPE
 NTAPI
-FsRtlAllocatePoolWithTag (
-    IN POOL_TYPE    PoolType,
-    IN ULONG        NumberOfBytes,
-    IN ULONG        Tag
-);
+SeTokenType(
+  IN PACCESS_TOKEN Token);
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlAreNamesEqual (
-    IN PCUNICODE_STRING  Name1,
-    IN PCUNICODE_STRING  Name2,
-    IN BOOLEAN           IgnoreCase,
-    IN PCWCH             UpcaseTable OPTIONAL
-);
-
-#define FsRtlAreThereCurrentFileLocks(FL) ( \
-    ((FL)->FastIoIsQuestionable)            \
-)
-
-/*
-  FsRtlCheckLockForReadAccess:
+SeTokenIsAdmin(
+  IN PACCESS_TOKEN Token);
 
-  All this really does is pick out the lock parameters from the irp (io stack
-  location?), get IoGetRequestorProcess, and pass values on to
-  FsRtlFastCheckLockForRead.
-*/
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlCheckLockForReadAccess (
-    IN PFILE_LOCK   FileLock,
-    IN PIRP         Irp
-);
+SeTokenIsRestricted(
+  IN PACCESS_TOKEN Token);
 
-/*
-  FsRtlCheckLockForWriteAccess:
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeQueryAuthenticationIdToken(
+  IN PACCESS_TOKEN Token,
+  OUT PLUID AuthenticationId);
 
-  All this really does is pick out the lock parameters from the irp (io stack
-  location?), get IoGetRequestorProcess, and pass values on to
-  FsRtlFastCheckLockForWrite.
-*/
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-FsRtlCheckLockForWriteAccess (
-    IN PFILE_LOCK   FileLock,
-    IN PIRP         Irp
-);
+SeQuerySessionIdToken(
+  IN PACCESS_TOKEN Token,
+  OUT PULONG SessionId);
 
-typedef
-VOID
-(NTAPI*POPLOCK_WAIT_COMPLETE_ROUTINE) (
-    IN PVOID    Context,
-    IN PIRP     Irp
-);
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeCreateClientSecurity(
+  IN PETHREAD ClientThread,
+  IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos,
+  IN BOOLEAN RemoteSession,
+  OUT PSECURITY_CLIENT_CONTEXT ClientContext);
 
-typedef
+NTKERNELAPI
 VOID
-(NTAPI*POPLOCK_FS_PREPOST_IRP) (
-    IN PVOID    Context,
-    IN PIRP     Irp
-);
+NTAPI
+SeImpersonateClient(
+  IN PSECURITY_CLIENT_CONTEXT ClientContext,
+  IN PETHREAD ServerThread OPTIONAL);
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-FsRtlCheckOplock (
-    IN POPLOCK                          Oplock,
-    IN PIRP                             Irp,
-    IN PVOID                            Context,
-    IN POPLOCK_WAIT_COMPLETE_ROUTINE    CompletionRoutine OPTIONAL,
-    IN POPLOCK_FS_PREPOST_IRP           PostIrpRoutine OPTIONAL
-);
+SeImpersonateClientEx(
+  IN PSECURITY_CLIENT_CONTEXT ClientContext,
+  IN PETHREAD ServerThread OPTIONAL);
 
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-FsRtlCopyRead (
-    IN PFILE_OBJECT         FileObject,
-    IN PLARGE_INTEGER       FileOffset,
-    IN ULONG                Length,
-    IN BOOLEAN              Wait,
-    IN ULONG                LockKey,
-    OUT PVOID               Buffer,
-    OUT PIO_STATUS_BLOCK    IoStatus,
-    IN PDEVICE_OBJECT       DeviceObject
-);
+SeCreateClientSecurityFromSubjectContext(
+  IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
+  IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos,
+  IN BOOLEAN ServerIsRemote,
+  OUT PSECURITY_CLIENT_CONTEXT ClientContext);
 
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-FsRtlCopyWrite (
-    IN PFILE_OBJECT         FileObject,
-    IN PLARGE_INTEGER       FileOffset,
-    IN ULONG                Length,
-    IN BOOLEAN              Wait,
-    IN ULONG                LockKey,
-    IN PVOID                Buffer,
-    OUT PIO_STATUS_BLOCK    IoStatus,
-    IN PDEVICE_OBJECT       DeviceObject
-);
+SeQuerySecurityDescriptorInfo(
+  IN PSECURITY_INFORMATION SecurityInformation,
+  OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN OUT PULONG Length,
+  IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor);
 
-#define HEAP_NO_SERIALIZE               0x00000001
-#define HEAP_GROWABLE                   0x00000002
-#define HEAP_GENERATE_EXCEPTIONS        0x00000004
-#define HEAP_ZERO_MEMORY                0x00000008
-#define HEAP_REALLOC_IN_PLACE_ONLY      0x00000010
-#define HEAP_TAIL_CHECKING_ENABLED      0x00000020
-#define HEAP_FREE_CHECKING_ENABLED      0x00000040
-#define HEAP_DISABLE_COALESCE_ON_FREE   0x00000080
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeSetSecurityDescriptorInfo(
+  IN PVOID Object OPTIONAL,
+  IN PSECURITY_INFORMATION SecurityInformation,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
+  IN POOL_TYPE PoolType,
+  IN PGENERIC_MAPPING GenericMapping);
 
-#define HEAP_CREATE_ALIGN_16            0x00010000
-#define HEAP_CREATE_ENABLE_TRACING      0x00020000
-#define HEAP_CREATE_ENABLE_EXECUTE      0x00040000
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeSetSecurityDescriptorInfoEx(
+  IN PVOID Object OPTIONAL,
+  IN PSECURITY_INFORMATION SecurityInformation,
+  IN PSECURITY_DESCRIPTOR ModificationDescriptor,
+  IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
+  IN ULONG AutoInheritFlags,
+  IN POOL_TYPE PoolType,
+  IN PGENERIC_MAPPING GenericMapping);
 
-NTSYSAPI
-PVOID
+NTKERNELAPI
+NTSTATUS
 NTAPI
-RtlCreateHeap (
-    IN ULONG                Flags,
-    IN PVOID                HeapBase OPTIONAL,
-    IN SIZE_T               ReserveSize OPTIONAL,
-    IN SIZE_T               CommitSize OPTIONAL,
-    IN PVOID                Lock OPTIONAL,
-    IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL
-);
+SeAppendPrivileges(
+  IN OUT PACCESS_STATE AccessState,
+  IN PPRIVILEGE_SET Privileges);
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlCurrentBatchOplock (
-    IN POPLOCK Oplock
-);
+SeAuditingFileEvents(
+  IN BOOLEAN AccessGranted,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor);
 
 NTKERNELAPI
-VOID
+BOOLEAN
 NTAPI
-FsRtlDeleteKeyFromTunnelCache (
-    IN PTUNNEL      Cache,
-    IN ULONGLONG    DirectoryKey
-);
+SeAuditingFileOrGlobalEvents(
+  IN BOOLEAN AccessGranted,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext);
 
-NTKERNELAPI
 VOID
 NTAPI
-FsRtlDeleteTunnelCache (
-    IN PTUNNEL Cache
-);
+SeSetAccessStateGenericMapping(
+  IN OUT PACCESS_STATE AccessState,
+  IN PGENERIC_MAPPING GenericMapping);
 
 NTKERNELAPI
-VOID
+NTSTATUS
 NTAPI
-FsRtlDeregisterUncProvider (
-    IN HANDLE Handle
-);
+SeRegisterLogonSessionTerminatedRoutine(
+  IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine);
 
-NTSYSAPI
-PVOID
+NTKERNELAPI
+NTSTATUS
 NTAPI
-RtlDestroyHeap(
-    IN PVOID HeapHandle
-);
+SeUnregisterLogonSessionTerminatedRoutine(
+  IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine);
 
 NTKERNELAPI
-VOID
+NTSTATUS
 NTAPI
-FsRtlDissectDbcs (
-    IN ANSI_STRING    Name,
-    OUT PANSI_STRING  FirstPart,
-    OUT PANSI_STRING  RemainingPart
-);
+SeMarkLogonSessionForTerminationNotification(
+  IN PLUID LogonId);
 
 NTKERNELAPI
-VOID
+NTSTATUS
 NTAPI
-FsRtlDissectName (
-    IN UNICODE_STRING    Name,
-    OUT PUNICODE_STRING  FirstPart,
-    OUT PUNICODE_STRING  RemainingPart
-);
+SeQueryInformationToken(
+  IN PACCESS_TOKEN Token,
+  IN TOKEN_INFORMATION_CLASS TokenInformationClass,
+  OUT PVOID *TokenInformation);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
 
+#if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlDoesDbcsContainWildCards (
-    IN PANSI_STRING Name
-);
+SeAuditingHardLinkEvents(
+  IN BOOLEAN AccessGranted,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeFilterToken(
+  IN PACCESS_TOKEN ExistingToken,
+  IN ULONG Flags,
+  IN PTOKEN_GROUPS SidsToDisable OPTIONAL,
+  IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL,
+  IN PTOKEN_GROUPS RestrictedSids OPTIONAL,
+  OUT PACCESS_TOKEN *FilteredToken);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeAuditHardLinkCreation(
+  IN PUNICODE_STRING FileName,
+  IN PUNICODE_STRING LinkName,
+  IN BOOLEAN bSuccess);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlDoesNameContainWildCards (
-    IN PUNICODE_STRING Name
-);
+SeAuditingFileEventsWithContext(
+  IN BOOLEAN AccessGranted,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL);
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlIsFatDbcsLegal (
-    IN ANSI_STRING DbcsName,
-    IN BOOLEAN WildCardsPermissible,
-    IN BOOLEAN PathNamePermissible,
-    IN BOOLEAN LeadingBackslashPermissible
-    );
+SeAuditingHardLinkEventsWithContext(
+  IN BOOLEAN AccessGranted,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL);
 
+#endif
 
-#define FsRtlCompleteRequest(IRP,STATUS) {         \
-    (IRP)->IoStatus.Status = (STATUS);             \
-    IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \
-}
+#if (NTDDI_VERSION >= NTDDI_VISTA)
 
-#define FsRtlEnterFileSystem    KeEnterCriticalRegion
+NTKERNELAPI
+VOID
+NTAPI
+SeOpenObjectAuditAlarmWithTransaction(
+  IN PUNICODE_STRING ObjectTypeName,
+  IN PVOID Object OPTIONAL,
+  IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PACCESS_STATE AccessState,
+  IN BOOLEAN ObjectCreated,
+  IN BOOLEAN AccessGranted,
+  IN KPROCESSOR_MODE AccessMode,
+  IN GUID *TransactionId OPTIONAL,
+  OUT PBOOLEAN GenerateOnClose);
 
-#define FsRtlExitFileSystem     KeLeaveCriticalRegion
+NTKERNELAPI
+VOID
+NTAPI
+SeOpenObjectForDeleteAuditAlarmWithTransaction(
+  IN PUNICODE_STRING ObjectTypeName,
+  IN PVOID Object OPTIONAL,
+  IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PACCESS_STATE AccessState,
+  IN BOOLEAN ObjectCreated,
+  IN BOOLEAN AccessGranted,
+  IN KPROCESSOR_MODE AccessMode,
+  IN GUID *TransactionId OPTIONAL,
+  OUT PBOOLEAN GenerateOnClose);
 
 NTKERNELAPI
-BOOLEAN
+VOID
 NTAPI
-FsRtlFastCheckLockForRead (
-    IN PFILE_LOCK           FileLock,
-    IN PLARGE_INTEGER       FileOffset,
-    IN PLARGE_INTEGER       Length,
-    IN ULONG                Key,
-    IN PFILE_OBJECT         FileObject,
-    IN PVOID                Process
-);
+SeExamineSacl(
+  IN PACL Sacl,
+  IN PACCESS_TOKEN Token,
+  IN ACCESS_MASK DesiredAccess,
+  IN BOOLEAN AccessGranted,
+  OUT PBOOLEAN GenerateAudit,
+  OUT PBOOLEAN GenerateAlarm);
 
 NTKERNELAPI
-BOOLEAN
+VOID
 NTAPI
-FsRtlFastCheckLockForWrite (
-    IN PFILE_LOCK           FileLock,
-    IN PLARGE_INTEGER       FileOffset,
-    IN PLARGE_INTEGER       Length,
-    IN ULONG                Key,
-    IN PFILE_OBJECT         FileObject,
-    IN PVOID                Process
-);
+SeDeleteObjectAuditAlarmWithTransaction(
+  IN PVOID Object,
+  IN HANDLE Handle,
+  IN GUID *TransactionId OPTIONAL);
 
-#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) (       \
-     FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11)   \
-)
+NTKERNELAPI
+VOID
+NTAPI
+SeQueryTokenIntegrity(
+  IN PACCESS_TOKEN Token,
+  IN OUT PSID_AND_ATTRIBUTES IntegritySA);
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-FsRtlFastUnlockAll (
-    IN PFILE_LOCK           FileLock,
-    IN PFILE_OBJECT         FileObject,
-    IN PEPROCESS            Process,
-    IN PVOID                Context OPTIONAL
-);
-/* ret: STATUS_RANGE_NOT_LOCKED */
+SeSetSessionIdToken(
+  IN PACCESS_TOKEN Token,
+  IN ULONG SessionId);
 
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-FsRtlFastUnlockAllByKey (
-    IN PFILE_LOCK           FileLock,
-    IN PFILE_OBJECT         FileObject,
-    IN PEPROCESS            Process,
-    IN ULONG                Key,
-    IN PVOID                Context OPTIONAL
-);
-/* ret: STATUS_RANGE_NOT_LOCKED */
+SeAuditHardLinkCreationWithTransaction(
+  IN PUNICODE_STRING FileName,
+  IN PUNICODE_STRING LinkName,
+  IN BOOLEAN bSuccess,
+  IN GUID *TransactionId OPTIONAL);
 
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-FsRtlFastUnlockSingle (
-    IN PFILE_LOCK           FileLock,
-    IN PFILE_OBJECT         FileObject,
-    IN PLARGE_INTEGER       FileOffset,
-    IN PLARGE_INTEGER       Length,
-    IN PEPROCESS            Process,
-    IN ULONG                Key,
-    IN PVOID                Context OPTIONAL,
-    IN BOOLEAN              AlreadySynchronized
-);
-/* ret:  STATUS_RANGE_NOT_LOCKED */
+SeAuditTransactionStateChange(
+  IN GUID *TransactionId,
+  IN GUID *ResourceManagerId,
+  IN ULONG NewTransactionState);
 
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA || (NTDDI_VERSION >= NTDDI_WINXPSP2 && NTDDI_VERSION < NTDDI_WS03))
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlFindInTunnelCache (
-    IN PTUNNEL          Cache,
-    IN ULONGLONG        DirectoryKey,
-    IN PUNICODE_STRING  Name,
-    OUT PUNICODE_STRING ShortName,
-    OUT PUNICODE_STRING LongName,
-    IN OUT PULONG       DataLength,
-    OUT PVOID           Data
-);
+SeTokenIsWriteRestricted(
+  IN PACCESS_TOKEN Token);
+#endif
 
-#if (VER_PRODUCTBUILD >= 2195)
+#if (NTDDI_VERSION >= NTDDI_WIN7)
 
 NTKERNELAPI
-VOID
+BOOLEAN
 NTAPI
-FsRtlFreeFileLock (
-    IN PFILE_LOCK FileLock
-);
+SeAuditingAnyFileEventsWithContext(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL);
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+NTKERNELAPI
+VOID
+NTAPI
+SeExamineGlobalSacl(
+  IN PUNICODE_STRING ObjectType,
+  IN PACCESS_TOKEN Token,
+  IN ACCESS_MASK DesiredAccess,
+  IN BOOLEAN AccessGranted,
+  IN OUT PBOOLEAN GenerateAudit,
+  IN OUT PBOOLEAN GenerateAlarm OPTIONAL);
 
 NTKERNELAPI
+VOID
+NTAPI
+SeMaximumAuditMaskFromGlobalSacl(
+  IN PUNICODE_STRING ObjectTypeName OPTIONAL,
+  IN ACCESS_MASK GrantedAccess,
+  IN PACCESS_TOKEN Token,
+  IN OUT PACCESS_MASK AuditMask);
+
+#endif
+
 NTSTATUS
 NTAPI
-FsRtlGetFileSize (
-    IN PFILE_OBJECT         FileObject,
-    IN OUT PLARGE_INTEGER   FileSize
-);
+SeReportSecurityEventWithSubCategory(
+  IN ULONG Flags,
+  IN PUNICODE_STRING SourceName,
+  IN PSID UserSid OPTIONAL,
+  IN PSE_ADT_PARAMETER_ARRAY AuditParameters,
+  IN ULONG AuditSubcategoryId);
 
-NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlGetNextBaseMcbEntry (
-    IN PBASE_MCB   Mcb,
-    IN ULONG       RunIndex,
-    OUT PLONGLONG  Vbn,
-    OUT PLONGLONG  Lbn,
-    OUT PLONGLONG  SectorCount
-);
+SeAccessCheckFromState(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PTOKEN_ACCESS_INFORMATION PrimaryTokenInformation,
+  IN PTOKEN_ACCESS_INFORMATION ClientTokenInformation OPTIONAL,
+  IN ACCESS_MASK DesiredAccess,
+  IN ACCESS_MASK PreviouslyGrantedAccess,
+  OUT PPRIVILEGE_SET *Privileges OPTIONAL,
+  IN PGENERIC_MAPPING GenericMapping,
+  IN KPROCESSOR_MODE AccessMode,
+  OUT PACCESS_MASK GrantedAccess,
+  OUT PNTSTATUS AccessStatus);
 
-/*
-  FsRtlGetNextFileLock:
+NTKERNELAPI
+VOID
+NTAPI
+SeFreePrivileges(
+  IN PPRIVILEGE_SET Privileges);
 
-  ret: NULL if no more locks
+NTSTATUS
+NTAPI
+SeLocateProcessImageName(
+  IN OUT PEPROCESS Process,
+  OUT PUNICODE_STRING *pImageFileName);
+
+extern NTKERNELAPI PSE_EXPORTS SeExports;
+
+#if !defined(_PSGETCURRENTTHREAD_)
+#define _PSGETCURRENTTHREAD_
+
+FORCEINLINE
+PETHREAD
+PsGetCurrentThread(
+  VOID)
+{
+  return (PETHREAD)KeGetCurrentThread();
+}
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
-  Internals:
-    FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and
-    FileLock->LastReturnedLock as storage.
-    LastReturnedLock is a pointer to the 'raw' lock inkl. double linked
-    list, and FsRtlGetNextFileLock needs this to get next lock on subsequent
-    calls with Restart = FALSE.
-*/
 NTKERNELAPI
-PFILE_LOCK_INFO
+PACCESS_TOKEN
 NTAPI
-FsRtlGetNextFileLock (
-    IN PFILE_LOCK   FileLock,
-    IN BOOLEAN      Restart
-);
+PsReferenceImpersonationToken(
+  IN OUT PETHREAD Thread,
+  OUT PBOOLEAN CopyOnOpen,
+  OUT PBOOLEAN EffectiveOnly,
+  OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
 
 NTKERNELAPI
-BOOLEAN
+LARGE_INTEGER
 NTAPI
-FsRtlGetNextLargeMcbEntry (
-    IN PLARGE_MCB  Mcb,
-    IN ULONG       RunIndex,
-    OUT PLONGLONG  Vbn,
-    OUT PLONGLONG  Lbn,
-    OUT PLONGLONG  SectorCount
-);
+PsGetProcessExitTime(
+  VOID);
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlGetNextMcbEntry (
-    IN PMCB     Mcb,
-    IN ULONG    RunIndex,
-    OUT PVBN    Vbn,
-    OUT PLBN    Lbn,
-    OUT PULONG  SectorCount
-);
+PsIsThreadTerminating(
+  IN PETHREAD Thread);
 
-#define FsRtlGetPerStreamContextPointer(FO) (   \
-    (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \
-)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsImpersonateClient(
+  IN OUT PETHREAD Thread,
+  IN PACCESS_TOKEN Token,
+  IN BOOLEAN CopyOnOpen,
+  IN BOOLEAN EffectiveOnly,
+  IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
 
 NTKERNELAPI
-VOID
+BOOLEAN
 NTAPI
-FsRtlInitializeBaseMcb (
-    IN PBASE_MCB  Mcb,
-    IN POOL_TYPE  PoolType
-);
+PsDisableImpersonation(
+  IN OUT PETHREAD Thread,
+  IN OUT PSE_IMPERSONATION_STATE ImpersonationState);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlInitializeFileLock (
-    IN PFILE_LOCK                   FileLock,
-    IN PCOMPLETE_LOCK_IRP_ROUTINE   CompleteLockIrpRoutine OPTIONAL,
-    IN PUNLOCK_ROUTINE              UnlockRoutine OPTIONAL
-);
+PsRestoreImpersonation(
+  IN PETHREAD Thread,
+  IN PSE_IMPERSONATION_STATE ImpersonationState);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlInitializeLargeMcb (
-    IN PLARGE_MCB  Mcb,
-    IN POOL_TYPE   PoolType
-);
+PsRevertToSelf(
+  VOID);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlInitializeMcb (
-    IN PMCB       Mcb,
-    IN POOL_TYPE  PoolType
-);
+PsChargePoolQuota(
+  IN PEPROCESS Process,
+  IN POOL_TYPE PoolType,
+  IN ULONG_PTR Amount);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlInitializeOplock (
-    IN OUT POPLOCK Oplock
-);
+PsReturnPoolQuota(
+  IN PEPROCESS Process,
+  IN POOL_TYPE PoolType,
+  IN ULONG_PTR Amount);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlInitializeTunnelCache (
-    IN PTUNNEL Cache
-);
+PsDereferencePrimaryToken(
+  IN PACCESS_TOKEN PrimaryToken);
 
-#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \
-    (PSC)->OwnerId = (O),                          \
-    (PSC)->InstanceId = (I),                       \
-    (PSC)->FreeCallback = (FC)                     \
-)
+NTKERNELAPI
+VOID
+NTAPI
+PsDereferenceImpersonationToken(
+  IN PACCESS_TOKEN ImpersonationToken);
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-FsRtlInsertPerStreamContext (
-    IN PFSRTL_ADVANCED_FCB_HEADER  PerStreamContext,
-    IN PFSRTL_PER_STREAM_CONTEXT   Ptr
-);
+PsChargeProcessPoolQuota(
+  IN PEPROCESS Process,
+  IN POOL_TYPE PoolType,
+  IN ULONG_PTR Amount);
 
-#define FsRtlIsAnsiCharacterLegalFat(C, WILD) (                                \
-    FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) |       \
-                                        ((WILD) ? FSRTL_WILD_CHARACTER : 0 ))  \
-)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PsIsSystemThread(
+  IN PETHREAD Thread);
 
-#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) (                               \
-    FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) |      \
-                                        ((WILD) ? FSRTL_WILD_CHARACTER : 0 ))  \
-)
+#endif
 
-#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) (                               \
-    FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) |      \
-                                        ((WILD) ? FSRTL_WILD_CHARACTER : 0 ))  \
-)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsLookupProcessByProcessId(
+  IN HANDLE ProcessId,
+  OUT PEPROCESS *Process);
 
-#define FsRtlIsAnsiCharacterWild(C) (                                       \
-    FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \
-)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsLookupThreadByThreadId(
+  IN HANDLE UniqueThreadId,
+  OUT PETHREAD *Thread);
+
+#define IO_OPEN_PAGING_FILE             0x0002
+#define IO_OPEN_TARGET_DIRECTORY        0x0004
+#define IO_STOP_ON_SYMLINK              0x0008
+#define IO_MM_PAGING_FILE               0x0010
+
+typedef VOID
+(NTAPI *PDRIVER_FS_NOTIFICATION) (
+  IN PDEVICE_OBJECT DeviceObject,
+  IN BOOLEAN FsActive);
+
+typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
+  SyncTypeOther = 0,
+  SyncTypeCreateSection
+} FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
+
+typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
+  NotifyTypeCreate = 0,
+  NotifyTypeRetired
+} FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
+
+typedef union _FS_FILTER_PARAMETERS {
+  struct {
+    PLARGE_INTEGER EndingOffset;
+    PERESOURCE *ResourceToRelease;
+  } AcquireForModifiedPageWriter;
+  struct {
+    PERESOURCE ResourceToRelease;
+  } ReleaseForModifiedPageWriter;
+  struct {
+    FS_FILTER_SECTION_SYNC_TYPE SyncType;
+    ULONG PageProtection;
+  } AcquireForSectionSynchronization;
+  struct {
+    FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
+    BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
+  } NotifyStreamFileObject;
+  struct {
+    PVOID Argument1;
+    PVOID Argument2;
+    PVOID Argument3;
+    PVOID Argument4;
+    PVOID Argument5;
+  } Others;
+} FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
+
+#define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION      (UCHAR)-1
+#define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION      (UCHAR)-2
+#define FS_FILTER_ACQUIRE_FOR_MOD_WRITE                    (UCHAR)-3
+#define FS_FILTER_RELEASE_FOR_MOD_WRITE                    (UCHAR)-4
+#define FS_FILTER_ACQUIRE_FOR_CC_FLUSH                     (UCHAR)-5
+#define FS_FILTER_RELEASE_FOR_CC_FLUSH                     (UCHAR)-6
+
+typedef struct _FS_FILTER_CALLBACK_DATA {
+  ULONG SizeOfFsFilterCallbackData;
+  UCHAR Operation;
+  UCHAR Reserved;
+  struct _DEVICE_OBJECT *DeviceObject;
+  struct _FILE_OBJECT *FileObject;
+  FS_FILTER_PARAMETERS Parameters;
+} FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
+
+typedef NTSTATUS
+(NTAPI *PFS_FILTER_CALLBACK) (
+  IN PFS_FILTER_CALLBACK_DATA Data,
+  OUT PVOID *CompletionContext);
 
+typedef VOID
+(NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
+  IN PFS_FILTER_CALLBACK_DATA Data,
+  IN NTSTATUS OperationStatus,
+  IN PVOID CompletionContext);
+
+typedef struct _FS_FILTER_CALLBACKS {
+  ULONG SizeOfFsFilterCallbacks;
+  ULONG Reserved;
+  PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization;
+  PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
+  PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization;
+  PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
+  PFS_FILTER_CALLBACK PreAcquireForCcFlush;
+  PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
+  PFS_FILTER_CALLBACK PreReleaseForCcFlush;
+  PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
+  PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter;
+  PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
+  PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter;
+  PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
+} FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-FsRtlIsFatDbcsLegal (
-    IN ANSI_STRING  DbcsName,
-    IN BOOLEAN      WildCardsPermissible,
-    IN BOOLEAN      PathNamePermissible,
-    IN BOOLEAN      LeadingBackslashPermissible
-);
+FsRtlRegisterFileSystemFilterCallbacks(
+  IN struct _DRIVER_OBJECT *FilterDriverObject,
+  IN PFS_FILTER_CALLBACKS Callbacks);
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
 
+#if (NTDDI_VERSION >= NTDDI_VISTA)
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-FsRtlIsHpfsDbcsLegal (
-    IN ANSI_STRING  DbcsName,
-    IN BOOLEAN      WildCardsPermissible,
-    IN BOOLEAN      PathNamePermissible,
-    IN BOOLEAN      LeadingBackslashPermissible
-);
+FsRtlNotifyStreamFileObject(
+  IN struct _FILE_OBJECT * StreamFileObject,
+  IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL,
+  IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType,
+  IN BOOLEAN SafeToRecurse);
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#define DO_VERIFY_VOLUME                    0x00000002
+#define DO_BUFFERED_IO                      0x00000004
+#define DO_EXCLUSIVE                        0x00000008
+#define DO_DIRECT_IO                        0x00000010
+#define DO_MAP_IO_BUFFER                    0x00000020
+#define DO_DEVICE_HAS_NAME                  0x00000040
+#define DO_DEVICE_INITIALIZING              0x00000080
+#define DO_SYSTEM_BOOT_PARTITION            0x00000100
+#define DO_LONG_TERM_REQUESTS               0x00000200
+#define DO_NEVER_LAST_DEVICE                0x00000400
+#define DO_SHUTDOWN_REGISTERED              0x00000800
+#define DO_BUS_ENUMERATED_DEVICE            0x00001000
+#define DO_POWER_PAGABLE                    0x00002000
+#define DO_POWER_INRUSH                     0x00004000
+#define DO_LOW_PRIORITY_FILESYSTEM          0x00010000
+#define DO_SUPPORTS_TRANSACTIONS            0x00040000
+#define DO_FORCE_NEITHER_IO                 0x00080000
+#define DO_VOLUME_DEVICE_OBJECT             0x00100000
+#define DO_SYSTEM_SYSTEM_PARTITION          0x00200000
+#define DO_SYSTEM_CRITICAL_PARTITION        0x00400000
+#define DO_DISALLOW_EXECUTE                 0x00800000
+
+extern KSPIN_LOCK                   IoStatisticsLock;
+extern ULONG                        IoReadOperationCount;
+extern ULONG                        IoWriteOperationCount;
+extern ULONG                        IoOtherOperationCount;
+extern LARGE_INTEGER                IoReadTransferCount;
+extern LARGE_INTEGER                IoWriteTransferCount;
+extern LARGE_INTEGER                IoOtherTransferCount;
+
+#define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE    64
+#define IO_FILE_OBJECT_PAGED_POOL_CHARGE        1024
 
+#if (NTDDI_VERSION == NTDDI_WIN2K)
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-FsRtlIsNameInExpression (
-    IN PUNICODE_STRING  Expression,
-    IN PUNICODE_STRING  Name,
-    IN BOOLEAN          IgnoreCase,
-    IN PWCHAR           UpcaseTable OPTIONAL
-);
+IoRegisterFsRegistrationChangeEx(
+  IN PDRIVER_OBJECT DriverObject,
+  IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
 NTKERNELAPI
-BOOLEAN
+VOID
 NTAPI
-FsRtlIsNtstatusExpected (
-    IN NTSTATUS Ntstatus
-);
+IoAcquireVpbSpinLock(
+  OUT PKIRQL Irql);
 
-#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckDesiredAccess(
+  IN OUT PACCESS_MASK DesiredAccess,
+  IN ACCESS_MASK GrantedAccess);
 
-extern PUSHORT NlsOemLeadByteInfo;
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckEaBufferValidity(
+  IN PFILE_FULL_EA_INFORMATION EaBuffer,
+  IN ULONG EaLength,
+  OUT PULONG ErrorOffset);
 
-#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) (                               \
-    (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE :                           \
-              (NLS_MB_CODE_PAGE_TAG &&                                      \
-               (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0)))          \
-)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckFunctionAccess(
+  IN ACCESS_MASK GrantedAccess,
+  IN UCHAR MajorFunction,
+  IN UCHAR MinorFunction,
+  IN ULONG IoControlCode,
+  IN PVOID Argument1 OPTIONAL,
+  IN PVOID Argument2 OPTIONAL);
 
-#define FsRtlIsUnicodeCharacterWild(C) (                                    \
-    (((C) >= 0x40) ?                                                        \
-    FALSE :                                                                 \
-    FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER ))       \
-)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckQuerySetFileInformation(
+  IN FILE_INFORMATION_CLASS FileInformationClass,
+  IN ULONG Length,
+  IN BOOLEAN SetOperation);
 
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-FsRtlLookupBaseMcbEntry (
-    IN PBASE_MCB   Mcb,
-    IN LONGLONG    Vbn,
-    OUT PLONGLONG  Lbn OPTIONAL,
-    OUT PLONGLONG  SectorCountFromLbn OPTIONAL,
-    OUT PLONGLONG  StartingLbn OPTIONAL,
-    OUT PLONGLONG  SectorCountFromStartingLbn OPTIONAL,
-    OUT PULONG     Index OPTIONAL
-);
+IoCheckQuerySetVolumeInformation(
+  IN FS_INFORMATION_CLASS FsInformationClass,
+  IN ULONG Length,
+  IN BOOLEAN SetOperation);
 
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-FsRtlLookupLargeMcbEntry (
-    IN PLARGE_MCB  Mcb,
-    IN LONGLONG    Vbn,
-    OUT PLONGLONG  Lbn OPTIONAL,
-    OUT PLONGLONG  SectorCountFromLbn OPTIONAL,
-    OUT PLONGLONG  StartingLbn OPTIONAL,
-    OUT PLONGLONG  SectorCountFromStartingLbn OPTIONAL,
-    OUT PULONG     Index OPTIONAL
-);
+IoCheckQuotaBufferValidity(
+  IN PFILE_QUOTA_INFORMATION QuotaBuffer,
+  IN ULONG QuotaLength,
+  OUT PULONG ErrorOffset);
 
 NTKERNELAPI
-BOOLEAN
+PFILE_OBJECT
 NTAPI
-FsRtlLookupLastBaseMcbEntry (
-    IN PBASE_MCB   Mcb,
-    OUT PLONGLONG  Vbn,
-    OUT PLONGLONG  Lbn
-);
+IoCreateStreamFileObject(
+  IN PFILE_OBJECT FileObject OPTIONAL,
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL);
 
 NTKERNELAPI
-BOOLEAN
+PFILE_OBJECT
 NTAPI
-FsRtlLookupLastLargeMcbEntry (
-    IN PLARGE_MCB  Mcb,
-    OUT PLONGLONG  Vbn,
-    OUT PLONGLONG  Lbn
-);
+IoCreateStreamFileObjectLite(
+  IN PFILE_OBJECT FileObject OPTIONAL,
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL);
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlLookupLastMcbEntry (
-    IN PMCB   Mcb,
-    OUT PVBN  Vbn,
-    OUT PLBN  Lbn
-);
+IoFastQueryNetworkAttributes(
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN ACCESS_MASK DesiredAccess,
+  IN ULONG OpenOptions,
+  OUT PIO_STATUS_BLOCK IoStatus,
+  OUT PFILE_NETWORK_OPEN_INFORMATION Buffer);
 
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-FsRtlLookupLastBaseMcbEntryAndIndex (
-    IN PBASE_MCB      OpaqueMcb,
-    IN OUT PLONGLONG  LargeVbn,
-    IN OUT PLONGLONG  LargeLbn,
-    IN OUT PULONG     Index
-);
+IoPageRead(
+  IN PFILE_OBJECT FileObject,
+  IN PMDL Mdl,
+  IN PLARGE_INTEGER Offset,
+  IN PKEVENT Event,
+  OUT PIO_STATUS_BLOCK IoStatusBlock);
 
 NTKERNELAPI
-BOOLEAN
+PDEVICE_OBJECT
 NTAPI
-FsRtlLookupLastLargeMcbEntryAndIndex (
-    IN PLARGE_MCB  OpaqueMcb,
-    OUT PLONGLONG  LargeVbn,
-    OUT PLONGLONG  LargeLbn,
-    OUT PULONG     Index
-);
+IoGetAttachedDevice(
+  IN PDEVICE_OBJECT DeviceObject);
 
 NTKERNELAPI
-BOOLEAN
+PDEVICE_OBJECT
 NTAPI
-FsRtlLookupMcbEntry (
-    IN PMCB     Mcb,
-    IN VBN      Vbn,
-    OUT PLBN    Lbn,
-    OUT PULONG  SectorCount OPTIONAL,
-    OUT PULONG  Index
-);
+IoGetAttachedDeviceReference(
+  IN PDEVICE_OBJECT DeviceObject);
 
 NTKERNELAPI
-PFSRTL_PER_STREAM_CONTEXT
+PDEVICE_OBJECT
 NTAPI
-FsRtlLookupPerStreamContextInternal (
-    IN PFSRTL_ADVANCED_FCB_HEADER  StreamContext,
-    IN PVOID                       OwnerId OPTIONAL,
-    IN PVOID                       InstanceId OPTIONAL
-);
+IoGetBaseFileSystemDeviceObject(
+  IN PFILE_OBJECT FileObject);
 
 NTKERNELAPI
-BOOLEAN
+PCONFIGURATION_INFORMATION
 NTAPI
-FsRtlMdlReadDev (
-    IN PFILE_OBJECT       FileObject,
-    IN PLARGE_INTEGER     FileOffset,
-    IN ULONG              Length,
-    IN ULONG              LockKey,
-    OUT PMDL              *MdlChain,
-    OUT PIO_STATUS_BLOCK  IoStatus,
-    IN PDEVICE_OBJECT     DeviceObject
-);
+IoGetConfigurationInformation(
+  VOID);
 
 NTKERNELAPI
-BOOLEAN
+ULONG
 NTAPI
-FsRtlMdlReadComplete (
-    IN PFILE_OBJECT     FileObject,
-    IN PMDL             MdlChain
-);
+IoGetRequestorProcessId(
+  IN PIRP Irp);
 
 NTKERNELAPI
-BOOLEAN
+PEPROCESS
 NTAPI
-FsRtlMdlReadCompleteDev (
-    IN PFILE_OBJECT     FileObject,
-    IN PMDL             MdlChain,
-    IN PDEVICE_OBJECT   DeviceObject
-);
+IoGetRequestorProcess(
+  IN PIRP Irp);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoGetTopLevelIrp(
+  VOID);
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlPrepareMdlWriteDev (
-    IN PFILE_OBJECT       FileObject,
-    IN PLARGE_INTEGER     FileOffset,
-    IN ULONG              Length,
-    IN ULONG              LockKey,
-    OUT PMDL              *MdlChain,
-    OUT PIO_STATUS_BLOCK  IoStatus,
-    IN PDEVICE_OBJECT     DeviceObject
-);
+IoIsOperationSynchronous(
+  IN PIRP Irp);
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlMdlWriteComplete (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN PMDL             MdlChain
-);
+IoIsSystemThread(
+  IN PETHREAD Thread);
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlMdlWriteCompleteDev (
-    IN PFILE_OBJECT     FileObject,
-    IN PLARGE_INTEGER   FileOffset,
-    IN PMDL             MdlChain,
-    IN PDEVICE_OBJECT   DeviceObject
-);
+IoIsValidNameGraftingBuffer(
+  IN PIRP Irp,
+  IN PREPARSE_DATA_BUFFER ReparseBuffer);
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-FsRtlNormalizeNtstatus (
-    IN NTSTATUS Exception,
-    IN NTSTATUS GenericException
-);
+IoQueryFileInformation(
+  IN PFILE_OBJECT FileObject,
+  IN FILE_INFORMATION_CLASS FileInformationClass,
+  IN ULONG Length,
+  OUT PVOID FileInformation,
+  OUT PULONG ReturnedLength);
 
 NTKERNELAPI
-VOID
+NTSTATUS
 NTAPI
-FsRtlNotifyChangeDirectory (
-    IN PNOTIFY_SYNC NotifySync,
-    IN PVOID        FsContext,
-    IN PSTRING      FullDirectoryName,
-    IN PLIST_ENTRY  NotifyList,
-    IN BOOLEAN      WatchTree,
-    IN ULONG        CompletionFilter,
-    IN PIRP         NotifyIrp
-);
+IoQueryVolumeInformation(
+  IN PFILE_OBJECT FileObject,
+  IN FS_INFORMATION_CLASS FsInformationClass,
+  IN ULONG Length,
+  OUT PVOID FsInformation,
+  OUT PULONG ReturnedLength);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlNotifyCleanup (
-    IN PNOTIFY_SYNC NotifySync,
-    IN PLIST_ENTRY  NotifyList,
-    IN PVOID        FsContext
-);
-
-typedef BOOLEAN (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) (
-    IN PVOID                        NotifyContext,
-    IN PVOID                        TargetContext,
-    IN PSECURITY_SUBJECT_CONTEXT    SubjectContext
-);
+IoQueueThreadIrp(
+  IN PIRP Irp);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlNotifyFilterChangeDirectory (
-    IN PNOTIFY_SYNC                 NotifySync,
-    IN PLIST_ENTRY                  NotifyList,
-    IN PVOID                        FsContext,
-    IN PSTRING                      FullDirectoryName,
-    IN BOOLEAN                      WatchTree,
-    IN BOOLEAN                      IgnoreBuffer,
-    IN ULONG                        CompletionFilter,
-    IN PIRP                         NotifyIrp,
-    IN PCHECK_FOR_TRAVERSE_ACCESS   TraverseCallback OPTIONAL,
-    IN PSECURITY_SUBJECT_CONTEXT    SubjectContext OPTIONAL,
-    IN PFILTER_REPORT_CHANGE        FilterCallback OPTIONAL);
+IoRegisterFileSystem(
+  IN PDEVICE_OBJECT DeviceObject);
 
 NTKERNELAPI
-VOID
+NTSTATUS
 NTAPI
-FsRtlNotifyFilterReportChange (
-    IN PNOTIFY_SYNC   NotifySync,
-    IN PLIST_ENTRY    NotifyList,
-    IN PSTRING        FullTargetName,
-    IN USHORT         TargetNameOffset,
-    IN PSTRING        StreamName OPTIONAL,
-    IN PSTRING        NormalizedParentName OPTIONAL,
-    IN ULONG          FilterMatch,
-    IN ULONG          Action,
-    IN PVOID          TargetContext,
-    IN PVOID          FilterContext);
+IoRegisterFsRegistrationChange(
+  IN PDRIVER_OBJECT DriverObject,
+  IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlNotifyFullChangeDirectory (
-    IN PNOTIFY_SYNC                 NotifySync,
-    IN PLIST_ENTRY                  NotifyList,
-    IN PVOID                        FsContext,
-    IN PSTRING                      FullDirectoryName,
-    IN BOOLEAN                      WatchTree,
-    IN BOOLEAN                      IgnoreBuffer,
-    IN ULONG                        CompletionFilter,
-    IN PIRP                         NotifyIrp,
-    IN PCHECK_FOR_TRAVERSE_ACCESS   TraverseCallback OPTIONAL,
-    IN PSECURITY_SUBJECT_CONTEXT    SubjectContext OPTIONAL
-);
+IoReleaseVpbSpinLock(
+  IN KIRQL Irql);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlNotifyFullReportChange (
-    IN PNOTIFY_SYNC NotifySync,
-    IN PLIST_ENTRY  NotifyList,
-    IN PSTRING      FullTargetName,
-    IN USHORT       TargetNameOffset,
-    IN PSTRING      StreamName OPTIONAL,
-    IN PSTRING      NormalizedParentName OPTIONAL,
-    IN ULONG        FilterMatch,
-    IN ULONG        Action,
-    IN PVOID        TargetContext
-);
+IoSetDeviceToVerify(
+  IN PETHREAD Thread,
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetInformation(
+  IN PFILE_OBJECT FileObject,
+  IN FILE_INFORMATION_CLASS FileInformationClass,
+  IN ULONG Length,
+  IN PVOID FileInformation);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlNotifyInitializeSync (
-    IN PNOTIFY_SYNC *NotifySync
-);
+IoSetTopLevelIrp(
+  IN PIRP Irp OPTIONAL);
 
 NTKERNELAPI
 VOID
 NTAPI
-FsRtlNotifyUninitializeSync (
-    IN PNOTIFY_SYNC *NotifySync
-);
+IoStartNextPacket(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN BOOLEAN Cancelable);
 
-#if (VER_PRODUCTBUILD >= 2195)
+NTKERNELAPI
+VOID
+NTAPI
+IoStartNextPacketByKey(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN BOOLEAN Cancelable,
+  IN ULONG Key);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartPacket(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PIRP Irp,
+  IN PULONG Key OPTIONAL,
+  IN PDRIVER_CANCEL CancelFunction OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartTimer(
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStopTimer(
+  IN PDEVICE_OBJECT DeviceObject);
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-FsRtlNotifyVolumeEvent (
-    IN PFILE_OBJECT FileObject,
-    IN ULONG        EventCode
-);
+IoSynchronousPageWrite(
+  IN PFILE_OBJECT FileObject,
+  IN PMDL Mdl,
+  IN PLARGE_INTEGER FileOffset,
+  IN PKEVENT Event,
+  OUT PIO_STATUS_BLOCK IoStatusBlock);
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+NTKERNELAPI
+PEPROCESS
+NTAPI
+IoThreadToProcess(
+  IN PETHREAD Thread);
 
 NTKERNELAPI
-ULONG
+VOID
 NTAPI
-FsRtlNumberOfRunsInBaseMcb (
-    IN PBASE_MCB Mcb
-);
+IoUnregisterFileSystem(
+  IN PDEVICE_OBJECT DeviceObject);
 
 NTKERNELAPI
-ULONG
+VOID
 NTAPI
-FsRtlNumberOfRunsInLargeMcb (
-    IN PLARGE_MCB Mcb
-);
+IoUnregisterFsRegistrationChange(
+  IN PDRIVER_OBJECT DriverObject,
+  IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
 
 NTKERNELAPI
-ULONG
+NTSTATUS
 NTAPI
-FsRtlNumberOfRunsInMcb (
-    IN PMCB Mcb
-);
+IoVerifyVolume(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN BOOLEAN AllowRawMount);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoWriteErrorLogEntry(
+  IN PVOID ElEntry);
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-FsRtlOplockFsctrl (
-    IN POPLOCK  Oplock,
-    IN PIRP     Irp,
-    IN ULONG    OpenCount
-);
+IoGetRequestorSessionId(
+  IN PIRP Irp,
+  OUT PULONG pSessionId);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+PFILE_OBJECT
+NTAPI
+IoCreateStreamFileObjectEx(
+  IN PFILE_OBJECT FileObject OPTIONAL,
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+  OUT PHANDLE FileObjectHandle OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoQueryFileDosDeviceName(
+  IN PFILE_OBJECT FileObject,
+  OUT POBJECT_NAME_INFORMATION *ObjectNameInformation);
+
+VOID
+NTAPI
+IoSetStartIoAttributes(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN BOOLEAN DeferredStartIo,
+  IN BOOLEAN NonCancelable);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoEnumerateDeviceObjectList(
+  IN PDRIVER_OBJECT DriverObject,
+  OUT PDEVICE_OBJECT *DeviceObjectList,
+  IN ULONG DeviceObjectListSize,
+  OUT PULONG ActualNumberDeviceObjects);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetLowerDeviceObject(
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetDeviceAttachmentBaseRef(
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDiskDeviceObject(
+  IN PDEVICE_OBJECT FileSystemDeviceObject,
+  OUT PDEVICE_OBJECT *DiskDeviceObject);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoEnumerateRegisteredFiltersList(
+  OUT PDRIVER_OBJECT *DriverObjectList,
+  IN ULONG DriverObjectListSize,
+  OUT PULONG ActualNumberDriverObjects);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+VOID
+FORCEINLINE
+NTAPI
+IoInitializePriorityInfo(
+  IN PIO_PRIORITY_INFO PriorityInfo)
+{
+  PriorityInfo->Size = sizeof(IO_PRIORITY_INFO);
+  PriorityInfo->ThreadPriority = 0xffff;
+  PriorityInfo->IoPriority = IoPriorityNormal;
+  PriorityInfo->PagePriority = 0;
+}
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoRegisterFsRegistrationChangeMountAware(
+  IN PDRIVER_OBJECT DriverObject,
+  IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine,
+  IN BOOLEAN SynchronizeWithMounts);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReplaceFileObjectName(
+  IN PFILE_OBJECT FileObject,
+  IN PWSTR NewFileName,
+  IN USHORT FileNameLength);
+
+#endif
+
+#define IoIsFileOpenedExclusively(FileObject) ( \
+    (BOOLEAN) !(                                \
+    (FileObject)->SharedRead ||                 \
+    (FileObject)->SharedWrite ||                \
+    (FileObject)->SharedDelete                  \
+    )                                           \
+)
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+typedef struct _IO_PRIORITY_INFO {
+  ULONG Size;
+  ULONG ThreadPriority;
+  ULONG PagePriority;
+  IO_PRIORITY_HINT IoPriority;
+} IO_PRIORITY_INFO, *PIO_PRIORITY_INFO;
+#endif
+
+#define PO_CB_SYSTEM_POWER_POLICY       0
+#define PO_CB_AC_STATUS                 1
+#define PO_CB_BUTTON_COLLISION          2
+#define PO_CB_SYSTEM_STATE_LOCK         3
+#define PO_CB_LID_SWITCH_STATE          4
+#define PO_CB_PROCESSOR_POWER_POLICY    5
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+PVOID
+NTAPI
+PoRegisterSystemState(
+  IN OUT PVOID StateHandle OPTIONAL,
+  IN EXECUTION_STATE Flags);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoUnregisterSystemState(
+  IN OUT PVOID StateHandle);
+
+NTKERNELAPI
+POWER_STATE
+NTAPI
+PoSetPowerState(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN POWER_STATE_TYPE Type,
+  IN POWER_STATE State);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoCallDriver(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoStartNextPowerIrp(
+  IN OUT PIRP Irp);
+
+NTKERNELAPI
+PULONG
+NTAPI
+PoRegisterDeviceForIdleDetection(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN ULONG ConservationIdleTime,
+  IN ULONG PerformanceIdleTime,
+  IN DEVICE_POWER_STATE State);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoQueueShutdownWorkItem(
+  IN OUT PWORK_QUEUE_ITEM WorkItem);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoRegisterPowerSettingCallback(
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+  IN LPCGUID SettingGuid,
+  IN PPOWER_SETTING_CALLBACK Callback,
+  IN PVOID Context OPTIONAL,
+  OUT PVOID *Handle);
+
+NTKERNELAPI
+NTSTATUS
+PoUnregisterPowerSettingCallback(
+  IN OUT PVOID Handle);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN6SP1)
+NTKERNELAPI
+VOID
+NTAPI
+PoSetDeviceBusyEx(
+  IN OUT PULONG IdlePointer);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoCreatePowerRequest(
+  OUT PVOID *PowerRequest,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PCOUNTED_REASON_CONTEXT Context);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoSetPowerRequest(
+  IN OUT PVOID PowerRequest,
+  IN POWER_REQUEST_TYPE Type);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoClearPowerRequest(
+  IN OUT PVOID PowerRequest,
+  IN POWER_REQUEST_TYPE Type);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoDeletePowerRequest(
+  IN OUT PVOID PowerRequest);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoStartDeviceBusy(
+  IN OUT PULONG IdlePointer);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoEndDeviceBusy(
+  IN OUT PULONG IdlePointer);
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-FsRtlOplockIsFastIoPossible (
-    IN POPLOCK Oplock
-);
+PoQueryWatchdogTime(
+  IN PDEVICE_OBJECT Pdo,
+  OUT PULONG SecondsRemaining);
 
-typedef VOID
-(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) (
-    IN PVOID    Context,
-    IN PKEVENT  Event
-);
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#if defined(_IA64_)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+ULONG
+NTAPI
+HalGetDmaAlignmentRequirement(
+  VOID);
+#endif
+#endif
+
+#if defined(_M_IX86) || defined(_M_AMD64)
+#define HalGetDmaAlignmentRequirement() 1L
+#endif
+
+typedef enum _MMFLUSH_TYPE {
+  MmFlushForDelete,
+  MmFlushForWrite
+} MMFLUSH_TYPE;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsRecursiveIoFault(
+  VOID);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmForceSectionClosed(
+  IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+  IN BOOLEAN DelayClose);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmFlushImageSection(
+  IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+  IN MMFLUSH_TYPE FlushType);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmCanFileBeTruncated(
+  IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+  IN PLARGE_INTEGER NewFileSize OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmSetAddressRangeModified(
+  IN PVOID Address,
+  IN SIZE_T Length);
+
+#endif
+
+typedef struct _READ_LIST {
+  PFILE_OBJECT FileObject;
+  ULONG NumberOfEntries;
+  LOGICAL IsImage;
+  FILE_SEGMENT_ELEMENT List[ANYSIZE_ARRAY];
+} READ_LIST, *PREAD_LIST;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+typedef union _MM_PREFETCH_FLAGS {
+  struct {
+    ULONG Priority : SYSTEM_PAGE_PRIORITY_BITS;
+    ULONG RepurposePriority : SYSTEM_PAGE_PRIORITY_BITS;
+  } Flags;
+  ULONG AllFlags;
+} MM_PREFETCH_FLAGS, *PMM_PREFETCH_FLAGS;
+
+#define MM_PREFETCH_FLAGS_MASK ((1 << (2*SYSTEM_PAGE_PRIORITY_BITS)) - 1)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmPrefetchPages(
+  IN ULONG NumberOfLists,
+  IN PREAD_LIST *ReadLists);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTKERNELAPI
+ULONG
+NTAPI
+MmDoesFileHaveUserWritableReferences(
+  IN PSECTION_OBJECT_POINTERS SectionPointer);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObInsertObject(
+  IN PVOID Object,
+  IN OUT PACCESS_STATE PassedAccessState OPTIONAL,
+  IN ACCESS_MASK DesiredAccess OPTIONAL,
+  IN ULONG ObjectPointerBias,
+  OUT PVOID *NewObject OPTIONAL,
+  OUT PHANDLE Handle OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObOpenObjectByPointer(
+  IN PVOID Object,
+  IN ULONG HandleAttributes,
+  IN PACCESS_STATE PassedAccessState OPTIONAL,
+  IN ACCESS_MASK DesiredAccess OPTIONAL,
+  IN POBJECT_TYPE ObjectType OPTIONAL,
+  IN KPROCESSOR_MODE AccessMode,
+  OUT PHANDLE Handle);
+
+NTKERNELAPI
+VOID
+NTAPI
+ObMakeTemporaryObject(
+  IN PVOID Object);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObQueryNameString(
+  IN PVOID Object,
+  OUT POBJECT_NAME_INFORMATION ObjectNameInfo OPTIONAL,
+  IN ULONG Length,
+  OUT PULONG ReturnLength);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObQueryObjectAuditingByHandle(
+  IN HANDLE Handle,
+  OUT PBOOLEAN GenerateOnClose);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ObIsKernelHandle(
+  IN HANDLE Handle);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObOpenObjectByPointerWithTag(
+  IN PVOID Object,
+  IN ULONG HandleAttributes,
+  IN PACCESS_STATE PassedAccessState OPTIONAL,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_TYPE ObjectType OPTIONAL,
+  IN KPROCESSOR_MODE AccessMode,
+  IN ULONG Tag,
+  OUT PHANDLE Handle);
+#endif
+
+typedef ULONG LBN;
+typedef LBN *PLBN;
+
+typedef ULONG VBN;
+typedef VBN *PVBN;
+
+typedef enum _FAST_IO_POSSIBLE {
+  FastIoIsNotPossible = 0,
+  FastIoIsPossible,
+  FastIoIsQuestionable
+} FAST_IO_POSSIBLE;
+
+typedef struct _FSRTL_COMMON_FCB_HEADER {
+  CSHORT NodeTypeCode;
+  CSHORT NodeByteSize;
+  UCHAR Flags;
+  UCHAR IsFastIoPossible;
+  UCHAR Flags2;
+  UCHAR Reserved:4;
+  UCHAR Version:4;
+  PERESOURCE Resource;
+  PERESOURCE PagingIoResource;
+  LARGE_INTEGER AllocationSize;
+  LARGE_INTEGER FileSize;
+  LARGE_INTEGER ValidDataLength;
+} FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER;
+
+#ifdef __cplusplus
+typedef struct _FSRTL_ADVANCED_FCB_HEADER:FSRTL_COMMON_FCB_HEADER {
+#else /* __cplusplus */
+typedef struct _FSRTL_ADVANCED_FCB_HEADER {
+  FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
+#endif  /* __cplusplus */
+  PFAST_MUTEX FastMutex;
+  LIST_ENTRY FilterContexts;
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+  EX_PUSH_LOCK PushLock;
+  PVOID *FileContextSupportPointer;
+#endif
+} FSRTL_ADVANCED_FCB_HEADER, *PFSRTL_ADVANCED_FCB_HEADER;
+
+#define FSRTL_FCB_HEADER_V0             (0x00)
+#define FSRTL_FCB_HEADER_V1             (0x01)
+
+#define FSRTL_FLAG_FILE_MODIFIED        (0x01)
+#define FSRTL_FLAG_FILE_LENGTH_CHANGED  (0x02)
+#define FSRTL_FLAG_LIMIT_MODIFIED_PAGES (0x04)
+#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_EX (0x08)
+#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_SH (0x10)
+#define FSRTL_FLAG_USER_MAPPED_FILE     (0x20)
+#define FSRTL_FLAG_ADVANCED_HEADER      (0x40)
+#define FSRTL_FLAG_EOF_ADVANCE_ACTIVE   (0x80)
+
+#define FSRTL_FLAG2_DO_MODIFIED_WRITE        (0x01)
+#define FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS (0x02)
+#define FSRTL_FLAG2_PURGE_WHEN_MAPPED        (0x04)
+#define FSRTL_FLAG2_IS_PAGING_FILE           (0x08)
+
+#define FSRTL_FSP_TOP_LEVEL_IRP         (0x01)
+#define FSRTL_CACHE_TOP_LEVEL_IRP       (0x02)
+#define FSRTL_MOD_WRITE_TOP_LEVEL_IRP   (0x03)
+#define FSRTL_FAST_IO_TOP_LEVEL_IRP     (0x04)
+#define FSRTL_NETWORK1_TOP_LEVEL_IRP    ((LONG_PTR)0x05)
+#define FSRTL_NETWORK2_TOP_LEVEL_IRP    ((LONG_PTR)0x06)
+#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG    ((LONG_PTR)0xFFFF)
+
+typedef struct _EOF_WAIT_BLOCK {
+  LIST_ENTRY EofWaitLinks;
+  KEVENT Event;
+} EOF_WAIT_BLOCK, *PEOF_WAIT_BLOCK;
+
+typedef struct _FSRTL_AUXILIARY_BUFFER {
+  PVOID Buffer;
+  ULONG Length;
+  ULONG Flags;
+  PMDL Mdl;
+} FSRTL_AUXILIARY_BUFFER, *PFSRTL_AUXILIARY_BUFFER;
+
+#define FSRTL_AUXILIARY_FLAG_DEALLOCATE 0x00000001
+
+typedef struct _FILE_LOCK_INFO {
+  LARGE_INTEGER StartingByte;
+  LARGE_INTEGER Length;
+  BOOLEAN ExclusiveLock;
+  ULONG Key;
+  PFILE_OBJECT FileObject;
+  PVOID ProcessId;
+  LARGE_INTEGER EndingByte;
+} FILE_LOCK_INFO, *PFILE_LOCK_INFO;
+
+typedef NTSTATUS
+(NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) (
+  IN PVOID Context,
+  IN PIRP Irp);
+
+typedef VOID
+(NTAPI *PUNLOCK_ROUTINE) (
+  IN PVOID Context,
+  IN PFILE_LOCK_INFO FileLockInfo);
+
+typedef struct _FILE_LOCK {
+  PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine;
+  PUNLOCK_ROUTINE UnlockRoutine;
+  BOOLEAN FastIoIsQuestionable;
+  BOOLEAN SpareC[3];
+  PVOID LockInformation;
+  FILE_LOCK_INFO LastReturnedLockInfo;
+  PVOID LastReturnedLock;
+  LONG volatile LockRequestsInProgress;
+} FILE_LOCK, *PFILE_LOCK;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCopyRead(
+  IN PFILE_OBJECT FileObject,
+  IN PLARGE_INTEGER FileOffset,
+  IN ULONG Length,
+  IN BOOLEAN Wait,
+  IN ULONG LockKey,
+  OUT PVOID Buffer,
+  OUT PIO_STATUS_BLOCK IoStatus,
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCopyWrite(
+  IN PFILE_OBJECT FileObject,
+  IN PLARGE_INTEGER FileOffset,
+  IN ULONG Length,
+  IN BOOLEAN Wait,
+  IN ULONG LockKey,
+  IN PVOID Buffer,
+  OUT PIO_STATUS_BLOCK IoStatus,
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlMdlReadDev(
+  IN PFILE_OBJECT FileObject,
+  IN PLARGE_INTEGER FileOffset,
+  IN ULONG Length,
+  IN ULONG LockKey,
+  OUT PMDL *MdlChain,
+  OUT PIO_STATUS_BLOCK IoStatus,
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlMdlReadCompleteDev(
+  IN PFILE_OBJECT FileObject,
+  IN PMDL MdlChain,
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlPrepareMdlWriteDev(
+  IN PFILE_OBJECT FileObject,
+  IN PLARGE_INTEGER FileOffset,
+  IN ULONG Length,
+  IN ULONG LockKey,
+  OUT PMDL *MdlChain,
+  OUT PIO_STATUS_BLOCK IoStatus,
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlMdlWriteCompleteDev(
+  IN PFILE_OBJECT FileObject,
+  IN PLARGE_INTEGER FileOffset,
+  IN PMDL MdlChain,
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlAcquireFileExclusive(
+  IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlReleaseFile(
+  IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlGetFileSize(
+  IN PFILE_OBJECT FileObject,
+  OUT PLARGE_INTEGER FileSize);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsTotalDeviceFailure(
+  IN NTSTATUS Status);
+
+NTKERNELAPI
+PFILE_LOCK
+NTAPI
+FsRtlAllocateFileLock(
+  IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,
+  IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlFreeFileLock(
+  IN PFILE_LOCK FileLock);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlInitializeFileLock(
+  IN PFILE_LOCK FileLock,
+  IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,
+  IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlUninitializeFileLock(
+  IN PFILE_LOCK FileLock);
+
+/*
+  FsRtlProcessFileLock:
+
+  ret:
+    -STATUS_INVALID_DEVICE_REQUEST
+    -STATUS_RANGE_NOT_LOCKED from unlock routines.
+    -STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock
+    (redirected IoStatus->Status).
+
+  Internals:
+    -switch ( Irp->CurrentStackLocation->MinorFunction )
+        lock: return FsRtlPrivateLock;
+        unlocksingle: return FsRtlFastUnlockSingle;
+        unlockall: return FsRtlFastUnlockAll;
+        unlockallbykey: return FsRtlFastUnlockAllByKey;
+        default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST;
+                 return STATUS_INVALID_DEVICE_REQUEST;
+
+    -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines.
+    -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock.
+*/
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlProcessFileLock(
+  IN PFILE_LOCK FileLock,
+  IN PIRP Irp,
+  IN PVOID Context OPTIONAL);
+
+/*
+  FsRtlCheckLockForReadAccess:
+
+  All this really does is pick out the lock parameters from the irp (io stack
+  location?), get IoGetRequestorProcess, and pass values on to
+  FsRtlFastCheckLockForRead.
+*/
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCheckLockForReadAccess(
+  IN PFILE_LOCK FileLock,
+  IN PIRP Irp);
+
+/*
+  FsRtlCheckLockForWriteAccess:
+
+  All this really does is pick out the lock parameters from the irp (io stack
+  location?), get IoGetRequestorProcess, and pass values on to
+  FsRtlFastCheckLockForWrite.
+*/
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCheckLockForWriteAccess(
+  IN PFILE_LOCK FileLock,
+  IN PIRP Irp);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlFastCheckLockForRead(
+  IN PFILE_LOCK FileLock,
+  IN PLARGE_INTEGER FileOffset,
+  IN PLARGE_INTEGER Length,
+  IN ULONG Key,
+  IN PFILE_OBJECT FileObject,
+  IN PVOID Process);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlFastCheckLockForWrite(
+  IN PFILE_LOCK FileLock,
+  IN PLARGE_INTEGER FileOffset,
+  IN PLARGE_INTEGER Length,
+  IN ULONG Key,
+  IN PFILE_OBJECT FileObject,
+  IN PVOID Process);
+
+/*
+  FsRtlGetNextFileLock:
+
+  ret: NULL if no more locks
+
+  Internals:
+    FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and
+    FileLock->LastReturnedLock as storage.
+    LastReturnedLock is a pointer to the 'raw' lock inkl. double linked
+    list, and FsRtlGetNextFileLock needs this to get next lock on subsequent
+    calls with Restart = FALSE.
+*/
+NTKERNELAPI
+PFILE_LOCK_INFO
+NTAPI
+FsRtlGetNextFileLock(
+  IN PFILE_LOCK FileLock,
+  IN BOOLEAN Restart);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlFastUnlockSingle(
+  IN PFILE_LOCK FileLock,
+  IN PFILE_OBJECT FileObject,
+  IN PLARGE_INTEGER FileOffset,
+  IN PLARGE_INTEGER Length,
+  IN PEPROCESS Process,
+  IN ULONG Key,
+  IN PVOID Context OPTIONAL,
+  IN BOOLEAN AlreadySynchronized);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlFastUnlockAll(
+  IN PFILE_LOCK FileLock,
+  IN PFILE_OBJECT FileObject,
+  IN PEPROCESS Process,
+  IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlFastUnlockAllByKey(
+  IN PFILE_LOCK FileLock,
+  IN PFILE_OBJECT FileObject,
+  IN PEPROCESS Process,
+  IN ULONG Key,
+  IN PVOID Context OPTIONAL);
+
+/*
+  FsRtlPrivateLock:
+
+  ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED
+
+  Internals:
+    -Calls IoCompleteRequest if Irp
+    -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES
+*/
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlPrivateLock(
+  IN PFILE_LOCK FileLock,
+  IN PFILE_OBJECT FileObject,
+  IN PLARGE_INTEGER FileOffset,
+  IN PLARGE_INTEGER Length,
+  IN PEPROCESS Process,
+  IN ULONG Key,
+  IN BOOLEAN FailImmediately,
+  IN BOOLEAN ExclusiveLock,
+  OUT PIO_STATUS_BLOCK IoStatus,
+  IN PIRP Irp OPTIONAL,
+  IN PVOID Context,
+  IN BOOLEAN AlreadySynchronized);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlAreThereCurrentOrInProgressFileLocks(
+  IN PFILE_LOCK FileLock);
+#endif
+
+#pragma pack(push,4)
+
+#ifndef VER_PRODUCTBUILD
+#define VER_PRODUCTBUILD 10000
+#endif
+
+#include "csq.h"
+
+#ifdef _NTOSKRNL_
+extern PUCHAR                       FsRtlLegalAnsiCharacterArray;
+#else
+extern DECLSPEC_IMPORT PUCHAR       FsRtlLegalAnsiCharacterArray;
+#endif
+extern PACL                         SePublicDefaultDacl;
+extern PACL                         SeSystemDefaultDacl;
+
+#define FS_LFN_APIS                     0x00004000
+
+#define FILE_STORAGE_TYPE_SPECIFIED             0x00000041  /* FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE */
+#define FILE_STORAGE_TYPE_DEFAULT               (StorageTypeDefault << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_DIRECTORY             (StorageTypeDirectory << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_FILE                  (StorageTypeFile << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_DOCFILE               (StorageTypeDocfile << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_JUNCTION_POINT        (StorageTypeJunctionPoint << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_CATALOG               (StorageTypeCatalog << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_STRUCTURED_STORAGE    (StorageTypeStructuredStorage << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_EMBEDDING             (StorageTypeEmbedding << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_STREAM                (StorageTypeStream << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_MINIMUM_STORAGE_TYPE               FILE_STORAGE_TYPE_DEFAULT
+#define FILE_MAXIMUM_STORAGE_TYPE               FILE_STORAGE_TYPE_STREAM
+#define FILE_STORAGE_TYPE_MASK                  0x000f0000
+#define FILE_STORAGE_TYPE_SHIFT                 16
+
+#define FILE_VC_QUOTAS_LOG_VIOLATIONS   0x00000004
+
+#define FSRTL_VOLUME_DISMOUNT           1
+#define FSRTL_VOLUME_DISMOUNT_FAILED    2
+#define FSRTL_VOLUME_LOCK               3
+#define FSRTL_VOLUME_LOCK_FAILED        4
+#define FSRTL_VOLUME_UNLOCK             5
+#define FSRTL_VOLUME_MOUNT              6
+
+#define FSRTL_WILD_CHARACTER            0x08
+
+#define FSRTL_FAT_LEGAL                 0x01
+#define FSRTL_HPFS_LEGAL                0x02
+#define FSRTL_NTFS_LEGAL                0x04
+#define FSRTL_WILD_CHARACTER            0x08
+#define FSRTL_OLE_LEGAL                 0x10
+#define FSRTL_NTFS_STREAM_LEGAL         0x14
+
+#ifdef _X86_
+#define HARDWARE_PTE    HARDWARE_PTE_X86
+#define PHARDWARE_PTE   PHARDWARE_PTE_X86
+#endif
+
+#define IO_CHECK_CREATE_PARAMETERS      0x0200
+#define IO_ATTACH_DEVICE                0x0400
+
+#define IO_ATTACH_DEVICE_API            0x80000000
+
+#define IO_TYPE_APC                     18
+#define IO_TYPE_DPC                     19
+#define IO_TYPE_DEVICE_QUEUE            20
+#define IO_TYPE_EVENT_PAIR              21
+#define IO_TYPE_INTERRUPT               22
+#define IO_TYPE_PROFILE                 23
+
+#define IRP_BEING_VERIFIED              0x10
+
+#define MAILSLOT_CLASS_FIRSTCLASS       1
+#define MAILSLOT_CLASS_SECONDCLASS      2
+
+#define MAILSLOT_SIZE_AUTO              0
+
+#define MEM_DOS_LIM                     0x40000000
+
+#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1
+
+#define OB_TYPE_TYPE                    1
+#define OB_TYPE_DIRECTORY               2
+#define OB_TYPE_SYMBOLIC_LINK           3
+#define OB_TYPE_TOKEN                   4
+#define OB_TYPE_PROCESS                 5
+#define OB_TYPE_THREAD                  6
+#define OB_TYPE_EVENT                   7
+#define OB_TYPE_EVENT_PAIR              8
+#define OB_TYPE_MUTANT                  9
+#define OB_TYPE_SEMAPHORE               10
+#define OB_TYPE_TIMER                   11
+#define OB_TYPE_PROFILE                 12
+#define OB_TYPE_WINDOW_STATION          13
+#define OB_TYPE_DESKTOP                 14
+#define OB_TYPE_SECTION                 15
+#define OB_TYPE_KEY                     16
+#define OB_TYPE_PORT                    17
+#define OB_TYPE_ADAPTER                 18
+#define OB_TYPE_CONTROLLER              19
+#define OB_TYPE_DEVICE                  20
+#define OB_TYPE_DRIVER                  21
+#define OB_TYPE_IO_COMPLETION           22
+#define OB_TYPE_FILE                    23
+
+#define PIN_WAIT                        (1)
+#define PIN_EXCLUSIVE                   (2)
+#define PIN_NO_READ                     (4)
+#define PIN_IF_BCB                      (8)
+
+#define SEC_BASED      0x00200000
+
+#define SECURITY_WORLD_SID_AUTHORITY    {0,0,0,0,0,1}
+#define SECURITY_WORLD_RID              (0x00000000L)
+
+/* end winnt.h */
+
+#define TOKEN_HAS_ADMIN_GROUP           0x08
+
+#define VACB_MAPPING_GRANULARITY        (0x40000)
+#define VACB_OFFSET_SHIFT               (18)
+
+#if (VER_PRODUCTBUILD >= 1381)
+#define FSCTL_GET_HFS_INFORMATION       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#endif /* (VER_PRODUCTBUILD >= 1381) */
+
+#if (VER_PRODUCTBUILD >= 2195)
+
+#define FSCTL_READ_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 33, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_WRITE_PROPERTY_DATA       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 34, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define FSCTL_DUMP_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 37,  METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define FSCTL_HSM_MSG                   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 66, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_NSS_CONTROL               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 67, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_HSM_DATA                  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 68, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_NSS_RCONTROL              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 70, METHOD_BUFFERED, FILE_READ_DATA)
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
+#define FSCTL_NETWORK_SET_CONFIGURATION_INFO    CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 102, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_GET_CONFIGURATION_INFO    CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 103, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_GET_CONNECTION_INFO       CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 104, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_ENUMERATE_CONNECTIONS     CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 105, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_DELETE_CONNECTION         CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 107, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_GET_STATISTICS            CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 116, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_SET_DOMAIN_NAME           CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT     CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_REDIR_QUERY_PATH          CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+typedef PVOID OPLOCK, *POPLOCK;
+
+//
+// Forwarders
+//
+struct _RTL_AVL_TABLE;
+struct _RTL_GENERIC_TABLE;
+
+typedef PVOID PNOTIFY_SYNC;
+
+typedef enum _FILE_STORAGE_TYPE {
+    StorageTypeDefault = 1,
+    StorageTypeDirectory,
+    StorageTypeFile,
+    StorageTypeJunctionPoint,
+    StorageTypeCatalog,
+    StorageTypeStructuredStorage,
+    StorageTypeEmbedding,
+    StorageTypeStream
+} FILE_STORAGE_TYPE;
+
+typedef struct _OBJECT_BASIC_INFORMATION
+{
+    ULONG Attributes;
+    ACCESS_MASK GrantedAccess;
+    ULONG HandleCount;
+    ULONG PointerCount;
+    ULONG PagedPoolCharge;
+    ULONG NonPagedPoolCharge;
+    ULONG Reserved[ 3 ];
+    ULONG NameInfoSize;
+    ULONG TypeInfoSize;
+    ULONG SecurityDescriptorSize;
+    LARGE_INTEGER CreationTime;
+} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
+
+typedef struct _BITMAP_RANGE {
+    LIST_ENTRY      Links;
+    LONGLONG        BasePage;
+    ULONG           FirstDirtyPage;
+    ULONG           LastDirtyPage;
+    ULONG           DirtyPages;
+    PULONG          Bitmap;
+} BITMAP_RANGE, *PBITMAP_RANGE;
+
+typedef struct _CACHE_UNINITIALIZE_EVENT {
+    struct _CACHE_UNINITIALIZE_EVENT    *Next;
+    KEVENT                              Event;
+} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT;
+
+typedef struct _CC_FILE_SIZES {
+    LARGE_INTEGER AllocationSize;
+    LARGE_INTEGER FileSize;
+    LARGE_INTEGER ValidDataLength;
+} CC_FILE_SIZES, *PCC_FILE_SIZES;
+
+typedef struct _FILE_COPY_ON_WRITE_INFORMATION {
+    BOOLEAN ReplaceIfExists;
+    HANDLE  RootDirectory;
+    ULONG   FileNameLength;
+    WCHAR   FileName[1];
+} FILE_COPY_ON_WRITE_INFORMATION, *PFILE_COPY_ON_WRITE_INFORMATION;
+
+typedef struct _FILE_FULL_DIRECTORY_INFORMATION {
+    ULONG           NextEntryOffset;
+    ULONG           FileIndex;
+    LARGE_INTEGER   CreationTime;
+    LARGE_INTEGER   LastAccessTime;
+    LARGE_INTEGER   LastWriteTime;
+    LARGE_INTEGER   ChangeTime;
+    LARGE_INTEGER   EndOfFile;
+    LARGE_INTEGER   AllocationSize;
+    ULONG           FileAttributes;
+    ULONG           FileNameLength;
+    ULONG           EaSize;
+    WCHAR           FileName[ANYSIZE_ARRAY];
+} FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;
+
+typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
+    LARGE_INTEGER   TotalAllocationUnits;
+    LARGE_INTEGER   CallerAvailableAllocationUnits;
+    LARGE_INTEGER   ActualAvailableAllocationUnits;
+    ULONG           SectorsPerAllocationUnit;
+    ULONG           BytesPerSector;
+} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
+
+typedef struct _FILE_FS_LABEL_INFORMATION {
+    ULONG VolumeLabelLength;
+    WCHAR VolumeLabel[1];
+} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
+
+#if (VER_PRODUCTBUILD >= 2195)
+
+typedef struct _FILE_FS_OBJECT_ID_INFORMATION {
+    UCHAR ObjectId[16];
+    UCHAR ExtendedInfo[48];
+} FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION;
+
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
+typedef struct _FILE_FS_SIZE_INFORMATION {
+    LARGE_INTEGER   TotalAllocationUnits;
+    LARGE_INTEGER   AvailableAllocationUnits;
+    ULONG           SectorsPerAllocationUnit;
+    ULONG           BytesPerSector;
+} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
+
+typedef struct _FILE_FS_VOLUME_INFORMATION {
+    LARGE_INTEGER   VolumeCreationTime;
+    ULONG           VolumeSerialNumber;
+    ULONG           VolumeLabelLength;
+    BOOLEAN         SupportsObjects;
+    WCHAR           VolumeLabel[1];
+} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
+
+typedef struct _FILE_FS_OBJECTID_INFORMATION
+{
+    UCHAR ObjectId[16];
+    UCHAR ExtendedInfo[48];
+} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
+
+/* raw internal file lock struct returned from FsRtlGetNextFileLock */
+typedef struct _FILE_SHARED_LOCK_ENTRY {
+    PVOID           Unknown1;
+    PVOID           Unknown2;
+    FILE_LOCK_INFO  FileLock;
+} FILE_SHARED_LOCK_ENTRY, *PFILE_SHARED_LOCK_ENTRY;
+
+/* raw internal file lock struct returned from FsRtlGetNextFileLock */
+typedef struct _FILE_EXCLUSIVE_LOCK_ENTRY {
+    LIST_ENTRY      ListEntry;
+    PVOID           Unknown1;
+    PVOID           Unknown2;
+    FILE_LOCK_INFO  FileLock;
+} FILE_EXCLUSIVE_LOCK_ENTRY, *PFILE_EXCLUSIVE_LOCK_ENTRY;
+
+typedef struct _FILE_MAILSLOT_PEEK_BUFFER {
+    ULONG ReadDataAvailable;
+    ULONG NumberOfMessages;
+    ULONG MessageLength;
+} FILE_MAILSLOT_PEEK_BUFFER, *PFILE_MAILSLOT_PEEK_BUFFER;
+
+typedef struct _FILE_OLE_CLASSID_INFORMATION {
+    GUID ClassId;
+} FILE_OLE_CLASSID_INFORMATION, *PFILE_OLE_CLASSID_INFORMATION;
+
+typedef struct _FILE_OLE_ALL_INFORMATION {
+    FILE_BASIC_INFORMATION          BasicInformation;
+    FILE_STANDARD_INFORMATION       StandardInformation;
+    FILE_INTERNAL_INFORMATION       InternalInformation;
+    FILE_EA_INFORMATION             EaInformation;
+    FILE_ACCESS_INFORMATION         AccessInformation;
+    FILE_POSITION_INFORMATION       PositionInformation;
+    FILE_MODE_INFORMATION           ModeInformation;
+    FILE_ALIGNMENT_INFORMATION      AlignmentInformation;
+    USN                             LastChangeUsn;
+    USN                             ReplicationUsn;
+    LARGE_INTEGER                   SecurityChangeTime;
+    FILE_OLE_CLASSID_INFORMATION    OleClassIdInformation;
+    FILE_OBJECTID_INFORMATION       ObjectIdInformation;
+    FILE_STORAGE_TYPE               StorageType;
+    ULONG                           OleStateBits;
+    ULONG                           OleId;
+    ULONG                           NumberOfStreamReferences;
+    ULONG                           StreamIndex;
+    ULONG                           SecurityId;
+    BOOLEAN                         ContentIndexDisable;
+    BOOLEAN                         InheritContentIndexDisable;
+    FILE_NAME_INFORMATION           NameInformation;
+} FILE_OLE_ALL_INFORMATION, *PFILE_OLE_ALL_INFORMATION;
+
+typedef struct _FILE_OLE_DIR_INFORMATION {
+    ULONG               NextEntryOffset;
+    ULONG               FileIndex;
+    LARGE_INTEGER       CreationTime;
+    LARGE_INTEGER       LastAccessTime;
+    LARGE_INTEGER       LastWriteTime;
+    LARGE_INTEGER       ChangeTime;
+    LARGE_INTEGER       EndOfFile;
+    LARGE_INTEGER       AllocationSize;
+    ULONG               FileAttributes;
+    ULONG               FileNameLength;
+    FILE_STORAGE_TYPE   StorageType;
+    GUID                OleClassId;
+    ULONG               OleStateBits;
+    BOOLEAN             ContentIndexDisable;
+    BOOLEAN             InheritContentIndexDisable;
+    WCHAR               FileName[1];
+} FILE_OLE_DIR_INFORMATION, *PFILE_OLE_DIR_INFORMATION;
+
+typedef struct _FILE_OLE_INFORMATION {
+    LARGE_INTEGER                   SecurityChangeTime;
+    FILE_OLE_CLASSID_INFORMATION    OleClassIdInformation;
+    FILE_OBJECTID_INFORMATION       ObjectIdInformation;
+    FILE_STORAGE_TYPE               StorageType;
+    ULONG                           OleStateBits;
+    BOOLEAN                         ContentIndexDisable;
+    BOOLEAN                         InheritContentIndexDisable;
+} FILE_OLE_INFORMATION, *PFILE_OLE_INFORMATION;
+
+typedef struct _FILE_OLE_STATE_BITS_INFORMATION {
+    ULONG StateBits;
+    ULONG StateBitsMask;
+} FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION;
+
+typedef enum _FSRTL_COMPARISON_RESULT
+{
+    LessThan = -1,
+    EqualTo = 0,
+    GreaterThan = 1
+} FSRTL_COMPARISON_RESULT;
+    
+#if (VER_PRODUCTBUILD >= 2600)
+
+typedef struct _FSRTL_PER_STREAM_CONTEXT {
+    LIST_ENTRY     Links;
+    PVOID          OwnerId;
+    PVOID          InstanceId;
+    PFREE_FUNCTION FreeCallback;
+} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT;
+
+typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT
+{
+    LIST_ENTRY Links;
+    PVOID OwnerId;
+    PVOID InstanceId;
+} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT;
+
+#endif /* (VER_PRODUCTBUILD >= 2600) */
+
+typedef struct _BASE_MCB
+{
+    ULONG MaximumPairCount;
+    ULONG PairCount;
+    USHORT PoolType;
+    USHORT Flags;
+    PVOID Mapping;
+} BASE_MCB, *PBASE_MCB;
+
+typedef struct _LARGE_MCB
+{
+    PKGUARDED_MUTEX GuardedMutex;
+    BASE_MCB BaseMcb;
+} LARGE_MCB, *PLARGE_MCB;
+
+typedef struct _MCB
+{
+    LARGE_MCB DummyFieldThatSizesThisStructureCorrectly;
+} MCB, *PMCB;
+
+typedef struct _MAPPING_PAIR {
+    ULONGLONG Vcn;
+    ULONGLONG Lcn;
+} MAPPING_PAIR, *PMAPPING_PAIR;
+
+typedef struct _GET_RETRIEVAL_DESCRIPTOR {
+    ULONG           NumberOfPairs;
+    ULONGLONG       StartVcn;
+    MAPPING_PAIR    Pair[1];
+} GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR;
+
+#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject);
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlPostPagingFileStackOverflow (
-    IN PVOID                          Context,
-    IN PKEVENT                        Event,
-    IN PFSRTL_STACK_OVERFLOW_ROUTINE  StackOverflowRoutine
-);
+typedef struct _MBCB {
+    CSHORT          NodeTypeCode;
+    CSHORT          NodeIsInZone;
+    ULONG           PagesToWrite;
+    ULONG           DirtyPages;
+    ULONG           Reserved;
+    LIST_ENTRY      BitmapRanges;
+    LONGLONG        ResumeWritePage;
+    BITMAP_RANGE    BitmapRange1;
+    BITMAP_RANGE    BitmapRange2;
+    BITMAP_RANGE    BitmapRange3;
+} MBCB, *PMBCB;
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlPostStackOverflow (
-    IN PVOID                          Context,
-    IN PKEVENT                        Event,
-    IN PFSRTL_STACK_OVERFLOW_ROUTINE  StackOverflowRoutine
-);
+typedef struct _MOVEFILE_DESCRIPTOR {
+     HANDLE         FileHandle;
+     ULONG          Reserved;
+     LARGE_INTEGER  StartVcn;
+     LARGE_INTEGER  TargetLcn;
+     ULONG          NumVcns;
+     ULONG          Reserved1;
+} MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR;
 
-/*
-  FsRtlPrivateLock:
+typedef struct _OBJECT_BASIC_INFO {
+    ULONG           Attributes;
+    ACCESS_MASK     GrantedAccess;
+    ULONG           HandleCount;
+    ULONG           ReferenceCount;
+    ULONG           PagedPoolUsage;
+    ULONG           NonPagedPoolUsage;
+    ULONG           Reserved[3];
+    ULONG           NameInformationLength;
+    ULONG           TypeInformationLength;
+    ULONG           SecurityDescriptorLength;
+    LARGE_INTEGER   CreateTime;
+} OBJECT_BASIC_INFO, *POBJECT_BASIC_INFO;
 
-  ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED
+typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFO {
+    BOOLEAN Inherit;
+    BOOLEAN ProtectFromClose;
+} OBJECT_HANDLE_ATTRIBUTE_INFO, *POBJECT_HANDLE_ATTRIBUTE_INFO;
 
-  Internals:
-    -Calls IoCompleteRequest if Irp
-    -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES
-*/
-NTKERNELAPI
-BOOLEAN
-NTAPI
-FsRtlPrivateLock (
-    IN PFILE_LOCK           FileLock,
-    IN PFILE_OBJECT         FileObject,
-    IN PLARGE_INTEGER       FileOffset,
-    IN PLARGE_INTEGER       Length,
-    IN PEPROCESS            Process,
-    IN ULONG                Key,
-    IN BOOLEAN              FailImmediately,
-    IN BOOLEAN              ExclusiveLock,
-    OUT PIO_STATUS_BLOCK    IoStatus,
-    IN PIRP                 Irp OPTIONAL,
-    IN PVOID                Context,
-    IN BOOLEAN              AlreadySynchronized
-);
+typedef struct _OBJECT_NAME_INFO {
+    UNICODE_STRING  ObjectName;
+    WCHAR           ObjectNameBuffer[1];
+} OBJECT_NAME_INFO, *POBJECT_NAME_INFO;
 
-/*
-  FsRtlProcessFileLock:
+typedef struct _OBJECT_PROTECTION_INFO {
+    BOOLEAN Inherit;
+    BOOLEAN ProtectHandle;
+} OBJECT_PROTECTION_INFO, *POBJECT_PROTECTION_INFO;
 
-  ret:
-    -STATUS_INVALID_DEVICE_REQUEST
-    -STATUS_RANGE_NOT_LOCKED from unlock routines.
-    -STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock
-    (redirected IoStatus->Status).
+typedef struct _OBJECT_TYPE_INFO {
+    UNICODE_STRING  ObjectTypeName;
+    UCHAR           Unknown[0x58];
+    WCHAR           ObjectTypeNameBuffer[1];
+} OBJECT_TYPE_INFO, *POBJECT_TYPE_INFO;
 
-  Internals:
-    -switch ( Irp->CurrentStackLocation->MinorFunction )
-        lock: return FsRtlPrivateLock;
-        unlocksingle: return FsRtlFastUnlockSingle;
-        unlockall: return FsRtlFastUnlockAll;
-        unlockallbykey: return FsRtlFastUnlockAllByKey;
-        default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST;
-                 return STATUS_INVALID_DEVICE_REQUEST;
+typedef struct _OBJECT_ALL_TYPES_INFO {
+    ULONG               NumberOfObjectTypes;
+    OBJECT_TYPE_INFO    ObjectsTypeInfo[1];
+} OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO;
 
-    -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines.
-    -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock.
-*/
-NTKERNELAPI
-NTSTATUS
-NTAPI
-FsRtlProcessFileLock (
-    IN PFILE_LOCK   FileLock,
-    IN PIRP         Irp,
-    IN PVOID        Context OPTIONAL
-);
+typedef enum _RTL_GENERIC_COMPARE_RESULTS
+{
+    GenericLessThan,
+    GenericGreaterThan,
+    GenericEqual
+} RTL_GENERIC_COMPARE_RESULTS;
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-FsRtlRegisterUncProvider (
-    IN OUT PHANDLE      MupHandle,
-    IN PUNICODE_STRING  RedirectorDeviceName,
-    IN BOOLEAN          MailslotsSupported
-);
+typedef enum _TABLE_SEARCH_RESULT
+{
+    TableEmptyTree,
+    TableFoundNode,
+    TableInsertAsLeft,
+    TableInsertAsRight
+} TABLE_SEARCH_RESULT;
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlRemoveBaseMcbEntry (
-    IN PBASE_MCB  Mcb,
-    IN LONGLONG   Vbn,
-    IN LONGLONG   SectorCount
+typedef NTSTATUS
+(NTAPI *PRTL_AVL_MATCH_FUNCTION)(
+    struct _RTL_AVL_TABLE *Table,
+    PVOID UserData,
+    PVOID MatchData
 );
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlRemoveLargeMcbEntry (
-    IN PLARGE_MCB  Mcb,
-    IN LONGLONG    Vbn,
-    IN LONGLONG    SectorCount
+typedef RTL_GENERIC_COMPARE_RESULTS
+(NTAPI *PRTL_AVL_COMPARE_ROUTINE) (
+    struct _RTL_AVL_TABLE *Table,
+    PVOID FirstStruct,
+    PVOID SecondStruct
 );
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlRemoveMcbEntry (
-    IN PMCB   Mcb,
-    IN VBN    Vbn,
-    IN ULONG  SectorCount
+typedef RTL_GENERIC_COMPARE_RESULTS
+(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) (
+    struct _RTL_GENERIC_TABLE *Table,
+    PVOID FirstStruct,
+    PVOID SecondStruct
 );
 
-NTKERNELAPI
-PFSRTL_PER_STREAM_CONTEXT
-NTAPI
-FsRtlRemovePerStreamContext (
-    IN PFSRTL_ADVANCED_FCB_HEADER  StreamContext,
-    IN PVOID                       OwnerId OPTIONAL,
-    IN PVOID                       InstanceId OPTIONAL
+typedef PVOID
+(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) (
+    struct _RTL_GENERIC_TABLE *Table,
+    CLONG ByteSize
 );
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlResetBaseMcb (
-    IN PBASE_MCB Mcb
+typedef VOID
+(NTAPI *PRTL_GENERIC_FREE_ROUTINE) (
+    struct _RTL_GENERIC_TABLE *Table,
+    PVOID Buffer
 );
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlResetLargeMcb (
-    IN PLARGE_MCB  Mcb,
-    IN BOOLEAN     SelfSynchronized
+typedef PVOID
+(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) (
+    struct _RTL_AVL_TABLE *Table,
+    CLONG ByteSize
 );
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-FsRtlSplitBaseMcb (
-    IN PBASE_MCB  Mcb,
-    IN LONGLONG   Vbn,
-    IN LONGLONG   Amount
+typedef VOID
+(NTAPI *PRTL_AVL_FREE_ROUTINE) (
+    struct _RTL_AVL_TABLE *Table,
+    PVOID Buffer
 );
 
-NTKERNELAPI
-BOOLEAN
-NTAPI
-FsRtlSplitLargeMcb (
-    IN PLARGE_MCB  Mcb,
-    IN LONGLONG    Vbn,
-    IN LONGLONG    Amount
-);
+typedef struct _PUBLIC_BCB {
+    CSHORT          NodeTypeCode;
+    CSHORT          NodeByteSize;
+    ULONG           MappedLength;
+    LARGE_INTEGER   MappedFileOffset;
+} PUBLIC_BCB, *PPUBLIC_BCB;
 
-#define FsRtlSupportsPerStreamContexts(FO) (                       \
-    (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) &&     \
-              FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \
-              FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS))               \
-)
+typedef struct _QUERY_PATH_REQUEST {
+    ULONG                   PathNameLength;
+    PIO_SECURITY_CONTEXT    SecurityContext;
+    WCHAR                   FilePathName[1];
+} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST;
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlTruncateBaseMcb (
-    IN PBASE_MCB  Mcb,
-    IN LONGLONG   Vbn
-);
+typedef struct _QUERY_PATH_RESPONSE {
+    ULONG LengthAccepted;
+} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE;
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlTruncateLargeMcb (
-    IN PLARGE_MCB  Mcb,
-    IN LONGLONG    Vbn
-);
+typedef struct _RTL_BALANCED_LINKS
+{
+    struct _RTL_BALANCED_LINKS *Parent;
+    struct _RTL_BALANCED_LINKS *LeftChild;
+    struct _RTL_BALANCED_LINKS *RightChild;
+    CHAR Balance;
+    UCHAR Reserved[3];
+} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
+
+typedef struct _RTL_GENERIC_TABLE
+{
+    PRTL_SPLAY_LINKS TableRoot;
+    LIST_ENTRY InsertOrderList;
+    PLIST_ENTRY OrderedPointer;
+    ULONG WhichOrderedElement;
+    ULONG NumberGenericTableElements;
+    PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;
+    PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;
+    PRTL_GENERIC_FREE_ROUTINE FreeRoutine;
+    PVOID TableContext;
+} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlTruncateMcb (
-    IN PMCB  Mcb,
-    IN VBN   Vbn
-);
+#undef PRTL_GENERIC_COMPARE_ROUTINE
+#undef PRTL_GENERIC_ALLOCATE_ROUTINE
+#undef PRTL_GENERIC_FREE_ROUTINE
+#undef RTL_GENERIC_TABLE
+#undef PRTL_GENERIC_TABLE
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlUninitializeBaseMcb (
-    IN PBASE_MCB Mcb
-);
+#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE
+#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE
+#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE
+#define RTL_GENERIC_TABLE RTL_AVL_TABLE
+#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlUninitializeFileLock (
-    IN PFILE_LOCK FileLock
-);
+#define RtlInitializeGenericTable               RtlInitializeGenericTableAvl
+#define RtlInsertElementGenericTable            RtlInsertElementGenericTableAvl
+#define RtlInsertElementGenericTableFull        RtlInsertElementGenericTableFullAvl
+#define RtlDeleteElementGenericTable            RtlDeleteElementGenericTableAvl
+#define RtlLookupElementGenericTable            RtlLookupElementGenericTableAvl
+#define RtlLookupElementGenericTableFull        RtlLookupElementGenericTableFullAvl
+#define RtlEnumerateGenericTable                RtlEnumerateGenericTableAvl
+#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
+#define RtlGetElementGenericTable               RtlGetElementGenericTableAvl
+#define RtlNumberGenericTableElements           RtlNumberGenericTableElementsAvl
+#define RtlIsGenericTableEmpty                  RtlIsGenericTableEmptyAvl
 
-NTKERNELAPI
-VOID
-NTAPI
-FsRtlUninitializeLargeMcb (
-    IN PLARGE_MCB Mcb
-);
+typedef struct _RTL_AVL_TABLE
+{
+    RTL_BALANCED_LINKS BalancedRoot;
+    PVOID OrderedPointer;
+    ULONG WhichOrderedElement;
+    ULONG NumberGenericTableElements;
+    ULONG DepthOfTree;
+    PRTL_BALANCED_LINKS RestartKey;
+    ULONG DeleteCount;
+    PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
+    PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
+    PRTL_AVL_FREE_ROUTINE FreeRoutine;
+    PVOID TableContext;
+} RTL_AVL_TABLE, *PRTL_AVL_TABLE;
 
-NTKERNELAPI
+NTSYSAPI
 VOID
 NTAPI
-FsRtlUninitializeMcb (
-    IN PMCB Mcb
+RtlInitializeGenericTableAvl(
+    PRTL_AVL_TABLE Table,
+    PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
+    PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
+    PRTL_AVL_FREE_ROUTINE FreeRoutine,
+    PVOID TableContext
 );
 
-NTKERNELAPI
-VOID
+NTSYSAPI
+PVOID
 NTAPI
-FsRtlUninitializeOplock (
-    IN OUT POPLOCK Oplock
-);
-
-NTKERNELAPI
-UCHAR
+RtlInsertElementGenericTableAvl (
+    PRTL_AVL_TABLE Table,
+    PVOID Buffer,
+    CLONG BufferSize,
+    PBOOLEAN NewElement OPTIONAL
+    );
+    
+NTSYSAPI
+BOOLEAN
 NTAPI
-KeSetIdealProcessorThread(
-    IN OUT PKTHREAD Thread,
-    IN UCHAR Processor
-);
-
-NTKERNELAPI
-NTSTATUS
+RtlDeleteElementGenericTableAvl (
+    PRTL_AVL_TABLE Table,
+    PVOID Buffer
+    );
+    
+NTSYSAPI
+PVOID
 NTAPI
-IoAttachDeviceToDeviceStackSafe(
-    IN PDEVICE_OBJECT   SourceDevice,
-    IN PDEVICE_OBJECT   TargetDevice,
-    OUT PDEVICE_OBJECT  *AttachedToDeviceObject
-);
-
-NTKERNELAPI
-VOID
+RtlLookupElementGenericTableAvl (
+    PRTL_AVL_TABLE Table,
+    PVOID Buffer
+    );
+    
+NTSYSAPI
+PVOID
 NTAPI
-IoAcquireVpbSpinLock (
-    OUT PKIRQL Irql
-);
+RtlEnumerateGenericTableWithoutSplayingAvl (
+    PRTL_AVL_TABLE Table,
+    PVOID *RestartKey
+    );
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCheckDesiredAccess (
-    IN OUT PACCESS_MASK DesiredAccess,
-    IN ACCESS_MASK      GrantedAccess
-);
+#if defined(USE_LPC6432)
+#define LPC_CLIENT_ID CLIENT_ID64
+#define LPC_SIZE_T ULONGLONG
+#define LPC_PVOID ULONGLONG
+#define LPC_HANDLE ULONGLONG
+#else
+#define LPC_CLIENT_ID CLIENT_ID
+#define LPC_SIZE_T SIZE_T
+#define LPC_PVOID PVOID
+#define LPC_HANDLE HANDLE
+#endif
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCheckEaBufferValidity (
-    IN PFILE_FULL_EA_INFORMATION    EaBuffer,
-    IN ULONG                        EaLength,
-    OUT PULONG                      ErrorOffset
-);
+typedef struct _PORT_MESSAGE
+{
+    union
+    {
+        struct
+        {
+            CSHORT DataLength;
+            CSHORT TotalLength;
+        } s1;
+        ULONG Length;
+    } u1;
+    union
+    {
+        struct
+        {
+            CSHORT Type;
+            CSHORT DataInfoOffset;
+        } s2;
+        ULONG ZeroInit;
+    } u2;
+    __GNU_EXTENSION union
+    {
+        LPC_CLIENT_ID ClientId;
+        double DoNotUseThisField;
+    };
+    ULONG MessageId;
+    __GNU_EXTENSION union
+    {
+        LPC_SIZE_T ClientViewSize;
+        ULONG CallbackId;
+    };
+} PORT_MESSAGE, *PPORT_MESSAGE;
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCheckFunctionAccess (
-    IN ACCESS_MASK              GrantedAccess,
-    IN UCHAR                    MajorFunction,
-    IN UCHAR                    MinorFunction,
-    IN ULONG                    IoControlCode,
-    IN PVOID                    Argument1 OPTIONAL,
-    IN PVOID                    Argument2 OPTIONAL
-);
+#define LPC_KERNELMODE_MESSAGE      (CSHORT)((USHORT)0x8000)
 
-#if (VER_PRODUCTBUILD >= 2195)
+typedef struct _PORT_VIEW
+{
+    ULONG Length;
+    LPC_HANDLE SectionHandle;
+    ULONG SectionOffset;
+    LPC_SIZE_T ViewSize;
+    LPC_PVOID ViewBase;
+    LPC_PVOID ViewRemoteBase;
+} PORT_VIEW, *PPORT_VIEW;
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCheckQuotaBufferValidity (
-    IN PFILE_QUOTA_INFORMATION  QuotaBuffer,
-    IN ULONG                    QuotaLength,
-    OUT PULONG                  ErrorOffset
-);
+typedef struct _REMOTE_PORT_VIEW
+{
+    ULONG Length;
+    LPC_SIZE_T ViewSize;
+    LPC_PVOID ViewBase;
+} REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW;
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+typedef struct _TUNNEL {
+    FAST_MUTEX          Mutex;
+    PRTL_SPLAY_LINKS    Cache;
+    LIST_ENTRY          TimerQueue;
+    USHORT              NumEntries;
+} TUNNEL, *PTUNNEL;
 
-NTKERNELAPI
-PFILE_OBJECT
-NTAPI
-IoCreateStreamFileObject (
-    IN PFILE_OBJECT     FileObject OPTIONAL,
-    IN PDEVICE_OBJECT   DeviceObject OPTIONAL
-);
+typedef struct _VAD_HEADER {
+    PVOID       StartVPN;
+    PVOID       EndVPN;
+    struct _VAD_HEADER* ParentLink;
+    struct _VAD_HEADER* LeftLink;
+    struct _VAD_HEADER* RightLink;
+    ULONG       Flags;          /* LSB = CommitCharge */
+    PVOID       ControlArea;
+    PVOID       FirstProtoPte;
+    PVOID       LastPTE;
+    ULONG       Unknown;
+    LIST_ENTRY  Secured;
+} VAD_HEADER, *PVAD_HEADER;
 
-#if (VER_PRODUCTBUILD >= 2195)
+#if (VER_PRODUCTBUILD >= 2600)
 
-NTKERNELAPI
-PFILE_OBJECT
-NTAPI
-IoCreateStreamFileObjectLite (
-    IN PFILE_OBJECT     FileObject OPTIONAL,
-    IN PDEVICE_OBJECT   DeviceObject OPTIONAL
+typedef BOOLEAN
+(NTAPI *PFILTER_REPORT_CHANGE) (
+    IN PVOID  NotifyContext,
+    IN PVOID  FilterContext
 );
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+#endif
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-IoFastQueryNetworkAttributes (
-    IN POBJECT_ATTRIBUTES               ObjectAttributes,
-    IN ACCESS_MASK                      DesiredAccess,
-    IN ULONG                            OpenOptions,
-    OUT PIO_STATUS_BLOCK                IoStatus,
-    OUT PFILE_NETWORK_OPEN_INFORMATION  Buffer
+CcCanIWrite (
+    IN PFILE_OBJECT FileObject,
+    IN ULONG        BytesToWrite,
+    IN BOOLEAN      Wait,
+    IN BOOLEAN      Retrying
 );
 
 NTKERNELAPI
-PDEVICE_OBJECT
+BOOLEAN
 NTAPI
-IoGetAttachedDevice (
-    IN PDEVICE_OBJECT DeviceObject
+CcCopyRead (
+    IN PFILE_OBJECT         FileObject,
+    IN PLARGE_INTEGER       FileOffset,
+    IN ULONG                Length,
+    IN BOOLEAN              Wait,
+    OUT PVOID               Buffer,
+    OUT PIO_STATUS_BLOCK    IoStatus
 );
 
 NTKERNELAPI
-PDEVICE_OBJECT
+BOOLEAN
 NTAPI
-IoGetBaseFileSystemDeviceObject (
-    IN PFILE_OBJECT FileObject
+CcCopyWrite (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   FileOffset,
+    IN ULONG            Length,
+    IN BOOLEAN          Wait,
+    IN PVOID            Buffer
 );
 
-#if (VER_PRODUCTBUILD >= 2600)
+#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000)
 
-NTKERNELAPI
-PDEVICE_OBJECT
-NTAPI
-IoGetDeviceAttachmentBaseRef (
-    IN PDEVICE_OBJECT DeviceObject
+typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) (
+    IN PVOID Context1,
+    IN PVOID Context2
 );
 
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-IoGetDiskDeviceObject (
-    IN PDEVICE_OBJECT   FileSystemDeviceObject,
-    OUT PDEVICE_OBJECT  *DiskDeviceObject
+CcDeferWrite (
+    IN PFILE_OBJECT             FileObject,
+    IN PCC_POST_DEFERRED_WRITE  PostRoutine,
+    IN PVOID                    Context1,
+    IN PVOID                    Context2,
+    IN ULONG                    BytesToWrite,
+    IN BOOLEAN                  Retrying
 );
 
 NTKERNELAPI
-PDEVICE_OBJECT
+VOID
 NTAPI
-IoGetLowerDeviceObject (
-    IN PDEVICE_OBJECT DeviceObject
+CcFastCopyRead (
+    IN PFILE_OBJECT         FileObject,
+    IN ULONG                FileOffset,
+    IN ULONG                Length,
+    IN ULONG                PageCount,
+    OUT PVOID               Buffer,
+    OUT PIO_STATUS_BLOCK    IoStatus
 );
 
-#endif /* (VER_PRODUCTBUILD >= 2600) */
-
 NTKERNELAPI
-PEPROCESS
+VOID
 NTAPI
-IoGetRequestorProcess (
-    IN PIRP Irp
+CcFastCopyWrite (
+    IN PFILE_OBJECT FileObject,
+    IN ULONG        FileOffset,
+    IN ULONG        Length,
+    IN PVOID        Buffer
 );
 
-#if (VER_PRODUCTBUILD >= 2195)
-
 NTKERNELAPI
-ULONG
+VOID
 NTAPI
-IoGetRequestorProcessId (
-    IN PIRP Irp
+CcFlushCache (
+    IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+    IN PLARGE_INTEGER           FileOffset OPTIONAL,
+    IN ULONG                    Length,
+    OUT PIO_STATUS_BLOCK        IoStatus OPTIONAL
 );
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+typedef VOID (NTAPI *PDIRTY_PAGE_ROUTINE) (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   FileOffset,
+    IN ULONG            Length,
+    IN PLARGE_INTEGER   OldestLsn,
+    IN PLARGE_INTEGER   NewestLsn,
+    IN PVOID            Context1,
+    IN PVOID            Context2
+);
 
 NTKERNELAPI
-PIRP
+LARGE_INTEGER
 NTAPI
-IoGetTopLevelIrp (
-    VOID
+CcGetDirtyPages (
+    IN PVOID                LogHandle,
+    IN PDIRTY_PAGE_ROUTINE  DirtyPageRoutine,
+    IN PVOID                Context1,
+    IN PVOID                Context2
 );
 
-#define IoIsFileOpenedExclusively(FileObject) ( \
-    (BOOLEAN) !(                                \
-    (FileObject)->SharedRead ||                 \
-    (FileObject)->SharedWrite ||                \
-    (FileObject)->SharedDelete                  \
-    )                                           \
-)
-
 NTKERNELAPI
-BOOLEAN
+PFILE_OBJECT
 NTAPI
-IoIsOperationSynchronous (
-    IN PIRP Irp
+CcGetFileObjectFromBcb (
+    IN PVOID Bcb
 );
 
 NTKERNELAPI
-BOOLEAN
+PFILE_OBJECT
 NTAPI
-IoIsSystemThread (
-    IN PETHREAD Thread
+CcGetFileObjectFromSectionPtrs (
+    IN PSECTION_OBJECT_POINTERS SectionObjectPointer
 );
 
+#define CcGetFileSizePointer(FO) (                                     \
+    ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \
+)
+
 #if (VER_PRODUCTBUILD >= 2195)
 
 NTKERNELAPI
-BOOLEAN
+LARGE_INTEGER
 NTAPI
-IoIsValidNameGraftingBuffer (
-    IN PIRP                 Irp,
-    IN PREPARSE_DATA_BUFFER ReparseBuffer
+CcGetFlushedValidData (
+    IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+    IN BOOLEAN                  BcbListHeld
 );
 
 #endif /* (VER_PRODUCTBUILD >= 2195) */
 
 NTKERNELAPI
-NTSTATUS
+LARGE_INTEGER
 NTAPI
-IoPageRead (
-    IN PFILE_OBJECT         FileObject,
-    IN PMDL                 Mdl,
-    IN PLARGE_INTEGER       Offset,
-    IN PKEVENT              Event,
-    OUT PIO_STATUS_BLOCK    IoStatusBlock
+CcGetLsnForFileObject (
+    IN PFILE_OBJECT     FileObject,
+    OUT PLARGE_INTEGER  OldestLsn OPTIONAL
 );
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoQueryFileInformation (
-    IN PFILE_OBJECT             FileObject,
-    IN FILE_INFORMATION_CLASS   FileInformationClass,
-    IN ULONG                    Length,
-    OUT PVOID                   FileInformation,
-    OUT PULONG                  ReturnedLength
+typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) (
+    IN PVOID    Context,
+    IN BOOLEAN  Wait
 );
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoQueryVolumeInformation (
-    IN PFILE_OBJECT         FileObject,
-    IN FS_INFORMATION_CLASS FsInformationClass,
-    IN ULONG                Length,
-    OUT PVOID               FsInformation,
-    OUT PULONG              ReturnedLength
+typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) (
+    IN PVOID Context
 );
 
-NTKERNELAPI
-VOID
-NTAPI
-IoQueueThreadIrp(
-    IN PIRP Irp
+typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) (
+    IN PVOID    Context,
+    IN BOOLEAN  Wait
 );
 
-NTKERNELAPI
-VOID
-NTAPI
-IoRegisterFileSystem (
-    IN OUT PDEVICE_OBJECT DeviceObject
+typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) (
+    IN PVOID Context
 );
 
-#if (VER_PRODUCTBUILD >= 1381)
-
-typedef VOID (NTAPI *PDRIVER_FS_NOTIFICATION) (
-    IN PDEVICE_OBJECT DeviceObject,
-    IN BOOLEAN        DriverActive
-);
+typedef struct _CACHE_MANAGER_CALLBACKS {
+    PACQUIRE_FOR_LAZY_WRITE     AcquireForLazyWrite;
+    PRELEASE_FROM_LAZY_WRITE    ReleaseFromLazyWrite;
+    PACQUIRE_FOR_READ_AHEAD     AcquireForReadAhead;
+    PRELEASE_FROM_READ_AHEAD    ReleaseFromReadAhead;
+} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS;
 
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-IoRegisterFsRegistrationChange (
-    IN PDRIVER_OBJECT           DriverObject,
-    IN PDRIVER_FS_NOTIFICATION  DriverNotificationRoutine
+CcInitializeCacheMap (
+    IN PFILE_OBJECT             FileObject,
+    IN PCC_FILE_SIZES           FileSizes,
+    IN BOOLEAN                  PinAccess,
+    IN PCACHE_MANAGER_CALLBACKS Callbacks,
+    IN PVOID                    LazyWriteContext
 );
 
-#endif /* (VER_PRODUCTBUILD >= 1381) */
+#define CcIsFileCached(FO) (                                                         \
+    ((FO)->SectionObjectPointer != NULL) &&                                          \
+    (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \
+)
 
-NTKERNELAPI
-VOID
-NTAPI
-IoReleaseVpbSpinLock (
-    IN KIRQL Irql
-);
+extern ULONG CcFastMdlReadWait;
 
 NTKERNELAPI
-VOID
+BOOLEAN
 NTAPI
-IoSetDeviceToVerify (
-    IN PETHREAD         Thread,
-    IN PDEVICE_OBJECT   DeviceObject
+CcIsThereDirtyData (
+    IN PVPB Vpb
 );
 
 NTKERNELAPI
-NTSTATUS
+BOOLEAN
 NTAPI
-IoSetInformation (
-    IN PFILE_OBJECT             FileObject,
-    IN FILE_INFORMATION_CLASS   FileInformationClass,
-    IN ULONG                    Length,
-    IN PVOID                    FileInformation
+CcMapData (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   FileOffset,
+    IN ULONG            Length,
+    IN ULONG            Flags,
+    OUT PVOID           *Bcb,
+    OUT PVOID           *Buffer
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-IoSetTopLevelIrp (
-    IN PIRP Irp
-);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoSynchronousPageWrite (
+CcMdlRead (
     IN PFILE_OBJECT         FileObject,
-    IN PMDL                 Mdl,
     IN PLARGE_INTEGER       FileOffset,
-    IN PKEVENT              Event,
-    OUT PIO_STATUS_BLOCK    IoStatusBlock
+    IN ULONG                Length,
+    OUT PMDL                *MdlChain,
+    OUT PIO_STATUS_BLOCK    IoStatus
 );
 
 NTKERNELAPI
-PEPROCESS
+VOID
 NTAPI
-IoThreadToProcess (
-    IN PETHREAD Thread
+CcMdlReadComplete (
+    IN PFILE_OBJECT FileObject,
+    IN PMDL         MdlChain
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-IoUnregisterFileSystem (
-    IN OUT PDEVICE_OBJECT DeviceObject
+CcMdlWriteComplete (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   FileOffset,
+    IN PMDL             MdlChain
 );
 
-#if (VER_PRODUCTBUILD >= 1381)
+#define MAP_WAIT        1
 
 NTKERNELAPI
-VOID
+BOOLEAN
 NTAPI
-IoUnregisterFsRegistrationChange (
-    IN PDRIVER_OBJECT           DriverObject,
-    IN PDRIVER_FS_NOTIFICATION  DriverNotificationRoutine
+CcPinMappedData (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   FileOffset,
+    IN ULONG            Length,
+    IN ULONG            Flags,
+    IN OUT PVOID        *Bcb
 );
 
-#endif /* (VER_PRODUCTBUILD >= 1381) */
-
 NTKERNELAPI
-NTSTATUS
+BOOLEAN
 NTAPI
-IoVerifyVolume (
-    IN PDEVICE_OBJECT   DeviceObject,
-    IN BOOLEAN          AllowRawMount
-);
-
-#if !defined (_M_AMD64)
-
-NTHALAPI
-KIRQL
-FASTCALL
-KeAcquireQueuedSpinLock (
-    IN KSPIN_LOCK_QUEUE_NUMBER Number
+CcPinRead (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   FileOffset,
+    IN ULONG            Length,
+    IN ULONG            Flags,
+    OUT PVOID           *Bcb,
+    OUT PVOID           *Buffer
 );
 
-NTHALAPI
+NTKERNELAPI
 VOID
-FASTCALL
-KeReleaseQueuedSpinLock (
-    IN KSPIN_LOCK_QUEUE_NUMBER Number,
-    IN KIRQL OldIrql
+NTAPI
+CcPrepareMdlWrite (
+    IN PFILE_OBJECT         FileObject,
+    IN PLARGE_INTEGER       FileOffset,
+    IN ULONG                Length,
+    OUT PMDL                *MdlChain,
+    OUT PIO_STATUS_BLOCK    IoStatus
 );
 
-NTHALAPI
-KIRQL
-FASTCALL
-KeAcquireSpinLockRaiseToSynch(
-    IN OUT PKSPIN_LOCK SpinLock
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcPreparePinWrite (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   FileOffset,
+    IN ULONG            Length,
+    IN BOOLEAN          Zero,
+    IN ULONG            Flags,
+    OUT PVOID           *Bcb,
+    OUT PVOID           *Buffer
 );
 
-NTHALAPI
-LOGICAL
-FASTCALL
-KeTryToAcquireQueuedSpinLock(
-  KSPIN_LOCK_QUEUE_NUMBER Number,
-  PKIRQL OldIrql);
-
-#else
-
 NTKERNELAPI
-KIRQL
-FASTCALL
-KeAcquireQueuedSpinLock (
-    IN KSPIN_LOCK_QUEUE_NUMBER Number
+BOOLEAN
+NTAPI
+CcPurgeCacheSection (
+    IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+    IN PLARGE_INTEGER           FileOffset OPTIONAL,
+    IN ULONG                    Length,
+    IN BOOLEAN                  UninitializeCacheMaps
 );
 
-NTKERNELAPI
-VOID
-FASTCALL
-KeReleaseQueuedSpinLock (
-    IN KSPIN_LOCK_QUEUE_NUMBER Number,
-    IN KIRQL OldIrql
-);
+#define CcReadAhead(FO, FOFF, LEN) (                \
+    if ((LEN) >= 256) {                             \
+        CcScheduleReadAhead((FO), (FOFF), (LEN));   \
+    }                                               \
+)
 
-NTKERNELAPI
-KIRQL
-KeAcquireSpinLockRaiseToSynch(
-    IN OUT PKSPIN_LOCK SpinLock
-);
+#if (VER_PRODUCTBUILD >= 2195)
 
 NTKERNELAPI
-LOGICAL
-KeTryToAcquireQueuedSpinLock(
-  KSPIN_LOCK_QUEUE_NUMBER Number,
-  PKIRQL OldIrql);
+PVOID
+NTAPI
+CcRemapBcb (
+    IN PVOID Bcb
+);
 
-#endif
+#endif /* (VER_PRODUCTBUILD >= 2195) */
 
 NTKERNELAPI
 VOID
 NTAPI
-KeAttachProcess (
-    IN PKPROCESS Process
+CcRepinBcb (
+    IN PVOID Bcb
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-KeDetachProcess (
-    VOID
+CcScheduleReadAhead (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   FileOffset,
+    IN ULONG            Length
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-KeInitializeQueue (
-    IN PRKQUEUE Queue,
-    IN ULONG    Count OPTIONAL
+CcSetAdditionalCacheAttributes (
+    IN PFILE_OBJECT FileObject,
+    IN BOOLEAN      DisableReadAhead,
+    IN BOOLEAN      DisableWriteBehind
 );
 
 NTKERNELAPI
-LONG
+VOID
 NTAPI
-KeInsertHeadQueue (
-    IN PRKQUEUE     Queue,
-    IN PLIST_ENTRY  Entry
+CcSetBcbOwnerPointer (
+    IN PVOID Bcb,
+    IN PVOID OwnerPointer
 );
 
 NTKERNELAPI
-LONG
+VOID
 NTAPI
-KeInsertQueue (
-    IN PRKQUEUE     Queue,
-    IN PLIST_ENTRY  Entry
+CcSetDirtyPageThreshold (
+    IN PFILE_OBJECT FileObject,
+    IN ULONG        DirtyPageThreshold
 );
 
 NTKERNELAPI
-LONG
+VOID
 NTAPI
-KeReadStateQueue (
-    IN PRKQUEUE Queue
+CcSetDirtyPinnedData (
+    IN PVOID            BcbVoid,
+    IN PLARGE_INTEGER   Lsn OPTIONAL
 );
 
 NTKERNELAPI
-PLIST_ENTRY
+VOID
 NTAPI
-KeRemoveQueue (
-    IN PRKQUEUE         Queue,
-    IN KPROCESSOR_MODE  WaitMode,
-    IN PLARGE_INTEGER   Timeout OPTIONAL
+CcSetFileSizes (
+    IN PFILE_OBJECT     FileObject,
+    IN PCC_FILE_SIZES   FileSizes
+);
+
+typedef VOID (NTAPI *PFLUSH_TO_LSN) (
+    IN PVOID            LogHandle,
+    IN LARGE_INTEGER    Lsn
 );
 
 NTKERNELAPI
-PLIST_ENTRY
+VOID
 NTAPI
-KeRundownQueue (
-    IN PRKQUEUE Queue
+CcSetLogHandleForFile (
+    IN PFILE_OBJECT     FileObject,
+    IN PVOID            LogHandle,
+    IN PFLUSH_TO_LSN    FlushToLsnRoutine
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-KeInitializeMutant (
-    IN PRKMUTANT  Mutant,
-    IN BOOLEAN    InitialOwner
+CcSetReadAheadGranularity (
+    IN PFILE_OBJECT FileObject,
+    IN ULONG        Granularity     /* default: PAGE_SIZE */
+                                    /* allowed: 2^n * PAGE_SIZE */
 );
 
 NTKERNELAPI
-LONG
+BOOLEAN
 NTAPI
-KeReadStateMutant (
-    IN PRKMUTANT  Mutant
+CcUninitializeCacheMap (
+    IN PFILE_OBJECT                 FileObject,
+    IN PLARGE_INTEGER               TruncateSize OPTIONAL,
+    IN PCACHE_UNINITIALIZE_EVENT    UninitializeCompleteEvent OPTIONAL
 );
 
 NTKERNELAPI
-LONG
+VOID
 NTAPI
-KeReleaseMutant (
-    IN PRKMUTANT  Mutant,
-    IN KPRIORITY  Increment,
-    IN BOOLEAN    Abandoned,
-    IN BOOLEAN    Wait
+CcUnpinData (
+    IN PVOID Bcb
 );
 
-#if (VER_PRODUCTBUILD >= 2195)
-
 NTKERNELAPI
 VOID
 NTAPI
-KeStackAttachProcess (
-    IN PKPROCESS    Process,
-    OUT PKAPC_STATE ApcState
+CcUnpinDataForThread (
+    IN PVOID            Bcb,
+    IN ERESOURCE_THREAD ResourceThreadId
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-KeUnstackDetachProcess (
-    IN PKAPC_STATE ApcState
+CcUnpinRepinnedBcb (
+    IN PVOID                Bcb,
+    IN BOOLEAN              WriteThrough,
+    OUT PIO_STATUS_BLOCK    IoStatus
 );
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+#if (VER_PRODUCTBUILD >= 2195)
 
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-KeSetKernelStackSwapEnable(
-    IN BOOLEAN Enable
+CcWaitForCurrentLazyWriterActivity (
+    VOID
 );
 
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
 NTKERNELAPI
 BOOLEAN
 NTAPI
-MmCanFileBeTruncated (
-    IN PSECTION_OBJECT_POINTERS     SectionObjectPointer,
-    IN PLARGE_INTEGER               NewFileSize
+CcZeroData (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   StartOffset,
+    IN PLARGE_INTEGER   EndOffset,
+    IN BOOLEAN          Wait
 );
 
+#if (VER_PRODUCTBUILD >= 2600)
+
+#ifndef __NTOSKRNL__
 NTKERNELAPI
-BOOLEAN
-NTAPI
-MmFlushImageSection (
-    IN PSECTION_OBJECT_POINTERS     SectionObjectPointer,
-    IN MMFLUSH_TYPE                 FlushType
+VOID
+FASTCALL
+ExInitializeRundownProtection (
+    IN PEX_RUNDOWN_REF  RunRef
 );
 
 NTKERNELAPI
-BOOLEAN
-NTAPI
-MmForceSectionClosed (
-    IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
-    IN BOOLEAN                  DelayClose
+VOID
+FASTCALL
+ExReInitializeRundownProtection (
+    IN PEX_RUNDOWN_REF  RunRef
 );
 
-#if (VER_PRODUCTBUILD >= 1381)
-
 NTKERNELAPI
 BOOLEAN
-NTAPI
-MmIsRecursiveIoFault (
-    VOID
+FASTCALL
+ExAcquireRundownProtection (
+    IN PEX_RUNDOWN_REF  RunRef
 );
 
-#else
-
-#define MmIsRecursiveIoFault() (                            \
-    (PsGetCurrentThread()->DisablePageFaultClustering) |    \
-    (PsGetCurrentThread()->ForwardClusterOnly)              \
-)
-
-#endif
-
-
 NTKERNELAPI
 BOOLEAN
-NTAPI
-MmSetAddressRangeModified (
-    IN PVOID    Address,
-    IN SIZE_T    Length
+FASTCALL
+ExAcquireRundownProtectionEx (
+    IN PEX_RUNDOWN_REF  RunRef,
+    IN ULONG            Count
 );
 
 NTKERNELAPI
-NTSTATUS
-NTAPI
-ObCreateObject (
-    IN KPROCESSOR_MODE      ObjectAttributesAccessMode OPTIONAL,
-    IN POBJECT_TYPE         ObjectType,
-    IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
-    IN KPROCESSOR_MODE      AccessMode,
-    IN OUT PVOID            ParseContext OPTIONAL,
-    IN ULONG                ObjectSize,
-    IN ULONG                PagedPoolCharge OPTIONAL,
-    IN ULONG                NonPagedPoolCharge OPTIONAL,
-    OUT PVOID               *Object
+VOID
+FASTCALL
+ExReleaseRundownProtection (
+    IN PEX_RUNDOWN_REF  RunRef
 );
 
 NTKERNELAPI
-ULONG
-NTAPI
-ObGetObjectPointerCount (
-    IN PVOID Object
+VOID
+FASTCALL
+ExReleaseRundownProtectionEx (
+    IN PEX_RUNDOWN_REF  RunRef,
+    IN ULONG            Count
 );
 
 NTKERNELAPI
-NTSTATUS
-NTAPI
-ObInsertObject (
-    IN PVOID            Object,
-    IN PACCESS_STATE    PassedAccessState OPTIONAL,
-    IN ACCESS_MASK      DesiredAccess,
-    IN ULONG            AdditionalReferences,
-    OUT PVOID           *ReferencedObject OPTIONAL,
-    OUT PHANDLE         Handle
+VOID
+FASTCALL
+ExRundownCompleted (
+    IN PEX_RUNDOWN_REF  RunRef
 );
 
 NTKERNELAPI
 VOID
-NTAPI
-ObMakeTemporaryObject (
-    IN PVOID Object
+FASTCALL
+ExWaitForRundownProtectionRelease (
+    IN PEX_RUNDOWN_REF  RunRef
 );
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObOpenObjectByPointer (
-    IN PVOID            Object,
-    IN ULONG            HandleAttributes,
-    IN PACCESS_STATE    PassedAccessState OPTIONAL,
-    IN ACCESS_MASK      DesiredAccess OPTIONAL,
-    IN POBJECT_TYPE     ObjectType OPTIONAL,
-    IN KPROCESSOR_MODE  AccessMode,
-    OUT PHANDLE         Handle
-);
+#endif
+#endif /* (VER_PRODUCTBUILD >= 2600) */
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObQueryNameString (
-    IN PVOID                        Object,
-    OUT POBJECT_NAME_INFORMATION    ObjectNameInfo,
-    IN ULONG                        Length,
-    OUT PULONG                      ReturnLength
-);
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObQueryObjectAuditingByHandle (
-    IN HANDLE       Handle,
-    OUT PBOOLEAN    GenerateOnClose
-);
+#define FsRtlSetupAdvancedHeader( _advhdr, _fmutx )                         \
+{                                                                           \
+    SetFlag( (_advhdr)->Flags, FSRTL_FLAG_ADVANCED_HEADER );                \
+    SetFlag( (_advhdr)->Flags2, FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS );     \
+    (_advhdr)->Version = FSRTL_FCB_HEADER_V1;                               \
+    InitializeListHead( &(_advhdr)->FilterContexts );                       \
+    if ((_fmutx) != NULL) {                                                 \
+        (_advhdr)->FastMutex = (_fmutx);                                    \
+    }                                                                       \
+    *((PULONG_PTR)(&(_advhdr)->PushLock)) = 0;                              \
+    /*ExInitializePushLock( &(_advhdr)->PushLock ); API Not avaliable downlevel*/\
+    (_advhdr)->FileContextSupportPointer = NULL;                            \
+}
 
 NTKERNELAPI
-NTSTATUS
+BOOLEAN
 NTAPI
-ObReferenceObjectByName (
-    IN PUNICODE_STRING  ObjectName,
-    IN ULONG            Attributes,
-    IN PACCESS_STATE    PassedAccessState OPTIONAL,
-    IN ACCESS_MASK      DesiredAccess OPTIONAL,
-    IN POBJECT_TYPE     ObjectType,
-    IN KPROCESSOR_MODE  AccessMode,
-    IN OUT PVOID        ParseContext OPTIONAL,
-    OUT PVOID           *Object
+FsRtlAddBaseMcbEntry (
+    IN PBASE_MCB  Mcb,
+    IN LONGLONG   Vbn,
+    IN LONGLONG   Lbn,
+    IN LONGLONG   SectorCount
 );
 
 NTKERNELAPI
-NTSTATUS
+BOOLEAN
 NTAPI
-PsAssignImpersonationToken (
-    IN PETHREAD     Thread,
-    IN HANDLE       Token
+FsRtlAddLargeMcbEntry (
+    IN PLARGE_MCB  Mcb,
+    IN LONGLONG    Vbn,
+    IN LONGLONG    Lbn,
+    IN LONGLONG    SectorCount
 );
 
 NTKERNELAPI
-VOID
+BOOLEAN
 NTAPI
-PsChargePoolQuota (
-    IN PEPROCESS    Process,
-    IN POOL_TYPE    PoolType,
-    IN SIZE_T       Amount
+FsRtlAddMcbEntry (
+    IN PMCB   Mcb,
+    IN VBN    Vbn,
+    IN LBN    Lbn,
+    IN ULONG  SectorCount
 );
 
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-PsChargeProcessPoolQuota (
-    IN PEPROCESS    Process,
-    IN POOL_TYPE    PoolType,
-    IN SIZE_T       Amount
-);
-
-#define PsDereferenceImpersonationToken(T)  \
-            {if (ARGUMENT_PRESENT(T)) {     \
-                (ObDereferenceObject((T))); \
-            } else {                        \
-                ;                           \
-            }                               \
-}
-
-#define PsDereferencePrimaryToken(T) (ObDereferenceObject((T)))
+FsRtlAddToTunnelCache (
+    IN PTUNNEL          Cache,
+    IN ULONGLONG        DirectoryKey,
+    IN PUNICODE_STRING  ShortName,
+    IN PUNICODE_STRING  LongName,
+    IN BOOLEAN          KeyByShortName,
+    IN ULONG            DataLength,
+    IN PVOID            Data
+);
 
 NTKERNELAPI
-BOOLEAN
+PVOID
 NTAPI
-PsDisableImpersonation(
-    IN PETHREAD                 Thread,
-    IN PSE_IMPERSONATION_STATE  ImpersonationState
+FsRtlAllocatePool (
+    IN POOL_TYPE    PoolType,
+    IN ULONG        NumberOfBytes
 );
 
 NTKERNELAPI
-LARGE_INTEGER
+PVOID
 NTAPI
-PsGetProcessExitTime (
-    VOID
+FsRtlAllocatePoolWithQuota (
+    IN POOL_TYPE    PoolType,
+    IN ULONG        NumberOfBytes
 );
 
 NTKERNELAPI
-NTSTATUS
+PVOID
 NTAPI
-PsImpersonateClient(
-    IN PETHREAD                      Thread,
-    IN PACCESS_TOKEN                 Token,
-    IN BOOLEAN                       CopyOnOpen,
-    IN BOOLEAN                       EffectiveOnly,
-    IN SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel
+FsRtlAllocatePoolWithQuotaTag (
+    IN POOL_TYPE    PoolType,
+    IN ULONG        NumberOfBytes,
+    IN ULONG        Tag
 );
 
 NTKERNELAPI
-BOOLEAN
+PVOID
 NTAPI
-PsIsSystemThread(
-    IN PETHREAD Thread
+FsRtlAllocatePoolWithTag (
+    IN POOL_TYPE    PoolType,
+    IN ULONG        NumberOfBytes,
+    IN ULONG        Tag
 );
 
 NTKERNELAPI
 BOOLEAN
 NTAPI
-PsIsThreadTerminating (
-    IN PETHREAD Thread
+FsRtlAreNamesEqual (
+    IN PCUNICODE_STRING  Name1,
+    IN PCUNICODE_STRING  Name2,
+    IN BOOLEAN           IgnoreCase,
+    IN PCWCH             UpcaseTable OPTIONAL
 );
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsLookupProcessByProcessId (
-    IN HANDLE       ProcessId,
-    OUT PEPROCESS   *Process
+#define FsRtlAreThereCurrentFileLocks(FL) ( \
+    ((FL)->FastIoIsQuestionable)            \
+)
+
+typedef
+VOID
+(NTAPI*POPLOCK_WAIT_COMPLETE_ROUTINE) (
+    IN PVOID    Context,
+    IN PIRP     Irp
 );
 
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsLookupProcessThreadByCid (
-    IN PCLIENT_ID   Cid,
-    OUT PEPROCESS   *Process OPTIONAL,
-    OUT PETHREAD    *Thread
+typedef
+VOID
+(NTAPI*POPLOCK_FS_PREPOST_IRP) (
+    IN PVOID    Context,
+    IN PIRP     Irp
 );
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-PsLookupThreadByThreadId (
-    IN HANDLE       UniqueThreadId,
-    OUT PETHREAD    *Thread
+FsRtlCheckOplock (
+    IN POPLOCK                          Oplock,
+    IN PIRP                             Irp,
+    IN PVOID                            Context,
+    IN POPLOCK_WAIT_COMPLETE_ROUTINE    CompletionRoutine OPTIONAL,
+    IN POPLOCK_FS_PREPOST_IRP           PostIrpRoutine OPTIONAL
 );
 
 NTKERNELAPI
-PACCESS_TOKEN
+BOOLEAN
 NTAPI
-PsReferenceImpersonationToken (
-    IN PETHREAD                         Thread,
-    OUT PBOOLEAN                        CopyOnUse,
-    OUT PBOOLEAN                        EffectiveOnly,
-    OUT PSECURITY_IMPERSONATION_LEVEL   Level
+FsRtlCurrentBatchOplock (
+    IN POPLOCK Oplock
 );
 
 NTKERNELAPI
-HANDLE
+VOID
 NTAPI
-PsReferencePrimaryToken (
-    IN PEPROCESS Process
+FsRtlDeleteKeyFromTunnelCache (
+    IN PTUNNEL      Cache,
+    IN ULONGLONG    DirectoryKey
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-PsRestoreImpersonation(
-    IN PETHREAD                 Thread,
-    IN PSE_IMPERSONATION_STATE  ImpersonationState
+FsRtlDeleteTunnelCache (
+    IN PTUNNEL Cache
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-PsReturnPoolQuota (
-    IN PEPROCESS    Process,
-    IN POOL_TYPE    PoolType,
-    IN SIZE_T       Amount
+FsRtlDeregisterUncProvider (
+    IN HANDLE Handle
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-PsRevertToSelf (
-    VOID
+FsRtlDissectDbcs (
+    IN ANSI_STRING    Name,
+    OUT PANSI_STRING  FirstPart,
+    OUT PANSI_STRING  RemainingPart
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlAbsoluteToSelfRelativeSD (
-    IN PSECURITY_DESCRIPTOR              AbsoluteSecurityDescriptor,
-    IN OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
-    IN PULONG                            BufferLength
+FsRtlDissectName (
+    IN UNICODE_STRING    Name,
+    OUT PUNICODE_STRING  FirstPart,
+    OUT PUNICODE_STRING  RemainingPart
 );
 
-NTSYSAPI
-PVOID
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlAllocateHeap (
-    IN HANDLE  HeapHandle,
-    IN ULONG   Flags,
-    IN SIZE_T   Size
+FsRtlDoesDbcsContainWildCards (
+    IN PANSI_STRING Name
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlAppendStringToString(
-    PSTRING Destination,
-    const STRING *Source
+FsRtlDoesNameContainWildCards (
+    IN PUNICODE_STRING Name
 );
 
-NTSYSAPI
-USHORT
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlCaptureStackBackTrace (
-    IN ULONG FramesToSkip,
-    IN ULONG FramesToCapture,
-    OUT PVOID *BackTrace,
-    OUT PULONG BackTraceHash OPTIONAL
-);
+FsRtlIsFatDbcsLegal (
+    IN ANSI_STRING DbcsName,
+    IN BOOLEAN WildCardsPermissible,
+    IN BOOLEAN PathNamePermissible,
+    IN BOOLEAN LeadingBackslashPermissible
+    );
 
-NTSYSAPI
-SIZE_T
-NTAPI
-RtlCompareMemoryUlong (
-    PVOID Source,
-    SIZE_T Length,
-    ULONG Pattern
-);
 
-NTSYSAPI
-NTSTATUS
+#define FsRtlCompleteRequest(IRP,STATUS) {         \
+    (IRP)->IoStatus.Status = (STATUS);             \
+    IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \
+}
+
+#define FsRtlEnterFileSystem    KeEnterCriticalRegion
+
+#define FsRtlExitFileSystem     KeLeaveCriticalRegion
+
+#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) (       \
+     FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11)   \
+)
+
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlCompressBuffer (
-    IN USHORT   CompressionFormatAndEngine,
-    IN PUCHAR   UncompressedBuffer,
-    IN ULONG    UncompressedBufferSize,
-    OUT PUCHAR  CompressedBuffer,
-    IN ULONG    CompressedBufferSize,
-    IN ULONG    UncompressedChunkSize,
-    OUT PULONG  FinalCompressedSize,
-    IN PVOID    WorkSpace
+FsRtlFindInTunnelCache (
+    IN PTUNNEL          Cache,
+    IN ULONGLONG        DirectoryKey,
+    IN PUNICODE_STRING  Name,
+    OUT PUNICODE_STRING ShortName,
+    OUT PUNICODE_STRING LongName,
+    IN OUT PULONG       DataLength,
+    OUT PVOID           Data
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlCompressChunks (
-    IN PUCHAR                       UncompressedBuffer,
-    IN ULONG                        UncompressedBufferSize,
-    OUT PUCHAR                      CompressedBuffer,
-    IN ULONG                        CompressedBufferSize,
-    IN OUT PCOMPRESSED_DATA_INFO    CompressedDataInfo,
-    IN ULONG                        CompressedDataInfoLength,
-    IN PVOID                        WorkSpace
+FsRtlGetNextBaseMcbEntry (
+    IN PBASE_MCB   Mcb,
+    IN ULONG       RunIndex,
+    OUT PLONGLONG  Vbn,
+    OUT PLONGLONG  Lbn,
+    OUT PLONGLONG  SectorCount
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlConvertSidToUnicodeString (
-    OUT PUNICODE_STRING DestinationString,
-    IN PSID             Sid,
-    IN BOOLEAN          AllocateDestinationString
+FsRtlGetNextLargeMcbEntry (
+    IN PLARGE_MCB  Mcb,
+    IN ULONG       RunIndex,
+    OUT PLONGLONG  Vbn,
+    OUT PLONGLONG  Lbn,
+    OUT PLONGLONG  SectorCount
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlCopySid (
-    IN ULONG   Length,
-    IN PSID    Destination,
-    IN PSID    Source
+FsRtlGetNextMcbEntry (
+    IN PMCB     Mcb,
+    IN ULONG    RunIndex,
+    OUT PVBN    Vbn,
+    OUT PLBN    Lbn,
+    OUT PULONG  SectorCount
 );
 
-NTSYSAPI
-BOOLEAN
+#define FsRtlGetPerStreamContextPointer(FO) (   \
+    (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \
+)
+
+NTKERNELAPI
+VOID
 NTAPI
-RtlCreateUnicodeString(
-    PUNICODE_STRING DestinationString,
-    PCWSTR SourceString
+FsRtlInitializeBaseMcb (
+    IN PBASE_MCB  Mcb,
+    IN POOL_TYPE  PoolType
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlDecompressBuffer (
-    IN USHORT   CompressionFormat,
-    OUT PUCHAR  UncompressedBuffer,
-    IN ULONG    UncompressedBufferSize,
-    IN PUCHAR   CompressedBuffer,
-    IN ULONG    CompressedBufferSize,
-    OUT PULONG  FinalUncompressedSize
+FsRtlInitializeLargeMcb (
+    IN PLARGE_MCB  Mcb,
+    IN POOL_TYPE   PoolType
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlDecompressChunks (
-    OUT PUCHAR                  UncompressedBuffer,
-    IN ULONG                    UncompressedBufferSize,
-    IN PUCHAR                   CompressedBuffer,
-    IN ULONG                    CompressedBufferSize,
-    IN PUCHAR                   CompressedTail,
-    IN ULONG                    CompressedTailSize,
-    IN PCOMPRESSED_DATA_INFO    CompressedDataInfo
+FsRtlInitializeMcb (
+    IN PMCB       Mcb,
+    IN POOL_TYPE  PoolType
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlDecompressFragment (
-    IN USHORT   CompressionFormat,
-    OUT PUCHAR  UncompressedFragment,
-    IN ULONG    UncompressedFragmentSize,
-    IN PUCHAR   CompressedBuffer,
-    IN ULONG    CompressedBufferSize,
-    IN ULONG    FragmentOffset,
-    OUT PULONG  FinalUncompressedSize,
-    IN PVOID    WorkSpace
+FsRtlInitializeOplock (
+    IN OUT POPLOCK Oplock
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlDescribeChunk (
-    IN USHORT       CompressionFormat,
-    IN OUT PUCHAR   *CompressedBuffer,
-    IN PUCHAR       EndOfCompressedBufferPlus1,
-    OUT PUCHAR      *ChunkBuffer,
-    OUT PULONG      ChunkSize
+FsRtlInitializeTunnelCache (
+    IN PTUNNEL Cache
 );
 
-NTSYSAPI
+#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \
+    (PSC)->OwnerId = (O),                          \
+    (PSC)->InstanceId = (I),                       \
+    (PSC)->FreeCallback = (FC)                     \
+)
+
+NTKERNELAPI
 NTSTATUS
 NTAPI
-RtlDowncaseUnicodeString(
-    IN OUT PUNICODE_STRING UniDest,
-    IN PCUNICODE_STRING UniSource,
-    IN BOOLEAN AllocateDestinationString
+FsRtlInsertPerStreamContext (
+    IN PFSRTL_ADVANCED_FCB_HEADER  PerStreamContext,
+    IN PFSRTL_PER_STREAM_CONTEXT   Ptr
 );
 
-NTSYSAPI
-NTSTATUS
+#define FsRtlIsAnsiCharacterLegalFat(C, WILD) (                                \
+    FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) |       \
+                                        ((WILD) ? FSRTL_WILD_CHARACTER : 0 ))  \
+)
+
+#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) (                               \
+    FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) |      \
+                                        ((WILD) ? FSRTL_WILD_CHARACTER : 0 ))  \
+)
+
+#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) (                               \
+    FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) |      \
+                                        ((WILD) ? FSRTL_WILD_CHARACTER : 0 ))  \
+)
+
+#define FsRtlIsAnsiCharacterWild(C) (                                       \
+    FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \
+)
+
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlDuplicateUnicodeString(
-    IN ULONG Flags,
-    IN PCUNICODE_STRING SourceString,
-    OUT PUNICODE_STRING DestinationString
+FsRtlIsFatDbcsLegal (
+    IN ANSI_STRING  DbcsName,
+    IN BOOLEAN      WildCardsPermissible,
+    IN BOOLEAN      PathNamePermissible,
+    IN BOOLEAN      LeadingBackslashPermissible
 );
 
-NTSYSAPI
+NTKERNELAPI
 BOOLEAN
 NTAPI
-RtlEqualSid (
-    IN PSID Sid1,
-    IN PSID Sid2
+FsRtlIsHpfsDbcsLegal (
+    IN ANSI_STRING  DbcsName,
+    IN BOOLEAN      WildCardsPermissible,
+    IN BOOLEAN      PathNamePermissible,
+    IN BOOLEAN      LeadingBackslashPermissible
 );
 
-NTSYSAPI
-VOID
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlFillMemoryUlong (
-    IN PVOID    Destination,
-    IN ULONG    Length,
-    IN ULONG    Fill
+FsRtlIsNameInExpression (
+    IN PUNICODE_STRING  Expression,
+    IN PUNICODE_STRING  Name,
+    IN BOOLEAN          IgnoreCase,
+    IN PWCHAR           UpcaseTable OPTIONAL
 );
 
-NTSYSAPI
+NTKERNELAPI
 BOOLEAN
 NTAPI
-RtlFreeHeap (
-    IN HANDLE  HeapHandle,
-    IN ULONG   Flags,
-    IN PVOID   P
+FsRtlIsNtstatusExpected (
+    IN NTSTATUS Ntstatus
 );
 
-NTSYSAPI
-VOID
-NTAPI
-RtlFreeOemString (
-    IN POEM_STRING  OemString
-); 
+#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo
 
-NTSYSAPI
-VOID
-NTAPI
-RtlGenerate8dot3Name (
-    IN PUNICODE_STRING              Name,
-    IN BOOLEAN                      AllowExtendedCharacters,
-    IN OUT PGENERATE_NAME_CONTEXT   Context,
-    OUT PUNICODE_STRING             Name8dot3
-);
+extern PUSHORT NlsOemLeadByteInfo;
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetCompressionWorkSpaceSize (
-    IN USHORT   CompressionFormatAndEngine,
-    OUT PULONG  CompressBufferWorkSpaceSize,
-    OUT PULONG  CompressFragmentWorkSpaceSize
-);
+#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) (                               \
+    (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE :                           \
+              (NLS_MB_CODE_PAGE_TAG &&                                      \
+               (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0)))          \
+)
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetDaclSecurityDescriptor (
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
-    OUT PBOOLEAN            DaclPresent,
-    OUT PACL                *Dacl,
-    OUT PBOOLEAN            DaclDefaulted
-);
+#define FsRtlIsUnicodeCharacterWild(C) (                                    \
+    (((C) >= 0x40) ?                                                        \
+    FALSE :                                                                 \
+    FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER ))       \
+)
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlGetGroupSecurityDescriptor (
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
-    OUT PSID                *Group,
-    OUT PBOOLEAN            GroupDefaulted
+FsRtlLookupBaseMcbEntry (
+    IN PBASE_MCB   Mcb,
+    IN LONGLONG    Vbn,
+    OUT PLONGLONG  Lbn OPTIONAL,
+    OUT PLONGLONG  SectorCountFromLbn OPTIONAL,
+    OUT PLONGLONG  StartingLbn OPTIONAL,
+    OUT PLONGLONG  SectorCountFromStartingLbn OPTIONAL,
+    OUT PULONG     Index OPTIONAL
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlGetOwnerSecurityDescriptor (
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
-    OUT PSID                *Owner,
-    OUT PBOOLEAN            OwnerDefaulted
+FsRtlLookupLargeMcbEntry (
+    IN PLARGE_MCB  Mcb,
+    IN LONGLONG    Vbn,
+    OUT PLONGLONG  Lbn OPTIONAL,
+    OUT PLONGLONG  SectorCountFromLbn OPTIONAL,
+    OUT PLONGLONG  StartingLbn OPTIONAL,
+    OUT PLONGLONG  SectorCountFromStartingLbn OPTIONAL,
+    OUT PULONG     Index OPTIONAL
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlInitializeSid (
-    IN OUT PSID                     Sid,
-    IN PSID_IDENTIFIER_AUTHORITY    IdentifierAuthority,
-    IN UCHAR                        SubAuthorityCount
+FsRtlLookupLastBaseMcbEntry (
+    IN PBASE_MCB   Mcb,
+    OUT PLONGLONG  Vbn,
+    OUT PLONGLONG  Lbn
 );
 
-NTSYSAPI
+NTKERNELAPI
 BOOLEAN
 NTAPI
-RtlIsNameLegalDOS8Dot3(
-    IN PCUNICODE_STRING Name,
-    IN OUT POEM_STRING OemName OPTIONAL,
-    IN OUT PBOOLEAN NameContainsSpaces OPTIONAL
+FsRtlLookupLastLargeMcbEntry (
+    IN PLARGE_MCB  Mcb,
+    OUT PLONGLONG  Vbn,
+    OUT PLONGLONG  Lbn
 );
 
-NTSYSAPI
-ULONG
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlLengthRequiredSid (
-    IN ULONG SubAuthorityCount
+FsRtlLookupLastMcbEntry (
+    IN PMCB   Mcb,
+    OUT PVBN  Vbn,
+    OUT PLBN  Lbn
 );
 
-NTSYSAPI
-ULONG
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlLengthSid (
-    IN PSID Sid
+FsRtlLookupLastBaseMcbEntryAndIndex (
+    IN PBASE_MCB      OpaqueMcb,
+    IN OUT PLONGLONG  LargeVbn,
+    IN OUT PLONGLONG  LargeLbn,
+    IN OUT PULONG     Index
 );
 
-NTSYSAPI
-ULONG
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlNtStatusToDosError (
-    IN NTSTATUS Status
+FsRtlLookupLastLargeMcbEntryAndIndex (
+    IN PLARGE_MCB  OpaqueMcb,
+    OUT PLONGLONG  LargeVbn,
+    OUT PLONGLONG  LargeLbn,
+    OUT PULONG     Index
 );
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlxUnicodeStringToOemSize(
-    PCUNICODE_STRING UnicodeString
-    );
-
-NTSYSAPI
-ULONG
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlxOemStringToUnicodeSize(
-    PCOEM_STRING OemString
+FsRtlLookupMcbEntry (
+    IN PMCB     Mcb,
+    IN VBN      Vbn,
+    OUT PLBN    Lbn,
+    OUT PULONG  SectorCount OPTIONAL,
+    OUT PULONG  Index
 );
 
-#define RtlOemStringToUnicodeSize(STRING) (                 \
-    NLS_MB_OEM_CODE_PAGE_TAG ?                              \
-    RtlxOemStringToUnicodeSize(STRING) :                    \
-    ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)  \
-)
-
-#define RtlOemStringToCountedUnicodeSize(STRING) (                    \
-    (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
-)
-
-
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+PFSRTL_PER_STREAM_CONTEXT
 NTAPI
-RtlOemStringToUnicodeString(
-    IN OUT PUNICODE_STRING DestinationString,
-    IN PCOEM_STRING SourceString,
-    IN BOOLEAN AllocateDestinationString
+FsRtlLookupPerStreamContextInternal (
+    IN PFSRTL_ADVANCED_FCB_HEADER  StreamContext,
+    IN PVOID                       OwnerId OPTIONAL,
+    IN PVOID                       InstanceId OPTIONAL
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlUnicodeStringToOemString(
-    IN OUT POEM_STRING DestinationString,
-    IN PCUNICODE_STRING SourceString,
-    IN BOOLEAN AllocateDestinationString
+FsRtlMdlReadComplete (
+    IN PFILE_OBJECT     FileObject,
+    IN PMDL             MdlChain
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlOemStringToCountedUnicodeString(
-    IN OUT PUNICODE_STRING DestinationString,
-    IN PCOEM_STRING SourceString,
-    IN BOOLEAN AllocateDestinationString
+FsRtlMdlWriteComplete (
+    IN PFILE_OBJECT     FileObject,
+    IN PLARGE_INTEGER   FileOffset,
+    IN PMDL             MdlChain
 );
-    
-NTSYSAPI
+
+NTKERNELAPI
 NTSTATUS
 NTAPI
-RtlUnicodeStringToCountedOemString(
-    IN OUT POEM_STRING DestinationString,
-    IN PCUNICODE_STRING SourceString,
-    IN BOOLEAN AllocateDestinationString
+FsRtlNormalizeNtstatus (
+    IN NTSTATUS Exception,
+    IN NTSTATUS GenericException
 );
-    
-NTSYSAPI
-NTSTATUS
+
+NTKERNELAPI
+VOID
 NTAPI
-RtlReserveChunk (
-    IN USHORT       CompressionFormat,
-    IN OUT PUCHAR   *CompressedBuffer,
-    IN PUCHAR       EndOfCompressedBufferPlus1,
-    OUT PUCHAR      *ChunkBuffer,
-    IN ULONG        ChunkSize
+FsRtlNotifyChangeDirectory (
+    IN PNOTIFY_SYNC NotifySync,
+    IN PVOID        FsContext,
+    IN PSTRING      FullDirectoryName,
+    IN PLIST_ENTRY  NotifyList,
+    IN BOOLEAN      WatchTree,
+    IN ULONG        CompletionFilter,
+    IN PIRP         NotifyIrp
 );
 
-NTSYSAPI
+NTKERNELAPI
 VOID
 NTAPI
-RtlSecondsSince1970ToTime (
-    IN ULONG            SecondsSince1970,
-    OUT PLARGE_INTEGER  Time
+FsRtlNotifyCleanup (
+    IN PNOTIFY_SYNC NotifySync,
+    IN PLIST_ENTRY  NotifyList,
+    IN PVOID        FsContext
 );
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlSetGroupSecurityDescriptor (
-    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN PSID                     Group,
-    IN BOOLEAN                  GroupDefaulted
+typedef BOOLEAN (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) (
+    IN PVOID                        NotifyContext,
+    IN PVOID                        TargetContext,
+    IN PSECURITY_SUBJECT_CONTEXT    SubjectContext
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlSetOwnerSecurityDescriptor (
-    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN PSID                     Owner,
-    IN BOOLEAN                  OwnerDefaulted
-);
+FsRtlNotifyFilterChangeDirectory (
+    IN PNOTIFY_SYNC                 NotifySync,
+    IN PLIST_ENTRY                  NotifyList,
+    IN PVOID                        FsContext,
+    IN PSTRING                      FullDirectoryName,
+    IN BOOLEAN                      WatchTree,
+    IN BOOLEAN                      IgnoreBuffer,
+    IN ULONG                        CompletionFilter,
+    IN PIRP                         NotifyIrp,
+    IN PCHECK_FOR_TRAVERSE_ACCESS   TraverseCallback OPTIONAL,
+    IN PSECURITY_SUBJECT_CONTEXT    SubjectContext OPTIONAL,
+    IN PFILTER_REPORT_CHANGE        FilterCallback OPTIONAL);
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlSetSaclSecurityDescriptor (
-    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN BOOLEAN                  SaclPresent,
-    IN PACL                     Sacl,
-    IN BOOLEAN                  SaclDefaulted
-);
+FsRtlNotifyFilterReportChange (
+    IN PNOTIFY_SYNC   NotifySync,
+    IN PLIST_ENTRY    NotifyList,
+    IN PSTRING        FullTargetName,
+    IN USHORT         TargetNameOffset,
+    IN PSTRING        StreamName OPTIONAL,
+    IN PSTRING        NormalizedParentName OPTIONAL,
+    IN ULONG          FilterMatch,
+    IN ULONG          Action,
+    IN PVOID          TargetContext,
+    IN PVOID          FilterContext);
 
-NTSYSAPI
-PUCHAR
+NTKERNELAPI
+VOID
 NTAPI
-RtlSubAuthorityCountSid (
-    IN PSID Sid
+FsRtlNotifyFullChangeDirectory (
+    IN PNOTIFY_SYNC                 NotifySync,
+    IN PLIST_ENTRY                  NotifyList,
+    IN PVOID                        FsContext,
+    IN PSTRING                      FullDirectoryName,
+    IN BOOLEAN                      WatchTree,
+    IN BOOLEAN                      IgnoreBuffer,
+    IN ULONG                        CompletionFilter,
+    IN PIRP                         NotifyIrp,
+    IN PCHECK_FOR_TRAVERSE_ACCESS   TraverseCallback OPTIONAL,
+    IN PSECURITY_SUBJECT_CONTEXT    SubjectContext OPTIONAL
 );
 
-NTSYSAPI
-PULONG
+NTKERNELAPI
+VOID
 NTAPI
-RtlSubAuthoritySid (
-    IN PSID    Sid,
-    IN ULONG   SubAuthority
+FsRtlNotifyFullReportChange (
+    IN PNOTIFY_SYNC NotifySync,
+    IN PLIST_ENTRY  NotifyList,
+    IN PSTRING      FullTargetName,
+    IN USHORT       TargetNameOffset,
+    IN PSTRING      StreamName OPTIONAL,
+    IN PSTRING      NormalizedParentName OPTIONAL,
+    IN ULONG        FilterMatch,
+    IN ULONG        Action,
+    IN PVOID        TargetContext
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlUnicodeStringToCountedOemString (
-    IN OUT POEM_STRING  DestinationString,
-    IN PCUNICODE_STRING SourceString,
-    IN BOOLEAN          AllocateDestinationString
+FsRtlNotifyInitializeSync (
+    IN PNOTIFY_SYNC *NotifySync
 );
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlUnicodeToMultiByteN(
-    OUT PCHAR MultiByteString,
-    IN ULONG MaxBytesInMultiByteString,
-    OUT PULONG BytesInMultiByteString OPTIONAL,
-    IN PWCH UnicodeString,
-    IN ULONG BytesInUnicodeString
+FsRtlNotifyUninitializeSync (
+    IN PNOTIFY_SYNC *NotifySync
 );
 
-NTSYSAPI
+#if (VER_PRODUCTBUILD >= 2195)
+
+NTKERNELAPI
 NTSTATUS
 NTAPI
-RtlOemToUnicodeN(
-    OUT PWSTR UnicodeString,
-    IN ULONG MaxBytesInUnicodeString,
-    OUT PULONG BytesInUnicodeString OPTIONAL,
-    IN PCH OemString,
-    IN ULONG BytesInOemString
+FsRtlNotifyVolumeEvent (
+    IN PFILE_OBJECT FileObject,
+    IN ULONG        EventCode
 );
 
-/* RTL Splay Tree Functions */
-NTSYSAPI
-PRTL_SPLAY_LINKS
-NTAPI
-RtlSplay(PRTL_SPLAY_LINKS Links);
-
-NTSYSAPI
-PRTL_SPLAY_LINKS
-NTAPI
-RtlDelete(PRTL_SPLAY_LINKS Links);
+#endif /* (VER_PRODUCTBUILD >= 2195) */
 
-NTSYSAPI
-VOID
+NTKERNELAPI
+ULONG
 NTAPI
-RtlDeleteNoSplay(
-    PRTL_SPLAY_LINKS Links,
-    PRTL_SPLAY_LINKS *Root
+FsRtlNumberOfRunsInBaseMcb (
+    IN PBASE_MCB Mcb
 );
 
-NTSYSAPI
-PRTL_SPLAY_LINKS
-NTAPI
-RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links);
-
-NTSYSAPI
-PRTL_SPLAY_LINKS
+NTKERNELAPI
+ULONG
 NTAPI
-RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links);
+FsRtlNumberOfRunsInLargeMcb (
+    IN PLARGE_MCB Mcb
+);
 
-NTSYSAPI
-PRTL_SPLAY_LINKS
+NTKERNELAPI
+ULONG
 NTAPI
-RtlRealSuccessor(PRTL_SPLAY_LINKS Links);
+FsRtlNumberOfRunsInMcb (
+    IN PMCB Mcb
+);
 
-NTSYSAPI
-PRTL_SPLAY_LINKS
+NTKERNELAPI
+NTSTATUS
 NTAPI
-RtlRealPredecessor(PRTL_SPLAY_LINKS Links);
-
-#define RtlIsLeftChild(Links) \
-    (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
-
-#define RtlIsRightChild(Links) \
-    (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
-
-#define RtlRightChild(Links) \
-    ((PRTL_SPLAY_LINKS)(Links))->RightChild
-
-#define RtlIsRoot(Links) \
-    (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
-
-#define RtlLeftChild(Links) \
-    ((PRTL_SPLAY_LINKS)(Links))->LeftChild
-
-#define RtlParent(Links) \
-    ((PRTL_SPLAY_LINKS)(Links))->Parent
-
-#define RtlInitializeSplayLinks(Links)                  \
-    {                                                   \
-        PRTL_SPLAY_LINKS _SplayLinks;                   \
-        _SplayLinks = (PRTL_SPLAY_LINKS)(Links);        \
-        _SplayLinks->Parent = _SplayLinks;              \
-        _SplayLinks->LeftChild = NULL;                  \
-        _SplayLinks->RightChild = NULL;                 \
-    }
-
-#define RtlInsertAsLeftChild(ParentLinks,ChildLinks)    \
-    {                                                   \
-        PRTL_SPLAY_LINKS _SplayParent;                  \
-        PRTL_SPLAY_LINKS _SplayChild;                   \
-        _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
-        _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks);   \
-        _SplayParent->LeftChild = _SplayChild;          \
-        _SplayChild->Parent = _SplayParent;             \
-    }
-
-#define RtlInsertAsRightChild(ParentLinks,ChildLinks)   \
-    {                                                   \
-        PRTL_SPLAY_LINKS _SplayParent;                  \
-        PRTL_SPLAY_LINKS _SplayChild;                   \
-        _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
-        _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks);   \
-        _SplayParent->RightChild = _SplayChild;         \
-        _SplayChild->Parent = _SplayParent;             \
-    }
+FsRtlOplockFsctrl (
+    IN POPLOCK  Oplock,
+    IN PIRP     Irp,
+    IN ULONG    OpenCount
+);
 
-NTSYSAPI
+NTKERNELAPI
 BOOLEAN
 NTAPI
-RtlValidSid (
-    IN PSID Sid
+FsRtlOplockIsFastIoPossible (
+    IN POPLOCK Oplock
 );
 
-//
-// RTL time functions
-//
+typedef VOID
+(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) (
+    IN PVOID    Context,
+    IN PKEVENT  Event
+);
 
-NTSYSAPI
-BOOLEAN
+NTKERNELAPI
+VOID
 NTAPI
-RtlTimeToSecondsSince1980 (
-    PLARGE_INTEGER Time,
-    PULONG ElapsedSeconds
+FsRtlPostPagingFileStackOverflow (
+    IN PVOID                          Context,
+    IN PKEVENT                        Event,
+    IN PFSRTL_STACK_OVERFLOW_ROUTINE  StackOverflowRoutine
 );
 
-NTSYSAPI
+NTKERNELAPI
 VOID
 NTAPI
-RtlSecondsSince1980ToTime (
-    ULONG ElapsedSeconds,
-    PLARGE_INTEGER Time
+FsRtlPostStackOverflow (
+    IN PVOID                          Context,
+    IN PKEVENT                        Event,
+    IN PFSRTL_STACK_OVERFLOW_ROUTINE  StackOverflowRoutine
 );
 
-NTSYSAPI
-BOOLEAN
+NTKERNELAPI
+NTSTATUS
 NTAPI
-RtlTimeToSecondsSince1970 (
-    PLARGE_INTEGER Time,
-    PULONG ElapsedSeconds
+FsRtlRegisterUncProvider (
+    IN OUT PHANDLE      MupHandle,
+    IN PUNICODE_STRING  RedirectorDeviceName,
+    IN BOOLEAN          MailslotsSupported
 );
 
-NTSYSAPI
+NTKERNELAPI
 VOID
 NTAPI
-RtlSecondsSince1970ToTime (
-    ULONG ElapsedSeconds,
-    PLARGE_INTEGER Time
+FsRtlRemoveBaseMcbEntry (
+    IN PBASE_MCB  Mcb,
+    IN LONGLONG   Vbn,
+    IN LONGLONG   SectorCount
 );
 
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-SeAppendPrivileges (
-    PACCESS_STATE   AccessState,
-    PPRIVILEGE_SET  Privileges
+FsRtlRemoveLargeMcbEntry (
+    IN PLARGE_MCB  Mcb,
+    IN LONGLONG    Vbn,
+    IN LONGLONG    SectorCount
 );
 
 NTKERNELAPI
-BOOLEAN
+VOID
 NTAPI
-SeAuditingFileEvents (
-    IN BOOLEAN              AccessGranted,
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor
+FsRtlRemoveMcbEntry (
+    IN PMCB   Mcb,
+    IN VBN    Vbn,
+    IN ULONG  SectorCount
 );
 
 NTKERNELAPI
-BOOLEAN
+PFSRTL_PER_STREAM_CONTEXT
 NTAPI
-SeAuditingFileOrGlobalEvents (
-    IN BOOLEAN                      AccessGranted,
-    IN PSECURITY_DESCRIPTOR         SecurityDescriptor,
-    IN PSECURITY_SUBJECT_CONTEXT    SubjectContext
+FsRtlRemovePerStreamContext (
+    IN PFSRTL_ADVANCED_FCB_HEADER  StreamContext,
+    IN PVOID                       OwnerId OPTIONAL,
+    IN PVOID                       InstanceId OPTIONAL
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-SeCaptureSubjectContext (
-    OUT PSECURITY_SUBJECT_CONTEXT SubjectContext
+FsRtlResetBaseMcb (
+    IN PBASE_MCB Mcb
 );
 
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-SeCreateClientSecurity (
-    IN PETHREAD                     Thread,
-    IN PSECURITY_QUALITY_OF_SERVICE QualityOfService,
-    IN BOOLEAN                      RemoteClient,
-    OUT PSECURITY_CLIENT_CONTEXT    ClientContext
+FsRtlResetLargeMcb (
+    IN PLARGE_MCB  Mcb,
+    IN BOOLEAN     SelfSynchronized
 );
 
-#if (VER_PRODUCTBUILD >= 2195)
-
 NTKERNELAPI
-NTSTATUS
+BOOLEAN
 NTAPI
-SeCreateClientSecurityFromSubjectContext (
-    IN PSECURITY_SUBJECT_CONTEXT    SubjectContext,
-    IN PSECURITY_QUALITY_OF_SERVICE QualityOfService,
-    IN BOOLEAN                      ServerIsRemote,
-    OUT PSECURITY_CLIENT_CONTEXT    ClientContext
+FsRtlSplitBaseMcb (
+    IN PBASE_MCB  Mcb,
+    IN LONGLONG   Vbn,
+    IN LONGLONG   Amount
 );
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
-
-
-#define SeLengthSid( Sid ) \
-    (8 + (4 * ((SID *)Sid)->SubAuthorityCount))
-
-#define SeDeleteClientSecurity(C)  {                                           \
-            if (SeTokenType((C)->ClientToken) == TokenPrimary) {               \
-                PsDereferencePrimaryToken( (C)->ClientToken );                 \
-            } else {                                                           \
-                PsDereferenceImpersonationToken( (C)->ClientToken );           \
-            }                                                                  \
-}
-
 NTKERNELAPI
-VOID
+BOOLEAN
 NTAPI
-SeDeleteObjectAuditAlarm (
-    IN PVOID    Object,
-    IN HANDLE   Handle
+FsRtlSplitLargeMcb (
+    IN PLARGE_MCB  Mcb,
+    IN LONGLONG    Vbn,
+    IN LONGLONG    Amount
 );
 
-#define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports;
+#define FsRtlSupportsPerStreamContexts(FO) (                       \
+    (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) &&     \
+              FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \
+              FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS))               \
+)
 
 NTKERNELAPI
 VOID
 NTAPI
-SeFreePrivileges (
-    IN PPRIVILEGE_SET Privileges
+FsRtlTruncateBaseMcb (
+    IN PBASE_MCB  Mcb,
+    IN LONGLONG   Vbn
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-SeImpersonateClient (
-    IN PSECURITY_CLIENT_CONTEXT ClientContext,
-    IN PETHREAD                 ServerThread OPTIONAL
+FsRtlTruncateLargeMcb (
+    IN PLARGE_MCB  Mcb,
+    IN LONGLONG    Vbn
 );
 
-#if (VER_PRODUCTBUILD >= 2195)
-
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-SeImpersonateClientEx (
-    IN PSECURITY_CLIENT_CONTEXT ClientContext,
-    IN PETHREAD                 ServerThread OPTIONAL
+FsRtlTruncateMcb (
+    IN PMCB  Mcb,
+    IN VBN   Vbn
 );
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
-
 NTKERNELAPI
 VOID
 NTAPI
-SeLockSubjectContext (
-    IN PSECURITY_SUBJECT_CONTEXT SubjectContext
+FsRtlUninitializeBaseMcb (
+    IN PBASE_MCB Mcb
 );
 
 NTKERNELAPI
-NTSTATUS
+VOID
 NTAPI
-SeMarkLogonSessionForTerminationNotification (
-    IN PLUID LogonId
+FsRtlUninitializeLargeMcb (
+    IN PLARGE_MCB Mcb
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-SeOpenObjectAuditAlarm (
-    IN PUNICODE_STRING      ObjectTypeName,
-    IN PVOID                Object OPTIONAL,
-    IN PUNICODE_STRING      AbsoluteObjectName OPTIONAL,
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN PACCESS_STATE        AccessState,
-    IN BOOLEAN              ObjectCreated,
-    IN BOOLEAN              AccessGranted,
-    IN KPROCESSOR_MODE      AccessMode,
-    OUT PBOOLEAN            GenerateOnClose
+FsRtlUninitializeMcb (
+    IN PMCB Mcb
 );
 
 NTKERNELAPI
 VOID
 NTAPI
-SeOpenObjectForDeleteAuditAlarm (
-    IN PUNICODE_STRING      ObjectTypeName,
-    IN PVOID                Object OPTIONAL,
-    IN PUNICODE_STRING      AbsoluteObjectName OPTIONAL,
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN PACCESS_STATE        AccessState,
-    IN BOOLEAN              ObjectCreated,
-    IN BOOLEAN              AccessGranted,
-    IN KPROCESSOR_MODE      AccessMode,
-    OUT PBOOLEAN            GenerateOnClose
+FsRtlUninitializeOplock (
+    IN OUT POPLOCK Oplock
 );
 
 NTKERNELAPI
-BOOLEAN
+NTSTATUS
 NTAPI
-SePrivilegeCheck (
-    IN OUT PPRIVILEGE_SET           RequiredPrivileges,
-    IN PSECURITY_SUBJECT_CONTEXT    SubjectContext,
-    IN KPROCESSOR_MODE              AccessMode
+IoAttachDeviceToDeviceStackSafe(
+    IN PDEVICE_OBJECT   SourceDevice,
+    IN PDEVICE_OBJECT   TargetDevice,
+    OUT PDEVICE_OBJECT  *AttachedToDeviceObject
 );
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-SeQueryAuthenticationIdToken (
-    IN PACCESS_TOKEN    Token,
-    OUT PLUID           LogonId
+ObCreateObject (
+    IN KPROCESSOR_MODE      ObjectAttributesAccessMode OPTIONAL,
+    IN POBJECT_TYPE         ObjectType,
+    IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
+    IN KPROCESSOR_MODE      AccessMode,
+    IN OUT PVOID            ParseContext OPTIONAL,
+    IN ULONG                ObjectSize,
+    IN ULONG                PagedPoolCharge OPTIONAL,
+    IN ULONG                NonPagedPoolCharge OPTIONAL,
+    OUT PVOID               *Object
 );
 
-#if (VER_PRODUCTBUILD >= 2195)
-
 NTKERNELAPI
-NTSTATUS
+ULONG
 NTAPI
-SeQueryInformationToken (
-    IN PACCESS_TOKEN           Token,
-    IN TOKEN_INFORMATION_CLASS TokenInformationClass,
-    OUT PVOID                  *TokenInformation
+ObGetObjectPointerCount (
+    IN PVOID Object
 );
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
-
 NTKERNELAPI
 NTSTATUS
 NTAPI
-SeQuerySecurityDescriptorInfo (
-    IN PSECURITY_INFORMATION    SecurityInformation,
-    OUT PSECURITY_DESCRIPTOR    SecurityDescriptor,
-    IN OUT PULONG               Length,
-    IN PSECURITY_DESCRIPTOR     *ObjectsSecurityDescriptor
+ObReferenceObjectByName (
+    IN PUNICODE_STRING  ObjectName,
+    IN ULONG            Attributes,
+    IN PACCESS_STATE    PassedAccessState OPTIONAL,
+    IN ACCESS_MASK      DesiredAccess OPTIONAL,
+    IN POBJECT_TYPE     ObjectType,
+    IN KPROCESSOR_MODE  AccessMode,
+    IN OUT PVOID        ParseContext OPTIONAL,
+    OUT PVOID           *Object
 );
 
-#if (VER_PRODUCTBUILD >= 2195)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-SeQuerySessionIdToken (
-    IN PACCESS_TOKEN    Token,
-    IN PULONG           SessionId
-);
+PsAssignImpersonationToken(
+  IN PETHREAD Thread,
+  IN HANDLE Token OPTIONAL);
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+NTKERNELAPI
+HANDLE
+NTAPI
+PsReferencePrimaryToken(
+  IN OUT PEPROCESS Process);
 
-#define SeQuerySubjectContextToken( SubjectContext )                \
-    ( ARGUMENT_PRESENT(                                             \
-        ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken   \
-        ) ?                                                         \
-    ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken :     \
-    ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken )
+#endif
 
-typedef NTSTATUS (NTAPI *PSE_LOGON_SESSION_TERMINATED_ROUTINE) (
-    IN PLUID LogonId
-);
+#define PsDereferenceImpersonationToken(T)  \
+            {if (ARGUMENT_PRESENT(T)) {     \
+                (ObDereferenceObject((T))); \
+            } else {                        \
+                ;                           \
+            }                               \
+}
 
 NTKERNELAPI
 NTSTATUS
 NTAPI
-SeRegisterLogonSessionTerminatedRoutine (
-    IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine
-);
-
-NTKERNELAPI
-VOID
-NTAPI
-SeReleaseSubjectContext (
-    IN PSECURITY_SUBJECT_CONTEXT SubjectContext
+PsLookupProcessThreadByCid (
+    IN PCLIENT_ID   Cid,
+    OUT PEPROCESS   *Process OPTIONAL,
+    OUT PETHREAD    *Thread
 );
 
-NTKERNELAPI
+NTSYSAPI
 VOID
 NTAPI
-SeSetAccessStateGenericMapping (
-    PACCESS_STATE       AccessState,
-    PGENERIC_MAPPING    GenericMapping
+RtlSecondsSince1970ToTime (
+    IN ULONG            SecondsSince1970,
+    OUT PLARGE_INTEGER  Time
 );
 
-NTKERNELAPI
+NTSYSAPI
 NTSTATUS
 NTAPI
-SeSetSecurityDescriptorInfo (
-    IN PVOID                    Object OPTIONAL,
-    IN PSECURITY_INFORMATION    SecurityInformation,
-    IN PSECURITY_DESCRIPTOR     SecurityDescriptor,
-    IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
-    IN POOL_TYPE                PoolType,
-    IN PGENERIC_MAPPING         GenericMapping
+RtlSetSaclSecurityDescriptor (
+    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+    IN BOOLEAN                  SaclPresent,
+    IN PACL                     Sacl,
+    IN BOOLEAN                  SaclDefaulted
 );
 
-#if (VER_PRODUCTBUILD >= 2195)
-
-NTKERNELAPI
+NTSYSAPI
 NTSTATUS
 NTAPI
-SeSetSecurityDescriptorInfoEx (
-    IN PVOID                    Object OPTIONAL,
-    IN PSECURITY_INFORMATION    SecurityInformation,
-    IN PSECURITY_DESCRIPTOR     ModificationDescriptor,
-    IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
-    IN ULONG                    AutoInheritFlags,
-    IN POOL_TYPE                PoolType,
-    IN PGENERIC_MAPPING         GenericMapping
+RtlUnicodeStringToCountedOemString (
+    IN OUT POEM_STRING  DestinationString,
+    IN PCUNICODE_STRING SourceString,
+    IN BOOLEAN          AllocateDestinationString
 );
 
-NTKERNELAPI
-BOOLEAN
+/* RTL Splay Tree Functions */
+NTSYSAPI
+PRTL_SPLAY_LINKS
 NTAPI
-SeTokenIsAdmin (
-    IN PACCESS_TOKEN Token
-);
+RtlSplay(PRTL_SPLAY_LINKS Links);
 
-NTKERNELAPI
-BOOLEAN
+NTSYSAPI
+PRTL_SPLAY_LINKS
 NTAPI
-SeTokenIsRestricted (
-    IN PACCESS_TOKEN Token
-);
-
+RtlDelete(PRTL_SPLAY_LINKS Links);
 
-NTSTATUS
+NTSYSAPI
+VOID
 NTAPI
-SeLocateProcessImageName(
-    IN PEPROCESS Process,
-    OUT PUNICODE_STRING *pImageFileName
+RtlDeleteNoSplay(
+    PRTL_SPLAY_LINKS Links,
+    PRTL_SPLAY_LINKS *Root
 );
 
-#endif /* (VER_PRODUCTBUILD >= 2195) */
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links);
 
-NTKERNELAPI
-TOKEN_TYPE
+NTSYSAPI
+PRTL_SPLAY_LINKS
 NTAPI
-SeTokenType (
-    IN PACCESS_TOKEN Token
-);
+RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links);
 
-NTKERNELAPI
-VOID
+NTSYSAPI
+PRTL_SPLAY_LINKS
 NTAPI
-SeUnlockSubjectContext (
-    IN PSECURITY_SUBJECT_CONTEXT SubjectContext
-);
+RtlRealSuccessor(PRTL_SPLAY_LINKS Links);
 
-NTKERNELAPI
-NTSTATUS
+NTSYSAPI
+PRTL_SPLAY_LINKS
 NTAPI
-SeUnregisterLogonSessionTerminatedRoutine (
-    IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine
-);
+RtlRealPredecessor(PRTL_SPLAY_LINKS Links);
+
+#define RtlIsLeftChild(Links) \
+    (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
+
+#define RtlIsRightChild(Links) \
+    (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
+
+#define RtlRightChild(Links) \
+    ((PRTL_SPLAY_LINKS)(Links))->RightChild
+
+#define RtlIsRoot(Links) \
+    (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
+
+#define RtlLeftChild(Links) \
+    ((PRTL_SPLAY_LINKS)(Links))->LeftChild
+
+#define RtlParent(Links) \
+    ((PRTL_SPLAY_LINKS)(Links))->Parent
+
+#define RtlInitializeSplayLinks(Links)                  \
+    {                                                   \
+        PRTL_SPLAY_LINKS _SplayLinks;                   \
+        _SplayLinks = (PRTL_SPLAY_LINKS)(Links);        \
+        _SplayLinks->Parent = _SplayLinks;              \
+        _SplayLinks->LeftChild = NULL;                  \
+        _SplayLinks->RightChild = NULL;                 \
+    }
+
+#define RtlInsertAsLeftChild(ParentLinks,ChildLinks)    \
+    {                                                   \
+        PRTL_SPLAY_LINKS _SplayParent;                  \
+        PRTL_SPLAY_LINKS _SplayChild;                   \
+        _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
+        _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks);   \
+        _SplayParent->LeftChild = _SplayChild;          \
+        _SplayChild->Parent = _SplayParent;             \
+    }
+
+#define RtlInsertAsRightChild(ParentLinks,ChildLinks)   \
+    {                                                   \
+        PRTL_SPLAY_LINKS _SplayParent;                  \
+        PRTL_SPLAY_LINKS _SplayChild;                   \
+        _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
+        _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks);   \
+        _SplayParent->RightChild = _SplayChild;         \
+        _SplayChild->Parent = _SplayParent;             \
+    }
+
+//
+// RTL time functions
+//
+
+#define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports;
 
 #if (VER_PRODUCTBUILD >= 2195)
 
@@ -5653,70 +9166,6 @@ ZwAllocateVirtualMemory (
     IN ULONG        Protect
 );
 
-NTSTATUS
-NTAPI
-NtAccessCheckByTypeAndAuditAlarm(
-    IN PUNICODE_STRING SubsystemName,
-    IN HANDLE HandleId,
-    IN PUNICODE_STRING ObjectTypeName,
-    IN PUNICODE_STRING ObjectName,
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN PSID PrincipalSelfSid,
-    IN ACCESS_MASK DesiredAccess,
-    IN AUDIT_EVENT_TYPE AuditType,
-    IN ULONG Flags,
-    IN POBJECT_TYPE_LIST ObjectTypeList,
-    IN ULONG ObjectTypeLength,
-    IN PGENERIC_MAPPING GenericMapping,
-    IN BOOLEAN ObjectCreation,
-    OUT PACCESS_MASK GrantedAccess,
-    OUT PNTSTATUS AccessStatus,
-    OUT PBOOLEAN GenerateOnClose
-);
-
-NTSTATUS
-NTAPI
-NtAccessCheckByTypeResultListAndAuditAlarm(
-    IN PUNICODE_STRING SubsystemName,
-    IN HANDLE HandleId,
-    IN PUNICODE_STRING ObjectTypeName,
-    IN PUNICODE_STRING ObjectName,
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN PSID PrincipalSelfSid,
-    IN ACCESS_MASK DesiredAccess,
-    IN AUDIT_EVENT_TYPE AuditType,
-    IN ULONG Flags,
-    IN POBJECT_TYPE_LIST ObjectTypeList,
-    IN ULONG ObjectTypeLength,
-    IN PGENERIC_MAPPING GenericMapping,
-    IN BOOLEAN ObjectCreation,
-    OUT PACCESS_MASK GrantedAccess,
-    OUT PNTSTATUS AccessStatus,
-    OUT PBOOLEAN GenerateOnClose
-);
-
-NTSTATUS
-NTAPI
-NtAccessCheckByTypeResultListAndAuditAlarmByHandle(
-    IN PUNICODE_STRING SubsystemName,
-    IN HANDLE HandleId,
-    IN HANDLE ClientToken,
-    IN PUNICODE_STRING ObjectTypeName,
-    IN PUNICODE_STRING ObjectName,
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN PSID PrincipalSelfSid,
-    IN ACCESS_MASK DesiredAccess,
-    IN AUDIT_EVENT_TYPE AuditType,
-    IN ULONG Flags,
-    IN POBJECT_TYPE_LIST ObjectTypeList,
-    IN ULONG ObjectTypeLength,
-    IN PGENERIC_MAPPING GenericMapping,
-    IN BOOLEAN ObjectCreation,
-    OUT PACCESS_MASK GrantedAccess,
-    OUT PNTSTATUS AccessStatus,
-    OUT PBOOLEAN GenerateOnClose
-);
-
 NTSYSAPI
 NTSTATUS
 NTAPI
@@ -5800,21 +9249,23 @@ ZwDeleteValueKey (
     IN PUNICODE_STRING  Name
 );
 
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 NTSYSAPI
 NTSTATUS
 NTAPI
 ZwDeviceIoControlFile (
-    IN HANDLE               FileHandle,
-    IN HANDLE               Event OPTIONAL,
-    IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,
-    IN PVOID                ApcContext OPTIONAL,
-    OUT PIO_STATUS_BLOCK    IoStatusBlock,
-    IN ULONG                IoControlCode,
-    IN PVOID                InputBuffer OPTIONAL,
-    IN ULONG                InputBufferLength,
-    OUT PVOID               OutputBuffer OPTIONAL,
-    IN ULONG                OutputBufferLength
-);
+  IN HANDLE FileHandle,
+  IN HANDLE Event OPTIONAL,
+  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+  IN PVOID ApcContext OPTIONAL,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG IoControlCode,
+  IN PVOID InputBuffer OPTIONAL,
+  IN ULONG InputBufferLength,
+  OUT PVOID OutputBuffer OPTIONAL,
+  IN ULONG OutputBufferLength);
+#endif
 
 NTSYSAPI
 NTSTATUS
@@ -5848,17 +9299,6 @@ ZwDuplicateToken (
     OUT PHANDLE             NewTokenHandle
 );
 
-NTSTATUS
-NTAPI
-NtFilterToken(
-    IN HANDLE ExistingTokenHandle,
-    IN ULONG Flags,
-    IN PTOKEN_GROUPS SidsToDisable OPTIONAL,
-    IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL,
-    IN PTOKEN_GROUPS RestrictedSids OPTIONAL,
-    OUT PHANDLE NewTokenHandle
-);
-
 NTSYSAPI
 NTSTATUS
 NTAPI
@@ -5971,15 +9411,6 @@ ZwOpenDirectoryObject (
     IN POBJECT_ATTRIBUTES   ObjectAttributes
 );
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwOpenEvent (
-    OUT PHANDLE             EventHandle,
-    IN ACCESS_MASK          DesiredAccess,
-    IN POBJECT_ATTRIBUTES   ObjectAttributes
-);
-
 NTSYSAPI
 NTSTATUS
 NTAPI
@@ -6287,14 +9718,15 @@ ZwUnloadKey (
     IN POBJECT_ATTRIBUTES KeyObjectAttributes
 );
 
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 NTSYSAPI
 NTSTATUS
 NTAPI
 ZwWaitForSingleObject (
-    IN HANDLE           Handle,
-    IN BOOLEAN          Alertable,
-    IN PLARGE_INTEGER   Timeout OPTIONAL
-);
+  IN HANDLE Handle,
+  IN BOOLEAN Alertable,
+  IN PLARGE_INTEGER Timeout OPTIONAL);
+#endif
 
 NTSYSAPI
 NTSTATUS
@@ -6319,5 +9751,3 @@ ZwYieldExecution (
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* _NTIFS_ */
index 01f4593..48f7107 100644 (file)
 extern "C" {
 #endif
 
+#ifndef _PO_DDK_
+#define _PO_DDK_
+
+/* Power States/Levels */
+typedef enum _SYSTEM_POWER_STATE {
+    PowerSystemUnspecified,
+    PowerSystemWorking,
+    PowerSystemSleeping1,
+    PowerSystemSleeping2,
+    PowerSystemSleeping3,
+    PowerSystemHibernate,
+    PowerSystemShutdown,
+    PowerSystemMaximum
+} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
+#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
+
+typedef enum _DEVICE_POWER_STATE {
+    PowerDeviceUnspecified,
+    PowerDeviceD0,
+    PowerDeviceD1,
+    PowerDeviceD2,
+    PowerDeviceD3,
+    PowerDeviceMaximum
+} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
+
+typedef union _POWER_STATE {
+  SYSTEM_POWER_STATE  SystemState;
+  DEVICE_POWER_STATE  DeviceState;
+} POWER_STATE, *PPOWER_STATE;
+
+typedef enum _POWER_STATE_TYPE {
+  SystemPowerState = 0,
+  DevicePowerState
+} POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
+
+typedef enum _POWER_INFORMATION_LEVEL {
+    SystemPowerPolicyAc,
+    SystemPowerPolicyDc,
+    VerifySystemPolicyAc,
+    VerifySystemPolicyDc,
+    SystemPowerCapabilities,
+    SystemBatteryState,
+    SystemPowerStateHandler,
+    ProcessorStateHandler,
+    SystemPowerPolicyCurrent,
+    AdministratorPowerPolicy,
+    SystemReserveHiberFile,
+    ProcessorInformation,
+    SystemPowerInformation,
+    ProcessorStateHandler2,
+    LastWakeTime,
+    LastSleepTime,
+    SystemExecutionState,
+    SystemPowerStateNotifyHandler,
+    ProcessorPowerPolicyAc,
+    ProcessorPowerPolicyDc,
+    VerifyProcessorPowerPolicyAc,
+    VerifyProcessorPowerPolicyDc,
+    ProcessorPowerPolicyCurrent,
+    SystemPowerStateLogging,
+    SystemPowerLoggingEntry,
+    SetPowerSettingValue,
+    NotifyUserPowerSetting,
+    PowerInformationLevelUnused0,
+    PowerInformationLevelUnused1,
+    SystemVideoState,
+    TraceApplicationPowerMessage,
+    TraceApplicationPowerMessageEnd,
+    ProcessorPerfStates,
+    ProcessorIdleStates,
+    ProcessorCap,
+    SystemWakeSource,
+    SystemHiberFileInformation,
+    TraceServicePowerMessage,
+    ProcessorLoad,
+    PowerShutdownNotification,
+    MonitorCapabilities,
+    SessionPowerInit,
+    SessionDisplayState,
+    PowerRequestCreate,
+    PowerRequestAction,
+    GetPowerRequestList,
+    ProcessorInformationEx,
+    NotifyUserModeLegacyPowerEvent,
+    GroupPark,
+    ProcessorIdleDomains,
+    WakeTimerList,
+    SystemHiberFileSize,
+    PowerInformationLevelMaximum
+} POWER_INFORMATION_LEVEL;
+
+typedef enum {
+    PowerActionNone,
+    PowerActionReserved,
+    PowerActionSleep,
+    PowerActionHibernate,
+    PowerActionShutdown,
+    PowerActionShutdownReset,
+    PowerActionShutdownOff,
+    PowerActionWarmEject
+} POWER_ACTION, *PPOWER_ACTION;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
+typedef struct {
+    ULONG Granularity;
+    ULONG Capacity;
+} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
+
+
+#endif /* _PO_DDK_ */
+
 #define POWER_PERF_SCALE                  100
 #define PERF_LEVEL_TO_PERCENT(x)          (((x) * 1000) / (POWER_PERF_SCALE * 10))
 #define PERCENT_TO_PERF_LEVEL(x)          (((x) * POWER_PERF_SCALE * 10) / 1000)
 
-typedef struct {
-    ULONG       Granularity;
-    ULONG       Capacity;
-} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
-
 typedef struct _PROCESSOR_IDLE_TIMES {
        ULONGLONG  StartTime;
        ULONGLONG  EndTime;
@@ -270,6 +377,39 @@ typedef struct _PROCESSOR_POWER_INFORMATION {
   ULONG  CurrentIdleState;
 } PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;
 
+typedef struct _POWER_ACTION_POLICY {
+    POWER_ACTION Action;
+    ULONG Flags;
+    ULONG EventCode;
+} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;
+
+/* POWER_ACTION_POLICY.Flags constants */
+#define POWER_ACTION_QUERY_ALLOWED        0x00000001
+#define POWER_ACTION_UI_ALLOWED           0x00000002
+#define POWER_ACTION_OVERRIDE_APPS        0x00000004
+#define POWER_ACTION_LIGHTEST_FIRST       0x10000000
+#define POWER_ACTION_LOCK_CONSOLE         0x20000000
+#define POWER_ACTION_DISABLE_WAKES        0x40000000
+#define POWER_ACTION_CRITICAL             0x80000000
+
+/* POWER_ACTION_POLICY.EventCode constants */
+#define POWER_LEVEL_USER_NOTIFY_TEXT      0x00000001
+#define POWER_LEVEL_USER_NOTIFY_SOUND     0x00000002
+#define POWER_LEVEL_USER_NOTIFY_EXEC      0x00000004
+#define POWER_USER_NOTIFY_BUTTON          0x00000008
+#define POWER_USER_NOTIFY_SHUTDOWN        0x00000010
+#define POWER_FORCE_TRIGGER_RESET         0x80000000
+
+#define DISCHARGE_POLICY_CRITICAL      0
+#define DISCHARGE_POLICY_LOW           1
+#define NUM_DISCHARGE_POLICIES         4
+
+#define PO_THROTTLE_NONE       0
+#define PO_THROTTLE_CONSTANT   1
+#define PO_THROTTLE_DEGRADE    2
+#define PO_THROTTLE_ADAPTIVE   3
+#define PO_THROTTLE_MAXIMUM    4
+
 #ifdef __cplusplus
 }
 #endif
index 7489147..bac87bd 100644 (file)
@@ -33,7 +33,7 @@ extern "C" {
 #define __IUnknown_INTERFACE_DEFINED__
 DEFINE_GUID(
     IID_IUnknown,
-    0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46);
+    0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 
 #undef INTERFACE
 #define INTERFACE IUnknown
index d4652f6..c50e5b1 100644 (file)
 
 #include <punknown.h>
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 /* ===============================================================
     INonDelegatingUnknown interface
 */
@@ -110,7 +119,7 @@ Unknown_Release(
 
 typedef struct CUnknown
 {
-    union
+    __GNU_EXTENSION union
     {
         IUnknown IUnknown;
         INonDelegatingUnknown INonDelegatingUnknown;
index a223fa2..f0a72f5 100644 (file)
@@ -5,6 +5,15 @@
 #include <windef.h>
 #include <ks.h>
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
 #define STREAMAPI __stdcall
 #define STREAM_SYSTEM_TIME_MASK   ((STREAM_SYSTEM_TIME)0x00000001FFFFFFFF)
 
@@ -37,8 +46,8 @@ typedef enum
 #endif
 
 typedef PHYSICAL_ADDRESS STREAM_PHYSICAL_ADDRESS, *PSTREAM_PHYSICAL_ADDRESS;
-typedef unsigned __int64 STREAM_SYSTEM_TIME, *PSTREAM_SYSTEM_TIME;
-typedef unsigned __int64 STREAM_TIMESTAMP, *PSTREAM_TIMESTAMP;
+__GNU_EXTENSION typedef unsigned __int64 STREAM_SYSTEM_TIME, *PSTREAM_SYSTEM_TIME;
+__GNU_EXTENSION typedef unsigned __int64 STREAM_TIMESTAMP, *PSTREAM_TIMESTAMP;
 
 typedef enum
 {
@@ -61,7 +70,7 @@ typedef struct _HW_EVENT_DESCRIPTOR
     BOOLEAN Enable;
     PKSEVENT_ENTRY EventEntry;
     PKSEVENTDATA EventData;
-    union
+    __GNU_EXTENSION union
     {
         struct _HW_STREAM_OBJECT * StreamObject;
         struct _HW_DEVICE_EXTENSION *DeviceExtension;
@@ -285,7 +294,7 @@ typedef struct _HW_STREAM_REQUEST_BLOCK
     ULONG           Flags;
     PVOID       HwInstanceExtension;
 
-    union
+    __GNU_EXTENSION union
        {
         ULONG           NumberOfBytesToTransfer;
         ULONG           ActualBytesTransferred;
@@ -376,11 +385,11 @@ typedef enum _STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE
 
 typedef struct _HW_INITIALIZATION_DATA {
 #if (NTDDI_VERSION >= NTDDI_WINXP)
-    union
-       {
+    __GNU_EXTENSION union
+    {
         ULONG           HwInitializationDataSize;
-        struct
-               {
+        __GNU_EXTENSION struct
+       {
             USHORT      SizeOfThisPacket;
             USHORT      StreamClassVersion;
         };
index fa3679e..7c5f90d 100644 (file)
@@ -397,7 +397,9 @@ TdiDefaultSendPossibleHandler(
   bIrpSp->DeviceObject  = (bDevObj);                                      \
   bIrpSp->FileObject    = (bFileObj);                                     \
   if (bCompRoutine)                                                       \
-    IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \
+  {                                                                       \
+    IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE);\
+  }                                                                       \
   else                                                                    \
     IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE);        \
 }
diff --git a/reactos/include/ddk/usb200.h b/reactos/include/ddk/usb200.h
deleted file mode 100644 (file)
index 7419b7f..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#ifndef   __USB200_H__
-#define   __USB200_H__
-
-#include "usb100.h"
-
-#include <pshpack1.h>
-
-
-typedef enum _USB_DEVICE_TYPE
-{
-  Usb11Device = 0,
-  Usb20Device
-} USB_DEVICE_TYPE;
-
-typedef enum _USB_DEVICE_SPEED
-{
-  UsbLowSpeed = 0,
-  UsbFullSpeed,
-  UsbHighSpeed
-} USB_DEVICE_SPEED;
-
-typedef union _BM_REQUEST_TYPE
-{
-  struct _BM
-  {
-    UCHAR   Recipient:2;
-    UCHAR   Reserved:3;
-    UCHAR   Type:2;
-    UCHAR   Dir:1;
-  } _BM;
-  UCHAR B;
-} BM_REQUEST_TYPE, *PBM_REQUEST_TYPE;
-
-typedef struct _USB_DEFAULT_PIPE_SETUP_PACKET
-{
-  BM_REQUEST_TYPE bmRequestType;
-  UCHAR bRequest;
-  union _wValue
-  {
-    struct
-    {
-      UCHAR LowByte;
-      UCHAR HiByte;
-    };
-    USHORT W;
-  } wValue;
-  union _wIndex
-  {
-    struct
-    {
-      UCHAR LowByte;
-      UCHAR HiByte;
-    };
-    USHORT W;
-  } wIndex;
-  USHORT wLength;
-} USB_DEFAULT_PIPE_SETUP_PACKET, *PUSB_DEFAULT_PIPE_SETUP_PACKET;
-
-
-C_ASSERT(sizeof(USB_DEFAULT_PIPE_SETUP_PACKET) == 8);
-
-typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR
-{
-  UCHAR bLength;
-  UCHAR bDescriptorType;
-  USHORT bcdUSB;
-  UCHAR bDeviceClass;
-  UCHAR bDeviceSubClass;
-  UCHAR bDeviceProtocol;
-  UCHAR bMaxPacketSize0;
-  UCHAR bNumConfigurations;
-  UCHAR bReserved;
-} USB_DEVICE_QUALIFIER_DESCRIPTOR, *PUSB_DEVICE_QUALIFIER_DESCRIPTOR;
-
-
-typedef union _USB_HIGH_SPEED_MAXPACKET
-{
-  struct _MP
-  {
-    USHORT MaxPacket:11;
-    USHORT HSmux:2;
-    USHORT Reserved:3;
-  } _MP;
-  USHORT us;
-} USB_HIGH_SPEED_MAXPACKET, *PUSB_HIGH_SPEED_MAXPACKET;
-
-typedef struct _USB_INTERFACE_ASSOCIATION_DESCRIPTOR
-{
-  UCHAR   bLength;
-  UCHAR   bDescriptorType;
-  UCHAR   bFirstInterface;
-  UCHAR   bInterfaceCount;
-  UCHAR   bFunctionClass;
-  UCHAR   bFunctionSubClass;
-  UCHAR   bFunctionProtocol;
-  UCHAR   iFunction;
-} USB_INTERFACE_ASSOCIATION_DESCRIPTOR, *PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR;
-
-#define USB_PORT_STATUS_CONNECT                     0x0001
-#define USB_PORT_STATUS_ENABLE                      0x0002
-#define USB_PORT_STATUS_SUSPEND                     0x0004
-#define USB_PORT_STATUS_OVER_CURRENT                0x0008
-#define USB_PORT_STATUS_RESET                       0x0010
-#define USB_PORT_STATUS_POWER                       0x0100
-#define USB_PORT_STATUS_LOW_SPEED                   0x0200
-#define USB_PORT_STATUS_HIGH_SPEED                  0x0400
-#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE        0x06
-#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE   0x0B
-
-#include <poppack.h>
-
-#endif //__USB200_H__
diff --git a/reactos/include/ddk/usbbusif.h b/reactos/include/ddk/usbbusif.h
new file mode 100644 (file)
index 0000000..0483738
--- /dev/null
@@ -0,0 +1,193 @@
+#pragma once
+
+#ifndef USB_BUSIFFN
+#define USB_BUSIFFN __stdcall
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+typedef PVOID PUSB_DEVICE_HANDLE;
+
+typedef NTSTATUS
+(USB_BUSIFFN *PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB) (
+  IN PVOID,
+  IN PURB);
+
+#define USB_HCD_CAPS_SUPPORTS_RT_THREADS    0x00000001
+
+typedef VOID
+(USB_BUSIFFN *PUSB_BUSIFFN_GETUSBDI_VERSION) (
+  IN PVOID,
+  OUT PUSBD_VERSION_INFORMATION OPTIONAL,
+  OUT PULONG OPTIONAL);
+
+typedef NTSTATUS
+(USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME) (
+  IN PVOID,
+  OUT PULONG OPTIONAL);
+
+typedef NTSTATUS
+(USB_BUSIFFN *PUSB_BUSIFFN_ENUM_LOG_ENTRY) (
+  IN PVOID,
+  IN ULONG,
+  IN ULONG,
+  IN ULONG,
+  IN ULONG);
+
+typedef struct _USB_BUS_INFORMATION_LEVEL_0 {
+  ULONG TotalBandwidth;
+  ULONG ConsumedBandwidth;
+} USB_BUS_INFORMATION_LEVEL_0, *PUSB_BUS_INFORMATION_LEVEL_0;
+
+typedef struct _USB_BUS_INFORMATION_LEVEL_1 {
+  ULONG TotalBandwidth;
+  ULONG ConsumedBandwidth;
+  ULONG ControllerNameLength;
+  WCHAR ControllerNameUnicodeString[1];
+} USB_BUS_INFORMATION_LEVEL_1, *PUSB_BUS_INFORMATION_LEVEL_1;
+
+typedef NTSTATUS
+(USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_INFORMATION) (
+  IN PVOID,
+  IN ULONG,
+  IN OUT PVOID,
+  OUT PULONG,
+  OUT PULONG OPTIONAL);
+
+typedef BOOLEAN
+(USB_BUSIFFN *PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED) (
+  IN PVOID OPTIONAL);
+
+#define USB_BUSIF_USBDI_VERSION_0         0x0000
+#define USB_BUSIF_USBDI_VERSION_1         0x0001
+#define USB_BUSIF_USBDI_VERSION_2         0x0002
+#define USB_BUSIF_USBDI_VERSION_3         0x0003
+
+DEFINE_GUID(USB_BUS_INTERFACE_USBDI_GUID, 
+0xb1a96a13, 0x3de0, 0x4574, 0x9b, 0x1, 0xc0, 0x8f, 0xea, 0xb3, 0x18, 0xd6);
+
+typedef struct _USB_BUS_INTERFACE_USBDI_V0 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_GETUSBDI_VERSION GetUSBDIVersion;
+  PUSB_BUSIFFN_QUERY_BUS_TIME QueryBusTime;
+  PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB SubmitIsoOutUrb;
+  PUSB_BUSIFFN_QUERY_BUS_INFORMATION QueryBusInformation;
+} USB_BUS_INTERFACE_USBDI_V0, *PUSB_BUS_INTERFACE_USBDI_V0;
+
+typedef struct _USB_BUS_INTERFACE_USBDI_V1 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_GETUSBDI_VERSION GetUSBDIVersion;
+  PUSB_BUSIFFN_QUERY_BUS_TIME QueryBusTime;
+  PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB SubmitIsoOutUrb;
+  PUSB_BUSIFFN_QUERY_BUS_INFORMATION QueryBusInformation;
+  PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED IsDeviceHighSpeed;
+} USB_BUS_INTERFACE_USBDI_V1, *PUSB_BUS_INTERFACE_USBDI_V1;
+
+typedef struct _USB_BUS_INTERFACE_USBDI_V2 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_GETUSBDI_VERSION GetUSBDIVersion;
+  PUSB_BUSIFFN_QUERY_BUS_TIME QueryBusTime;
+  PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB SubmitIsoOutUrb;
+  PUSB_BUSIFFN_QUERY_BUS_INFORMATION QueryBusInformation;
+  PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED IsDeviceHighSpeed;
+  PUSB_BUSIFFN_ENUM_LOG_ENTRY EnumLogEntry;
+} USB_BUS_INTERFACE_USBDI_V2, *PUSB_BUS_INTERFACE_USBDI_V2;
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+typedef NTSTATUS
+(USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME_EX) (
+  IN PVOID OPTIONAL,
+  OUT PULONG OPTIONAL);
+
+typedef NTSTATUS
+(USB_BUSIFFN *PUSB_BUSIFFN_QUERY_CONTROLLER_TYPE) (
+  IN PVOID OPTIONAL,
+  OUT PULONG OPTIONAL,
+  OUT PUSHORT OPTIONAL,
+  OUT PUSHORT OPTIONAL,
+  OUT PUCHAR OPTIONAL,
+  OUT PUCHAR OPTIONAL,
+  OUT PUCHAR OPTIONAL,
+  OUT PUCHAR OPTIONAL);
+
+typedef struct _USB_BUS_INTERFACE_USBDI_V3 {
+  USHORT Size;
+  USHORT Version;
+  PVOID BusContext;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  PUSB_BUSIFFN_GETUSBDI_VERSION GetUSBDIVersion;
+  PUSB_BUSIFFN_QUERY_BUS_TIME QueryBusTime;
+  PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB SubmitIsoOutUrb;
+  PUSB_BUSIFFN_QUERY_BUS_INFORMATION QueryBusInformation;
+  PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED IsDeviceHighSpeed;
+  PUSB_BUSIFFN_ENUM_LOG_ENTRY EnumLogEntry;
+  PUSB_BUSIFFN_QUERY_BUS_TIME_EX QueryBusTimeEx;
+  PUSB_BUSIFFN_QUERY_CONTROLLER_TYPE QueryControllerType;
+} USB_BUS_INTERFACE_USBDI_V3, *PUSB_BUS_INTERFACE_USBDI_V3;
+
+DEFINE_GUID(USB_BUS_INTERFACE_USBC_CONFIGURATION_GUID, 
+0x893b6a96, 0xb7f, 0x4d4d, 0xbd, 0xb4, 0xbb, 0xd4, 0xce, 0xeb, 0xb3, 0x1c);
+
+#define USBC_FUNCTION_FLAG_APPEND_ID 0x1
+
+typedef struct _USBC_FUNCTION_DESCRIPTOR{
+  UCHAR FunctionNumber;
+  UCHAR NumberOfInterfaces;
+  PUSB_INTERFACE_DESCRIPTOR *InterfaceDescriptorList;
+  UNICODE_STRING HardwareId;
+  UNICODE_STRING CompatibleId;
+  UNICODE_STRING FunctionDescription;
+  ULONG FunctionFlags;
+  PVOID Reserved;
+} USBC_FUNCTION_DESCRIPTOR, *PUSBC_FUNCTION_DESCRIPTOR;
+
+typedef
+NTSTATUS
+(USB_BUSIFFN *USBC_START_DEVICE_CALLBACK)(
+  IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor,
+  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+  OUT PUSBC_FUNCTION_DESCRIPTOR *FunctionDescriptorBuffer,
+  OUT PULONG FunctionDescriptorBufferLength,
+  IN PDEVICE_OBJECT FdoDeviceObject,
+  IN PDEVICE_OBJECT PdoDeviceObject);
+
+typedef
+BOOLEAN
+(USB_BUSIFFN *USBC_PDO_ENABLE_CALLBACK)(
+  IN PVOID  Context,
+  IN USHORT FirstInterfaceNumber,
+  IN USHORT NumberOfInterfaces,
+  IN UCHAR  FunctionClass,
+  IN UCHAR  FunctionSubClass,
+  IN UCHAR  FunctionProtocol);
+
+#define USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1         0x0001
+
+typedef struct _USBC_DEVICE_CONFIGURATION_INTERFACE_V1 {
+  USHORT Size;
+  USHORT Version;
+  PVOID Context;
+  PINTERFACE_REFERENCE InterfaceReference;
+  PINTERFACE_DEREFERENCE InterfaceDereference;
+  USBC_START_DEVICE_CALLBACK StartDeviceCallback;
+  USBC_PDO_ENABLE_CALLBACK   PdoEnableCallback;
+  PVOID Reserved[7];
+} USBC_DEVICE_CONFIGURATION_INTERFACE_V1, *PUSBC_DEVICE_CONFIGURATION_INTERFACE_V1;
+
+#endif
diff --git a/reactos/include/ddk/usbcamdi.h b/reactos/include/ddk/usbcamdi.h
deleted file mode 100644 (file)
index 461b0bc..0000000
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * usbcamdi.h
- *
- * USB Camera driver interface.
- *
- * This file is part of the w32api package.
- *
- * Contributors:
- *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-#ifndef __USBCAMDI_H
-#define __USBCAMDI_H
-
-#if !defined(__USB_H) && !defined(__USBDI_H)
-#error include usb.h or usbdi.h before usbcamdi.h
-#else
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#pragma pack(push,4)
-
-#if defined(_BATTERYCLASS_)
-  #define USBCAMAPI
-#else
-  #define USBCAMAPI DECLSPEC_IMPORT
-#endif
-
-
-/* FIXME: Unknown definition */
-typedef PVOID PHW_STREAM_REQUEST_BLOCK;
-
-DEFINE_GUID(GUID_USBCAMD_INTERFACE,
-  0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
-
-#define USBCAMD_PROCESSPACKETEX_DropFrame             0x0002
-#define USBCAMD_PROCESSPACKETEX_NextFrameIsStill      0x0004
-#define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill   0x0008
-
-#define USBCAMD_DATA_PIPE                 0x0001
-#define USBCAMD_MULTIPLEX_PIPE            0x0002
-#define USBCAMD_SYNC_PIPE                 0x0004
-#define USBCAMD_DONT_CARE_PIPE            0x0008
-
-#define USBCAMD_VIDEO_STREAM              0x1
-#define USBCAMD_STILL_STREAM              0x2
-#define USBCAMD_VIDEO_STILL_STREAM        (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM)
-
-#define USBCAMD_STOP_STREAM               0x00000001
-#define USBCAMD_START_STREAM              0x00000000
-
-typedef struct _pipe_config_descriptor {
-  CHAR  StreamAssociation;
-  UCHAR  PipeConfigFlags;
-} USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor;
-
-typedef enum {
-       USBCAMD_CamControlFlag_NoVideoRawProcessing = 1,
-       USBCAMD_CamControlFlag_NoStillRawProcessing = 2,
-       USBCAMD_CamControlFlag_AssociatedFormat = 4,
-       USBCAMD_CamControlFlag_EnableDeviceEvents = 8
-} USBCAMD_CamControlFlags;
-
-typedef NTSTATUS
-(DDKAPI *PCAM_ALLOCATE_BW_ROUTINE)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  PULONG  RawFrameLength,
-  PVOID  Format);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_ALLOCATE_BW_ROUTINE_EX)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  PULONG  RawFrameLength,
-  PVOID  Format,
-  ULONG  StreamNumber);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_CONFIGURE_ROUTINE)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  PUSBD_INTERFACE_INFORMATION  Interface,
-  PUSB_CONFIGURATION_DESCRIPTOR  ConfigurationDescriptor,
-  PLONG  DataPipeIndex,
-  PLONG  SyncPipeIndex);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_CONFIGURE_ROUTINE_EX)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  PUSBD_INTERFACE_INFORMATION  Interface,
-  PUSB_CONFIGURATION_DESCRIPTOR  ConfigurationDescriptor,
-  ULONG  PipeConfigListSize,
-  PUSBCAMD_Pipe_Config_Descriptor  PipeConfig,
-  PUSB_DEVICE_DESCRIPTOR  DeviceDescriptor);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_FREE_BW_ROUTINE)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_FREE_BW_ROUTINE_EX)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  ULONG  StreamNumber);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_INITIALIZE_ROUTINE)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext);
-
-typedef VOID
-(DDKAPI *PCAM_NEW_FRAME_ROUTINE)(
-  PVOID  DeviceContext,
-  PVOID  FrameContext);
-
-typedef VOID
-(DDKAPI *PCAM_NEW_FRAME_ROUTINE_EX)(
-  PVOID  DeviceContext,
-  PVOID  FrameContext,
-  ULONG  StreamNumber,
-  PULONG  FrameLength);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  PVOID  FrameContext,
-  PVOID  FrameBuffer,
-  ULONG  FrameLength,
-  PVOID  RawFrameBuffer,
-  ULONG  RawFrameLength,
-  ULONG  NumberOfPackets,
-  PULONG  BytesReturned);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  PVOID  FrameContext,
-  PVOID  FrameBuffer,
-  ULONG  FrameLength,
-  PVOID  RawFrameBuffer,
-  ULONG  RawFrameLength,
-  ULONG  NumberOfPackets,
-  PULONG  BytesReturned,
-  ULONG  ActualRawFrameLength,
-  ULONG  StreamNumber);
-
-typedef ULONG
-(DDKAPI *PCAM_PROCESS_PACKET_ROUTINE)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  PVOID  CurrentFrameContext,
-  PUSBD_ISO_PACKET_DESCRIPTOR  SyncPacket,
-  PVOID  SyncBuffer,
-  PUSBD_ISO_PACKET_DESCRIPTOR  DataPacket,
-  PVOID  DataBuffer,
-  PBOOLEAN  FrameComplete,
-  PBOOLEAN  NextFrameIsStill);
-
-typedef ULONG
-(DDKAPI *PCAM_PROCESS_PACKET_ROUTINE_EX)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  PVOID  CurrentFrameContext,
-  PUSBD_ISO_PACKET_DESCRIPTOR  SyncPacket,
-  PVOID  SyncBuffer,
-  PUSBD_ISO_PACKET_DESCRIPTOR  DataPacket,
-  PVOID  DataBuffer,
-  PBOOLEAN  FrameComplete,
-  PULONG  PacketFlag,
-  PULONG  ValidDataOffset);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_STATE_ROUTINE)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_START_CAPTURE_ROUTINE)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_START_CAPTURE_ROUTINE_EX)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  ULONG  StreamNumber);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_STOP_CAPTURE_ROUTINE)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext);
-
-typedef NTSTATUS
-(DDKAPI *PCAM_STOP_CAPTURE_ROUTINE_EX)(
-  PDEVICE_OBJECT  BusDeviceObject,
-  PVOID  DeviceContext,
-  ULONG  StreamNumber);
-
-typedef struct _USBCAMD_DEVICE_DATA {
-       ULONG  Sig;
-       PCAM_INITIALIZE_ROUTINE  CamInitialize;
-       PCAM_INITIALIZE_ROUTINE  CamUnInitialize;
-       PCAM_PROCESS_PACKET_ROUTINE  CamProcessUSBPacket;
-       PCAM_NEW_FRAME_ROUTINE  CamNewVideoFrame;
-       PCAM_PROCESS_RAW_FRAME_ROUTINE  CamProcessRawVideoFrame;
-       PCAM_START_CAPTURE_ROUTINE  CamStartCapture;
-       PCAM_STOP_CAPTURE_ROUTINE  CamStopCapture;
-       PCAM_CONFIGURE_ROUTINE  CamConfigure;
-       PCAM_STATE_ROUTINE  CamSaveState;
-       PCAM_STATE_ROUTINE  CamRestoreState;
-       PCAM_ALLOCATE_BW_ROUTINE  CamAllocateBandwidth;
-       PCAM_FREE_BW_ROUTINE  CamFreeBandwidth;
-} USBCAMD_DEVICE_DATA, *PUSBCAMD_DEVICE_DATA;
-
-typedef struct _USBCAMD_DEVICE_DATA2 {
-       ULONG  Sig;
-       PCAM_INITIALIZE_ROUTINE  CamInitialize;
-       PCAM_INITIALIZE_ROUTINE  CamUnInitialize;
-       PCAM_PROCESS_PACKET_ROUTINE_EX  CamProcessUSBPacketEx;
-       PCAM_NEW_FRAME_ROUTINE_EX  CamNewVideoFrameEx;
-       PCAM_PROCESS_RAW_FRAME_ROUTINE_EX  CamProcessRawVideoFrameEx;
-       PCAM_START_CAPTURE_ROUTINE_EX  CamStartCaptureEx;
-       PCAM_STOP_CAPTURE_ROUTINE_EX  CamStopCaptureEx;
-       PCAM_CONFIGURE_ROUTINE_EX  CamConfigureEx;
-       PCAM_STATE_ROUTINE  CamSaveState;
-       PCAM_STATE_ROUTINE  CamRestoreState;
-       PCAM_ALLOCATE_BW_ROUTINE_EX  CamAllocateBandwidthEx;
-       PCAM_FREE_BW_ROUTINE_EX  CamFreeBandwidthEx;
-} USBCAMD_DEVICE_DATA2, *PUSBCAMD_DEVICE_DATA2;
-
-USBCAMAPI
-ULONG
-DDKAPI
-USBCAMD_InitializeNewInterface(
-  IN PVOID  DeviceContext,
-  IN PVOID  DeviceData,
-  IN ULONG  Version,
-  IN ULONG  CamControlFlag);
-
-typedef VOID
-(DDKAPI *PCOMMAND_COMPLETE_FUNCTION)(
-  PVOID  DeviceContext,
-  PVOID  CommandContext,
-  NTSTATUS  NtStatus);
-
-typedef NTSTATUS
-(DDKAPI *PFNUSBCAMD_BulkReadWrite)(
-  IN PVOID  DeviceContext,
-  IN USHORT  PipeIndex,
-  IN PVOID  Buffer,
-  IN ULONG  BufferLength,
-  IN PCOMMAND_COMPLETE_FUNCTION  CommandComplete,
-  IN PVOID  CommandContext);
-
-typedef NTSTATUS
-(DDKAPI *PFNUSBCAMD_SetIsoPipeState)(
-  IN PVOID  DeviceContext,
-  IN ULONG  PipeStateFlags);
-
-typedef NTSTATUS
-(DDKAPI *PFNUSBCAMD_CancelBulkReadWrite)(
-  IN PVOID  DeviceContext,
-  IN ULONG  PipeIndex);
-
-typedef NTSTATUS
-(DDKAPI *PFNUSBCAMD_SetVideoFormat)(
-  IN PVOID  DeviceContext,
-  IN PHW_STREAM_REQUEST_BLOCK  pSrb);
-
-typedef NTSTATUS
-(DDKAPI *PFNUSBCAMD_WaitOnDeviceEvent)(
-  IN PVOID  DeviceContext,
-  IN ULONG  PipeIndex,
-  IN PVOID  Buffer,
-  IN ULONG  BufferLength,
-  IN PCOMMAND_COMPLETE_FUNCTION  EventComplete,
-  IN PVOID  EventContext,
-  IN BOOLEAN  LoopBack);
-
-USBCAMAPI
-PVOID
-DDKAPI
-USBCAMD_AdapterReceivePacket(
-  IN PHW_STREAM_REQUEST_BLOCK  Srb,
-  IN PUSBCAMD_DEVICE_DATA  DeviceData,
-  IN PDEVICE_OBJECT  *DeviceObject,
-  IN BOOLEAN  NeedsCompletion);
-
-USBCAMAPI
-NTSTATUS
-DDKAPI
-USBCAMD_ControlVendorCommand(
-  IN PVOID  DeviceContext,
-  IN UCHAR  Request,
-  IN USHORT  Value,
-  IN USHORT  Index,
-  IN PVOID  Buffer,
-  IN OUT PULONG  BufferLength,
-  IN BOOLEAN  GetData,
-  IN PCOMMAND_COMPLETE_FUNCTION  CommandComplete,
-  IN PVOID  CommandContext);
-
-typedef VOID
-(DDKAPI *PADAPTER_RECEIVE_PACKET_ROUTINE)(
-  IN PHW_STREAM_REQUEST_BLOCK  Srb);
-
-USBCAMAPI
-ULONG
-DDKAPI
-USBCAMD_DriverEntry(
-  PVOID  Context1,
-  PVOID  Context2,
-  ULONG  DeviceContextSize,
-  ULONG  FrameContextSize,
-  PADAPTER_RECEIVE_PACKET_ROUTINE  ReceivePacket);
-
-USBCAMAPI
-NTSTATUS
-DDKAPI
-USBCAMD_GetRegistryKeyValue(
-  IN HANDLE  Handle,
-  IN PWCHAR  KeyNameString,
-  IN ULONG  KeyNameStringLength,
-  IN PVOID  Data,
-  IN ULONG  DataLength);
-
-USBCAMAPI
-NTSTATUS
-DDKAPI
-USBCAMD_SelectAlternateInterface(
-  IN PVOID  DeviceContext,
-  IN OUT PUSBD_INTERFACE_INFORMATION  RequestInterface);
-
-#define USBCAMD_VERSION_200               0x200
-
-typedef struct _USBCAMD_INTERFACE {
-  INTERFACE  Interface;
-  PFNUSBCAMD_WaitOnDeviceEvent  USBCAMD_WaitOnDeviceEvent;
-  PFNUSBCAMD_BulkReadWrite  USBCAMD_BulkReadWrite;
-  PFNUSBCAMD_SetVideoFormat  USBCAMD_SetVideoFormat;
-  PFNUSBCAMD_SetIsoPipeState  USBCAMD_SetIsoPipeState;
-  PFNUSBCAMD_CancelBulkReadWrite  USBCAMD_CancelBulkReadWrite;
-} USBCAMD_INTERFACE, *PUSBCAMD_INTERFACE;
-
-typedef VOID
-(DDKAPI *PSTREAM_RECEIVE_PACKET)(
-  IN PVOID  Srb,
-  IN PVOID  DeviceContext,
-  IN PBOOLEAN  Completed);
-
-#if defined(DEBUG_LOG)
-
-USBCAMAPI
-VOID
-DDKAPI
-USBCAMD_Debug_LogEntry(
-       IN CHAR  *Name,
-       IN ULONG  Info1,
-       IN ULONG  Info2,
-       IN ULONG  Info3);
-
-#define ILOGENTRY(sig, info1, info2, info3) \
-  USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
-
-#else
-
-#define ILOGENTRY(sig, info1, info2, info3)
-
-#endif /* DEBUG_LOG */
-
-#pragma pack(pop)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !defined(__USB_H) && !defined(__USBDI_H) */
-
-
-#endif /* __USBCAMDI_H */
diff --git a/reactos/include/ddk/usbdi.h b/reactos/include/ddk/usbdi.h
deleted file mode 100644 (file)
index 7dd565f..0000000
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * usbdi.h
- *
- * USBD and USB device driver definitions
- *
- * This file is part of the w32api package.
- *
- * Contributors:
- *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-#ifndef __USBDI_H
-#define __USBDI_H
-
-#ifdef __USB_H
-#error usb.h cannot be included with usbdi.h
-#else
-
-#include "usbioctl.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define USBDI_VERSION                     0x300
-
-#define USB_DEFAULT_DEVICE_ADDRESS        0
-#define USB_DEFAULT_ENDPOINT_ADDRESS      0
-#define USB_DEFAULT_MAX_PACKET            64
-
-#define URB_FROM_IRP(Irp) ((IoGetCurrentIrpStackLocation(Irp))->Parameters.Others.Argument1)
-
-#define URB_FUNCTION_SELECT_CONFIGURATION           0x0000
-#define URB_FUNCTION_SELECT_INTERFACE               0x0001
-#define URB_FUNCTION_ABORT_PIPE                     0x0002
-#define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL      0x0003
-#define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL   0x0004
-#define URB_FUNCTION_GET_FRAME_LENGTH               0x0005
-#define URB_FUNCTION_SET_FRAME_LENGTH               0x0006
-#define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER       0x0007
-#define URB_FUNCTION_CONTROL_TRANSFER               0x0008
-#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER     0x0009
-#define URB_FUNCTION_ISOCH_TRANSFER                 0x000A
-#define URB_FUNCTION_RESET_PIPE                     0x001E
-#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE     0x000B
-#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT   0x0024
-#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE  0x0028
-#define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE       0x000C
-#define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT     0x0025
-#define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE    0x0029
-#define URB_FUNCTION_SET_FEATURE_TO_DEVICE          0x000D
-#define URB_FUNCTION_SET_FEATURE_TO_INTERFACE       0x000E
-#define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT        0x000F
-#define URB_FUNCTION_SET_FEATURE_TO_OTHER           0x0023
-#define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE        0x0010
-#define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE     0x0011
-#define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT      0x0012
-#define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER         0x0022
-#define URB_FUNCTION_GET_STATUS_FROM_DEVICE         0x0013
-#define URB_FUNCTION_GET_STATUS_FROM_INTERFACE      0x0014
-#define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT       0x0015
-#define URB_FUNCTION_GET_STATUS_FROM_OTHER          0x0021
-#define URB_FUNCTION_RESERVED0                      0x0016
-#define URB_FUNCTION_VENDOR_DEVICE                  0x0017
-#define URB_FUNCTION_VENDOR_INTERFACE               0x0018
-#define URB_FUNCTION_VENDOR_ENDPOINT                0x0019
-#define URB_FUNCTION_VENDOR_OTHER                   0x0020
-#define URB_FUNCTION_CLASS_DEVICE                   0x001A
-#define URB_FUNCTION_CLASS_INTERFACE                0x001B
-#define URB_FUNCTION_CLASS_ENDPOINT                 0x001C
-#define URB_FUNCTION_CLASS_OTHER                    0x001F
-#define URB_FUNCTION_RESERVED                       0x001D
-#define URB_FUNCTION_GET_CONFIGURATION              0x0026
-#define URB_FUNCTION_GET_INTERFACE                  0x0027
-#define URB_FUNCTION_LAST                           0x0029
-
-typedef LONG USBD_STATUS;
-typedef PVOID USBD_PIPE_HANDLE;
-typedef PVOID USBD_CONFIGURATION_HANDLE;
-typedef PVOID USBD_INTERFACE_HANDLE;
-
-#define USBD_ERROR(Status) ((USBD_STATUS)(Status) < 0)
-#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3)
-#define USBD_PENDING(Status) ((ULONG)(Status) >> 30 == 1)
-#define USBD_STATUS(Status) ((ULONG)(Status) & 0x0FFFFFFFL)
-#define USBD_SUCCESS(Status) ((USBD_STATUS)(Status) >= 0)
-
-#define USBD_STATUS_SUCCESS               ((USBD_STATUS)0x00000000L)
-#define USBD_STATUS_PENDING               ((USBD_STATUS)0x40000000L)
-#define USBD_STATUS_HALTED                ((USBD_STATUS)0xC0000000L)
-#define USBD_STATUS_ERROR                 ((USBD_STATUS)0x80000000L)
-#define USBD_STATUS_NO_MEMORY             ((USBD_STATUS)0x80000100L)
-#define USBD_STATUS_INVALID_URB_FUNCTION  ((USBD_STATUS)0x80000200L)
-#define USBD_STATUS_INVALID_PARAMETER     ((USBD_STATUS)0x80000300L)
-#define USBD_STATUS_ERROR_BUSY            ((USBD_STATUS)0x80000400L)
-#define USBD_STATUS_REQUEST_FAILED        ((USBD_STATUS)0x80000500L)
-#define USBD_STATUS_INVALID_PIPE_HANDLE   ((USBD_STATUS)0x80000600L)
-#define USBD_STATUS_NO_BANDWIDTH          ((USBD_STATUS)0x80000700L)
-#define USBD_STATUS_INTERNAL_HC_ERROR     ((USBD_STATUS)0x80000800L)
-#define USBD_STATUS_ERROR_SHORT_TRANSFER  ((USBD_STATUS)0x80000900L)
-#define USBD_STATUS_CRC                   ((USBD_STATUS)0xC0000001L)
-#define USBD_STATUS_BTSTUFF               ((USBD_STATUS)0xC0000002L)
-#define USBD_STATUS_DATA_TOGGLE_MISMATCH  ((USBD_STATUS)0xC0000003L)
-#define USBD_STATUS_STALL_PID             ((USBD_STATUS)0xC0000004L)
-#define USBD_STATUS_DEV_NOT_RESPONDING    ((USBD_STATUS)0xC0000005L)
-#define USBD_STATUS_PID_CHECK_FAILURE     ((USBD_STATUS)0xC0000006L)
-#define USBD_STATUS_UNEXPECTED_PID        ((USBD_STATUS)0xC0000007L)
-#define USBD_STATUS_DATA_OVERRUN          ((USBD_STATUS)0xC0000008L)
-#define USBD_STATUS_DATA_UNDERRUN         ((USBD_STATUS)0xC0000009L)
-#define USBD_STATUS_RESERVED1             ((USBD_STATUS)0xC000000AL)
-#define USBD_STATUS_RESERVED2             ((USBD_STATUS)0xC000000BL)
-#define USBD_STATUS_BUFFER_OVERRUN        ((USBD_STATUS)0xC000000CL)
-#define USBD_STATUS_BUFFER_UNDERRUN       ((USBD_STATUS)0xC000000DL)
-#define USBD_STATUS_NOT_ACCESSED          ((USBD_STATUS)0xC000000FL)
-#define USBD_STATUS_FIFO                  ((USBD_STATUS)0xC0000010L)
-#define USBD_STATUS_ENDPOINT_HALTED       ((USBD_STATUS)0xC0000030L)
-#define USBD_STATUS_BAD_START_FRAME       ((USBD_STATUS)0xC0000A00L)
-#define USBD_STATUS_ISOCH_REQUEST_FAILED  ((USBD_STATUS)0xC0000B00L)
-#define USBD_STATUS_FRAME_CONTROL_OWNED   ((USBD_STATUS)0xC0000C00L)
-#define USBD_STATUS_FRAME_CONTROL_NOT_OWNED \
-                                          ((USBD_STATUS)0xC0000D00L)
-#define USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR \
-                                          ((USBD_STATUS)0xC0000F00L)
-#define USBD_STATUS_CANCELING             ((USBD_STATUS)0x00020000L)
-
-#define USBD_PIPE_DIRECTION_IN(pipeInformation) \
-  ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK)
-
-struct _URB_HEADER {
-       USHORT  Length;
-       USHORT  Function;
-       USBD_STATUS  Status;
-       PVOID  UsbdDeviceHandle;
-       ULONG  UsbdFlags;
-};
-
-struct _URB_HCD_AREA {
-       PVOID  HcdEndpoint;
-       PIRP  HcdIrp;
-       LIST_ENTRY  HcdListEntry;
-       LIST_ENTRY  HcdListEntry2;
-       PVOID  HcdCurrentIoFlushPointer;
-       PVOID  HcdExtension;
-};
-
-struct _URB_BULK_OR_INTERRUPT_TRANSFER {
-       struct _URB_HEADER  Hdr;
-       USBD_PIPE_HANDLE  PipeHandle;
-       ULONG  TransferFlags;
-       ULONG  TransferBufferLength;
-       PVOID  TransferBuffer;
-       PMDL  TransferBufferMDL;
-       struct _URB  *UrbLink;
-       struct _URB_HCD_AREA  hca;
-};
-
-struct _URB_CONTROL_DESCRIPTOR_REQUEST {
-       struct _URB_HEADER  Hdr;
-       PVOID  Reserved;
-       ULONG  Reserved0;
-       ULONG  TransferBufferLength;
-       PVOID  TransferBuffer;
-       PMDL  TransferBufferMDL;
-       struct _URB  *UrbLink;
-       struct _URB_HCD_AREA  hca;
-       USHORT  Reserved1;
-       UCHAR  Index;
-       UCHAR  DescriptorType;
-       USHORT  LanguageId;
-       USHORT  Reserved2;
-};
-
-struct _URB_CONTROL_FEATURE_REQUEST {
-       struct _URB_HEADER  Hdr;
-       PVOID  Reserved;
-       ULONG  Reserved2;
-       ULONG  Reserved3;
-       PVOID  Reserved4;
-       PMDL  Reserved5;
-       struct _URB  *UrbLink;
-       struct _URB_HCD_AREA  hca;
-       USHORT  Reserved0;
-       USHORT  FeatureSelector;
-       USHORT  Index;
-       USHORT  Reserved1;
-};
-
-struct _URB_CONTROL_GET_CONFIGURATION_REQUEST {
-       struct _URB_HEADER  Hdr;
-       PVOID  Reserved;
-       ULONG  Reserved0;
-       ULONG  TransferBufferLength;
-       PVOID  TransferBuffer;
-       PMDL  TransferBufferMDL;
-       struct _URB  *UrbLink;
-       struct _URB_HCD_AREA  hca;
-       UCHAR  Reserved1[8];
-};
-
-struct _URB_CONTROL_GET_INTERFACE_REQUEST {
-       struct _URB_HEADER  Hdr;
-       PVOID  Reserved;
-       ULONG  Reserved0;
-       ULONG  TransferBufferLength;
-       PVOID  TransferBuffer;
-       PMDL  TransferBufferMDL;
-       struct _URB  *UrbLink;
-       struct _URB_HCD_AREA  hca;
-       UCHAR  Reserved1[4];
-       USHORT  Interface;
-       USHORT  Reserved2;
-};
-
-struct _URB_CONTROL_GET_STATUS_REQUEST {
-       struct _URB_HEADER  Hdr;
-       PVOID  Reserved;
-       ULONG  Reserved0;
-       ULONG  TransferBufferLength;
-       PVOID  TransferBuffer;
-       PMDL  TransferBufferMDL;
-       struct _URB  *UrbLink;
-       struct _URB_HCD_AREA  hca;
-       UCHAR  Reserved1[4];
-       USHORT  Index;
-       USHORT  Reserved2;
-};
-
-struct _URB_CONTROL_TRANSFER {
-       struct _URB_HEADER  Hdr;
-       USBD_PIPE_HANDLE  PipeHandle;
-       ULONG  TransferFlags;
-       ULONG  TransferBufferLength;
-       PVOID  TransferBuffer;
-       PMDL  TransferBufferMDL;
-       struct _URB  *UrbLink;
-       struct _URB_HCD_AREA  hca;
-       UCHAR  SetupPacket[8];
-};
-
-struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST {
-       struct _URB_HEADER  Hdr;
-       PVOID  Reserved;
-       ULONG  TransferFlags;
-       ULONG  TransferBufferLength;
-       PVOID  TransferBuffer;
-       PMDL  TransferBufferMDL;
-       struct _URB  *UrbLink;
-       struct _URB_HCD_AREA  hca;
-       UCHAR  RequestTypeReservedBits;
-       UCHAR  Request;
-       USHORT  Value;
-       USHORT  Index;
-       USHORT  Reserved1;
-};
-
-struct _URB_FRAME_LENGTH_CONTROL {
-       struct _URB_HEADER  Hdr;
-};
-
-struct _URB_GET_CURRENT_FRAME_NUMBER {
-       struct _URB_HEADER  Hdr;
-       ULONG  FrameNumber;
-};
-
-struct _URB_GET_FRAME_LENGTH {
-       struct _URB_HEADER  Hdr;
-       ULONG  FrameLength;
-       ULONG  FrameNumber;
-};
-
-typedef struct _USBD_ISO_PACKET_DESCRIPTOR {
-  ULONG  Offset;
-  ULONG  Length;
-  USBD_STATUS  Status;
-} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR;
-
-struct _URB_ISOCH_TRANSFER {
-       struct _URB_HEADER  Hdr;
-       USBD_PIPE_HANDLE  PipeHandle;
-       ULONG  TransferFlags;
-       ULONG  TransferBufferLength;
-       PVOID  TransferBuffer;
-       PMDL  TransferBufferMDL;
-       struct _URB  *UrbLink;
-       struct _URB_HCD_AREA  hca;
-       ULONG  StartFrame;
-       ULONG  NumberOfPackets;
-       ULONG  ErrorCount;
-       USBD_ISO_PACKET_DESCRIPTOR  IsoPacket[1];
-};
-
-struct _URB_PIPE_REQUEST {
-       struct _URB_HEADER  Hdr;
-       USBD_PIPE_HANDLE  PipeHandle;
-       ULONG  Reserved;
-};
-
-struct _URB_SET_FRAME_LENGTH {
-       struct _URB_HEADER  Hdr;
-       LONG  FrameLengthDelta;
-};
-
-typedef struct _USBD_DEVICE_INFORMATION {
-       ULONG  OffsetNext;
-       PVOID  UsbdDeviceHandle;
-       USB_DEVICE_DESCRIPTOR  DeviceDescriptor;
-} USBD_DEVICE_INFORMATION, *PUSBD_DEVICE_INFORMATION;
-
-typedef enum _USBD_PIPE_TYPE {
-       UsbdPipeTypeControl,
-       UsbdPipeTypeIsochronous,
-       UsbdPipeTypeBulk,
-       UsbdPipeTypeInterrupt
-} USBD_PIPE_TYPE;
-
-/* USBD_PIPE_INFORMATION.PipeFlags constants */
-#define USBD_PF_CHANGE_MAX_PACKET         0x00000001
-#define USBD_PF_DOUBLE_BUFFER             0x00000002
-#define USBD_PF_ENABLE_RT_THREAD_ACCESS   0x00000004
-#define USBD_PF_MAP_ADD_TRANSFERS         0x00000008
-
-typedef struct _USBD_PIPE_INFORMATION {
-  USHORT  MaximumPacketSize;
-  UCHAR  EndpointAddress;
-  UCHAR  Interval;
-  USBD_PIPE_TYPE  PipeType;
-  USBD_PIPE_HANDLE  PipeHandle;
-  ULONG  MaximumTransferSize;
-  ULONG  PipeFlags;
-} USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION;
-
-typedef struct _USBD_INTERFACE_INFORMATION {
-  USHORT  Length;
-  UCHAR  InterfaceNumber;
-  UCHAR  AlternateSetting;
-  UCHAR  Class;
-  UCHAR  SubClass;
-  UCHAR  Protocol;
-  UCHAR  Reserved;
-  USBD_INTERFACE_HANDLE  InterfaceHandle;
-  ULONG  NumberOfPipes;
-  USBD_PIPE_INFORMATION  Pipes[1];
-} USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION;
-
-struct _URB_SELECT_CONFIGURATION {
-       struct _URB_HEADER  Hdr;
-       PUSB_CONFIGURATION_DESCRIPTOR  ConfigurationDescriptor;
-       USBD_CONFIGURATION_HANDLE  ConfigurationHandle;
-       USBD_INTERFACE_INFORMATION  Interface;
-};
-
-struct _URB_SELECT_INTERFACE {
-       struct _URB_HEADER  Hdr;
-       USBD_CONFIGURATION_HANDLE  ConfigurationHandle;
-       USBD_INTERFACE_INFORMATION  Interface;
-};
-
-typedef struct _USBD_VERSION_INFORMATION {
-       ULONG  USBDI_Version;
-       ULONG  Supported_USB_Version;
-} USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION;
-
-typedef struct _URB {
-       union {
-               struct _URB_HEADER  UrbHeader;
-               struct _URB_SELECT_INTERFACE  UrbSelectInterface;
-               struct _URB_SELECT_CONFIGURATION  UrbSelectConfiguration;
-               struct _URB_PIPE_REQUEST  UrbPipeRequest;
-               struct _URB_FRAME_LENGTH_CONTROL  UrbFrameLengthControl;
-               struct _URB_GET_FRAME_LENGTH  UrbGetFrameLength;
-               struct _URB_SET_FRAME_LENGTH  UrbSetFrameLength;
-               struct _URB_GET_CURRENT_FRAME_NUMBER  UrbGetCurrentFrameNumber;
-               struct _URB_CONTROL_TRANSFER  UrbControlTransfer;
-               struct _URB_BULK_OR_INTERRUPT_TRANSFER  UrbBulkOrInterruptTransfer;
-               struct _URB_ISOCH_TRANSFER  UrbIsochronousTransfer;
-               struct _URB_CONTROL_DESCRIPTOR_REQUEST  UrbControlDescriptorRequest;
-               struct _URB_CONTROL_GET_STATUS_REQUEST  UrbControlGetStatusRequest;
-               struct _URB_CONTROL_FEATURE_REQUEST  UrbControlFeatureRequest;
-               struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST  UrbControlVendorClassRequest;
-               struct _URB_CONTROL_GET_INTERFACE_REQUEST  UrbControlGetInterfaceRequest;
-               struct _URB_CONTROL_GET_CONFIGURATION_REQUEST  UrbControlGetConfigurationRequest;
-       };
-} URB, *PURB;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* defined __USB_H */
-
-#endif /* __USBDI_H */
index 3bb214b..7f21da6 100644 (file)
@@ -1,12 +1,9 @@
-#ifndef   USBDLIB_H__
-#define   USBDLIB_H__
+#pragma once
 
-
-typedef struct _USBD_INTERFACE_LIST_ENTRY
-{
-    PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
-    PUSBD_INTERFACE_INFORMATION Interface;
-}USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY;
+typedef struct _USBD_INTERFACE_LIST_ENTRY {
+  PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
+  PUSBD_INTERFACE_INFORMATION Interface;
+} USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY;
 
 #define UsbBuildInterruptOrBulkTransferRequest(urb,length, pipeHandle, transferBuffer, transferBufferMDL, transferBufferLength, transferFlags, link) \
 {                                                                                                                                                    \
@@ -44,7 +41,6 @@ typedef struct _USBD_INTERFACE_LIST_ENTRY
             (urb)->UrbControlGetStatusRequest.UrbLink = (link);                                \
 }
 
-
 #define UsbBuildFeatureRequest(urb, op, featureSelector, index, link)              \
 {                                                                                  \
             (urb)->UrbHeader.Function =  (op);                                     \
@@ -120,102 +116,87 @@ typedef struct _USBD_INTERFACE_LIST_ENTRY
 #define  GET_ISO_URB_SIZE(n) (sizeof(struct _URB_ISOCH_TRANSFER)+                   \
         sizeof(USBD_ISO_PACKET_DESCRIPTOR)*n)
 
-
 #ifndef _USBD_
 
 DECLSPEC_IMPORT
 VOID
 NTAPI
 USBD_GetUSBDIVersion(
-    OUT PUSBD_VERSION_INFORMATION VersionInformation
-);
-
+  OUT PUSBD_VERSION_INFORMATION VersionInformation);
 
 DECLSPEC_IMPORT
 PUSB_INTERFACE_DESCRIPTOR
 NTAPI
 USBD_ParseConfigurationDescriptor(
-    IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
-    IN UCHAR InterfaceNumber,
-    IN UCHAR AlternateSetting
-);
+  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+  IN UCHAR InterfaceNumber,
+  IN UCHAR AlternateSetting);
 
 DECLSPEC_IMPORT
 PURB
 NTAPI
 USBD_CreateConfigurationRequest(
-    IN  PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
-    OUT PUSHORT Siz
-);
+  IN  PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+  OUT PUSHORT Siz);
 
 DECLSPEC_IMPORT
 PUSB_COMMON_DESCRIPTOR
 NTAPI
 USBD_ParseDescriptors(
-    IN PVOID DescriptorBuffer,
-    IN ULONG TotalLength,
-    IN PVOID StartPosition,
-    IN LONG DescriptorType
-);
+  IN PVOID DescriptorBuffer,
+  IN ULONG TotalLength,
+  IN PVOID StartPosition,
+  IN LONG DescriptorType);
 
 DECLSPEC_IMPORT
 PUSB_INTERFACE_DESCRIPTOR
 NTAPI
 USBD_ParseConfigurationDescriptorEx(
-    IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
-    IN PVOID StartPosition,
-    IN LONG InterfaceNumber,
-    IN LONG AlternateSetting,
-    IN LONG InterfaceClass,
-    IN LONG InterfaceSubClass,
-    IN LONG InterfaceProtocol
-);
+  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+  IN PVOID StartPosition,
+  IN LONG InterfaceNumber,
+  IN LONG AlternateSetting,
+  IN LONG InterfaceClass,
+  IN LONG InterfaceSubClass,
+  IN LONG InterfaceProtocol);
 
 DECLSPEC_IMPORT
 PURB
 NTAPI
 USBD_CreateConfigurationRequestEx(
-    IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
-    IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList
-);
+  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+  IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList);
 
-
-DECLSPEC_IMPORT
+DECLSPEC_EXPORT
 ULONG
 NTAPI
 USBD_GetInterfaceLength(
-    IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor,
-    IN PUCHAR BufferEnd
-);
+  IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor,
+  IN PUCHAR BufferEnd);
 
-DECLSPEC_IMPORT
+DECLSPEC_EXPORT
 VOID
 NTAPI
 USBD_RegisterHcFilter(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN PDEVICE_OBJECT FilterDeviceObject
-);
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PDEVICE_OBJECT FilterDeviceObject);
 
-
-
-DECLSPEC_IMPORT
+DECLSPEC_EXPORT
 NTSTATUS
 NTAPI
 USBD_GetPdoRegistryParameter(
-    IN PDEVICE_OBJECT PhysicalDeviceObject,
-    IN PVOID Parameter,
-    IN ULONG ParameterLength,
-    IN PWSTR KeyName,
-    IN ULONG KeyNameLength
-);
+  IN PDEVICE_OBJECT PhysicalDeviceObject,
+  IN OUT PVOID Parameter,
+  IN ULONG ParameterLength,
+  IN PWSTR KeyName,
+  IN ULONG KeyNameLength);
 
-DECLSPEC_IMPORT
+DECLSPEC_EXPORT
 NTSTATUS
 NTAPI
 USBD_QueryBusTime(
-    IN PDEVICE_OBJECT RootHubPdo,
-    OUT PULONG CurrentFrame
-);
+  IN PDEVICE_OBJECT RootHubPdo,
+  OUT PULONG CurrentFrame);
 
 #if (NTDDI_VERSION >= NTDDI_WINXP)
 
@@ -223,10 +204,9 @@ DECLSPEC_IMPORT
 ULONG
 NTAPI
 USBD_CalculateUsbBandwidth(
-    IN ULONG MaxPacketSize,
-    IN UCHAR EndpointType,
-    IN BOOLEAN LowSpeed
-);
+  IN ULONG MaxPacketSize,
+  IN UCHAR EndpointType,
+  IN BOOLEAN LowSpeed);
 
 #endif
 
@@ -236,15 +216,11 @@ DECLSPEC_IMPORT
 USBD_STATUS
 NTAPI
 USBD_ValidateConfigurationDescriptor(
-    IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
-    IN ULONG BufferLength,
-    IN USHORT Level,
-    OUT PUCHAR *Offset,
-    IN ULONG Tag
-);
-
-
-#endif
+  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
+  IN ULONG BufferLength,
+  IN USHORT Level,
+  OUT PUCHAR *Offset,
+  IN ULONG Tag OPTIONAL);
 
 #endif
 
diff --git a/reactos/include/ddk/usbdrivr.h b/reactos/include/ddk/usbdrivr.h
new file mode 100644 (file)
index 0000000..e1a27b6
--- /dev/null
@@ -0,0 +1,9 @@
+#pragma once
+
+#define USB_KERNEL_IOCTL
+#include "usbioctl.h"
+#undef USB_KERNEL_IOCTL
+
+#include "usb.h"
+#include "usbdlib.h"
+#include "usbbusif.h"
diff --git a/reactos/include/ddk/usbioctl.h b/reactos/include/ddk/usbioctl.h
deleted file mode 100644 (file)
index 3d5457c..0000000
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * usbioctl.h
- *
- * USB IOCTL interface.
- *
- * This file is part of the w32api package.
- *
- * Contributors:
- *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-#ifndef __USBIOCTL_H
-#define __USBIOCTL_H
-
-#include "usb100.h"
-#include "usbiodef.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define USBD_PORT_ENABLED                 1
-#define USBD_PORT_CONNECTED               2
-
-#define IOCTL_INTERNAL_USB_CYCLE_PORT \
-  CTL_CODE(FILE_DEVICE_USB, USB_CYCLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_ENABLE_PORT \
-  CTL_CODE(FILE_DEVICE_USB, USB_ENABLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_GET_BUS_INFO \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_BUS_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_GET_BUSGUID_INFO \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_BUSGUID_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_CONTROLLER_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_GET_HUB_COUNT \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_COUNT, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_GET_HUB_NAME \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_PARENT_HUB_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_GET_PORT_STATUS \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_PORT_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_RESET_PORT \
-  CTL_CODE(FILE_DEVICE_USB, USB_RESET_PORT, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_ROOTHUB_PDO, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION \
-  CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#define IOCTL_INTERNAL_USB_SUBMIT_URB  \
-  CTL_CODE(FILE_DEVICE_USB, USB_SUBMIT_URB, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-
-#define IOCTL_USB_DIAG_IGNORE_HUBS_ON \
-  CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_ON, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_DIAG_IGNORE_HUBS_OFF \
-  CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_DIAGNOSTIC_MODE_OFF \
-  CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_DIAGNOSTIC_MODE_ON \
-  CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_ON, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_GET_HUB_CAPABILITIES \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_GET_ROOT_HUB_NAME \
-  CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_GET_HCD_DRIVERKEY_NAME \
-  CTL_CODE(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_GET_NODE_INFORMATION \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_GET_NODE_CONNECTION_NAME \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME \
-  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_HCD_DISABLE_PORT \
-  CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_HCD_ENABLE_PORT \
-  CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_HCD_GET_STATS_1 \
-  CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_1, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_USB_HCD_GET_STATS_2 \
-  CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_2, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-
-typedef struct _USB_HUB_CAPABILITIES {
-  ULONG  HubIs2xCapable : 1;
-} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES;
-
-typedef enum _USB_CONNECTION_STATUS {
-       NoDeviceConnected,
-       DeviceConnected,
-       DeviceFailedEnumeration,
-       DeviceGeneralFailure,
-       DeviceCausedOvercurrent,
-       DeviceNotEnoughPower,
-       DeviceNotEnoughBandwidth,
-       DeviceHubNestedTooDeeply,
-       DeviceInLegacyHub
-} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
-
-#include <pshpack1.h>
-
-typedef struct _USB_DESCRIPTOR_REQUEST {
-       ULONG  ConnectionIndex;
-       struct {
-               UCHAR  bmRequest;
-               UCHAR  bRequest;
-               USHORT  wValue;
-               USHORT  wIndex;
-               USHORT  wLength;
-       } SetupPacket;
-       UCHAR  Data[0];
-} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST;
-
-typedef struct _USB_HCD_DRIVERKEY_NAME {
-       ULONG  ActualLength;
-       WCHAR  DriverKeyName[1];
-} USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME;
-
-typedef struct _HCD_ISO_STAT_COUNTERS {
-       USHORT  LateUrbs;
-       USHORT  DoubleBufferedPackets;
-       USHORT  TransfersCF_5ms;
-       USHORT  TransfersCF_2ms;
-       USHORT  TransfersCF_1ms;
-       USHORT  MaxInterruptLatency;
-       USHORT  BadStartFrame;
-       USHORT  StaleUrbs;
-       USHORT  IsoPacketNotAccesed;
-       USHORT  IsoPacketHWError;
-       USHORT  SmallestUrbPacketCount;
-       USHORT  LargestUrbPacketCount;
-       USHORT  IsoCRC_Error;
-       USHORT  IsoOVERRUN_Error;
-       USHORT  IsoINTERNAL_Error;
-       USHORT  IsoUNKNOWN_Error;
-       ULONG  IsoBytesTransferred;
-       USHORT  LateMissedCount;
-       USHORT  HWIsoMissedCount;
-       ULONG  Reserved7[8];
-} HCD_ISO_STAT_COUNTERS, *PHCD_ISO_STAT_COUNTERS;
-
-typedef struct _HCD_STAT_COUNTERS {
-       ULONG  BytesTransferred;
-       USHORT  IsoMissedCount;
-       USHORT  DataOverrunErrorCount;
-       USHORT  CrcErrorCount;
-       USHORT  ScheduleOverrunCount;
-       USHORT  TimeoutErrorCount;
-       USHORT  InternalHcErrorCount;
-       USHORT  BufferOverrunErrorCount;
-       USHORT  SWErrorCount;
-       USHORT  StallPidCount;
-       USHORT  PortDisableCount;
-} HCD_STAT_COUNTERS, *PHCD_STAT_COUNTERS;
-
-typedef struct _HCD_STAT_INFORMATION_1 {
-       ULONG  Reserved1;
-       ULONG  Reserved2;
-       ULONG  ResetCounters;
-       LARGE_INTEGER  TimeRead;
-       HCD_STAT_COUNTERS  Counters;
-} HCD_STAT_INFORMATION_1, *PHCD_STAT_INFORMATION_1;
-
-typedef struct _HCD_STAT_INFORMATION_2 {
-       ULONG  Reserved1;
-       ULONG  Reserved2;
-       ULONG  ResetCounters;
-       LARGE_INTEGER  TimeRead;
-       LONG  LockedMemoryUsed;
-       HCD_STAT_COUNTERS  Counters;
-       HCD_ISO_STAT_COUNTERS  IsoCounters;
-} HCD_STAT_INFORMATION_2, *PHCD_STAT_INFORMATION_2;
-
-typedef struct _USB_HUB_INFORMATION {
-       USB_HUB_DESCRIPTOR  HubDescriptor;
-       BOOLEAN  HubIsBusPowered;
-} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;
-
-typedef struct _USB_HUB_NAME {
-       ULONG  ActualLength;
-       WCHAR  HubName[1];
-} USB_HUB_NAME, *PUSB_HUB_NAME;
-
-typedef enum _USB_HUB_NODE {
-       UsbHub,
-       UsbMIParent
-} USB_HUB_NODE;
-
-typedef VOID NTAPI
-(*USB_IDLE_CALLBACK)(
-  PVOID  Context);
-
-typedef struct _USB_IDLE_CALLBACK_INFO {
-       USB_IDLE_CALLBACK  IdleCallback;
-       PVOID  IdleContext;
-} USB_IDLE_CALLBACK_INFO, *PUSB_IDLE_CALLBACK_INFO;
-
-typedef struct _USB_NODE_CONNECTION_ATTRIBUTES {
-       ULONG  ConnectionIndex;
-       USB_CONNECTION_STATUS  ConnectionStatus;
-       ULONG  PortAttributes;
-} USB_NODE_CONNECTION_ATTRIBUTES, *PUSB_NODE_CONNECTION_ATTRIBUTES;
-
-typedef struct _USB_NODE_CONNECTION_DRIVERKEY_NAME {
-       ULONG  ConnectionIndex;
-       ULONG  ActualLength;
-       WCHAR  DriverKeyName[1];
-} USB_NODE_CONNECTION_DRIVERKEY_NAME, *PUSB_NODE_CONNECTION_DRIVERKEY_NAME;
-
-typedef struct _USB_PIPE_INFO {
-       USB_ENDPOINT_DESCRIPTOR  EndpointDescriptor;
-       ULONG  ScheduleOffset;
-} USB_PIPE_INFO, *PUSB_PIPE_INFO;
-
-typedef struct _USB_NODE_CONNECTION_INFORMATION {
-       ULONG  ConnectionIndex;
-       USB_DEVICE_DESCRIPTOR  DeviceDescriptor;
-       UCHAR  CurrentConfigurationValue;
-       BOOLEAN  LowSpeed;
-       BOOLEAN  DeviceIsHub;
-       USHORT  DeviceAddress;
-       ULONG  NumberOfOpenPipes;
-       USB_CONNECTION_STATUS  ConnectionStatus;
-       USB_PIPE_INFO  PipeList[0];
-} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION;
-
-typedef struct _USB_NODE_CONNECTION_NAME {
-       ULONG  ConnectionIndex;
-       ULONG  ActualLength;
-       WCHAR  NodeName[1];
-} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME;
-
-typedef struct _USB_MI_PARENT_INFORMATION {
-  ULONG  NumberOfInterfaces;
-} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;
-
-typedef struct _USB_NODE_INFORMATION {
-       USB_HUB_NODE  NodeType;
-       union {
-               USB_HUB_INFORMATION  HubInformation;
-               USB_MI_PARENT_INFORMATION  MiParentInformation;
-       } u;
-} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;
-
-#define WMI_USB_DRIVER_INFORMATION        0
-#define WMI_USB_DRIVER_NOTIFICATION       1
-#define WMI_USB_POWER_DEVICE_ENABLE       2
-
-typedef enum _USB_NOTIFICATION_TYPE {
-       EnumerationFailure = 0,
-       InsufficentBandwidth,
-       InsufficentPower,
-       OverCurrent,
-       ResetOvercurrent,
-       AcquireBusInfo,
-       AcquireHubName,
-       AcquireControllerName,
-       HubOvercurrent,
-       HubPowerChange,
-       HubNestedTooDeeply,
-       ModernDeviceInLegacyHub
-} USB_NOTIFICATION_TYPE;
-
-typedef struct _USB_ACQUIRE_INFO {
-       USB_NOTIFICATION_TYPE  NotificationType;
-       ULONG  TotalSize;
-       WCHAR  Buffer[1];
-} USB_ACQUIRE_INFO, *PUSB_ACQUIRE_INFO;
-
-typedef struct _USB_NOTIFICATION {
-  USB_NOTIFICATION_TYPE  NotificationType;
-} USB_NOTIFICATION, *PUSB_NOTIFICATION;
-
-typedef struct _USB_BUS_NOTIFICATION {
-       USB_NOTIFICATION_TYPE  NotificationType;
-       ULONG  TotalBandwidth;
-       ULONG  ConsumedBandwidth;
-       ULONG  ControllerNameLength;
-} USB_BUS_NOTIFICATION, *PUSB_BUS_NOTIFICATION;
-
-typedef struct _USB_CONNECTION_NOTIFICATION {
-       USB_NOTIFICATION_TYPE  NotificationType;
-       ULONG  ConnectionNumber;
-       ULONG  RequestedBandwidth;
-       ULONG  EnumerationFailReason;
-       ULONG  PowerRequested;
-       ULONG  HubNameLength;
-} USB_CONNECTION_NOTIFICATION, *PUSB_CONNECTION_NOTIFICATION;
-
-typedef struct _USB_ROOT_HUB_NAME {
-       ULONG  ActualLength;
-       WCHAR  RootHubName[1];
-} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;
-
-#include <poppack.h>
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __USBIOCTL_H */
index 26cb6ee..56b0f74 100644 (file)
@@ -1,15 +1,3 @@
-
-#ifndef   __USBKERN_H__
-#define   __USBKERN_H__
+#pragma once
 
 #include "usbiodef.h"
-
-#define IOCTL_INTERNAL_USB_GET_HUB_COUNT USB_KERNEL_CTL(USB_GET_HUB_COUNT)
-#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO  USB_KERNEL_CTL(USB_GET_ROOTHUB_PDO)
-
-#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE  \
-    CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS)
-
-#endif
-
-
index 58fa13c..a2efc4f 100644 (file)
@@ -1,5 +1,5 @@
-
 #define USBPRINT_IOCTL_INDEX  0x0000
+
 #define IOCTL_USBPRINT_GET_LPT_STATUS \
                      CTL_CODE(FILE_DEVICE_UNKNOWN, USBPRINT_IOCTL_INDEX+12, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
@@ -14,4 +14,3 @@
 
 #define IOCTL_USBPRINT_SOFT_RESET \
                       CTL_CODE(FILE_DEVICE_UNKNOWN, USBPRINT_IOCTL_INDEX+16, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
diff --git a/reactos/include/ddk/usbprotocoldefs.h b/reactos/include/ddk/usbprotocoldefs.h
new file mode 100644 (file)
index 0000000..9a25a1b
--- /dev/null
@@ -0,0 +1,677 @@
+#pragma once
+
+#include <pshpack1.h>
+
+#define USB_UnConnected_Device_Address 0
+#define USB_UNCONNECTED_ADDRESS(address) ( USB_UnConnected_Device_Address == (address))
+#define USB_CONNECTED_ADDRESS(address) ( USB_UnConnected_Device_Address != (address) )
+
+#define PID_OUT                             1
+#define PID_IN                              9
+#define PID_SOF                             5
+#define PID_SETUP                           13
+
+#define PID_DATA0                           3
+#define PID_DATA1                           11
+#define PID_DATA2                           7
+#define PID_MDATA                           15
+
+#define USB_ACK                             2
+#define USB_NAK                             10
+#define USB_STALL                           14
+#define USB_NYET                            6
+
+#define USB_PRE                             12
+#define USB_ERR                             12
+#define USB_SPLIT                           8
+#define USB_PING                            4
+
+#define USB_TIMEOUT                         0
+
+#define USB_SPEC                            0x0200
+#define HID_SPEC                            0x0101
+
+#define USB_20_SPEC                        0x0200
+#define USB_11_SPEC                        0x0110
+#define USB_10_SPEC                        0x0100
+
+#define HID_MAX_PACKET_SIZE0                0x08
+#define MICROSOFT_VENDOR_ID                 0x045E
+#define HID_DEVICE_RELEASE                  0x0100
+
+#define HID_MAX_PACKET_SIZE                 0x0008
+#define HID_POLLING_INTERVAL                0x0A
+#define MAX_POLLING_INTERVAL                0xFF
+
+#define USB_DEFAULT_KEYBOARD_PRODUCT_ID     0x000B
+#define USB_DEFAULT_MOUSE_PRODUCT_ID        0x0040
+
+#define DEVICE_DESCRIPTOR                   0x01
+#define CONFIGURATION_DESCRIPTOR            0x02
+#define STRING_DESCRIPTOR                   0x03
+#define INTERFACE_DESCRIPTOR                0x04
+#define ENDPOINT_DESCRIPTOR                 0x05
+#define QUALIFIER_DESCRIPTOR                0x06
+#define OTHER_SPEED_DESCRIPTOR              0x07
+#define INTERFACE_POWER_DESCRIPTOR          0x08
+
+#define HID_DESCRIPTOR                      0x21
+#define REPORT_DESCRIPTOR                   0x22
+#define PHYSICAL_DESCRIPTOR                 0x23
+#define HUB_DESCRIPTOR                      0x29
+
+#define USB_DESCRIPTOR_TYPE_STD             0
+#define USB_DESCRIPTOR_TYPE_CLASS           1
+#define USB_DESCRIPTOR_TYPE_VENDOR          2
+#define USB_DESCRIPTOR_TYPE_RESERVED        3
+
+#define DIR_HOST_TO_DEVICE                  0
+#define DIR_DEVICE_TO_HOST                  1
+
+#define TYPE_STANDARD                       0
+#define TYPE_CLASS                          1
+#define TYPE_VENDOR                         2
+#define TYPE_RESERVED                       3
+
+#define RCPT_DEVICE                         0
+#define RCPT_INTERFACE                      1
+#define RCPT_ENDPOINT                       2
+#define RCPT_OTHER                          3
+#define RCPT_PORT                           4
+#define RCPT_RPIPE                          5
+
+#if !defined(MIDL_PASS)
+#define USB_MAKE_REQUEST_TYPE(direction, type, recipient) (BYTE)( ((BYTE)direction << 7) | ((BYTE)type << 5) | ((BYTE)recipient & 0x07) )
+#endif
+
+#define GET_STATUS                          0
+#define CLEAR_FEATURE                       1
+#define SET_FEATURE                         3
+#define SET_ADDRESS                         5
+#define GET_DESCRIPTOR                      6
+#define SET_DESCRIPTOR                      7
+#define GET_CONFIGURATION                   8
+#define SET_CONFIGURATION                   9
+#define GET_INTERFACE                       10
+#define SET_INTERFACE                       11
+#define SYNCH_FRAME                         12
+
+#define USB_BULK_ONLY_MASS_STG_RESET        0xFF
+#define USB_BULK_ONLY_MASS_STG_GET_MAX_LUN  0xFE
+
+#define GET_REPORT                          0x01
+#define GET_IDLE                            0x02
+#define GET_PROTOCOL                        0x03
+#define SET_REPORT                          0x09
+#define SET_IDLE                            0x0A
+#define SET_PROTOCOL                        0x0B
+
+#define ADD_MMC_IE                         20
+#define REMOVE_MMC_IE                      21
+#define SET_NUM_DNTS                       22
+#define SET_CLUSTER_ID                     23
+#define SET_DEVICE_INFO                    24
+#define GET_TIME                           25
+#define SET_STREAM_INDEX                   26
+#define SET_WUSB_MAS                       27
+#define WUSB_CH_STOP                       28
+
+#define EXEC_RC_CMD                        40
+
+#define TIME_ADJ                          0x01
+#define TIME_BPST                         0x02
+#define TIME_WUSB                         0x03
+
+#define HID_REPORT_TYPE_INPUT               0x01
+#define HID_REPORT_TYPE_OUTPUT              0x02
+#define HID_REPORT_TYPE_FEATURE             0x03
+
+#define HID_PROTOCOL_TYPE_BOOT               0x00
+#define HID_PROTOCOL_TYPE_REPORT             0x01
+
+#define HUB_DEVICE_PROTOCOL_1X                0
+#define HUB_DEVICE_PROTOCOL_SINGLE_TT         1
+#define HUB_DEVICE_PROTOCOL_MULTI_TT          2
+
+#define HUB_INTERFACE_PROTOCOL_1X                           0
+#define HUB_INTERFACE_PROTOCOL_SINGLE_TT                    0
+#define HUB_INTERFACE_PROTOCOL_MULTI_TT_IN_SINGLE_TT_MODE   1
+#define HUB_INTERFACE_PROTOCOL_MULTI_TT_IN_MULTI_TT_MODE    2
+
+#define CLEAR_TT_BUFFER                      8
+#define RESET_TT                             9
+#define GET_TT_STATE                         10
+#define STOP_TT                              11
+
+#define C_HUB_LOCAL_POWER                    0
+#define C_HUB_OVER_CURRENT                   1
+#define PORT_CONNECTION                      0
+#define PORT_ENABLE                          1
+#define PORT_SUSPEND                         2
+#define PORT_OVER_CURRENT                    3
+#define PORT_RESET                           4
+#define PORT_POWER                           8
+#define PORT_LOW_SPEED                       9
+#define C_PORT_CONNECTION                    16
+#define C_PORT_ENABLE                        17
+#define C_PORT_SUSPEND                       18
+#define C_PORT_OVER_CURRENT                  19
+#define C_PORT_RESET                         20
+#define PORT_TEST                            21
+#define PORT_INDICATOR                       22
+
+#define USBSETUPSIZE                        8
+#define USBINREQUEST                        128
+
+#define BM_GET_DEVICE                       128
+#define BM_GET_INTERFACE                    129
+#define BM_GET_ENDPOINT                     130
+
+#define BM_SET_DEVICE                       0
+#define BM_SET_INTERFACE                    1
+#define BM_SET_ENDPOINT                     2
+
+#define HALT_ENDPOINT                       0
+#define REMOTE_WAKEUP                       1
+#define TEST_MODE                           2
+
+#define DEVICE_DESCRIPTION_TYPE             0x100
+#define QUALIFIER_DESCRIPTION_TYPE          0x600
+#define OTHER_SPEED_DESCRIPTION_TYPE        0x700
+#define CONFIG_DESCRIPTION_TYPE             0x200
+#define STRING_DESCRIPTION_TYPE             0x300
+#define MSOS_DESCRIPTION_TYPE               0x3EE
+
+#define CONFIG_BUS_POWERED                  0x80
+#define CONFIG_SELF_POWERED                 0x40
+#define CONFIG_REMOTE_WAKEUP                0x20
+
+#define USB_WA_MULTIFUNCTION                0x02
+#define USB_WA_PROTOCOL                     0x01
+#define USB_RADIO_CONTROL                   0x2
+
+#define USB_HID_CLASS_CODE                  0x03
+#define USB_MASS_STORAGE_CLASS_CODE         0x08
+#define USB_HUB_CLASS_CODE                  0x09
+#define USB_MISCELLANEOUS                   0xEF
+#define USB_WIRELESS_WA                     0xE0
+
+#define BOOT_INTERFACE_SUBCLASS             0x01
+#define COMMON_CLASS                        0x02
+#define USB_RF_CONTROL                      0x01
+
+#define PROTOCOL_NONE                       0x00
+#define PROTOCOL_KEYBOARD                   0x01
+#define PROTOCOL_MOUSE                      0x02
+
+#define EP_OUT                              0
+#define EP_IN                               1
+
+#define MAKE_ENDPOINT_ADDRESS(num, dir)     ( ((BYTE)(dir) << 7) | ((BYTE)(num) & 0x0F) )
+
+#define ENDPOINT_TYPE                       0x03
+#define CONTROL_ENDPOINT                    0
+#define ISOCHRONOUS_ENDPOINT                1
+#define BULK_ENDPOINT                       2
+#define INTERRUPT_ENDPOINT                  3
+
+typedef union _USBDESCRIPTORTYPE {
+  BYTE Byte;
+#if !defined(MIDL_PASS)
+  struct Bits {
+    BYTE Descriptor:5;
+    BYTE Type:2;
+    BYTE Reserved:1;
+  } Bits;
+#endif
+} USBDESCRIPTORTYPE;
+
+typedef union _USBCONFIGATTRIBS {
+  BYTE Byte;
+#if !defined(MIDL_PASS)
+  struct Bits {
+    BYTE bReserved0_4:5;
+    BYTE bRemoteWakeup:1;
+    BYTE bSelfPowered:1;
+    BYTE bReserved7:1;
+  } Bits;
+#endif
+} USBCONFIGATTRIBS;
+
+typedef union _USBREQUESTTYPE {
+  BYTE Byte;
+#if !defined(MIDL_PASS)
+  struct Bits {
+    BYTE Recipient:5;
+    BYTE Type:2;
+    BYTE Direction:1;
+    } Bits;
+#endif
+} USBREQUESTTYPE;
+
+#if !defined(MIDL_PASS)
+C_ASSERT((sizeof(USBREQUESTTYPE) == sizeof(BYTE)));
+#endif
+
+typedef struct _USBSETUPREQUEST {
+  USBREQUESTTYPE bmRequestType;
+  BYTE bRequest;
+  SHORT sSetupValue;
+  SHORT sSetupIndex;
+  SHORT sSetupLength;
+} USBSETUPREQUEST;
+
+#if !defined(MIDL_PASS)
+
+typedef struct _USBDEVICEDESC {
+  BYTE bLength;
+  BYTE bDescriptorType;
+  USHORT usUSB;
+  BYTE bDeviceClass;
+  BYTE bDeviceSubClass;
+  BYTE bProtocol;
+  BYTE bMaxPacket0;
+  USHORT usVendor;
+  USHORT usProduct;
+  USHORT usDeviceNumber;
+  BYTE bManufacturer;
+  BYTE bProductDesc;
+  BYTE bSerialNumber;
+  BYTE bNumConfigs;
+} USBDEVICEDESC;
+
+typedef struct _USBCONFIGDESC {
+  BYTE bLength;
+  BYTE bDescriptorType;
+  USHORT usTotalLength;
+  BYTE bNumInterfaces;
+  BYTE bConfigValue;
+  BYTE bConfig;
+  BYTE bAttributes;
+  BYTE bMaxPower;
+} USBCONFIGDESC;
+
+
+typedef struct _USBINTERFACEDESC {
+  BYTE bLength;
+  BYTE bDescriptorType;
+  BYTE bInterfaceNumber;
+  BYTE bAlternateSetting;
+  BYTE bNumEndpoints;
+  BYTE bClass;
+  BYTE bSubClass;
+  BYTE bProtocol;
+  BYTE bDescription;
+} USBINTERFACEDESC;
+
+#define ENDPOINT_DIRECTION_OUT  0
+#define ENDPOINT_DIRECTION_IN   1
+
+typedef union _USBENDPOINTADDRESS {
+  BYTE Byte;
+  struct Bits {
+    BYTE Number:4;
+    BYTE Reserved:3;
+    BYTE Direction:1;
+  } Bits;
+} USBENDPOINTADDRESS;
+
+C_ASSERT((sizeof(USBENDPOINTADDRESS) == sizeof(BYTE)));
+
+#define USB_TRANSFER_TYPE_CONTROL       0
+#define USB_TRANSFER_TYPE_ISOCH         1
+#define USB_TRANSFER_TYPE_BULK          2
+#define USB_TRANSFER_TYPE_INTERRUPT     3
+
+#define USB_SYNC_TYPE_NONE              0
+#define USB_SYNC_TYPE_ASYNC             1
+#define USB_SYNC_TYPE_ADAPTIVE          2
+#define USB_SYNC_TYPE_SYNC              3
+
+#define USB_USAGE_TYPE_DATA             0
+#define USB_USAGE_TYPE_FEEDBACK         1
+#define USB_USAGE_TYPE_IMPLICIT         2
+#define USB_USAGE_TYPE_RESERVED         3
+
+typedef union _USBENDPOINTATTRIBS {
+  BYTE Byte;
+  struct Bits {
+    BYTE TransferType:2;
+    BYTE SyncType:2;
+    BYTE UsageType:2;
+    BYTE Reserved:2;
+  } Bits;
+} USBENDPOINTATTRIBS;
+
+C_ASSERT((sizeof(USBENDPOINTATTRIBS) == sizeof(BYTE)));
+
+typedef union _USBMAXPACKET {
+  WORD Word;
+  struct Bits {
+    WORD Size:11;
+    WORD AdditionalXactions:2;
+    WORD Reserved:3;
+  } Bits;
+} USBMAXPACKET;
+
+C_ASSERT((sizeof(USBMAXPACKET) == sizeof(WORD)));
+
+typedef struct _USBENDPOINTDESC {
+  BYTE bLength;
+  BYTE bDescriptorType;
+  USBENDPOINTADDRESS Address;
+  USBENDPOINTATTRIBS Attributes;
+  USBMAXPACKET MaxPacket;
+  BYTE bInterval;
+} USBENDPOINTDESC;
+
+typedef struct _USBQUALIFIERDESC {
+  BYTE bLength;
+  BYTE bDescriptorType;
+  USHORT usUSB;
+  BYTE bDeviceClass;
+  BYTE bDeviceSubClass;
+  BYTE bProtocol;
+  BYTE bMaxPacket;
+  BYTE bNumConfigs;
+  BYTE bReserved;
+} USBQUALIFIERDESC;
+
+typedef struct _USBSTRINGDESC {
+  BYTE bLength;
+  BYTE bDescriptorType;
+  WCHAR wchData[1];
+} USBSTRINGDESC;
+
+typedef struct _USBSTRINGLANGIDS {
+  BYTE bLength;
+  BYTE bDescriptorType;
+  WORD wLANGIDs[1];
+} USBSTRINGLANGIDS;
+
+typedef struct _USBHIDSTANDARDDESC {
+  BYTE bLength;
+  BYTE bDescriptorType;
+  USHORT bcdHID;
+  BYTE bCountryCode;
+  BYTE bNumDescriptors;
+} USBHIDSTANDARDDESC;
+
+typedef struct _USBHIDOPTIONALDESC {
+  BYTE bClassDescriptorType;
+  USHORT usDescriptorLength;
+} USBHIDOPTIONALDESC;
+
+typedef struct _USBPHYSICALDESCSET0 {
+  BYTE bNumber;
+  BYTE bLength;
+} USBPHYSICALDESCSET0;
+
+typedef union _USBPHYSICALDESCSET {
+  BYTE bPhysicalInfo;
+  struct Bits {
+    BYTE bPreference:5;
+    BYTE bBias:3;
+    } Bits;
+} USBPHYSICALDESCSET;
+
+typedef struct _USBPHYSICALDESCITEM {
+  BYTE bDesignator;
+  union Flags {
+    BYTE bFlags;
+    struct Bits {
+        BYTE bEffort:5;
+        BYTE bQualifier:3;
+    } Bits;
+  } Flags;
+} USBPHYSICALDESCITEM;
+
+typedef union _USBHUBCHARACTERISTICS {
+  WORD wHubCharacteristics;
+  struct Bits {
+    BYTE bLogicalPowerSwitchingMode:2;
+    BYTE fCompoundDevice:1;
+    BYTE bOverCurrentMode:2;
+    BYTE bTTThinkTime:2;
+    BYTE fPortIndicatorSupport:1;
+    BYTE bReserved:8;
+  } Bits;
+} USBHUBCHARACTERISTICS;
+
+#if !defined(MIDL_PASS)
+C_ASSERT((sizeof(USBHUBCHARACTERISTICS) == sizeof(WORD)));
+#endif
+
+typedef struct _USBHUBDESC {
+  BYTE bLength;
+  BYTE bDescriptorType;
+  BYTE bNumberOfPorts;
+  USBHUBCHARACTERISTICS Characteristics;
+  BYTE bPwrOn2PwrGood;
+  BYTE bHubContrCurrent;
+  BYTE bDeviceRemovable[32];
+  BYTE bPortPwrCtrlMask[32];
+} USBHUBDESC;
+
+#if !defined(MIDL_PASS)
+C_ASSERT((sizeof(USBHUBDESC) == 71));
+#endif
+
+typedef union _USBHUBPORTSTATUS {
+  WORD wPortStatus;
+  struct Bits {
+    BYTE fCurrentConnectionStatus:1;
+    BYTE fEnabled:1;
+    BYTE fSuspend:1;
+    BYTE fOverCurrent:1;
+    BYTE fReset:1;
+    BYTE bReserved1:3;
+    BYTE fPortPower:1;
+    BYTE fLowSpeedDevice:1;
+    BYTE fHighSpeedDevice:1;
+    BYTE fTestMode:1;
+    BYTE fPortIndicatorControl:1;
+    BYTE bReserved2:3;
+  } Bits;
+} USBHUBPORTSTATUS;
+
+#if !defined(MIDL_PASS)
+C_ASSERT((sizeof(USBHUBPORTSTATUS) == sizeof(WORD)));
+#endif
+
+typedef union _USBHUBPORTSTATUSCHANGE {
+  WORD wPortStatusChange;
+  struct Bits {
+    BYTE fConnectionStatusChange:1;
+    BYTE fEnabledChange:1;
+    BYTE fSuspendChange:1;
+    BYTE fOverCurrentChange:1;
+    BYTE fResetChange:1;
+    BYTE bReserved1:3;
+    BYTE bReserved2:8;
+  } Bits;
+} USBHUBPORTSTATUSCHANGE;
+
+#if !defined(MIDL_PASS)
+C_ASSERT((sizeof(USBHUBPORTSTATUSCHANGE) == sizeof(WORD)));
+#endif
+
+typedef struct _USBHUBPORTDATA {
+  USBHUBPORTSTATUS PortStatus;
+  USBHUBPORTSTATUSCHANGE PortStatusChange;
+} USBHUBPORTDATA;
+
+#define USB_MAKE_LANGID(lang, sublang) ((((USHORT)(sublang)) << 10) | (USHORT)(lang))
+
+#define USB_LANG_RESERVED                                   0x00 
+#define USB_LANG_ARABIC                                     0x01
+#define USB_LANG_BULGARIAN                                  0x02
+#define USB_LANG_CATALAN                                    0x03
+#define USB_LANG_CHINESE                                    0x04
+#define USB_LANG_CZECH                                      0x05
+#define USB_LANG_DANISH                                     0x06
+#define USB_LANG_GERMAN                                     0x07
+#define USB_LANG_GREEK                                      0x08
+#define USB_LANG_ENGLISH                                    0x09
+#define USB_LANG_SPANISH                                    0x0a
+#define USB_LANG_FINNISH                                    0x0b
+#define USB_LANG_FRENCH                                     0x0c
+#define USB_LANG_HEBREW                                     0x0d
+#define USB_LANG_HUNGARIAN                                  0x0e
+#define USB_LANG_ICELANDIC                                  0x0f
+#define USB_LANG_ITALIAN                                    0x10
+#define USB_LANG_JAPANESE                                   0x11
+#define USB_LANG_KOREAN                                     0x12
+#define USB_LANG_DUTCH                                      0x13
+#define USB_LANG_NORWEGIAN                                  0x14
+#define USB_LANG_POLISH                                     0x15
+#define USB_LANG_PORTUGUESE                                 0x16
+#define USB_LANG_ROMANIAN                                   0x18
+#define USB_LANG_RUSSIAN                                    0x19
+#define USB_LANG_CROATIAN                                   0x1a
+#define USB_LANG_SERBIAN                                    0x1a
+#define USB_LANG_SLOVAK                                     0x1b
+#define USB_LANG_ALBANIAN                                   0x1c
+#define USB_LANG_SWEDISH                                    0x1d
+#define USB_LANG_THAI                                       0x1e
+#define USB_LANG_TURKISH                                    0x1f
+#define USB_LANG_URDU                                       0x20
+#define USB_LANG_INDONESIAN                                 0x21
+#define USB_LANG_UKRANIAN                                   0x22
+#define USB_LANG_BELARUSIAN                                 0x23
+#define USB_LANG_SLOVENIAN                                  0x24
+#define USB_LANG_ESTONIAN                                   0x25
+#define USB_LANG_LATVIAN                                    0x26
+#define USB_LANG_LITHUANIAN                                 0x27
+#define USB_LANG_FARSI                                      0x29
+#define USB_LANG_VIETNAMESE                                 0x2a
+#define USB_LANG_ARMENIAN                                   0x2b
+#define USB_LANG_AZERI                                      0x2c
+#define USB_LANG_BASQUE                                     0x2d
+#define USB_LANG_MACEDONIAN                                 0x2f
+#define USB_LANG_AFRIKAANS                                  0x36
+#define USB_LANG_GEORGIAN                                   0x37
+#define USB_LANG_FAEROESE                                   0x38
+#define USB_LANG_HINDI                                      0x39
+#define USB_LANG_MALAY                                      0x3e
+#define USB_LANG_KAZAK                                      0x3f
+#define USB_LANG_SWAHILI                                    0x41
+#define USB_LANG_UZBEK                                      0x43
+#define USB_LANG_TATAR                                      0x44
+#define USB_LANG_BENGALI                                    0x45
+#define USB_LANG_PUNJABI                                    0x46
+#define USB_LANG_GUJARATI                                   0x47
+#define USB_LANG_ORIYA                                      0x48
+#define USB_LANG_TAMIL                                      0x49
+#define USB_LANG_TELUGU                                     0x4a
+#define USB_LANG_KANNADA                                    0x4b
+#define USB_LANG_MALAYALAM                                  0x4c
+#define USB_LANG_ASSAMESE                                   0x4d
+#define USB_LANG_MARATHI                                    0x4e
+#define USB_LANG_SANSKRIT                                   0x4f
+#define USB_LANG_KONKANI                                    0x57
+#define USB_LANG_MANIPURI                                   0x58
+#define USB_LANG_SINDHI                                     0x59
+#define USB_LANG_KASHMIRI                                   0x60
+#define USB_LANG_NEPALI                                     0x61
+#define USB_LANG_HID                                        0xff
+
+#define USB_SUBLANG_ARABIC_SAUDI_ARABIA                     0x01
+#define USB_SUBLANG_ARABIC_SAUDI_ARABIA                     0x01
+#define USB_SUBLANG_ARABIC_IRAQ                             0x02
+#define USB_SUBLANG_ARABIC_EGYPT                            0x03
+#define USB_SUBLANG_ARABIC_LIBYA                            0x04
+#define USB_SUBLANG_ARABIC_ALGERIA                          0x05
+#define USB_SUBLANG_ARABIC_MOROCCO                          0x06
+#define USB_SUBLANG_ARABIC_TUNISIA                          0x07
+#define USB_SUBLANG_ARABIC_OMAN                             0x08
+#define USB_SUBLANG_ARABIC_YEMEN                            0x09
+#define USB_SUBLANG_ARABIC_SYRIA                            0x10
+#define USB_SUBLANG_ARABIC_JORDAN                           0x11
+#define USB_SUBLANG_ARABIC_LEBANON                          0x12
+#define USB_SUBLANG_ARABIC_KUWAIT                           0x13
+#define USB_SUBLANG_ARABIC_UAE                              0x14
+#define USB_SUBLANG_ARABIC_BAHRAIN                          0x15
+#define USB_SUBLANG_ARABIC_QATAR                            0x16
+#define USB_SUBLANG_AZERI_CYRILLIC                          0x01
+#define USB_SUBLANG_AZERI_LATIN                             0x02
+#define USB_SUBLANG_CHINESE_TRADITIONAL                     0x01
+#define USB_SUBLANG_CHINESE_SIMPLIFIED                      0x02
+#define USB_SUBLANG_CHINESE_HONGKONG                        0x03
+#define USB_SUBLANG_CHINESE_SINGAPORE                       0x04
+#define USB_SUBLANG_CHINESE_MACAU                           0x05
+#define USB_SUBLANG_DUTCH                                   0x01
+#define USB_SUBLANG_DUTCH_BELGIAN                           0x02
+#define USB_SUBLANG_ENGLISH_US                              0x01
+#define USB_SUBLANG_ENGLISH_UK                              0x02
+#define USB_SUBLANG_ENGLISH_AUS                             0x03
+#define USB_SUBLANG_ENGLISH_CAN                             0x04
+#define USB_SUBLANG_ENGLISH_NZ                              0x05
+#define USB_SUBLANG_ENGLISH_EIRE                            0x06
+#define USB_SUBLANG_ENGLISH_SOUTH_AFRICA                    0x07
+#define USB_SUBLANG_ENGLISH_JAMAICA                         0x08
+#define USB_SUBLANG_ENGLISH_CARIBBEAN                       0x09
+#define USB_SUBLANG_ENGLISH_BELIZE                          0x0a
+#define USB_SUBLANG_ENGLISH_TRINIDAD                        0x0b
+#define USB_SUBLANG_ENGLISH_PHILIPPINES                     0x0c
+#define USB_SUBLANG_ENGLISH_ZIMBABWE                        0x0d
+#define USB_SUBLANG_FRENCH                                  0x01
+#define USB_SUBLANG_FRENCH_BELGIAN                          0x02
+#define USB_SUBLANG_FRENCH_CANADIAN                         0x03
+#define USB_SUBLANG_FRENCH_SWISS                            0x04
+#define USB_SUBLANG_FRENCH_LUXEMBOURG                       0x05
+#define USB_SUBLANG_FRENCH_MONACO                           0x06
+#define USB_SUBLANG_GERMAN                                  0x01
+#define USB_SUBLANG_GERMAN_SWISS                            0x02
+#define USB_SUBLANG_GERMAN_AUSTRIAN                         0x03
+#define USB_SUBLANG_GERMAN_LUXEMBOURG                       0x04
+#define USB_SUBLANG_GERMAN_LIECHTENSTEIN                    0x05
+#define USB_SUBLANG_ITALIAN                                 0x01
+#define USB_SUBLANG_ITALIAN_SWISS                           0x02
+#define USB_SUBLANG_KASHMIRI_INDIA                          0x02
+#define USB_SUBLANG_KOREAN                                  0x01
+#define USB_SUBLANG_LITHUANIAN                              0x01
+#define USB_SUBLANG_MALAY_MALAYSIA                          0x01
+#define USB_SUBLANG_MALAY_BRUNEI_DARUSSALAM                 0x02
+#define USB_SUBLANG_NEPALI_INDIA                            0x02
+#define USB_SUBLANG_NORWEGIAN_BOKMAL                        0x01
+#define USB_SUBLANG_NORWEGIAN_NYNORSK                       0x02
+#define USB_SUBLANG_PORTUGUESE                              0x01
+#define USB_SUBLANG_PORTUGUESE_BRAZILIAN                    0x02
+#define USB_SUBLANG_SERBIAN_LATIN                           0x02
+#define USB_SUBLANG_SERBIAN_CYRILLIC                        0x03
+#define USB_SUBLANG_SPANISH                                 0x01
+#define USB_SUBLANG_SPANISH_MEXICAN                         0x02
+#define USB_SUBLANG_SPANISH_MODERN                          0x03
+#define USB_SUBLANG_SPANISH_GUATEMALA                       0x04
+#define USB_SUBLANG_SPANISH_COSTA_RICA                      0x05
+#define USB_SUBLANG_SPANISH_PANAMA                          0x06
+#define USB_SUBLANG_SPANISH_DOMINICAN_REPUBLIC              0x07
+#define USB_SUBLANG_SPANISH_VENEZUELA                       0x08
+#define USB_SUBLANG_SPANISH_COLOMBIA                        0x09
+#define USB_SUBLANG_SPANISH_PERU                            0x0a
+#define USB_SUBLANG_SPANISH_ARGENTINA                       0x0b
+#define USB_SUBLANG_SPANISH_ECUADOR                         0x0c
+#define USB_SUBLANG_SPANISH_CHILE                           0x0d
+#define USB_SUBLANG_SPANISH_URUGUAY                         0x0e
+#define USB_SUBLANG_SPANISH_PARAGUAY                        0x0f
+#define USB_SUBLANG_SPANISH_BOLIVIA                         0x10
+#define USB_SUBLANG_SPANISH_EL_SALVADOR                     0x11
+#define USB_SUBLANG_SPANISH_HONDURAS                        0x12
+#define USB_SUBLANG_SPANISH_NICARAGUA                       0x13
+#define USB_SUBLANG_SPANISH_PUERTO_RICO                     0x14
+#define USB_SUBLANG_SWEDISH                                 0x01
+#define USB_SUBLANG_SWEDISH_FINLAND                         0x02
+#define USB_SUBLANG_URDU_PAKISTAN                           0x01
+#define USB_SUBLANG_URDU_INDIA                              0x02
+#define USB_SUBLANG_UZBEK_LATIN                             0x01
+#define USB_SUBLANG_UZBEK_CYRILLIC                          0x02
+#define USB_SUBLANG_HID_USAGE_DATA_DESCRIPTOR               0x01
+#define USB_SUBLANG_HID_VENDOR_DEFINED_1                    0x3c
+#define USB_SUBLANG_HID_VENDOR_DEFINED_2                    0x3d
+#define USB_SUBLANG_HID_VENDOR_DEFINED_3                    0x3e
+#define USB_SUBLANG_HID_VENDOR_DEFINED_4                    0x3f
+
+#endif // !defined(MIDL_PASS)
+
+#include <poppack.h>
index 8e61a7a..718b13c 100644 (file)
  *
  */
 
-#ifndef __USBSCAN_H
-#define __USBSCAN_H
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#define FILE_DEVICE_USB_SCAN              0x8000
-#define IOCTL_INDEX                       0x0800
-
-#define IOCTL_CANCEL_IO \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 1, METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_GET_VERSION \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 0, METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_GET_CHANNEL_ALIGN_RQST \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 5, METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_GET_DEVICE_DESCRIPTOR \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 6, METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_GET_PIPE_CONFIGURATION \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 10,METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_GET_USB_DESCRIPTOR \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 8, METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_READ_REGISTERS \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 3, METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_RESET_PIPE \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 7, METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_SEND_USB_REQUEST \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 9, METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_SET_TIMEOUT \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 11,METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_WAIT_ON_DEVICE_EVENT \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 2, METHOD_BUFFERED,FILE_ANY_ACCESS)
-
-#define IOCTL_WRITE_REGISTERS \
-  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
+#pragma pack(push,8)
 
+#ifndef MAX_NUM_PIPES
 #define MAX_NUM_PIPES                     8
+#endif
 
 #define BULKIN_FLAG                       0x80
 
-typedef struct _CHANNEL_INFO {
-  OUT ULONG  EventChannelSize;
-  OUT ULONG  uReadDataAlignment;
-  OUT ULONG  uWriteDataAlignment;
-}CHANNEL_INFO, *PCHANNEL_INFO;
-
-typedef struct _DEVICE_DESCRIPTOR {
-  OUT USHORT  usVendorId;
-  OUT USHORT  usProductId;
-  OUT USHORT  usBcdDevice;
-  OUT USHORT  usLanguageId;
-} DEVICE_DESCRIPTOR, *PDEVICE_DESCRIPTOR;
-
 typedef struct _DRV_VERSION {
-  OUT ULONG  major;
-  OUT ULONG  minor;
-  OUT ULONG  internal;
+  OUT ULONG major;
+  OUT ULONG minor;
+  OUT ULONG internal;
 } DRV_VERSION, *PDRV_VERSION;
 
 typedef struct _IO_BLOCK {
-  IN ULONG  uOffset;
-  IN ULONG  uLength;
-  IN OUT PUCHAR  pbyData;
-  IN ULONG  uIndex;
+  IN ULONG uOffset;
+  IN ULONG uLength;
+  IN OUT PUCHAR pbyData;
+  IN ULONG uIndex;
 } IO_BLOCK, *PIO_BLOCK;
 
 typedef struct _IO_BLOCK_EX {
-  IN  ULONG  uOffset;
-  IN  ULONG  uLength;
-  IN OUT PUCHAR  pbyData;
-  IN  ULONG  uIndex;
-  IN  UCHAR  bRequest;
-  IN  UCHAR  bmRequestType;
-  IN  UCHAR  fTransferDirectionIn;
+  IN ULONG uOffset;
+  IN ULONG uLength;
+  IN OUT PUCHAR pbyData;
+  IN ULONG uIndex;
+  IN UCHAR bRequest;
+  IN UCHAR bmRequestType;
+  IN UCHAR fTransferDirectionIn;
 } IO_BLOCK_EX, *PIO_BLOCK_EX;
 
+typedef struct _CHANNEL_INFO {
+  OUT ULONG EventChannelSize;
+  OUT ULONG uReadDataAlignment;
+  OUT ULONG uWriteDataAlignment;
+}CHANNEL_INFO, *PCHANNEL_INFO;
+
+typedef enum _PIPE_TYPE {
+  EVENT_PIPE,
+  READ_DATA_PIPE,
+  WRITE_DATA_PIPE,
+  ALL_PIPE
+} PIPE_TYPE;
+
 typedef struct _USBSCAN_GET_DESCRIPTOR {
-  IN UCHAR  DescriptorType;
-  IN UCHAR  Index;
-  IN USHORT  LanguageId;
+  IN UCHAR DescriptorType;
+  IN UCHAR Index;
+  IN USHORT LanguageId;
 } USBSCAN_GET_DESCRIPTOR, *PUSBSCAN_GET_DESCRIPTOR;
 
+typedef struct _DEVICE_DESCRIPTOR {
+  OUT USHORT usVendorId;
+  OUT USHORT usProductId;
+  OUT USHORT usBcdDevice;
+  OUT USHORT usLanguageId;
+} DEVICE_DESCRIPTOR, *PDEVICE_DESCRIPTOR;
+
 typedef enum _RAW_PIPE_TYPE {
-       USBSCAN_PIPE_CONTROL,
-       USBSCAN_PIPE_ISOCHRONOUS,
-       USBSCAN_PIPE_BULK,
-       USBSCAN_PIPE_INTERRUPT
+  USBSCAN_PIPE_CONTROL,
+  USBSCAN_PIPE_ISOCHRONOUS,
+  USBSCAN_PIPE_BULK,
+  USBSCAN_PIPE_INTERRUPT
 } RAW_PIPE_TYPE;
 
 typedef struct _USBSCAN_PIPE_INFORMATION {
-  USHORT  MaximumPacketSize;
-  UCHAR  EndpointAddress;
-  UCHAR  Interval;
-  RAW_PIPE_TYPE  PipeType;
+  USHORT MaximumPacketSize;
+  UCHAR EndpointAddress;
+  UCHAR Interval;
+  RAW_PIPE_TYPE PipeType;
 } USBSCAN_PIPE_INFORMATION, *PUSBSCAN_PIPE_INFORMATION;
 
 typedef struct _USBSCAN_PIPE_CONFIGURATION {
-  OUT ULONG  NumberOfPipes;
-  OUT USBSCAN_PIPE_INFORMATION  PipeInfo[MAX_NUM_PIPES];
+  OUT ULONG NumberOfPipes;
+  OUT USBSCAN_PIPE_INFORMATION PipeInfo[MAX_NUM_PIPES];
 } USBSCAN_PIPE_CONFIGURATION, *PUSBSCAN_PIPE_CONFIGURATION;
 
+#if (NTDDI_VERSION >= NTDDI_WINXP)
 typedef struct _USBSCAN_TIMEOUT {
-  IN ULONG  TimeoutRead;
-  IN ULONG  TimeoutWrite;
-  IN ULONG  TimeoutEvent;
+  IN ULONG TimeoutRead;
+  IN ULONG TimeoutWrite;
+  IN ULONG TimeoutEvent;
 } USBSCAN_TIMEOUT, *PUSBSCAN_TIMEOUT;
+#endif
 
-typedef enum _PIPE_TYPE {
-       EVENT_PIPE,
-       READ_DATA_PIPE,
-       WRITE_DATA_PIPE,
-       ALL_PIPE
-} PIPE_TYPE;
+#define FILE_DEVICE_USB_SCAN              0x8000
+#define IOCTL_INDEX                       0x0800
+
+#define IOCTL_GET_VERSION \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 0, METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define IOCTL_CANCEL_IO \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 1, METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define IOCTL_WAIT_ON_DEVICE_EVENT \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 2, METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define IOCTL_READ_REGISTERS \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 3, METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define IOCTL_WRITE_REGISTERS \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_GET_CHANNEL_ALIGN_RQST \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 5, METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define IOCTL_GET_DEVICE_DESCRIPTOR \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 6, METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define IOCTL_RESET_PIPE \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 7, METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define IOCTL_GET_USB_DESCRIPTOR \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 8, METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define IOCTL_SEND_USB_REQUEST \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 9, METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define IOCTL_GET_PIPE_CONFIGURATION \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 10,METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#define IOCTL_SET_TIMEOUT \
+  CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 11,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#endif
+
+#pragma pack(pop)
+
+#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
 
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* __USBSCAN_H */
diff --git a/reactos/include/ddk/usbstorioctl.h b/reactos/include/ddk/usbstorioctl.h
new file mode 100644 (file)
index 0000000..5e71ae3
--- /dev/null
@@ -0,0 +1,64 @@
+#pragma once
+
+#ifndef MAX_PATH
+#define MAX_PATH 260
+#endif
+
+typedef struct tagACT_AUTHZ_STATE {
+  UCHAR ACT;
+  BOOLEAN fAuthorized;
+} ACT_AUTHZ_STATE, *PACT_AUTHZ_STATE;
+
+typedef struct tagSILO_COMMAND {
+  UCHAR SiloIndex;
+  UCHAR Command;
+  ULONG cbCommandBuffer;
+  UCHAR rgbCommandBuffer[ANYSIZE_ARRAY];
+} SILO_COMMAND, *PSILO_COMMAND;
+
+typedef enum _PDO_TYPE {
+  PDO_TYPE_UNDEFINED = 0,
+  PDO_TYPE_DISK,
+  PDO_TYPE_CONTROL,
+  PDO_TYPE_SILO,
+  PDO_TYPE_THIS = 256
+} PDO_TYPE;
+
+typedef enum _PDO_STATE {
+  PDO_STATE_UNDEFINED = 0,
+  PDO_STATE_STARTED,
+  PDO_STATE_NOT_STARTED
+} PDO_STATE;
+
+typedef enum _PDO_CAPS {
+  PDO_CAPABILITY_UNDEFINED = 0,
+  PDO_CAPABILITY_INC512_SET = 1,
+  PDO_CAPABILITY_INC512_CLEAR = 2
+} PDO_CAPS;
+
+typedef struct _ENUM_PDO_ENTRY {
+  UCHAR type;
+  UCHAR state;
+  UCHAR capabilities;
+  ULONG ulSTID;
+  UCHAR bSpecificationMajor;
+  UCHAR bSpecificationMinor;
+  UCHAR bImplementationMajor;
+  UCHAR bImplementationMinor;
+  WCHAR wszDeviceInstancePath[(2 * MAX_PATH) + 1];
+} ENUM_PDO_ENTRY, *PENUM_PDO_ENTRY;
+
+typedef struct _ENUM_PDO_RESULTS {
+  ULONG cEntries;
+  ENUM_PDO_ENTRY rgEntries[ANYSIZE_ARRAY];
+} ENUM_PDO_RESULTS, *PENUM_PDO_RESULTS;
+
+#define SIZE_ENUM_PDO_RESULTS_HEADER (sizeof(ENUM_PDO_RESULTS) - sizeof(ENUM_PDO_ENTRY))
+
+#define IOCTL_EHSTOR_DEVICE_SET_AUTHZ_STATE   CTL_CODE(IOCTL_STORAGE_BASE, 0x501, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EHSTOR_DEVICE_GET_AUTHZ_STATE   CTL_CODE(IOCTL_STORAGE_BASE, 0x502, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EHSTOR_DEVICE_SILO_COMMAND      CTL_CODE(IOCTL_STORAGE_BASE, 0x503, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS    CTL_CODE(IOCTL_STORAGE_BASE, 0x504, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+DEFINE_GUID(GUID_USBSTOR_EHSTOR_SILO_INTERFACE, 0x7c2bcf57, 0x2bea, 0x46da, 0xad, 0x26, 0x78, 0xfd, 0xc8, 0x3c, 0xee, 0x46);
+DEFINE_GUID(GUID_USBSTOR_EHSTOR_CONTROL_INTERFACE, 0x4f40006f, 0xb933, 0x4550, 0xb5, 0x32, 0x2b, 0x58, 0xce, 0xe6, 0x14, 0xd3);
index fcf4d4a..047a567 100644 (file)
@@ -1136,6 +1136,13 @@ DDKAPI
 VideoPortQuerySystemTime(
   OUT PLARGE_INTEGER  CurrentTime);
 
+VPAPI
+BOOLEAN
+DDKAPI
+VideoPortIsNoVesa(
+    VOID
+);
+
 VPAPI
 BOOLEAN
 DDKAPI
index acdf7a1..c36761d 100644 (file)
@@ -1,9 +1,39 @@
+/*
+ * wdm.h
+ *
+ * Windows NT WDM Driver Developer Kit
+ *
+ * This file is part of the ReactOS DDK package.
+ *
+ * Contributors:
+ *   Amine Khaldi
+ *   Timo Kreuzer (timo.kreuzer@reactos.org)
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+#pragma once
+
 #ifndef _WDMDDK_
 #define _WDMDDK_
 
-//
-// Dependencies
-//
+/* Included via ntddk.h? */
+#ifndef _NTDDK_
+#define _NTDDK_
+#define _WDM_INCLUDED_
+#define _DDK_DRIVER_
+#define NO_INTERLOCKED_INTRINSICS
+#endif /* _NTDDK_ */
+
+/* Dependencies */
 #define NT_INCLUDED
 #include <excpt.h>
 #include <ntdef.h>
 #include <guiddef.h>
 #endif /* GUID_DEFINED */
 
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#include <dpfilter.h>
+#endif
+
 #include "intrin.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#if !defined(_NTHALDLL_) && !defined(_BLDR_)
+#define NTHALAPI DECLSPEC_IMPORT
+#else
+#define NTHALAPI
+#endif
+
+/* For ReactOS */
+#if !defined(_NTOSKRNL_) && !defined(_BLDR_)
 #define NTKERNELAPI DECLSPEC_IMPORT
+#else
+#define NTKERNELAPI
+#endif
 
-#ifdef _WIN64
-#define PORT_MAXIMUM_MESSAGE_LENGTH 512
+#if defined(_X86_) && !defined(_NTHAL_)
+#define _DECL_HAL_KE_IMPORT  DECLSPEC_IMPORT
+#elif defined(_X86_)
+#define _DECL_HAL_KE_IMPORT
 #else
-#define PORT_MAXIMUM_MESSAGE_LENGTH 256
+#define _DECL_HAL_KE_IMPORT NTKERNELAPI
+#endif
+
+#if defined(_WIN64)
+#define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
+#else
+#define POINTER_ALIGNMENT
 #endif
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
 
 #if defined(_MSC_VER)
 
-//
-// Indicate if #pragma alloc_text() is supported
-//
+/* Indicate if #pragma alloc_text() is supported */
 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
 #define ALLOC_PRAGMA 1
 #endif
 
-//
-// Indicate if #pragma data_seg() is supported
-//
+/* Indicate if #pragma data_seg() is supported */
 #if defined(_M_IX86) || defined(_M_AMD64)
 #define ALLOC_DATA_PRAGMA 1
 #endif
 
 #endif
 
-
-/* Simple types */
-typedef UCHAR KPROCESSOR_MODE;
-typedef LONG KPRIORITY;
-typedef PVOID PSECURITY_DESCRIPTOR;
-typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
+/* Forward declarations */
+struct _IRP;
+struct _MDL;
+struct _KAPC;
+struct _KDPC;
+struct _FILE_OBJECT;
+struct _DMA_ADAPTER;
+struct _DEVICE_OBJECT;
+struct _DRIVER_OBJECT;
+struct _IO_STATUS_BLOCK;
+struct _DEVICE_DESCRIPTION;
+struct _SCATTER_GATHER_LIST;
+struct _DRIVE_LAYOUT_INFORMATION;
+struct _COMPRESSED_DATA_INFO;
+struct _IO_RESOURCE_DESCRIPTOR;
 
 /* Structures not exposed to drivers */
 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
-typedef struct _BUS_HANDLER *PBUS_HANDLER;
-
 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; 
 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
 typedef struct _ETHREAD *PETHREAD;
@@ -68,383 +132,94 @@ typedef struct _IO_TIMER *PIO_TIMER;
 typedef struct _KINTERRUPT *PKINTERRUPT;
 typedef struct _KPROCESS *PKPROCESS;
 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
-
-
 typedef struct _CONTEXT *PCONTEXT;
 
+
+/******************************************************************************
+ *                           INTERLOCKED Functions                            *
+ ******************************************************************************/
 //
-// Resource list definitions
+// Intrinsics (note: taken from our winnt.h)
+// FIXME: 64-bit
 //
-typedef int CM_RESOURCE_TYPE;
+#if defined(__GNUC__)
 
-#define CmResourceTypeNull              0
-#define CmResourceTypePort              1
-#define CmResourceTypeInterrupt         2
-#define CmResourceTypeMemory            3
-#define CmResourceTypeDma               4
-#define CmResourceTypeDeviceSpecific    5
-#define CmResourceTypeBusNumber         6
-#define CmResourceTypeNonArbitrated      128
-#define CmResourceTypeConfigData         128
-#define CmResourceTypeDevicePrivate      129
-#define CmResourceTypePcCardConfig       130
-#define CmResourceTypeMfCardConfig       131
+static __inline__ BOOLEAN
+InterlockedBitTestAndSet(IN LONG volatile *Base,
+                         IN LONG Bit)
+{
+#if defined(_M_IX86)
+       LONG OldBit;
+       __asm__ __volatile__("lock "
+                            "btsl %2,%1\n\t"
+                            "sbbl %0,%0\n\t"
+                            :"=r" (OldBit),"+m" (*Base)
+                            :"Ir" (Bit)
+                            : "memory");
+       return OldBit;
+#else
+       return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
+#endif
+}
 
-typedef enum _INTERFACE_TYPE {
-  InterfaceTypeUndefined = -1,
-  Internal,
-  Isa,
-  Eisa,
-  MicroChannel,
-  TurboChannel,
-  PCIBus,
-  VMEBus,
-  NuBus,
-  PCMCIABus,
-  CBus,
-  MPIBus,
-  MPSABus,
-  ProcessorInternal,
-  InternalPowerBus,
-  PNPISABus,
-  PNPBus,
-  MaximumInterfaceType
-} INTERFACE_TYPE, *PINTERFACE_TYPE;
+static __inline__ BOOLEAN
+InterlockedBitTestAndReset(IN LONG volatile *Base,
+                           IN LONG Bit)
+{
+#if defined(_M_IX86)
+       LONG OldBit;
+       __asm__ __volatile__("lock "
+                            "btrl %2,%1\n\t"
+                            "sbbl %0,%0\n\t"
+                            :"=r" (OldBit),"+m" (*Base)
+                            :"Ir" (Bit)
+                            : "memory");
+       return OldBit;
+#else
+       return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
+#endif
+}
 
-/* IO_RESOURCE_DESCRIPTOR.Option */
+#endif
 
-#define IO_RESOURCE_PREFERRED             0x01
-#define IO_RESOURCE_DEFAULT               0x02
-#define IO_RESOURCE_ALTERNATIVE           0x08
+#define BitScanForward _BitScanForward
+#define BitScanReverse _BitScanReverse
+#define BitTest _bittest
+#define BitTestAndComplement _bittestandcomplement
+#define BitTestAndSet _bittestandset
+#define BitTestAndReset _bittestandreset
+#define InterlockedBitTestAndSet _interlockedbittestandset
+#define InterlockedBitTestAndReset _interlockedbittestandreset
 
-typedef struct _IO_RESOURCE_DESCRIPTOR {
-  UCHAR  Option;
-  UCHAR  Type;
-  UCHAR  ShareDisposition;
-  UCHAR  Spare1;
-  USHORT  Flags;
-  USHORT  Spare2;
-  union {
-    struct {
-      ULONG  Length;
-      ULONG  Alignment;
-      PHYSICAL_ADDRESS  MinimumAddress;
-      PHYSICAL_ADDRESS  MaximumAddress;
-    } Port;
-    struct {
-      ULONG  Length;
-      ULONG  Alignment;
-      PHYSICAL_ADDRESS  MinimumAddress;
-      PHYSICAL_ADDRESS  MaximumAddress;
-    } Memory;
-    struct {
-      ULONG  MinimumVector;
-      ULONG  MaximumVector;
-    } Interrupt;
-    struct {
-      ULONG  MinimumChannel;
-      ULONG  MaximumChannel;
-    } Dma;
-    struct {
-      ULONG  Length;
-      ULONG  Alignment;
-      PHYSICAL_ADDRESS  MinimumAddress;
-      PHYSICAL_ADDRESS  MaximumAddress;
-    } Generic;
-    struct {
-      ULONG  Data[3];
-    } DevicePrivate;
-    struct {
-      ULONG  Length;
-      ULONG  MinBusNumber;
-      ULONG  MaxBusNumber;
-      ULONG  Reserved;
-    } BusNumber;
-    struct {
-      ULONG  Priority;
-      ULONG  Reserved1;
-      ULONG  Reserved2;
-    } ConfigData;
-  } u;
-} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
+#ifdef _M_AMD64
+#define InterlockedBitTestAndSet64 _interlockedbittestandset64
+#define InterlockedBitTestAndReset64 _interlockedbittestandreset64
+#endif
 
-typedef struct _IO_RESOURCE_LIST {
-  USHORT  Version;
-  USHORT  Revision;
-  ULONG  Count;
-  IO_RESOURCE_DESCRIPTOR  Descriptors[1];
-} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
+#if !defined(__INTERLOCKED_DECLARED)
+#define __INTERLOCKED_DECLARED
 
-typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
-  ULONG  ListSize;
-  INTERFACE_TYPE  InterfaceType;
-  ULONG  BusNumber;
-  ULONG  SlotNumber;
-  ULONG  Reserved[3];
-  ULONG  AlternativeLists;
-  IO_RESOURCE_LIST  List[1];
-} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
+#if defined (_X86_)
+#if defined(NO_INTERLOCKED_INTRINSICS)
+NTKERNELAPI
+LONG
+FASTCALL
+InterlockedIncrement(
+  IN OUT LONG volatile *Addend);
 
-//
-// Global debug flag
-//
-extern ULONG NtGlobalFlag;
+NTKERNELAPI
+LONG
+FASTCALL
+InterlockedDecrement(
+  IN OUT LONG volatile *Addend);
 
-
-#include <pshpack4.h>
-typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
-  UCHAR Type;
-  UCHAR ShareDisposition;
-  USHORT Flags;
-  union {
-    struct {
-      PHYSICAL_ADDRESS Start;
-      ULONG Length;
-    } Generic;
-    struct {
-      PHYSICAL_ADDRESS Start;
-      ULONG Length;
-    } Port;
-    struct {
-      ULONG Level;
-      ULONG Vector;
-      KAFFINITY Affinity;
-    } Interrupt;
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    struct {
-      union {
-        struct {
-          USHORT Reserved;
-          USHORT MessageCount;
-          ULONG Vector;
-          KAFFINITY Affinity;
-        } Raw;
-        struct {
-          ULONG Level;
-          ULONG Vector;
-          KAFFINITY Affinity;
-        } Translated;
-      };
-    } MessageInterrupt;
-#endif
-    struct {
-      PHYSICAL_ADDRESS Start;
-      ULONG Length;
-    } Memory;
-    struct {
-      ULONG Channel;
-      ULONG Port;
-      ULONG Reserved1;
-    } Dma;
-    struct {
-      ULONG Data[3];
-    } DevicePrivate;
-    struct {
-      ULONG Start;
-      ULONG Length;
-      ULONG Reserved;
-    } BusNumber;
-    struct {
-      ULONG DataSize;
-      ULONG Reserved1;
-      ULONG Reserved2;
-    } DeviceSpecificData;
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    struct {
-      PHYSICAL_ADDRESS Start;
-      ULONG Length40;
-    } Memory40;
-    struct {
-      PHYSICAL_ADDRESS Start;
-      ULONG Length48;
-    } Memory48;
-    struct {
-      PHYSICAL_ADDRESS Start;
-      ULONG Length64;
-    } Memory64;
-#endif
-  } u;
-} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
-#include <poppack.h>
-
-//
-// Section map options
-//
-typedef enum _SECTION_INHERIT {
-    ViewShare = 1,
-    ViewUnmap = 2
-} SECTION_INHERIT;
-
-//
-// Section access rights
-//
-#define SECTION_QUERY                0x0001
-#define SECTION_MAP_WRITE            0x0002
-#define SECTION_MAP_READ             0x0004
-#define SECTION_MAP_EXECUTE          0x0008
-#define SECTION_EXTEND_SIZE          0x0010
-#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
-
-#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
-                            SECTION_MAP_WRITE |      \
-                            SECTION_MAP_READ |       \
-                            SECTION_MAP_EXECUTE |    \
-                            SECTION_EXTEND_SIZE)
-
-#define SESSION_QUERY_ACCESS  0x0001
-#define SESSION_MODIFY_ACCESS 0x0002
-
-#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |  \
-                            SESSION_QUERY_ACCESS |             \
-                            SESSION_MODIFY_ACCESS)
-
-
-
-#define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
-
-#define PAGE_NOACCESS          0x01
-#define PAGE_READONLY          0x02
-#define PAGE_READWRITE         0x04
-#define PAGE_WRITECOPY         0x08
-#define PAGE_EXECUTE           0x10
-#define PAGE_EXECUTE_READ      0x20
-#define PAGE_EXECUTE_READWRITE 0x40
-#define PAGE_EXECUTE_WRITECOPY 0x80
-#define PAGE_GUARD            0x100
-#define PAGE_NOCACHE          0x200
-#define PAGE_WRITECOMBINE     0x400
-
-#define MEM_COMMIT           0x1000
-#define MEM_RESERVE          0x2000
-#define MEM_DECOMMIT         0x4000
-#define MEM_RELEASE          0x8000
-#define MEM_FREE            0x10000
-#define MEM_PRIVATE         0x20000
-#define MEM_MAPPED          0x40000
-#define MEM_RESET           0x80000
-#define MEM_TOP_DOWN       0x100000
-#define MEM_LARGE_PAGES  0x20000000
-#define MEM_4MB_PAGES    0x80000000
-
-#define SEC_RESERVE       0x4000000     
-#define SEC_LARGE_PAGES  0x80000000
-
-#define PROCESS_DUP_HANDLE                 (0x0040)
-
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-#define PROCESS_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
-                                   0xFFFF)
-#else
-#define PROCESS_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
-                                   0xFFF)
-#endif
-
-
-
-//
-// Processor features
-//
-#define PF_FLOATING_POINT_PRECISION_ERRATA  0   
-#define PF_FLOATING_POINT_EMULATED          1   
-#define PF_COMPARE_EXCHANGE_DOUBLE          2   
-#define PF_MMX_INSTRUCTIONS_AVAILABLE       3   
-#define PF_PPC_MOVEMEM_64BIT_OK             4   
-#define PF_ALPHA_BYTE_INSTRUCTIONS          5   
-#define PF_XMMI_INSTRUCTIONS_AVAILABLE      6   
-#define PF_3DNOW_INSTRUCTIONS_AVAILABLE     7   
-#define PF_RDTSC_INSTRUCTION_AVAILABLE      8   
-#define PF_PAE_ENABLED                      9   
-#define PF_XMMI64_INSTRUCTIONS_AVAILABLE   10   
-#define PF_SSE_DAZ_MODE_AVAILABLE          11   
-#define PF_NX_ENABLED                      12   
-#define PF_SSE3_INSTRUCTIONS_AVAILABLE     13   
-#define PF_COMPARE_EXCHANGE128             14   
-#define PF_COMPARE64_EXCHANGE128           15   
-#define PF_CHANNELS_ENABLED                16   
-
-
-
-//
-// Intrinsics (note: taken from our winnt.h)
-// FIXME: 64-bit
-//
-#if defined(__GNUC__)
-
-static __inline__ BOOLEAN
-InterlockedBitTestAndSet(IN LONG volatile *Base,
-                         IN LONG Bit)
-{
-#if defined(_M_IX86)
-       LONG OldBit;
-       __asm__ __volatile__("lock "
-                            "btsl %2,%1\n\t"
-                            "sbbl %0,%0\n\t"
-                            :"=r" (OldBit),"+m" (*Base)
-                            :"Ir" (Bit)
-                            : "memory");
-       return OldBit;
-#else
-       return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
-#endif
-}
-
-static __inline__ BOOLEAN
-InterlockedBitTestAndReset(IN LONG volatile *Base,
-                           IN LONG Bit)
-{
-#if defined(_M_IX86)
-       LONG OldBit;
-       __asm__ __volatile__("lock "
-                            "btrl %2,%1\n\t"
-                            "sbbl %0,%0\n\t"
-                            :"=r" (OldBit),"+m" (*Base)
-                            :"Ir" (Bit)
-                            : "memory");
-       return OldBit;
-#else
-       return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
-#endif
-}
-
-#endif
-
-#define BitScanForward _BitScanForward
-#define BitScanReverse _BitScanReverse
-
-#define BitTest _bittest
-#define BitTestAndComplement _bittestandcomplement
-#define BitTestAndSet _bittestandset
-#define BitTestAndReset _bittestandreset
-#define InterlockedBitTestAndSet _interlockedbittestandset
-#define InterlockedBitTestAndReset _interlockedbittestandreset
-
-
-/** INTERLOCKED FUNCTIONS *****************************************************/
-
-#if !defined(__INTERLOCKED_DECLARED)
-#define __INTERLOCKED_DECLARED
-
-#if defined (_X86_)
-#if defined(NO_INTERLOCKED_INTRINSICS)
-NTKERNELAPI
-LONG
-FASTCALL
-InterlockedIncrement(
-  IN OUT LONG volatile *Addend);
-
-NTKERNELAPI
-LONG
-FASTCALL
-InterlockedDecrement(
-  IN OUT LONG volatile *Addend);
-
-NTKERNELAPI
-LONG
-FASTCALL
-InterlockedCompareExchange(
-  IN OUT LONG volatile *Destination,
-  IN LONG  Exchange,
-  IN LONG  Comparand);
+NTKERNELAPI
+LONG
+FASTCALL
+InterlockedCompareExchange(
+  IN OUT LONG volatile *Destination,
+  IN LONG  Exchange,
+  IN LONG  Comparand);
 
 NTKERNELAPI
 LONG
@@ -553,52 +328,102 @@ InterlockedAdd64(
 
 #endif /* !__INTERLOCKED_DECLARED */
 
-#if defined(_M_IX86)
-#define YieldProcessor _mm_pause
-#elif defined (_M_AMD64)
-#define YieldProcessor _mm_pause
-#elif defined(_M_PPC)
-#define YieldProcessor() __asm__ __volatile__("nop");
-#elif defined(_M_MIPS)
-#define YieldProcessor() __asm__ __volatile__("nop");
-#elif defined(_M_ARM)
-#define YieldProcessor()
-#else
-#error Unknown architecture
-#endif
 
+/******************************************************************************
+ *                           Runtime Library Types                            *
+ ******************************************************************************/
 
+#define RTL_REGISTRY_ABSOLUTE             0
+#define RTL_REGISTRY_SERVICES             1
+#define RTL_REGISTRY_CONTROL              2
+#define RTL_REGISTRY_WINDOWS_NT           3
+#define RTL_REGISTRY_DEVICEMAP            4
+#define RTL_REGISTRY_USER                 5
+#define RTL_REGISTRY_MAXIMUM              6
+#define RTL_REGISTRY_HANDLE               0x40000000
+#define RTL_REGISTRY_OPTIONAL             0x80000000
 
-//
-// Slist Header
-//
-#ifndef _SLIST_HEADER_
-#define _SLIST_HEADER_
+/* RTL_QUERY_REGISTRY_TABLE.Flags */
+#define RTL_QUERY_REGISTRY_SUBKEY         0x00000001
+#define RTL_QUERY_REGISTRY_TOPKEY         0x00000002
+#define RTL_QUERY_REGISTRY_REQUIRED       0x00000004
+#define RTL_QUERY_REGISTRY_NOVALUE        0x00000008
+#define RTL_QUERY_REGISTRY_NOEXPAND       0x00000010
+#define RTL_QUERY_REGISTRY_DIRECT         0x00000020
+#define RTL_QUERY_REGISTRY_DELETE         0x00000040
 
-#if defined(_WIN64)
-typedef struct _SLIST_ENTRY *PSLIST_ENTRY;
-typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
-       PSLIST_ENTRY Next;
-} SLIST_ENTRY;
-typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
-    struct {
-        ULONGLONG Alignment;
-        ULONGLONG Region;
-    } DUMMYSTRUCTNAME;
-    struct {
-        ULONGLONG Depth:16;
-        ULONGLONG Sequence:9;
-        ULONGLONG NextEntry:39;
-        ULONGLONG HeaderType:1;
-        ULONGLONG Init:1;
-        ULONGLONG Reserved:59;
-        ULONGLONG Region:3;
-    } Header8;
-    struct {
-        ULONGLONG Depth:16;
-        ULONGLONG Sequence:48;
-        ULONGLONG HeaderType:1;
-        ULONGLONG Init:1;
+#define HASH_STRING_ALGORITHM_DEFAULT     0
+#define HASH_STRING_ALGORITHM_X65599      1
+#define HASH_STRING_ALGORITHM_INVALID     0xffffffff
+
+typedef struct _RTL_BITMAP {
+    ULONG SizeOfBitMap;
+    PULONG Buffer;
+} RTL_BITMAP, *PRTL_BITMAP;
+
+typedef struct _RTL_BITMAP_RUN {
+    ULONG StartingIndex;
+    ULONG NumberOfBits;
+} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
+
+typedef NTSTATUS
+(DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
+    IN PWSTR ValueName,
+    IN ULONG ValueType,
+    IN PVOID ValueData,
+    IN ULONG ValueLength,
+    IN PVOID Context,
+    IN PVOID EntryContext);
+
+typedef struct _RTL_QUERY_REGISTRY_TABLE {
+    PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
+    ULONG Flags;
+    PCWSTR Name;
+    PVOID EntryContext;
+    ULONG DefaultType;
+    PVOID DefaultData;
+    ULONG DefaultLength;
+} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
+
+typedef struct _TIME_FIELDS {
+    CSHORT Year;
+    CSHORT Month;
+    CSHORT Day;
+    CSHORT Hour;
+    CSHORT Minute;
+    CSHORT Second;
+    CSHORT Milliseconds;
+    CSHORT Weekday;
+} TIME_FIELDS, *PTIME_FIELDS;
+
+/* Slist Header */
+#ifndef _SLIST_HEADER_
+#define _SLIST_HEADER_
+
+#if defined(_WIN64)
+typedef struct _SLIST_ENTRY *PSLIST_ENTRY;
+typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
+       PSLIST_ENTRY Next;
+} SLIST_ENTRY;
+typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
+    struct {
+        ULONGLONG Alignment;
+        ULONGLONG Region;
+    } DUMMYSTRUCTNAME;
+    struct {
+        ULONGLONG Depth:16;
+        ULONGLONG Sequence:9;
+        ULONGLONG NextEntry:39;
+        ULONGLONG HeaderType:1;
+        ULONGLONG Init:1;
+        ULONGLONG Reserved:59;
+        ULONGLONG Region:3;
+    } Header8;
+    struct {
+        ULONGLONG Depth:16;
+        ULONGLONG Sequence:48;
+        ULONGLONG HeaderType:1;
+        ULONGLONG Init:1;
         ULONGLONG Reserved:2;
         ULONGLONG NextEntry:60;
     } Header16;
@@ -620,369 +445,137 @@ typedef union _SLIST_HEADER {
 #endif /* _SLIST_HEADER_ */
 
 
+/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
+#if defined(_NTSYSTEM_) || defined(__GNUC__)
+#define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
+#define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
+#else
+#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
+#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
+#endif /* _NT_SYSTEM */
+extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
+extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
 
-//
-// Power States/Levels
-//
-typedef enum _SYSTEM_POWER_STATE {
-    PowerSystemUnspecified,
-    PowerSystemWorking,
-    PowerSystemSleeping1,
-    PowerSystemSleeping2,
-    PowerSystemSleeping3,
-    PowerSystemHibernate,
-    PowerSystemShutdown,
-    PowerSystemMaximum
-} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
-
-#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
-
-typedef enum _POWER_INFORMATION_LEVEL {
-    SystemPowerPolicyAc,
-    SystemPowerPolicyDc,
-    VerifySystemPolicyAc,
-    VerifySystemPolicyDc,
-    SystemPowerCapabilities,
-    SystemBatteryState,
-    SystemPowerStateHandler,
-    ProcessorStateHandler,
-    SystemPowerPolicyCurrent,
-    AdministratorPowerPolicy,
-    SystemReserveHiberFile,
-    ProcessorInformation,
-    SystemPowerInformation,
-    ProcessorStateHandler2,
-    LastWakeTime,
-    LastSleepTime,
-    SystemExecutionState,
-    SystemPowerStateNotifyHandler,
-    ProcessorPowerPolicyAc,
-    ProcessorPowerPolicyDc,
-    VerifyProcessorPowerPolicyAc,
-    VerifyProcessorPowerPolicyDc,
-    ProcessorPowerPolicyCurrent
-} POWER_INFORMATION_LEVEL;
-
-typedef enum {
-    PowerActionNone,
-    PowerActionReserved,
-    PowerActionSleep,
-    PowerActionHibernate,
-    PowerActionShutdown,
-    PowerActionShutdownReset,
-    PowerActionShutdownOff,
-    PowerActionWarmEject
-} POWER_ACTION, *PPOWER_ACTION;
 
-typedef enum _DEVICE_POWER_STATE {
-    PowerDeviceUnspecified,
-    PowerDeviceD0,
-    PowerDeviceD1,
-    PowerDeviceD2,
-    PowerDeviceD3,
-    PowerDeviceMaximum
-} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
+/******************************************************************************
+ *                              Kernel Types                                  *
+ ******************************************************************************/
 
-#define ES_SYSTEM_REQUIRED                0x00000001
-#define ES_DISPLAY_REQUIRED               0x00000002
-#define ES_USER_PRESENT                   0x00000004
-#define ES_CONTINUOUS                     0x80000000
+typedef UCHAR KIRQL, *PKIRQL;
+typedef CCHAR KPROCESSOR_MODE;
+typedef LONG KPRIORITY;
 
 typedef ULONG EXECUTION_STATE;
 
-typedef enum {
-    LT_DONT_CARE,
-    LT_LOWEST_LATENCY
-} LATENCY_TIME;
+typedef enum _MODE {
+  KernelMode,
+  UserMode,
+  MaximumMode
+} MODE;
 
+/* Processor features */
+#define PF_FLOATING_POINT_PRECISION_ERRATA  0   
+#define PF_FLOATING_POINT_EMULATED          1   
+#define PF_COMPARE_EXCHANGE_DOUBLE          2   
+#define PF_MMX_INSTRUCTIONS_AVAILABLE       3   
+#define PF_PPC_MOVEMEM_64BIT_OK             4   
+#define PF_ALPHA_BYTE_INSTRUCTIONS          5   
+#define PF_XMMI_INSTRUCTIONS_AVAILABLE      6   
+#define PF_3DNOW_INSTRUCTIONS_AVAILABLE     7   
+#define PF_RDTSC_INSTRUCTION_AVAILABLE      8   
+#define PF_PAE_ENABLED                      9   
+#define PF_XMMI64_INSTRUCTIONS_AVAILABLE   10   
+#define PF_SSE_DAZ_MODE_AVAILABLE          11   
+#define PF_NX_ENABLED                      12   
+#define PF_SSE3_INSTRUCTIONS_AVAILABLE     13   
+#define PF_COMPARE_EXCHANGE128             14   
+#define PF_COMPARE64_EXCHANGE128           15   
+#define PF_CHANNELS_ENABLED                16   
+#define PF_XSAVE_ENABLED                   17   
 
+#define MAXIMUM_SUPPORTED_EXTENSION  512
+#define MAXIMUM_WAIT_OBJECTS              64
 
-//
-// Access/Security Stuff
-//
-typedef ULONG ACCESS_MASK, *PACCESS_MASK;
-typedef PVOID PACCESS_TOKEN;
+#define ASSERT_APC(Object) \
+    ASSERT((Object)->Type == ApcObject)
 
-#define DELETE                           0x00010000L
-#define READ_CONTROL                     0x00020000L
-#define WRITE_DAC                        0x00040000L
-#define WRITE_OWNER                      0x00080000L
-#define SYNCHRONIZE                      0x00100000L
-#define STANDARD_RIGHTS_REQUIRED         0x000F0000L
-#define STANDARD_RIGHTS_READ             READ_CONTROL
-#define STANDARD_RIGHTS_WRITE            READ_CONTROL
-#define STANDARD_RIGHTS_EXECUTE          READ_CONTROL
-#define STANDARD_RIGHTS_ALL              0x001F0000L
-#define SPECIFIC_RIGHTS_ALL              0x0000FFFFL
-#define ACCESS_SYSTEM_SECURITY           0x01000000L
-#define MAXIMUM_ALLOWED                  0x02000000L
-#define GENERIC_READ                     0x80000000L
-#define GENERIC_WRITE                    0x40000000L
-#define GENERIC_EXECUTE                  0x20000000L
-#define GENERIC_ALL                      0x10000000L
+#define ASSERT_DPC(Object) \
+    ASSERT(((Object)->Type == 0) || \
+           ((Object)->Type == DpcObject) || \
+           ((Object)->Type == ThreadedDpcObject))
 
-typedef struct _GENERIC_MAPPING {
-    ACCESS_MASK GenericRead;
-    ACCESS_MASK GenericWrite;
-    ACCESS_MASK GenericExecute;
-    ACCESS_MASK GenericAll;
-} GENERIC_MAPPING, *PGENERIC_MAPPING;
+#define ASSERT_GATE(object) \
+    ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
+           (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
 
-#define ACL_REVISION                      2
-#define ACL_REVISION_DS                   4
+#define ASSERT_DEVICE_QUEUE(Object) \
+    ASSERT((Object)->Type == DeviceQueueObject)
 
-#define ACL_REVISION1                     1
-#define ACL_REVISION2                     2
-#define ACL_REVISION3                     3
-#define ACL_REVISION4                     4
-#define MIN_ACL_REVISION                  ACL_REVISION2
-#define MAX_ACL_REVISION                  ACL_REVISION4
+#define ASSERT_TIMER(E) \
+    ASSERT(((E)->Header.Type == TimerNotificationObject) || \
+           ((E)->Header.Type == TimerSynchronizationObject))
 
-typedef struct _ACL {
-    UCHAR AclRevision;
-    UCHAR Sbz1;
-    USHORT AclSize;
-    USHORT AceCount;
-    USHORT Sbz2;
-} ACL, *PACL;
+#define ASSERT_MUTANT(E) \
+    ASSERT((E)->Header.Type == MutantObject)
 
+#define ASSERT_SEMAPHORE(E) \
+    ASSERT((E)->Header.Type == SemaphoreObject)
 
+#define ASSERT_EVENT(E) \
+    ASSERT(((E)->Header.Type == NotificationEvent) || \
+           ((E)->Header.Type == SynchronizationEvent))
 
-//
-// Current security descriptor revision value
-//
-#define SECURITY_DESCRIPTOR_REVISION     (1)
-#define SECURITY_DESCRIPTOR_REVISION1    (1)
+#define DPC_NORMAL 0
+#define DPC_THREADED 1
 
-//
-// Privilege attributes
-//
-#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
-#define SE_PRIVILEGE_ENABLED            (0x00000002L)
-#define SE_PRIVILEGE_REMOVED            (0X00000004L)
-#define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)
+#define GM_LOCK_BIT          0x1
+#define GM_LOCK_BIT_V        0x0
+#define GM_LOCK_WAITER_WOKEN 0x2
+#define GM_LOCK_WAITER_INC   0x4
 
-#define SE_PRIVILEGE_VALID_ATTRIBUTES   (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
-                                         SE_PRIVILEGE_ENABLED            | \
-                                         SE_PRIVILEGE_REMOVED            | \
-                                         SE_PRIVILEGE_USED_FOR_ACCESS)
+#define LOCK_QUEUE_WAIT                   1
+#define LOCK_QUEUE_OWNER                  2
+#define LOCK_QUEUE_TIMER_LOCK_SHIFT       4
+#define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
 
-#include <pshpack4.h>
-typedef struct _LUID_AND_ATTRIBUTES {
-    LUID Luid;
-    ULONG Attributes;
-} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
-#include <poppack.h>
-typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
-typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
+#define PROCESSOR_FEATURE_MAX 64
 
+#define DBG_STATUS_CONTROL_C              1
+#define DBG_STATUS_SYSRQ                  2
+#define DBG_STATUS_BUGCHECK_FIRST         3
+#define DBG_STATUS_BUGCHECK_SECOND        4
+#define DBG_STATUS_FATAL                  5
+#define DBG_STATUS_DEBUG_CONTROL          6
+#define DBG_STATUS_WORKER                 7
 
+#if defined(_WIN64)
+#define MAXIMUM_PROC_PER_GROUP 64
+#else
+#define MAXIMUM_PROC_PER_GROUP 32
+#endif
+#define MAXIMUM_PROCESSORS          MAXIMUM_PROC_PER_GROUP
 
-//
-// Privilege sets
-//
-#define PRIVILEGE_SET_ALL_NECESSARY (1)
+/* Exception Records */
+#define EXCEPTION_NONCONTINUABLE 1
+#define EXCEPTION_MAXIMUM_PARAMETERS 15
 
-typedef struct _PRIVILEGE_SET {
-    ULONG PrivilegeCount;
-    ULONG Control;
-    LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
-} PRIVILEGE_SET,*PPRIVILEGE_SET;
+typedef struct _EXCEPTION_RECORD {
+    NTSTATUS ExceptionCode;
+    ULONG ExceptionFlags;
+    struct _EXCEPTION_RECORD *ExceptionRecord;
+    PVOID ExceptionAddress;
+    ULONG NumberParameters;
+    ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD, *PEXCEPTION_RECORD;
 
-typedef enum _SECURITY_IMPERSONATION_LEVEL {
-    SecurityAnonymous,
-    SecurityIdentification,
-    SecurityImpersonation,
-    SecurityDelegation
-} SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
-
-#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
-#define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
-#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
-#define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
-
-#define SECURITY_DYNAMIC_TRACKING (TRUE)
-#define SECURITY_STATIC_TRACKING (FALSE)
-
-typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
-
-typedef struct _SECURITY_QUALITY_OF_SERVICE {
-    ULONG Length;
-    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
-    SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
-    BOOLEAN EffectiveOnly;
-} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
-
-typedef struct _SE_IMPERSONATION_STATE {
-    PACCESS_TOKEN Token;
-    BOOLEAN CopyOnOpen;
-    BOOLEAN EffectiveOnly;
-    SECURITY_IMPERSONATION_LEVEL Level;
-} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
-
-#define OWNER_SECURITY_INFORMATION       (0x00000001L)
-#define GROUP_SECURITY_INFORMATION       (0x00000002L)
-#define DACL_SECURITY_INFORMATION        (0x00000004L)
-#define SACL_SECURITY_INFORMATION        (0x00000008L)
-#define LABEL_SECURITY_INFORMATION       (0x00000010L)
-
-#define PROTECTED_DACL_SECURITY_INFORMATION     (0x80000000L)
-#define PROTECTED_SACL_SECURITY_INFORMATION     (0x40000000L)
-#define UNPROTECTED_DACL_SECURITY_INFORMATION   (0x20000000L)
-#define UNPROTECTED_SACL_SECURITY_INFORMATION   (0x10000000L)
-
-
-
-//
-// Registry Access Rights
-//
-#define KEY_QUERY_VALUE         (0x0001)
-#define KEY_SET_VALUE           (0x0002)
-#define KEY_CREATE_SUB_KEY      (0x0004)
-#define KEY_ENUMERATE_SUB_KEYS  (0x0008)
-#define KEY_NOTIFY              (0x0010)
-#define KEY_CREATE_LINK         (0x0020)
-#define KEY_WOW64_32KEY         (0x0200)
-#define KEY_WOW64_64KEY         (0x0100)
-#define KEY_WOW64_RES           (0x0300)
-
-#define KEY_READ                ((STANDARD_RIGHTS_READ       |\
-                                  KEY_QUERY_VALUE            |\
-                                  KEY_ENUMERATE_SUB_KEYS     |\
-                                  KEY_NOTIFY)                 \
-                                  &                           \
-                                 (~SYNCHRONIZE))
-
-#define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\
-                                  KEY_SET_VALUE              |\
-                                  KEY_CREATE_SUB_KEY)         \
-                                  &                           \
-                                 (~SYNCHRONIZE))
-
-#define KEY_EXECUTE             ((KEY_READ)                   \
-                                  &                           \
-                                 (~SYNCHRONIZE))
-
-#define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\
-                                  KEY_QUERY_VALUE            |\
-                                  KEY_SET_VALUE              |\
-                                  KEY_CREATE_SUB_KEY         |\
-                                  KEY_ENUMERATE_SUB_KEYS     |\
-                                  KEY_NOTIFY                 |\
-                                  KEY_CREATE_LINK)            \
-                                  &                           \
-                                 (~SYNCHRONIZE))
-
-//
-// Registry Open/Create Options
-//
-#define REG_OPTION_RESERVED         (0x00000000L)
-#define REG_OPTION_NON_VOLATILE     (0x00000000L)
-#define REG_OPTION_VOLATILE         (0x00000001L)
-#define REG_OPTION_CREATE_LINK      (0x00000002L)
-#define REG_OPTION_BACKUP_RESTORE   (0x00000004L)
-#define REG_OPTION_OPEN_LINK        (0x00000008L)
-
-#define REG_LEGAL_OPTION            \
-                (REG_OPTION_RESERVED            |\
-                 REG_OPTION_NON_VOLATILE        |\
-                 REG_OPTION_VOLATILE            |\
-                 REG_OPTION_CREATE_LINK         |\
-                 REG_OPTION_BACKUP_RESTORE      |\
-                 REG_OPTION_OPEN_LINK)
-
-//
-// Key creation/open disposition
-//
-#define REG_CREATED_NEW_KEY         (0x00000001L)
-#define REG_OPENED_EXISTING_KEY     (0x00000002L)
-
-//
-// Key restore & hive load flags
-//
-#define REG_WHOLE_HIVE_VOLATILE         (0x00000001L)
-#define REG_REFRESH_HIVE                (0x00000002L)
-#define REG_NO_LAZY_FLUSH               (0x00000004L)
-#define REG_FORCE_RESTORE               (0x00000008L)
-#define REG_APP_HIVE                    (0x00000010L)
-#define REG_PROCESS_PRIVATE             (0x00000020L)
-#define REG_START_JOURNAL               (0x00000040L)
-#define REG_HIVE_EXACT_FILE_GROWTH      (0x00000080L)
-#define REG_HIVE_NO_RM                  (0x00000100L)
-#define REG_HIVE_SINGLE_LOG             (0x00000200L)
-
-//
-// Unload Flags
-//
-#define REG_FORCE_UNLOAD            1
-
-//
-// Notify Filter Values
-//
-#define REG_NOTIFY_CHANGE_NAME          (0x00000001L)
-#define REG_NOTIFY_CHANGE_ATTRIBUTES    (0x00000002L)
-#define REG_NOTIFY_CHANGE_LAST_SET      (0x00000004L)
-#define REG_NOTIFY_CHANGE_SECURITY      (0x00000008L)
-
-#define REG_LEGAL_CHANGE_FILTER                 \
-                (REG_NOTIFY_CHANGE_NAME          |\
-                 REG_NOTIFY_CHANGE_ATTRIBUTES    |\
-                 REG_NOTIFY_CHANGE_LAST_SET      |\
-                 REG_NOTIFY_CHANGE_SECURITY)
-
-
-
-//
-// Thread Access Rights
-//
-#define THREAD_TERMINATE                 (0x0001)  
-#define THREAD_SUSPEND_RESUME            (0x0002)  
-#define THREAD_ALERT                     (0x0004)
-#define THREAD_GET_CONTEXT               (0x0008)  
-#define THREAD_SET_CONTEXT               (0x0010)  
-#define THREAD_SET_INFORMATION           (0x0020)  
-#define THREAD_SET_LIMITED_INFORMATION   (0x0400)  
-#define THREAD_QUERY_LIMITED_INFORMATION (0x0800)  
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-#define THREAD_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
-                                   0xFFFF)
-#else
-#define THREAD_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
-                                   0x3FF)
-#endif
-
-//
-// Service Start Types
-//
-#define SERVICE_BOOT_START             0x00000000
-#define SERVICE_SYSTEM_START           0x00000001
-#define SERVICE_AUTO_START             0x00000002
-#define SERVICE_DEMAND_START           0x00000003
-#define SERVICE_DISABLED               0x00000004
-
-//
-// Exception Records
-//
-#define EXCEPTION_NONCONTINUABLE 1
-#define EXCEPTION_MAXIMUM_PARAMETERS 15
-
-typedef struct _EXCEPTION_RECORD {
-    NTSTATUS ExceptionCode;
-    ULONG ExceptionFlags;
-    struct _EXCEPTION_RECORD *ExceptionRecord;
-    PVOID ExceptionAddress;
-    ULONG NumberParameters;
-    ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
-} EXCEPTION_RECORD, *PEXCEPTION_RECORD;
-
-typedef struct _EXCEPTION_RECORD32 {
-    NTSTATUS ExceptionCode;
-    ULONG ExceptionFlags;
-    ULONG ExceptionRecord;
-    ULONG ExceptionAddress;
-    ULONG NumberParameters;
-    ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
-} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
+typedef struct _EXCEPTION_RECORD32 {
+    NTSTATUS ExceptionCode;
+    ULONG ExceptionFlags;
+    ULONG ExceptionRecord;
+    ULONG ExceptionAddress;
+    ULONG NumberParameters;
+    ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
 
 typedef struct _EXCEPTION_RECORD64 {
     NTSTATUS ExceptionCode;
@@ -1000,106 +593,449 @@ typedef struct _EXCEPTION_POINTERS {
 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
 
 
+typedef enum _KBUGCHECK_CALLBACK_REASON {
+  KbCallbackInvalid,
+  KbCallbackReserved1,
+  KbCallbackSecondaryDumpData,
+  KbCallbackDumpIo,
+  KbCallbackAddPages
+} KBUGCHECK_CALLBACK_REASON;
 
-//
-// Process Qoutas
-//
-typedef struct _QUOTA_LIMITS {
-    SIZE_T PagedPoolLimit;
-    SIZE_T NonPagedPoolLimit;
-    SIZE_T MinimumWorkingSetSize;
-    SIZE_T MaximumWorkingSetSize;
-    SIZE_T PagefileLimit;
-    LARGE_INTEGER TimeLimit;
-} QUOTA_LIMITS, *PQUOTA_LIMITS;
+struct _KBUGCHECK_REASON_CALLBACK_RECORD;
 
-#define QUOTA_LIMITS_HARDWS_MIN_ENABLE  0x00000001
-#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
-#define QUOTA_LIMITS_HARDWS_MAX_ENABLE  0x00000004
-#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
-#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
+typedef VOID
+(DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)(
+  IN KBUGCHECK_CALLBACK_REASON  Reason,
+  IN struct _KBUGCHECK_REASON_CALLBACK_RECORD  *Record,
+  IN OUT PVOID  ReasonSpecificData,
+  IN ULONG  ReasonSpecificDataLength);
+
+typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
+  LIST_ENTRY  Entry;
+  PKBUGCHECK_REASON_CALLBACK_ROUTINE  CallbackRoutine;
+  PUCHAR  Component;
+  ULONG_PTR  Checksum;
+  KBUGCHECK_CALLBACK_REASON  Reason;
+  UCHAR  State;
+} KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
+
+typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
+  BufferEmpty,
+  BufferInserted,
+  BufferStarted,
+  BufferFinished,
+  BufferIncomplete
+} KBUGCHECK_BUFFER_DUMP_STATE;
 
+typedef VOID
+(DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)(
+  IN PVOID  Buffer,
+  IN ULONG  Length);
+
+typedef struct _KBUGCHECK_CALLBACK_RECORD {
+  LIST_ENTRY  Entry;
+  PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine;
+  PVOID  Buffer;
+  ULONG  Length;
+  PUCHAR  Component;
+  ULONG_PTR  Checksum;
+  UCHAR  State;
+} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
+
+typedef BOOLEAN
+(DDKAPI *PNMI_CALLBACK)(
+    IN PVOID Context,
+    IN BOOLEAN Handled);
+
+typedef enum _TRACE_INFORMATION_CLASS {
+  TraceIdClass,
+  TraceHandleClass,
+  TraceEnableFlagsClass,
+  TraceEnableLevelClass,
+  GlobalLoggerHandleClass,
+  EventLoggerHandleClass,
+  AllLoggerHandlesClass,
+  TraceHandleByNameClass,
+  LoggerEventsLostClass,
+  TraceSessionSettingsClass,
+  LoggerEventsLoggedClass,
+  MaxTraceInformationClass
+} TRACE_INFORMATION_CLASS;
+
+typedef enum _KINTERRUPT_POLARITY {
+  InterruptPolarityUnknown,
+  InterruptActiveHigh,
+  InterruptActiveLow
+} KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
+
+typedef enum _KPROFILE_SOURCE {
+  ProfileTime,
+  ProfileAlignmentFixup,
+  ProfileTotalIssues,
+  ProfilePipelineDry,
+  ProfileLoadInstructions,
+  ProfilePipelineFrozen,
+  ProfileBranchInstructions,
+  ProfileTotalNonissues,
+  ProfileDcacheMisses,
+  ProfileIcacheMisses,
+  ProfileCacheMisses,
+  ProfileBranchMispredictions,
+  ProfileStoreInstructions,
+  ProfileFpInstructions,
+  ProfileIntegerInstructions,
+  Profile2Issue,
+  Profile3Issue,
+  Profile4Issue,
+  ProfileSpecialInstructions,
+  ProfileTotalCycles,
+  ProfileIcacheIssues,
+  ProfileDcacheAccesses,
+  ProfileMemoryBarrierCycles,
+  ProfileLoadLinkedIssues,
+  ProfileMaximum
+} KPROFILE_SOURCE;
+
+typedef enum _KWAIT_REASON {
+  Executive,
+  FreePage,
+  PageIn,
+  PoolAllocation,
+  DelayExecution,
+  Suspended,
+  UserRequest,
+  WrExecutive,
+  WrFreePage,
+  WrPageIn,
+  WrPoolAllocation,
+  WrDelayExecution,
+  WrSuspended,
+  WrUserRequest,
+  WrEventPair,
+  WrQueue,
+  WrLpcReceive,
+  WrLpcReply,
+  WrVirtualMemory,
+  WrPageOut,
+  WrRendezvous,
+  WrKeyedEvent,
+  WrTerminated,
+  WrProcessInSwap,
+  WrCpuRateControl,
+  WrCalloutStack,
+  WrKernel,
+  WrResource,
+  WrPushLock,
+  WrMutex,
+  WrQuantumEnd,
+  WrDispatchInt,
+  WrPreempted,
+  WrYieldExecution,
+  WrFastMutex,
+  WrGuardedMutex,
+  WrRundown,
+  MaximumWaitReason
+} KWAIT_REASON;
+
+typedef struct _KWAIT_BLOCK {
+  LIST_ENTRY WaitListEntry;
+  struct _KTHREAD *Thread;
+  PVOID Object;
+  struct _KWAIT_BLOCK *NextWaitBlock;
+  USHORT WaitKey;
+  UCHAR WaitType;
+  volatile UCHAR BlockState;
+#if defined(_WIN64)
+  LONG SpareLong;
+#endif
+} KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
 
-/******************************************************************************
- *                             WINBASE Functions                              *
- ******************************************************************************/
-#if !defined(_WINBASE_)
+typedef enum _KINTERRUPT_MODE {
+  LevelSensitive,
+  Latched
+} KINTERRUPT_MODE;
 
-#if defined(_WIN64)
+#define THREAD_WAIT_OBJECTS 3
 
-#define InterlockedPopEntrySList(Head) \
-    ExpInterlockedPopEntrySList(Head)
+typedef VOID
+(DDKAPI *PKINTERRUPT_ROUTINE)(
+  VOID);
 
-#define InterlockedPushEntrySList(Head, Entry) \
-    ExpInterlockedPushEntrySList(Head, Entry)
+typedef enum _KD_OPTION {
+    KD_OPTION_SET_BLOCK_ENABLE,
+} KD_OPTION;
 
-#define InterlockedFlushSList(Head) \
-    ExpInterlockedFlushSList(Head)
+typedef enum _INTERFACE_TYPE {
+  InterfaceTypeUndefined = -1,
+  Internal,
+  Isa,
+  Eisa,
+  MicroChannel,
+  TurboChannel,
+  PCIBus,
+  VMEBus,
+  NuBus,
+  PCMCIABus,
+  CBus,
+  MPIBus,
+  MPSABus,
+  ProcessorInternal,
+  InternalPowerBus,
+  PNPISABus,
+  PNPBus,
+  Vmcs,
+  MaximumInterfaceType
+} INTERFACE_TYPE, *PINTERFACE_TYPE;
 
-#define QueryDepthSList(Head) \
-    ExQueryDepthSList(Head)
+typedef VOID
+(DDKAPI *PKNORMAL_ROUTINE)(
+  IN PVOID  NormalContext,
+  IN PVOID  SystemArgument1,
+  IN PVOID  SystemArgument2);
 
-#else // !defined(_WIN64)
+typedef VOID
+(DDKAPI *PKRUNDOWN_ROUTINE)(
+  IN struct _KAPC  *Apc);
 
-NTKERNELAPI
-PSLIST_ENTRY
-FASTCALL
-InterlockedPopEntrySList(
-    IN PSLIST_HEADER ListHead);
+typedef VOID
+(DDKAPI *PKKERNEL_ROUTINE)(
+  IN struct _KAPC  *Apc,
+  IN OUT PKNORMAL_ROUTINE  *NormalRoutine,
+  IN OUT PVOID  *NormalContext,
+  IN OUT PVOID  *SystemArgument1,
+  IN OUT PVOID  *SystemArgument2);
+
+typedef struct _KAPC
+{
+  UCHAR Type;
+  UCHAR SpareByte0;
+  UCHAR Size;
+  UCHAR SpareByte1;
+  ULONG SpareLong0;
+  struct _KTHREAD *Thread;
+  LIST_ENTRY ApcListEntry;
+  PKKERNEL_ROUTINE KernelRoutine;
+  PKRUNDOWN_ROUTINE RundownRoutine;
+  PKNORMAL_ROUTINE NormalRoutine;
+  PVOID NormalContext;
+  PVOID SystemArgument1;
+  PVOID SystemArgument2;
+  CCHAR ApcStateIndex;
+  KPROCESSOR_MODE ApcMode;
+  BOOLEAN Inserted;
+} KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
+
+typedef struct _KDEVICE_QUEUE_ENTRY {
+  LIST_ENTRY  DeviceListEntry;
+  ULONG  SortKey;
+  BOOLEAN  Inserted;
+} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
+*RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
+
+typedef PVOID PKIPI_CONTEXT;
+
+typedef
+VOID
+(NTAPI *PKIPI_WORKER)(
+  IN PKIPI_CONTEXT PacketContext,
+  IN PVOID Parameter1,
+  IN PVOID Parameter2,
+  IN PVOID Parameter3);
 
-NTKERNELAPI
-PSLIST_ENTRY
-FASTCALL
-InterlockedPushEntrySList(
-    IN PSLIST_HEADER ListHead,
-    IN PSLIST_ENTRY ListEntry);
+typedef
+ULONG_PTR
+(NTAPI *PKIPI_BROADCAST_WORKER)(
+    IN ULONG_PTR Argument);
 
-#define InterlockedFlushSList(ListHead) \
-    ExInterlockedFlushSList(ListHead)
+typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
 
-#define QueryDepthSList(Head) \
-    ExQueryDepthSList(Head)
+typedef struct _KSPIN_LOCK_QUEUE {
+  struct _KSPIN_LOCK_QUEUE  *volatile Next;
+  PKSPIN_LOCK volatile  Lock;
+} KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
 
-#endif // !defined(_WIN64)
+typedef struct _KLOCK_QUEUE_HANDLE {
+  KSPIN_LOCK_QUEUE  LockQueue;
+  KIRQL  OldIrql;
+} KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
 
-#endif // !defined(_WINBASE_)
+#if defined(_AMD64_)
 
+typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
+
+#define LockQueueDispatcherLock 0
+#define LockQueueExpansionLock 1
+#define LockQueuePfnLock 2
+#define LockQueueSystemSpaceLock 3
+#define LockQueueVacbLock 4
+#define LockQueueMasterLock 5
+#define LockQueueNonPagedPoolLock 6
+#define LockQueueIoCancelLock 7
+#define LockQueueWorkQueueLock 8
+#define LockQueueIoVpbLock 9
+#define LockQueueIoDatabaseLock 10
+#define LockQueueIoCompletionLock 11
+#define LockQueueNtfsStructLock 12
+#define LockQueueAfdWorkQueueLock 13
+#define LockQueueBcbLock 14
+#define LockQueueMmNonPagedPoolLock 15
+#define LockQueueUnusedSpare16 16
+#define LockQueueTimerTableLock 17
+#define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
 
-/******************************************************************************
- *                              Kernel Types                                  *
- ******************************************************************************/
+#else
 
-typedef struct _DISPATCHER_HEADER
+typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
+  LockQueueDispatcherLock,
+  LockQueueExpansionLock,
+  LockQueuePfnLock,
+  LockQueueSystemSpaceLock,
+  LockQueueVacbLock,
+  LockQueueMasterLock,
+  LockQueueNonPagedPoolLock,
+  LockQueueIoCancelLock,
+  LockQueueWorkQueueLock,
+  LockQueueIoVpbLock,
+  LockQueueIoDatabaseLock,
+  LockQueueIoCompletionLock,
+  LockQueueNtfsStructLock,
+  LockQueueAfdWorkQueueLock,
+  LockQueueBcbLock,
+  LockQueueMmNonPagedPoolLock,
+  LockQueueUnusedSpare16,
+  LockQueueTimerTableLock,
+  LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
+} KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
+
+#endif
+
+typedef VOID
+(DDKAPI *PKDEFERRED_ROUTINE)(
+  IN struct _KDPC  *Dpc,
+  IN PVOID  DeferredContext,
+  IN PVOID  SystemArgument1,
+  IN PVOID  SystemArgument2);
+
+typedef enum _KDPC_IMPORTANCE {
+  LowImportance,
+  MediumImportance,
+  HighImportance,
+  MediumHighImportance
+} KDPC_IMPORTANCE;
+
+typedef struct _KDPC
 {
-    union
-    {
-        struct
-        {
-            UCHAR Type;
-            union
-            {
-                UCHAR Absolute;
-                UCHAR NpxIrql;
-            };
-            union
-            {
+    UCHAR Type;
+    UCHAR Importance;
+    volatile USHORT Number;
+    LIST_ENTRY DpcListEntry;
+    PKDEFERRED_ROUTINE DeferredRoutine;
+    PVOID DeferredContext;
+    PVOID SystemArgument1;
+    PVOID SystemArgument2;
+    volatile PVOID  DpcData;
+} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
+
+typedef struct _KDPC_WATCHDOG_INFORMATION {
+  ULONG DpcTimeLimit;
+  ULONG DpcTimeCount;
+  ULONG DpcWatchdogLimit;
+  ULONG DpcWatchdogCount;
+  ULONG Reserved;
+} KDPC_WATCHDOG_INFORMATION, *PKDPC_WATCHDOG_INFORMATION;
+
+typedef struct _KDEVICE_QUEUE {
+  CSHORT Type;
+  CSHORT Size;
+  LIST_ENTRY DeviceListHead;
+  KSPIN_LOCK Lock;
+  #if defined(_AMD64_)
+  union {
+    BOOLEAN Busy;
+    struct {
+      LONG64 Reserved : 8;
+      LONG64 Hint : 56;
+    };
+  };
+  #else
+  BOOLEAN Busy;
+  #endif
+
+} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
+
+#define TIMER_EXPIRED_INDEX_BITS        6
+#define TIMER_PROCESSOR_INDEX_BITS      5
+typedef struct _DISPATCHER_HEADER {
+    _ANONYMOUS_UNION union {
+        _ANONYMOUS_STRUCT struct {
+            UCHAR Type;
+            _ANONYMOUS_UNION union {
+                _ANONYMOUS_UNION union {
+                    UCHAR TimerControlFlags;
+                    _ANONYMOUS_STRUCT struct {
+                        UCHAR Absolute:1;
+                        UCHAR Coalescable:1;
+                        UCHAR KeepShifting:1;
+                        UCHAR EncodedTolerableDelay:5;
+                    } DUMMYSTRUCTNAME;
+                } DUMMYUNIONNAME;
+                UCHAR Abandoned;
+#if (NTDDI_VERSION < NTDDI_WIN7)
+                UCHAR NpxIrql;
+#endif
+                BOOLEAN Signalling;
+            } DUMMYUNIONNAME;
+            _ANONYMOUS_UNION union {
+                _ANONYMOUS_UNION union {
+                    UCHAR ThreadControlFlags;
+                    _ANONYMOUS_STRUCT struct {
+                        UCHAR CpuThrottled:1;
+                        UCHAR CycleProfiling:1;
+                        UCHAR CounterProfiling:1;
+                        UCHAR Reserved:5;
+                    } DUMMYSTRUCTNAME;
+                } DUMMYUNIONNAME;
                 UCHAR Size;
                 UCHAR Hand;
-            };
-            union
-            {
+            } DUMMYUNIONNAME2;
+            _ANONYMOUS_UNION union {
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+                _ANONYMOUS_UNION union {
+                    UCHAR TimerMiscFlags;
+                    _ANONYMOUS_STRUCT struct {
+#if !defined(_X86_)
+                        UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
+#else
+                        UCHAR Index:1;
+                        UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
+#endif
+                        UCHAR Inserted:1;
+                        volatile UCHAR Expired:1;
+                    } DUMMYSTRUCTNAME;
+                } DUMMYUNIONNAME;
+#else
+                /* Pre Win7 compatibility fix to latest WDK */
                 UCHAR Inserted;
-                BOOLEAN DebugActive;
-            };
-        };
+#endif
+                _ANONYMOUS_UNION union {
+                    BOOLEAN DebugActive;
+                    _ANONYMOUS_STRUCT struct {
+                        BOOLEAN ActiveDR7:1;
+                        BOOLEAN Instrumented:1;
+                        BOOLEAN Reserved2:4;
+                        BOOLEAN UmsScheduled:1;
+                        BOOLEAN UmsPrimary:1;
+                    } DUMMYSTRUCTNAME;
+                } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
+                BOOLEAN DpcActive;
+            } DUMMYUNIONNAME3;
+        } DUMMYSTRUCTNAME;
         volatile LONG Lock;
-    };
+    } DUMMYUNIONNAME;
     LONG SignalState;
     LIST_ENTRY WaitListHead;
 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
 
-typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
-
 typedef struct _KEVENT {
   DISPATCHER_HEADER  Header;
 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
@@ -1109,2107 +1045,10731 @@ typedef struct _KSEMAPHORE {
     LONG Limit;
 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
 
-/******************************************************************************
- *                                 RTL Types                                  *
- ******************************************************************************/
-
-#define RTL_REGISTRY_ABSOLUTE             0
-#define RTL_REGISTRY_SERVICES             1
-#define RTL_REGISTRY_CONTROL              2
-#define RTL_REGISTRY_WINDOWS_NT           3
-#define RTL_REGISTRY_DEVICEMAP            4
-#define RTL_REGISTRY_USER                 5
-#define RTL_REGISTRY_MAXIMUM              6
-#define RTL_REGISTRY_HANDLE               0x40000000
-#define RTL_REGISTRY_OPTIONAL             0x80000000
+typedef struct _KGATE
+{
+    DISPATCHER_HEADER Header;
+} KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
 
-/* RTL_QUERY_REGISTRY_TABLE.Flags */
-#define RTL_QUERY_REGISTRY_SUBKEY         0x00000001
-#define RTL_QUERY_REGISTRY_TOPKEY         0x00000002
-#define RTL_QUERY_REGISTRY_REQUIRED       0x00000004
-#define RTL_QUERY_REGISTRY_NOVALUE        0x00000008
-#define RTL_QUERY_REGISTRY_NOEXPAND       0x00000010
-#define RTL_QUERY_REGISTRY_DIRECT         0x00000020
-#define RTL_QUERY_REGISTRY_DELETE         0x00000040
+typedef struct _KGUARDED_MUTEX
+{
+    volatile LONG Count;
+    PKTHREAD Owner;
+    ULONG Contention;
+    KGATE Gate;
+    __GNU_EXTENSION union
+    {
+        __GNU_EXTENSION struct
+        {
+            SHORT KernelApcDisable;
+            SHORT SpecialApcDisable;
+        };
+        ULONG CombinedApcDisable;
+    };
+} KGUARDED_MUTEX, *PKGUARDED_MUTEX;
 
-typedef struct _RTL_BITMAP {
-    ULONG SizeOfBitMap;
-    PULONG Buffer;
-} RTL_BITMAP, *PRTL_BITMAP;
+typedef struct _KMUTANT {
+  DISPATCHER_HEADER  Header;
+  LIST_ENTRY  MutantListEntry;
+  struct _KTHREAD  *RESTRICTED_POINTER OwnerThread;
+  BOOLEAN  Abandoned;
+  UCHAR  ApcDisable;
+} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
+
+#define TIMER_TABLE_SIZE 512
+#define TIMER_TABLE_SHIFT 9
+
+typedef struct _KTIMER {
+  DISPATCHER_HEADER Header;
+  ULARGE_INTEGER DueTime;
+  LIST_ENTRY TimerListEntry;
+  struct _KDPC *Dpc;
+  #if !defined(_X86_)
+  ULONG Processor;
+  #endif
+  ULONG Period;
+} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
+
+typedef BOOLEAN
+(DDKAPI *PKSYNCHRONIZE_ROUTINE)(
+  IN PVOID  SynchronizeContext);
 
-typedef struct _RTL_BITMAP_RUN {
-    ULONG StartingIndex;
-    ULONG NumberOfBits;
-} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
+typedef enum _POOL_TYPE {
+  NonPagedPool,
+  PagedPool,
+  NonPagedPoolMustSucceed,
+  DontUseThisType,
+  NonPagedPoolCacheAligned,
+  PagedPoolCacheAligned,
+  NonPagedPoolCacheAlignedMustS,
+  MaxPoolType,
+  NonPagedPoolSession = 32,
+  PagedPoolSession,
+  NonPagedPoolMustSucceedSession,
+  DontUseThisTypeSession,
+  NonPagedPoolCacheAlignedSession,
+  PagedPoolCacheAlignedSession,
+  NonPagedPoolCacheAlignedMustSSession
+} POOL_TYPE;
 
-typedef NTSTATUS
-(DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
-    IN PWSTR ValueName,
-    IN ULONG ValueType,
-    IN PVOID ValueData,
-    IN ULONG ValueLength,
-    IN PVOID Context,
-    IN PVOID EntryContext);
+typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
+{
+    StandardDesign,
+    NEC98x86,
+    EndAlternatives
+} ALTERNATIVE_ARCHITECTURE_TYPE;
 
-typedef struct _RTL_QUERY_REGISTRY_TABLE {
-    PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
-    ULONG Flags;
-    PCWSTR Name;
-    PVOID EntryContext;
-    ULONG DefaultType;
-    PVOID DefaultData;
-    ULONG DefaultLength;
-} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
+typedef struct _KSYSTEM_TIME
+{
+    ULONG LowPart;
+    LONG High1Time;
+    LONG High2Time;
+} KSYSTEM_TIME, *PKSYSTEM_TIME;
+
+typedef struct _PNP_BUS_INFORMATION {
+  GUID  BusTypeGuid;
+  INTERFACE_TYPE  LegacyBusType;
+  ULONG  BusNumber;
+} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
+
+typedef struct DECLSPEC_ALIGN(16) _M128A {
+    ULONGLONG Low;
+    LONGLONG High;
+} M128A, *PM128A;
+
+typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
+  USHORT ControlWord;
+  USHORT StatusWord;
+  UCHAR TagWord;
+  UCHAR Reserved1;
+  USHORT ErrorOpcode;
+  ULONG ErrorOffset;
+  USHORT ErrorSelector;
+  USHORT Reserved2;
+  ULONG DataOffset;
+  USHORT DataSelector;
+  USHORT Reserved3;
+  ULONG MxCsr;
+  ULONG MxCsr_Mask;
+  M128A FloatRegisters[8];
+#if defined(_WIN64)
+  M128A XmmRegisters[16];
+  UCHAR Reserved4[96];
+#else
+  M128A XmmRegisters[8];
+  UCHAR Reserved4[192];
+  ULONG StackControl[7];
+  ULONG Cr0NpxState;
+#endif
+} XSAVE_FORMAT, *PXSAVE_FORMAT;
 
-typedef struct _TIME_FIELDS {
-    CSHORT Year;
-    CSHORT Month;
-    CSHORT Day;
-    CSHORT Hour;
-    CSHORT Minute;
-    CSHORT Second;
-    CSHORT Milliseconds;
-    CSHORT Weekday;
-} TIME_FIELDS, *PTIME_FIELDS;
 
 
 /******************************************************************************
- *                               RTL Functions                                *
+ *                         Memory manager Types                               *
  ******************************************************************************/
 
-NTSYSAPI
-VOID
-NTAPI
-RtlAssert(
-    IN PVOID FailedAssertion,
-    IN PVOID FileName,
-    IN ULONG LineNumber,
-    IN PCHAR Message);
-
-/* VOID
- * RtlCopyMemory(
- *     IN VOID UNALIGNED *Destination,
- *     IN CONST VOID UNALIGNED *Source,
- *     IN SIZE_T Length)
- */
-#define RtlCopyMemory(Destination, Source, Length) \
-    memcpy(Destination, Source, Length)
+#define MM_DONT_ZERO_ALLOCATION                 0x00000001
+#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY        0x00000002
+#define MM_ALLOCATE_FULLY_REQUIRED              0x00000004
+#define MM_ALLOCATE_NO_WAIT                     0x00000008
+#define MM_ALLOCATE_PREFER_CONTIGUOUS           0x00000010
+#define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS   0x00000020
+
+#define MDL_MAPPED_TO_SYSTEM_VA     0x0001
+#define MDL_PAGES_LOCKED            0x0002
+#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
+#define MDL_ALLOCATED_FIXED_SIZE    0x0008
+#define MDL_PARTIAL                 0x0010
+#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
+#define MDL_IO_PAGE_READ            0x0040
+#define MDL_WRITE_OPERATION         0x0080
+#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
+#define MDL_FREE_EXTRA_PTES         0x0200
+#define MDL_DESCRIBES_AWE           0x0400
+#define MDL_IO_SPACE                0x0800
+#define MDL_NETWORK_HEADER          0x1000
+#define MDL_MAPPING_CAN_FAIL        0x2000
+#define MDL_ALLOCATED_MUST_SUCCEED  0x4000
+#define MDL_INTERNAL                0x8000
+
+#define MDL_MAPPING_FLAGS ( \
+  MDL_MAPPED_TO_SYSTEM_VA     | \
+  MDL_PAGES_LOCKED            | \
+  MDL_SOURCE_IS_NONPAGED_POOL | \
+  MDL_PARTIAL_HAS_BEEN_MAPPED | \
+  MDL_PARENT_MAPPED_SYSTEM_VA | \
+  MDL_SYSTEM_VA               | \
+  MDL_IO_SPACE)
+
+#define FLUSH_MULTIPLE_MAXIMUM 32
+
+/* Section access rights */
+#define SECTION_QUERY                0x0001
+#define SECTION_MAP_WRITE            0x0002
+#define SECTION_MAP_READ             0x0004
+#define SECTION_MAP_EXECUTE          0x0008
+#define SECTION_EXTEND_SIZE          0x0010
+#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
 
-#define RtlCopyBytes RtlCopyMemory
+#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
+                            SECTION_MAP_WRITE |      \
+                            SECTION_MAP_READ |       \
+                            SECTION_MAP_EXECUTE |    \
+                            SECTION_EXTEND_SIZE)
 
-#if defined(_M_AMD64)
-NTSYSAPI
-VOID
-NTAPI
-RtlCopyMemoryNonTemporal(
-    VOID UNALIGNED *Destination,
-    CONST VOID UNALIGNED *Source,
-    SIZE_T Length);
-#else
-#define RtlCopyMemoryNonTemporal RtlCopyMemory
-#endif
+#define SESSION_QUERY_ACCESS  0x0001
+#define SESSION_MODIFY_ACCESS 0x0002
 
-/* BOOLEAN
- * RtlEqualLuid(
- *     IN PLUID Luid1,
- *     IN PLUID Luid2)
- */
-#define RtlEqualLuid(Luid1, Luid2) \
-    (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
+#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |  \
+                            SESSION_QUERY_ACCESS |             \
+                            SESSION_MODIFY_ACCESS)
 
-/* ULONG
- * RtlEqualMemory(
- *     IN VOID UNALIGNED *Destination,
- *     IN CONST VOID UNALIGNED *Source,
- *     IN SIZE_T Length)
- */
-#define RtlEqualMemory(Destination, Source, Length) \
-    (!memcmp(Destination, Source, Length))
+#define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
 
-/* VOID
- * RtlFillMemory(
- *     IN VOID UNALIGNED *Destination,
- *     IN SIZE_T Length,
- *     IN UCHAR Fill)
- */
-#define RtlFillMemory(Destination, Length, Fill) \
-    memset(Destination, Fill, Length)
+#define PAGE_NOACCESS          0x01
+#define PAGE_READONLY          0x02
+#define PAGE_READWRITE         0x04
+#define PAGE_WRITECOPY         0x08
+#define PAGE_EXECUTE           0x10
+#define PAGE_EXECUTE_READ      0x20
+#define PAGE_EXECUTE_READWRITE 0x40
+#define PAGE_EXECUTE_WRITECOPY 0x80
+#define PAGE_GUARD            0x100
+#define PAGE_NOCACHE          0x200
+#define PAGE_WRITECOMBINE     0x400
 
-#define RtlFillBytes RtlFillMemory
+#define MEM_COMMIT           0x1000
+#define MEM_RESERVE          0x2000
+#define MEM_DECOMMIT         0x4000
+#define MEM_RELEASE          0x8000
+#define MEM_FREE            0x10000
+#define MEM_PRIVATE         0x20000
+#define MEM_MAPPED          0x40000
+#define MEM_RESET           0x80000
+#define MEM_TOP_DOWN       0x100000
+#define MEM_LARGE_PAGES  0x20000000
+#define MEM_4MB_PAGES    0x80000000
 
-NTSYSAPI
-VOID
-NTAPI
-RtlFreeUnicodeString(
-    IN PUNICODE_STRING UnicodeString);
+#define SEC_RESERVE       0x4000000
+#define SEC_COMMIT        0x8000000
+#define SEC_LARGE_PAGES  0x80000000
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGUIDFromString(
-    IN PUNICODE_STRING GuidString,
-    OUT GUID *Guid);
+/* Section map options */
+typedef enum _SECTION_INHERIT {
+    ViewShare = 1,
+    ViewUnmap = 2
+} SECTION_INHERIT;
 
-NTSYSAPI
-VOID
-NTAPI
-RtlInitUnicodeString(
-    IN OUT PUNICODE_STRING DestinationString,
-    IN PCWSTR SourceString);
+typedef ULONG PFN_COUNT;
+typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
+typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
 
-/* VOID
- * RtlMoveMemory(
- *    IN VOID UNALIGNED *Destination,
- *    IN CONST VOID UNALIGNED *Source,
- *    IN SIZE_T Length)
- */
-#define RtlMoveMemory(Destination, Source, Length) \
-    memmove(Destination, Source, Length)
+typedef struct _MDL {
+    struct _MDL *Next;
+    CSHORT Size;
+    CSHORT MdlFlags;
+    struct _EPROCESS *Process;
+    PVOID MappedSystemVa;
+    PVOID StartVa;
+    ULONG ByteCount;
+    ULONG ByteOffset;
+} MDL, *PMDL;
+typedef MDL *PMDLX;
+
+typedef enum _MEMORY_CACHING_TYPE_ORIG {
+  MmFrameBufferCached = 2
+} MEMORY_CACHING_TYPE_ORIG;
+
+typedef enum _MEMORY_CACHING_TYPE {
+  MmNonCached = FALSE,
+  MmCached = TRUE,
+  MmWriteCombined = MmFrameBufferCached,
+  MmHardwareCoherentCached,
+  MmNonCachedUnordered,
+  MmUSWCCached,
+  MmMaximumCacheType
+} MEMORY_CACHING_TYPE;
+
+typedef enum _MM_PAGE_PRIORITY {
+  LowPagePriority,
+  NormalPagePriority = 16,
+  HighPagePriority = 32
+} MM_PAGE_PRIORITY;
+
+typedef enum _LOCK_OPERATION {
+  IoReadAccess,
+  IoWriteAccess,
+  IoModifyAccess
+} LOCK_OPERATION;
+
+typedef enum _MM_SYSTEM_SIZE {
+  MmSmallSystem,
+  MmMediumSystem,
+  MmLargeSystem
+} MM_SYSTEMSIZE;
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlStringFromGUID(
-    IN REFGUID Guid,
-    OUT PUNICODE_STRING GuidString);
 
-/* VOID
- * RtlZeroMemory(
- *     IN VOID UNALIGNED *Destination,
- *     IN SIZE_T Length)
- */
-#define RtlZeroMemory(Destination, Length) \
-    memset(Destination, 0, Length)
+/******************************************************************************
+ *                            Executive Types                                 *
+ ******************************************************************************/
 
-#define RtlZeroBytes RtlZeroMemory
+#define EX_RUNDOWN_ACTIVE                 0x1
+#define EX_RUNDOWN_COUNT_SHIFT            0x1
+#define EX_RUNDOWN_COUNT_INC              (1 << EX_RUNDOWN_COUNT_SHIFT)
 
+#ifdef _WIN64
+#define PORT_MAXIMUM_MESSAGE_LENGTH 512
+#else
+#define PORT_MAXIMUM_MESSAGE_LENGTH 256
+#endif
 
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlAreBitsClear(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG StartingIndex,
-    IN ULONG Length);
+typedef struct _FAST_MUTEX {
+  volatile LONG Count;
+  PKTHREAD Owner;
+  ULONG Contention;
+  KEVENT Event;
+  ULONG OldIrql;
+} FAST_MUTEX, *PFAST_MUTEX;
 
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlAreBitsSet(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG StartingIndex,
-    IN ULONG Length);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlAnsiStringToUnicodeString(
-    IN OUT PUNICODE_STRING DestinationString,
-    IN PANSI_STRING SourceString,
-    IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlxAnsiStringToUnicodeSize(
-    IN PCANSI_STRING AnsiString);
-
-#define RtlAnsiStringToUnicodeSize(String) (               \
-  NLS_MB_CODE_PAGE_TAG ?                                   \
-  RtlxAnsiStringToUnicodeSize(String) :                    \
-  ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)   \
-)
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlAppendUnicodeStringToString(
-    IN OUT PUNICODE_STRING Destination,
-    IN PCUNICODE_STRING Source);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlAppendUnicodeToString(
-    IN OUT PUNICODE_STRING Destination,
-    IN PCWSTR Source);
+typedef enum _SUITE_TYPE {
+    SmallBusiness,
+    Enterprise,
+    BackOffice,
+    CommunicationServer,
+    TerminalServer,
+    SmallBusinessRestricted,
+    EmbeddedNT,
+    DataCenter,
+    SingleUserTS,
+    Personal,
+    Blade,
+    EmbeddedRestricted,
+    SecurityAppliance,
+    StorageServer,
+    ComputeServer,
+    WHServer,
+    MaxSuiteType
+} SUITE_TYPE;
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCheckRegistryKey(
-    IN ULONG RelativeTo,
-    IN PWSTR Path);
+typedef enum _EX_POOL_PRIORITY {
+    LowPoolPriority,
+    LowPoolPrioritySpecialPoolOverrun = 8,
+    LowPoolPrioritySpecialPoolUnderrun = 9,
+    NormalPoolPriority = 16,
+    NormalPoolPrioritySpecialPoolOverrun = 24,
+    NormalPoolPrioritySpecialPoolUnderrun = 25,
+    HighPoolPriority = 32,
+    HighPoolPrioritySpecialPoolOverrun = 40,
+    HighPoolPrioritySpecialPoolUnderrun = 41
+} EX_POOL_PRIORITY;
 
-NTSYSAPI
-VOID
-NTAPI
-RtlClearAllBits(
-    IN PRTL_BITMAP BitMapHeader);
+#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
+#define LOOKASIDE_ALIGN
+#else
+#define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
+#endif
 
-NTSYSAPI
-VOID
-NTAPI
-RtlClearBits(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG StartingIndex,
-    IN ULONG NumberToClear);
+typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
 
-NTSYSAPI
-SIZE_T
-NTAPI
-RtlCompareMemory(
-    IN CONST VOID *Source1,
-    IN CONST VOID *Source2,
-    IN SIZE_T Length);
+typedef PVOID
+(DDKAPI *PALLOCATE_FUNCTION)(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes,
+    IN ULONG Tag);
 
-NTSYSAPI
-LONG
-NTAPI
-RtlCompareUnicodeString(
-    IN PCUNICODE_STRING String1,
-    IN PCUNICODE_STRING String2,
-    IN BOOLEAN CaseInSensitive);
+typedef PVOID
+(DDKAPI *PALLOCATE_FUNCTION_EX)(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes,
+    IN ULONG Tag,
+    IN OUT PLOOKASIDE_LIST_EX Lookaside);
 
-NTSYSAPI
-LONG
-NTAPI
-RtlCompareUnicodeStrings(
-    IN PCWCH String1,
-    IN SIZE_T String1Length,
-    IN PCWCH String2,
-    IN SIZE_T String2Length,
-    IN BOOLEAN CaseInSensitive);
+typedef VOID
+(DDKAPI *PFREE_FUNCTION)(
+    IN PVOID Buffer);
 
-NTSYSAPI
-VOID
-NTAPI
-RtlCopyUnicodeString(
-  IN OUT PUNICODE_STRING  DestinationString,
-  IN PCUNICODE_STRING  SourceString);
+typedef VOID
+(DDKAPI *PFREE_FUNCTION_EX)(
+    IN PVOID Buffer,
+    IN OUT PLOOKASIDE_LIST_EX Lookaside);
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCreateRegistryKey(
-    IN ULONG RelativeTo,
-    IN PWSTR Path);
+typedef VOID
+(DDKAPI *PCALLBACK_FUNCTION)(
+  IN PVOID  CallbackContext,
+  IN PVOID  Argument1,
+  IN PVOID  Argument2);
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCreateSecurityDescriptor(
-    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN ULONG Revision);
+#define GENERAL_LOOKASIDE_LAYOUT                \
+    union {                                     \
+        SLIST_HEADER ListHead;                  \
+        SINGLE_LIST_ENTRY SingleListHead;       \
+    } DUMMYUNIONNAME;                           \
+    USHORT Depth;                               \
+    USHORT MaximumDepth;                        \
+    ULONG TotalAllocates;                       \
+    union {                                     \
+        ULONG AllocateMisses;                   \
+        ULONG AllocateHits;                     \
+    } DUMMYUNIONNAME2;                          \
+                                                \
+    ULONG TotalFrees;                           \
+    union {                                     \
+        ULONG FreeMisses;                       \
+        ULONG FreeHits;                         \
+    } DUMMYUNIONNAME3;                          \
+                                                \
+    POOL_TYPE Type;                             \
+    ULONG Tag;                                  \
+    ULONG Size;                                 \
+    union {                                     \
+        PALLOCATE_FUNCTION_EX AllocateEx;       \
+        PALLOCATE_FUNCTION Allocate;            \
+    } DUMMYUNIONNAME4;                          \
+                                                \
+    union {                                     \
+        PFREE_FUNCTION_EX FreeEx;               \
+        PFREE_FUNCTION Free;                    \
+    } DUMMYUNIONNAME5;                          \
+                                                \
+    LIST_ENTRY ListEntry;                       \
+    ULONG LastTotalAllocates;                   \
+    union {                                     \
+        ULONG LastAllocateMisses;               \
+        ULONG LastAllocateHits;                 \
+    } DUMMYUNIONNAME6;                          \
+    ULONG Future[2];
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlDeleteRegistryValue(
-    IN ULONG RelativeTo,
-    IN PCWSTR Path,
-    IN PCWSTR ValueName);
+typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
+    GENERAL_LOOKASIDE_LAYOUT
+} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
 
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlEqualUnicodeString(
-    IN CONST UNICODE_STRING *String1,
-    IN CONST UNICODE_STRING *String2,
-    IN BOOLEAN CaseInSensitive);
+typedef struct _GENERAL_LOOKASIDE_POOL {
+    GENERAL_LOOKASIDE_LAYOUT
+} GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
 
+typedef struct _PAGED_LOOKASIDE_LIST {
+    GENERAL_LOOKASIDE L;
 #if !defined(_AMD64_) && !defined(_IA64_)
-NTSYSAPI
-LARGE_INTEGER
-NTAPI
-RtlExtendedIntegerMultiply(
-    IN LARGE_INTEGER Multiplicand,
-    IN LONG Multiplier);
-
-NTSYSAPI
-LARGE_INTEGER
-NTAPI
-RtlExtendedLargeIntegerDivide(
-  IN LARGE_INTEGER Dividend,
-  IN ULONG Divisor,
-  IN OUT PULONG Remainder);
+    FAST_MUTEX Lock__ObsoleteButDoNotDelete;
 #endif
+} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
 
-#if defined(_X86_) || defined(_IA64_)
-NTSYSAPI
-LARGE_INTEGER
-NTAPI
-RtlExtendedMagicDivide(
-    IN LARGE_INTEGER Dividend,
-    IN LARGE_INTEGER MagicDivisor,
-    IN CCHAR  ShiftCount);
+typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
+    GENERAL_LOOKASIDE L;
+#if !defined(_AMD64_) && !defined(_IA64_)
+    KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
 #endif
+} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
 
-NTSYSAPI
-VOID
-NTAPI
-RtlFreeAnsiString(
-    IN PANSI_STRING AnsiString);
+typedef struct _LOOKASIDE_LIST_EX {
+    GENERAL_LOOKASIDE_POOL L;
+} LOOKASIDE_LIST_EX;
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlFindClearBits(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG NumberToFind,
-    IN ULONG HintIndex);
+typedef struct _EX_RUNDOWN_REF {
+    __GNU_EXTENSION union {
+        volatile ULONG_PTR Count;
+        volatile PVOID Ptr;
+    };
+} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlFindClearBitsAndSet(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG NumberToFind,
-    IN ULONG HintIndex);
+typedef struct _EX_RUNDOWN_REF_CACHE_AWARE  *PEX_RUNDOWN_REF_CACHE_AWARE;
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlFindFirstRunClear(
-    IN PRTL_BITMAP BitMapHeader,
-    OUT PULONG StartingIndex);
+typedef VOID
+(DDKAPI *PWORKER_THREAD_ROUTINE)(
+  IN PVOID Parameter);
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlFindClearRuns(
-    IN PRTL_BITMAP BitMapHeader,
-    OUT PRTL_BITMAP_RUN RunArray,
-    IN ULONG SizeOfRunArray,
-    IN BOOLEAN LocateLongestRuns);
+typedef struct _WORK_QUEUE_ITEM {
+  LIST_ENTRY  List;
+  PWORKER_THREAD_ROUTINE  WorkerRoutine;
+  volatile PVOID  Parameter;
+} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlFindLastBackwardRunClear(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG FromIndex,
-    OUT PULONG StartingRunIndex);
 
-NTSYSAPI
-CCHAR
-NTAPI
-RtlFindLeastSignificantBit(
-    IN ULONGLONG Set);
+/******************************************************************************
+ *                            Security Manager Types                          *
+ ******************************************************************************/
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlFindLongestRunClear(
-    IN PRTL_BITMAP BitMapHeader,
-    OUT PULONG StartingIndex);
+/* Simple types */
+typedef PVOID PSECURITY_DESCRIPTOR;
+typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
+typedef ULONG ACCESS_MASK, *PACCESS_MASK;
+typedef PVOID PACCESS_TOKEN;
+typedef PVOID PSID;
 
-NTSYSAPI
-CCHAR
-NTAPI
-RtlFindMostSignificantBit(
-    IN ULONGLONG Set);
+#define DELETE                           0x00010000L
+#define READ_CONTROL                     0x00020000L
+#define WRITE_DAC                        0x00040000L
+#define WRITE_OWNER                      0x00080000L
+#define SYNCHRONIZE                      0x00100000L
+#define STANDARD_RIGHTS_REQUIRED         0x000F0000L
+#define STANDARD_RIGHTS_READ             READ_CONTROL
+#define STANDARD_RIGHTS_WRITE            READ_CONTROL
+#define STANDARD_RIGHTS_EXECUTE          READ_CONTROL
+#define STANDARD_RIGHTS_ALL              0x001F0000L
+#define SPECIFIC_RIGHTS_ALL              0x0000FFFFL
+#define ACCESS_SYSTEM_SECURITY           0x01000000L
+#define MAXIMUM_ALLOWED                  0x02000000L
+#define GENERIC_READ                     0x80000000L
+#define GENERIC_WRITE                    0x40000000L
+#define GENERIC_EXECUTE                  0x20000000L
+#define GENERIC_ALL                      0x10000000L
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlFindNextForwardRunClear(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG FromIndex,
-    OUT PULONG StartingRunIndex);
+typedef struct _GENERIC_MAPPING {
+    ACCESS_MASK GenericRead;
+    ACCESS_MASK GenericWrite;
+    ACCESS_MASK GenericExecute;
+    ACCESS_MASK GenericAll;
+} GENERIC_MAPPING, *PGENERIC_MAPPING;
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlFindSetBits(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG NumberToFind,
-    IN ULONG HintIndex);
+#define ACL_REVISION                      2
+#define ACL_REVISION_DS                   4
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlFindSetBitsAndClear(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG NumberToFind,
-    IN ULONG HintIndex);
+#define ACL_REVISION1                     1
+#define ACL_REVISION2                     2
+#define ACL_REVISION3                     3
+#define ACL_REVISION4                     4
+#define MIN_ACL_REVISION                  ACL_REVISION2
+#define MAX_ACL_REVISION                  ACL_REVISION4
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlHashUnicodeString(
-    IN CONST UNICODE_STRING *String,
-    IN BOOLEAN CaseInSensitive,
-    IN ULONG HashAlgorithm,
-    OUT PULONG HashValue);
+typedef struct _ACL {
+    UCHAR AclRevision;
+    UCHAR Sbz1;
+    USHORT AclSize;
+    USHORT AceCount;
+    USHORT Sbz2;
+} ACL, *PACL;
 
-NTSYSAPI
-VOID
-NTAPI
-RtlInitAnsiString(
-    IN OUT PANSI_STRING DestinationString,
-    IN PCSZ SourceString);
+/* Current security descriptor revision value */
+#define SECURITY_DESCRIPTOR_REVISION     (1)
+#define SECURITY_DESCRIPTOR_REVISION1    (1)
 
-NTSYSAPI
-VOID
-NTAPI
-RtlInitializeBitMap(
-    IN PRTL_BITMAP BitMapHeader,
-    IN PULONG BitMapBuffer,
-    IN ULONG SizeOfBitMap);
+/* Privilege attributes */
+#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
+#define SE_PRIVILEGE_ENABLED            (0x00000002L)
+#define SE_PRIVILEGE_REMOVED            (0X00000004L)
+#define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)
 
-NTSYSAPI
-VOID
-NTAPI
-RtlInitString(
-    IN OUT PSTRING DestinationString,
-    IN PCSZ SourceString);
+#define SE_PRIVILEGE_VALID_ATTRIBUTES   (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
+                                         SE_PRIVILEGE_ENABLED            | \
+                                         SE_PRIVILEGE_REMOVED            | \
+                                         SE_PRIVILEGE_USED_FOR_ACCESS)
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlIntegerToUnicodeString(
-    IN ULONG Value,
-    IN ULONG Base OPTIONAL,
-    IN OUT PUNICODE_STRING String);
+#include <pshpack4.h>
+typedef struct _LUID_AND_ATTRIBUTES {
+    LUID Luid;
+    ULONG Attributes;
+} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
+#include <poppack.h>
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlInt64ToUnicodeString(
-    IN ULONGLONG Value,
-    IN ULONG Base OPTIONAL,
-    IN OUT PUNICODE_STRING String);
+typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
+typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
 
-#ifdef _WIN64
-#define RtlIntPtrToUnicodeString(Value, Base, String) \
-    RtlInt64ToUnicodeString(Value, Base, String)
-#else
-#define RtlIntPtrToUnicodeString(Value, Base, String) \
-    RtlIntegerToUnicodeString(Value, Base, String)
-#endif
+/* Privilege sets */
+#define PRIVILEGE_SET_ALL_NECESSARY (1)
 
-/* BOOLEAN
- * RtlIsZeroLuid(
- *     IN PLUID L1);
- */
-#define RtlIsZeroLuid(_L1) \
-    ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
+typedef struct _PRIVILEGE_SET {
+    ULONG PrivilegeCount;
+    ULONG Control;
+    LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
+} PRIVILEGE_SET,*PPRIVILEGE_SET;
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlLengthSecurityDescriptor(
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+typedef enum _SECURITY_IMPERSONATION_LEVEL {
+    SecurityAnonymous,
+    SecurityIdentification,
+    SecurityImpersonation,
+    SecurityDelegation
+} SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlNumberOfClearBits(
-    IN PRTL_BITMAP BitMapHeader);
+#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
+#define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
+#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
+#define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlNumberOfSetBits(
-    IN PRTL_BITMAP BitMapHeader);
+#define SECURITY_DYNAMIC_TRACKING (TRUE)
+#define SECURITY_STATIC_TRACKING (FALSE)
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlQueryRegistryValues(
-    IN ULONG RelativeTo,
-    IN PCWSTR Path,
-    IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
-    IN PVOID Context,
-    IN PVOID Environment OPTIONAL);
+typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
 
-#define LONG_SIZE (sizeof(LONG))
-#define LONG_MASK (LONG_SIZE - 1)
+typedef struct _SECURITY_QUALITY_OF_SERVICE {
+    ULONG Length;
+    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+    SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
+    BOOLEAN EffectiveOnly;
+} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
 
-/* VOID
- * RtlRetrieveUlong(
- *       PULONG DestinationAddress,
- *       PULONG SourceAddress);
- */
-#if defined(_AMD64_)
-#define RtlRetrieveUlong(DestAddress,SrcAddress) \
-    *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
-#else
-#define RtlRetrieveUlong(DestAddress,SrcAddress) \
-    if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
-    { \
-        ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
-        ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
-        ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
-        ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
-    } \
-    else \
-    { \
-        *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
-    }
-#endif
+typedef struct _SE_IMPERSONATION_STATE {
+    PACCESS_TOKEN Token;
+    BOOLEAN CopyOnOpen;
+    BOOLEAN EffectiveOnly;
+    SECURITY_IMPERSONATION_LEVEL Level;
+} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
 
-/* VOID
- * RtlRetrieveUshort(
- *       PUSHORT DestinationAddress,
- *       PUSHORT SourceAddress);
- */
-#if defined(_AMD64_)
-#define RtlRetrieveUshort(DestAddress,SrcAddress) \
-    *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
-#else
-#define RtlRetrieveUshort(DestAddress,SrcAddress) \
-    if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
-    { \
-        ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
-        ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
-    } \
-    else \
-    { \
-        *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
-    }
-#endif
+#define OWNER_SECURITY_INFORMATION       (0x00000001L)
+#define GROUP_SECURITY_INFORMATION       (0x00000002L)
+#define DACL_SECURITY_INFORMATION        (0x00000004L)
+#define SACL_SECURITY_INFORMATION        (0x00000008L)
+#define LABEL_SECURITY_INFORMATION       (0x00000010L)
 
-NTSYSAPI
-VOID
-NTAPI
-RtlSetAllBits(
-    IN PRTL_BITMAP BitMapHeader);
+#define PROTECTED_DACL_SECURITY_INFORMATION     (0x80000000L)
+#define PROTECTED_SACL_SECURITY_INFORMATION     (0x40000000L)
+#define UNPROTECTED_DACL_SECURITY_INFORMATION   (0x20000000L)
+#define UNPROTECTED_SACL_SECURITY_INFORMATION   (0x10000000L)
 
-NTSYSAPI
-VOID
-NTAPI
-RtlSetBits(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG StartingIndex,
-    IN ULONG NumberToSet);
+typedef enum _SECURITY_OPERATION_CODE {
+  SetSecurityDescriptor,
+  QuerySecurityDescriptor,
+  DeleteSecurityDescriptor,
+  AssignSecurityDescriptor
+} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
+
+#define INITIAL_PRIVILEGE_COUNT           3
+
+typedef struct _INITIAL_PRIVILEGE_SET {
+  ULONG  PrivilegeCount;
+  ULONG  Control;
+  LUID_AND_ATTRIBUTES  Privilege[INITIAL_PRIVILEGE_COUNT];
+} INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
+
+#define SE_MIN_WELL_KNOWN_PRIVILEGE         2
+#define SE_CREATE_TOKEN_PRIVILEGE           2
+#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE     3
+#define SE_LOCK_MEMORY_PRIVILEGE            4
+#define SE_INCREASE_QUOTA_PRIVILEGE         5
+#define SE_MACHINE_ACCOUNT_PRIVILEGE        6
+#define SE_TCB_PRIVILEGE                    7
+#define SE_SECURITY_PRIVILEGE               8
+#define SE_TAKE_OWNERSHIP_PRIVILEGE         9
+#define SE_LOAD_DRIVER_PRIVILEGE            10
+#define SE_SYSTEM_PROFILE_PRIVILEGE         11
+#define SE_SYSTEMTIME_PRIVILEGE             12
+#define SE_PROF_SINGLE_PROCESS_PRIVILEGE    13
+#define SE_INC_BASE_PRIORITY_PRIVILEGE      14
+#define SE_CREATE_PAGEFILE_PRIVILEGE        15
+#define SE_CREATE_PERMANENT_PRIVILEGE       16
+#define SE_BACKUP_PRIVILEGE                 17
+#define SE_RESTORE_PRIVILEGE                18
+#define SE_SHUTDOWN_PRIVILEGE               19
+#define SE_DEBUG_PRIVILEGE                  20
+#define SE_AUDIT_PRIVILEGE                  21
+#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE     22
+#define SE_CHANGE_NOTIFY_PRIVILEGE          23
+#define SE_REMOTE_SHUTDOWN_PRIVILEGE        24
+#define SE_UNDOCK_PRIVILEGE                 25
+#define SE_SYNC_AGENT_PRIVILEGE             26
+#define SE_ENABLE_DELEGATION_PRIVILEGE      27
+#define SE_MANAGE_VOLUME_PRIVILEGE          28
+#define SE_IMPERSONATE_PRIVILEGE            29
+#define SE_CREATE_GLOBAL_PRIVILEGE          30
+#define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
+#define SE_RELABEL_PRIVILEGE                32
+#define SE_INC_WORKING_SET_PRIVILEGE        33
+#define SE_TIME_ZONE_PRIVILEGE              34
+#define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE   35
+#define SE_MAX_WELL_KNOWN_PRIVILEGE         SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
+
+typedef struct _SECURITY_SUBJECT_CONTEXT {
+  PACCESS_TOKEN  ClientToken;
+  SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
+  PACCESS_TOKEN  PrimaryToken;
+  PVOID  ProcessAuditId;
+} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
+
+typedef struct _ACCESS_STATE {
+  LUID  OperationID;
+  BOOLEAN  SecurityEvaluated;
+  BOOLEAN  GenerateAudit;
+  BOOLEAN  GenerateOnClose;
+  BOOLEAN  PrivilegesAllocated;
+  ULONG  Flags;
+  ACCESS_MASK  RemainingDesiredAccess;
+  ACCESS_MASK  PreviouslyGrantedAccess;
+  ACCESS_MASK  OriginalDesiredAccess;
+  SECURITY_SUBJECT_CONTEXT  SubjectSecurityContext;
+  PSECURITY_DESCRIPTOR  SecurityDescriptor;
+  PVOID  AuxData;
+  union {
+    INITIAL_PRIVILEGE_SET  InitialPrivilegeSet;
+    PRIVILEGE_SET  PrivilegeSet;
+  } Privileges;
+
+  BOOLEAN  AuditPrivileges;
+  UNICODE_STRING  ObjectName;
+  UNICODE_STRING  ObjectTypeName;
+} ACCESS_STATE, *PACCESS_STATE;
+
+
+#ifndef _NTLSA_IFS_
+
+#ifndef _NTLSA_AUDIT_
+#define _NTLSA_AUDIT_
+
+#define SE_MAX_AUDIT_PARAMETERS 32
+#define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
+
+#define SE_ADT_OBJECT_ONLY 0x1
+
+#define SE_ADT_PARAMETERS_SELF_RELATIVE    0x00000001
+#define SE_ADT_PARAMETERS_SEND_TO_LSA      0x00000002
+#define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT  0x00000004
+#define SE_ADT_PARAMETER_GENERIC_AUDIT     0x00000008
+#define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
+
+#define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
+  ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
+    (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
+
+typedef enum _SE_ADT_PARAMETER_TYPE {
+  SeAdtParmTypeNone = 0,
+  SeAdtParmTypeString,
+  SeAdtParmTypeFileSpec,
+  SeAdtParmTypeUlong,
+  SeAdtParmTypeSid,
+  SeAdtParmTypeLogonId,
+  SeAdtParmTypeNoLogonId,
+  SeAdtParmTypeAccessMask,
+  SeAdtParmTypePrivs,
+  SeAdtParmTypeObjectTypes,
+  SeAdtParmTypeHexUlong,
+  SeAdtParmTypePtr,
+  SeAdtParmTypeTime,
+  SeAdtParmTypeGuid,
+  SeAdtParmTypeLuid,
+  SeAdtParmTypeHexInt64,
+  SeAdtParmTypeStringList,
+  SeAdtParmTypeSidList,
+  SeAdtParmTypeDuration,
+  SeAdtParmTypeUserAccountControl,
+  SeAdtParmTypeNoUac,
+  SeAdtParmTypeMessage,
+  SeAdtParmTypeDateTime,
+  SeAdtParmTypeSockAddr,
+  SeAdtParmTypeSD,
+  SeAdtParmTypeLogonHours,
+  SeAdtParmTypeLogonIdNoSid,
+  SeAdtParmTypeUlongNoConv,
+  SeAdtParmTypeSockAddrNoPort,
+  SeAdtParmTypeAccessReason
+} SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE;
+
+typedef struct _SE_ADT_OBJECT_TYPE {
+  GUID ObjectType;
+  USHORT Flags;
+  USHORT Level;
+  ACCESS_MASK AccessMask;
+} SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE;
+
+typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
+  SE_ADT_PARAMETER_TYPE Type;
+  ULONG Length;
+  ULONG_PTR Data[2];
+  PVOID Address;
+} SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY;
+
+typedef struct _SE_ADT_ACCESS_REASON {
+  ACCESS_MASK AccessMask;
+  ULONG  AccessReasons[32];
+  ULONG  ObjectTypeIndex;
+  ULONG AccessGranted;
+  PSECURITY_DESCRIPTOR SecurityDescriptor;
+} SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
+
+typedef struct _SE_ADT_PARAMETER_ARRAY {
+  ULONG CategoryId;
+  ULONG AuditId;
+  ULONG ParameterCount;
+  ULONG Length;
+  USHORT FlatSubCategoryId;
+  USHORT Type;
+  ULONG Flags;
+  SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ];
+} SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY;
+
+#endif /* !_NTLSA_AUDIT_ */
+#endif /* !_NTLSA_IFS_ */
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlSetDaclSecurityDescriptor(
-    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
-    IN BOOLEAN DaclPresent,
-    IN PACL Dacl OPTIONAL,
-    IN BOOLEAN DaclDefaulted OPTIONAL);
 
-/* VOID
- * RtlStoreUlong(
- *     IN PULONG Address,
- *     IN ULONG Value);
- */
-#if defined(_AMD64_)
-#define RtlStoreUlong(Address,Value) \
-    *(ULONG UNALIGNED *)(Address) = (Value)
-#else
-#define RtlStoreUlong(Address,Value)                      \
-    if ((ULONG_PTR)(Address) & LONG_MASK) { \
-        ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT]    = (UCHAR)(FIRSTBYTE(Value)); \
-        ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
-        ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
-        ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT]     = (UCHAR)(FOURTHBYTE(Value)); \
-    } \
-    else { \
-        *((PULONG)(Address)) = (ULONG) (Value); \
-    }
-#endif
+/******************************************************************************
+ *                            Power Management Support Types                  *
+ ******************************************************************************/
 
-/* VOID
- * RtlStoreUlonglong(
- *     IN OUT PULONGLONG Address,
- *     ULONGLONG Value);
- */
-#if defined(_AMD64_)
-#define RtlStoreUlonglong(Address,Value) \
-    *(ULONGLONG UNALIGNED *)(Address) = (Value)
-#else
-#define RtlStoreUlonglong(Address,Value) \
-    if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
-        RtlStoreUlong((ULONG_PTR)(Address), \
-                      (ULONGLONG)(Value) & 0xFFFFFFFF); \
-        RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
-                      (ULONGLONG)(Value) >> 32); \
-    } else { \
-        *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
-    }
-#endif
+#ifndef _PO_DDK_
+#define _PO_DDK_
 
-/* VOID
- * RtlStoreUlongPtr(
- *     IN OUT PULONG_PTR Address,
- *     IN ULONG_PTR Value);
- */
-#ifdef _WIN64
-#define RtlStoreUlongPtr(Address,Value)                         \
-    RtlStoreUlonglong(Address,Value)
-#else
-#define RtlStoreUlongPtr(Address,Value)                         \
-    RtlStoreUlong(Address,Value)
-#endif
+/* Power States/Levels */
+typedef enum _SYSTEM_POWER_STATE {
+    PowerSystemUnspecified,
+    PowerSystemWorking,
+    PowerSystemSleeping1,
+    PowerSystemSleeping2,
+    PowerSystemSleeping3,
+    PowerSystemHibernate,
+    PowerSystemShutdown,
+    PowerSystemMaximum
+} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
 
-/* VOID
- * RtlStoreUshort(
- *     IN PUSHORT Address,
- *     IN USHORT Value);
- */
-#if defined(_AMD64_)
-#define RtlStoreUshort(Address,Value) \
-    *(USHORT UNALIGNED *)(Address) = (Value)
-#else
-#define RtlStoreUshort(Address,Value) \
-    if ((ULONG_PTR)(Address) & SHORT_MASK) { \
-        ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
-        ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
-    } \
-    else { \
-        *((PUSHORT) (Address)) = (USHORT)Value; \
-    }
-#endif
+#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
 
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlTimeFieldsToTime(
-    IN PTIME_FIELDS TimeFields,
-    IN PLARGE_INTEGER Time);
+typedef enum _POWER_INFORMATION_LEVEL {
+    SystemPowerPolicyAc,
+    SystemPowerPolicyDc,
+    VerifySystemPolicyAc,
+    VerifySystemPolicyDc,
+    SystemPowerCapabilities,
+    SystemBatteryState,
+    SystemPowerStateHandler,
+    ProcessorStateHandler,
+    SystemPowerPolicyCurrent,
+    AdministratorPowerPolicy,
+    SystemReserveHiberFile,
+    ProcessorInformation,
+    SystemPowerInformation,
+    ProcessorStateHandler2,
+    LastWakeTime,
+    LastSleepTime,
+    SystemExecutionState,
+    SystemPowerStateNotifyHandler,
+    ProcessorPowerPolicyAc,
+    ProcessorPowerPolicyDc,
+    VerifyProcessorPowerPolicyAc,
+    VerifyProcessorPowerPolicyDc,
+    ProcessorPowerPolicyCurrent,
+    SystemPowerStateLogging,
+    SystemPowerLoggingEntry,
+    SetPowerSettingValue,
+    NotifyUserPowerSetting,
+    PowerInformationLevelUnused0,
+    PowerInformationLevelUnused1,
+    SystemVideoState,
+    TraceApplicationPowerMessage,
+    TraceApplicationPowerMessageEnd,
+    ProcessorPerfStates,
+    ProcessorIdleStates,
+    ProcessorCap,
+    SystemWakeSource,
+    SystemHiberFileInformation,
+    TraceServicePowerMessage,
+    ProcessorLoad,
+    PowerShutdownNotification,
+    MonitorCapabilities,
+    SessionPowerInit,
+    SessionDisplayState,
+    PowerRequestCreate,
+    PowerRequestAction,
+    GetPowerRequestList,
+    ProcessorInformationEx,
+    NotifyUserModeLegacyPowerEvent,
+    GroupPark,
+    ProcessorIdleDomains,
+    WakeTimerList,
+    SystemHiberFileSize,
+    PowerInformationLevelMaximum
+} POWER_INFORMATION_LEVEL;
 
-NTSYSAPI
-VOID
-NTAPI
-RtlTimeToTimeFields(
-    IN PLARGE_INTEGER Time,
-    IN PTIME_FIELDS TimeFields);
+typedef enum {
+    PowerActionNone,
+    PowerActionReserved,
+    PowerActionSleep,
+    PowerActionHibernate,
+    PowerActionShutdown,
+    PowerActionShutdownReset,
+    PowerActionShutdownOff,
+    PowerActionWarmEject
+} POWER_ACTION, *PPOWER_ACTION;
 
-NTSYSAPI
-ULONG
-FASTCALL
-RtlUlongByteSwap(
-    IN ULONG Source);
+typedef enum _DEVICE_POWER_STATE {
+    PowerDeviceUnspecified,
+    PowerDeviceD0,
+    PowerDeviceD1,
+    PowerDeviceD2,
+    PowerDeviceD3,
+    PowerDeviceMaximum
+} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
 
-NTSYSAPI
-ULONGLONG
-FASTCALL
-RtlUlonglongByteSwap(
-    IN ULONGLONG Source);
+typedef union _POWER_STATE {
+  SYSTEM_POWER_STATE  SystemState;
+  DEVICE_POWER_STATE  DeviceState;
+} POWER_STATE, *PPOWER_STATE;
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUnicodeStringToAnsiString(
-    IN OUT PANSI_STRING DestinationString,
-    IN PCUNICODE_STRING SourceString,
-    IN BOOLEAN AllocateDestinationString);
+typedef enum _POWER_STATE_TYPE {
+  SystemPowerState = 0,
+  DevicePowerState
+} POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
 
-NTSYSAPI
-ULONG
-NTAPI
-RtlxUnicodeStringToAnsiSize(
-    IN PCUNICODE_STRING UnicodeString);
+#if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
+typedef struct {
+    ULONG Granularity;
+    ULONG Capacity;
+} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
 
-#define RtlUnicodeStringToAnsiSize(String) (                  \
-    NLS_MB_CODE_PAGE_TAG ?                                    \
-    RtlxUnicodeStringToAnsiSize(String) :                     \
-    ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
-)
+#endif /* !_PO_DDK_ */
 
-NTSYSAPI
+typedef VOID
+(DDKAPI *PREQUEST_POWER_COMPLETE)(
+  IN struct _DEVICE_OBJECT *DeviceObject,
+  IN UCHAR MinorFunction,
+  IN POWER_STATE PowerState,
+  IN PVOID Context,
+  IN struct _IO_STATUS_BLOCK *IoStatus);
+
+typedef
 NTSTATUS
-NTAPI
-RtlUnicodeStringToInteger(
-    IN PCUNICODE_STRING String,
-    IN ULONG Base OPTIONAL,
-    OUT PULONG Value);
+(DDKAPI POWER_SETTING_CALLBACK)(
+  IN LPCGUID SettingGuid,
+  IN PVOID Value,
+  IN ULONG ValueLength,
+  IN OUT PVOID Context OPTIONAL);
 
-NTSYSAPI
-WCHAR
-NTAPI
-RtlUpcaseUnicodeChar(
-    IN WCHAR SourceCharacter);
+typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
 
-NTSYSAPI
-USHORT
-FASTCALL
-RtlUshortByteSwap(
-    IN USHORT Source);
+#define PO_CB_SYSTEM_POWER_POLICY       0
+#define PO_CB_AC_STATUS                 1
+#define PO_CB_BUTTON_COLLISION          2
+#define PO_CB_SYSTEM_STATE_LOCK         3
+#define PO_CB_LID_SWITCH_STATE          4
+#define PO_CB_PROCESSOR_POWER_POLICY    5
 
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlValidRelativeSecurityDescriptor(
-    IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
-    IN ULONG SecurityDescriptorLength,
-    IN SECURITY_INFORMATION RequiredInformation);
+/******************************************************************************
+ *                            Configuration Manager Types                     *
+ ******************************************************************************/
 
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlValidSecurityDescriptor(
-    IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+/* Resource list definitions */
+typedef int CM_RESOURCE_TYPE;
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlWriteRegistryValue(
-    IN ULONG RelativeTo,
-    IN PCWSTR Path,
-    IN PCWSTR ValueName,
-    IN ULONG ValueType,
-    IN PVOID ValueData,
-    IN ULONG ValueLength);
+#define CmResourceTypeNull              0
+#define CmResourceTypePort              1
+#define CmResourceTypeInterrupt         2
+#define CmResourceTypeMemory            3
+#define CmResourceTypeDma               4
+#define CmResourceTypeDeviceSpecific    5
+#define CmResourceTypeBusNumber         6
+#define CmResourceTypeNonArbitrated      128
+#define CmResourceTypeConfigData         128
+#define CmResourceTypeDevicePrivate      129
+#define CmResourceTypePcCardConfig       130
+#define CmResourceTypeMfCardConfig       131
 
-#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
+/* KEY_VALUE_Xxx.Type */
+#define REG_NONE                           0
+#define REG_SZ                             1
+#define REG_EXPAND_SZ                      2
+#define REG_BINARY                         3
+#define REG_DWORD                          4
+#define REG_DWORD_LITTLE_ENDIAN            4
+#define REG_DWORD_BIG_ENDIAN               5
+#define REG_LINK                           6
+#define REG_MULTI_SZ                       7
+#define REG_RESOURCE_LIST                  8
+#define REG_FULL_RESOURCE_DESCRIPTOR       9
+#define REG_RESOURCE_REQUIREMENTS_LIST    10
+#define REG_QWORD                         11
+#define REG_QWORD_LITTLE_ENDIAN           11
+
+/* Registry Access Rights */
+#define KEY_QUERY_VALUE         (0x0001)
+#define KEY_SET_VALUE           (0x0002)
+#define KEY_CREATE_SUB_KEY      (0x0004)
+#define KEY_ENUMERATE_SUB_KEYS  (0x0008)
+#define KEY_NOTIFY              (0x0010)
+#define KEY_CREATE_LINK         (0x0020)
+#define KEY_WOW64_32KEY         (0x0200)
+#define KEY_WOW64_64KEY         (0x0100)
+#define KEY_WOW64_RES           (0x0300)
 
-#if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
-NTSYSAPI
-VOID
-FASTCALL
-RtlPrefetchMemoryNonTemporal(
+#define KEY_READ                ((STANDARD_RIGHTS_READ       |\
+                                  KEY_QUERY_VALUE            |\
+                                  KEY_ENUMERATE_SUB_KEYS     |\
+                                  KEY_NOTIFY)                 \
+                                  &                           \
+                                 (~SYNCHRONIZE))
+
+#define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\
+                                  KEY_SET_VALUE              |\
+                                  KEY_CREATE_SUB_KEY)         \
+                                  &                           \
+                                 (~SYNCHRONIZE))
+
+#define KEY_EXECUTE             ((KEY_READ)                   \
+                                  &                           \
+                                 (~SYNCHRONIZE))
+
+#define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\
+                                  KEY_QUERY_VALUE            |\
+                                  KEY_SET_VALUE              |\
+                                  KEY_CREATE_SUB_KEY         |\
+                                  KEY_ENUMERATE_SUB_KEYS     |\
+                                  KEY_NOTIFY                 |\
+                                  KEY_CREATE_LINK)            \
+                                  &                           \
+                                 (~SYNCHRONIZE))
+
+/* Registry Open/Create Options */
+#define REG_OPTION_RESERVED         (0x00000000L)
+#define REG_OPTION_NON_VOLATILE     (0x00000000L)
+#define REG_OPTION_VOLATILE         (0x00000001L)
+#define REG_OPTION_CREATE_LINK      (0x00000002L)
+#define REG_OPTION_BACKUP_RESTORE   (0x00000004L)
+#define REG_OPTION_OPEN_LINK        (0x00000008L)
+
+#define REG_LEGAL_OPTION            \
+                (REG_OPTION_RESERVED            |\
+                 REG_OPTION_NON_VOLATILE        |\
+                 REG_OPTION_VOLATILE            |\
+                 REG_OPTION_CREATE_LINK         |\
+                 REG_OPTION_BACKUP_RESTORE      |\
+                 REG_OPTION_OPEN_LINK)
+
+/* Key creation/open disposition */
+#define REG_CREATED_NEW_KEY         (0x00000001L)
+#define REG_OPENED_EXISTING_KEY     (0x00000002L)
+
+/* Key restore & hive load flags */
+#define REG_WHOLE_HIVE_VOLATILE         (0x00000001L)
+#define REG_REFRESH_HIVE                (0x00000002L)
+#define REG_NO_LAZY_FLUSH               (0x00000004L)
+#define REG_FORCE_RESTORE               (0x00000008L)
+#define REG_APP_HIVE                    (0x00000010L)
+#define REG_PROCESS_PRIVATE             (0x00000020L)
+#define REG_START_JOURNAL               (0x00000040L)
+#define REG_HIVE_EXACT_FILE_GROWTH      (0x00000080L)
+#define REG_HIVE_NO_RM                  (0x00000100L)
+#define REG_HIVE_SINGLE_LOG             (0x00000200L)
+
+/* Unload Flags */
+#define REG_FORCE_UNLOAD            1
+
+/* Notify Filter Values */
+#define REG_NOTIFY_CHANGE_NAME          (0x00000001L)
+#define REG_NOTIFY_CHANGE_ATTRIBUTES    (0x00000002L)
+#define REG_NOTIFY_CHANGE_LAST_SET      (0x00000004L)
+#define REG_NOTIFY_CHANGE_SECURITY      (0x00000008L)
+
+#define REG_LEGAL_CHANGE_FILTER                 \
+                (REG_NOTIFY_CHANGE_NAME          |\
+                 REG_NOTIFY_CHANGE_ATTRIBUTES    |\
+                 REG_NOTIFY_CHANGE_LAST_SET      |\
+                 REG_NOTIFY_CHANGE_SECURITY)
+
+typedef struct _CM_FLOPPY_DEVICE_DATA {
+  USHORT  Version;
+  USHORT  Revision;
+  CHAR  Size[8];
+  ULONG  MaxDensity;
+  ULONG  MountDensity;
+  UCHAR  StepRateHeadUnloadTime;
+  UCHAR  HeadLoadTime;
+  UCHAR  MotorOffTime;
+  UCHAR  SectorLengthCode;
+  UCHAR  SectorPerTrack;
+  UCHAR  ReadWriteGapLength;
+  UCHAR  DataTransferLength;
+  UCHAR  FormatGapLength;
+  UCHAR  FormatFillCharacter;
+  UCHAR  HeadSettleTime;
+  UCHAR  MotorSettleTime;
+  UCHAR  MaximumTrackValue;
+  UCHAR  DataTransferRate;
+} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
+
+#include <pshpack4.h>
+typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
+  UCHAR Type;
+  UCHAR ShareDisposition;
+  USHORT Flags;
+  union {
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length;
+    } Generic;
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length;
+    } Port;
+    struct {
+#if defined(NT_PROCESSOR_GROUPS)
+      USHORT Level;
+      USHORT Group;
+#else
+      ULONG Level;
+#endif
+      ULONG Vector;
+      KAFFINITY Affinity;
+    } Interrupt;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    struct {
+      __GNU_EXTENSION union {
+        struct {
+#if defined(NT_PROCESSOR_GROUPS)
+          USHORT Group;
+#else
+          USHORT Reserved;
+#endif
+          USHORT MessageCount;
+          ULONG Vector;
+          KAFFINITY Affinity;
+        } Raw;
+        struct {
+#if defined(NT_PROCESSOR_GROUPS)
+          USHORT Level;
+          USHORT Group;
+#else
+          ULONG Level;
+#endif
+          ULONG Vector;
+          KAFFINITY Affinity;
+        } Translated;
+      } DUMMYUNIONNAME;
+    } MessageInterrupt;
+#endif
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length;
+    } Memory;
+    struct {
+      ULONG Channel;
+      ULONG Port;
+      ULONG Reserved1;
+    } Dma;
+    struct {
+      ULONG Data[3];
+    } DevicePrivate;
+    struct {
+      ULONG Start;
+      ULONG Length;
+      ULONG Reserved;
+    } BusNumber;
+    struct {
+      ULONG DataSize;
+      ULONG Reserved1;
+      ULONG Reserved2;
+    } DeviceSpecificData;
+#if (NTDDI_VERSION >= NTDDI_LONGHORN)
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length40;
+    } Memory40;
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length48;
+    } Memory48;
+    struct {
+      PHYSICAL_ADDRESS Start;
+      ULONG Length64;
+    } Memory64;
+#endif
+  } u;
+} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
+#include <poppack.h>
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
+#define CmResourceTypeNull                0
+#define CmResourceTypePort                1
+#define CmResourceTypeInterrupt           2
+#define CmResourceTypeMemory              3
+#define CmResourceTypeDma                 4
+#define CmResourceTypeDeviceSpecific      5
+#define CmResourceTypeBusNumber           6
+#define CmResourceTypeMemoryLarge         7
+#define CmResourceTypeNonArbitrated     128
+#define CmResourceTypeConfigData        128
+#define CmResourceTypeDevicePrivate     129
+#define CmResourceTypePcCardConfig      130
+#define CmResourceTypeMfCardConfig      131
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
+typedef enum _CM_SHARE_DISPOSITION {
+  CmResourceShareUndetermined,
+  CmResourceShareDeviceExclusive,
+  CmResourceShareDriverExclusive,
+  CmResourceShareShared
+} CM_SHARE_DISPOSITION;
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
+#define CM_RESOURCE_PORT_MEMORY           0x0000
+#define CM_RESOURCE_PORT_IO               0x0001
+#define CM_RESOURCE_PORT_10_BIT_DECODE    0x0004
+#define CM_RESOURCE_PORT_12_BIT_DECODE    0x0008
+#define CM_RESOURCE_PORT_16_BIT_DECODE    0x0010
+#define CM_RESOURCE_PORT_POSITIVE_DECODE  0x0020
+#define CM_RESOURCE_PORT_PASSIVE_DECODE   0x0040
+#define CM_RESOURCE_PORT_WINDOW_DECODE    0x0080
+#define CM_RESOURCE_PORT_BAR              0x0100
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
+#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
+#define CM_RESOURCE_INTERRUPT_LATCHED         0x0001
+#define CM_RESOURCE_INTERRUPT_MESSAGE         0x0002
+#define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
+#define CM_RESOURCE_MEMORY_READ_WRITE                    0x0000
+#define CM_RESOURCE_MEMORY_READ_ONLY                     0x0001
+#define CM_RESOURCE_MEMORY_WRITE_ONLY                    0x0002
+#define CM_RESOURCE_MEMORY_WRITEABILITY_MASK             0x0003
+#define CM_RESOURCE_MEMORY_PREFETCHABLE                  0x0004
+#define CM_RESOURCE_MEMORY_COMBINEDWRITE                 0x0008
+#define CM_RESOURCE_MEMORY_24                            0x0010
+#define CM_RESOURCE_MEMORY_CACHEABLE                     0x0020
+#define CM_RESOURCE_MEMORY_WINDOW_DECODE                 0x0040
+#define CM_RESOURCE_MEMORY_BAR                           0x0080
+#define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
+
+/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
+#define CM_RESOURCE_DMA_8                 0x0000
+#define CM_RESOURCE_DMA_16                0x0001
+#define CM_RESOURCE_DMA_32                0x0002
+#define CM_RESOURCE_DMA_8_AND_16          0x0004
+#define CM_RESOURCE_DMA_BUS_MASTER        0x0008
+#define CM_RESOURCE_DMA_TYPE_A            0x0010
+#define CM_RESOURCE_DMA_TYPE_B            0x0020
+#define CM_RESOURCE_DMA_TYPE_F            0x0040
+
+typedef struct _CM_PARTIAL_RESOURCE_LIST {
+  USHORT  Version;
+  USHORT  Revision;
+  ULONG  Count;
+  CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
+} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
+
+typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
+  INTERFACE_TYPE  InterfaceType;
+  ULONG  BusNumber;
+  CM_PARTIAL_RESOURCE_LIST  PartialResourceList;
+} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
+
+typedef struct _CM_RESOURCE_LIST {
+  ULONG  Count;
+  CM_FULL_RESOURCE_DESCRIPTOR  List[1];
+} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
+
+#include <pshpack1.h>
+typedef struct _CM_INT13_DRIVE_PARAMETER {
+  USHORT  DriveSelect;
+  ULONG  MaxCylinders;
+  USHORT  SectorsPerTrack;
+  USHORT  MaxHeads;
+  USHORT  NumberDrives;
+} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
+
+typedef struct _CM_PNP_BIOS_DEVICE_NODE {
+  USHORT Size;
+  UCHAR Node;
+  ULONG ProductId;
+  UCHAR DeviceType[3];
+  USHORT DeviceAttributes;
+} CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
+
+typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
+  UCHAR Signature[4];
+  UCHAR Revision;
+  UCHAR Length;
+  USHORT ControlField;
+  UCHAR Checksum;
+  ULONG EventFlagAddress;
+  USHORT RealModeEntryOffset;
+  USHORT RealModeEntrySegment;
+  USHORT ProtectedModeEntryOffset;
+  ULONG ProtectedModeCodeBaseAddress;
+  ULONG OemDeviceId;
+  USHORT RealModeDataBaseAddress;
+  ULONG ProtectedModeDataBaseAddress;
+} CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
+#include <poppack.h>
+
+typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
+    ULONG BytesPerSector;
+    ULONG NumberOfCylinders;
+    ULONG SectorsPerTrack;
+    ULONG NumberOfHeads;
+} CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
+
+typedef struct _CM_KEYBOARD_DEVICE_DATA {
+  USHORT  Version;
+  USHORT  Revision;
+  UCHAR  Type;
+  UCHAR  Subtype;
+  USHORT  KeyboardFlags;
+} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
+
+typedef struct _CM_MCA_POS_DATA {
+  USHORT  AdapterId;
+  UCHAR  PosData1;
+  UCHAR  PosData2;
+  UCHAR  PosData3;
+  UCHAR  PosData4;
+} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+typedef struct CM_Power_Data_s {
+  ULONG  PD_Size;
+  DEVICE_POWER_STATE  PD_MostRecentPowerState;
+  ULONG  PD_Capabilities;
+  ULONG  PD_D1Latency;
+  ULONG  PD_D2Latency;
+  ULONG  PD_D3Latency;
+  DEVICE_POWER_STATE  PD_PowerStateMapping[PowerSystemMaximum];
+  SYSTEM_POWER_STATE  PD_DeepestSystemWake;
+} CM_POWER_DATA, *PCM_POWER_DATA;
+
+#define PDCAP_D0_SUPPORTED                0x00000001
+#define PDCAP_D1_SUPPORTED                0x00000002
+#define PDCAP_D2_SUPPORTED                0x00000004
+#define PDCAP_D3_SUPPORTED                0x00000008
+#define PDCAP_WAKE_FROM_D0_SUPPORTED      0x00000010
+#define PDCAP_WAKE_FROM_D1_SUPPORTED      0x00000020
+#define PDCAP_WAKE_FROM_D2_SUPPORTED      0x00000040
+#define PDCAP_WAKE_FROM_D3_SUPPORTED      0x00000080
+#define PDCAP_WARM_EJECT_SUPPORTED        0x00000100
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+typedef struct _CM_SCSI_DEVICE_DATA {
+  USHORT  Version;
+  USHORT  Revision;
+  UCHAR  HostIdentifier;
+} CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
+
+typedef struct _CM_SERIAL_DEVICE_DATA {
+  USHORT  Version;
+  USHORT  Revision;
+  ULONG  BaudClock;
+} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
+
+typedef enum _KEY_INFORMATION_CLASS {
+  KeyBasicInformation,
+  KeyNodeInformation,
+  KeyFullInformation,
+  KeyNameInformation,
+  KeyCachedInformation,
+  KeyFlagsInformation
+} KEY_INFORMATION_CLASS;
+
+typedef struct _KEY_BASIC_INFORMATION {
+  LARGE_INTEGER  LastWriteTime;
+  ULONG  TitleIndex;
+  ULONG  NameLength;
+  WCHAR  Name[1];
+} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
+
+typedef struct _KEY_FULL_INFORMATION {
+  LARGE_INTEGER  LastWriteTime;
+  ULONG  TitleIndex;
+  ULONG  ClassOffset;
+  ULONG  ClassLength;
+  ULONG  SubKeys;
+  ULONG  MaxNameLen;
+  ULONG  MaxClassLen;
+  ULONG  Values;
+  ULONG  MaxValueNameLen;
+  ULONG  MaxValueDataLen;
+  WCHAR  Class[1];
+} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
+
+typedef struct _KEY_NODE_INFORMATION {
+  LARGE_INTEGER  LastWriteTime;
+  ULONG  TitleIndex;
+  ULONG  ClassOffset;
+  ULONG  ClassLength;
+  ULONG  NameLength;
+  WCHAR  Name[1];
+} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
+
+typedef struct _KEY_VALUE_BASIC_INFORMATION {
+  ULONG  TitleIndex;
+  ULONG  Type;
+  ULONG  NameLength;
+  WCHAR  Name[1];
+} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
+
+typedef struct _KEY_VALUE_FULL_INFORMATION {
+  ULONG  TitleIndex;
+  ULONG  Type;
+  ULONG  DataOffset;
+  ULONG  DataLength;
+  ULONG  NameLength;
+  WCHAR  Name[1];
+} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
+
+typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
+  ULONG  TitleIndex;
+  ULONG  Type;
+  ULONG  DataLength;
+  UCHAR  Data[1];
+} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
+
+typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
+  ULONG  Type;
+  ULONG  DataLength;
+  UCHAR  Data[1];
+} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
+
+typedef struct _KEY_VALUE_ENTRY {
+  PUNICODE_STRING  ValueName;
+  ULONG  DataLength;
+  ULONG  DataOffset;
+  ULONG  Type;
+} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
+
+typedef enum _KEY_VALUE_INFORMATION_CLASS {
+  KeyValueBasicInformation,
+  KeyValueFullInformation,
+  KeyValuePartialInformation,
+  KeyValueFullInformationAlign64,
+  KeyValuePartialInformationAlign64
+} KEY_VALUE_INFORMATION_CLASS;
+
+typedef struct _KEY_WRITE_TIME_INFORMATION {
+  LARGE_INTEGER  LastWriteTime;
+} KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
+
+typedef enum _KEY_SET_INFORMATION_CLASS {
+  KeyWriteTimeInformation,
+  KeyWow64FlagsInformation,
+  KeyControlFlagsInformation,
+  KeySetVirtualizationInformation,
+  KeySetDebugInformation,
+  KeySetHandleTagsInformation,
+  MaxKeySetInfoClass
+} KEY_SET_INFORMATION_CLASS;
+
+typedef enum _REG_NOTIFY_CLASS {
+  RegNtDeleteKey,
+  RegNtPreDeleteKey = RegNtDeleteKey,
+  RegNtSetValueKey,
+  RegNtPreSetValueKey = RegNtSetValueKey,
+  RegNtDeleteValueKey,
+  RegNtPreDeleteValueKey = RegNtDeleteValueKey,
+  RegNtSetInformationKey,
+  RegNtPreSetInformationKey = RegNtSetInformationKey,
+  RegNtRenameKey,
+  RegNtPreRenameKey = RegNtRenameKey,
+  RegNtEnumerateKey,
+  RegNtPreEnumerateKey = RegNtEnumerateKey,
+  RegNtEnumerateValueKey,
+  RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
+  RegNtQueryKey,
+  RegNtPreQueryKey = RegNtQueryKey,
+  RegNtQueryValueKey,
+  RegNtPreQueryValueKey = RegNtQueryValueKey,
+  RegNtQueryMultipleValueKey,
+  RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
+  RegNtPreCreateKey,
+  RegNtPostCreateKey,
+  RegNtPreOpenKey,
+  RegNtPostOpenKey,
+  RegNtKeyHandleClose,
+  RegNtPreKeyHandleClose = RegNtKeyHandleClose,
+  RegNtPostDeleteKey,
+  RegNtPostSetValueKey,
+  RegNtPostDeleteValueKey,
+  RegNtPostSetInformationKey,
+  RegNtPostRenameKey,
+  RegNtPostEnumerateKey,
+  RegNtPostEnumerateValueKey,
+  RegNtPostQueryKey,
+  RegNtPostQueryValueKey,
+  RegNtPostQueryMultipleValueKey,
+  RegNtPostKeyHandleClose,
+  RegNtPreCreateKeyEx,
+  RegNtPostCreateKeyEx,
+  RegNtPreOpenKeyEx,
+  RegNtPostOpenKeyEx,
+  RegNtPreFlushKey,
+  RegNtPostFlushKey,
+  RegNtPreLoadKey,
+  RegNtPostLoadKey,
+  RegNtPreUnLoadKey,
+  RegNtPostUnLoadKey,
+  RegNtPreQueryKeySecurity,
+  RegNtPostQueryKeySecurity,
+  RegNtPreSetKeySecurity,
+  RegNtPostSetKeySecurity,
+  RegNtCallbackObjectContextCleanup,
+  RegNtPreRestoreKey,
+  RegNtPostRestoreKey,
+  RegNtPreSaveKey,
+  RegNtPostSaveKey,
+  RegNtPreReplaceKey,
+  RegNtPostReplaceKey,
+  MaxRegNtNotifyClass
+} REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
+
+typedef NTSTATUS
+(NTAPI *PEX_CALLBACK_FUNCTION)(
+    IN PVOID CallbackContext,
+    IN PVOID Argument1,
+    IN PVOID Argument2
+);
+
+typedef struct _REG_DELETE_KEY_INFORMATION {
+  PVOID Object;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+, REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
+#endif
+;
+
+typedef struct _REG_SET_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  PUNICODE_STRING ValueName;
+  ULONG TitleIndex;
+  ULONG Type;
+  PVOID Data;
+  ULONG DataSize;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  PUNICODE_STRING ValueName;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
+  PVOID Object;
+  KEY_SET_INFORMATION_CLASS KeySetInformationClass;
+  PVOID KeySetInformation;
+  ULONG KeySetInformationLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
+
+typedef struct _REG_ENUMERATE_KEY_INFORMATION {
+  PVOID Object;
+  ULONG Index;
+  KEY_INFORMATION_CLASS KeyInformationClass;
+  PVOID KeyInformation;
+  ULONG Length;
+  PULONG ResultLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
+
+typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  ULONG Index;
+  KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
+  PVOID KeyValueInformation;
+  ULONG Length;
+  PULONG ResultLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_QUERY_KEY_INFORMATION {
+  PVOID Object;
+  KEY_INFORMATION_CLASS KeyInformationClass;
+  PVOID KeyInformation;
+  ULONG Length;
+  PULONG ResultLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
+
+typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  PUNICODE_STRING ValueName;
+  KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
+  PVOID KeyValueInformation;
+  ULONG Length;
+  PULONG ResultLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
+  PVOID Object;
+  PKEY_VALUE_ENTRY ValueEntries;
+  ULONG EntryCount;
+  PVOID ValueBuffer;
+  PULONG BufferLength;
+  PULONG RequiredBufferLength;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
+
+typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
+  PUNICODE_STRING CompleteName;
+} REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;;
+
+typedef struct _REG_POST_CREATE_KEY_INFORMATION {
+  PUNICODE_STRING CompleteName;
+  PVOID Object;
+  NTSTATUS Status;
+} REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
+
+typedef struct _REG_POST_OPERATION_INFORMATION {
+  PVOID Object;
+  NTSTATUS Status;
+  PVOID PreInformation;
+  NTSTATUS ReturnStatus;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
+
+typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
+  PVOID Object;
+  PVOID CallContext;
+  PVOID ObjectContext;
+  PVOID Reserved;
+} REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
+
+/******************************************************************************
+ *                         I/O Manager Types                                  *
+ ******************************************************************************/
+
+ /* PCI_COMMON_CONFIG.Command */
+#define PCI_ENABLE_IO_SPACE               0x0001
+#define PCI_ENABLE_MEMORY_SPACE           0x0002
+#define PCI_ENABLE_BUS_MASTER             0x0004
+#define PCI_ENABLE_SPECIAL_CYCLES         0x0008
+#define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
+#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
+#define PCI_ENABLE_PARITY                 0x0040
+#define PCI_ENABLE_WAIT_CYCLE             0x0080
+#define PCI_ENABLE_SERR                   0x0100
+#define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
+#define PCI_DISABLE_LEVEL_INTERRUPT       0x0400
+
+/* PCI_COMMON_CONFIG.Status */
+#define PCI_STATUS_INTERRUPT_PENDING      0x0008
+#define PCI_STATUS_CAPABILITIES_LIST      0x0010
+#define PCI_STATUS_66MHZ_CAPABLE          0x0020
+#define PCI_STATUS_UDF_SUPPORTED          0x0040
+#define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
+#define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
+#define PCI_STATUS_DEVSEL                 0x0600
+#define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
+#define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
+#define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
+#define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
+#define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
+
+/* PCI_COMMON_CONFIG.HeaderType */
+#define PCI_MULTIFUNCTION                 0x80
+#define PCI_DEVICE_TYPE                   0x00
+#define PCI_BRIDGE_TYPE                   0x01
+#define PCI_CARDBUS_BRIDGE_TYPE           0x02
+
+#define PCI_CONFIGURATION_TYPE(PciData) \
+  (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
+
+#define PCI_MULTIFUNCTION_DEVICE(PciData) \
+  ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
+
+/* PCI device classes */
+#define PCI_CLASS_PRE_20                    0x00
+#define PCI_CLASS_MASS_STORAGE_CTLR         0x01
+#define PCI_CLASS_NETWORK_CTLR              0x02
+#define PCI_CLASS_DISPLAY_CTLR              0x03
+#define PCI_CLASS_MULTIMEDIA_DEV            0x04
+#define PCI_CLASS_MEMORY_CTLR               0x05
+#define PCI_CLASS_BRIDGE_DEV                0x06
+#define PCI_CLASS_SIMPLE_COMMS_CTLR         0x07
+#define PCI_CLASS_BASE_SYSTEM_DEV           0x08
+#define PCI_CLASS_INPUT_DEV                 0x09
+#define PCI_CLASS_DOCKING_STATION           0x0a
+#define PCI_CLASS_PROCESSOR                 0x0b
+#define PCI_CLASS_SERIAL_BUS_CTLR           0x0c
+#define PCI_CLASS_WIRELESS_CTLR             0x0d
+#define PCI_CLASS_INTELLIGENT_IO_CTLR       0x0e
+#define PCI_CLASS_SATELLITE_COMMS_CTLR      0x0f
+#define PCI_CLASS_ENCRYPTION_DECRYPTION     0x10
+#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC      0x11
+
+/* PCI device subclasses for class 0 */
+#define PCI_SUBCLASS_PRE_20_NON_VGA         0x00
+#define PCI_SUBCLASS_PRE_20_VGA             0x01
+
+/* PCI device subclasses for class 1 (mass storage controllers)*/
+#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR      0x00
+#define PCI_SUBCLASS_MSC_IDE_CTLR           0x01
+#define PCI_SUBCLASS_MSC_FLOPPY_CTLR        0x02
+#define PCI_SUBCLASS_MSC_IPI_CTLR           0x03
+#define PCI_SUBCLASS_MSC_RAID_CTLR          0x04
+#define PCI_SUBCLASS_MSC_OTHER              0x80
+
+/* PCI device subclasses for class 2 (network controllers)*/
+#define PCI_SUBCLASS_NET_ETHERNET_CTLR      0x00
+#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR    0x01
+#define PCI_SUBCLASS_NET_FDDI_CTLR          0x02
+#define PCI_SUBCLASS_NET_ATM_CTLR           0x03
+#define PCI_SUBCLASS_NET_ISDN_CTLR          0x04
+#define PCI_SUBCLASS_NET_OTHER              0x80
+
+/* PCI device subclasses for class 3 (display controllers)*/
+#define PCI_SUBCLASS_VID_VGA_CTLR           0x00
+#define PCI_SUBCLASS_VID_XGA_CTLR           0x01
+#define PCI_SUBCLASS_VID_3D_CTLR            0x02
+#define PCI_SUBCLASS_VID_OTHER              0x80
+
+/* PCI device subclasses for class 4 (multimedia device)*/
+#define PCI_SUBCLASS_MM_VIDEO_DEV           0x00
+#define PCI_SUBCLASS_MM_AUDIO_DEV           0x01
+#define PCI_SUBCLASS_MM_TELEPHONY_DEV       0x02
+#define PCI_SUBCLASS_MM_OTHER               0x80
+
+/* PCI device subclasses for class 5 (memory controller)*/
+#define PCI_SUBCLASS_MEM_RAM                0x00
+#define PCI_SUBCLASS_MEM_FLASH              0x01
+#define PCI_SUBCLASS_MEM_OTHER              0x80
+
+/* PCI device subclasses for class 6 (bridge device)*/
+#define PCI_SUBCLASS_BR_HOST                0x00
+#define PCI_SUBCLASS_BR_ISA                 0x01
+#define PCI_SUBCLASS_BR_EISA                0x02
+#define PCI_SUBCLASS_BR_MCA                 0x03
+#define PCI_SUBCLASS_BR_PCI_TO_PCI          0x04
+#define PCI_SUBCLASS_BR_PCMCIA              0x05
+#define PCI_SUBCLASS_BR_NUBUS               0x06
+#define PCI_SUBCLASS_BR_CARDBUS             0x07
+#define PCI_SUBCLASS_BR_RACEWAY             0x08
+#define PCI_SUBCLASS_BR_OTHER               0x80
+
+/* PCI device subclasses for class C (serial bus controller)*/
+#define PCI_SUBCLASS_SB_IEEE1394            0x00
+#define PCI_SUBCLASS_SB_ACCESS              0x01
+#define PCI_SUBCLASS_SB_SSA                 0x02
+#define PCI_SUBCLASS_SB_USB                 0x03
+#define PCI_SUBCLASS_SB_FIBRE_CHANNEL       0x04
+#define PCI_SUBCLASS_SB_SMBUS               0x05
+
+#define PCI_MAX_DEVICES        32
+#define PCI_MAX_FUNCTION       8
+#define PCI_MAX_BRIDGE_NUMBER  0xFF
+#define PCI_INVALID_VENDORID   0xFFFF
+#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
+
+#define PCI_ADDRESS_IO_SPACE                0x00000001
+#define PCI_ADDRESS_MEMORY_TYPE_MASK        0x00000006
+#define PCI_ADDRESS_MEMORY_PREFETCHABLE     0x00000008
+#define PCI_ADDRESS_IO_ADDRESS_MASK         0xfffffffc
+#define PCI_ADDRESS_MEMORY_ADDRESS_MASK     0xfffffff0
+#define PCI_ADDRESS_ROM_ADDRESS_MASK        0xfffff800
+
+#define PCI_TYPE_32BIT 0
+#define PCI_TYPE_20BIT 2
+#define PCI_TYPE_64BIT 4
+
+#define POOL_COLD_ALLOCATION                256
+#define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE    8
+#define POOL_RAISE_IF_ALLOCATION_FAILURE    16
+
+#define PCI_TYPE0_ADDRESSES               6
+#define PCI_TYPE1_ADDRESSES               2
+#define PCI_TYPE2_ADDRESSES               5
+
+#define IO_TYPE_ADAPTER                 1
+#define IO_TYPE_CONTROLLER              2
+#define IO_TYPE_DEVICE                  3
+#define IO_TYPE_DRIVER                  4
+#define IO_TYPE_FILE                    5
+#define IO_TYPE_IRP                     6
+#define IO_TYPE_MASTER_ADAPTER          7
+#define IO_TYPE_OPEN_PACKET             8
+#define IO_TYPE_TIMER                   9
+#define IO_TYPE_VPB                     10
+#define IO_TYPE_ERROR_LOG               11
+#define IO_TYPE_ERROR_MESSAGE           12
+#define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
+
+#define IO_TYPE_CSQ_IRP_CONTEXT 1
+#define IO_TYPE_CSQ 2
+#define IO_TYPE_CSQ_EX 3
+
+/* IO_RESOURCE_DESCRIPTOR.Option */
+#define IO_RESOURCE_PREFERRED             0x01
+#define IO_RESOURCE_DEFAULT               0x02
+#define IO_RESOURCE_ALTERNATIVE           0x08
+
+/* DEVICE_OBJECT.Flags */
+#define DO_VERIFY_VOLUME                  0x00000002
+#define DO_BUFFERED_IO                    0x00000004
+#define DO_EXCLUSIVE                      0x00000008
+#define DO_DIRECT_IO                      0x00000010
+#define DO_MAP_IO_BUFFER                  0x00000020
+#define DO_DEVICE_INITIALIZING            0x00000080
+#define DO_SHUTDOWN_REGISTERED            0x00000800
+#define DO_BUS_ENUMERATED_DEVICE          0x00001000
+#define DO_POWER_PAGABLE                  0x00002000
+#define DO_POWER_INRUSH                   0x00004000
+
+/* DEVICE_OBJECT.Characteristics */
+#define FILE_REMOVABLE_MEDIA              0x00000001
+#define FILE_READ_ONLY_DEVICE             0x00000002
+#define FILE_FLOPPY_DISKETTE              0x00000004
+#define FILE_WRITE_ONCE_MEDIA             0x00000008
+#define FILE_REMOTE_DEVICE                0x00000010
+#define FILE_DEVICE_IS_MOUNTED            0x00000020
+#define FILE_VIRTUAL_VOLUME               0x00000040
+#define FILE_AUTOGENERATED_DEVICE_NAME    0x00000080
+#define FILE_DEVICE_SECURE_OPEN           0x00000100
+#define FILE_CHARACTERISTIC_PNP_DEVICE    0x00000800
+#define FILE_CHARACTERISTIC_TS_DEVICE     0x00001000
+#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
+
+/* DEVICE_OBJECT.AlignmentRequirement */
+#define FILE_BYTE_ALIGNMENT             0x00000000
+#define FILE_WORD_ALIGNMENT             0x00000001
+#define FILE_LONG_ALIGNMENT             0x00000003
+#define FILE_QUAD_ALIGNMENT             0x00000007
+#define FILE_OCTA_ALIGNMENT             0x0000000f
+#define FILE_32_BYTE_ALIGNMENT          0x0000001f
+#define FILE_64_BYTE_ALIGNMENT          0x0000003f
+#define FILE_128_BYTE_ALIGNMENT         0x0000007f
+#define FILE_256_BYTE_ALIGNMENT         0x000000ff
+#define FILE_512_BYTE_ALIGNMENT         0x000001ff
+
+/* DEVICE_OBJECT.DeviceType */
+#define DEVICE_TYPE ULONG
+
+#define FILE_DEVICE_BEEP                  0x00000001
+#define FILE_DEVICE_CD_ROM                0x00000002
+#define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
+#define FILE_DEVICE_CONTROLLER            0x00000004
+#define FILE_DEVICE_DATALINK              0x00000005
+#define FILE_DEVICE_DFS                   0x00000006
+#define FILE_DEVICE_DISK                  0x00000007
+#define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
+#define FILE_DEVICE_FILE_SYSTEM           0x00000009
+#define FILE_DEVICE_INPORT_PORT           0x0000000a
+#define FILE_DEVICE_KEYBOARD              0x0000000b
+#define FILE_DEVICE_MAILSLOT              0x0000000c
+#define FILE_DEVICE_MIDI_IN               0x0000000d
+#define FILE_DEVICE_MIDI_OUT              0x0000000e
+#define FILE_DEVICE_MOUSE                 0x0000000f
+#define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
+#define FILE_DEVICE_NAMED_PIPE            0x00000011
+#define FILE_DEVICE_NETWORK               0x00000012
+#define FILE_DEVICE_NETWORK_BROWSER       0x00000013
+#define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
+#define FILE_DEVICE_NULL                  0x00000015
+#define FILE_DEVICE_PARALLEL_PORT         0x00000016
+#define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
+#define FILE_DEVICE_PRINTER               0x00000018
+#define FILE_DEVICE_SCANNER               0x00000019
+#define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
+#define FILE_DEVICE_SERIAL_PORT           0x0000001b
+#define FILE_DEVICE_SCREEN                0x0000001c
+#define FILE_DEVICE_SOUND                 0x0000001d
+#define FILE_DEVICE_STREAMS               0x0000001e
+#define FILE_DEVICE_TAPE                  0x0000001f
+#define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
+#define FILE_DEVICE_TRANSPORT             0x00000021
+#define FILE_DEVICE_UNKNOWN               0x00000022
+#define FILE_DEVICE_VIDEO                 0x00000023
+#define FILE_DEVICE_VIRTUAL_DISK          0x00000024
+#define FILE_DEVICE_WAVE_IN               0x00000025
+#define FILE_DEVICE_WAVE_OUT              0x00000026
+#define FILE_DEVICE_8042_PORT             0x00000027
+#define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
+#define FILE_DEVICE_BATTERY               0x00000029
+#define FILE_DEVICE_BUS_EXTENDER          0x0000002a
+#define FILE_DEVICE_MODEM                 0x0000002b
+#define FILE_DEVICE_VDM                   0x0000002c
+#define FILE_DEVICE_MASS_STORAGE          0x0000002d
+#define FILE_DEVICE_SMB                   0x0000002e
+#define FILE_DEVICE_KS                    0x0000002f
+#define FILE_DEVICE_CHANGER               0x00000030
+#define FILE_DEVICE_SMARTCARD             0x00000031
+#define FILE_DEVICE_ACPI                  0x00000032
+#define FILE_DEVICE_DVD                   0x00000033
+#define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
+#define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
+#define FILE_DEVICE_DFS_VOLUME            0x00000036
+#define FILE_DEVICE_SERENUM               0x00000037
+#define FILE_DEVICE_TERMSRV               0x00000038
+#define FILE_DEVICE_KSEC                  0x00000039
+#define FILE_DEVICE_FIPS                  0x0000003A
+#define FILE_DEVICE_INFINIBAND            0x0000003B
+#define FILE_DEVICE_VMBUS                 0x0000003E
+#define FILE_DEVICE_CRYPT_PROVIDER        0x0000003F
+#define FILE_DEVICE_WPD                   0x00000040
+#define FILE_DEVICE_BLUETOOTH             0x00000041
+#define FILE_DEVICE_MT_COMPOSITE          0x00000042
+#define FILE_DEVICE_MT_TRANSPORT          0x00000043
+#define FILE_DEVICE_BIOMETRIC             0x00000044
+#define FILE_DEVICE_PMI                   0x00000045
+
+#define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
+
+typedef struct _OBJECT_HANDLE_INFORMATION {
+  ULONG HandleAttributes;
+  ACCESS_MASK GrantedAccess;
+} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
+
+typedef struct _CLIENT_ID {
+  HANDLE  UniqueProcess;
+  HANDLE  UniqueThread;
+} CLIENT_ID, *PCLIENT_ID;
+
+typedef VOID
+(DDKAPI *PKSTART_ROUTINE)(
+  IN PVOID  StartContext);
+
+typedef struct _VPB {
+  CSHORT  Type;
+  CSHORT  Size;
+  USHORT  Flags;
+  USHORT  VolumeLabelLength;
+  struct _DEVICE_OBJECT  *DeviceObject;
+  struct _DEVICE_OBJECT  *RealDevice;
+  ULONG  SerialNumber;
+  ULONG  ReferenceCount;
+  WCHAR  VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
+} VPB, *PVPB;
+
+typedef enum _IO_ALLOCATION_ACTION {
+  KeepObject = 1,
+  DeallocateObject,
+  DeallocateObjectKeepRegisters
+} IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
+
+typedef IO_ALLOCATION_ACTION
+(DDKAPI *PDRIVER_CONTROL)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp,
+  IN PVOID  MapRegisterBase,
+  IN PVOID  Context);
+
+typedef struct _WAIT_CONTEXT_BLOCK {
+  KDEVICE_QUEUE_ENTRY  WaitQueueEntry;
+  PDRIVER_CONTROL  DeviceRoutine;
+  PVOID  DeviceContext;
+  ULONG  NumberOfMapRegisters;
+  PVOID  DeviceObject;
+  PVOID  CurrentIrp;
+  PKDPC  BufferChainingDpc;
+} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
+
+typedef struct _DEVICE_OBJECT {
+  CSHORT  Type;
+  USHORT  Size;
+  LONG  ReferenceCount;
+  struct _DRIVER_OBJECT  *DriverObject;
+  struct _DEVICE_OBJECT  *NextDevice;
+  struct _DEVICE_OBJECT  *AttachedDevice;
+  struct _IRP  *CurrentIrp;
+  PIO_TIMER  Timer;
+  ULONG  Flags;
+  ULONG  Characteristics;
+  volatile PVPB  Vpb;
+  PVOID  DeviceExtension;
+  DEVICE_TYPE  DeviceType;
+  CCHAR  StackSize;
+  union {
+    LIST_ENTRY  ListEntry;
+    WAIT_CONTEXT_BLOCK  Wcb;
+  } Queue;
+  ULONG  AlignmentRequirement;
+  KDEVICE_QUEUE  DeviceQueue;
+  KDPC  Dpc;
+  ULONG  ActiveThreadCount;
+  PSECURITY_DESCRIPTOR  SecurityDescriptor;
+  KEVENT  DeviceLock;
+  USHORT  SectorSize;
+  USHORT  Spare1;
+  struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
+  PVOID  Reserved;
+} DEVICE_OBJECT, *PDEVICE_OBJECT;
+
+typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
+
+typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
+  BOOLEAN  Removed;
+  BOOLEAN  Reserved[3];
+  volatile LONG  IoCount;
+  KEVENT  RemoveEvent;
+} IO_REMOVE_LOCK_COMMON_BLOCK;
+
+typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
+  LONG  Signature;
+  LONG  HighWatermark;
+  LONGLONG  MaxLockedTicks;
+  LONG  AllocateTag;
+  LIST_ENTRY  LockList;
+  KSPIN_LOCK  Spin;
+  volatile LONG  LowMemoryCount;
+  ULONG  Reserved1[4];
+  PVOID  Reserved2;
+  PIO_REMOVE_LOCK_TRACKING_BLOCK  Blocks;
+} IO_REMOVE_LOCK_DBG_BLOCK;
+
+typedef struct _IO_REMOVE_LOCK {
+  IO_REMOVE_LOCK_COMMON_BLOCK  Common;
+#if DBG
+  IO_REMOVE_LOCK_DBG_BLOCK  Dbg;
+#endif
+} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
+
+typedef struct _IO_WORKITEM *PIO_WORKITEM;
+
+typedef VOID
+(DDKAPI IO_WORKITEM_ROUTINE)(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PVOID  Context);
+typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
+
+typedef struct _SHARE_ACCESS {
+  ULONG  OpenCount;
+  ULONG  Readers;
+  ULONG  Writers;
+  ULONG  Deleters;
+  ULONG  SharedRead;
+  ULONG  SharedWrite;
+  ULONG  SharedDelete;
+} SHARE_ACCESS, *PSHARE_ACCESS;
+
+/* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
+   inheritance, even from a struct renders the type non-POD. So we use
+   this hack */
+#define PCI_COMMON_HEADER_LAYOUT \
+  USHORT  VendorID; \
+  USHORT  DeviceID; \
+  USHORT  Command; \
+  USHORT  Status; \
+  UCHAR   RevisionID; \
+  UCHAR   ProgIf; \
+  UCHAR   SubClass; \
+  UCHAR   BaseClass; \
+  UCHAR   CacheLineSize; \
+  UCHAR   LatencyTimer; \
+  UCHAR   HeaderType; \
+  UCHAR   BIST; \
+  union { \
+    struct _PCI_HEADER_TYPE_0 { \
+      ULONG   BaseAddresses[PCI_TYPE0_ADDRESSES]; \
+      ULONG   CIS; \
+      USHORT  SubVendorID; \
+      USHORT  SubSystemID; \
+      ULONG   ROMBaseAddress; \
+      UCHAR   CapabilitiesPtr; \
+      UCHAR   Reserved1[3]; \
+      ULONG   Reserved2; \
+      UCHAR   InterruptLine; \
+      UCHAR   InterruptPin; \
+      UCHAR   MinimumGrant; \
+      UCHAR   MaximumLatency; \
+    } type0; \
+    struct _PCI_HEADER_TYPE_1 { \
+      ULONG   BaseAddresses[PCI_TYPE1_ADDRESSES]; \
+      UCHAR   PrimaryBus; \
+      UCHAR   SecondaryBus; \
+      UCHAR   SubordinateBus; \
+      UCHAR   SecondaryLatency; \
+      UCHAR   IOBase; \
+      UCHAR   IOLimit; \
+      USHORT  SecondaryStatus; \
+      USHORT  MemoryBase; \
+      USHORT  MemoryLimit; \
+      USHORT  PrefetchBase; \
+      USHORT  PrefetchLimit; \
+      ULONG   PrefetchBaseUpper32; \
+      ULONG   PrefetchLimitUpper32; \
+      USHORT  IOBaseUpper16; \
+      USHORT  IOLimitUpper16; \
+      UCHAR   CapabilitiesPtr; \
+      UCHAR   Reserved1[3]; \
+      ULONG   ROMBaseAddress; \
+      UCHAR   InterruptLine; \
+      UCHAR   InterruptPin; \
+      USHORT  BridgeControl; \
+    } type1; \
+    struct _PCI_HEADER_TYPE_2 { \
+      ULONG   SocketRegistersBaseAddress; \
+      UCHAR   CapabilitiesPtr; \
+      UCHAR   Reserved; \
+      USHORT  SecondaryStatus; \
+      UCHAR   PrimaryBus; \
+      UCHAR   SecondaryBus; \
+      UCHAR   SubordinateBus; \
+      UCHAR   SecondaryLatency; \
+      struct  { \
+        ULONG   Base; \
+        ULONG   Limit; \
+      } Range[PCI_TYPE2_ADDRESSES-1]; \
+      UCHAR   InterruptLine; \
+      UCHAR   InterruptPin; \
+      USHORT  BridgeControl; \
+    } type2; \
+  } u;
+
+typedef struct _PCI_COMMON_HEADER {
+  PCI_COMMON_HEADER_LAYOUT
+} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
+
+#ifdef __cplusplus
+typedef struct _PCI_COMMON_CONFIG {
+  PCI_COMMON_HEADER_LAYOUT
+  UCHAR  DeviceSpecific[192];
+} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
+#else
+typedef struct _PCI_COMMON_CONFIG {
+  PCI_COMMON_HEADER DUMMYSTRUCTNAME;
+  UCHAR  DeviceSpecific[192];
+} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
+#endif
+
+typedef enum _CREATE_FILE_TYPE {
+  CreateFileTypeNone,
+  CreateFileTypeNamedPipe,
+  CreateFileTypeMailslot
+} CREATE_FILE_TYPE;
+
+#define IO_FORCE_ACCESS_CHECK               0x001
+#define IO_NO_PARAMETER_CHECKING            0x100
+
+#define IO_REPARSE                      0x0
+#define IO_REMOUNT                      0x1
+
+typedef struct _IO_STATUS_BLOCK {
+  _ANONYMOUS_UNION union {
+    NTSTATUS  Status;
+    PVOID  Pointer;
+  } DUMMYUNIONNAME;
+  ULONG_PTR  Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef struct _PCI_SLOT_NUMBER {
+  union {
+    struct {
+      ULONG  DeviceNumber : 5;
+      ULONG  FunctionNumber : 3;
+      ULONG  Reserved : 24;
+    } bits;
+    ULONG  AsULONG;
+  } u;
+} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
+
+typedef VOID
+(DDKAPI *PIO_APC_ROUTINE)(
+  IN PVOID ApcContext,
+  IN PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG Reserved);
+
+typedef VOID
+(DDKAPI *WMI_NOTIFICATION_CALLBACK)(
+  PVOID  Wnode,
+  PVOID  Context);
+
+#define WMIREG_ACTION_REGISTER      1
+#define WMIREG_ACTION_DEREGISTER    2
+#define WMIREG_ACTION_REREGISTER    3
+#define WMIREG_ACTION_UPDATE_GUIDS  4
+#define WMIREG_ACTION_BLOCK_IRPS    5
+
+#define EVENT_INCREMENT                   1
+#define IO_NO_INCREMENT                   0
+#define IO_CD_ROM_INCREMENT               1
+#define IO_DISK_INCREMENT                 1
+#define IO_KEYBOARD_INCREMENT             6
+#define IO_MAILSLOT_INCREMENT             2
+#define IO_MOUSE_INCREMENT                6
+#define IO_NAMED_PIPE_INCREMENT           2
+#define IO_NETWORK_INCREMENT              2
+#define IO_PARALLEL_INCREMENT             1
+#define IO_SERIAL_INCREMENT               2
+#define IO_SOUND_INCREMENT                8
+#define IO_VIDEO_INCREMENT                1
+#define SEMAPHORE_INCREMENT               1
+
+#define MM_MAXIMUM_DISK_IO_SIZE          (0x10000)
+
+typedef struct _BOOTDISK_INFORMATION {
+  LONGLONG  BootPartitionOffset;
+  LONGLONG  SystemPartitionOffset;
+  ULONG  BootDeviceSignature;
+  ULONG  SystemDeviceSignature;
+} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
+
+typedef struct _BOOTDISK_INFORMATION_EX {
+  LONGLONG  BootPartitionOffset;
+  LONGLONG  SystemPartitionOffset;
+  ULONG  BootDeviceSignature;
+  ULONG  SystemDeviceSignature;
+  GUID  BootDeviceGuid;
+  GUID  SystemDeviceGuid;
+  BOOLEAN  BootDeviceIsGpt;
+  BOOLEAN  SystemDeviceIsGpt;
+} BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
+
+typedef struct _EISA_MEMORY_TYPE {
+  UCHAR  ReadWrite : 1;
+  UCHAR  Cached : 1;
+  UCHAR  Reserved0 : 1;
+  UCHAR  Type : 2;
+  UCHAR  Shared : 1;
+  UCHAR  Reserved1 : 1;
+  UCHAR  MoreEntries : 1;
+} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
+
+#include <pshpack1.h>
+typedef struct _EISA_MEMORY_CONFIGURATION {
+  EISA_MEMORY_TYPE  ConfigurationByte;
+  UCHAR  DataSize;
+  USHORT  AddressLowWord;
+  UCHAR  AddressHighByte;
+  USHORT  MemorySize;
+} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
+#include <poppack.h>
+
+typedef struct _EISA_IRQ_DESCRIPTOR {
+  UCHAR  Interrupt : 4;
+  UCHAR  Reserved : 1;
+  UCHAR  LevelTriggered : 1;
+  UCHAR  Shared : 1;
+  UCHAR  MoreEntries : 1;
+} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
+
+typedef struct _EISA_IRQ_CONFIGURATION {
+  EISA_IRQ_DESCRIPTOR  ConfigurationByte;
+  UCHAR  Reserved;
+} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
+
+typedef struct _DMA_CONFIGURATION_BYTE0 {
+  UCHAR Channel : 3;
+  UCHAR Reserved : 3;
+  UCHAR Shared : 1;
+  UCHAR MoreEntries : 1;
+} DMA_CONFIGURATION_BYTE0;
+
+typedef struct _DMA_CONFIGURATION_BYTE1 {
+  UCHAR  Reserved0 : 2;
+  UCHAR  TransferSize : 2;
+  UCHAR  Timing : 2;
+  UCHAR  Reserved1 : 2;
+} DMA_CONFIGURATION_BYTE1;
+
+typedef struct _EISA_DMA_CONFIGURATION {
+  DMA_CONFIGURATION_BYTE0  ConfigurationByte0;
+  DMA_CONFIGURATION_BYTE1  ConfigurationByte1;
+} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
+
+#include <pshpack1.h>
+typedef struct _EISA_PORT_DESCRIPTOR {
+  UCHAR  NumberPorts : 5;
+  UCHAR  Reserved : 1;
+  UCHAR  Shared : 1;
+  UCHAR  MoreEntries : 1;
+} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
+
+typedef struct _EISA_PORT_CONFIGURATION {
+  EISA_PORT_DESCRIPTOR  Configuration;
+  USHORT  PortAddress;
+} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
+#include <poppack.h>
+
+typedef struct _CM_EISA_FUNCTION_INFORMATION {
+  ULONG  CompressedId;
+  UCHAR  IdSlotFlags1;
+  UCHAR  IdSlotFlags2;
+  UCHAR  MinorRevision;
+  UCHAR  MajorRevision;
+  UCHAR  Selections[26];
+  UCHAR  FunctionFlags;
+  UCHAR  TypeString[80];
+  EISA_MEMORY_CONFIGURATION  EisaMemory[9];
+  EISA_IRQ_CONFIGURATION  EisaIrq[7];
+  EISA_DMA_CONFIGURATION  EisaDma[4];
+  EISA_PORT_CONFIGURATION  EisaPort[20];
+  UCHAR  InitializationData[60];
+} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
+
+/* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
+
+#define EISA_FUNCTION_ENABLED           0x80
+#define EISA_FREE_FORM_DATA             0x40
+#define EISA_HAS_PORT_INIT_ENTRY        0x20
+#define EISA_HAS_PORT_RANGE             0x10
+#define EISA_HAS_DMA_ENTRY              0x08
+#define EISA_HAS_IRQ_ENTRY              0x04
+#define EISA_HAS_MEMORY_ENTRY           0x02
+#define EISA_HAS_TYPE_ENTRY             0x01
+#define EISA_HAS_INFORMATION \
+  (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
+  + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
+
+typedef struct _CM_EISA_SLOT_INFORMATION {
+  UCHAR  ReturnCode;
+  UCHAR  ReturnFlags;
+  UCHAR  MajorRevision;
+  UCHAR  MinorRevision;
+  USHORT  Checksum;
+  UCHAR  NumberFunctions;
+  UCHAR  FunctionInformation;
+  ULONG  CompressedId;
+} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
+
+/* CM_EISA_SLOT_INFORMATION.ReturnCode */
+
+#define EISA_INVALID_SLOT               0x80
+#define EISA_INVALID_FUNCTION           0x81
+#define EISA_INVALID_CONFIGURATION      0x82
+#define EISA_EMPTY_SLOT                 0x83
+#define EISA_INVALID_BIOS_CALL          0x86
+
+/*
+** Plug and Play structures
+*/
+
+typedef VOID
+(DDKAPI *PINTERFACE_REFERENCE)(
+  PVOID  Context);
+
+typedef VOID
+(DDKAPI *PINTERFACE_DEREFERENCE)(
+  PVOID Context);
+
+typedef BOOLEAN
+(DDKAPI *PTRANSLATE_BUS_ADDRESS)(
+  IN PVOID  Context,
+  IN PHYSICAL_ADDRESS  BusAddress,
+  IN ULONG  Length,
+  IN OUT PULONG  AddressSpace,
+  OUT PPHYSICAL_ADDRESS  TranslatedAddress);
+
+typedef struct _DMA_ADAPTER*
+(DDKAPI *PGET_DMA_ADAPTER)(
+  IN PVOID  Context,
+  IN struct _DEVICE_DESCRIPTION  *DeviceDescriptor,
+  OUT PULONG  NumberOfMapRegisters);
+
+typedef ULONG
+(DDKAPI *PGET_SET_DEVICE_DATA)(
+  IN PVOID  Context,
+  IN ULONG  DataType,
+  IN PVOID  Buffer,
+  IN ULONG  Offset,
+  IN ULONG  Length);
+
+/* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
+#define PCI_USE_SUBSYSTEM_IDS   0x00000001
+#define PCI_USE_REVISION        0x00000002
+#define PCI_USE_VENDEV_IDS      0x00000004
+#define PCI_USE_CLASS_SUBCLASS  0x00000008
+#define PCI_USE_PROGIF          0x00000010
+#define PCI_USE_LOCAL_BUS       0x00000020
+#define PCI_USE_LOCAL_DEVICE    0x00000040
+
+typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
+  ULONG   Size;
+  ULONG   Flags;
+  USHORT  VendorID;
+  USHORT  DeviceID;
+  UCHAR   RevisionID;
+  USHORT  SubVendorID;
+  USHORT  SubSystemID;
+  UCHAR   BaseClass;
+  UCHAR   SubClass;
+  UCHAR   ProgIf;
+} PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
+
+typedef BOOLEAN
+(DDKAPI *PPCI_IS_DEVICE_PRESENT)(
+  IN USHORT  VendorID,
+  IN USHORT  DeviceID,
+  IN UCHAR   RevisionID,
+  IN USHORT  SubVendorID,
+  IN USHORT  SubSystemID,
+  IN ULONG   Flags);
+
+typedef BOOLEAN
+(DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)(
+  IN PVOID Context,
+  IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
+
+typedef struct _BUS_INTERFACE_STANDARD {
+  USHORT  Size;
+  USHORT  Version;
+  PVOID  Context;
+  PINTERFACE_REFERENCE  InterfaceReference;
+  PINTERFACE_DEREFERENCE  InterfaceDereference;
+  PTRANSLATE_BUS_ADDRESS  TranslateBusAddress;
+  PGET_DMA_ADAPTER  GetDmaAdapter;
+  PGET_SET_DEVICE_DATA  SetBusData;
+  PGET_SET_DEVICE_DATA  GetBusData;
+} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
+
+typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
+  USHORT  Size;
+  USHORT  Version;
+  PVOID  Context;
+  PINTERFACE_REFERENCE  InterfaceReference;
+  PINTERFACE_DEREFERENCE  InterfaceDereference;
+  PPCI_IS_DEVICE_PRESENT  IsDevicePresent;
+  PPCI_IS_DEVICE_PRESENT_EX  IsDevicePresentEx;
+} PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
+
+typedef
+BOOLEAN
+(*PGPE_SERVICE_ROUTINE2)(
+    PVOID ObjectContext,
+    PVOID ServiceContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_CONNECT_VECTOR2)(
+    PVOID Context,
+    ULONG GpeNumber,
+    KINTERRUPT_MODE Mode,
+    BOOLEAN Shareable,
+    PGPE_SERVICE_ROUTINE2 ServiceRoutine,
+    PVOID ServiceContext,
+    PVOID *ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_DISCONNECT_VECTOR2)(
+    PVOID Context,
+    PVOID ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_ENABLE_EVENT2)(
+    PVOID Context,
+    PVOID ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_DISABLE_EVENT2)(
+    PVOID Context,
+    PVOID ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_CLEAR_STATUS2)(
+    PVOID Context,
+    PVOID ObjectContext
+);
+
+typedef
+VOID
+(*PDEVICE_NOTIFY_CALLBACK2)(
+    PVOID NotificationContext,
+    ULONG NotifyCode
+);
+
+typedef
+NTSTATUS
+(*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
+    PVOID Context,
+    PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
+    PVOID NotificationContext
+);
+
+typedef
+VOID
+(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
+    PVOID Context
+);
+
+typedef struct
+{
+    USHORT Size;
+    USHORT Version;
+    PVOID Context;
+    PINTERFACE_REFERENCE InterfaceReference;
+    PINTERFACE_DEREFERENCE InterfaceDereference;
+    PGPE_CONNECT_VECTOR2 GpeConnectVector;
+    PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
+    PGPE_ENABLE_EVENT2 GpeEnableEvent;
+    PGPE_DISABLE_EVENT2 GpeDisableEvent;
+    PGPE_CLEAR_STATUS2 GpeClearStatus;
+    PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
+    PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
+} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
+
+typedef
+BOOLEAN
+(*PGPE_SERVICE_ROUTINE)(
+    PDEVICE_OBJECT ObjectContext,
+    PVOID ServiceContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_CONNECT_VECTOR)(
+    PDEVICE_OBJECT Context,
+    ULONG GpeNumber,
+    KINTERRUPT_MODE Mode,
+    BOOLEAN Shareable,
+    PGPE_SERVICE_ROUTINE ServiceRoutine,
+    PVOID ServiceContext,
+    PVOID *ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_DISCONNECT_VECTOR)(
+    PDEVICE_OBJECT Context,
+    PVOID ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_ENABLE_EVENT)(
+    PDEVICE_OBJECT Context,
+    PVOID ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_DISABLE_EVENT)(
+    PDEVICE_OBJECT Context,
+    PVOID ObjectContext
+);
+
+typedef
+NTSTATUS
+(*PGPE_CLEAR_STATUS)(
+    PDEVICE_OBJECT Context,
+    PVOID ObjectContext
+);
+
+typedef
+VOID
+(*PDEVICE_NOTIFY_CALLBACK)(
+    PVOID NotificationContext,
+    ULONG NotifyCode
+);
+
+typedef
+NTSTATUS
+(*PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
+    PDEVICE_OBJECT Context,
+    PDEVICE_NOTIFY_CALLBACK NotificationHandler,
+    PVOID NotificationContext
+);
+
+typedef
+VOID
+(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
+    PDEVICE_OBJECT Context,
+    PDEVICE_NOTIFY_CALLBACK NotificationHandler
+);
+
+typedef struct
+{
+    USHORT Size;
+    USHORT Version;
+    PVOID Context;
+    PINTERFACE_REFERENCE InterfaceReference;
+    PINTERFACE_DEREFERENCE InterfaceDereference;
+    PGPE_CONNECT_VECTOR GpeConnectVector;
+    PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
+    PGPE_ENABLE_EVENT GpeEnableEvent;
+    PGPE_DISABLE_EVENT GpeDisableEvent;
+    PGPE_CLEAR_STATUS GpeClearStatus;
+    PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
+    PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
+} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
+
+typedef struct _DEVICE_CAPABILITIES {
+  USHORT  Size;
+  USHORT  Version;
+  ULONG  DeviceD1 : 1;
+  ULONG  DeviceD2 : 1;
+  ULONG  LockSupported : 1;
+  ULONG  EjectSupported : 1;
+  ULONG  Removable : 1;
+  ULONG  DockDevice : 1;
+  ULONG  UniqueID : 1;
+  ULONG  SilentInstall : 1;
+  ULONG  RawDeviceOK : 1;
+  ULONG  SurpriseRemovalOK : 1;
+  ULONG  WakeFromD0 : 1;
+  ULONG  WakeFromD1 : 1;
+  ULONG  WakeFromD2 : 1;
+  ULONG  WakeFromD3 : 1;
+  ULONG  HardwareDisabled : 1;
+  ULONG  NonDynamic : 1;
+  ULONG  WarmEjectSupported : 1;
+  ULONG  NoDisplayInUI : 1;
+  ULONG  Reserved : 14;
+  ULONG  Address;
+  ULONG  UINumber;
+  DEVICE_POWER_STATE  DeviceState[PowerSystemMaximum];
+  SYSTEM_POWER_STATE  SystemWake;
+  DEVICE_POWER_STATE  DeviceWake;
+  ULONG  D1Latency;
+  ULONG  D2Latency;
+  ULONG  D3Latency;
+} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
+
+typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+  GUID  InterfaceClassGuid;
+  PUNICODE_STRING  SymbolicLinkName;
+} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
+
+typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
+
+#undef INTERFACE
+
+typedef struct _INTERFACE {
+  USHORT  Size;
+  USHORT  Version;
+  PVOID  Context;
+  PINTERFACE_REFERENCE  InterfaceReference;
+  PINTERFACE_DEREFERENCE  InterfaceDereference;
+} INTERFACE, *PINTERFACE;
+
+typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
+
+typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
+
+/* PNP_DEVICE_STATE */
+
+#define PNP_DEVICE_DISABLED                      0x00000001
+#define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
+#define PNP_DEVICE_FAILED                        0x00000004
+#define PNP_DEVICE_REMOVED                       0x00000008
+#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
+#define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
+
+typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+  struct _FILE_OBJECT  *FileObject;
+  LONG  NameBufferOffset;
+  UCHAR  CustomDataBuffer[1];
+} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
+
+typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
+  USHORT  Version;
+  USHORT  Size;
+  GUID  Event;
+  struct _FILE_OBJECT  *FileObject;
+} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
+
+typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
+  DeviceUsageTypeUndefined,
+  DeviceUsageTypePaging,
+  DeviceUsageTypeHibernation,
+  DeviceUsageTypeDumpFile
+} DEVICE_USAGE_NOTIFICATION_TYPE;
+
+typedef struct _POWER_SEQUENCE {
+  ULONG  SequenceD1;
+  ULONG  SequenceD2;
+  ULONG  SequenceD3;
+} POWER_SEQUENCE, *PPOWER_SEQUENCE;
+
+typedef enum {
+  DevicePropertyDeviceDescription = 0x0,
+  DevicePropertyHardwareID = 0x1,
+  DevicePropertyCompatibleIDs = 0x2,
+  DevicePropertyBootConfiguration = 0x3,
+  DevicePropertyBootConfigurationTranslated = 0x4,
+  DevicePropertyClassName = 0x5,
+  DevicePropertyClassGuid = 0x6,
+  DevicePropertyDriverKeyName = 0x7,
+  DevicePropertyManufacturer = 0x8,
+  DevicePropertyFriendlyName = 0x9,
+  DevicePropertyLocationInformation = 0xa,
+  DevicePropertyPhysicalDeviceObjectName = 0xb,
+  DevicePropertyBusTypeGuid = 0xc,
+  DevicePropertyLegacyBusType = 0xd,
+  DevicePropertyBusNumber = 0xe,
+  DevicePropertyEnumeratorName = 0xf,
+  DevicePropertyAddress = 0x10,
+  DevicePropertyUINumber = 0x11,
+  DevicePropertyInstallState = 0x12,
+  DevicePropertyRemovalPolicy = 0x13,
+  DevicePropertyResourceRequirements = 0x14,
+  DevicePropertyAllocatedResources = 0x15,
+  DevicePropertyContainerID = 0x16
+} DEVICE_REGISTRY_PROPERTY;
+
+typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
+  EventCategoryReserved,
+  EventCategoryHardwareProfileChange,
+  EventCategoryDeviceInterfaceChange,
+  EventCategoryTargetDeviceChange
+} IO_NOTIFICATION_EVENT_CATEGORY;
+
+#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
+
+typedef NTSTATUS
+(DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
+  IN PVOID NotificationStructure,
+  IN PVOID Context);
+
+typedef VOID
+(DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)(
+  IN PVOID Context);
+
+typedef enum _FILE_INFORMATION_CLASS {
+  FileDirectoryInformation = 1,
+  FileFullDirectoryInformation,
+  FileBothDirectoryInformation,
+  FileBasicInformation,
+  FileStandardInformation,
+  FileInternalInformation,
+  FileEaInformation,
+  FileAccessInformation,
+  FileNameInformation,
+  FileRenameInformation,
+  FileLinkInformation,
+  FileNamesInformation,
+  FileDispositionInformation,
+  FilePositionInformation,
+  FileFullEaInformation,
+  FileModeInformation,
+  FileAlignmentInformation,
+  FileAllInformation,
+  FileAllocationInformation,
+  FileEndOfFileInformation,
+  FileAlternateNameInformation,
+  FileStreamInformation,
+  FilePipeInformation,
+  FilePipeLocalInformation,
+  FilePipeRemoteInformation,
+  FileMailslotQueryInformation,
+  FileMailslotSetInformation,
+  FileCompressionInformation,
+  FileObjectIdInformation,
+  FileCompletionInformation,
+  FileMoveClusterInformation,
+  FileQuotaInformation,
+  FileReparsePointInformation,
+  FileNetworkOpenInformation,
+  FileAttributeTagInformation,
+  FileTrackingInformation,
+  FileIdBothDirectoryInformation,
+  FileIdFullDirectoryInformation,
+  FileValidDataLengthInformation,
+  FileShortNameInformation,
+  FileIoCompletionNotificationInformation,
+  FileIoStatusBlockRangeInformation,
+  FileIoPriorityHintInformation,
+  FileSfioReserveInformation,
+  FileSfioVolumeInformation,
+  FileHardLinkInformation,
+  FileProcessIdsUsingFileInformation,
+  FileNormalizedNameInformation,
+  FileNetworkPhysicalNameInformation,
+  FileIdGlobalTxDirectoryInformation,
+  FileIsRemoteDeviceInformation,
+  FileAttributeCacheInformation,
+  FileNumaNodeInformation,
+  FileStandardLinkInformation,
+  FileRemoteProtocolInformation,
+  FileMaximumInformation
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef struct _FILE_POSITION_INFORMATION {
+  LARGE_INTEGER  CurrentByteOffset;
+} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
+
+#include <pshpack8.h>
+typedef struct _FILE_BASIC_INFORMATION {
+  LARGE_INTEGER  CreationTime;
+  LARGE_INTEGER  LastAccessTime;
+  LARGE_INTEGER  LastWriteTime;
+  LARGE_INTEGER  ChangeTime;
+  ULONG  FileAttributes;
+} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
+#include <poppack.h>
+
+typedef struct _FILE_STANDARD_INFORMATION {
+  LARGE_INTEGER  AllocationSize;
+  LARGE_INTEGER  EndOfFile;
+  ULONG  NumberOfLinks;
+  BOOLEAN  DeletePending;
+  BOOLEAN  Directory;
+} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
+
+typedef struct _FILE_NETWORK_OPEN_INFORMATION {
+  LARGE_INTEGER  CreationTime;
+  LARGE_INTEGER  LastAccessTime;
+  LARGE_INTEGER  LastWriteTime;
+  LARGE_INTEGER  ChangeTime;
+  LARGE_INTEGER  AllocationSize;
+  LARGE_INTEGER  EndOfFile;
+  ULONG  FileAttributes;
+} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
+
+typedef enum _FSINFOCLASS {
+  FileFsVolumeInformation = 1,
+  FileFsLabelInformation,
+  FileFsSizeInformation,
+  FileFsDeviceInformation,
+  FileFsAttributeInformation,
+  FileFsControlInformation,
+  FileFsFullSizeInformation,
+  FileFsObjectIdInformation,
+  FileFsDriverPathInformation,
+  FileFsVolumeFlagsInformation,
+  FileFsMaximumInformation
+} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
+
+typedef struct _FILE_FS_DEVICE_INFORMATION {
+  DEVICE_TYPE  DeviceType;
+  ULONG  Characteristics;
+} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
+
+typedef struct _FILE_FULL_EA_INFORMATION {
+  ULONG  NextEntryOffset;
+  UCHAR  Flags;
+  UCHAR  EaNameLength;
+  USHORT  EaValueLength;
+  CHAR  EaName[1];
+} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
+
+#define FM_LOCK_BIT             (0x1)
+#define FM_LOCK_BIT_V           (0x0)
+#define FM_LOCK_WAITER_WOKEN    (0x2)
+#define FM_LOCK_WAITER_INC      (0x4)
+
+typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
+
+typedef struct _OWNER_ENTRY {
+    ERESOURCE_THREAD OwnerThread;
+    _ANONYMOUS_UNION union {
+        LONG OwnerCount;
+        ULONG TableSize;
+    } DUMMYUNIONNAME;
+} OWNER_ENTRY, *POWNER_ENTRY;
+
+typedef struct _ERESOURCE
+{
+    LIST_ENTRY SystemResourcesList;
+    POWNER_ENTRY OwnerTable;
+    SHORT ActiveCount;
+    USHORT Flag;
+    volatile PKSEMAPHORE SharedWaiters;
+    volatile PKEVENT ExclusiveWaiters;
+    OWNER_ENTRY OwnerEntry;
+    ULONG ActiveEntries;
+    ULONG ContentionCount;
+    ULONG NumberOfSharedWaiters;
+    ULONG NumberOfExclusiveWaiters;
+    __GNU_EXTENSION union
+    {
+        PVOID Address;
+        ULONG_PTR CreatorBackTraceIndex;
+    };
+    KSPIN_LOCK SpinLock;
+} ERESOURCE, *PERESOURCE;
+
+/* ERESOURCE.Flag */
+#define ResourceNeverExclusive            0x0010
+#define ResourceReleaseByOtherThread      0x0020
+#define ResourceOwnedExclusive            0x0080
+
+#define RESOURCE_HASH_TABLE_SIZE          64
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN BOOLEAN  Wait,
+  IN ULONG  LockKey,
+  IN BOOLEAN  CheckForReadOperation,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_READ)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN BOOLEAN  Wait,
+  IN ULONG  LockKey,
+  OUT PVOID  Buffer,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_WRITE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN BOOLEAN  Wait,
+  IN ULONG  LockKey,
+  IN PVOID  Buffer,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_QUERY_BASIC_INFO)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN BOOLEAN  Wait,
+  OUT PFILE_BASIC_INFORMATION  Buffer,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN BOOLEAN  Wait,
+  OUT PFILE_STANDARD_INFORMATION  Buffer,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_LOCK)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN PLARGE_INTEGER  Length,
+  PEPROCESS  ProcessId,
+  ULONG  Key,
+  BOOLEAN  FailImmediately,
+  BOOLEAN  ExclusiveLock,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_UNLOCK_SINGLE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN PLARGE_INTEGER  Length,
+  PEPROCESS  ProcessId,
+  ULONG  Key,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_UNLOCK_ALL)(
+  IN struct _FILE_OBJECT  *FileObject,
+  PEPROCESS  ProcessId,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
+  IN struct _FILE_OBJECT  *FileObject,
+  PVOID  ProcessId,
+  ULONG  Key,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_DEVICE_CONTROL)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN BOOLEAN  Wait,
+  IN PVOID  InputBuffer  OPTIONAL,
+  IN ULONG  InputBufferLength,
+  OUT PVOID  OutputBuffer  OPTIONAL,
+  IN ULONG  OutputBufferLength,
+  IN ULONG  IoControlCode,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef VOID
+(DDKAPI *PFAST_IO_ACQUIRE_FILE)(
+  IN struct _FILE_OBJECT  *FileObject);
+
+typedef VOID
+(DDKAPI *PFAST_IO_RELEASE_FILE)(
+  IN struct _FILE_OBJECT  *FileObject);
+
+typedef VOID
+(DDKAPI *PFAST_IO_DETACH_DEVICE)(
+  IN struct _DEVICE_OBJECT  *SourceDevice,
+  IN struct _DEVICE_OBJECT  *TargetDevice);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN BOOLEAN  Wait,
+  OUT struct _FILE_NETWORK_OPEN_INFORMATION  *Buffer,
+  OUT struct _IO_STATUS_BLOCK  *IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef NTSTATUS
+(DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  EndingOffset,
+  OUT struct _ERESOURCE  **ResourceToRelease,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_READ)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN ULONG  LockKey,
+  OUT PMDL  *MdlChain,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_READ_COMPLETE)(
+  IN struct _FILE_OBJECT *FileObject,
+  IN PMDL MdlChain,
+  IN struct _DEVICE_OBJECT *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN ULONG  LockKey,
+  OUT PMDL  *MdlChain,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN PMDL  MdlChain,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_READ_COMPRESSED)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN ULONG  LockKey,
+  OUT PVOID  Buffer,
+  OUT PMDL  *MdlChain,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  OUT struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
+  IN ULONG  CompressedDataInfoLength,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_WRITE_COMPRESSED)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN ULONG  Length,
+  IN ULONG  LockKey,
+  IN PVOID  Buffer,
+  OUT PMDL  *MdlChain,
+  OUT PIO_STATUS_BLOCK  IoStatus,
+  IN struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
+  IN ULONG  CompressedDataInfoLength,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PMDL  MdlChain,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN PLARGE_INTEGER  FileOffset,
+  IN PMDL  MdlChain,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef BOOLEAN
+(DDKAPI *PFAST_IO_QUERY_OPEN)(
+  IN struct _IRP  *Irp,
+  OUT PFILE_NETWORK_OPEN_INFORMATION  NetworkInformation,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef NTSTATUS
+(DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN struct _ERESOURCE  *ResourceToRelease,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef NTSTATUS
+(DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
+  IN struct _FILE_OBJECT  *FileObject,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef NTSTATUS
+(DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
+  IN struct _FILE_OBJECT  *FileObject,
+  IN struct _DEVICE_OBJECT  *DeviceObject);
+
+typedef struct _FAST_IO_DISPATCH {
+  ULONG  SizeOfFastIoDispatch;
+  PFAST_IO_CHECK_IF_POSSIBLE  FastIoCheckIfPossible;
+  PFAST_IO_READ  FastIoRead;
+  PFAST_IO_WRITE  FastIoWrite;
+  PFAST_IO_QUERY_BASIC_INFO  FastIoQueryBasicInfo;
+  PFAST_IO_QUERY_STANDARD_INFO  FastIoQueryStandardInfo;
+  PFAST_IO_LOCK  FastIoLock;
+  PFAST_IO_UNLOCK_SINGLE  FastIoUnlockSingle;
+  PFAST_IO_UNLOCK_ALL  FastIoUnlockAll;
+  PFAST_IO_UNLOCK_ALL_BY_KEY  FastIoUnlockAllByKey;
+  PFAST_IO_DEVICE_CONTROL  FastIoDeviceControl;
+  PFAST_IO_ACQUIRE_FILE  AcquireFileForNtCreateSection;
+  PFAST_IO_RELEASE_FILE  ReleaseFileForNtCreateSection;
+  PFAST_IO_DETACH_DEVICE  FastIoDetachDevice;
+  PFAST_IO_QUERY_NETWORK_OPEN_INFO  FastIoQueryNetworkOpenInfo;
+  PFAST_IO_ACQUIRE_FOR_MOD_WRITE  AcquireForModWrite;
+  PFAST_IO_MDL_READ  MdlRead;
+  PFAST_IO_MDL_READ_COMPLETE  MdlReadComplete;
+  PFAST_IO_PREPARE_MDL_WRITE  PrepareMdlWrite;
+  PFAST_IO_MDL_WRITE_COMPLETE  MdlWriteComplete;
+  PFAST_IO_READ_COMPRESSED  FastIoReadCompressed;
+  PFAST_IO_WRITE_COMPRESSED  FastIoWriteCompressed;
+  PFAST_IO_MDL_READ_COMPLETE_COMPRESSED  MdlReadCompleteCompressed;
+  PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED  MdlWriteCompleteCompressed;
+  PFAST_IO_QUERY_OPEN  FastIoQueryOpen;
+  PFAST_IO_RELEASE_FOR_MOD_WRITE  ReleaseForModWrite;
+  PFAST_IO_ACQUIRE_FOR_CCFLUSH  AcquireForCcFlush;
+  PFAST_IO_RELEASE_FOR_CCFLUSH  ReleaseForCcFlush;
+} FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
+
+typedef struct _SECTION_OBJECT_POINTERS {
+  PVOID  DataSectionObject;
+  PVOID  SharedCacheMap;
+  PVOID  ImageSectionObject;
+} SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
+
+typedef struct _IO_COMPLETION_CONTEXT {
+  PVOID  Port;
+  PVOID  Key;
+} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
+
+/* FILE_OBJECT.Flags */
+#define FO_FILE_OPEN                 0x00000001
+#define FO_SYNCHRONOUS_IO            0x00000002
+#define FO_ALERTABLE_IO              0x00000004
+#define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
+#define FO_WRITE_THROUGH             0x00000010
+#define FO_SEQUENTIAL_ONLY           0x00000020
+#define FO_CACHE_SUPPORTED           0x00000040
+#define FO_NAMED_PIPE                0x00000080
+#define FO_STREAM_FILE               0x00000100
+#define FO_MAILSLOT                  0x00000200
+#define FO_GENERATE_AUDIT_ON_CLOSE   0x00000400
+#define FO_QUEUE_IRP_TO_THREAD       0x00000400
+#define FO_DIRECT_DEVICE_OPEN        0x00000800
+#define FO_FILE_MODIFIED             0x00001000
+#define FO_FILE_SIZE_CHANGED         0x00002000
+#define FO_CLEANUP_COMPLETE          0x00004000
+#define FO_TEMPORARY_FILE            0x00008000
+#define FO_DELETE_ON_CLOSE           0x00010000
+#define FO_OPENED_CASE_SENSITIVE     0x00020000
+#define FO_HANDLE_CREATED            0x00040000
+#define FO_FILE_FAST_IO_READ         0x00080000
+#define FO_RANDOM_ACCESS             0x00100000
+#define FO_FILE_OPEN_CANCELLED       0x00200000
+#define FO_VOLUME_OPEN               0x00400000
+#define FO_REMOTE_ORIGIN             0x01000000
+#define FO_DISALLOW_EXCLUSIVE        0x02000000
+#define FO_SKIP_COMPLETION_PORT      0x02000000
+#define FO_SKIP_SET_EVENT            0x04000000
+#define FO_SKIP_SET_FAST_IO          0x08000000
+
+/* VPB.Flags */
+#define VPB_MOUNTED                       0x0001
+#define VPB_LOCKED                        0x0002
+#define VPB_PERSISTENT                    0x0004
+#define VPB_REMOVE_PENDING                0x0008
+#define VPB_RAW_MOUNT                     0x0010
+#define VPB_DIRECT_WRITES_ALLOWED         0x0020
+
+/* IRP.Flags */
+
+#define SL_FORCE_ACCESS_CHECK             0x01
+#define SL_OPEN_PAGING_FILE               0x02
+#define SL_OPEN_TARGET_DIRECTORY          0x04
+#define SL_CASE_SENSITIVE                 0x80
+
+#define SL_KEY_SPECIFIED                  0x01
+#define SL_OVERRIDE_VERIFY_VOLUME         0x02
+#define SL_WRITE_THROUGH                  0x04
+#define SL_FT_SEQUENTIAL_WRITE            0x08
+
+#define SL_FAIL_IMMEDIATELY               0x01
+#define SL_EXCLUSIVE_LOCK                 0x02
+
+#define SL_RESTART_SCAN                   0x01
+#define SL_RETURN_SINGLE_ENTRY            0x02
+#define SL_INDEX_SPECIFIED                0x04
+
+#define SL_WATCH_TREE                     0x01
+
+#define SL_ALLOW_RAW_MOUNT                0x01
+
+#define CTL_CODE(DeviceType, Function, Method, Access) \
+  (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
+
+#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
+
+#define IRP_NOCACHE                     0x00000001
+#define IRP_PAGING_IO                   0x00000002
+#define IRP_MOUNT_COMPLETION            0x00000002
+#define IRP_SYNCHRONOUS_API             0x00000004
+#define IRP_ASSOCIATED_IRP              0x00000008
+#define IRP_BUFFERED_IO                 0x00000010
+#define IRP_DEALLOCATE_BUFFER           0x00000020
+#define IRP_INPUT_OPERATION             0x00000040
+#define IRP_SYNCHRONOUS_PAGING_IO       0x00000040
+#define IRP_CREATE_OPERATION            0x00000080
+#define IRP_READ_OPERATION              0x00000100
+#define IRP_WRITE_OPERATION             0x00000200
+#define IRP_CLOSE_OPERATION             0x00000400
+#define IRP_DEFER_IO_COMPLETION         0x00000800
+#define IRP_OB_QUERY_NAME               0x00001000
+#define IRP_HOLD_DEVICE_QUEUE           0x00002000
+
+#define IRP_QUOTA_CHARGED                 0x01
+#define IRP_ALLOCATED_MUST_SUCCEED        0x02
+#define IRP_ALLOCATED_FIXED_SIZE          0x04
+#define IRP_LOOKASIDE_ALLOCATION          0x08
+
+/*
+** IRP function codes
+*/
+
+#define IRP_MJ_CREATE                     0x00
+#define IRP_MJ_CREATE_NAMED_PIPE          0x01
+#define IRP_MJ_CLOSE                      0x02
+#define IRP_MJ_READ                       0x03
+#define IRP_MJ_WRITE                      0x04
+#define IRP_MJ_QUERY_INFORMATION          0x05
+#define IRP_MJ_SET_INFORMATION            0x06
+#define IRP_MJ_QUERY_EA                   0x07
+#define IRP_MJ_SET_EA                     0x08
+#define IRP_MJ_FLUSH_BUFFERS              0x09
+#define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
+#define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
+#define IRP_MJ_DIRECTORY_CONTROL          0x0c
+#define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
+#define IRP_MJ_DEVICE_CONTROL             0x0e
+#define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
+#define IRP_MJ_SCSI                       0x0f
+#define IRP_MJ_SHUTDOWN                   0x10
+#define IRP_MJ_LOCK_CONTROL               0x11
+#define IRP_MJ_CLEANUP                    0x12
+#define IRP_MJ_CREATE_MAILSLOT            0x13
+#define IRP_MJ_QUERY_SECURITY             0x14
+#define IRP_MJ_SET_SECURITY               0x15
+#define IRP_MJ_POWER                      0x16
+#define IRP_MJ_SYSTEM_CONTROL             0x17
+#define IRP_MJ_DEVICE_CHANGE              0x18
+#define IRP_MJ_QUERY_QUOTA                0x19
+#define IRP_MJ_SET_QUOTA                  0x1a
+#define IRP_MJ_PNP                        0x1b
+#define IRP_MJ_PNP_POWER                  0x1b
+#define IRP_MJ_MAXIMUM_FUNCTION           0x1b
+
+#define IRP_MN_SCSI_CLASS                 0x01
+
+#define IRP_MN_START_DEVICE               0x00
+#define IRP_MN_QUERY_REMOVE_DEVICE        0x01
+#define IRP_MN_REMOVE_DEVICE              0x02
+#define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
+#define IRP_MN_STOP_DEVICE                0x04
+#define IRP_MN_QUERY_STOP_DEVICE          0x05
+#define IRP_MN_CANCEL_STOP_DEVICE         0x06
+
+#define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
+#define IRP_MN_QUERY_INTERFACE              0x08
+#define IRP_MN_QUERY_CAPABILITIES           0x09
+#define IRP_MN_QUERY_RESOURCES              0x0A
+#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
+#define IRP_MN_QUERY_DEVICE_TEXT            0x0C
+#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
+
+#define IRP_MN_READ_CONFIG                  0x0F
+#define IRP_MN_WRITE_CONFIG                 0x10
+#define IRP_MN_EJECT                        0x11
+#define IRP_MN_SET_LOCK                     0x12
+#define IRP_MN_QUERY_ID                     0x13
+#define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
+#define IRP_MN_QUERY_BUS_INFORMATION        0x15
+#define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
+#define IRP_MN_SURPRISE_REMOVAL             0x17
+
+#define IRP_MN_WAIT_WAKE                  0x00
+#define IRP_MN_POWER_SEQUENCE             0x01
+#define IRP_MN_SET_POWER                  0x02
+#define IRP_MN_QUERY_POWER                0x03
+
+#define IRP_MN_QUERY_ALL_DATA             0x00
+#define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
+#define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
+#define IRP_MN_CHANGE_SINGLE_ITEM         0x03
+#define IRP_MN_ENABLE_EVENTS              0x04
+#define IRP_MN_DISABLE_EVENTS             0x05
+#define IRP_MN_ENABLE_COLLECTION          0x06
+#define IRP_MN_DISABLE_COLLECTION         0x07
+#define IRP_MN_REGINFO                    0x08
+#define IRP_MN_EXECUTE_METHOD             0x09
+
+#define IRP_MN_REGINFO_EX                 0x0b
+
+typedef struct _FILE_OBJECT
+{
+    CSHORT Type;
+    CSHORT Size;
+    PDEVICE_OBJECT DeviceObject;
+    PVPB Vpb;
+    PVOID FsContext;
+    PVOID FsContext2;
+    PSECTION_OBJECT_POINTERS SectionObjectPointer;
+    PVOID PrivateCacheMap;
+    NTSTATUS FinalStatus;
+    struct _FILE_OBJECT *RelatedFileObject;
+    BOOLEAN LockOperation;
+    BOOLEAN DeletePending;
+    BOOLEAN ReadAccess;
+    BOOLEAN WriteAccess;
+    BOOLEAN DeleteAccess;
+    BOOLEAN SharedRead;
+    BOOLEAN SharedWrite;
+    BOOLEAN SharedDelete;
+    ULONG Flags;
+    UNICODE_STRING FileName;
+    LARGE_INTEGER CurrentByteOffset;
+    volatile ULONG Waiters;
+    volatile ULONG Busy;
+    PVOID LastLock;
+    KEVENT Lock;
+    KEVENT Event;
+    volatile PIO_COMPLETION_CONTEXT CompletionContext;
+    KSPIN_LOCK IrpListLock;
+    LIST_ENTRY IrpList;
+    volatile PVOID FileObjectExtension;
+} FILE_OBJECT, *PFILE_OBJECT;
+
+typedef struct _IO_ERROR_LOG_PACKET {
+  UCHAR  MajorFunctionCode;
+  UCHAR  RetryCount;
+  USHORT  DumpDataSize;
+  USHORT  NumberOfStrings;
+  USHORT  StringOffset;
+  USHORT  EventCategory;
+  NTSTATUS  ErrorCode;
+  ULONG  UniqueErrorValue;
+  NTSTATUS  FinalStatus;
+  ULONG  SequenceNumber;
+  ULONG  IoControlCode;
+  LARGE_INTEGER  DeviceOffset;
+  ULONG  DumpData[1];
+} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
+
+typedef struct _IO_ERROR_LOG_MESSAGE {
+  USHORT  Type;
+  USHORT  Size;
+  USHORT  DriverNameLength;
+  LARGE_INTEGER  TimeStamp;
+  ULONG  DriverNameOffset;
+  IO_ERROR_LOG_PACKET  EntryData;
+} IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
+
+#define ERROR_LOG_LIMIT_SIZE               240
+#define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
+                                            sizeof(IO_ERROR_LOG_PACKET) + \
+                                            (sizeof(WCHAR) * 40))
+#define ERROR_LOG_MESSAGE_LIMIT_SIZE                                          \
+    (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
+#define IO_ERROR_LOG_MESSAGE_LENGTH                                           \
+    ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ?           \
+        ERROR_LOG_MESSAGE_LIMIT_SIZE :                                        \
+        PORT_MAXIMUM_MESSAGE_LENGTH)
+#define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH -                 \
+                                IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
+
+typedef enum _DMA_WIDTH {
+  Width8Bits,
+  Width16Bits,
+  Width32Bits,
+  MaximumDmaWidth
+} DMA_WIDTH, *PDMA_WIDTH;
+
+typedef enum _DMA_SPEED {
+  Compatible,
+  TypeA,
+  TypeB,
+  TypeC,
+  TypeF,
+  MaximumDmaSpeed
+} DMA_SPEED, *PDMA_SPEED;
+
+/* DEVICE_DESCRIPTION.Version */
+
+#define DEVICE_DESCRIPTION_VERSION        0x0000
+#define DEVICE_DESCRIPTION_VERSION1       0x0001
+#define DEVICE_DESCRIPTION_VERSION2       0x0002
+
+typedef struct _DEVICE_DESCRIPTION {
+  ULONG  Version;
+  BOOLEAN  Master;
+  BOOLEAN  ScatterGather;
+  BOOLEAN  DemandMode;
+  BOOLEAN  AutoInitialize;
+  BOOLEAN  Dma32BitAddresses;
+  BOOLEAN  IgnoreCount;
+  BOOLEAN  Reserved1;
+  BOOLEAN  Dma64BitAddresses;
+  ULONG  BusNumber;
+  ULONG  DmaChannel;
+  INTERFACE_TYPE  InterfaceType;
+  DMA_WIDTH  DmaWidth;
+  DMA_SPEED  DmaSpeed;
+  ULONG  MaximumLength;
+  ULONG  DmaPort;
+} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
+
+typedef enum _DEVICE_RELATION_TYPE {
+  BusRelations,
+  EjectionRelations,
+  PowerRelations,
+  RemovalRelations,
+  TargetDeviceRelation,
+  SingleBusRelations,
+  TransportRelations
+} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
+
+typedef struct _DEVICE_RELATIONS {
+  ULONG  Count;
+  PDEVICE_OBJECT Objects[1];
+} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
+
+typedef struct _DEVOBJ_EXTENSION
+{
+    CSHORT Type;
+    USHORT Size;
+    PDEVICE_OBJECT DeviceObject;
+} DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
+
+typedef struct _SCATTER_GATHER_ELEMENT {
+  PHYSICAL_ADDRESS  Address;
+  ULONG  Length;
+  ULONG_PTR  Reserved;
+} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
+
+#if defined(_MSC_EXTENSIONS)
+
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+#pragma warning(disable:4200)
+typedef struct _SCATTER_GATHER_LIST {
+  ULONG  NumberOfElements;
+  ULONG_PTR  Reserved;
+  SCATTER_GATHER_ELEMENT  Elements[1];
+} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
+
+#if _MSC_VER >= 1200
+#pragma warning(pop)
+#else
+#pragma warning(default:4200)
+#endif
+
+#else
+
+struct _SCATTER_GATHER_LIST;
+typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
+
+#endif
+
+typedef NTSTATUS
+(DDKAPI DRIVER_ADD_DEVICE)(
+  IN struct _DRIVER_OBJECT  *DriverObject,
+  IN struct _DEVICE_OBJECT  *PhysicalDeviceObject);
+typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
+
+typedef struct _DRIVER_EXTENSION {
+  struct _DRIVER_OBJECT  *DriverObject;
+  PDRIVER_ADD_DEVICE  AddDevice;
+  ULONG  Count;
+  UNICODE_STRING  ServiceKeyName;
+} DRIVER_EXTENSION, *PDRIVER_EXTENSION;
+
+#define DRVO_UNLOAD_INVOKED               0x00000001
+#define DRVO_LEGACY_DRIVER                0x00000002
+#define DRVO_BUILTIN_DRIVER               0x00000004
+
+typedef NTSTATUS
+(DDKAPI DRIVER_INITIALIZE)(
+  IN struct _DRIVER_OBJECT  *DriverObject,
+  IN PUNICODE_STRING  RegistryPath);
+typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
+
+typedef VOID
+(DDKAPI DRIVER_STARTIO)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp);
+typedef DRIVER_STARTIO *PDRIVER_STARTIO;
+
+typedef VOID
+(DDKAPI DRIVER_UNLOAD)(
+  IN struct _DRIVER_OBJECT  *DriverObject);
+typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
+
+typedef NTSTATUS
+(DDKAPI DRIVER_DISPATCH)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp);
+typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
+
+typedef struct _DRIVER_OBJECT {
+  CSHORT  Type;
+  CSHORT  Size;
+  PDEVICE_OBJECT  DeviceObject;
+  ULONG  Flags;
+  PVOID  DriverStart;
+  ULONG  DriverSize;
+  PVOID  DriverSection;
+  PDRIVER_EXTENSION  DriverExtension;
+  UNICODE_STRING  DriverName;
+  PUNICODE_STRING  HardwareDatabase;
+  struct _FAST_IO_DISPATCH *FastIoDispatch;
+  PDRIVER_INITIALIZE  DriverInit;
+  PDRIVER_STARTIO  DriverStartIo;
+  PDRIVER_UNLOAD  DriverUnload;
+  PDRIVER_DISPATCH  MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
+} DRIVER_OBJECT;
+typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
+
+typedef struct _DMA_ADAPTER {
+  USHORT  Version;
+  USHORT  Size;
+  struct _DMA_OPERATIONS*  DmaOperations;
+} DMA_ADAPTER, *PDMA_ADAPTER;
+
+typedef VOID
+(DDKAPI *PPUT_DMA_ADAPTER)(
+  IN PDMA_ADAPTER  DmaAdapter);
+
+typedef PVOID
+(DDKAPI *PALLOCATE_COMMON_BUFFER)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN ULONG  Length,
+  OUT PPHYSICAL_ADDRESS  LogicalAddress,
+  IN BOOLEAN  CacheEnabled);
+
+typedef VOID
+(DDKAPI *PFREE_COMMON_BUFFER)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN ULONG  Length,
+  IN PHYSICAL_ADDRESS  LogicalAddress,
+  IN PVOID  VirtualAddress,
+  IN BOOLEAN  CacheEnabled);
+
+typedef NTSTATUS
+(DDKAPI *PALLOCATE_ADAPTER_CHANNEL)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN ULONG  NumberOfMapRegisters,
+  IN PDRIVER_CONTROL  ExecutionRoutine,
+  IN PVOID  Context);
+
+typedef BOOLEAN
+(DDKAPI *PFLUSH_ADAPTER_BUFFERS)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PMDL  Mdl,
+  IN PVOID  MapRegisterBase,
+  IN PVOID  CurrentVa,
+  IN ULONG  Length,
+  IN BOOLEAN  WriteToDevice);
+
+typedef VOID
+(DDKAPI *PFREE_ADAPTER_CHANNEL)(
+  IN PDMA_ADAPTER  DmaAdapter);
+
+typedef VOID
+(DDKAPI *PFREE_MAP_REGISTERS)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  PVOID  MapRegisterBase,
+  ULONG  NumberOfMapRegisters);
+
+typedef PHYSICAL_ADDRESS
+(DDKAPI *PMAP_TRANSFER)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PMDL  Mdl,
+  IN PVOID  MapRegisterBase,
+  IN PVOID  CurrentVa,
+  IN OUT PULONG  Length,
+  IN BOOLEAN  WriteToDevice);
+
+typedef ULONG
+(DDKAPI *PGET_DMA_ALIGNMENT)(
+  IN PDMA_ADAPTER  DmaAdapter);
+
+typedef ULONG
+(DDKAPI *PREAD_DMA_COUNTER)(
+  IN PDMA_ADAPTER  DmaAdapter);
+
+typedef VOID
+(DDKAPI *PDRIVER_LIST_CONTROL)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp,
+  IN struct _SCATTER_GATHER_LIST  *ScatterGather,
+  IN PVOID  Context);
+
+typedef NTSTATUS
+(DDKAPI *PGET_SCATTER_GATHER_LIST)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PMDL  Mdl,
+  IN PVOID  CurrentVa,
+  IN ULONG  Length,
+  IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
+  IN PVOID  Context,
+  IN BOOLEAN  WriteToDevice);
+
+typedef VOID
+(DDKAPI *PPUT_SCATTER_GATHER_LIST)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PSCATTER_GATHER_LIST  ScatterGather,
+  IN BOOLEAN  WriteToDevice);
+
+typedef NTSTATUS
+(DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PMDL  Mdl  OPTIONAL,
+  IN PVOID  CurrentVa,
+  IN ULONG  Length,
+  OUT PULONG  ScatterGatherListSize,
+  OUT PULONG  pNumberOfMapRegisters  OPTIONAL);
+
+typedef NTSTATUS
+(DDKAPI *PBUILD_SCATTER_GATHER_LIST)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PMDL  Mdl,
+  IN PVOID  CurrentVa,
+  IN ULONG  Length,
+  IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
+  IN PVOID  Context,
+  IN BOOLEAN  WriteToDevice,
+  IN PVOID  ScatterGatherBuffer,
+  IN ULONG  ScatterGatherLength);
+
+typedef NTSTATUS
+(DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
+  IN PDMA_ADAPTER  DmaAdapter,
+  IN PSCATTER_GATHER_LIST  ScatterGather,
+  IN PMDL  OriginalMdl,
+  OUT PMDL  *TargetMdl);
+
+typedef struct _DMA_OPERATIONS {
+  ULONG  Size;
+  PPUT_DMA_ADAPTER  PutDmaAdapter;
+  PALLOCATE_COMMON_BUFFER  AllocateCommonBuffer;
+  PFREE_COMMON_BUFFER  FreeCommonBuffer;
+  PALLOCATE_ADAPTER_CHANNEL  AllocateAdapterChannel;
+  PFLUSH_ADAPTER_BUFFERS  FlushAdapterBuffers;
+  PFREE_ADAPTER_CHANNEL  FreeAdapterChannel;
+  PFREE_MAP_REGISTERS  FreeMapRegisters;
+  PMAP_TRANSFER  MapTransfer;
+  PGET_DMA_ALIGNMENT  GetDmaAlignment;
+  PREAD_DMA_COUNTER  ReadDmaCounter;
+  PGET_SCATTER_GATHER_LIST  GetScatterGatherList;
+  PPUT_SCATTER_GATHER_LIST  PutScatterGatherList;
+  PCALCULATE_SCATTER_GATHER_LIST_SIZE  CalculateScatterGatherList;
+  PBUILD_SCATTER_GATHER_LIST  BuildScatterGatherList;
+  PBUILD_MDL_FROM_SCATTER_GATHER_LIST  BuildMdlFromScatterGatherList;
+} DMA_OPERATIONS, *PDMA_OPERATIONS;
+
+typedef struct _IO_RESOURCE_DESCRIPTOR {
+  UCHAR  Option;
+  UCHAR  Type;
+  UCHAR  ShareDisposition;
+  UCHAR  Spare1;
+  USHORT  Flags;
+  USHORT  Spare2;
+  union {
+    struct {
+      ULONG  Length;
+      ULONG  Alignment;
+      PHYSICAL_ADDRESS  MinimumAddress;
+      PHYSICAL_ADDRESS  MaximumAddress;
+    } Port;
+    struct {
+      ULONG  Length;
+      ULONG  Alignment;
+      PHYSICAL_ADDRESS  MinimumAddress;
+      PHYSICAL_ADDRESS  MaximumAddress;
+    } Memory;
+    struct {
+      ULONG  MinimumVector;
+      ULONG  MaximumVector;
+    } Interrupt;
+    struct {
+      ULONG  MinimumChannel;
+      ULONG  MaximumChannel;
+    } Dma;
+    struct {
+      ULONG  Length;
+      ULONG  Alignment;
+      PHYSICAL_ADDRESS  MinimumAddress;
+      PHYSICAL_ADDRESS  MaximumAddress;
+    } Generic;
+    struct {
+      ULONG  Data[3];
+    } DevicePrivate;
+    struct {
+      ULONG  Length;
+      ULONG  MinBusNumber;
+      ULONG  MaxBusNumber;
+      ULONG  Reserved;
+    } BusNumber;
+    struct {
+      ULONG  Priority;
+      ULONG  Reserved1;
+      ULONG  Reserved2;
+    } ConfigData;
+  } u;
+} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
+
+typedef struct _IO_RESOURCE_LIST {
+  USHORT  Version;
+  USHORT  Revision;
+  ULONG  Count;
+  IO_RESOURCE_DESCRIPTOR  Descriptors[1];
+} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
+
+typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
+  ULONG  ListSize;
+  INTERFACE_TYPE  InterfaceType;
+  ULONG  BusNumber;
+  ULONG  SlotNumber;
+  ULONG  Reserved[3];
+  ULONG  AlternativeLists;
+  IO_RESOURCE_LIST  List[1];
+} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
+
+typedef VOID
+(DDKAPI DRIVER_CANCEL)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp);
+typedef DRIVER_CANCEL *PDRIVER_CANCEL;
+
+typedef struct _IRP {
+  CSHORT  Type;
+  USHORT  Size;
+  struct _MDL  *MdlAddress;
+  ULONG  Flags;
+  union {
+    struct _IRP  *MasterIrp;
+    volatile LONG  IrpCount;
+    PVOID  SystemBuffer;
+  } AssociatedIrp;
+  LIST_ENTRY  ThreadListEntry;
+  IO_STATUS_BLOCK  IoStatus;
+  KPROCESSOR_MODE  RequestorMode;
+  BOOLEAN  PendingReturned;
+  CHAR  StackCount;
+  CHAR  CurrentLocation;
+  BOOLEAN  Cancel;
+  KIRQL  CancelIrql;
+  CCHAR  ApcEnvironment;
+  UCHAR  AllocationFlags;
+  PIO_STATUS_BLOCK  UserIosb;
+  PKEVENT  UserEvent;
+  union {
+    struct {
+      _ANONYMOUS_UNION union {      
+        PIO_APC_ROUTINE  UserApcRoutine;
+        PVOID IssuingProcess;
+      } DUMMYUNIONNAME;
+      PVOID  UserApcContext;
+    } AsynchronousParameters;
+    LARGE_INTEGER  AllocationSize;
+  } Overlay;
+  volatile PDRIVER_CANCEL  CancelRoutine;
+  PVOID  UserBuffer;
+  union {
+    struct {
+      _ANONYMOUS_UNION union {
+        KDEVICE_QUEUE_ENTRY  DeviceQueueEntry;
+        _ANONYMOUS_STRUCT struct {
+          PVOID  DriverContext[4];
+        } DUMMYSTRUCTNAME;
+      } DUMMYUNIONNAME;
+      PETHREAD  Thread;
+      PCHAR  AuxiliaryBuffer;
+      _ANONYMOUS_STRUCT struct {
+        LIST_ENTRY  ListEntry;
+        _ANONYMOUS_UNION union {
+          struct _IO_STACK_LOCATION  *CurrentStackLocation;
+          ULONG  PacketType;
+        } DUMMYUNIONNAME;
+      } DUMMYSTRUCTNAME;
+      struct _FILE_OBJECT  *OriginalFileObject;
+    } Overlay;
+    KAPC  Apc;
+    PVOID  CompletionKey;
+  } Tail;
+} IRP;
+typedef struct _IRP *PIRP;
+
+typedef enum _IO_PAGING_PRIORITY {
+  IoPagingPriorityInvalid,
+  IoPagingPriorityNormal,
+  IoPagingPriorityHigh,
+  IoPagingPriorityReserved1,
+  IoPagingPriorityReserved2
+} IO_PAGING_PRIORITY;
+
+typedef NTSTATUS
+(DDKAPI IO_COMPLETION_ROUTINE)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp,
+  IN PVOID  Context);
+typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
+
+typedef VOID
+(DDKAPI *PIO_DPC_ROUTINE)(
+  IN struct _KDPC  *Dpc,
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN struct _IRP  *Irp,
+  IN PVOID  Context);
+
+typedef NTSTATUS
+(DDKAPI *PMM_DLL_INITIALIZE)(
+  IN PUNICODE_STRING  RegistryPath);
+
+typedef NTSTATUS
+(DDKAPI *PMM_DLL_UNLOAD)(
+  VOID);
+
+typedef BOOLEAN
+(DDKAPI KSERVICE_ROUTINE)(
+  IN struct _KINTERRUPT  *Interrupt,
+  IN PVOID  ServiceContext);
+typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
+
+typedef VOID
+(DDKAPI *PIO_TIMER_ROUTINE)(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN PVOID  Context);
+
+typedef struct _IO_SECURITY_CONTEXT {
+  PSECURITY_QUALITY_OF_SERVICE  SecurityQos;
+  PACCESS_STATE  AccessState;
+  ACCESS_MASK  DesiredAccess;
+  ULONG  FullCreateOptions;
+} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
+
+struct _IO_CSQ;
+
+typedef struct _IO_CSQ_IRP_CONTEXT {
+  ULONG  Type;
+  struct _IRP  *Irp;
+  struct _IO_CSQ  *Csq;
+} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
+
+typedef VOID
+(DDKAPI *PIO_CSQ_INSERT_IRP)(
+  IN struct _IO_CSQ  *Csq,
+  IN PIRP  Irp);
+
+typedef VOID
+(DDKAPI *PIO_CSQ_REMOVE_IRP)(
+  IN struct _IO_CSQ  *Csq,
+  IN PIRP  Irp);
+
+typedef PIRP
+(DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
+  IN struct _IO_CSQ  *Csq,
+  IN PIRP  Irp,
+  IN PVOID  PeekContext);
+
+typedef VOID
+(DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
+  IN  struct _IO_CSQ  *Csq,
+  OUT PKIRQL  Irql);
+
+typedef VOID
+(DDKAPI *PIO_CSQ_RELEASE_LOCK)(
+  IN struct _IO_CSQ  *Csq,
+  IN KIRQL  Irql);
+
+typedef VOID
+(DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
+  IN  struct _IO_CSQ  *Csq,
+  IN  PIRP  Irp);
+
+typedef struct _IO_CSQ {
+  ULONG  Type;
+  PIO_CSQ_INSERT_IRP  CsqInsertIrp;
+  PIO_CSQ_REMOVE_IRP  CsqRemoveIrp;
+  PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp;
+  PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock;
+  PIO_CSQ_RELEASE_LOCK  CsqReleaseLock;
+  PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp;
+  PVOID  ReservePointer;
+} IO_CSQ, *PIO_CSQ;
+
+typedef enum _BUS_QUERY_ID_TYPE {
+  BusQueryDeviceID,
+  BusQueryHardwareIDs,
+  BusQueryCompatibleIDs,
+  BusQueryInstanceID,
+  BusQueryDeviceSerialNumber
+} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
+
+typedef enum _DEVICE_TEXT_TYPE {
+  DeviceTextDescription,
+  DeviceTextLocationInformation
+} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
+
+typedef enum _WORK_QUEUE_TYPE {
+  CriticalWorkQueue,
+  DelayedWorkQueue,
+  HyperCriticalWorkQueue,
+  MaximumWorkQueue
+} WORK_QUEUE_TYPE;
+
+#if !defined(_AMD64_) && !defined(_IA64_)
+#include <pshpack4.h>
+#endif
+typedef struct _IO_STACK_LOCATION {
+  UCHAR  MajorFunction;
+  UCHAR  MinorFunction;
+  UCHAR  Flags;
+  UCHAR  Control;
+  union {
+    struct {
+      PIO_SECURITY_CONTEXT  SecurityContext;
+      ULONG  Options;
+      USHORT POINTER_ALIGNMENT  FileAttributes;
+      USHORT  ShareAccess;
+      ULONG POINTER_ALIGNMENT  EaLength;
+    } Create;
+    struct {
+      ULONG  Length;
+      ULONG POINTER_ALIGNMENT  Key;
+      LARGE_INTEGER  ByteOffset;
+    } Read;
+    struct {
+      ULONG  Length;
+      ULONG POINTER_ALIGNMENT  Key;
+      LARGE_INTEGER  ByteOffset;
+    } Write;
+    struct {
+      ULONG  Length;
+      PUNICODE_STRING  FileName;
+      FILE_INFORMATION_CLASS  FileInformationClass;
+      ULONG  FileIndex;
+    } QueryDirectory;
+    struct {
+      ULONG  Length;
+      ULONG  CompletionFilter;
+    } NotifyDirectory;
+    struct {
+      ULONG  Length;
+      FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
+    } QueryFile;
+    struct {
+      ULONG  Length;
+      FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
+      PFILE_OBJECT  FileObject;
+      _ANONYMOUS_UNION union {
+        _ANONYMOUS_STRUCT struct {
+          BOOLEAN  ReplaceIfExists;
+          BOOLEAN  AdvanceOnly;
+        } DUMMYSTRUCTNAME;
+        ULONG  ClusterCount;
+        HANDLE  DeleteHandle;
+      } DUMMYUNIONNAME;
+    } SetFile;
+    struct {
+      ULONG  Length;
+      PVOID  EaList;
+      ULONG  EaListLength;
+      ULONG  EaIndex;
+    } QueryEa;
+    struct {
+      ULONG  Length;
+    } SetEa;
+    struct {
+      ULONG  Length;
+      FS_INFORMATION_CLASS POINTER_ALIGNMENT  FsInformationClass;
+    } QueryVolume;
+    struct {
+      ULONG  Length;
+      FS_INFORMATION_CLASS  FsInformationClass;
+    } SetVolume;
+    struct {
+      ULONG  OutputBufferLength;
+      ULONG  InputBufferLength;
+      ULONG  FsControlCode;
+      PVOID  Type3InputBuffer;
+    } FileSystemControl;
+    struct {
+      PLARGE_INTEGER  Length;
+      ULONG  Key;
+      LARGE_INTEGER  ByteOffset;
+    } LockControl;
+    struct {
+      ULONG  OutputBufferLength;
+      ULONG POINTER_ALIGNMENT  InputBufferLength;
+      ULONG POINTER_ALIGNMENT  IoControlCode;
+      PVOID  Type3InputBuffer;
+    } DeviceIoControl;
+    struct {
+      SECURITY_INFORMATION  SecurityInformation;
+      ULONG POINTER_ALIGNMENT  Length;
+    } QuerySecurity;
+    struct {
+      SECURITY_INFORMATION  SecurityInformation;
+      PSECURITY_DESCRIPTOR  SecurityDescriptor;
+    } SetSecurity;
+    struct {
+      PVPB  Vpb;
+      PDEVICE_OBJECT  DeviceObject;
+    } MountVolume;
+    struct {
+      PVPB  Vpb;
+      PDEVICE_OBJECT  DeviceObject;
+    } VerifyVolume;
+    struct {
+      struct _SCSI_REQUEST_BLOCK  *Srb;
+    } Scsi;
+    struct {
+      ULONG  Length;
+      PSID  StartSid;
+      struct _FILE_GET_QUOTA_INFORMATION  *SidList;
+      ULONG  SidListLength;
+    } QueryQuota;
+    struct {
+      ULONG  Length;
+    } SetQuota;
+    struct {
+      DEVICE_RELATION_TYPE  Type;
+    } QueryDeviceRelations;
+    struct {
+      CONST GUID  *InterfaceType;
+      USHORT  Size;
+      USHORT  Version;
+      PINTERFACE  Interface;
+      PVOID  InterfaceSpecificData;
+    } QueryInterface;
+    struct {
+      PDEVICE_CAPABILITIES  Capabilities;
+    } DeviceCapabilities;
+    struct {
+      PIO_RESOURCE_REQUIREMENTS_LIST  IoResourceRequirementList;
+    } FilterResourceRequirements;
+    struct {
+      ULONG  WhichSpace;
+      PVOID  Buffer;
+      ULONG  Offset;
+      ULONG POINTER_ALIGNMENT  Length;
+    } ReadWriteConfig;
+    struct {
+      BOOLEAN  Lock;
+    } SetLock;
+    struct {
+      BUS_QUERY_ID_TYPE  IdType;
+    } QueryId;
+    struct {
+      DEVICE_TEXT_TYPE  DeviceTextType;
+      LCID POINTER_ALIGNMENT  LocaleId;
+    } QueryDeviceText;
+    struct {
+      BOOLEAN  InPath;
+      BOOLEAN  Reserved[3];
+      DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT  Type;
+    } UsageNotification;
+    struct {
+      SYSTEM_POWER_STATE  PowerState;
+    } WaitWake;
+    struct {
+      PPOWER_SEQUENCE  PowerSequence;
+    } PowerSequence;
+    struct {
+      ULONG  SystemContext;
+      POWER_STATE_TYPE POINTER_ALIGNMENT  Type;
+      POWER_STATE POINTER_ALIGNMENT  State;
+      POWER_ACTION POINTER_ALIGNMENT  ShutdownType;
+    } Power;
+    struct {
+      PCM_RESOURCE_LIST  AllocatedResources;
+      PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
+    } StartDevice;
+    struct {
+      ULONG_PTR  ProviderId;
+      PVOID  DataPath;
+      ULONG  BufferSize;
+      PVOID  Buffer;
+    } WMI;
+    struct {
+      PVOID  Argument1;
+      PVOID  Argument2;
+      PVOID  Argument3;
+      PVOID  Argument4;
+    } Others;
+  } Parameters;
+  PDEVICE_OBJECT  DeviceObject;
+  PFILE_OBJECT  FileObject;
+  PIO_COMPLETION_ROUTINE  CompletionRoutine;
+  PVOID  Context;
+} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
+#if !defined(_AMD64_) && !defined(_IA64_)
+#include <poppack.h>
+#endif
+
+/* IO_STACK_LOCATION.Control */
+
+#define SL_PENDING_RETURNED               0x01
+#define SL_ERROR_RETURNED                 0x02
+#define SL_INVOKE_ON_CANCEL               0x20
+#define SL_INVOKE_ON_SUCCESS              0x40
+#define SL_INVOKE_ON_ERROR                0x80
+
+/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
+
+#define PCI_WHICHSPACE_CONFIG             0x0
+#define PCI_WHICHSPACE_ROM                0x52696350 /* 'PciR' */
+
+#define METHOD_BUFFERED                   0
+#define METHOD_IN_DIRECT                  1
+#define METHOD_OUT_DIRECT                 2
+#define METHOD_NEITHER                    3
+
+
+#define FILE_SUPERSEDED                   0x00000000
+#define FILE_OPENED                       0x00000001
+#define FILE_CREATED                      0x00000002
+#define FILE_OVERWRITTEN                  0x00000003
+#define FILE_EXISTS                       0x00000004
+#define FILE_DOES_NOT_EXIST               0x00000005
+
+#define FILE_USE_FILE_POINTER_POSITION    0xfffffffe
+#define FILE_WRITE_TO_END_OF_FILE         0xffffffff
+
+/* also in winnt.h */
+#define FILE_LIST_DIRECTORY               0x00000001
+#define FILE_READ_DATA                    0x00000001
+#define FILE_ADD_FILE                     0x00000002
+#define FILE_WRITE_DATA                   0x00000002
+#define FILE_ADD_SUBDIRECTORY             0x00000004
+#define FILE_APPEND_DATA                  0x00000004
+#define FILE_CREATE_PIPE_INSTANCE         0x00000004
+#define FILE_READ_EA                      0x00000008
+#define FILE_WRITE_EA                     0x00000010
+#define FILE_EXECUTE                      0x00000020
+#define FILE_TRAVERSE                     0x00000020
+#define FILE_DELETE_CHILD                 0x00000040
+#define FILE_READ_ATTRIBUTES              0x00000080
+#define FILE_WRITE_ATTRIBUTES             0x00000100
+
+#define FILE_SHARE_READ                   0x00000001
+#define FILE_SHARE_WRITE                  0x00000002
+#define FILE_SHARE_DELETE                 0x00000004
+#define FILE_SHARE_VALID_FLAGS            0x00000007
+
+#define FILE_ATTRIBUTE_READONLY           0x00000001
+#define FILE_ATTRIBUTE_HIDDEN             0x00000002
+#define FILE_ATTRIBUTE_SYSTEM             0x00000004
+#define FILE_ATTRIBUTE_DIRECTORY          0x00000010
+#define FILE_ATTRIBUTE_ARCHIVE            0x00000020
+#define FILE_ATTRIBUTE_DEVICE             0x00000040
+#define FILE_ATTRIBUTE_NORMAL             0x00000080
+#define FILE_ATTRIBUTE_TEMPORARY          0x00000100
+#define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
+#define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
+#define FILE_ATTRIBUTE_COMPRESSED         0x00000800
+#define FILE_ATTRIBUTE_OFFLINE            0x00001000
+#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
+#define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
+
+#define FILE_ATTRIBUTE_VALID_FLAGS        0x00007fb7
+#define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
+
+#define FILE_VALID_OPTION_FLAGS           0x00ffffff
+#define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
+#define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
+#define FILE_VALID_SET_FLAGS              0x00000036
+
+#define FILE_SUPERSEDE                    0x00000000
+#define FILE_OPEN                         0x00000001
+#define FILE_CREATE                       0x00000002
+#define FILE_OPEN_IF                      0x00000003
+#define FILE_OVERWRITE                    0x00000004
+#define FILE_OVERWRITE_IF                 0x00000005
+#define FILE_MAXIMUM_DISPOSITION          0x00000005
+
+#define FILE_DIRECTORY_FILE               0x00000001
+#define FILE_WRITE_THROUGH                0x00000002
+#define FILE_SEQUENTIAL_ONLY              0x00000004
+#define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
+#define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
+#define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
+#define FILE_NON_DIRECTORY_FILE           0x00000040
+#define FILE_CREATE_TREE_CONNECTION       0x00000080
+#define FILE_COMPLETE_IF_OPLOCKED         0x00000100
+#define FILE_NO_EA_KNOWLEDGE              0x00000200
+#define FILE_OPEN_REMOTE_INSTANCE         0x00000400
+#define FILE_RANDOM_ACCESS                0x00000800
+#define FILE_DELETE_ON_CLOSE              0x00001000
+#define FILE_OPEN_BY_FILE_ID              0x00002000
+#define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
+#define FILE_NO_COMPRESSION               0x00008000
+#define FILE_RESERVE_OPFILTER             0x00100000
+#define FILE_OPEN_REPARSE_POINT           0x00200000
+#define FILE_OPEN_NO_RECALL               0x00400000
+#define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
+
+#define FILE_ANY_ACCESS                   0x00000000
+#define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
+#define FILE_READ_ACCESS                  0x00000001
+#define FILE_WRITE_ACCESS                 0x00000002
+
+#define FILE_ALL_ACCESS \
+  (STANDARD_RIGHTS_REQUIRED | \
+   SYNCHRONIZE | \
+   0x1FF)
+
+#define FILE_GENERIC_EXECUTE \
+  (STANDARD_RIGHTS_EXECUTE | \
+   FILE_READ_ATTRIBUTES | \
+   FILE_EXECUTE | \
+   SYNCHRONIZE)
+
+#define FILE_GENERIC_READ \
+  (STANDARD_RIGHTS_READ | \
+   FILE_READ_DATA | \
+   FILE_READ_ATTRIBUTES | \
+   FILE_READ_EA | \
+   SYNCHRONIZE)
+
+#define FILE_GENERIC_WRITE \
+  (STANDARD_RIGHTS_WRITE | \
+   FILE_WRITE_DATA | \
+   FILE_WRITE_ATTRIBUTES | \
+   FILE_WRITE_EA | \
+   FILE_APPEND_DATA | \
+   SYNCHRONIZE)
+
+/* end winnt.h */
+
+/******************************************************************************
+ *                            Object Manager Types                            *
+ ******************************************************************************/
+
+typedef struct _OBJECT_NAME_INFORMATION {
+  UNICODE_STRING  Name;
+} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
+
+/* Exported object types */
+extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
+extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
+extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
+extern POBJECT_TYPE NTSYSAPI PsThreadType;
+extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
+extern POBJECT_TYPE NTSYSAPI PsProcessType;
+
+
+/******************************************************************************
+ *                           Process Manager Types                            *
+ ******************************************************************************/
+
+#define QUOTA_LIMITS_HARDWS_MIN_ENABLE  0x00000001
+#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
+#define QUOTA_LIMITS_HARDWS_MAX_ENABLE  0x00000004
+#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
+#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
+
+/* Process Qoutas */
+typedef struct _QUOTA_LIMITS {
+    SIZE_T PagedPoolLimit;
+    SIZE_T NonPagedPoolLimit;
+    SIZE_T MinimumWorkingSetSize;
+    SIZE_T MaximumWorkingSetSize;
+    SIZE_T PagefileLimit;
+    LARGE_INTEGER TimeLimit;
+} QUOTA_LIMITS, *PQUOTA_LIMITS;
+
+/* Thread Access Rights */
+#define THREAD_TERMINATE                 0x0001
+#define THREAD_SUSPEND_RESUME            0x0002
+#define THREAD_ALERT                     0x0004
+#define THREAD_GET_CONTEXT               0x0008
+#define THREAD_SET_CONTEXT               0x0010
+#define THREAD_SET_INFORMATION           0x0020
+#define THREAD_SET_LIMITED_INFORMATION   0x0400
+#define THREAD_QUERY_LIMITED_INFORMATION 0x0800
+
+#define PROCESS_DUP_HANDLE                 (0x0040)
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
+#else
+#define PROCESS_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
+#else
+#define THREAD_ALL_ACCESS   (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
+#endif
+
+#define ES_SYSTEM_REQUIRED                0x00000001
+#define ES_DISPLAY_REQUIRED               0x00000002
+#define ES_USER_PRESENT                   0x00000004
+#define ES_CONTINUOUS                     0x80000000
+
+#define LOW_PRIORITY                      0
+#define LOW_REALTIME_PRIORITY             16
+#define HIGH_PRIORITY                     31
+#define MAXIMUM_PRIORITY                  32
+
+
+#ifdef _X86_
+/** Kernel definitions for x86 **/
+
+/* Interrupt request levels */
+#define PASSIVE_LEVEL           0
+#define LOW_LEVEL               0
+#define APC_LEVEL               1
+#define DISPATCH_LEVEL          2
+#define CMCI_LEVEL              5
+#define PROFILE_LEVEL           27
+#define CLOCK1_LEVEL            28
+#define CLOCK2_LEVEL            28
+#define IPI_LEVEL               29
+#define POWER_LEVEL             30
+#define HIGH_LEVEL              31
+#define CLOCK_LEVEL             (CLOCK2_LEVEL)
+
+#define KIP0PCRADDRESS          0xffdff000  
+#define KI_USER_SHARED_DATA     0xffdf0000
+#define SharedUserData          ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
+
+#define PAGE_SIZE               0x1000
+#define PAGE_SHIFT              12L
+#define KeGetDcacheFillSize()   1L
+
+#define EFLAG_SIGN              0x8000
+#define EFLAG_ZERO              0x4000
+#define EFLAG_SELECT            (EFLAG_SIGN | EFLAG_ZERO)
+
+#define RESULT_NEGATIVE         ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
+#define RESULT_ZERO             ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
+#define RESULT_POSITIVE         ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
+
+
+typedef struct _KFLOATING_SAVE {
+  ULONG  ControlWord;
+  ULONG  StatusWord;
+  ULONG  ErrorOffset;
+  ULONG  ErrorSelector;
+  ULONG  DataOffset;
+  ULONG  DataSelector;
+  ULONG  Cr0NpxState;
+  ULONG  Spare1;
+} KFLOATING_SAVE, *PKFLOATING_SAVE;
+
+extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
+
+#define YieldProcessor _mm_pause
+
+FORCEINLINE
+VOID
+KeMemoryBarrier(
+  VOID)
+{
+  volatile LONG Barrier;
+#if defined(__GNUC__)
+  __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
+#elif defined(_MSC_VER)
+  __asm xchg [Barrier], eax
+#endif
+}
+
+NTHALAPI
+VOID
+FASTCALL
+KfLowerIrql(
+  IN KIRQL  NewIrql);
+#define KeLowerIrql(a) KfLowerIrql(a)
+
+NTHALAPI
+KIRQL
+FASTCALL
+KfRaiseIrql(
+  IN KIRQL  NewIrql);
+#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
+
+NTHALAPI
+KIRQL
+DDKAPI
+KeRaiseIrqlToDpcLevel(
+  VOID);
+
+NTHALAPI
+KIRQL
+DDKAPI
+KeRaiseIrqlToSynchLevel(
+    VOID);
+
+NTHALAPI
+KIRQL
+FASTCALL
+KfAcquireSpinLock(
+  IN PKSPIN_LOCK SpinLock);
+#define KeAcquireSpinLock(a,b)  *(b) = KfAcquireSpinLock(a)
+
+NTHALAPI
+VOID
+FASTCALL
+KfReleaseSpinLock(
+  IN PKSPIN_LOCK SpinLock,
+  IN KIRQL NewIrql);
+#define KeReleaseSpinLock(a,b)  KfReleaseSpinLock(a,b)
+
+NTKERNELAPI
+VOID
+FASTCALL
+KefAcquireSpinLockAtDpcLevel(
+  IN PKSPIN_LOCK  SpinLock);
+#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
+
+NTKERNELAPI
+VOID
+FASTCALL
+KefReleaseSpinLockFromDpcLevel(
+  IN PKSPIN_LOCK  SpinLock);
+#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
+
+NTSYSAPI
+PKTHREAD
+NTAPI
+KeGetCurrentThread(
+  VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeSaveFloatingPointState(
+  OUT PKFLOATING_SAVE  FloatSave);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeRestoreFloatingPointState(
+  IN PKFLOATING_SAVE  FloatSave);
+
+/* VOID
+ * KeFlushIoBuffers(
+ *   IN PMDL Mdl,
+ *   IN BOOLEAN ReadOperation,
+ *   IN BOOLEAN DmaOperation)
+ */
+#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
+
+/* x86 and x64 performs a 0x2C interrupt */
+#define DbgRaiseAssertionFailure __int2c
+
+FORCEINLINE
+VOID
+_KeQueryTickCount(
+  OUT PLARGE_INTEGER CurrentCount)
+{
+    for (;;)
+    {
+        CurrentCount->HighPart = KeTickCount.High1Time;
+        CurrentCount->LowPart = KeTickCount.LowPart;
+        if (CurrentCount->HighPart == KeTickCount.High2Time) break;
+        YieldProcessor();
+    }
+}
+#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
+
+#endif /* _X86_ */
+
+
+
+/******************************************************************************
+ *                         Runtime Library Functions                          *
+ ******************************************************************************/
+
+FORCEINLINE
+VOID
+InitializeListHead(
+  OUT PLIST_ENTRY ListHead)
+{
+  ListHead->Flink = ListHead->Blink = ListHead;
+}
+
+FORCEINLINE
+VOID
+InsertHeadList(
+  IN OUT PLIST_ENTRY  ListHead,
+  IN OUT PLIST_ENTRY  Entry)
+{
+  PLIST_ENTRY OldFlink;
+  OldFlink = ListHead->Flink;
+  Entry->Flink = OldFlink;
+  Entry->Blink = ListHead;
+  OldFlink->Blink = Entry;
+  ListHead->Flink = Entry;
+}
+
+FORCEINLINE
+VOID
+InsertTailList(
+  IN OUT PLIST_ENTRY  ListHead,
+  IN OUT PLIST_ENTRY  Entry)
+{
+  PLIST_ENTRY OldBlink;
+  OldBlink = ListHead->Blink;
+  Entry->Flink = ListHead;
+  Entry->Blink = OldBlink;
+  OldBlink->Flink = Entry;
+  ListHead->Blink = Entry;
+}
+
+BOOLEAN
+FORCEINLINE
+IsListEmpty(
+  IN CONST LIST_ENTRY * ListHead)
+{
+  return (BOOLEAN)(ListHead->Flink == ListHead);
+}
+
+FORCEINLINE
+PSINGLE_LIST_ENTRY
+PopEntryList(
+  IN OUT PSINGLE_LIST_ENTRY ListHead)
+{
+  PSINGLE_LIST_ENTRY FirstEntry;
+  FirstEntry = ListHead->Next;
+  if (FirstEntry != NULL) {
+    ListHead->Next = FirstEntry->Next;
+  }
+  return FirstEntry;
+}
+
+FORCEINLINE
+VOID
+PushEntryList(
+  IN OUT PSINGLE_LIST_ENTRY ListHead,
+  IN OUT PSINGLE_LIST_ENTRY Entry)
+{
+  Entry->Next = ListHead->Next;
+  ListHead->Next = Entry;
+}
+
+FORCEINLINE
+BOOLEAN
+RemoveEntryList(
+  IN PLIST_ENTRY  Entry)
+{
+  PLIST_ENTRY OldFlink;
+  PLIST_ENTRY OldBlink;
+
+  OldFlink = Entry->Flink;
+  OldBlink = Entry->Blink;
+  OldFlink->Blink = OldBlink;
+  OldBlink->Flink = OldFlink;
+  return (BOOLEAN)(OldFlink == OldBlink);
+}
+
+FORCEINLINE
+PLIST_ENTRY
+RemoveHeadList(
+  IN OUT PLIST_ENTRY  ListHead)
+{
+  PLIST_ENTRY Flink;
+  PLIST_ENTRY Entry;
+
+  Entry = ListHead->Flink;
+  Flink = Entry->Flink;
+  ListHead->Flink = Flink;
+  Flink->Blink = ListHead;
+  return Entry;
+}
+
+FORCEINLINE
+PLIST_ENTRY
+RemoveTailList(
+  IN OUT PLIST_ENTRY  ListHead)
+{
+  PLIST_ENTRY Blink;
+  PLIST_ENTRY Entry;
+
+  Entry = ListHead->Blink;
+  Blink = Entry->Blink;
+  ListHead->Blink = Blink;
+  Blink->Flink = ListHead;
+  return Entry;
+}
+
+NTSYSAPI
+VOID
+NTAPI
+RtlAssert(
+    IN PVOID FailedAssertion,
+    IN PVOID FileName,
+    IN ULONG LineNumber,
+    IN PSTR Message);
+
+/* VOID
+ * RtlCopyMemory(
+ *     IN VOID UNALIGNED *Destination,
+ *     IN CONST VOID UNALIGNED *Source,
+ *     IN SIZE_T Length)
+ */
+#define RtlCopyMemory(Destination, Source, Length) \
+    memcpy(Destination, Source, Length)
+
+#define RtlCopyBytes RtlCopyMemory
+
+#if defined(_M_AMD64)
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyMemoryNonTemporal(
+    VOID UNALIGNED *Destination,
+    CONST VOID UNALIGNED *Source,
+    SIZE_T Length);
+#else
+#define RtlCopyMemoryNonTemporal RtlCopyMemory
+#endif
+
+/* BOOLEAN
+ * RtlEqualLuid(
+ *     IN PLUID Luid1,
+ *     IN PLUID Luid2)
+ */
+#define RtlEqualLuid(Luid1, Luid2) \
+    (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
+
+/* ULONG
+ * RtlEqualMemory(
+ *     IN VOID UNALIGNED *Destination,
+ *     IN CONST VOID UNALIGNED *Source,
+ *     IN SIZE_T Length)
+ */
+#define RtlEqualMemory(Destination, Source, Length) \
+    (!memcmp(Destination, Source, Length))
+
+/* VOID
+ * RtlFillMemory(
+ *     IN VOID UNALIGNED *Destination,
+ *     IN SIZE_T Length,
+ *     IN UCHAR Fill)
+ */
+#define RtlFillMemory(Destination, Length, Fill) \
+    memset(Destination, Fill, Length)
+
+#define RtlFillBytes RtlFillMemory
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFreeUnicodeString(
+    IN OUT PUNICODE_STRING UnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGUIDFromString(
+    IN PUNICODE_STRING GuidString,
+    OUT GUID *Guid);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitUnicodeString(
+    IN OUT PUNICODE_STRING DestinationString,
+    IN PCWSTR SourceString OPTIONAL);
+
+/* VOID
+ * RtlMoveMemory(
+ *    IN VOID UNALIGNED *Destination,
+ *    IN CONST VOID UNALIGNED *Source,
+ *    IN SIZE_T Length)
+ */
+#define RtlMoveMemory(Destination, Source, Length) \
+    memmove(Destination, Source, Length)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlStringFromGUID(
+    IN REFGUID Guid,
+    OUT PUNICODE_STRING GuidString);
+
+/* VOID
+ * RtlZeroMemory(
+ *     IN VOID UNALIGNED *Destination,
+ *     IN SIZE_T Length)
+ */
+#define RtlZeroMemory(Destination, Length) \
+    memset(Destination, 0, Length)
+
+#define RtlZeroBytes RtlZeroMemory
+
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlAreBitsClear(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG StartingIndex,
+    IN ULONG Length);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlAreBitsSet(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG StartingIndex,
+    IN ULONG Length);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAnsiStringToUnicodeString(
+    IN OUT PUNICODE_STRING DestinationString,
+    IN PANSI_STRING SourceString,
+    IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlxAnsiStringToUnicodeSize(
+    IN PCANSI_STRING AnsiString);
+
+#define RtlAnsiStringToUnicodeSize(String) (               \
+  NLS_MB_CODE_PAGE_TAG ?                                   \
+  RtlxAnsiStringToUnicodeSize(String) :                    \
+  ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR)   \
+)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAppendUnicodeStringToString(
+    IN OUT PUNICODE_STRING Destination,
+    IN PCUNICODE_STRING Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAppendUnicodeToString(
+    IN OUT PUNICODE_STRING Destination,
+    IN PCWSTR Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCheckRegistryKey(
+    IN ULONG RelativeTo,
+    IN PWSTR Path);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlClearAllBits(
+    IN PRTL_BITMAP BitMapHeader);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlClearBits(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG StartingIndex,
+    IN ULONG NumberToClear);
+
+NTSYSAPI
+SIZE_T
+NTAPI
+RtlCompareMemory(
+    IN CONST VOID *Source1,
+    IN CONST VOID *Source2,
+    IN SIZE_T Length);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareUnicodeString(
+    IN PCUNICODE_STRING String1,
+    IN PCUNICODE_STRING String2,
+    IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareUnicodeStrings(
+    IN PCWCH String1,
+    IN SIZE_T String1Length,
+    IN PCWCH String2,
+    IN SIZE_T String2Length,
+    IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyUnicodeString(
+  IN OUT PUNICODE_STRING  DestinationString,
+  IN PCUNICODE_STRING  SourceString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateRegistryKey(
+    IN ULONG RelativeTo,
+    IN PWSTR Path);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateSecurityDescriptor(
+    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+    IN ULONG Revision);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDeleteRegistryValue(
+    IN ULONG RelativeTo,
+    IN PCWSTR Path,
+    IN PCWSTR ValueName);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualUnicodeString(
+    IN CONST UNICODE_STRING *String1,
+    IN CONST UNICODE_STRING *String2,
+    IN BOOLEAN CaseInSensitive);
+
+#if !defined(_AMD64_) && !defined(_IA64_)
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlExtendedIntegerMultiply(
+    IN LARGE_INTEGER Multiplicand,
+    IN LONG Multiplier);
+
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlExtendedLargeIntegerDivide(
+  IN LARGE_INTEGER Dividend,
+  IN ULONG Divisor,
+  IN OUT PULONG Remainder);
+#endif
+
+#if defined(_X86_) || defined(_IA64_)
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlExtendedMagicDivide(
+    IN LARGE_INTEGER Dividend,
+    IN LARGE_INTEGER MagicDivisor,
+    IN CCHAR  ShiftCount);
+#endif
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFreeAnsiString(
+    IN PANSI_STRING AnsiString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindClearBits(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG NumberToFind,
+    IN ULONG HintIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindClearBitsAndSet(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG NumberToFind,
+    IN ULONG HintIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindFirstRunClear(
+    IN PRTL_BITMAP BitMapHeader,
+    OUT PULONG StartingIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindClearRuns(
+    IN PRTL_BITMAP BitMapHeader,
+    OUT PRTL_BITMAP_RUN RunArray,
+    IN ULONG SizeOfRunArray,
+    IN BOOLEAN LocateLongestRuns);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindLastBackwardRunClear(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG FromIndex,
+    OUT PULONG StartingRunIndex);
+
+NTSYSAPI
+CCHAR
+NTAPI
+RtlFindLeastSignificantBit(
+    IN ULONGLONG Set);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindLongestRunClear(
+    IN PRTL_BITMAP BitMapHeader,
+    OUT PULONG StartingIndex);
+
+NTSYSAPI
+CCHAR
+NTAPI
+RtlFindMostSignificantBit(
+    IN ULONGLONG Set);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindNextForwardRunClear(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG FromIndex,
+    OUT PULONG StartingRunIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindSetBits(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG NumberToFind,
+    IN ULONG HintIndex);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlFindSetBitsAndClear(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG NumberToFind,
+    IN ULONG HintIndex);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlHashUnicodeString(
+    IN CONST UNICODE_STRING *String,
+    IN BOOLEAN CaseInSensitive,
+    IN ULONG HashAlgorithm,
+    OUT PULONG HashValue);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitAnsiString(
+    IN OUT PANSI_STRING DestinationString,
+    IN PCSZ SourceString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitializeBitMap(
+    IN PRTL_BITMAP BitMapHeader,
+    IN PULONG BitMapBuffer,
+    IN ULONG SizeOfBitMap);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitString(
+    IN OUT PSTRING DestinationString,
+    IN PCSZ SourceString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIntegerToUnicodeString(
+    IN ULONG Value,
+    IN ULONG Base OPTIONAL,
+    IN OUT PUNICODE_STRING String);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInt64ToUnicodeString(
+    IN ULONGLONG Value,
+    IN ULONG Base OPTIONAL,
+    IN OUT PUNICODE_STRING String);
+
+#ifdef _WIN64
+#define RtlIntPtrToUnicodeString(Value, Base, String) \
+    RtlInt64ToUnicodeString(Value, Base, String)
+#else
+#define RtlIntPtrToUnicodeString(Value, Base, String) \
+    RtlIntegerToUnicodeString(Value, Base, String)
+#endif
+
+/* BOOLEAN
+ * RtlIsZeroLuid(
+ *     IN PLUID L1);
+ */
+#define RtlIsZeroLuid(_L1) \
+    ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlLengthSecurityDescriptor(
+    IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberOfClearBits(
+    IN PRTL_BITMAP BitMapHeader);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberOfSetBits(
+    IN PRTL_BITMAP BitMapHeader);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlQueryRegistryValues(
+    IN ULONG RelativeTo,
+    IN PCWSTR Path,
+    IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
+    IN PVOID Context,
+    IN PVOID Environment OPTIONAL);
+
+#define LONG_SIZE (sizeof(LONG))
+#define LONG_MASK (LONG_SIZE - 1)
+
+/* VOID
+ * RtlRetrieveUlong(
+ *       PULONG DestinationAddress,
+ *       PULONG SourceAddress);
+ */
+#if defined(_AMD64_)
+#define RtlRetrieveUlong(DestAddress,SrcAddress) \
+    *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
+#else
+#define RtlRetrieveUlong(DestAddress,SrcAddress) \
+    if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
+    { \
+        ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
+        ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
+        ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
+        ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
+    } \
+    else \
+    { \
+        *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
+    }
+#endif
+
+/* VOID
+ * RtlRetrieveUshort(
+ *       PUSHORT DestinationAddress,
+ *       PUSHORT SourceAddress);
+ */
+#if defined(_AMD64_)
+#define RtlRetrieveUshort(DestAddress,SrcAddress) \
+    *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
+#else
+#define RtlRetrieveUshort(DestAddress,SrcAddress) \
+    if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
+    { \
+        ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
+        ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
+    } \
+    else \
+    { \
+        *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
+    }
+#endif
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSetAllBits(
+    IN PRTL_BITMAP BitMapHeader);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSetBits(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG StartingIndex,
+    IN ULONG NumberToSet);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetDaclSecurityDescriptor(
+    IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+    IN BOOLEAN DaclPresent,
+    IN PACL Dacl OPTIONAL,
+    IN BOOLEAN DaclDefaulted OPTIONAL);
+
+/* VOID
+ * RtlStoreUlong(
+ *     IN PULONG Address,
+ *     IN ULONG Value);
+ */
+#if defined(_AMD64_)
+#define RtlStoreUlong(Address,Value) \
+    *(ULONG UNALIGNED *)(Address) = (Value)
+#else
+#define RtlStoreUlong(Address,Value)                      \
+    if ((ULONG_PTR)(Address) & LONG_MASK) { \
+        ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT]    = (UCHAR)(FIRSTBYTE(Value)); \
+        ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
+        ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
+        ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT]     = (UCHAR)(FOURTHBYTE(Value)); \
+    } \
+    else { \
+        *((PULONG)(Address)) = (ULONG) (Value); \
+    }
+#endif
+
+/* VOID
+ * RtlStoreUlonglong(
+ *     IN OUT PULONGLONG Address,
+ *     ULONGLONG Value);
+ */
+#if defined(_AMD64_)
+#define RtlStoreUlonglong(Address,Value) \
+    *(ULONGLONG UNALIGNED *)(Address) = (Value)
+#else
+#define RtlStoreUlonglong(Address,Value) \
+    if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
+        RtlStoreUlong((ULONG_PTR)(Address), \
+                      (ULONGLONG)(Value) & 0xFFFFFFFF); \
+        RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
+                      (ULONGLONG)(Value) >> 32); \
+    } else { \
+        *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
+    }
+#endif
+
+/* VOID
+ * RtlStoreUlongPtr(
+ *     IN OUT PULONG_PTR Address,
+ *     IN ULONG_PTR Value);
+ */
+#ifdef _WIN64
+#define RtlStoreUlongPtr(Address,Value)                         \
+    RtlStoreUlonglong(Address,Value)
+#else
+#define RtlStoreUlongPtr(Address,Value)                         \
+    RtlStoreUlong(Address,Value)
+#endif
+
+/* VOID
+ * RtlStoreUshort(
+ *     IN PUSHORT Address,
+ *     IN USHORT Value);
+ */
+#if defined(_AMD64_)
+#define RtlStoreUshort(Address,Value) \
+    *(USHORT UNALIGNED *)(Address) = (Value)
+#else
+#define RtlStoreUshort(Address,Value) \
+    if ((ULONG_PTR)(Address) & SHORT_MASK) { \
+        ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
+        ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
+    } \
+    else { \
+        *((PUSHORT) (Address)) = (USHORT)Value; \
+    }
+#endif
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTimeFieldsToTime(
+    IN PTIME_FIELDS TimeFields,
+    IN PLARGE_INTEGER Time);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlTimeToTimeFields(
+    IN PLARGE_INTEGER Time,
+    IN PTIME_FIELDS TimeFields);
+
+NTSYSAPI
+ULONG
+FASTCALL
+RtlUlongByteSwap(
+    IN ULONG Source);
+
+NTSYSAPI
+ULONGLONG
+FASTCALL
+RtlUlonglongByteSwap(
+    IN ULONGLONG Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToAnsiString(
+    IN OUT PANSI_STRING DestinationString,
+    IN PCUNICODE_STRING SourceString,
+    IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlxUnicodeStringToAnsiSize(
+    IN PCUNICODE_STRING UnicodeString);
+
+#define RtlUnicodeStringToAnsiSize(String) (                  \
+    NLS_MB_CODE_PAGE_TAG ?                                    \
+    RtlxUnicodeStringToAnsiSize(String) :                     \
+    ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
+)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToInteger(
+    IN PCUNICODE_STRING String,
+    IN ULONG Base OPTIONAL,
+    OUT PULONG Value);
+
+NTSYSAPI
+WCHAR
+NTAPI
+RtlUpcaseUnicodeChar(
+    IN WCHAR SourceCharacter);
+
+NTSYSAPI
+USHORT
+FASTCALL
+RtlUshortByteSwap(
+    IN USHORT Source);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlValidRelativeSecurityDescriptor(
+    IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
+    IN ULONG SecurityDescriptorLength,
+    IN SECURITY_INFORMATION RequiredInformation);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlValidSecurityDescriptor(
+    IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlWriteRegistryValue(
+    IN ULONG RelativeTo,
+    IN PCWSTR Path,
+    IN PCWSTR ValueName,
+    IN ULONG ValueType,
+    IN PVOID ValueData,
+    IN ULONG ValueLength);
+
+#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
+
+#if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
+NTSYSAPI
+VOID
+FASTCALL
+RtlPrefetchMemoryNonTemporal(
     IN PVOID Source,
     IN SIZE_T Length);
 #endif
 
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-NTSYSAPI
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTSYSAPI
+VOID
+NTAPI
+RtlClearBit(
+    PRTL_BITMAP BitMapHeader,
+    ULONG BitNumber);
+
+NTSYSAPI
+WCHAR
+NTAPI
+RtlDowncaseUnicodeChar(
+    IN WCHAR SourceCharacter);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSetBit(
+    PRTL_BITMAP BitMapHeader,
+    ULONG BitNumber);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTestBit(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG BitNumber);
+
+#endif // (NTDDI_VERSION >= NTDDI_WINXP)
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberOfSetBitsUlongPtr(
+    IN ULONG_PTR Target);
+
+NTSYSAPI
+ULONGLONG
+NTAPI
+RtlIoDecodeMemIoResource (
+    IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
+    OUT PULONGLONG Alignment OPTIONAL,
+    OUT PULONGLONG MinimumAddress OPTIONAL,
+    OUT PULONGLONG MaximumAddress OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIoEncodeMemIoResource(
+    IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
+    IN UCHAR Type,
+    IN ULONGLONG Length,
+    IN ULONGLONG Alignment,
+    IN ULONGLONG MinimumAddress,
+    IN ULONGLONG MaximumAddress);
+
+NTSYSAPI
+ULONGLONG
+NTAPI
+RtlCmDecodeMemIoResource(
+    IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
+    OUT PULONGLONG Start OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlFindClosestEncodableLength(
+    IN ULONGLONG SourceLength,
+    OUT PULONGLONG TargetLength);
+
+#endif
+
+#if !defined(MIDL_PASS)
+/* inline funftions */
+//DECLSPEC_DEPRECATED_DDK_WINXP
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlConvertLongToLargeInteger(LONG SignedInteger)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = SignedInteger;
+    return ret;
+}
+
+//DECLSPEC_DEPRECATED_DDK_WINXP
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlConvertUlongToLargeInteger(
+  ULONG UnsignedInteger)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = UnsignedInteger;
+    return ret;
+}
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+ULONG
+NTAPI_INLINE
+RtlEnlargedUnsignedDivide(
+    IN ULARGE_INTEGER Dividend,
+    IN ULONG Divisor,
+    IN OUT PULONG Remainder)
+{
+    if (Remainder)
+        *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
+    return (ULONG)(Dividend.QuadPart / Divisor);
+}
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlEnlargedUnsignedMultiply(
+    IN ULONG Multiplicand,
+    IN ULONG Multiplier)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
+    return ret;
+}
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlEnlargedIntegerMultiply(
+    IN LONG Multiplicand,
+    IN LONG Multiplier)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
+    return ret;
+}
+
+FORCEINLINE
+VOID
+RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
+                       IN PCHAR Buffer,
+                       IN USHORT BufferSize)
+{
+    AnsiString->Length = 0;
+    AnsiString->MaximumLength = BufferSize;
+    AnsiString->Buffer = Buffer;
+}
+
+FORCEINLINE
+VOID
+RtlInitEmptyUnicodeString(
+    OUT PUNICODE_STRING UnicodeString,
+    IN PWSTR Buffer,
+    IN USHORT BufferSize)
+{
+    UnicodeString->Length = 0;
+    UnicodeString->MaximumLength = BufferSize;
+    UnicodeString->Buffer = Buffer;
+}
+
+#if defined(_AMD64_) || defined(_IA64_)
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlExtendedIntegerMultiply(
+    LARGE_INTEGER Multiplicand,
+    LONG Multiplier)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = Multiplicand.QuadPart * Multiplier;
+    return ret;
+}
+
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlExtendedLargeIntegerDivide(
+    LARGE_INTEGER Dividend,
+    ULONG Divisor,
+    PULONG Remainder)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
+    if (Remainder)
+        *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
+    return ret;
+}
+#endif
+
+#if defined(_AMD64_)
+
+#define MultiplyHigh __mulh
+#define UnsignedMultiplyHigh __umulh
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlExtendedMagicDivide(
+    IN LARGE_INTEGER Dividend,
+    IN LARGE_INTEGER MagicDivisor,
+    IN CCHAR ShiftCount)
+{
+    LARGE_INTEGER ret;
+    ULONG64 ret64;
+    BOOLEAN Pos;
+    Pos = (Dividend.QuadPart >= 0);
+    ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
+                                 MagicDivisor.QuadPart);
+    ret64 >>= ShiftCount;
+    ret.QuadPart = Pos ? ret64 : -ret64;
+    return ret;
+}
+#endif
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlLargeIntegerAdd(
+    IN LARGE_INTEGER Addend1,
+    IN LARGE_INTEGER Addend2)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
+    return ret;
+}
+
+/* VOID
+ * RtlLargeIntegerAnd(
+ *     IN OUT LARGE_INTEGER Result,
+ *     IN LARGE_INTEGER Source,
+ *     IN LARGE_INTEGER Mask);
+ */
+#define RtlLargeIntegerAnd(Result, Source, Mask) \
+    Result.QuadPart = Source.QuadPart & Mask.QuadPart
+
+//DECLSPEC_DEPRECATED_DDK
+static __inline
+LARGE_INTEGER
+NTAPI_INLINE
+RtlLargeIntegerArithmeticShift(
+    IN LARGE_INTEGER LargeInteger,
+    IN CCHAR ShiftCount)
+{
+    LARGE_INTEGER ret;
+    ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
+    return ret;
+}
+
+/* BOOLEAN
+ * RtlLargeIntegerEqualTo(
+ *     IN LARGE_INTEGER  Operand1,
+ *     IN LARGE_INTEGER  Operand2);
+ */
+#define RtlLargeIntegerEqualTo(X,Y) \
+    (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
+
+FORCEINLINE
+PVOID
+RtlSecureZeroMemory(
+    OUT PVOID Pointer,
+    IN SIZE_T Size)
+{
+    volatile char* vptr = (volatile char*)Pointer;
+#if defined(_M_AMD64)
+    __stosb((PUCHAR)vptr, 0, Size);
+#else
+    char * endptr = (char *)vptr + Size;
+    while (vptr < endptr)
+    {
+        *vptr = 0; vptr++;
+    }
+#endif
+     return Pointer;
+}
+
+#if defined(_M_AMD64)
+FORCEINLINE
+ULONG
+RtlCheckBit(
+    IN PRTL_BITMAP BitMapHeader,
+    IN ULONG BitPosition)
+{
+    return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
+}
+#else
+#define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
+#endif // defined(_M_AMD64)
+
+#endif // !defined(MIDL_PASS)
+
+/* Byte Swap Functions */
+#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
+    ((defined(_M_AMD64) || defined(_M_IA64)) \
+        && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
+
+#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
+#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
+#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
+
+#endif
+
+#if DBG
+
+#define ASSERT(exp) \
+  (VOID)((!(exp)) ? \
+    RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
+
+#define ASSERTMSG(msg, exp) \
+  (VOID)((!(exp)) ? \
+    RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
+
+#define RTL_SOFT_ASSERT(exp) \
+  (VOID)((!(exp)) ? \
+    DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
+
+#define RTL_SOFT_ASSERTMSG(msg, exp) \
+  (VOID)((!(exp)) ? \
+    DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n   Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
+
+#define RTL_VERIFY(exp) ASSERT(exp)
+#define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
+
+#define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
+#define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
+
+#if defined(_MSC_VER)
+
+#define NT_ASSERT(exp) \
+   ((!(exp)) ? \
+      (__annotation(L"Debug", L"AssertFail", L#exp), \
+       DbgRaiseAssertionFailure(), FALSE) : TRUE)
+
+#define NT_ASSERTMSG(msg, exp) \
+   ((!(exp)) ? \
+      (__annotation(L"Debug", L"AssertFail", L##msg), \
+      DbgRaiseAssertionFailure(), FALSE) : TRUE)
+
+#define NT_ASSERTMSGW(msg, exp) \
+    ((!(exp)) ? \
+        (__annotation(L"Debug", L"AssertFail", msg), \
+         DbgRaiseAssertionFailure(), FALSE) : TRUE)
+
+#else
+
+/* GCC doesn't support __annotation (nor PDB) */
+#define NT_ASSERT(exp) \
+   (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
+
+#define NT_ASSERTMSG NT_ASSERT
+#define NT_ASSERTMSGW NT_ASSERT
+
+#endif
+
+#else /* !DBG */
+
+#define ASSERT(exp) ((VOID) 0)
+#define ASSERTMSG(msg, exp) ((VOID) 0)
+
+#define RTL_SOFT_ASSERT(exp) ((VOID) 0)
+#define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
+
+#define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
+#define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
+
+#define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
+#define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
+
+#define NT_ASSERT(exp)     ((VOID)0)
+#define NT_ASSERTMSG(exp)  ((VOID)0)
+#define NT_ASSERTMSGW(exp) ((VOID)0)
+
+#endif /* DBG */
+
+#if !defined(_WINBASE_)
+
+#if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
+
+NTKERNELAPI
+VOID
+InitializeSListHead(
+  OUT PSLIST_HEADER SListHead);
+
+#else
+
+VOID
+FORCEINLINE
+InitializeSListHead(
+  OUT PSLIST_HEADER SListHead)
+{
+#if defined(_IA64_)
+    ULONG64 FeatureBits;
+#endif
+
+#if defined(_WIN64)
+    if (((ULONG_PTR)SListHead & 0xf) != 0)
+    {
+        RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
+    }
+#endif
+
+    RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
+
+#if defined(_IA64_)
+    FeatureBits = __getReg(CV_IA64_CPUID4);
+    if ((FeatureBits & KF_16BYTE_INSTR) != 0)
+    {
+        SListHead->Header16.HeaderType = 1;
+        SListHead->Header16.Init = 1;
+    }
+#endif
+}
+
+#endif
+
+#if defined(_WIN64)
+
+#define InterlockedPopEntrySList(Head) \
+    ExpInterlockedPopEntrySList(Head)
+
+#define InterlockedPushEntrySList(Head, Entry) \
+    ExpInterlockedPushEntrySList(Head, Entry)
+
+#define InterlockedFlushSList(Head) \
+    ExpInterlockedFlushSList(Head)
+
+#define QueryDepthSList(Head) \
+    ExQueryDepthSList(Head)
+
+#else /* !defined(_WIN64) */
+
+NTKERNELAPI
+PSLIST_ENTRY
+FASTCALL
+InterlockedPopEntrySList(
+    IN PSLIST_HEADER ListHead);
+
+NTKERNELAPI
+PSLIST_ENTRY
+FASTCALL
+InterlockedPushEntrySList(
+    IN PSLIST_HEADER ListHead,
+    IN PSLIST_ENTRY ListEntry);
+
+#define InterlockedFlushSList(ListHead) \
+    ExInterlockedFlushSList(ListHead)
+
+#define QueryDepthSList(Head) \
+    ExQueryDepthSList(Head)
+
+#endif /* !defined(_WIN64) */
+
+#endif /* !defined(_WINBASE_) */
+
+/******************************************************************************
+ *                              Kernel Functions                              *
+ ******************************************************************************/
+
+NTHALAPI
+KIRQL
+NTAPI
+KeGetCurrentIrql(
+    VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeEvent(
+  OUT PRKEVENT  Event,
+  IN EVENT_TYPE  Type,
+  IN BOOLEAN  State);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeClearEvent(
+  IN OUT PRKEVENT Event);
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+VOID
+NTAPI
+ProbeForRead(
+  IN CONST VOID *Address, /* CONST is added */
+  IN SIZE_T Length,
+  IN ULONG Alignment);
+
+NTKERNELAPI
+VOID
+NTAPI
+ProbeForWrite(
+  IN PVOID Address,
+  IN SIZE_T Length,
+  IN ULONG Alignment);
+
+#if defined(SINGLE_GROUP_LEGACY_API)
+NTKERNELAPI
+VOID
+NTAPI
+KeRevertToUserAffinityThread(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetSystemAffinityThread(
+    IN KAFFINITY Affinity);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetTargetProcessorDpc(
+  IN OUT PRKDPC Dpc,
+  IN CCHAR Number);
+
+NTKERNELAPI
+KAFFINITY
+NTAPI
+KeQueryActiveProcessors(
+  VOID);
+#endif
+
+#if !defined(_M_AMD64)
+NTKERNELAPI
+ULONGLONG
+NTAPI
+KeQueryInterruptTime(
+  VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeQuerySystemTime(
+  OUT PLARGE_INTEGER  CurrentTime);
+#endif /* !_M_AMD64 */
+
+#if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeSpinLock(
+    IN PKSPIN_LOCK SpinLock);
+#else
+FORCEINLINE
+VOID
+KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
+{
+    /* Clear the lock */
+    *SpinLock = 0;
+}
+#endif
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+KeBugCheckEx(
+  IN ULONG  BugCheckCode,
+  IN ULONG_PTR  BugCheckParameter1,
+  IN ULONG_PTR  BugCheckParameter2,
+  IN ULONG_PTR  BugCheckParameter3,
+  IN ULONG_PTR  BugCheckParameter4);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeCancelTimer(
+  IN OUT PKTIMER);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeDelayExecutionThread(
+  IN KPROCESSOR_MODE WaitMode,
+  IN BOOLEAN Alertable,
+  IN PLARGE_INTEGER Interval);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeDeregisterBugCheckCallback(
+  IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeEnterCriticalRegion(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeDeviceQueue(
+  OUT PKDEVICE_QUEUE  DeviceQueue);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeDpc(
+  OUT PRKDPC  Dpc,
+  IN PKDEFERRED_ROUTINE  DeferredRoutine,
+  IN PVOID  DeferredContext OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeMutex(
+  OUT PRKMUTEX  Mutex,
+  IN ULONG  Level);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeSemaphore(
+  OUT PRKSEMAPHORE  Semaphore,
+  IN LONG  Count,
+  IN LONG  Limit);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeTimer(
+  OUT PKTIMER  Timer);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeTimerEx(
+  OUT PKTIMER  Timer,
+  IN TIMER_TYPE  Type);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeInsertByKeyDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue,
+  IN OUT PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry,
+  IN ULONG  SortKey);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeInsertDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue,
+  IN OUT PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeInsertQueueDpc(
+  IN OUT PRKDPC  Dpc,
+  IN PVOID  SystemArgument1 OPTIONAL,
+  IN PVOID  SystemArgument2 OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeLeaveCriticalRegion(VOID);
+
+NTHALAPI
+LARGE_INTEGER
+NTAPI
+KeQueryPerformanceCounter(
+  OUT PLARGE_INTEGER  PerformanceFrequency  OPTIONAL);
+
+NTKERNELAPI
+KPRIORITY
+NTAPI
+KeQueryPriorityThread(
+  IN PRKTHREAD  Thread);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryTimeIncrement(
+  VOID);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReadStateEvent(
+  IN PRKEVENT  Event);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReadStateMutex(
+  IN PRKMUTEX  Mutex);
+
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReadStateSemaphore(
+  IN PRKSEMAPHORE  Semaphore);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeReadStateTimer(
+  IN PKTIMER  Timer);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeRegisterBugCheckCallback(
+  OUT PKBUGCHECK_CALLBACK_RECORD  CallbackRecord,
+  IN PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine,
+  IN PVOID  Buffer,
+  IN ULONG  Length,
+  IN PUCHAR  Component);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReleaseMutex(
+  IN OUT PRKMUTEX  Mutex,
+  IN BOOLEAN  Wait);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReleaseSemaphore(
+  IN OUT PRKSEMAPHORE  Semaphore,
+  IN KPRIORITY  Increment,
+  IN LONG  Adjustment,
+  IN BOOLEAN  Wait);
+
+NTKERNELAPI
+PKDEVICE_QUEUE_ENTRY
+NTAPI
+KeRemoveByKeyDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue,
+  IN ULONG  SortKey);
+
+NTKERNELAPI
+PKDEVICE_QUEUE_ENTRY
+NTAPI
+KeRemoveDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeRemoveEntryDeviceQueue(
+  IN OUT PKDEVICE_QUEUE  DeviceQueue,
+  IN OUT PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeRemoveQueueDpc(
+  IN OUT PRKDPC  Dpc);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeResetEvent(
+  IN OUT PRKEVENT  Event);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeSetEvent(
+  IN OUT PRKEVENT  Event,
+  IN KPRIORITY  Increment,
+  IN BOOLEAN  Wait);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetImportanceDpc(
+  IN OUT PRKDPC  Dpc,
+  IN KDPC_IMPORTANCE  Importance);
+
+NTKERNELAPI
+KPRIORITY
+NTAPI
+KeSetPriorityThread(
+  IN OUT PKTHREAD  Thread,
+  IN KPRIORITY  Priority);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeSetTimer(
+  IN OUT PKTIMER  Timer,
+  IN LARGE_INTEGER  DueTime,
+  IN PKDPC  Dpc  OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeSetTimerEx(
+  IN OUT PKTIMER  Timer,
+  IN LARGE_INTEGER  DueTime,
+  IN LONG  Period  OPTIONAL,
+  IN PKDPC  Dpc  OPTIONAL);
+
+NTHALAPI
+VOID
+NTAPI
+KeStallExecutionProcessor(
+  IN ULONG  MicroSeconds);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeSynchronizeExecution(
+  IN OUT PKINTERRUPT    Interrupt,
+  IN PKSYNCHRONIZE_ROUTINE  SynchronizeRoutine,
+  IN PVOID  SynchronizeContext OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeWaitForMultipleObjects(
+  IN ULONG  Count,
+  IN PVOID  Object[],
+  IN WAIT_TYPE  WaitType,
+  IN KWAIT_REASON  WaitReason,
+  IN KPROCESSOR_MODE  WaitMode,
+  IN BOOLEAN  Alertable,
+  IN PLARGE_INTEGER  Timeout  OPTIONAL,
+  OUT PKWAIT_BLOCK  WaitBlockArray  OPTIONAL);
+
+#define KeWaitForMutexObject KeWaitForSingleObject
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeWaitForSingleObject(
+  IN PVOID  Object,
+  IN KWAIT_REASON  WaitReason,
+  IN KPROCESSOR_MODE  WaitMode,
+  IN BOOLEAN  Alertable,
+  IN PLARGE_INTEGER  Timeout  OPTIONAL);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+_DECL_HAL_KE_IMPORT
+VOID
+FASTCALL
+KeAcquireInStackQueuedSpinLock(
+  IN OUT PKSPIN_LOCK SpinLock,
+  OUT PKLOCK_QUEUE_HANDLE LockHandle);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeAcquireInStackQueuedSpinLockAtDpcLevel(
+  IN OUT PKSPIN_LOCK  SpinLock,
+  OUT PKLOCK_QUEUE_HANDLE  LockHandle);
+
+NTKERNELAPI
+KIRQL
+NTAPI
+KeAcquireInterruptSpinLock(
+  IN OUT PKINTERRUPT  Interrupt);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeAreApcsDisabled(VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeGetRecommendedSharedDataAlignment(VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryRuntimeThread(
+  IN PKTHREAD Thread,
+  OUT PULONG UserTime);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseInStackQueuedSpinLockFromDpcLevel(
+  IN PKLOCK_QUEUE_HANDLE  LockHandle);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeReleaseInterruptSpinLock(
+  IN OUT PKINTERRUPT  Interrupt,
+  IN KIRQL  OldIrql);
+
+NTKERNELAPI
+PKDEVICE_QUEUE_ENTRY
+NTAPI
+KeRemoveByKeyDeviceQueueIfBusy(
+  IN OUT PKDEVICE_QUEUE DeviceQueue,
+  IN ULONG SortKey);
+
+_DECL_HAL_KE_IMPORT
+VOID
+FASTCALL
+KeReleaseInStackQueuedSpinLock(
+  IN PKLOCK_QUEUE_HANDLE LockHandle);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP1)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeDeregisterBugCheckReasonCallback(
+  IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeRegisterBugCheckReasonCallback(
+  OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
+  IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
+  IN KBUGCHECK_CALLBACK_REASON Reason,
+  IN PUCHAR Component);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+
+NTKERNELAPI
+VOID
+NTAPI
+KeFlushQueuedDpcs(
+  VOID);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+
+NTKERNELAPI
+PVOID
+NTAPI
+KeRegisterNmiCallback(
+  IN PNMI_CALLBACK CallbackRoutine,
+  IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeDeregisterNmiCallback(
+  IN PVOID Handle);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeThreadedDpc(
+  OUT PRKDPC Dpc,
+  IN PKDEFERRED_ROUTINE DeferredRoutine,
+  IN PVOID DeferredContext OPTIONAL);
+
+NTKERNELAPI
+ULONG_PTR
+NTAPI
+KeIpiGenericCall(
+  IN PKIPI_BROADCAST_WORKER BroadcastFunction,
+  IN ULONG_PTR Context);
+
+NTKERNELAPI
+KIRQL
+FASTCALL
+KeAcquireSpinLockForDpc(
+  IN OUT PKSPIN_LOCK SpinLock);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseSpinLockForDpc(
+  IN OUT PKSPIN_LOCK SpinLock,
+  IN KIRQL OldIrql);
+
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+KeTestSpinLock(
+  IN PKSPIN_LOCK SpinLock);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+KeTryToAcquireSpinLockAtDpcLevel(
+  IN OUT PKSPIN_LOCK SpinLock);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeAreAllApcsDisabled(
+  VOID);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeAcquireGuardedMutex(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeAcquireGuardedMutexUnsafe(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeEnterGuardedRegion(
+    VOID
+);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeLeaveGuardedRegion(
+    VOID
+);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeInitializeGuardedMutex(
+    OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseGuardedMutexUnsafe(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseGuardedMutex(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+KeTryToAcquireGuardedMutex(
+    IN OUT PKGUARDED_MUTEX GuardedMutex
+);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeAcquireInStackQueuedSpinLockForDpc(
+  IN OUT PKSPIN_LOCK SpinLock,
+  OUT PKLOCK_QUEUE_HANDLE LockHandle);
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeReleaseInStackQueuedSpinLockForDpc(
+  IN PKLOCK_QUEUE_HANDLE LockHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeQueryDpcWatchdogInformation(
+  OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
+
+#if defined(SINGLE_GROUP_LEGACY_API)
+NTKERNELAPI
+KAFFINITY
+NTAPI
+KeSetSystemAffinityThreadEx(
+  IN KAFFINITY Affinity);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryActiveProcessorCount(
+  OUT PKAFFINITY ActiveProcessors OPTIONAL);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryMaximumProcessorCount(
+  VOID);
+#endif
+
+#endif /*  (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_WS08)
+
+PVOID
+KeRegisterProcessorChangeCallback(
+  IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
+  IN PVOID CallbackContext OPTIONAL,
+  IN ULONG Flags);
+
+VOID
+KeDeregisterProcessorChangeCallback(
+  IN PVOID CallbackHandle);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS08) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+ULONG64
+NTAPI
+KeQueryTotalCycleTimeProcess(
+  IN OUT PKPROCESS Process,
+  OUT PULONG64 CycleTimeStamp);
+
+ULONG64
+NTAPI
+KeQueryTotalCycleTimeThread(
+  IN OUT PKTHREAD Thread,
+  OUT PULONG64 CycleTimeStamp);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeSetTargetProcessorDpcEx(
+  IN OUT PKDPC Dpc,
+  IN PPROCESSOR_NUMBER ProcNumber);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetSystemGroupAffinityThread(
+  IN PGROUP_AFFINITY Affinity,
+  OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeRevertToUserGroupAffinityThread(
+  IN PGROUP_AFFINITY PreviousAffinity);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeSetCoalescableTimer(
+  IN OUT PKTIMER Timer,
+  IN LARGE_INTEGER DueTime,
+  IN ULONG Period,
+  IN ULONG TolerableDelay,
+  IN PKDPC Dpc OPTIONAL);
+
+NTKERNELAPI
+ULONGLONG
+NTAPI
+KeQueryUnbiasedInterruptTime(
+  VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryActiveProcessorCountEx(
+  IN USHORT GroupNumber);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryMaximumProcessorCountEx(
+  IN USHORT GroupNumber);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryActiveGroupCount(
+  VOID);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryMaximumGroupCount(
+  VOID);
+
+NTKERNELAPI
+KAFFINITY
+NTAPI
+KeQueryGroupAffinity 
+  IN USHORT GroupNumber);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeGetCurrentProcessorNumberEx(
+  OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeQueryNodeActiveAffinity(
+  IN USHORT NodeNumber,
+  OUT PGROUP_AFFINITY Affinity OPTIONAL,
+  OUT PUSHORT Count OPTIONAL);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryNodeMaximumProcessorCount(
+  IN USHORT NodeNumber);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryHighestNodeNumber(
+  VOID);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeGetCurrentNodeNumber(
+  VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeQueryLogicalProcessorRelationship(
+  IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
+  IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
+  OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
+  IN OUT PULONG Length);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeSaveExtendedProcessorState(
+  IN ULONG64 Mask,
+  OUT PXSTATE_SAVE XStateSave);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeRestoreExtendedProcessorState(
+  IN PXSTATE_SAVE XStateSave);
+
+#endif /*  (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#if !defined(_IA64_)
+NTHALAPI
+VOID
+NTAPI
+KeFlushWriteBuffer(VOID);
+#endif
+
+/* VOID
+ * KeInitializeCallbackRecord(
+ *   IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord)
+ */
+#define KeInitializeCallbackRecord(CallbackRecord) \
+  CallbackRecord->State = BufferEmpty;
+
+#if DBG
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define PAGED_ASSERT( exp ) NT_ASSERT( exp )
+#else
+#define PAGED_ASSERT( exp ) ASSERT( exp )
+#endif
+
+#define PAGED_CODE() { \
+  if (KeGetCurrentIrql() > APC_LEVEL) { \
+    KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
+    PAGED_ASSERT(FALSE); \
+  } \
+}
+
+#else
+
+#define PAGED_CODE()
+
+#endif
+
+#define PAGED_CODE_LOCKED() NOP_FUNCTION;
+
+/******************************************************************************
+ *                       Memory manager Functions                             *
+ ******************************************************************************/
+
+/*
+ * Alignment Macros
+ */
+#define ALIGN_DOWN_BY(size, align) \
+    ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
+
+#define ALIGN_UP_BY(size, align) \
+    (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
+
+#define ALIGN_DOWN_POINTER_BY(ptr, align) \
+    ((PVOID)ALIGN_DOWN_BY(ptr, align))
+
+#define ALIGN_UP_POINTER_BY(ptr, align) \
+    ((PVOID)ALIGN_UP_BY(ptr, align))
+
+#define ALIGN_DOWN(size, type) \
+    ALIGN_DOWN_BY(size, sizeof(type))
+
+#define ALIGN_UP(size, type) \
+    ALIGN_UP_BY(size, sizeof(type))
+
+#define ALIGN_DOWN_POINTER(ptr, type) \
+    ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
+
+#define ALIGN_UP_POINTER(ptr, type) \
+    ALIGN_UP_POINTER_BY(ptr, sizeof(type))
+
+/* ULONG
+ * BYTE_OFFSET(
+ *   IN PVOID Va)
+ */
+#define BYTE_OFFSET(Va) \
+  ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
+
+/* ULONG
+ * BYTES_TO_PAGES(
+ *   IN ULONG Size)
+ */
+#define BYTES_TO_PAGES(Size) \
+  (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
+
+/* PVOID
+ * PAGE_ALIGN(
+ *   IN PVOID Va)
+ */
+#define PAGE_ALIGN(Va) \
+  ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
+
+/* ULONG_PTR
+ * ROUND_TO_PAGES(
+ *   IN ULONG_PTR Size)
+ */
+#define ROUND_TO_PAGES(Size) \
+  (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
+
+/* ULONG
+ * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
+ *   IN PVOID Va,
+ *   IN ULONG Size)
+ */
+#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
+  ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
+    + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
+
+/*
+ * ULONG
+ * MmGetMdlByteCount(
+ *   IN PMDL  Mdl)
+ */
+#define MmGetMdlByteCount(_Mdl) \
+  ((_Mdl)->ByteCount)
+
+/*
+ * ULONG
+ * MmGetMdlByteOffset(
+ *   IN PMDL  Mdl)
+ */
+#define MmGetMdlByteOffset(_Mdl) \
+  ((_Mdl)->ByteOffset)
+
+/*
+ * PPFN_NUMBER
+ * MmGetMdlPfnArray(
+ *   IN PMDL  Mdl)
+ */
+#define MmGetMdlPfnArray(_Mdl) \
+  ((PPFN_NUMBER) ((_Mdl) + 1))
+
+/*
+ * PVOID
+ * MmGetMdlVirtualAddress(
+ *   IN PMDL  Mdl)
+ */
+#define MmGetMdlVirtualAddress(_Mdl) \
+  ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
+
+#define MmGetProcedureAddress(Address) (Address)
+
+/* PVOID MmGetSystemAddressForMdl(
+ *     IN PMDL Mdl);
+ */
+#define MmGetSystemAddressForMdl(Mdl) \
+  (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
+    MDL_SOURCE_IS_NONPAGED_POOL)) ? \
+      ((Mdl)->MappedSystemVa) : \
+      (MmMapLockedPages((Mdl), KernelMode)))
+
+/* PVOID
+ * MmGetSystemAddressForMdlSafe(
+ *     IN PMDL Mdl,
+ *     IN MM_PAGE_PRIORITY Priority)
+ */
+#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
+  (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
+    | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
+    (_Mdl)->MappedSystemVa : \
+    (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
+      KernelMode, MmCached, NULL, FALSE, (_Priority)))
+
+/*
+ * VOID
+ * MmInitializeMdl(
+ *   IN PMDL  MemoryDescriptorList,
+ *   IN PVOID  BaseVa,
+ *   IN SIZE_T  Length)
+ */
+#define MmInitializeMdl(_MemoryDescriptorList, \
+                        _BaseVa, \
+                        _Length) \
+{ \
+  (_MemoryDescriptorList)->Next = (PMDL) NULL; \
+  (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
+    (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
+  (_MemoryDescriptorList)->MdlFlags = 0; \
+  (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
+  (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
+  (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
+}
+
+/*
+ * VOID
+ * MmPrepareMdlForReuse(
+ *   IN PMDL  Mdl)
+ */
+#define MmPrepareMdlForReuse(_Mdl) \
+{ \
+  if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
+    ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
+    MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
+  } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
+    ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
+  } \
+}
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemory(
+  IN SIZE_T  NumberOfBytes,
+  IN PHYSICAL_ADDRESS  HighestAcceptableAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemorySpecifyCache(
+  IN SIZE_T  NumberOfBytes,
+  IN PHYSICAL_ADDRESS  LowestAcceptableAddress,
+  IN PHYSICAL_ADDRESS  HighestAcceptableAddress,
+  IN PHYSICAL_ADDRESS  BoundaryAddressMultiple  OPTIONAL,
+  IN MEMORY_CACHING_TYPE  CacheType);
+
+NTKERNELAPI
+PMDL
+NTAPI
+MmAllocatePagesForMdl(
+  IN PHYSICAL_ADDRESS  LowAddress,
+  IN PHYSICAL_ADDRESS  HighAddress,
+  IN PHYSICAL_ADDRESS  SkipBytes,
+  IN SIZE_T  TotalBytes);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmBuildMdlForNonPagedPool(
+  IN OUT PMDLX  MemoryDescriptorList);
+
+//DECLSPEC_DEPRECATED_DDK
+NTKERNELAPI
+PMDL
+NTAPI
+MmCreateMdl(
+  IN PMDL  MemoryDescriptorList  OPTIONAL,
+  IN PVOID  Base,
+  IN SIZE_T  Length);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeContiguousMemory(
+  IN PVOID  BaseAddress);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeContiguousMemorySpecifyCache(
+  IN PVOID  BaseAddress,
+  IN SIZE_T  NumberOfBytes,
+  IN MEMORY_CACHING_TYPE  CacheType);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreePagesFromMdl(
+  IN PMDLX MemoryDescriptorList);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmGetSystemRoutineAddress(
+  IN PUNICODE_STRING  SystemRoutineName);
+
+NTKERNELAPI
+LOGICAL
+NTAPI
+MmIsDriverVerifying(
+  IN struct _DRIVER_OBJECT *DriverObject);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmLockPagableDataSection(
+  IN PVOID  AddressWithinSection);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapIoSpace(
+  IN PHYSICAL_ADDRESS  PhysicalAddress,
+  IN SIZE_T  NumberOfBytes,
+  IN MEMORY_CACHING_TYPE  CacheEnable);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapLockedPages(
+  IN PMDL  MemoryDescriptorList,
+  IN KPROCESSOR_MODE  AccessMode);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapLockedPagesSpecifyCache(
+  IN PMDLX MemoryDescriptorList,
+  IN KPROCESSOR_MODE AccessMode,
+  IN MEMORY_CACHING_TYPE CacheType,
+  IN PVOID BaseAddress OPTIONAL,
+  IN ULONG BugCheckOnFailure,
+  IN MM_PAGE_PRIORITY Priority);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmPageEntireDriver(
+  IN PVOID  AddressWithinSection);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmProbeAndLockPages(
+  IN OUT PMDL  MemoryDescriptorList,
+  IN KPROCESSOR_MODE  AccessMode,
+  IN LOCK_OPERATION  Operation);
+
+NTKERNELAPI
+MM_SYSTEMSIZE
+NTAPI
+MmQuerySystemSize(
+  VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmResetDriverPaging(
+  IN PVOID  AddressWithinSection);
+
+NTKERNELAPI
+SIZE_T
+NTAPI
+MmSizeOfMdl(
+  IN PVOID  Base,
+  IN SIZE_T  Length);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnlockPagableImageSection(
+  IN PVOID  ImageSectionHandle);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnlockPages(
+  IN OUT PMDL  MemoryDescriptorList);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnmapIoSpace(
+  IN PVOID  BaseAddress,
+  IN SIZE_T  NumberOfBytes);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmProbeAndLockProcessPages(
+  IN OUT PMDL  MemoryDescriptorList,
+  IN PEPROCESS  Process,
+  IN KPROCESSOR_MODE  AccessMode,
+  IN LOCK_OPERATION  Operation);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnmapLockedPages(
+  IN PVOID  BaseAddress,
+  IN PMDL  MemoryDescriptorList);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmAdvanceMdl(
+  IN OUT PMDL  Mdl,
+  IN ULONG  NumberOfBytes);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateMappingAddress(
+  IN SIZE_T  NumberOfBytes,
+  IN ULONG  PoolTag);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeMappingAddress(
+  IN PVOID  BaseAddress,
+  IN ULONG  PoolTag);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmIsVerifierEnabled(
+  OUT PULONG  VerifierFlags);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapLockedPagesWithReservedMapping(
+  IN PVOID  MappingAddress,
+  IN ULONG  PoolTag,
+  IN PMDL  MemoryDescriptorList,
+  IN MEMORY_CACHING_TYPE  CacheType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmProtectMdlSystemAddress(
+  IN PMDL  MemoryDescriptorList,
+  IN ULONG  NewProtect);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnmapReservedMapping(
+  IN PVOID  BaseAddress,
+  IN ULONG  PoolTag,
+  IN PMDL  MemoryDescriptorList);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+NTKERNELAPI
+PMDL
+NTAPI
+MmAllocatePagesForMdlEx(
+  IN PHYSICAL_ADDRESS LowAddress,
+  IN PHYSICAL_ADDRESS HighAddress,
+  IN PHYSICAL_ADDRESS SkipBytes,
+  IN SIZE_T TotalBytes,
+  IN MEMORY_CACHING_TYPE CacheType,
+  IN ULONG Flags);
+#endif
+
+/******************************************************************************
+ *                            Security Manager Functions                      *
+ ******************************************************************************/
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeAccessCheck(
+  IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
+  IN PSECURITY_SUBJECT_CONTEXT  SubjectSecurityContext,
+  IN BOOLEAN  SubjectContextLocked,
+  IN ACCESS_MASK  DesiredAccess,
+  IN ACCESS_MASK  PreviouslyGrantedAccess,
+  OUT PPRIVILEGE_SET  *Privileges  OPTIONAL,
+  IN PGENERIC_MAPPING  GenericMapping,
+  IN KPROCESSOR_MODE  AccessMode,
+  OUT PACCESS_MASK  GrantedAccess,
+  OUT PNTSTATUS  AccessStatus);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeAssignSecurity(
+  IN PSECURITY_DESCRIPTOR  ParentDescriptor  OPTIONAL,
+  IN PSECURITY_DESCRIPTOR  ExplicitDescriptor  OPTIONAL,
+  OUT PSECURITY_DESCRIPTOR  *NewDescriptor,
+  IN BOOLEAN  IsDirectoryObject,
+  IN PSECURITY_SUBJECT_CONTEXT  SubjectContext,
+  IN PGENERIC_MAPPING  GenericMapping,
+  IN POOL_TYPE  PoolType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeAssignSecurityEx(
+  IN PSECURITY_DESCRIPTOR  ParentDescriptor  OPTIONAL,
+  IN PSECURITY_DESCRIPTOR  ExplicitDescriptor  OPTIONAL,
+  OUT PSECURITY_DESCRIPTOR  *NewDescriptor,
+  IN GUID  *ObjectType  OPTIONAL,
+  IN BOOLEAN  IsDirectoryObject,
+  IN ULONG  AutoInheritFlags,
+  IN PSECURITY_SUBJECT_CONTEXT  SubjectContext,
+  IN PGENERIC_MAPPING  GenericMapping,
+  IN POOL_TYPE  PoolType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeDeassignSecurity(
+  IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeValidSecurityDescriptor(
+  IN ULONG Length,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTKERNELAPI
+ULONG
+NTAPI
+SeObjectCreateSaclAccessBits(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeReleaseSubjectContext(
+  IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeUnlockSubjectContext(
+  IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeCaptureSubjectContext(
+  OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeLockSubjectContext(
+  IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+NTSTATUS
+NTAPI
+SeSetAuditParameter(
+  IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
+  IN SE_ADT_PARAMETER_TYPE Type,
+  IN ULONG Index,
+  IN PVOID Data);
+
+NTSTATUS
+NTAPI
+SeReportSecurityEvent(
+  IN ULONG Flags,
+  IN PUNICODE_STRING SourceName,
+  IN PSID UserSid OPTIONAL,
+  IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTKERNELAPI
+ULONG
+NTAPI
+SeComputeAutoInheritByObjectType(
+  IN PVOID ObjectType,
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+  IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
+
+#ifdef SE_NTFS_WORLD_CACHE
+VOID
+NTAPI
+SeGetWorldRights(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN PGENERIC_MAPPING GenericMapping,
+  OUT PACCESS_MASK GrantedAccess);
+#endif /* SE_NTFS_WORLD_CACHE */
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+/******************************************************************************
+ *                         Configuration Manager Functions                    *
+ ******************************************************************************/
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+CmRegisterCallback(
+  IN PEX_CALLBACK_FUNCTION  Function,
+  IN PVOID  Context  OPTIONAL,
+  OUT PLARGE_INTEGER  Cookie);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+CmUnRegisterCallback(
+  IN LARGE_INTEGER  Cookie);
+#endif
+
+
+/******************************************************************************
+ *                         I/O Manager Functions                              *
+ ******************************************************************************/
+
+#if !defined(_M_AMD64)
+NTHALAPI
+VOID
+NTAPI
+READ_PORT_BUFFER_UCHAR(
+  IN PUCHAR Port,
+  IN PUCHAR Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+READ_PORT_BUFFER_ULONG(
+  IN PULONG Port,
+  IN PULONG Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+READ_PORT_BUFFER_USHORT(
+  IN PUSHORT Port,
+  IN PUSHORT Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+UCHAR
+NTAPI
+READ_PORT_UCHAR(
+  IN PUCHAR Port);
+
+NTHALAPI
+ULONG
+NTAPI
+READ_PORT_ULONG(
+  IN PULONG Port);
+
+NTHALAPI
+USHORT
+NTAPI
+READ_PORT_USHORT(
+  IN PUSHORT Port);
+
+NTKERNELAPI
+VOID
+NTAPI
+READ_REGISTER_BUFFER_UCHAR(
+  IN PUCHAR Register,
+  IN PUCHAR Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+READ_REGISTER_BUFFER_ULONG(
+  IN PULONG Register,
+  IN PULONG Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+READ_REGISTER_BUFFER_USHORT(
+  IN PUSHORT Register,
+  IN PUSHORT Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+UCHAR
+NTAPI
+READ_REGISTER_UCHAR(
+  IN PUCHAR Register);
+
+NTKERNELAPI
+ULONG
+NTAPI
+READ_REGISTER_ULONG(
+  IN PULONG Register);
+
+NTKERNELAPI
+USHORT
+NTAPI
+READ_REGISTER_USHORT(
+  IN PUSHORT Register);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_BUFFER_UCHAR(
+  IN PUCHAR Port,
+  IN PUCHAR Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_BUFFER_ULONG(
+  IN PULONG Port,
+  IN PULONG Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_BUFFER_USHORT(
+  IN PUSHORT Port,
+  IN PUSHORT Buffer,
+  IN ULONG Count);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_UCHAR(
+  IN PUCHAR Port,
+  IN UCHAR Value);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_ULONG(
+  IN PULONG Port,
+  IN ULONG Value);
+
+NTHALAPI
+VOID
+NTAPI
+WRITE_PORT_USHORT(
+  IN PUSHORT Port,
+  IN USHORT Value);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_BUFFER_UCHAR(
+  IN PUCHAR Register,
+  IN PUCHAR Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_BUFFER_ULONG(
+  IN PULONG  Register,
+  IN PULONG  Buffer,
+  IN ULONG  Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_BUFFER_USHORT(
+  IN PUSHORT Register,
+  IN PUSHORT Buffer,
+  IN ULONG Count);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_UCHAR(
+  IN PUCHAR Register,
+  IN UCHAR Value);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_ULONG(
+  IN PULONG Register,
+  IN ULONG Value);
+
+NTKERNELAPI
+VOID
+NTAPI
+WRITE_REGISTER_USHORT(
+  IN PUSHORT  Register,
+  IN USHORT  Value);
+
+#else
+
+FORCEINLINE
+VOID
+READ_PORT_BUFFER_UCHAR(
+  IN PUCHAR Port,
+  IN PUCHAR Buffer,
+  IN ULONG Count)
+{
+    __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+READ_PORT_BUFFER_ULONG(
+  IN PULONG  Port,
+  IN PULONG  Buffer,
+  IN ULONG  Count)
+{
+    __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+READ_PORT_BUFFER_USHORT(
+  IN PUSHORT Port,
+  IN PUSHORT Buffer,
+  IN ULONG Count)
+{
+    __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+UCHAR
+READ_PORT_UCHAR(
+  IN PUCHAR Port)
+{
+    return __inbyte((USHORT)(ULONG_PTR)Port);
+}
+
+FORCEINLINE
+ULONG
+READ_PORT_ULONG(
+  IN PULONG Port)
+{
+    return __indword((USHORT)(ULONG_PTR)Port);
+}
+
+FORCEINLINE
+USHORT
+READ_PORT_USHORT(
+  IN PUSHORT Port)
+{
+    return __inword((USHORT)(ULONG_PTR)Port);
+}
+
+FORCEINLINE
+VOID
+READ_REGISTER_BUFFER_UCHAR(
+  IN PUCHAR Register,
+  IN PUCHAR Buffer,
+  IN ULONG Count)
+{
+    __movsb(Register, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+READ_REGISTER_BUFFER_ULONG(
+  IN PULONG  Register,
+  IN PULONG  Buffer,
+  IN ULONG  Count)
+{
+    __movsd(Register, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+READ_REGISTER_BUFFER_USHORT(
+  IN PUSHORT  Register,
+  IN PUSHORT  Buffer,
+  IN ULONG  Count)
+{
+    __movsw(Register, Buffer, Count);
+}
+
+FORCEINLINE
+UCHAR
+READ_REGISTER_UCHAR(
+  IN volatile UCHAR *Register)
+{
+    return *Register;
+}
+
+FORCEINLINE
+ULONG
+READ_REGISTER_ULONG(
+  IN volatile ULONG *Register)
+{
+    return *Register;
+}
+
+FORCEINLINE
+USHORT
+READ_REGISTER_USHORT(
+  IN volatile USHORT *Register)
+{
+    return *Register;
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_BUFFER_UCHAR(
+  IN PUCHAR Port,
+  IN PUCHAR Buffer,
+  IN ULONG Count)
+{
+    __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_BUFFER_ULONG(
+  IN PULONG Port,
+  IN PULONG Buffer,
+  IN ULONG Count)
+{
+    __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_BUFFER_USHORT(
+  IN PUSHORT Port,
+  IN PUSHORT Buffer,
+  IN ULONG Count)
+{
+    __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_UCHAR(
+  IN PUCHAR Port,
+  IN UCHAR Value)
+{
+    __outbyte((USHORT)(ULONG_PTR)Port, Value);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_ULONG(
+  IN PULONG Port,
+  IN ULONG Value)
+{
+    __outdword((USHORT)(ULONG_PTR)Port, Value);
+}
+
+FORCEINLINE
+VOID
+WRITE_PORT_USHORT(
+  IN PUSHORT Port,
+  IN USHORT Value)
+{
+    __outword((USHORT)(ULONG_PTR)Port, Value);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_BUFFER_UCHAR(
+  IN PUCHAR Register,
+  IN PUCHAR Buffer,
+  IN ULONG Count)
+{
+    LONG Synch;
+    __movsb(Register, Buffer, Count);
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_BUFFER_ULONG(
+  IN PULONG Register,
+  IN PULONG Buffer,
+  IN ULONG Count)
+{
+    LONG Synch;
+    __movsd(Register, Buffer, Count);
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_BUFFER_USHORT(
+  IN PUSHORT Register,
+  IN PUSHORT Buffer,
+  IN ULONG Count)
+{
+    LONG Synch;
+    __movsw(Register, Buffer, Count);
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_UCHAR(
+  IN volatile UCHAR *Register,
+  IN UCHAR Value)
+{
+    LONG Synch;
+    *Register = Value;
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_ULONG(
+  IN volatile ULONG *Register,
+  IN ULONG Value)
+{
+    LONG Synch;
+    *Register = Value;
+    InterlockedOr(&Synch, 1);
+}
+
+FORCEINLINE
+VOID
+WRITE_REGISTER_USHORT(
+  IN volatile USHORT *Register,
+  IN USHORT Value)
+{
+    LONG Sync;
+    *Register = Value;
+    InterlockedOr(&Sync, 1);
+}
+#endif
+
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
+   (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
+
+#define DMA_MACROS_DEFINED
+
+FORCEINLINE
+NTSTATUS
+IoAllocateAdapterChannel(
+    IN PDMA_ADAPTER DmaAdapter,
+    IN PDEVICE_OBJECT DeviceObject,
+    IN ULONG NumberOfMapRegisters,
+    IN PDRIVER_CONTROL ExecutionRoutine,
+    IN PVOID Context)
+{
+    PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
+    AllocateAdapterChannel =
+        *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
+    ASSERT(AllocateAdapterChannel);
+    return AllocateAdapterChannel(DmaAdapter,
+                                  DeviceObject,
+                                  NumberOfMapRegisters,
+                                  ExecutionRoutine,
+                                  Context );
+}
+
+FORCEINLINE
+BOOLEAN
+NTAPI
+IoFlushAdapterBuffers(
+    IN PDMA_ADAPTER DmaAdapter,
+    IN PMDL Mdl,
+    IN PVOID MapRegisterBase,
+    IN PVOID CurrentVa,
+    IN ULONG Length,
+    IN BOOLEAN WriteToDevice)
+{
+    PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
+    FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
+    ASSERT(FlushAdapterBuffers);
+    return FlushAdapterBuffers(DmaAdapter,
+                               Mdl,
+                               MapRegisterBase,
+                               CurrentVa,
+                               Length,
+                               WriteToDevice );
+}
+
+FORCEINLINE
+VOID
+NTAPI
+IoFreeAdapterChannel(
+    IN PDMA_ADAPTER DmaAdapter)
+{
+    PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
+    FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
+    ASSERT(FreeAdapterChannel);
+    FreeAdapterChannel(DmaAdapter);
+}
+
+FORCEINLINE
+VOID
+NTAPI
+IoFreeMapRegisters(
+    IN PDMA_ADAPTER DmaAdapter,
+    IN PVOID MapRegisterBase,
+    IN ULONG NumberOfMapRegisters)
+{
+    PFREE_MAP_REGISTERS FreeMapRegisters;
+    FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
+    ASSERT(FreeMapRegisters);
+    FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
+}
+
+FORCEINLINE
+PHYSICAL_ADDRESS
+NTAPI
+IoMapTransfer(
+    IN PDMA_ADAPTER DmaAdapter,
+    IN PMDL Mdl,
+    IN PVOID MapRegisterBase,
+    IN PVOID CurrentVa,
+    IN OUT PULONG Length,
+    IN BOOLEAN WriteToDevice)
+{
+    PMAP_TRANSFER MapTransfer;
+
+    MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
+    ASSERT(MapTransfer);
+    return MapTransfer(DmaAdapter,
+                       Mdl,
+                       MapRegisterBase,
+                       CurrentVa,
+                       Length,
+                       WriteToDevice);
+}
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTKERNELAPI
+VOID
+NTAPI
+IoAcquireCancelSpinLock(
+  OUT PKIRQL  Irql);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAcquireRemoveLockEx(
+  IN PIO_REMOVE_LOCK  RemoveLock,
+  IN PVOID  Tag  OPTIONAL,
+  IN PCSTR  File,
+  IN ULONG  Line,
+  IN ULONG  RemlockSize);
+#endif
+
+/*
+ * NTSTATUS
+ * IoAcquireRemoveLock(
+ *   IN PIO_REMOVE_LOCK  RemoveLock,
+ *   IN OPTIONAL PVOID  Tag)
+ */
+#if DBG
+#define IoAcquireRemoveLock(RemoveLock, Tag) \
+  IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
+#else
+#define IoAcquireRemoveLock(RemoveLock, Tag) \
+  IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
+#endif
+
+/*
+ * VOID
+ * IoAdjustPagingPathCount(
+ *   IN PLONG  Count,
+ *   IN BOOLEAN  Increment)
+ */
+#define IoAdjustPagingPathCount(_Count, \
+                                _Increment) \
+{ \
+  if (_Increment) \
+    { \
+      InterlockedIncrement(_Count); \
+    } \
+  else \
+    { \
+      InterlockedDecrement(_Count); \
+    } \
+}
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAllocateDriverObjectExtension(
+  IN PDRIVER_OBJECT  DriverObject,
+  IN PVOID  ClientIdentificationAddress,
+  IN ULONG  DriverObjectExtensionSize,
+  OUT PVOID  *DriverObjectExtension);
+
+NTKERNELAPI
+PVOID
+NTAPI
+IoAllocateErrorLogEntry(
+  IN PVOID  IoObject,
+  IN UCHAR  EntrySize);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoAllocateIrp(
+  IN CCHAR  StackSize,
+  IN BOOLEAN  ChargeQuota);
+
+NTKERNELAPI
+PMDL
+NTAPI
+IoAllocateMdl(
+  IN PVOID  VirtualAddress OPTIONAL,
+  IN ULONG  Length,
+  IN BOOLEAN  SecondaryBuffer,
+  IN BOOLEAN  ChargeQuota,
+  IN OUT PIRP  Irp  OPTIONAL);
+
+NTKERNELAPI
+PIO_WORKITEM
+NTAPI
+IoAllocateWorkItem(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAttachDevice(
+  IN PDEVICE_OBJECT  SourceDevice,
+  IN PUNICODE_STRING  TargetDevice,
+  OUT PDEVICE_OBJECT  *AttachedDevice);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoAttachDeviceToDeviceStack(
+  IN PDEVICE_OBJECT  SourceDevice,
+  IN PDEVICE_OBJECT  TargetDevice);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoBuildAsynchronousFsdRequest(
+  IN ULONG  MajorFunction,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN OUT PVOID  Buffer  OPTIONAL,
+  IN ULONG  Length  OPTIONAL,
+  IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
+  IN PIO_STATUS_BLOCK  IoStatusBlock  OPTIONAL);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoBuildDeviceIoControlRequest(
+  IN ULONG  IoControlCode,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PVOID  InputBuffer  OPTIONAL,
+  IN ULONG  InputBufferLength,
+  OUT PVOID  OutputBuffer  OPTIONAL,
+  IN ULONG  OutputBufferLength,
+  IN BOOLEAN  InternalDeviceIoControl,
+  IN PKEVENT  Event,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoBuildPartialMdl(
+  IN PMDL  SourceMdl,
+  IN OUT PMDL  TargetMdl,
+  IN PVOID  VirtualAddress,
+  IN ULONG  Length);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoBuildSynchronousFsdRequest(
+  IN ULONG  MajorFunction,
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN OUT PVOID  Buffer  OPTIONAL,
+  IN ULONG  Length  OPTIONAL,
+  IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
+  IN PKEVENT  Event,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock);
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IofCallDriver(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN OUT PIRP  Irp);
+#define IoCallDriver IofCallDriver
+
+NTKERNELAPI
+VOID
+FASTCALL
+IofCompleteRequest(
+  IN PIRP Irp,
+  IN CCHAR PriorityBoost);
+#define IoCompleteRequest IofCompleteRequest
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoCancelIrp(
+  IN PIRP  Irp);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckShareAccess(
+  IN ACCESS_MASK  DesiredAccess,
+  IN ULONG  DesiredShareAccess,
+  IN OUT PFILE_OBJECT  FileObject,
+  IN OUT PSHARE_ACCESS  ShareAccess,
+  IN BOOLEAN  Update);
+
+NTKERNELAPI
+VOID
+FASTCALL
+IofCompleteRequest(
+  IN PIRP  Irp,
+  IN CCHAR  PriorityBoost);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoConnectInterrupt(
+  OUT PKINTERRUPT  *InterruptObject,
+  IN PKSERVICE_ROUTINE  ServiceRoutine,
+  IN PVOID  ServiceContext OPTIONAL,
+  IN PKSPIN_LOCK  SpinLock  OPTIONAL,
+  IN ULONG  Vector,
+  IN KIRQL  Irql,
+  IN KIRQL  SynchronizeIrql,
+  IN KINTERRUPT_MODE    InterruptMode,
+  IN BOOLEAN  ShareVector,
+  IN KAFFINITY  ProcessorEnableMask,
+  IN BOOLEAN  FloatingSave);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateDevice(
+  IN PDRIVER_OBJECT  DriverObject,
+  IN ULONG  DeviceExtensionSize,
+  IN PUNICODE_STRING  DeviceName  OPTIONAL,
+  IN DEVICE_TYPE  DeviceType,
+  IN ULONG  DeviceCharacteristics,
+  IN BOOLEAN  Exclusive,
+  OUT PDEVICE_OBJECT  *DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateFile(
+  OUT PHANDLE FileHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN PLARGE_INTEGER AllocationSize OPTIONAL,
+  IN ULONG FileAttributes,
+  IN ULONG ShareAccess,
+  IN ULONG Disposition,
+  IN ULONG CreateOptions,
+  IN PVOID EaBuffer OPTIONAL,
+  IN ULONG EaLength,
+  IN CREATE_FILE_TYPE CreateFileType,
+  IN PVOID InternalParameters OPTIONAL,
+  IN ULONG Options);
+
+NTKERNELAPI
+PKEVENT
+NTAPI
+IoCreateNotificationEvent(
+  IN PUNICODE_STRING  EventName,
+  OUT PHANDLE  EventHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateSymbolicLink(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN PUNICODE_STRING  DeviceName);
+
+NTKERNELAPI
+PKEVENT
+NTAPI
+IoCreateSynchronizationEvent(
+  IN PUNICODE_STRING  EventName,
+  OUT PHANDLE  EventHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateUnprotectedSymbolicLink(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN PUNICODE_STRING  DeviceName);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoDeleteDevice(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoDeleteSymbolicLink(
+  IN PUNICODE_STRING  SymbolicLinkName);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoDetachDevice(
+  IN OUT PDEVICE_OBJECT  TargetDevice);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoDisconnectInterrupt(
+  IN PKINTERRUPT  InterruptObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeIrp(
+  IN PIRP Irp);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeMdl(
+  IN PMDL Mdl);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeWorkItem(
+  IN PIO_WORKITEM IoWorkItem);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetAttachedDevice(
+  IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetAttachedDeviceReference(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetBootDiskInformation(
+  IN OUT PBOOTDISK_INFORMATION  BootDiskInformation,
+  IN ULONG  Size);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDeviceInterfaceAlias(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN CONST GUID  *AliasInterfaceClassGuid,
+  OUT PUNICODE_STRING  AliasSymbolicLinkName);
+
+NTKERNELAPI
+PEPROCESS
+NTAPI
+IoGetCurrentProcess(
+  VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDeviceInterfaces(
+  IN CONST GUID  *InterfaceClassGuid,
+  IN PDEVICE_OBJECT  PhysicalDeviceObject  OPTIONAL,
+  IN ULONG  Flags,
+  OUT PWSTR  *SymbolicLinkList);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDeviceObjectPointer(
+  IN PUNICODE_STRING  ObjectName,
+  IN ACCESS_MASK  DesiredAccess,
+  OUT PFILE_OBJECT  *FileObject,
+  OUT PDEVICE_OBJECT  *DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDeviceProperty(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN DEVICE_REGISTRY_PROPERTY  DeviceProperty,
+  IN ULONG  BufferLength,
+  OUT PVOID  PropertyBuffer,
+  OUT PULONG  ResultLength);
+
+NTKERNELAPI
+PDMA_ADAPTER
+NTAPI
+IoGetDmaAdapter(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject OPTIONAL,
+  IN PDEVICE_DESCRIPTION  DeviceDescription,
+  IN OUT PULONG  NumberOfMapRegisters);
+
+NTKERNELAPI
+PVOID
+NTAPI
+IoGetDriverObjectExtension(
+  IN PDRIVER_OBJECT  DriverObject,
+  IN PVOID  ClientIdentificationAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+IoGetInitialStack(
+  VOID);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetRelatedDeviceObject(
+  IN PFILE_OBJECT  FileObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoQueueWorkItem(
+  IN PIO_WORKITEM  IoWorkItem,
+  IN PIO_WORKITEM_ROUTINE  WorkerRoutine,
+  IN WORK_QUEUE_TYPE  QueueType,
+  IN PVOID  Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoInitializeIrp(
+  IN OUT PIRP  Irp,
+  IN USHORT  PacketSize,
+  IN CCHAR  StackSize);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoInitializeRemoveLockEx(
+  IN  PIO_REMOVE_LOCK Lock,
+  IN  ULONG   AllocateTag,
+  IN  ULONG   MaxLockedMinutes,
+  IN  ULONG   HighWatermark,
+  IN  ULONG   RemlockSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoInitializeTimer(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PIO_TIMER_ROUTINE  TimerRoutine,
+  IN PVOID  Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoInvalidateDeviceRelations(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN DEVICE_RELATION_TYPE  Type);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoInvalidateDeviceState(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoIsWdmVersionAvailable(
+  IN UCHAR  MajorVersion,
+  IN UCHAR  MinorVersion);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoOpenDeviceInterfaceRegistryKey(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN ACCESS_MASK  DesiredAccess,
+  OUT PHANDLE  DeviceInterfaceKey);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoOpenDeviceRegistryKey(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN ULONG  DevInstKeyType,
+  IN ACCESS_MASK  DesiredAccess,
+  OUT PHANDLE  DevInstRegKey);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoRegisterDeviceInterface(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject,
+  IN CONST GUID  *InterfaceClassGuid,
+  IN PUNICODE_STRING  ReferenceString  OPTIONAL,
+  OUT PUNICODE_STRING  SymbolicLinkName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoRegisterPlugPlayNotification(
+  IN IO_NOTIFICATION_EVENT_CATEGORY  EventCategory,
+  IN ULONG  EventCategoryFlags,
+  IN PVOID  EventCategoryData  OPTIONAL,
+  IN PDRIVER_OBJECT  DriverObject,
+  IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE  CallbackRoutine,
+  IN OUT PVOID  Context OPTIONAL,
+  OUT PVOID  *NotificationEntry);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoRegisterShutdownNotification(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoReleaseCancelSpinLock(
+  IN KIRQL  Irql);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoReleaseRemoveLockAndWaitEx(
+  IN PIO_REMOVE_LOCK  RemoveLock,
+  IN PVOID  Tag OPTIONAL,
+  IN ULONG  RemlockSize);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoReleaseRemoveLockEx(
+  IN PIO_REMOVE_LOCK  RemoveLock,
+  IN PVOID  Tag OPTIONAL,
+  IN ULONG  RemlockSize);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRemoveShareAccess(
+  IN PFILE_OBJECT  FileObject,
+  IN OUT PSHARE_ACCESS  ShareAccess);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportTargetDeviceChange(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject,
+  IN PVOID  NotificationStructure);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportTargetDeviceChangeAsynchronous(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject,
+  IN PVOID  NotificationStructure,
+  IN PDEVICE_CHANGE_COMPLETE_CALLBACK  Callback  OPTIONAL,
+  IN PVOID  Context  OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRequestDeviceEject(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoReuseIrp(
+  IN OUT PIRP  Irp,
+  IN NTSTATUS  Status);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetDeviceInterfaceState(
+  IN PUNICODE_STRING  SymbolicLinkName,
+  IN BOOLEAN  Enable);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoSetShareAccess(
+  IN ACCESS_MASK  DesiredAccess,
+  IN ULONG  DesiredShareAccess,
+  IN OUT PFILE_OBJECT  FileObject,
+  OUT PSHARE_ACCESS  ShareAccess);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartNextPacket(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN BOOLEAN  Cancelable);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartNextPacketByKey(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN BOOLEAN  Cancelable,
+  IN ULONG  Key);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartPacket(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PIRP  Irp,
+  IN PULONG  Key  OPTIONAL,
+  IN PDRIVER_CANCEL  CancelFunction  OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStartTimer(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoStopTimer(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoUnregisterPlugPlayNotification(
+  IN PVOID  NotificationEntry);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoUnregisterShutdownNotification(
+  IN PDEVICE_OBJECT  DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoUpdateShareAccess(
+  IN PFILE_OBJECT  FileObject,
+  IN OUT PSHARE_ACCESS  ShareAccess);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIAllocateInstanceIds(
+  IN GUID  *Guid,
+  IN ULONG  InstanceCount,
+  OUT ULONG  *FirstInstanceId);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIQuerySingleInstanceMultiple(
+  IN PVOID  *DataBlockObjectList,
+  IN PUNICODE_STRING  InstanceNames,
+  IN ULONG  ObjectCount,
+  IN OUT ULONG  *InOutBufferSize,
+  OUT PVOID  OutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIRegistrationControl(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN ULONG  Action);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMISuggestInstanceName(
+  IN PDEVICE_OBJECT  PhysicalDeviceObject OPTIONAL,
+  IN PUNICODE_STRING  SymbolicLinkName OPTIONAL,
+  IN BOOLEAN  CombineNames,
+  OUT PUNICODE_STRING  SuggestedInstanceName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIWriteEvent(
+  IN PVOID  WnodeEventItem);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoWriteErrorLogEntry(
+  IN PVOID  ElEntry);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCsqInitialize(
+  IN PIO_CSQ Csq,
+  IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
+  IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
+  IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
+  IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
+  IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
+  IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoCsqInsertIrp(
+  IN PIO_CSQ Csq,
+  IN PIRP Irp,
+  IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoCsqRemoveIrp(
+  IN PIO_CSQ Csq,
+  IN PIO_CSQ_IRP_CONTEXT Context);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoCsqRemoveNextIrp(
+  IN PIO_CSQ  Csq,
+  IN PVOID  PeekContext);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoForwardIrpSynchronously(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PIRP  Irp);
+
+#define IoForwardAndCatchIrp IoForwardIrpSynchronously
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeErrorLogEntry(
+  PVOID  ElEntry);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetCompletionRoutineEx(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN PIRP  Irp,
+  IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
+  IN PVOID  Context,
+  IN BOOLEAN  InvokeOnSuccess,
+  IN BOOLEAN  InvokeOnError,
+  IN BOOLEAN  InvokeOnCancel);
+
+VOID
+NTAPI
+IoSetStartIoAttributes(
+  IN PDEVICE_OBJECT  DeviceObject,
+  IN BOOLEAN  DeferredStartIo,
+  IN BOOLEAN  NonCancelable);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIDeviceObjectToInstanceName(
+  IN PVOID  DataBlockObject,
+  IN PDEVICE_OBJECT  DeviceObject,
+  OUT PUNICODE_STRING  InstanceName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIExecuteMethod(
+  IN PVOID  DataBlockObject,
+  IN PUNICODE_STRING  InstanceName,
+  IN ULONG  MethodId,
+  IN ULONG  InBufferSize,
+  IN OUT PULONG  OutBufferSize,
+  IN OUT  PUCHAR  InOutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIHandleToInstanceName(
+  IN PVOID  DataBlockObject,
+  IN HANDLE  FileHandle,
+  OUT PUNICODE_STRING  InstanceName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIOpenBlock(
+  IN GUID  *DataBlockGuid,
+  IN ULONG  DesiredAccess,
+  OUT PVOID  *DataBlockObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIQueryAllData(
+  IN PVOID  DataBlockObject,
+  IN OUT ULONG  *InOutBufferSize,
+  OUT PVOID  OutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIQueryAllDataMultiple(
+  IN PVOID  *DataBlockObjectList,
+  IN ULONG  ObjectCount,
+  IN OUT ULONG  *InOutBufferSize,
+  OUT PVOID  OutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMIQuerySingleInstance(
+  IN PVOID  DataBlockObject,
+  IN PUNICODE_STRING  InstanceName,
+  IN OUT ULONG  *InOutBufferSize,
+  OUT PVOID OutBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMISetNotificationCallback(
+  IN OUT PVOID  Object,
+  IN WMI_NOTIFICATION_CALLBACK  Callback,
+  IN PVOID  Context OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMISetSingleInstance(
+  IN PVOID  DataBlockObject,
+  IN PUNICODE_STRING  InstanceName,
+  IN ULONG  Version,
+  IN ULONG  ValueBufferSize,
+  IN PVOID  ValueBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWMISetSingleItem(
+  IN PVOID  DataBlockObject,
+  IN PUNICODE_STRING  InstanceName,
+  IN ULONG  DataItemId,
+  IN ULONG  Version,
+  IN ULONG  ValueBufferSize,
+  IN PVOID  ValueBuffer);
+
+#endif
+
+#if defined(_WIN64)
+NTKERNELAPI
+ULONG
+NTAPI
+IoWMIDeviceObjectToProviderId(
+  IN PDEVICE_OBJECT DeviceObject);
+#else
+#define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
+#endif
+
+/*
+ * USHORT
+ * IoSizeOfIrp(
+ *   IN CCHAR  StackSize)
+ */
+#define IoSizeOfIrp(_StackSize) \
+  ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
+
+FORCEINLINE
+VOID
+IoSkipCurrentIrpStackLocation (
+  IN OUT PIRP Irp)
+{
+  ASSERT(Irp->CurrentLocation <= Irp->StackCount);
+  Irp->CurrentLocation++;
+  Irp->Tail.Overlay.CurrentStackLocation++;
+}
+
+FORCEINLINE
+VOID
+IoSetNextIrpStackLocation (
+  IN OUT PIRP Irp)
+{
+  ASSERT(Irp->CurrentLocation > 0);
+  Irp->CurrentLocation--;
+  Irp->Tail.Overlay.CurrentStackLocation--;
+}
+
+FORCEINLINE
+PIO_STACK_LOCATION
+IoGetNextIrpStackLocation(
+  IN PIRP Irp)
+{
+  ASSERT(Irp->CurrentLocation > 0);
+  return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
+}
+
+FORCEINLINE
+VOID
+IoSetCompletionRoutine(
+  IN PIRP Irp,
+  IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
+  IN PVOID Context OPTIONAL,
+  IN BOOLEAN InvokeOnSuccess,
+  IN BOOLEAN InvokeOnError,
+  IN BOOLEAN InvokeOnCancel)
+{
+  PIO_STACK_LOCATION irpSp;
+  ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
+  irpSp = IoGetNextIrpStackLocation(Irp);
+  irpSp->CompletionRoutine = CompletionRoutine;
+  irpSp->Context = Context;
+  irpSp->Control = 0;
+
+  if (InvokeOnSuccess) {
+    irpSp->Control = SL_INVOKE_ON_SUCCESS;
+  }
+
+  if (InvokeOnError) {
+    irpSp->Control |= SL_INVOKE_ON_ERROR;
+  }
+
+  if (InvokeOnCancel) {
+    irpSp->Control |= SL_INVOKE_ON_CANCEL;
+  }
+}
+
+/*
+ * PDRIVER_CANCEL
+ * IoSetCancelRoutine(
+ *   IN PIRP  Irp,
+ *   IN PDRIVER_CANCEL  CancelRoutine)
+ */
+#define IoSetCancelRoutine(_Irp, \
+                           _CancelRoutine) \
+  ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
+    (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
+
+/*
+ * VOID
+ * IoRequestDpc(
+ *   IN PDEVICE_OBJECT  DeviceObject,
+ *   IN PIRP  Irp,
+ *   IN PVOID  Context);
+ */
+#define IoRequestDpc(DeviceObject, Irp, Context)( \
+  KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
+
+/*
+ * VOID
+ * IoReleaseRemoveLock(
+ *   IN PIO_REMOVE_LOCK  RemoveLock,
+ *   IN PVOID  Tag)
+ */
+#define IoReleaseRemoveLock(_RemoveLock, \
+                            _Tag) \
+  IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
+
+/*
+ * VOID
+ * IoReleaseRemoveLockAndWait(
+ *   IN PIO_REMOVE_LOCK  RemoveLock,
+ *   IN PVOID  Tag)
+ */
+#define IoReleaseRemoveLockAndWait(_RemoveLock, \
+                                   _Tag) \
+  IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
+
+#if defined(_WIN64)
+
+NTKERNELAPI
+BOOLEAN
+IoIs32bitProcess(
+  IN PIRP  Irp  OPTIONAL);
+
+#endif
+
+#define PLUGPLAY_REGKEY_DEVICE                            1
+#define PLUGPLAY_REGKEY_DRIVER                            2
+#define PLUGPLAY_REGKEY_CURRENT_HWPROFILE                 4
+
+FORCEINLINE
+PIO_STACK_LOCATION
+IoGetCurrentIrpStackLocation(
+  IN PIRP Irp)
+{
+  ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
+  return Irp->Tail.Overlay.CurrentStackLocation;
+}
+
+FORCEINLINE
+VOID
+IoMarkIrpPending(
+  IN OUT PIRP Irp)
+{
+  IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
+}
+
+/*
+ * BOOLEAN
+ * IoIsErrorUserInduced(
+ *   IN NTSTATUS  Status);
+ */
+#define IoIsErrorUserInduced(Status) \
+   ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
+   ((Status) == STATUS_IO_TIMEOUT) || \
+   ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
+   ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
+   ((Status) == STATUS_VERIFY_REQUIRED) || \
+   ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
+   ((Status) == STATUS_WRONG_VOLUME)))
+
+/* VOID
+ * IoInitializeRemoveLock(
+ *   IN PIO_REMOVE_LOCK  Lock,
+ *   IN ULONG  AllocateTag,
+ *   IN ULONG  MaxLockedMinutes,
+ *   IN ULONG  HighWatermark)
+ */
+#define IoInitializeRemoveLock( \
+  Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
+  IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
+    HighWatermark, sizeof(IO_REMOVE_LOCK))
+
+VOID
+FORCEINLINE
+IoInitializeDpcRequest(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PIO_DPC_ROUTINE DpcRoutine)
+{
+  KeInitializeDpc( &DeviceObject->Dpc,
+                   (PKDEFERRED_ROUTINE) DpcRoutine,
+                   DeviceObject );
+}
+
+#define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
+
+/*
+ * ULONG
+ * IoGetFunctionCodeFromCtlCode(
+ *   IN ULONG  ControlCode)
+ */
+#define IoGetFunctionCodeFromCtlCode(_ControlCode) \
+  (((_ControlCode) >> 2) & 0x00000FFF)
+
+FORCEINLINE
+VOID
+IoCopyCurrentIrpStackLocationToNext(
+  IN PIRP Irp)
+{
+  PIO_STACK_LOCATION irpSp;
+  PIO_STACK_LOCATION nextIrpSp;
+  irpSp = IoGetCurrentIrpStackLocation(Irp);
+  nextIrpSp = IoGetNextIrpStackLocation(Irp);
+  RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
+  nextIrpSp->Control = 0;
+}
+
+NTKERNELAPI
+VOID
+NTAPI
+IoGetStackLimits(
+  OUT PULONG_PTR  LowLimit,
+  OUT PULONG_PTR  HighLimit);
+
+FORCEINLINE
+ULONG_PTR
+IoGetRemainingStackSize(
+  VOID)
+{
+  ULONG_PTR End, Begin;
+  ULONG_PTR Result;
+
+  IoGetStackLimits(&Begin, &End);
+  Result = (ULONG_PTR)(&End) - Begin;
+  return Result;
+}
+
+/******************************************************************************
+ *                     Power Management Support Functions                     *
+ ******************************************************************************/
+
+#define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoCallDriver(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN OUT struct _IRP  *Irp);
+
+NTKERNELAPI
+PULONG
+NTAPI
+PoRegisterDeviceForIdleDetection(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN ULONG  ConservationIdleTime,
+  IN ULONG  PerformanceIdleTime,
+  IN DEVICE_POWER_STATE  State);
+
+NTKERNELAPI
+PVOID
+NTAPI
+PoRegisterSystemState(
+  IN OUT PVOID StateHandle OPTIONAL,
+  IN EXECUTION_STATE Flags);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoRequestPowerIrp(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN UCHAR  MinorFunction,
+  IN POWER_STATE  PowerState,
+  IN PREQUEST_POWER_COMPLETE  CompletionFunction OPTIONAL,
+  IN PVOID  Context OPTIONAL,
+  OUT struct _IRP  **Irp OPTIONAL);
+
+NTKERNELAPI
+POWER_STATE
+NTAPI
+PoSetPowerState(
+  IN struct _DEVICE_OBJECT  *DeviceObject,
+  IN POWER_STATE_TYPE  Type,
+  IN POWER_STATE  State);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoSetSystemState(
+  IN EXECUTION_STATE  Flags);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoStartNextPowerIrp(
+  IN OUT struct _IRP *Irp);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoUnregisterSystemState(
+  IN OUT PVOID StateHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoRequestShutdownEvent(
+  OUT PVOID *Event);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTKERNELAPI
+VOID
+NTAPI
+PoSetSystemWake(
+  IN OUT struct _IRP *Irp);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PoGetSystemWake(
+  IN struct _IRP *Irp);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoRegisterPowerSettingCallback(
+  IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+  IN LPCGUID SettingGuid,
+  IN PPOWER_SETTING_CALLBACK Callback,
+  IN PVOID Context OPTIONAL,
+  OUT PVOID *Handle OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoUnregisterPowerSettingCallback(
+  IN OUT PVOID Handle);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+
+NTKERNELAPI
+VOID
+NTAPI
+PoSetDeviceBusyEx(
+  IN OUT PULONG IdlePointer);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+NTKERNELAPI
+VOID
+NTAPI
+PoStartDeviceBusy(
+  IN OUT PULONG IdlePointer);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoEndDeviceBusy(
+  IN OUT PULONG IdlePointer);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PoQueryWatchdogTime(
+  IN PDEVICE_OBJECT Pdo,
+  OUT PULONG SecondsRemaining);
+
+NTKERNELAPI
+VOID
+NTAPI
+PoDeletePowerRequest(
+  IN OUT PVOID PowerRequest);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoSetPowerRequest(
+  IN OUT PVOID PowerRequest,
+  IN POWER_REQUEST_TYPE Type);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoClearPowerRequest(
+  IN OUT PVOID PowerRequest,
+  IN POWER_REQUEST_TYPE Type);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoCreatePowerRequest(
+  OUT PVOID *PowerRequest,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PCOUNTED_REASON_CONTEXT Context);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+/******************************************************************************
+ *                          Executive Functions                               *
+ ******************************************************************************/
+
+#define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
+#define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
+#define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
+
+#define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
+#define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
+#define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
+#define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
+
+#define ExInitializeSListHead InitializeSListHead
+
+#if defined(_X86_)
+#if defined(_NTHAL_)
+#define ExAcquireFastMutex ExiAcquireFastMutex
+#define ExReleaseFastMutex ExiReleaseFastMutex
+#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
+#endif
+#define ExInterlockedAddUlong ExfInterlockedAddUlong
+#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
+#define ExInterlockedInsertTailList ExfInterlockedInsertTailList
+#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
+#define ExInterlockedPopEntryList ExfInterlockedPopEntryList
+#define ExInterlockedPushEntryList ExfInterlockedPushEntryList
+#endif
+
+#if defined(_WIN64)
+
+#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
+    defined(_NTHAL_) || defined(_NTOSP_)
+NTKERNELAPI
+USHORT
+ExQueryDepthSList(IN PSLIST_HEADER ListHead);
+#else
+FORCEINLINE
+USHORT
+ExQueryDepthSList(IN PSLIST_HEADER ListHead)
+{
+    return (USHORT)(ListHead->Alignment & 0xffff);
+}
+#endif
+
+NTKERNELAPI
+PSLIST_ENTRY
+ExpInterlockedFlushSList(
+    PSLIST_HEADER ListHead);
+
+NTKERNELAPI
+PSLIST_ENTRY
+ExpInterlockedPopEntrySList(
+    PSLIST_HEADER ListHead);
+
+NTKERNELAPI
+PSLIST_ENTRY
+ExpInterlockedPushEntrySList(
+    PSLIST_HEADER ListHead,
+    PSLIST_ENTRY ListEntry);
+
+#define ExInterlockedFlushSList(Head) \
+    ExpInterlockedFlushSList(Head)
+#define ExInterlockedPopEntrySList(Head, Lock) \
+    ExpInterlockedPopEntrySList(Head)
+#define ExInterlockedPushEntrySList(Head, Entry, Lock) \
+    ExpInterlockedPushEntrySList(Head, Entry)
+
+#else // !defined(_WIN64)
+
+#define ExQueryDepthSList(listhead) (listhead)->Depth
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExInterlockedFlushSList(
+    IN PSLIST_HEADER ListHead);
+
+#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
+NTKERNELAPI
+PSINGLE_LIST_ENTRY 
+FASTCALL
+ExInterlockedPopEntrySList(
+    IN PSLIST_HEADER ListHead,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY 
+FASTCALL
+ExInterlockedPushEntrySList(
+    IN PSLIST_HEADER ListHead,
+    IN PSINGLE_LIST_ENTRY ListEntry,
+    IN PKSPIN_LOCK Lock);
+#else
+#define ExInterlockedPopEntrySList(_ListHead, _Lock) \
+    InterlockedPopEntrySList(_ListHead)
+#define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
+    InterlockedPushEntrySList(_ListHead, _ListEntry)
+#endif // _WIN2K_COMPAT_SLIST_USAGE
+
+#endif // !defined(_WIN64)
+
+/* ERESOURCE_THREAD
+ * ExGetCurrentResourceThread(
+ *     VOID);
+ */
+#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
+
+#define ExReleaseResource(R) (ExReleaseResourceLite(R))
+
+/* VOID
+ * ExInitializeWorkItem(
+ *     IN PWORK_QUEUE_ITEM Item,
+ *     IN PWORKER_THREAD_ROUTINE Routine,
+ *     IN PVOID Context)
+ */
+#define ExInitializeWorkItem(Item, Routine, Context) \
+{ \
+  (Item)->WorkerRoutine = Routine; \
+  (Item)->Parameter = Context; \
+  (Item)->List.Flink = NULL; \
+}
+
+FORCEINLINE
+VOID
+ExInitializeFastMutex(
+  OUT PFAST_MUTEX FastMutex)
+{
+  FastMutex->Count = FM_LOCK_BIT;
+  FastMutex->Owner = NULL;
+  FastMutex->Contention = 0;
+  KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
+  return;
+}
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExAcquireFastMutex(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExReleaseFastMutex(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+ExTryToAcquireFastMutex(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExAcquireFastMutexUnsafe(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+VOID
+FASTCALL
+ExReleaseFastMutexUnsafe(
+    IN OUT PFAST_MUTEX FastMutex);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExAcquireResourceExclusiveLite(
+    IN PERESOURCE Resource,
+    IN BOOLEAN Wait);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExAcquireResourceSharedLite(
+    IN PERESOURCE Resource,
+    IN BOOLEAN Wait);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExAcquireSharedStarveExclusive(
+    IN PERESOURCE Resource,
+    IN BOOLEAN Wait);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExAcquireSharedWaitForExclusive(
+    IN PERESOURCE Resource,
+    IN BOOLEAN Wait);
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePool(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes);
+
+#ifdef POOL_TAGGING
+#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
+#endif /* POOL_TAGGING */
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithQuota(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes);
+
+#ifdef POOL_TAGGING
+#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
+#endif /* POOL_TAGGING */
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithQuotaTag(
+  IN POOL_TYPE  PoolType,
+  IN SIZE_T  NumberOfBytes,
+  IN ULONG  Tag);
+
+#ifndef POOL_TAGGING
+#define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
+#endif /* POOL_TAGGING */
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithTag(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes,
+    IN ULONG Tag);
+
+NTKERNELAPI
+PVOID
+NTAPI
+ExAllocatePoolWithTagPriority(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T NumberOfBytes,
+    IN ULONG Tag,
+    IN EX_POOL_PRIORITY Priority);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExConvertExclusiveToSharedLite(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExCreateCallback(
+    OUT PCALLBACK_OBJECT *CallbackObject,
+    IN POBJECT_ATTRIBUTES ObjectAttributes,
+    IN BOOLEAN Create,
+    IN BOOLEAN AllowMultipleCallbacks);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExDeleteNPagedLookasideList(
+    IN PNPAGED_LOOKASIDE_LIST Lookaside);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExDeletePagedLookasideList(
+    IN PPAGED_LOOKASIDE_LIST Lookaside);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExDeleteResourceLite(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExFreePool(
+    IN PVOID P);
+
+#ifdef POOL_TAGGING
+#define ExFreePool(P) ExFreePoolWithTag(P, 0)
+#endif
+
+NTKERNELAPI
 VOID
 NTAPI
-RtlClearBit(
-    PRTL_BITMAP BitMapHeader,
-    ULONG BitNumber);
+ExFreePoolWithTag(
+    IN PVOID P,
+    IN ULONG Tag);
+
+NTKERNELAPI
+ULONG
+NTAPI
+ExGetExclusiveWaiterCount(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+KPROCESSOR_MODE
+NTAPI
+ExGetPreviousMode(
+    VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+ExGetSharedWaiterCount(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExInitializeNPagedLookasideList(
+    IN PNPAGED_LOOKASIDE_LIST Lookaside,
+    IN PALLOCATE_FUNCTION Allocate OPTIONAL,
+    IN PFREE_FUNCTION Free OPTIONAL,
+    IN ULONG Flags,
+    IN SIZE_T Size,
+    IN ULONG Tag,
+    IN USHORT Depth);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExInitializePagedLookasideList(
+    IN PPAGED_LOOKASIDE_LIST Lookaside,
+    IN PALLOCATE_FUNCTION Allocate OPTIONAL,
+    IN PFREE_FUNCTION Free OPTIONAL,
+    IN ULONG Flags,
+    IN SIZE_T Size,
+    IN ULONG Tag,
+    IN USHORT Depth);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInitializeResourceLite(
+    IN PERESOURCE Resource);
+
+NTKERNELAPI
+LARGE_INTEGER
+NTAPI
+ExInterlockedAddLargeInteger(
+    IN PLARGE_INTEGER Addend,
+    IN LARGE_INTEGER Increment,
+    IN PKSPIN_LOCK Lock);
+
+#if defined(_WIN64)
+#define ExInterlockedAddLargeStatistic(Addend, Increment) \
+    (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
+#else
+#define ExInterlockedAddLargeStatistic(Addend, Increment) \
+    _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
+#endif
+
+NTKERNELAPI
+ULONG
+FASTCALL
+ExInterlockedAddUlong(
+    IN PULONG Addend,
+    IN ULONG Increment,
+    PKSPIN_LOCK Lock);
+
+#if defined(_AMD64_) || defined(_IA64_)
+#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
+    InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
+#elif defined(_X86_)
+NTKERNELAPI
+LONGLONG
+FASTCALL
+ExfInterlockedCompareExchange64(
+    IN OUT LONGLONG volatile *Destination,
+    IN PLONGLONG Exchange,
+    IN PLONGLONG Comperand);
+#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
+    ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
+#else
+NTKERNELAPI
+LONGLONG
+FASTCALL
+ExInterlockedCompareExchange64(
+    IN OUT LONGLONG volatile *Destination,
+    IN PLONGLONG Exchange,
+    IN PLONGLONG Comparand,
+    IN PKSPIN_LOCK Lock);
+#endif
+
+NTKERNELAPI
+PLIST_ENTRY
+FASTCALL
+ExInterlockedInsertHeadList(
+    IN PLIST_ENTRY ListHead,
+    IN PLIST_ENTRY ListEntry,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+PLIST_ENTRY
+FASTCALL
+ExInterlockedInsertTailList(
+    IN PLIST_ENTRY ListHead,
+    IN PLIST_ENTRY ListEntry,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExInterlockedPopEntryList(
+    IN PSINGLE_LIST_ENTRY ListHead,
+    IN PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExInterlockedPushEntryList(
+    IN PSINGLE_LIST_ENTRY ListHead,
+    IN PSINGLE_LIST_ENTRY ListEntry,
+    IN PKSPIN_LOCK Lock);
 
-NTSYSAPI
-WCHAR
-NTAPI
-RtlDowncaseUnicodeChar(
-    IN WCHAR SourceCharacter);
+NTKERNELAPI
+PLIST_ENTRY
+FASTCALL
+ExInterlockedRemoveHeadList(
+    IN PLIST_ENTRY ListHead,
+    IN PKSPIN_LOCK Lock);
 
-NTSYSAPI
-VOID
+NTKERNELAPI
+BOOLEAN
 NTAPI
-RtlSetBit(
-    PRTL_BITMAP BitMapHeader,
-    ULONG BitNumber);
+ExIsProcessorFeaturePresent(
+    IN ULONG ProcessorFeature);
 
-NTSYSAPI
+NTKERNELAPI
 BOOLEAN
 NTAPI
-RtlTestBit(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG BitNumber);
-
-#endif // (NTDDI_VERSION >= NTDDI_WINXP)
+ExIsResourceAcquiredExclusiveLite(
+    IN PERESOURCE Resource);
 
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-NTSYSAPI
+NTKERNELAPI
 ULONG
 NTAPI
-RtlNumberOfSetBitsUlongPtr(
-    IN ULONG_PTR Target);
+ExIsResourceAcquiredSharedLite(
+    IN PERESOURCE Resource);
 
-NTSYSAPI
-ULONGLONG
-NTAPI
-RtlIoDecodeMemIoResource (
-    IN PIO_RESOURCE_DESCRIPTOR Descriptor,
-    OUT PULONGLONG Alignment OPTIONAL,
-    OUT PULONGLONG MinimumAddress OPTIONAL,
-    OUT PULONGLONG MaximumAddress OPTIONAL);
+#define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlIoEncodeMemIoResource(
-    IN PIO_RESOURCE_DESCRIPTOR Descriptor,
-    IN UCHAR Type,
-    IN ULONGLONG Length,
-    IN ULONGLONG Alignment,
-    IN ULONGLONG MinimumAddress,
-    IN ULONGLONG MaximumAddress);
+ExLocalTimeToSystemTime(
+    IN PLARGE_INTEGER LocalTime,
+    OUT PLARGE_INTEGER SystemTime);
 
-NTSYSAPI
-ULONGLONG
+NTKERNELAPI
+VOID
 NTAPI
-RtlCmDecodeMemIoResource(
-    IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
-    OUT PULONGLONG Start OPTIONAL);
+ExNotifyCallback(
+    IN PCALLBACK_OBJECT CallbackObject,
+    IN PVOID Argument1,
+    IN PVOID Argument2);
 
-NTSYSAPI
-NTSTATUS
+NTKERNELAPI
+VOID
 NTAPI
-RtlFindClosestEncodableLength(
-    IN ULONGLONG SourceLength,
-    OUT PULONGLONG TargetLength);
-
-#endif
-
-#if !defined(MIDL_PASS)
-/* inline funftions */
-//DECLSPEC_DEPRECATED_DDK_WINXP
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlConvertLongToLargeInteger(LONG SignedInteger)
-{
-    LARGE_INTEGER ret;
-    ret.QuadPart = SignedInteger;
-    return ret;
-}
-
-//DECLSPEC_DEPRECATED_DDK_WINXP
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlConvertUlongToLargeInteger(
-  ULONG UnsignedInteger)
-{
-    LARGE_INTEGER ret;
-    ret.QuadPart = UnsignedInteger;
-    return ret;
-}
+ExQueueWorkItem(
+    IN PWORK_QUEUE_ITEM WorkItem,
+    IN WORK_QUEUE_TYPE QueueType);
 
-//DECLSPEC_DEPRECATED_DDK
-static __inline
-ULONG
-NTAPI_INLINE
-RtlEnlargedUnsignedDivide(
-    IN ULARGE_INTEGER Dividend,
-    IN ULONG Divisor,
-    IN OUT PULONG Remainder)
-{
-    if (Remainder)
-        *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
-    return (ULONG)(Dividend.QuadPart / Divisor);
-}
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseStatus(
+    IN NTSTATUS Status);
 
-//DECLSPEC_DEPRECATED_DDK
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlEnlargedUnsignedMultiply(
-    IN ULONG Multiplicand,
-    IN ULONG Multiplier)
-{
-    LARGE_INTEGER ret;
-    ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
-    return ret;
-}
+NTKERNELAPI
+PVOID
+NTAPI
+ExRegisterCallback(
+    IN PCALLBACK_OBJECT CallbackObject,
+    IN PCALLBACK_FUNCTION CallbackFunction,
+    IN PVOID CallbackContext);
 
-//DECLSPEC_DEPRECATED_DDK
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlEnlargedIntegerMultiply(
-    IN LONG Multiplicand,
-    IN LONG Multiplier)
-{
-    LARGE_INTEGER ret;
-    ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
-    return ret;
-}
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExReinitializeResourceLite(
+    IN PERESOURCE Resource);
 
-FORCEINLINE
+NTKERNELAPI
 VOID
-RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
-                       IN PCHAR Buffer,
-                       IN USHORT BufferSize)
-{
-    AnsiString->Length = 0;
-    AnsiString->MaximumLength = BufferSize;
-    AnsiString->Buffer = Buffer;
-}
+NTAPI
+ExReleaseResourceForThreadLite(
+    IN PERESOURCE Resource,
+    IN ERESOURCE_THREAD ResourceThreadId);
 
-FORCEINLINE
+NTKERNELAPI
 VOID
-RtlInitEmptyUnicodeString(
-    OUT PUNICODE_STRING UnicodeString,
-    IN PWSTR Buffer,
-    IN USHORT BufferSize)
-{
-    UnicodeString->Length = 0;
-    UnicodeString->MaximumLength = BufferSize;
-    UnicodeString->Buffer = Buffer;
-}
-
-#if defined(_AMD64_) || defined(_IA64_)
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlExtendedIntegerMultiply(
-    LARGE_INTEGER Multiplicand,
-    LONG Multiplier)
-{
-    LARGE_INTEGER ret;
-    ret.QuadPart = Multiplicand.QuadPart * Multiplier;
-    return ret;
-}
-
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlExtendedLargeIntegerDivide(
-    LARGE_INTEGER Dividend,
-    ULONG Divisor,
-    PULONG Remainder)
-{
-    LARGE_INTEGER ret;
-    ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
-    if (Remainder)
-        *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
-    return ret;
-}
-#endif
-
-#if defined(_AMD64_)
+FASTCALL
+ExReleaseResourceLite(
+    IN PERESOURCE Resource);
 
-#define MultiplyHigh __mulh
-#define UnsignedMultiplyHigh __umulh
+NTKERNELAPI
+VOID
+NTAPI
+ExSetResourceOwnerPointer(
+    IN PERESOURCE Resource,
+    IN PVOID OwnerPointer);
 
-//DECLSPEC_DEPRECATED_DDK
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlExtendedMagicDivide(
-    IN LARGE_INTEGER Dividend,
-    IN LARGE_INTEGER MagicDivisor,
-    IN CCHAR ShiftCount)
-{
-    LARGE_INTEGER ret;
-    ULONG64 ret64;
-    BOOLEAN Pos;
-    Pos = (Dividend.QuadPart >= 0);
-    ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
-                                 MagicDivisor.QuadPart);
-    ret64 >>= ShiftCount;
-    ret.QuadPart = Pos ? ret64 : -ret64;
-    return ret;
-}
-#endif
+NTKERNELAPI
+ULONG
+NTAPI
+ExSetTimerResolution(
+    IN ULONG DesiredTime,
+    IN BOOLEAN SetResolution);
 
-//DECLSPEC_DEPRECATED_DDK
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlLargeIntegerAdd(
-    IN LARGE_INTEGER Addend1,
-    IN LARGE_INTEGER Addend2)
-{
-    LARGE_INTEGER ret;
-    ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
-    return ret;
-}
+NTKERNELAPI
+VOID
+NTAPI
+ExSystemTimeToLocalTime(
+    IN PLARGE_INTEGER SystemTime,
+    OUT PLARGE_INTEGER LocalTime);
 
-/* VOID
- * RtlLargeIntegerAnd(
- *     IN OUT LARGE_INTEGER Result,
- *     IN LARGE_INTEGER Source,
- *     IN LARGE_INTEGER Mask);
- */
-#define RtlLargeIntegerAnd(Result, Source, Mask) \
-    Result.QuadPart = Source.QuadPart & Mask.QuadPart
+NTKERNELAPI
+VOID
+NTAPI
+ExUnregisterCallback(
+    IN PVOID CbRegistration);
 
-//DECLSPEC_DEPRECATED_DDK
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlLargeIntegerArithmeticShift(
-    IN LARGE_INTEGER LargeInteger,
-    IN CCHAR ShiftCount)
-{
-    LARGE_INTEGER ret;
-    ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
-    return ret;
-}
 
-/* BOOLEAN
- * RtlLargeIntegerEqualTo(
- *     IN LARGE_INTEGER  Operand1,
- *     IN LARGE_INTEGER  Operand2);
- */
-#define RtlLargeIntegerEqualTo(X,Y) \
-    (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
+#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
 
-FORCEINLINE
-PVOID
-RtlSecureZeroMemory(
-    OUT PVOID Pointer,
-    IN SIZE_T Size)
-{
-    volatile char* vptr = (volatile char*)Pointer;
-#if defined(_M_AMD64)
-    __stosb((PUCHAR)vptr, 0, Size);
-#else
-    char * endptr = (char *)vptr + Size;
-    while (vptr < endptr)
-    {
-        *vptr = 0; vptr++;
-    }
-#endif
-     return Pointer;
-}
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+ExAcquireRundownProtection(
+    IN OUT PEX_RUNDOWN_REF RunRef);
 
-#if defined(_M_AMD64)
-FORCEINLINE
-ULONG
-RtlCheckBit(
-    IN PRTL_BITMAP BitMapHeader,
-    IN ULONG BitPosition)
-{
-    return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
-}
-#else
-#define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
-#endif // defined(_M_AMD64)
+NTKERNELAPI
+VOID
+FASTCALL
+ExInitializeRundownProtection(
+    OUT PEX_RUNDOWN_REF RunRef);
 
-#endif // !defined(MIDL_PASS)
+NTKERNELAPI
+VOID
+FASTCALL
+ExReInitializeRundownProtection(
+    OUT PEX_RUNDOWN_REF RunRef);
 
-//
-// Byte Swap Functions
-//
-#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
-    ((defined(_M_AMD64) || defined(_M_IA64)) \
-        && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
+NTKERNELAPI
+VOID
+FASTCALL
+ExReleaseRundownProtection(
+    IN OUT PEX_RUNDOWN_REF RunRef);
 
-#define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
-#define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
-#define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
+NTKERNELAPI
+VOID
+FASTCALL
+ExRundownCompleted(
+    OUT PEX_RUNDOWN_REF RunRef);
 
-#endif
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ExVerifySuite(
+    IN SUITE_TYPE SuiteType);
 
-/******************************************************************************
- *                         Memory manager Types                               *
- ******************************************************************************/
+NTKERNELAPI
+VOID
+FASTCALL
+ExWaitForRundownProtectionRelease(
+    IN OUT PEX_RUNDOWN_REF RunRef);
 
-typedef struct _MDL {
-    struct _MDL *Next;
-    CSHORT Size;
-    CSHORT MdlFlags;
-    struct _EPROCESS *Process;
-    PVOID MappedSystemVa;
-    PVOID StartVa;
-    ULONG ByteCount;
-    ULONG ByteOffset;
-} MDL, *PMDL;
+#endif // (NTDDI_VERSION >= NTDDI_WINXP)
 
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+NTKERNELAPI
+BOOLEAN
+FASTCALL
+ExAcquireRundownProtectionEx(
+    IN OUT PEX_RUNDOWN_REF RunRef,
+    IN ULONG Count);
 
-/******************************************************************************
- *                       Memory manager Functions                             *
- ******************************************************************************/
+NTKERNELAPI
+VOID
+FASTCALL
+ExReleaseRundownProtectionEx(
+    IN OUT PEX_RUNDOWN_REF RunRef,
+    IN ULONG Count);
+#endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
 
-/* PVOID MmGetSystemAddressForMdl(
- *     IN PMDL Mdl);
- */
-#define MmGetSystemAddressForMdl(Mdl) \
-  (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
-    MDL_SOURCE_IS_NONPAGED_POOL)) ? \
-      ((Mdl)->MappedSystemVa) : \
-      (MmMapLockedPages((Mdl), KernelMode)))
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+NTKERNELAPI
+PEX_RUNDOWN_REF_CACHE_AWARE
+NTAPI
+ExAllocateCacheAwareRundownProtection(
+    IN POOL_TYPE PoolType,
+    IN ULONG PoolTag);
 
-/* PVOID
- * MmGetSystemAddressForMdlSafe(
- *     IN PMDL Mdl,
- *     IN MM_PAGE_PRIORITY Priority)
- */
-#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
-  (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
-    | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
-    (_Mdl)->MappedSystemVa : \
-    (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
-      KernelMode, MmCached, NULL, FALSE, (_Priority)))
+NTKERNELAPI
+SIZE_T
+NTAPI
+ExSizeOfRundownProtectionCacheAware(VOID);
+#endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
 
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
+#if (NTDDI_VERSION >= NTDDI_VISTA)
 NTKERNELAPI
-PMDL
+NTSTATUS
 NTAPI
-MmCreateMdl(
-  IN PMDL  MemoryDescriptorList  OPTIONAL,
-  IN PVOID  Base,
-  IN SIZE_T  Length);
+ExInitializeLookasideListEx(
+    OUT PLOOKASIDE_LIST_EX Lookaside,
+    IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
+    IN PFREE_FUNCTION_EX Free OPTIONAL,
+    IN POOL_TYPE PoolType,
+    IN ULONG Flags,
+    IN SIZE_T Size,
+    IN ULONG Tag,
+    IN USHORT Depth);
+#endif
+
+#if !defined(MIDL_PASS)
+
+static __inline PVOID
+ExAllocateFromNPagedLookasideList(
+    IN PNPAGED_LOOKASIDE_LIST Lookaside)
+{
+    PVOID Entry;
+
+    Lookaside->L.TotalAllocates++;
+    Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
+    if (Entry == NULL) {
+        Lookaside->L.AllocateMisses++;
+        Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
+                                        Lookaside->L.Size,
+                                        Lookaside->L.Tag);
+    }
+    return Entry;
+}
+
+static __inline PVOID
+ExAllocateFromPagedLookasideList(
+    IN PPAGED_LOOKASIDE_LIST Lookaside)
+{
+    PVOID Entry;
+
+    Lookaside->L.TotalAllocates++;
+    Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
+    if (Entry == NULL) {
+        Lookaside->L.AllocateMisses++;
+        Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
+                                        Lookaside->L.Size,
+                                        Lookaside->L.Tag);
+    }
+    return Entry;
+}
+
+static __inline VOID
+ExFreeToNPagedLookasideList(
+    IN PNPAGED_LOOKASIDE_LIST Lookaside,
+    IN PVOID  Entry)
+{
+    Lookaside->L.TotalFrees++;
+    if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
+        Lookaside->L.FreeMisses++;
+        (Lookaside->L.Free)(Entry);
+    } else {
+        InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
+    }
+}
 
-#endif
+static __inline VOID
+ExFreeToPagedLookasideList(
+    IN PPAGED_LOOKASIDE_LIST Lookaside,
+    IN PVOID  Entry)
+{
+    Lookaside->L.TotalFrees++;
+    if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
+        Lookaside->L.FreeMisses++;
+        (Lookaside->L.Free)(Entry);
+    } else {
+        InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
+    }
+}
 
+#endif // !defined(MIDL_PASS)
 
 /******************************************************************************
- *                         I/O Manager Functions                              *
+ *                          Object Manager Functions                          *
  ******************************************************************************/
 
-#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
-   (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
-#define DMA_MACROS_DEFINED
+NTKERNELAPI
+LONG_PTR
+FASTCALL
+ObfDereferenceObject(
+  IN PVOID Object);
+#define ObDereferenceObject ObfDereferenceObject
 
-FORCEINLINE
+NTKERNELAPI
 NTSTATUS
-IoAllocateAdapterChannel(
-    IN PADAPTER_OBJECT AdapterObject,
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG NumberOfMapRegisters,
-    IN PDRIVER_CONTROL ExecutionRoutine,
-    IN PVOID Context)
-{
-    PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
-    AllocateAdapterChannel =
-        *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
-    ASSERT(AllocateAdapterChannel);
-    return AllocateAdapterChannel(DmaAdapter,
-                                  DeviceObject,
-                                  NumberOfMapRegisters,
-                                  ExecutionRoutine,
-                                  Context );
-}
-
-FORCEINLINE
-BOOLEAN
-IoFlushAdapterBuffers(
-    IN PADAPTER_OBJECT AdapterObject,
-    IN PMDL Mdl,
-    IN PVOID MapRegisterBase,
-    IN PVOID CurrentVa,
-    IN ULONG Length,
-    IN BOOLEAN WriteToDevice)
-{
-    PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
-    FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
-    ASSERT(FlushAdapterBuffers);
-    return FlushAdapterBuffers(DmaAdapter,
-                               Mdl,
-                               MapRegisterBase,
-                               CurrentVa,
-                               Length,
-                               WriteToDevice );
-}
+NTAPI
+ObGetObjectSecurity(
+  IN PVOID Object,
+  OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
+  OUT PBOOLEAN MemoryAllocated);
 
-FORCEINLINE
-VOID
-IoFreeAdapterChannel(
-    IN PADAPTER_OBJECT AdapterObject)
-{
-    PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
-    FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
-    ASSERT(FreeAdapterChannel);
-    FreeAdapterChannel(DmaAdapter);
-}
+NTKERNELAPI
+LONG_PTR
+FASTCALL
+ObfReferenceObject(
+  IN PVOID Object);
+#define ObReferenceObject ObfReferenceObject
 
-FORCEINLINE
-VOID
-IoFreeMapRegisters(
-    IN PADAPTER_OBJECT AdapterObject,
-    IN PVOID MapRegisterBase,
-    IN ULONG NumberOfMapRegisters)
-{
-    PFREE_MAP_REGISTERS FreeMapRegisters;
-    FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
-    ASSERT(FreeMapRegisters);
-    FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
-}
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObReferenceObjectByHandle(
+  IN HANDLE Handle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_TYPE ObjectType OPTIONAL,
+  IN KPROCESSOR_MODE AccessMode,
+  OUT PVOID *Object,
+  OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
 
-FORCEINLINE
-PHYSICAL_ADDRESS
-IoMapTransfer(
-    IN PDMA_ADAPTER DmaAdapter,
-    IN PMDL Mdl,
-    IN PVOID MapRegisterBase,
-    IN PVOID CurrentVa,
-    IN OUT PULONG Length,
-    IN BOOLEAN WriteToDevice)
-{
-    PMAP_TRANSFER MapTransfer;
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObReferenceObjectByPointer(
+  IN PVOID  Object,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_TYPE ObjectType OPTIONAL,
+  IN KPROCESSOR_MODE AccessMode);
 
-    MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
-    ASSERT(MapTransfer);
-    return MapTransfer(DmaAdapter,
-                       Mdl,
-                       MapRegisterBase,
-                       CurrentVa,
-                       Length,
-                       WriteToDevice);
-}
-#endif
+NTKERNELAPI
+VOID
+NTAPI
+ObReleaseObjectSecurity(
+  IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+  IN BOOLEAN MemoryAllocated);
 
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
 
 /******************************************************************************
- *                            Executive Types                                 *
+ *                          Process Manager Functions                         *
  ******************************************************************************/
 
-typedef enum _POOL_TYPE {
-    NonPagedPool,
-    PagedPool,
-    NonPagedPoolMustSucceed,
-    DontUseThisType,
-    NonPagedPoolCacheAligned,
-    PagedPoolCacheAligned,
-    NonPagedPoolCacheAlignedMustS,
-    MaxPoolType,
-    NonPagedPoolSession = 32,
-    PagedPoolSession,
-    NonPagedPoolMustSucceedSession,
-    DontUseThisTypeSession,
-    NonPagedPoolCacheAlignedSession,
-    PagedPoolCacheAlignedSession,
-    NonPagedPoolCacheAlignedMustSSession
-} POOL_TYPE;
+/*
+ * PEPROCESS
+ * PsGetCurrentProcess(VOID)
+ */
+#define PsGetCurrentProcess IoGetCurrentProcess
 
-typedef enum _SUITE_TYPE {
-    SmallBusiness,
-    Enterprise,
-    BackOffice,
-    CommunicationServer,
-    TerminalServer,
-    SmallBusinessRestricted,
-    EmbeddedNT,
-    DataCenter,
-    SingleUserTS,
-    Personal,
-    Blade,
-    MaxSuiteType
-} SUITE_TYPE;
+#if !defined(_PSGETCURRENTTHREAD_)
 
-typedef enum _EX_POOL_PRIORITY {
-    LowPoolPriority,
-    LowPoolPrioritySpecialPoolOverrun = 8,
-    LowPoolPrioritySpecialPoolUnderrun = 9,
-    NormalPoolPriority = 16,
-    NormalPoolPrioritySpecialPoolOverrun = 24,
-    NormalPoolPrioritySpecialPoolUnderrun = 25,
-    HighPoolPriority = 32,
-    HighPoolPrioritySpecialPoolOverrun = 40,
-    HighPoolPrioritySpecialPoolUnderrun = 41
-} EX_POOL_PRIORITY;
+#define _PSGETCURRENTTHREAD_
 
-typedef struct _FAST_MUTEX
+FORCEINLINE
+PETHREAD
+NTAPI
+PsGetCurrentThread (
+  VOID)
 {
-    LONG Count;
-    PKTHREAD Owner;
-    ULONG Contention;
-    KEVENT Gate;
-    ULONG OldIrql;
-} FAST_MUTEX, *PFAST_MUTEX;
+  return (PETHREAD)KeGetCurrentThread();
+}
 
-typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
+#endif
 
-typedef struct _OWNER_ENTRY {
-    ERESOURCE_THREAD OwnerThread;
-    _ANONYMOUS_UNION union {
-        LONG OwnerCount;
-        ULONG TableSize;
-    } DUMMYUNIONNAME;
-} OWNER_ENTRY, *POWNER_ENTRY;
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
-typedef struct _ERESOURCE
-{
-    LIST_ENTRY SystemResourcesList;
-    POWNER_ENTRY OwnerTable;
-    SHORT ActiveCount;
-    USHORT Flag;
-    volatile PKSEMAPHORE SharedWaiters;
-    volatile PKEVENT ExclusiveWaiters;
-    OWNER_ENTRY OwnerEntry;
-    ULONG ActiveEntries;
-    ULONG ContentionCount;
-    ULONG NumberOfSharedWaiters;
-    ULONG NumberOfExclusiveWaiters;
-    union
-    {
-        PVOID Address;
-        ULONG_PTR CreatorBackTraceIndex;
-    };
-    KSPIN_LOCK SpinLock;
-} ERESOURCE, *PERESOURCE;
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsCreateSystemThread(
+  OUT PHANDLE  ThreadHandle,
+  IN ULONG  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
+  IN HANDLE  ProcessHandle  OPTIONAL,
+  OUT PCLIENT_ID  ClientId  OPTIONAL,
+  IN PKSTART_ROUTINE  StartRoutine,
+  IN PVOID  StartContext OPTIONAL);
 
-#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
-#define LOOKASIDE_ALIGN
-#else
-#define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
-#endif
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsTerminateSystemThread(
+  IN NTSTATUS  ExitStatus);
 
-typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
+#endif
 
-typedef PVOID
-(DDKAPI *PALLOCATE_FUNCTION)(
-    IN POOL_TYPE PoolType,
-    IN SIZE_T NumberOfBytes,
-    IN ULONG Tag);
+/******************************************************************************
+ *                          WMI Library Support Functions                     *
+ ******************************************************************************/
 
-typedef PVOID
-(DDKAPI *PALLOCATE_FUNCTION_EX)(
-    IN POOL_TYPE PoolType,
-    IN SIZE_T NumberOfBytes,
-    IN ULONG Tag,
-    IN OUT PLOOKASIDE_LIST_EX Lookaside);
+#ifdef RUN_WPP
 
-typedef VOID
-(DDKAPI *PFREE_FUNCTION)(
-    IN PVOID Buffer);
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+NTSTATUS
+DDKCDECLAPI
+WmiTraceMessage(
+  IN TRACEHANDLE  LoggerHandle,
+  IN ULONG  MessageFlags,
+  IN LPGUID  MessageGuid,
+  IN USHORT  MessageNumber,
+  IN ...);
+#endif
 
-typedef VOID
-(DDKAPI *PFREE_FUNCTION_EX)(
-    IN PVOID Buffer,
-    IN OUT PLOOKASIDE_LIST_EX Lookaside);
+#endif
 
-typedef VOID
-(DDKAPI *PCALLBACK_FUNCTION)(
-  IN PVOID  CallbackContext,
-  IN PVOID  Argument1,
-  IN PVOID  Argument2);
+ #if (NTDDI_VERSION >= NTDDI_WINXP)
 
-typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
-    union {
-        SLIST_HEADER ListHead;
-        SINGLE_LIST_ENTRY SingleListHead;
-    } DUMMYUNIONNAME;
-    USHORT Depth;
-    USHORT MaximumDepth;
-    ULONG TotalAllocates;
-    union {
-        ULONG AllocateMisses;
-        ULONG AllocateHits;
-    } DUMMYUNIONNAME2;
-    ULONG TotalFrees;
-    union {
-        ULONG FreeMisses;
-        ULONG FreeHits;
-    } DUMMYUNIONNAME3;
-    POOL_TYPE Type;
-    ULONG Tag;
-    ULONG Size;
-    union {
-        PALLOCATE_FUNCTION_EX AllocateEx; 
-        PALLOCATE_FUNCTION Allocate;
-    } DUMMYUNIONNAME4;
-    union {
-        PFREE_FUNCTION_EX FreeEx;
-        PFREE_FUNCTION Free;
-    } DUMMYUNIONNAME5;
-    LIST_ENTRY ListEntry;
-    ULONG  LastTotalAllocates;
-    union {
-        ULONG  LastAllocateMisses;
-        ULONG  LastAllocateHits;
-    } DUMMYUNIONNAME6;
-    ULONG Future[2];
-} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
+NTKERNELAPI
+NTSTATUS
+NTAPI
+WmiQueryTraceInformation(
+  IN TRACE_INFORMATION_CLASS  TraceInformationClass,
+  OUT PVOID  TraceInformation,
+  IN ULONG  TraceInformationLength,
+  OUT PULONG  RequiredLength OPTIONAL,
+  IN PVOID  Buffer OPTIONAL);
+
+#if 0
+/* FIXME: Get va_list from where? */
+NTKERNELAPI
+NTSTATUS
+DDKCDECLAPI
+WmiTraceMessageVa(
+  IN TRACEHANDLE  LoggerHandle,
+  IN ULONG  MessageFlags,
+  IN LPGUID  MessageGuid,
+  IN USHORT  MessageNumber,
+  IN va_list  MessageArgList);
+#endif
 
-typedef struct _PAGED_LOOKASIDE_LIST {
-    GENERAL_LOOKASIDE L;
-#if !defined(_AMD64_) && !defined(_IA64_)
-    FAST_MUTEX Lock__ObsoleteButDoNotDelete;
 #endif
-} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
 
-typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
-    GENERAL_LOOKASIDE L;
-#if !defined(_AMD64_) && !defined(_IA64_)
-    KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
+/******************************************************************************
+ *                          Kernel Debugger Functions                         *
+ ******************************************************************************/
+
+#ifndef _DBGNT_
+ULONG
+DDKCDECLAPI
+DbgPrint(
+  IN PCSTR  Format,
+  IN ...);
 #endif
-} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
 
-//typedef struct _LOOKASIDE_LIST_EX {
-//    GENERAL_LOOKASIDE_POOL L;
-//} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
+#if DBG
 
-typedef struct _EX_RUNDOWN_REF {
-    union {
-        volatile ULONG_PTR Count;
-        volatile PVOID Ptr;
-    };
-} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
+#define KdPrint(_x_) DbgPrint _x_
+#define KdPrintEx(_x_) DbgPrintEx _x_
+#define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
+#define KdBreakPoint() DbgBreakPoint()
+#define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
+
+#else /* !DBG */
+
+#define KdPrint(_x_)
+#define KdPrintEx(_x_)
+#define vKdPrintExWithPrefix(_x_)
+#define KdBreakPoint()
+#define KdBreakPointWithStatus(s)
 
-typedef struct _EX_RUNDOWN_REF_CACHE_AWARE  *PEX_RUNDOWN_REF_CACHE_AWARE;
+#endif /* !DBG */
 
-typedef enum _WORK_QUEUE_TYPE {
-  CriticalWorkQueue,
-  DelayedWorkQueue,
-  HyperCriticalWorkQueue,
-  MaximumWorkQueue
-} WORK_QUEUE_TYPE;
+#if defined(__GNUC__)
 
-typedef VOID
-(DDKAPI *PWORKER_THREAD_ROUTINE)(
-  IN PVOID Parameter);
+extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
+extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
+#define KD_DEBUGGER_ENABLED     KdDebuggerEnabled
+#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
 
-typedef struct _WORK_QUEUE_ITEM {
-  LIST_ENTRY  List;
-  PWORKER_THREAD_ROUTINE  WorkerRoutine;
-  volatile PVOID  Parameter;
-} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
+#elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
 
+extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
+extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
+#define KD_DEBUGGER_ENABLED     *KdDebuggerEnabled
+#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
 
-/******************************************************************************
- *                          Executive Functions                               *
- ******************************************************************************/
+#else
+
+extern BOOLEAN KdDebuggerNotPresent;
+extern BOOLEAN KdDebuggerEnabled;
+#define KD_DEBUGGER_ENABLED     KdDebuggerEnabled
+#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
 
-#if defined(_X86_)
-#if defined(_NTHAL_)
-#define ExAcquireFastMutex ExiAcquireFastMutex
-#define ExReleaseFastMutex ExiReleaseFastMutex
-#define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
 #endif
-#define ExInterlockedAddUlong ExfInterlockedAddUlong
-#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
-#define ExInterlockedInsertTailList ExfInterlockedInsertTailList
-#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
-#define ExInterlockedPopEntryList ExfInterlockedPopEntryList
-#define ExInterlockedPushEntryList ExfInterlockedPushEntryList
+
+#ifdef _VA_LIST_DEFINED
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTSYSAPI
+ULONG
+NTAPI
+vDbgPrintEx(
+  IN ULONG ComponentId,
+  IN ULONG Level,
+  IN PCCH Format,
+  IN va_list ap);
+
+NTSYSAPI
+ULONG
+NTAPI
+vDbgPrintExWithPrefix(
+  IN PCCH Prefix,
+  IN ULONG ComponentId,
+  IN ULONG Level,
+  IN PCCH Format,
+  IN va_list ap);
+
 #endif
+#endif // _VA_LIST_DEFINED
 
-#if defined(_WIN64)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
-#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
-    defined(_NTHAL_) || defined(_NTOSP_)
 NTKERNELAPI
-USHORT
-ExQueryDepthSList(IN PSLIST_HEADER ListHead);
+NTSTATUS
+NTAPI
+KdDisableDebugger(
+  VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KdEnableDebugger(
+  VOID);
+
+#if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
+#define DbgBreakPoint __debugbreak
 #else
-FORCEINLINE
-USHORT
-ExQueryDepthSList(IN PSLIST_HEADER ListHead)
-{
-    return (USHORT)(ListHead->Alignment & 0xffff);
-}
+VOID
+NTAPI
+DbgBreakPoint(
+  VOID);
 #endif
 
-NTKERNELAPI
-PSLIST_ENTRY
-ExpInterlockedFlushSList(
-    PSLIST_HEADER ListHead);
+NTSYSAPI
+VOID
+NTAPI
+DbgBreakPointWithStatus(
+  IN ULONG  Status);
 
-NTKERNELAPI
-PSLIST_ENTRY
-ExpInterlockedPopEntrySList(
-    PSLIST_HEADER ListHead);
+NTSYSAPI
+ULONG
+DDKCDECLAPI
+DbgPrintReturnControlC(
+  IN PCCH  Format,
+  IN ...);
 
-NTKERNELAPI
-PSLIST_ENTRY
-ExpInterlockedPushEntrySList(
-    PSLIST_HEADER ListHead,
-    PSLIST_ENTRY ListEntry);
+#endif
 
-#define ExInterlockedFlushSList(Head) \
-    ExpInterlockedFlushSList(Head)
-#define ExInterlockedPopEntrySList(Head, Lock) \
-    ExpInterlockedPopEntrySList(Head)
-#define ExInterlockedPushEntrySList(Head, Entry, Lock) \
-    ExpInterlockedPushEntrySList(Head, Entry)
+#if (NTDDI_VERSION >= NTDDI_WINXP)
 
-#else // !defined(_WIN64)
+NTSYSAPI
+ULONG
+DDKCDECLAPI
+DbgPrintEx(
+  IN ULONG  ComponentId,
+  IN ULONG  Level,
+  IN PCSTR  Format,
+  IN ...);
 
-#define ExQueryDepthSList(listhead) (listhead)->Depth
+NTSYSAPI
+NTSTATUS
+NTAPI
+DbgQueryDebugFilterState(
+  IN ULONG  ComponentId,
+  IN ULONG  Level);
 
-NTKERNELAPI
-PSINGLE_LIST_ENTRY
-FASTCALL
-ExInterlockedFlushSList(
-    IN PSLIST_HEADER ListHead);
+NTSYSAPI
+NTSTATUS
+NTAPI
+DbgSetDebugFilterState(
+  IN ULONG  ComponentId,
+  IN ULONG  Level,
+  IN BOOLEAN  State);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
 
-#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
 NTKERNELAPI
-PSINGLE_LIST_ENTRY 
-FASTCALL
-ExInterlockedPopEntrySList(
-    IN PSLIST_HEADER ListHead,
-    IN PKSPIN_LOCK Lock);
+BOOLEAN
+NTAPI
+KdRefreshDebuggerNotPresent(
+    VOID
+);
+
+#endif
 
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
 NTKERNELAPI
-PSINGLE_LIST_ENTRY 
-FASTCALL
-ExInterlockedPushEntrySList(
-    IN PSLIST_HEADER ListHead,
-    IN PSINGLE_LIST_ENTRY ListEntry,
-    IN PKSPIN_LOCK Lock);
-#else
-#define ExInterlockedPopEntrySList(_ListHead, _Lock) \
-    InterlockedPopEntrySList(_ListHead)
-#define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
-    InterlockedPushEntrySList(_ListHead, _ListEntry)
-#endif // _WIN2K_COMPAT_SLIST_USAGE
+NTSTATUS
+NTAPI
+KdChangeOption(
+  IN KD_OPTION Option,
+  IN ULONG InBufferBytes OPTIONAL,
+  IN PVOID InBuffer,
+  IN ULONG OutBufferBytes OPTIONAL,
+  OUT PVOID OutBuffer,
+  OUT PULONG OutBufferNeeded OPTIONAL);
+#endif
 
-#endif // !defined(_WIN64)
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
+FORCEINLINE
+PVOID
+NTAPI
+HalAllocateCommonBuffer(
+  IN PDMA_ADAPTER DmaAdapter,
+  IN ULONG  Length,
+  OUT PPHYSICAL_ADDRESS  LogicalAddress,
+  IN BOOLEAN  CacheEnabled)
+{
+  PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
+  PVOID commonBuffer;
 
-/* ERESOURCE_THREAD
- * ExGetCurrentResourceThread(
*     VOID);
- */
-#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
+  allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
+  ASSERT( allocateCommonBuffer != NULL );
 commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
+  return commonBuffer;
+}
 
-#define ExReleaseResource(R) (ExReleaseResourceLite(R))
+FORCEINLINE
+VOID
+NTAPI
+HalFreeCommonBuffer(
+  IN PDMA_ADAPTER DmaAdapter,
+  IN ULONG  Length,
+  IN PHYSICAL_ADDRESS  LogicalAddress,
+  IN PVOID  VirtualAddress,
+  IN BOOLEAN  CacheEnabled)
+{
+  PFREE_COMMON_BUFFER freeCommonBuffer;
 
-/* VOID
- * ExInitializeWorkItem(
- *     IN PWORK_QUEUE_ITEM Item,
- *     IN PWORKER_THREAD_ROUTINE Routine,
- *     IN PVOID Context)
- */
-#define ExInitializeWorkItem(Item, Routine, Context) \
-{ \
-  (Item)->WorkerRoutine = Routine; \
-  (Item)->Parameter = Context; \
-  (Item)->List.Flink = NULL; \
+  freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
+  ASSERT( freeCommonBuffer != NULL );
+  freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
 }
 
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
+FORCEINLINE
+ULONG
+NTAPI
+HalReadDmaCounter(
+  IN PDMA_ADAPTER DmaAdapter)
+{
+  PREAD_DMA_COUNTER readDmaCounter;
+  ULONG counter;
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExAcquireFastMutex(
-    IN OUT PFAST_MUTEX FastMutex);
+  readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
+  ASSERT( readDmaCounter != NULL );
+  counter = readDmaCounter( DmaAdapter );
+  return counter;
+}
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExReleaseFastMutex(
-    IN OUT PFAST_MUTEX FastMutex);
+#endif
 
-NTKERNELAPI
-BOOLEAN
-FASTCALL
-ExTryToAcquireFastMutex(
-    IN OUT PFAST_MUTEX FastMutex);
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExAcquireFastMutexUnsafe(
-    IN OUT PFAST_MUTEX FastMutex);
+#ifndef _NTTMAPI_
+#define _NTTMAPI_
+
+#include <ktmtypes.h>
+
+typedef enum _KTMOBJECT_TYPE {
+  KTMOBJECT_TRANSACTION,
+  KTMOBJECT_TRANSACTION_MANAGER,
+  KTMOBJECT_RESOURCE_MANAGER,
+  KTMOBJECT_ENLISTMENT,
+  KTMOBJECT_INVALID
+} KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
+
+typedef struct _KTMOBJECT_CURSOR {
+  GUID LastQuery;
+  ULONG ObjectIdCount;
+  GUID ObjectIds[1];
+} KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
+
+typedef enum _TRANSACTION_INFORMATION_CLASS {
+  TransactionBasicInformation,
+  TransactionPropertiesInformation,
+  TransactionEnlistmentInformation,
+  TransactionSuperiorEnlistmentInformation
+} TRANSACTION_INFORMATION_CLASS;
+
+typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
+  TransactionManagerBasicInformation,
+  TransactionManagerLogInformation,
+  TransactionManagerLogPathInformation,
+  TransactionManagerRecoveryInformation = 4
+} TRANSACTIONMANAGER_INFORMATION_CLASS;
+
+typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
+  ResourceManagerBasicInformation,
+  ResourceManagerCompletionInformation,
+} RESOURCEMANAGER_INFORMATION_CLASS;
+
+typedef enum _ENLISTMENT_INFORMATION_CLASS {
+  EnlistmentBasicInformation,
+  EnlistmentRecoveryInformation,
+  EnlistmentCrmInformation
+} ENLISTMENT_INFORMATION_CLASS;
+
+#endif /* !_NTTMAPI_ */
+/******************************************************************************
+ *                            ZwXxx Functions                                 *
+ ******************************************************************************/
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExReleaseFastMutexUnsafe(
-    IN OUT PFAST_MUTEX FastMutex);
+/* Constants */
+#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
+#define ZwCurrentProcess() NtCurrentProcess()
+#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
+#define ZwCurrentThread() NtCurrentThread()
 
-NTKERNELAPI
-BOOLEAN
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExAcquireResourceExclusiveLite(
-    IN PERESOURCE Resource,
-    IN BOOLEAN Wait);
+ZwClose(
+  IN HANDLE  Handle);
 
-NTKERNELAPI
-BOOLEAN
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExAcquireResourceSharedLite(
-    IN PERESOURCE Resource,
-    IN BOOLEAN Wait);
+ZwCreateDirectoryObject(
+  OUT PHANDLE  DirectoryHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes);
 
-NTKERNELAPI
-BOOLEAN
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExAcquireSharedStarveExclusive(
-    IN PERESOURCE Resource,
-    IN BOOLEAN Wait);
+ZwCreateFile(
+  OUT PHANDLE  FileHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  IN PLARGE_INTEGER  AllocationSize  OPTIONAL,
+  IN ULONG  FileAttributes,
+  IN ULONG  ShareAccess,
+  IN ULONG  CreateDisposition,
+  IN ULONG  CreateOptions,
+  IN PVOID  EaBuffer  OPTIONAL,
+  IN ULONG  EaLength);
 
-NTKERNELAPI
-BOOLEAN
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExAcquireSharedWaitForExclusive(
-    IN PERESOURCE Resource,
-    IN BOOLEAN Wait);
+ZwCreateKey(
+  OUT PHANDLE  KeyHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes,
+  IN ULONG  TitleIndex,
+  IN PUNICODE_STRING  Class  OPTIONAL,
+  IN ULONG  CreateOptions,
+  OUT PULONG  Disposition  OPTIONAL);
 
-NTKERNELAPI
-PVOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExAllocatePool(
-    IN POOL_TYPE PoolType,
-    IN SIZE_T NumberOfBytes);
+ZwCreateSection(
+  OUT PHANDLE SectionHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN PLARGE_INTEGER MaximumSize OPTIONAL,
+  IN ULONG SectionPageProtection,
+  IN ULONG AllocationAttributes,
+  IN HANDLE FileHandle OPTIONAL);
 
-#ifdef POOL_TAGGING
-#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
-#endif /* POOL_TAGGING */
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDeleteKey(
+  IN HANDLE KeyHandle);
 
-NTKERNELAPI
-PVOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExAllocatePoolWithQuota(
-    IN POOL_TYPE PoolType,
-    IN SIZE_T NumberOfBytes);
+ZwDeleteValueKey(
+  IN HANDLE  KeyHandle,
+  IN PUNICODE_STRING ValueName);
 
-#ifdef POOL_TAGGING
-#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
-#endif /* POOL_TAGGING */
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwEnumerateKey(
+  IN HANDLE KeyHandle,
+  IN ULONG Index,
+  IN KEY_INFORMATION_CLASS KeyInformationClass,
+  OUT PVOID KeyInformation OPTIONAL,
+  IN ULONG Length,
+  OUT PULONG ResultLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwEnumerateValueKey(
+  IN HANDLE KeyHandle,
+  IN ULONG Index,
+  IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
+  OUT PVOID KeyValueInformation OPTIONAL,
+  IN ULONG Length,
+  OUT PULONG ResultLength);
 
-NTKERNELAPI
-PVOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExAllocatePoolWithQuotaTag(
-  IN POOL_TYPE  PoolType,
-  IN SIZE_T  NumberOfBytes,
-  IN ULONG  Tag);
+ZwFlushKey(
+  IN HANDLE  KeyHandle);
 
-#ifndef POOL_TAGGING
-#define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
-#endif /* POOL_TAGGING */
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwLoadDriver(
+  IN PUNICODE_STRING DriverServiceName);
 
-NTKERNELAPI
-PVOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExAllocatePoolWithTag(
-    IN POOL_TYPE PoolType,
-    IN SIZE_T NumberOfBytes,
-    IN ULONG Tag);
+ZwMakeTemporaryObject(
+  IN HANDLE  Handle);
 
-NTKERNELAPI
-PVOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExAllocatePoolWithTagPriority(
-    IN POOL_TYPE PoolType,
-    IN SIZE_T NumberOfBytes,
-    IN ULONG Tag,
-    IN EX_POOL_PRIORITY Priority);
+ZwMapViewOfSection(
+  IN HANDLE  SectionHandle,
+  IN HANDLE  ProcessHandle,
+  IN OUT PVOID  *BaseAddress,
+  IN ULONG_PTR  ZeroBits,
+  IN SIZE_T  CommitSize,
+  IN OUT PLARGE_INTEGER  SectionOffset  OPTIONAL,
+  IN OUT PSIZE_T  ViewSize,
+  IN SECTION_INHERIT  InheritDisposition,
+  IN ULONG  AllocationType,
+  IN ULONG  Protect);
 
-NTKERNELAPI
-VOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExConvertExclusiveToSharedLite(
-    IN PERESOURCE Resource);
+ZwOpenFile(
+  OUT PHANDLE FileHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG ShareAccess,
+  IN ULONG OpenOptions);
 
-NTKERNELAPI
+NTSYSAPI
 NTSTATUS
 NTAPI
-ExCreateCallback(
-    OUT PCALLBACK_OBJECT *CallbackObject,
-    IN POBJECT_ATTRIBUTES ObjectAttributes,
-    IN BOOLEAN Create,
-    IN BOOLEAN AllowMultipleCallbacks);
+ZwOpenKey(
+  OUT PHANDLE  KeyHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes);
 
-NTKERNELAPI
-VOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExDeleteNPagedLookasideList(
-    IN PNPAGED_LOOKASIDE_LIST Lookaside);
+ZwOpenSection(
+  OUT PHANDLE  SectionHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes);
 
-NTKERNELAPI
-VOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExDeletePagedLookasideList(
-    IN PPAGED_LOOKASIDE_LIST Lookaside);
+ZwOpenSymbolicLinkObject(
+  OUT PHANDLE  LinkHandle,
+  IN ACCESS_MASK  DesiredAccess,
+  IN POBJECT_ATTRIBUTES  ObjectAttributes);
 
-NTKERNELAPI
+NTSYSAPI
 NTSTATUS
 NTAPI
-ExDeleteResourceLite(
-    IN PERESOURCE Resource);
+ZwQueryInformationFile(
+  IN HANDLE  FileHandle,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  OUT PVOID  FileInformation,
+  IN ULONG  Length,
+  IN FILE_INFORMATION_CLASS  FileInformationClass);
 
-NTKERNELAPI
-VOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExFreePool(
-    IN PVOID P);
+ZwQueryKey(
+  IN HANDLE KeyHandle,
+  IN KEY_INFORMATION_CLASS KeyInformationClass,
+  OUT PVOID KeyInformation OPTIONAL,
+  IN ULONG Length,
+  OUT PULONG ResultLength);
 
-#ifdef POOL_TAGGING
-#define ExFreePool(P) ExFreePoolWithTag(P, 0)
-#endif
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQuerySymbolicLinkObject(
+  IN HANDLE  LinkHandle,
+  IN OUT PUNICODE_STRING  LinkTarget,
+  OUT PULONG  ReturnedLength  OPTIONAL);
 
-NTKERNELAPI
-VOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExFreePoolWithTag(
-    IN PVOID P,
-    IN ULONG Tag);
+ZwQueryValueKey(
+  IN HANDLE KeyHandle,
+  IN PUNICODE_STRING ValueName,
+  IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
+  OUT PVOID KeyValueInformation OPTIONAL,
+  IN ULONG Length,
+  OUT PULONG ResultLength);
 
-NTKERNELAPI
-ULONG
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExGetExclusiveWaiterCount(
-    IN PERESOURCE Resource);
+ZwReadFile(
+  IN HANDLE  FileHandle,
+  IN HANDLE  Event  OPTIONAL,
+  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
+  IN PVOID  ApcContext  OPTIONAL,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  OUT PVOID  Buffer,
+  IN ULONG  Length,
+  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
+  IN PULONG  Key  OPTIONAL);
 
-NTKERNELAPI
-KPROCESSOR_MODE
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExGetPreviousMode(
-    VOID);
+ZwSetInformationFile(
+  IN HANDLE  FileHandle,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  IN PVOID  FileInformation,
+  IN ULONG  Length,
+  IN FILE_INFORMATION_CLASS  FileInformationClass);
 
-NTKERNELAPI
-ULONG
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExGetSharedWaiterCount(
-    IN PERESOURCE Resource);
+ZwSetValueKey(
+  IN HANDLE  KeyHandle,
+  IN PUNICODE_STRING  ValueName,
+  IN ULONG  TitleIndex  OPTIONAL,
+  IN ULONG  Type,
+  IN PVOID  Data OPTIONAL,
+  IN ULONG  DataSize);
 
-NTKERNELAPI
-VOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExInitializeNPagedLookasideList(
-    IN PNPAGED_LOOKASIDE_LIST Lookaside,
-    IN PALLOCATE_FUNCTION Allocate OPTIONAL,
-    IN PFREE_FUNCTION Free OPTIONAL,
-    IN ULONG Flags,
-    IN SIZE_T Size,
-    IN ULONG Tag,
-    IN USHORT Depth);
+ZwUnloadDriver(
+  IN PUNICODE_STRING DriverServiceName);
 
-NTKERNELAPI
-VOID
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExInitializePagedLookasideList(
-    IN PPAGED_LOOKASIDE_LIST Lookaside,
-    IN PALLOCATE_FUNCTION Allocate OPTIONAL,
-    IN PFREE_FUNCTION Free OPTIONAL,
-    IN ULONG Flags,
-    IN SIZE_T Size,
-    IN ULONG Tag,
-    IN USHORT Depth);
+ZwUnmapViewOfSection(
+  IN HANDLE  ProcessHandle,
+  IN PVOID  BaseAddress OPTIONAL);
 
-NTKERNELAPI
+NTSYSAPI
 NTSTATUS
 NTAPI
-ExInitializeResourceLite(
-    IN PERESOURCE Resource);
+ZwWriteFile(
+  IN HANDLE  FileHandle,
+  IN HANDLE  Event  OPTIONAL,
+  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
+  IN PVOID  ApcContext  OPTIONAL,
+  OUT PIO_STATUS_BLOCK  IoStatusBlock,
+  IN PVOID  Buffer,
+  IN ULONG  Length,
+  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
+  IN PULONG  Key  OPTIONAL);
 
-NTKERNELAPI
-LARGE_INTEGER
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExInterlockedAddLargeInteger(
-    IN PLARGE_INTEGER Addend,
-    IN LARGE_INTEGER Increment,
-    IN PKSPIN_LOCK Lock);
+ZwQueryFullAttributesFile(
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
 
-#if defined(_WIN64)
-#define ExInterlockedAddLargeStatistic(Addend, Increment) \
-    (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
-#else
-#define ExInterlockedAddLargeStatistic(Addend, Increment) \
-    _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
 #endif
 
-NTKERNELAPI
-ULONG
-FASTCALL
-ExInterlockedAddUlong(
-    IN PULONG Addend,
-    IN ULONG Increment,
-    PKSPIN_LOCK Lock);
+#if (NTDDI_VERSION >= NTDDI_WIN2003)
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwOpenEvent(
+  OUT PHANDLE EventHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes);
 
-#if defined(_AMD64_) || defined(_IA64_)
-#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
-    InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
-#elif defined(_X86_)
-NTKERNELAPI
-LONGLONG
-FASTCALL
-ExfInterlockedCompareExchange64(
-    IN OUT LONGLONG volatile *Destination,
-    IN PLONGLONG Exchange,
-    IN PLONGLONG Comperand);
-#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
-    ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
-#else
-NTKERNELAPI
-LONGLONG
-FASTCALL
-ExInterlockedCompareExchange64(
-    IN OUT LONGLONG volatile *Destination,
-    IN PLONGLONG Exchange,
-    IN PLONGLONG Comparand,
-    IN PKSPIN_LOCK Lock);
 #endif
 
-NTKERNELAPI
-PLIST_ENTRY
-FASTCALL
-ExInterlockedInsertHeadList(
-    IN PLIST_ENTRY ListHead,
-    IN PLIST_ENTRY ListEntry,
-    IN PKSPIN_LOCK Lock);
+#if (NTDDI_VERSION >= NTDDI_VISTA)
 
-NTKERNELAPI
-PLIST_ENTRY
-FASTCALL
-ExInterlockedInsertTailList(
-    IN PLIST_ENTRY ListHead,
-    IN PLIST_ENTRY ListEntry,
-    IN PKSPIN_LOCK Lock);
+NTSYSAPI
+NTSTATUS
+ZwCreateKeyTransacted(
+  OUT PHANDLE KeyHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN ULONG TitleIndex,
+  IN PUNICODE_STRING Class OPTIONAL,
+  IN ULONG CreateOptions,
+  IN HANDLE TransactionHandle,
+  OUT PULONG Disposition OPTIONAL);
 
-NTKERNELAPI
-PSINGLE_LIST_ENTRY
-FASTCALL
-ExInterlockedPopEntryList(
-    IN PSINGLE_LIST_ENTRY ListHead,
-    IN PKSPIN_LOCK Lock);
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenKeyTransacted(
+  OUT PHANDLE KeyHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN HANDLE TransactionHandle);
 
-NTKERNELAPI
-PSINGLE_LIST_ENTRY
-FASTCALL
-ExInterlockedPushEntryList(
-    IN PSINGLE_LIST_ENTRY ListHead,
-    IN PSINGLE_LIST_ENTRY ListEntry,
-    IN PKSPIN_LOCK Lock);
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCreateTransactionManager(
+  OUT PHANDLE TmHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN PUNICODE_STRING LogFileName OPTIONAL,
+  IN ULONG CreateOptions OPTIONAL,
+  IN ULONG CommitStrength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwOpenTransactionManager(
+  OUT PHANDLE TmHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN PUNICODE_STRING LogFileName OPTIONAL,
+  IN LPGUID TmIdentity OPTIONAL,
+  IN ULONG OpenOptions OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRollforwardTransactionManager(
+  IN HANDLE TransactionManagerHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-NTKERNELAPI
-PLIST_ENTRY
-FASTCALL
-ExInterlockedRemoveHeadList(
-    IN PLIST_ENTRY ListHead,
-    IN PKSPIN_LOCK Lock);
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRecoverTransactionManager(
+  IN HANDLE TransactionManagerHandle);
 
-NTKERNELAPI
-BOOLEAN
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExIsProcessorFeaturePresent(
-    IN ULONG ProcessorFeature);
+ZwQueryInformationTransactionManager(
+  IN HANDLE TransactionManagerHandle,
+  IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
+  OUT PVOID TransactionManagerInformation,
+  IN ULONG TransactionManagerInformationLength,
+  OUT PULONG ReturnLength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwSetInformationTransactionManager(
+  IN HANDLE TmHandle,
+  IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
+  IN PVOID TransactionManagerInformation,
+  IN ULONG TransactionManagerInformationLength);
 
-NTKERNELAPI
-BOOLEAN
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwEnumerateTransactionObject(
+  IN HANDLE RootObjectHandle OPTIONAL,
+  IN KTMOBJECT_TYPE QueryType,
+  IN OUT PKTMOBJECT_CURSOR ObjectCursor,
+  IN ULONG ObjectCursorLength,
+  OUT PULONG ReturnLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCreateTransaction(
+  OUT PHANDLE TransactionHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN LPGUID Uow OPTIONAL,
+  IN HANDLE TmHandle OPTIONAL,
+  IN ULONG CreateOptions OPTIONAL,
+  IN ULONG IsolationLevel OPTIONAL,
+  IN ULONG IsolationFlags OPTIONAL,
+  IN PLARGE_INTEGER Timeout OPTIONAL,
+  IN PUNICODE_STRING Description OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwOpenTransaction(
+  OUT PHANDLE TransactionHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN LPGUID Uow,
+  IN HANDLE TmHandle OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwQueryInformationTransaction(
+  IN HANDLE TransactionHandle,
+  IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
+  OUT PVOID TransactionInformation,
+  IN ULONG TransactionInformationLength,
+  OUT PULONG ReturnLength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwSetInformationTransaction(
+  IN HANDLE TransactionHandle,
+  IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
+  IN PVOID TransactionInformation,
+  IN ULONG TransactionInformationLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCommitTransaction(
+  IN HANDLE TransactionHandle,
+  IN BOOLEAN Wait);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRollbackTransaction(
+  IN HANDLE TransactionHandle,
+  IN BOOLEAN Wait);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwCreateResourceManager(
+  OUT PHANDLE ResourceManagerHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN HANDLE TmHandle,
+  IN LPGUID ResourceManagerGuid OPTIONAL,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN ULONG CreateOptions OPTIONAL,
+  IN PUNICODE_STRING Description OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwOpenResourceManager(
+  OUT PHANDLE ResourceManagerHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN HANDLE TmHandle,
+  IN LPGUID ResourceManagerGuid,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRecoverResourceManager(
+  IN HANDLE ResourceManagerHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwGetNotificationResourceManager(
+  IN HANDLE ResourceManagerHandle,
+  OUT PTRANSACTION_NOTIFICATION TransactionNotification,
+  IN ULONG NotificationLength,
+  IN PLARGE_INTEGER Timeout,
+  IN PULONG ReturnLength OPTIONAL,
+  IN ULONG Asynchronous,
+  IN ULONG_PTR AsynchronousContext OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwQueryInformationResourceManager(
+  IN HANDLE ResourceManagerHandle,
+  IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
+  OUT PVOID ResourceManagerInformation,
+  IN ULONG ResourceManagerInformationLength,
+  IN PULONG ReturnLength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExIsResourceAcquiredExclusiveLite(
-    IN PERESOURCE Resource);
+ZwSetInformationResourceManager(
+  IN HANDLE ResourceManagerHandle,
+  IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
+  IN PVOID ResourceManagerInformation,
+  IN ULONG ResourceManagerInformationLength);
 
-NTKERNELAPI
-ULONG
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExIsResourceAcquiredSharedLite(
-    IN PERESOURCE Resource);
-
-#define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
-
-NTKERNELAPI
-VOID
+ZwCreateEnlistment(
+  OUT PHANDLE EnlistmentHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN HANDLE ResourceManagerHandle,
+  IN HANDLE TransactionHandle,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+  IN ULONG CreateOptions OPTIONAL,
+  IN NOTIFICATION_MASK NotificationMask,
+  IN PVOID EnlistmentKey OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExLocalTimeToSystemTime(
-    IN PLARGE_INTEGER LocalTime,
-    OUT PLARGE_INTEGER SystemTime);
-
-NTKERNELAPI
-VOID
+ZwOpenEnlistment(
+  OUT PHANDLE EnlistmentHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN HANDLE RmHandle,
+  IN LPGUID EnlistmentGuid,
+  IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExNotifyCallback(
-    IN PCALLBACK_OBJECT CallbackObject,
-    IN PVOID Argument1,
-    IN PVOID Argument2);
-
-NTKERNELAPI
-VOID
+ZwQueryInformationEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
+  OUT PVOID EnlistmentInformation,
+  IN ULONG EnlistmentInformationLength,
+  IN PULONG ReturnLength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExQueueWorkItem(
-    IN PWORK_QUEUE_ITEM WorkItem,
-    IN WORK_QUEUE_TYPE QueueType);
+ZwSetInformationEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
+  IN PVOID EnlistmentInformation,
+  IN ULONG EnlistmentInformationLength);
 
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExRaiseStatus(
-    IN NTSTATUS Status);
+ZwRecoverEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PVOID EnlistmentKey OPTIONAL);
 
-NTKERNELAPI
-PVOID
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExRegisterCallback(
-    IN PCALLBACK_OBJECT CallbackObject,
-    IN PCALLBACK_FUNCTION CallbackFunction,
-    IN PVOID CallbackContext);
+ZwPrePrepareEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-NTKERNELAPI
+NTSYSCALLAPI
 NTSTATUS
 NTAPI
-ExReinitializeResourceLite(
-    IN PERESOURCE Resource);
+ZwPrepareEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-NTKERNELAPI
-VOID
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExReleaseResourceForThreadLite(
-    IN PERESOURCE Resource,
-    IN ERESOURCE_THREAD ResourceThreadId);
+ZwCommitEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExReleaseResourceLite(
-    IN PERESOURCE Resource);
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRollbackEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-NTKERNELAPI
-VOID
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExSetResourceOwnerPointer(
-    IN PERESOURCE Resource,
-    IN PVOID OwnerPointer);
+ZwPrePrepareComplete(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-NTKERNELAPI
-ULONG
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExSetTimerResolution(
-    IN ULONG DesiredTime,
-    IN BOOLEAN SetResolution);
+ZwPrepareComplete(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-NTKERNELAPI
-VOID
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExSystemTimeToLocalTime(
-    IN PLARGE_INTEGER SystemTime,
-    OUT PLARGE_INTEGER LocalTime);
+ZwCommitComplete(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-NTKERNELAPI
-VOID
+NTSYSCALLAPI
+NTSTATUS
 NTAPI
-ExUnregisterCallback(
-    IN PVOID CbRegistration);
+ZwReadOnlyEnlistment(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwRollbackComplete(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+ZwSinglePhaseReject(
+  IN HANDLE EnlistmentHandle,
+  IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
 
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-NTKERNELAPI
-BOOLEAN
-FASTCALL
-ExAcquireRundownProtection(
-    IN OUT PEX_RUNDOWN_REF RunRef);
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExInitializeRundownProtection(
-    OUT PEX_RUNDOWN_REF RunRef);
+#endif
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExReInitializeRundownProtection(
-    OUT PEX_RUNDOWN_REF RunRef);
+#if (NTDDI_VERSION >= NTDDI_WIN7)
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExReleaseRundownProtection(
-    IN OUT PEX_RUNDOWN_REF RunRef);
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenKeyEx(
+  OUT PHANDLE KeyHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN ULONG OpenOptions);
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExRundownCompleted(
-    OUT PEX_RUNDOWN_REF RunRef);
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenKeyTransactedEx(
+  OUT PHANDLE KeyHandle,
+  IN ACCESS_MASK DesiredAccess,
+  IN POBJECT_ATTRIBUTES ObjectAttributes,
+  IN ULONG OpenOptions,
+  IN HANDLE TransactionHandle);
 
-NTKERNELAPI
-BOOLEAN
+NTSYSAPI
+NTSTATUS
 NTAPI
-ExVerifySuite(
-    IN SUITE_TYPE SuiteType);
+ZwNotifyChangeMultipleKeys(
+  IN HANDLE MasterKeyHandle,
+  IN ULONG Count OPTIONAL,
+  IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
+  IN HANDLE Event OPTIONAL,
+  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+  IN PVOID ApcContext OPTIONAL,
+  OUT PIO_STATUS_BLOCK IoStatusBlock,
+  IN ULONG CompletionFilter,
+  IN BOOLEAN WatchTree,
+  OUT PVOID Buffer OPTIONAL,
+  IN ULONG BufferSize,
+  IN BOOLEAN Asynchronous);
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExWaitForRundownProtectionRelease(
-    IN OUT PEX_RUNDOWN_REF RunRef);
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryMultipleValueKey(
+  IN HANDLE KeyHandle,
+  IN OUT PKEY_VALUE_ENTRY ValueEntries,
+  IN ULONG EntryCount,
+  OUT PVOID ValueBuffer,
+  IN OUT PULONG BufferLength,
+  OUT PULONG RequiredBufferLength OPTIONAL);
 
-#endif // (NTDDI_VERSION >= NTDDI_WINXP)
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwRenameKey(
+  IN HANDLE KeyHandle,
+  IN PUNICODE_STRING NewName);
 
-#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
-NTKERNELAPI
-BOOLEAN
-FASTCALL
-ExAcquireRundownProtectionEx(
-    IN OUT PEX_RUNDOWN_REF RunRef,
-    IN ULONG Count);
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetInformationKey(
+  IN HANDLE KeyHandle,
+  IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
+  IN PVOID KeySetInformation,
+  IN ULONG KeySetInformationLength);
 
-NTKERNELAPI
-VOID
-FASTCALL
-ExReleaseRundownProtectionEx(
-    IN OUT PEX_RUNDOWN_REF RunRef,
-    IN ULONG Count);
-#endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
+#endif
 
-#if (NTDDI_VERSION >= NTDDI_WS03)
+/******************************************************************************
+ *                          Unsorted                                          *
+ ******************************************************************************/
 
-#endif // (NTDDI_VERSION >= NTDDI_WS03)
+/* GUID Comparison */
+#ifndef __IID_ALIGNED__
+#define __IID_ALIGNED__
+#ifdef __cplusplus
+inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
+{
+    return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && 
+             (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
+}
+#else
+#define IsEqualGUIDAligned(guid1, guid2) \
+           ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
+             (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
+#endif /* __cplusplus */
+#endif /* !__IID_ALIGNED__ */
 
-#if (NTDDI_VERSION >= NTDDI_WS03SP1)
-NTKERNELAPI
-PEX_RUNDOWN_REF_CACHE_AWARE
-ExAllocateCacheAwareRundownProtection(
-    IN POOL_TYPE PoolType,
-    IN ULONG PoolTag);
+typedef enum {
+    LT_DONT_CARE,
+    LT_LOWEST_LATENCY
+} LATENCY_TIME;
 
-NTKERNELAPI
-SIZE_T
-ExSizeOfRundownProtectionCacheAware(VOID);
+#define MAXIMUM_SUSPEND_COUNT             MAXCHAR
 
-#endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
+#define MAXIMUM_FILENAME_LENGTH           256
 
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-NTKERNELAPI
-NTSTATUS
-ExInitializeLookasideListEx(
-    OUT PLOOKASIDE_LIST_EX Lookaside,
-    IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
-    IN PFREE_FUNCTION_EX Free OPTIONAL,
-    IN POOL_TYPE PoolType,
-    IN ULONG Flags,
-    IN SIZE_T Size,
-    IN ULONG Tag,
-    IN USHORT Depth);
-#endif
+#define OBJ_NAME_PATH_SEPARATOR     ((WCHAR)L'\\')
 
+#define OBJECT_TYPE_CREATE (0x0001)
+#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
 
-#if !defined(MIDL_PASS)
+#define DIRECTORY_QUERY (0x0001)
+#define DIRECTORY_TRAVERSE (0x0002)
+#define DIRECTORY_CREATE_OBJECT (0x0004)
+#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
+#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
 
-static __inline PVOID
-ExAllocateFromNPagedLookasideList(
-    IN PNPAGED_LOOKASIDE_LIST Lookaside)
-{
-    PVOID Entry;
+#define EVENT_QUERY_STATE (0x0001)
+#define EVENT_MODIFY_STATE (0x0002)
+#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
 
-    Lookaside->L.TotalAllocates++;
-    Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
-    if (Entry == NULL) {
-        Lookaside->L.AllocateMisses++;
-        Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
-                                        Lookaside->L.Size,
-                                        Lookaside->L.Tag);
-    }
-    return Entry;
-}
+#define SEMAPHORE_QUERY_STATE (0x0001)
+#define SEMAPHORE_MODIFY_STATE (0x0002)
+#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
 
-static __inline PVOID
-ExAllocateFromPagedLookasideList(
-    IN PPAGED_LOOKASIDE_LIST Lookaside)
-{
-    PVOID Entry;
+#define SYMBOLIC_LINK_QUERY               0x0001
+#define SYMBOLIC_LINK_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED | 0x1)
 
-    Lookaside->L.TotalAllocates++;
-    Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
-    if (Entry == NULL) {
-        Lookaside->L.AllocateMisses++;
-        Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
-                                        Lookaside->L.Size,
-                                        Lookaside->L.Tag);
-    }
-    return Entry;
-}
+#define DUPLICATE_CLOSE_SOURCE            0x00000001
+#define DUPLICATE_SAME_ACCESS             0x00000002
+#define DUPLICATE_SAME_ATTRIBUTES         0x00000004
 
-static __inline VOID
-ExFreeToNPagedLookasideList(
-    IN PNPAGED_LOOKASIDE_LIST Lookaside,
-    IN PVOID  Entry)
-{
-    Lookaside->L.TotalFrees++;
-    if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
-        Lookaside->L.FreeMisses++;
-        (Lookaside->L.Free)(Entry);
-    } else {
-        InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
-    }
-}
+/* Global debug flag */
+extern ULONG NtGlobalFlag;
 
-static __inline VOID
-ExFreeToPagedLookasideList(
-    IN PPAGED_LOOKASIDE_LIST Lookaside,
-    IN PVOID  Entry)
-{
-    Lookaside->L.TotalFrees++;
-    if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
-        Lookaside->L.FreeMisses++;
-        (Lookaside->L.Free)(Entry);
-    } else {
-        InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
-    }
-}
+/* Service Start Types */
+#define SERVICE_BOOT_START             0x00000000
+#define SERVICE_SYSTEM_START           0x00000001
+#define SERVICE_AUTO_START             0x00000002
+#define SERVICE_DEMAND_START           0x00000003
+#define SERVICE_DISABLED               0x00000004
 
+#ifndef _TRACEHANDLE_DEFINED
+#define _TRACEHANDLE_DEFINED
+typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
+#endif
 
-#endif // !defined(MIDL_PASS)
 
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif // _WDMDDK_
\ No newline at end of file
+#endif /* !_WDMDDK_ */
diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h
deleted file mode 100644 (file)
index d3cf662..0000000
+++ /dev/null
@@ -1,10904 +0,0 @@
-/*
- * winddk.h
- *
- * Windows Device Driver Kit
- *
- * This file is part of the w32api package.
- *
- * Contributors:
- *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-#ifndef __WINDDK_H
-#define __WINDDK_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <excpt.h>
-#include <ntdef.h>
-#include <ntstatus.h>
-
-#include "intrin.h"
-
-#if !defined(_NTHAL_)
-#define NTHALAPI DECLSPEC_IMPORT
-#else
-#define NTHALAPI
-#endif
-
-/* Pseudo modifiers for parameters */
-#define IN
-#define OUT
-#define OPTIONAL
-#define UNALIGNED
-
-#define CONST const
-
-#define RESTRICTED_POINTER
-
-#if defined(_WIN64)
-#define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
-#else
-#define POINTER_ALIGNMENT
-#endif
-
-#define DECLSPEC_ADDRSAFE
-
-#ifdef NONAMELESSUNION
-# define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
-# define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
-#else
-# define _DDK_DUMMYUNION_MEMBER(name) name
-# define _DDK_DUMMYUNION_N_MEMBER(n, name) name
-#endif
-
-/*
- * Alignment Macros
- */
-#define ALIGN_DOWN(s, t) \
-    ((ULONG)(s) & ~(sizeof(t) - 1))
-
-#define ALIGN_UP(s, t) \
-    (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
-
-#define ALIGN_DOWN_POINTER(p, t) \
-    ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
-
-#define ALIGN_UP_POINTER(p, t) \
-    (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
-
-/*
- * GUID Comparison
- */
-
-#ifndef __IID_ALIGNED__
-    #define __IID_ALIGNED__
-    #ifdef __cplusplus
-        inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
-        {
-            return ((*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)));
-        }
-    #else
-        #define IsEqualGUIDAligned(guid1, guid2) \
-            ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
-    #endif 
-#endif
-
-/*
-** Forward declarations
-*/
-
-struct _IRP;
-struct _MDL;
-struct _KAPC;
-struct _KDPC;
-struct _KPCR;
-struct _KPRCB;
-struct _KTSS;
-struct _FILE_OBJECT;
-struct _DMA_ADAPTER;
-struct _DEVICE_OBJECT;
-struct _DRIVER_OBJECT;
-struct _IO_STATUS_BLOCK;
-struct _DEVICE_DESCRIPTION;
-struct _SCATTER_GATHER_LIST;
-struct _DRIVE_LAYOUT_INFORMATION;
-struct _DRIVE_LAYOUT_INFORMATION_EX;
-struct _LOADER_PARAMETER_BLOCK;
-
-typedef PVOID PSID;
-
-#if 1
-/* FIXME: Unknown definitions */
-struct _SET_PARTITION_INFORMATION_EX;
-typedef ULONG WAIT_TYPE;
-#define WaitAll 0
-#define WaitAny 1
-typedef HANDLE TRACEHANDLE;
-typedef PVOID PWMILIB_CONTEXT;
-typedef ULONG LOGICAL;
-#endif
-
-/*
-** WmiLib specific structure
-*/
-typedef enum
-{
-    IrpProcessed,    // Irp was processed and possibly completed
-    IrpNotCompleted, // Irp was process and NOT completed
-    IrpNotWmi,       // Irp is not a WMI irp
-    IrpForward       // Irp is wmi irp, but targeted at another device object
-} SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION;
-
-/*
-** Routines specific to this DDK
-*/
-#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
-
-/*
-** Simple structures
-*/
-
-typedef UCHAR KIRQL, *PKIRQL;
-
-typedef enum _MODE {
-  KernelMode,
-  UserMode,
-  MaximumMode
-} MODE;
-
-//
-// Forwarder
-//
-struct _COMPRESSED_DATA_INFO;
-
-/* Constants */
-#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
-#define ZwCurrentProcess() NtCurrentProcess()
-#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
-#define ZwCurrentThread() NtCurrentThread()
-
-#if (_M_IX86)
-#define KIP0PCRADDRESS                      0xffdff000
-    
-#endif
-
-#define KERNEL_STACK_SIZE                   12288
-#define KERNEL_LARGE_STACK_SIZE             61440
-#define KERNEL_LARGE_STACK_COMMIT           12288
-
-#define EXCEPTION_READ_FAULT    0
-#define EXCEPTION_WRITE_FAULT   1
-#define EXCEPTION_EXECUTE_FAULT 8
-
-#define DPFLTR_ERROR_LEVEL                  0
-#define DPFLTR_WARNING_LEVEL                1
-#define DPFLTR_TRACE_LEVEL                  2
-#define DPFLTR_INFO_LEVEL                   3
-#define DPFLTR_MASK                         0x80000000
-
-typedef enum _DPFLTR_TYPE
-{
-    DPFLTR_SYSTEM_ID = 0,
-    DPFLTR_SMSS_ID = 1,
-    DPFLTR_SETUP_ID = 2,
-    DPFLTR_NTFS_ID = 3,
-    DPFLTR_FSTUB_ID = 4,
-    DPFLTR_CRASHDUMP_ID = 5,
-    DPFLTR_CDAUDIO_ID = 6,
-    DPFLTR_CDROM_ID = 7,
-    DPFLTR_CLASSPNP_ID = 8,
-    DPFLTR_DISK_ID = 9,
-    DPFLTR_REDBOOK_ID = 10,
-    DPFLTR_STORPROP_ID = 11,
-    DPFLTR_SCSIPORT_ID = 12,
-    DPFLTR_SCSIMINIPORT_ID = 13,
-    DPFLTR_CONFIG_ID = 14,
-    DPFLTR_I8042PRT_ID = 15,
-    DPFLTR_SERMOUSE_ID = 16,
-    DPFLTR_LSERMOUS_ID = 17,
-    DPFLTR_KBDHID_ID = 18,
-    DPFLTR_MOUHID_ID = 19,
-    DPFLTR_KBDCLASS_ID = 20,
-    DPFLTR_MOUCLASS_ID = 21,
-    DPFLTR_TWOTRACK_ID = 22,
-    DPFLTR_WMILIB_ID = 23,
-    DPFLTR_ACPI_ID = 24,
-    DPFLTR_AMLI_ID = 25,
-    DPFLTR_HALIA64_ID = 26,
-    DPFLTR_VIDEO_ID = 27,
-    DPFLTR_SVCHOST_ID = 28,
-    DPFLTR_VIDEOPRT_ID = 29,
-    DPFLTR_TCPIP_ID = 30,
-    DPFLTR_DMSYNTH_ID = 31,
-    DPFLTR_NTOSPNP_ID = 32,
-    DPFLTR_FASTFAT_ID = 33,
-    DPFLTR_SAMSS_ID = 34,
-    DPFLTR_PNPMGR_ID = 35,
-    DPFLTR_NETAPI_ID = 36,
-    DPFLTR_SCSERVER_ID = 37,
-    DPFLTR_SCCLIENT_ID = 38,
-    DPFLTR_SERIAL_ID = 39,
-    DPFLTR_SERENUM_ID = 40,
-    DPFLTR_UHCD_ID = 41,
-    DPFLTR_BOOTOK_ID = 42,
-    DPFLTR_BOOTVRFY_ID = 43,
-    DPFLTR_RPCPROXY_ID = 44,
-    DPFLTR_AUTOCHK_ID = 45,
-    DPFLTR_DCOMSS_ID = 46,
-    DPFLTR_UNIMODEM_ID = 47,
-    DPFLTR_SIS_ID = 48,
-    DPFLTR_FLTMGR_ID = 49,
-    DPFLTR_WMICORE_ID = 50,
-    DPFLTR_BURNENG_ID = 51,
-    DPFLTR_IMAPI_ID = 52,
-    DPFLTR_SXS_ID = 53,
-    DPFLTR_FUSION_ID = 54,
-    DPFLTR_IDLETASK_ID = 55,
-    DPFLTR_SOFTPCI_ID = 56,
-    DPFLTR_TAPE_ID = 57,
-    DPFLTR_MCHGR_ID = 58,
-    DPFLTR_IDEP_ID = 59,
-    DPFLTR_PCIIDE_ID = 60,
-    DPFLTR_FLOPPY_ID = 61,
-    DPFLTR_FDC_ID = 62,
-    DPFLTR_TERMSRV_ID = 63,
-    DPFLTR_W32TIME_ID = 64,
-    DPFLTR_PREFETCHER_ID = 65,
-    DPFLTR_RSFILTER_ID = 66,
-    DPFLTR_FCPORT_ID = 67,
-    DPFLTR_PCI_ID = 68,
-    DPFLTR_DMIO_ID = 69,
-    DPFLTR_DMCONFIG_ID = 70,
-    DPFLTR_DMADMIN_ID = 71,
-    DPFLTR_WSOCKTRANSPORT_ID = 72,
-    DPFLTR_VSS_ID = 73,
-    DPFLTR_PNPMEM_ID = 74,
-    DPFLTR_PROCESSOR_ID = 75,
-    DPFLTR_DMSERVER_ID = 76,
-    DPFLTR_SR_ID = 77,
-    DPFLTR_INFINIBAND_ID = 78,
-    DPFLTR_IHVDRIVER_ID = 79,
-    DPFLTR_IHVVIDEO_ID = 80,
-    DPFLTR_IHVAUDIO_ID = 81,
-    DPFLTR_IHVNETWORK_ID = 82,
-    DPFLTR_IHVSTREAMING_ID = 83,
-    DPFLTR_IHVBUS_ID = 84,
-    DPFLTR_HPS_ID = 85,
-    DPFLTR_RTLTHREADPOOL_ID = 86,
-    DPFLTR_LDR_ID = 87,
-    DPFLTR_TCPIP6_ID = 88,
-    DPFLTR_ISAPNP_ID = 89,
-    DPFLTR_SHPC_ID = 90,
-    DPFLTR_STORPORT_ID = 91,
-    DPFLTR_STORMINIPORT_ID = 92,
-    DPFLTR_PRINTSPOOLER_ID = 93,
-    DPFLTR_VDS_ID = 94,
-    DPFLTR_VDSBAS_ID = 95,
-    DPFLTR_VDSDYNDR_ID = 96,
-    DPFLTR_VDSUTIL_ID = 97,
-    DPFLTR_DFRGIFC_ID = 98,
-    DPFLTR_DEFAULT_ID = 99,
-    DPFLTR_MM_ID = 100,
-    DPFLTR_DFSC_ID = 101,
-    DPFLTR_WOW64_ID = 102,
-    DPFLTR_ENDOFTABLE_ID
-} DPFLTR_TYPE;
-
-#define MAXIMUM_PROCESSORS                32
-
-#define MAXIMUM_WAIT_OBJECTS              64
-
-#define EX_RUNDOWN_ACTIVE                 0x1
-#define EX_RUNDOWN_COUNT_SHIFT            0x1
-#define EX_RUNDOWN_COUNT_INC              (1 << EX_RUNDOWN_COUNT_SHIFT)
-
-#define METHOD_BUFFERED                   0
-#define METHOD_IN_DIRECT                  1
-#define METHOD_OUT_DIRECT                 2
-#define METHOD_NEITHER                    3
-
-#define LOW_PRIORITY                      0
-#define LOW_REALTIME_PRIORITY             16
-#define HIGH_PRIORITY                     31
-#define MAXIMUM_PRIORITY                  32
-
-#define MAXIMUM_SUSPEND_COUNT             MAXCHAR
-
-#define MAXIMUM_FILENAME_LENGTH           256
-
-#define FILE_SUPERSEDED                   0x00000000
-#define FILE_OPENED                       0x00000001
-#define FILE_CREATED                      0x00000002
-#define FILE_OVERWRITTEN                  0x00000003
-#define FILE_EXISTS                       0x00000004
-#define FILE_DOES_NOT_EXIST               0x00000005
-
-#define FILE_USE_FILE_POINTER_POSITION    0xfffffffe
-#define FILE_WRITE_TO_END_OF_FILE         0xffffffff
-
-/* also in winnt.h */
-#define FILE_LIST_DIRECTORY               0x00000001
-#define FILE_READ_DATA                    0x00000001
-#define FILE_ADD_FILE                     0x00000002
-#define FILE_WRITE_DATA                   0x00000002
-#define FILE_ADD_SUBDIRECTORY             0x00000004
-#define FILE_APPEND_DATA                  0x00000004
-#define FILE_CREATE_PIPE_INSTANCE         0x00000004
-#define FILE_READ_EA                      0x00000008
-#define FILE_WRITE_EA                     0x00000010
-#define FILE_EXECUTE                      0x00000020
-#define FILE_TRAVERSE                     0x00000020
-#define FILE_DELETE_CHILD                 0x00000040
-#define FILE_READ_ATTRIBUTES              0x00000080
-#define FILE_WRITE_ATTRIBUTES             0x00000100
-
-#define FILE_SHARE_READ                   0x00000001
-#define FILE_SHARE_WRITE                  0x00000002
-#define FILE_SHARE_DELETE                 0x00000004
-#define FILE_SHARE_VALID_FLAGS            0x00000007
-
-#define FILE_ATTRIBUTE_READONLY           0x00000001
-#define FILE_ATTRIBUTE_HIDDEN             0x00000002
-#define FILE_ATTRIBUTE_SYSTEM             0x00000004
-#define FILE_ATTRIBUTE_DIRECTORY          0x00000010
-#define FILE_ATTRIBUTE_ARCHIVE            0x00000020
-#define FILE_ATTRIBUTE_DEVICE             0x00000040
-#define FILE_ATTRIBUTE_NORMAL             0x00000080
-#define FILE_ATTRIBUTE_TEMPORARY          0x00000100
-#define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
-#define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
-#define FILE_ATTRIBUTE_COMPRESSED         0x00000800
-#define FILE_ATTRIBUTE_OFFLINE            0x00001000
-#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
-#define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
-
-#define FILE_ATTRIBUTE_VALID_FLAGS        0x00007fb7
-#define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
-
-#define FILE_COPY_STRUCTURED_STORAGE      0x00000041
-#define FILE_STRUCTURED_STORAGE           0x00000441
-
-#define FILE_VALID_OPTION_FLAGS           0x00ffffff
-#define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
-#define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
-#define FILE_VALID_SET_FLAGS              0x00000036
-
-#define FILE_SUPERSEDE                    0x00000000
-#define FILE_OPEN                         0x00000001
-#define FILE_CREATE                       0x00000002
-#define FILE_OPEN_IF                      0x00000003
-#define FILE_OVERWRITE                    0x00000004
-#define FILE_OVERWRITE_IF                 0x00000005
-#define FILE_MAXIMUM_DISPOSITION          0x00000005
-
-#define FILE_DIRECTORY_FILE               0x00000001
-#define FILE_WRITE_THROUGH                0x00000002
-#define FILE_SEQUENTIAL_ONLY              0x00000004
-#define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
-#define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
-#define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
-#define FILE_NON_DIRECTORY_FILE           0x00000040
-#define FILE_CREATE_TREE_CONNECTION       0x00000080
-#define FILE_COMPLETE_IF_OPLOCKED         0x00000100
-#define FILE_NO_EA_KNOWLEDGE              0x00000200
-#define FILE_OPEN_FOR_RECOVERY            0x00000400
-#define FILE_RANDOM_ACCESS                0x00000800
-#define FILE_DELETE_ON_CLOSE              0x00001000
-#define FILE_OPEN_BY_FILE_ID              0x00002000
-#define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
-#define FILE_NO_COMPRESSION               0x00008000
-#define FILE_RESERVE_OPFILTER             0x00100000
-#define FILE_OPEN_REPARSE_POINT           0x00200000
-#define FILE_OPEN_NO_RECALL               0x00400000
-#define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
-
-#define FILE_ANY_ACCESS                   0x00000000
-#define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
-#define FILE_READ_ACCESS                  0x00000001
-#define FILE_WRITE_ACCESS                 0x00000002
-
-#define FILE_ALL_ACCESS \
-  (STANDARD_RIGHTS_REQUIRED | \
-   SYNCHRONIZE | \
-   0x1FF)
-
-#define FILE_GENERIC_EXECUTE \
-  (STANDARD_RIGHTS_EXECUTE | \
-   FILE_READ_ATTRIBUTES | \
-   FILE_EXECUTE | \
-   SYNCHRONIZE)
-
-#define FILE_GENERIC_READ \
-  (STANDARD_RIGHTS_READ | \
-   FILE_READ_DATA | \
-   FILE_READ_ATTRIBUTES | \
-   FILE_READ_EA | \
-   SYNCHRONIZE)
-
-#define FILE_GENERIC_WRITE \
-  (STANDARD_RIGHTS_WRITE | \
-   FILE_WRITE_DATA | \
-   FILE_WRITE_ATTRIBUTES | \
-   FILE_WRITE_EA | \
-   FILE_APPEND_DATA | \
-   SYNCHRONIZE)
-/* end winnt.h */
-
-#define OBJ_NAME_PATH_SEPARATOR     ((WCHAR)L'\\')
-
-#define OBJECT_TYPE_CREATE (0x0001)
-#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
-
-#define DIRECTORY_QUERY (0x0001)
-#define DIRECTORY_TRAVERSE (0x0002)
-#define DIRECTORY_CREATE_OBJECT (0x0004)
-#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
-#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
-
-#define EVENT_QUERY_STATE (0x0001)
-#define EVENT_MODIFY_STATE (0x0002)
-#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
-
-#define SEMAPHORE_QUERY_STATE (0x0001)
-#define SEMAPHORE_MODIFY_STATE (0x0002)
-#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
-
-#define THREAD_ALERT (0x0004)
-
-#define FM_LOCK_BIT             (0x1)
-#define FM_LOCK_BIT_V           (0x0)
-#define FM_LOCK_WAITER_WOKEN    (0x2)
-#define FM_LOCK_WAITER_INC      (0x4)
-
-/* Exported object types */
-extern POBJECT_TYPE NTSYSAPI ExDesktopObjectType;
-extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
-extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
-extern POBJECT_TYPE NTSYSAPI ExWindowStationObjectType;
-extern ULONG NTSYSAPI IoDeviceHandlerObjectSize;
-extern POBJECT_TYPE NTSYSAPI IoDeviceHandlerObjectType;
-extern POBJECT_TYPE NTSYSAPI IoDeviceObjectType;
-extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
-extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
-extern POBJECT_TYPE NTSYSAPI PsThreadType;
-extern POBJECT_TYPE NTSYSAPI LpcPortObjectType;
-extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
-extern POBJECT_TYPE NTSYSAPI PsProcessType;
-
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
-extern volatile CCHAR NTSYSAPI KeNumberProcessors;
-#else
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-extern CCHAR NTSYSAPI KeNumberProcessors;
-#else
-//extern PCCHAR KeNumberProcessors;
-extern NTSYSAPI CCHAR KeNumberProcessors; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
-#endif
-#endif
-
-#define PROCESSOR_FEATURE_MAX 64
-#define MAX_WOW64_SHARED_ENTRIES 16
-
-typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
-{
-    StandardDesign,
-    NEC98x86,
-    EndAlternatives
-} ALTERNATIVE_ARCHITECTURE_TYPE;
-
-typedef struct _KSYSTEM_TIME
-{
-    ULONG LowPart;
-    LONG High1Time;
-    LONG High2Time;
-} KSYSTEM_TIME, *PKSYSTEM_TIME;
-
-extern volatile KSYSTEM_TIME KeTickCount;
-
-#define NX_SUPPORT_POLICY_ALWAYSOFF 0
-#define NX_SUPPORT_POLICY_ALWAYSON 1
-#define NX_SUPPORT_POLICY_OPTIN 2
-#define NX_SUPPORT_POLICY_OPTOUT 3
-
-typedef struct _KUSER_SHARED_DATA
-{
-    ULONG TickCountLowDeprecated;
-    ULONG TickCountMultiplier;
-    volatile KSYSTEM_TIME InterruptTime;
-    volatile KSYSTEM_TIME SystemTime;
-    volatile KSYSTEM_TIME TimeZoneBias;
-    USHORT ImageNumberLow;
-    USHORT ImageNumberHigh;
-    WCHAR NtSystemRoot[260];
-    ULONG MaxStackTraceDepth;
-    ULONG CryptoExponent;
-    ULONG TimeZoneId;
-    ULONG LargePageMinimum;
-    ULONG Reserved2[7];
-    NT_PRODUCT_TYPE NtProductType;
-    BOOLEAN ProductTypeIsValid;
-    ULONG NtMajorVersion;
-    ULONG NtMinorVersion;
-    BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
-    ULONG Reserved1;
-    ULONG Reserved3;
-    volatile ULONG TimeSlip;
-    ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
-    LARGE_INTEGER SystemExpirationDate;
-    ULONG SuiteMask;
-    BOOLEAN KdDebuggerEnabled;
-#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
-    UCHAR NXSupportPolicy;
-#endif
-    volatile ULONG ActiveConsoleId;
-    volatile ULONG DismountCount;
-    ULONG ComPlusPackage;
-    ULONG LastSystemRITEventTickCount;
-    ULONG NumberOfPhysicalPages;
-    BOOLEAN SafeBootMode;
-    ULONG TraceLogging;
-    ULONG Fill0;
-    ULONGLONG TestRetInstruction;
-    ULONG SystemCall;
-    ULONG SystemCallReturn;
-    ULONGLONG SystemCallPad[3];
-    union {
-        volatile KSYSTEM_TIME TickCount;
-        volatile ULONG64 TickCountQuad;
-    };
-    ULONG Cookie;
-#if (NTDDI_VERSION >= NTDDI_WS03)
-    LONGLONG ConsoleSessionForegroundProcessId;
-    ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
-#endif
-#if (NTDDI_VERSION >= NTDDI_LONGHORN)
-    USHORT UserModeGlobalLogger[8];
-    ULONG HeapTracingPid[2];
-    ULONG CritSecTracingPid[2];
-    union
-    {
-        ULONG SharedDataFlags;
-        struct
-        {
-            ULONG DbgErrorPortPresent:1;
-            ULONG DbgElevationEnabled:1;
-            ULONG DbgVirtEnabled:1;
-            ULONG DbgInstallerDetectEnabled:1;
-            ULONG SpareBits:28;
-        };
-    };
-    ULONG ImageFileExecutionOptions;
-    KAFFINITY ActiveProcessorAffinity;
-#endif
-} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
-
-/*
-** IRP function codes
-*/
-
-#define IRP_MJ_CREATE                     0x00
-#define IRP_MJ_CREATE_NAMED_PIPE          0x01
-#define IRP_MJ_CLOSE                      0x02
-#define IRP_MJ_READ                       0x03
-#define IRP_MJ_WRITE                      0x04
-#define IRP_MJ_QUERY_INFORMATION          0x05
-#define IRP_MJ_SET_INFORMATION            0x06
-#define IRP_MJ_QUERY_EA                   0x07
-#define IRP_MJ_SET_EA                     0x08
-#define IRP_MJ_FLUSH_BUFFERS              0x09
-#define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
-#define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
-#define IRP_MJ_DIRECTORY_CONTROL          0x0c
-#define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
-#define IRP_MJ_DEVICE_CONTROL             0x0e
-#define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
-#define IRP_MJ_SCSI                       0x0f
-#define IRP_MJ_SHUTDOWN                   0x10
-#define IRP_MJ_LOCK_CONTROL               0x11
-#define IRP_MJ_CLEANUP                    0x12
-#define IRP_MJ_CREATE_MAILSLOT            0x13
-#define IRP_MJ_QUERY_SECURITY             0x14
-#define IRP_MJ_SET_SECURITY               0x15
-#define IRP_MJ_POWER                      0x16
-#define IRP_MJ_SYSTEM_CONTROL             0x17
-#define IRP_MJ_DEVICE_CHANGE              0x18
-#define IRP_MJ_QUERY_QUOTA                0x19
-#define IRP_MJ_SET_QUOTA                  0x1a
-#define IRP_MJ_PNP                        0x1b
-#define IRP_MJ_PNP_POWER                  0x1b
-#define IRP_MJ_MAXIMUM_FUNCTION           0x1b
-
-#define IRP_MN_QUERY_DIRECTORY            0x01
-#define IRP_MN_NOTIFY_CHANGE_DIRECTORY    0x02
-
-#define IRP_MN_USER_FS_REQUEST            0x00
-#define IRP_MN_MOUNT_VOLUME               0x01
-#define IRP_MN_VERIFY_VOLUME              0x02
-#define IRP_MN_LOAD_FILE_SYSTEM           0x03
-#define IRP_MN_TRACK_LINK                 0x04
-#define IRP_MN_KERNEL_CALL                0x04
-
-#define IRP_MN_LOCK                       0x01
-#define IRP_MN_UNLOCK_SINGLE              0x02
-#define IRP_MN_UNLOCK_ALL                 0x03
-#define IRP_MN_UNLOCK_ALL_BY_KEY          0x04
-
-#define IRP_MN_NORMAL                     0x00
-#define IRP_MN_DPC                        0x01
-#define IRP_MN_MDL                        0x02
-#define IRP_MN_COMPLETE                   0x04
-#define IRP_MN_COMPRESSED                 0x08
-
-#define IRP_MN_MDL_DPC                    (IRP_MN_MDL | IRP_MN_DPC)
-#define IRP_MN_COMPLETE_MDL               (IRP_MN_COMPLETE | IRP_MN_MDL)
-#define IRP_MN_COMPLETE_MDL_DPC           (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
-
-#define IRP_MN_SCSI_CLASS                 0x01
-
-#define IRP_MN_START_DEVICE               0x00
-#define IRP_MN_QUERY_REMOVE_DEVICE        0x01
-#define IRP_MN_REMOVE_DEVICE              0x02
-#define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
-#define IRP_MN_STOP_DEVICE                0x04
-#define IRP_MN_QUERY_STOP_DEVICE          0x05
-#define IRP_MN_CANCEL_STOP_DEVICE         0x06
-
-#define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
-#define IRP_MN_QUERY_INTERFACE              0x08
-#define IRP_MN_QUERY_CAPABILITIES           0x09
-#define IRP_MN_QUERY_RESOURCES              0x0A
-#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
-#define IRP_MN_QUERY_DEVICE_TEXT            0x0C
-#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
-
-#define IRP_MN_READ_CONFIG                  0x0F
-#define IRP_MN_WRITE_CONFIG                 0x10
-#define IRP_MN_EJECT                        0x11
-#define IRP_MN_SET_LOCK                     0x12
-#define IRP_MN_QUERY_ID                     0x13
-#define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
-#define IRP_MN_QUERY_BUS_INFORMATION        0x15
-#define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
-#define IRP_MN_SURPRISE_REMOVAL             0x17
-#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
-
-#define IRP_MN_WAIT_WAKE                  0x00
-#define IRP_MN_POWER_SEQUENCE             0x01
-#define IRP_MN_SET_POWER                  0x02
-#define IRP_MN_QUERY_POWER                0x03
-
-#define IRP_MN_QUERY_ALL_DATA             0x00
-#define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
-#define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
-#define IRP_MN_CHANGE_SINGLE_ITEM         0x03
-#define IRP_MN_ENABLE_EVENTS              0x04
-#define IRP_MN_DISABLE_EVENTS             0x05
-#define IRP_MN_ENABLE_COLLECTION          0x06
-#define IRP_MN_DISABLE_COLLECTION         0x07
-#define IRP_MN_REGINFO                    0x08
-#define IRP_MN_EXECUTE_METHOD             0x09
-
-#define IRP_MN_REGINFO_EX                 0x0b
-
-typedef enum _IO_PAGING_PRIORITY
-{
-  IoPagingPriorityInvalid,
-  IoPagingPriorityNormal,
-  IoPagingPriorityHigh,
-  IoPagingPriorityReserved1,
-  IoPagingPriorityReserved2
-} IO_PAGING_PRIORITY;
-
-typedef enum _IO_ALLOCATION_ACTION {
-  KeepObject = 1,
-  DeallocateObject,
-  DeallocateObjectKeepRegisters
-} IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
-
-typedef IO_ALLOCATION_ACTION
-(DDKAPI *PDRIVER_CONTROL)(
-  IN struct _DEVICE_OBJECT  *DeviceObject,
-  IN struct _IRP  *Irp,
-  IN PVOID  MapRegisterBase,
-  IN PVOID  Context);
-
-
-typedef EXCEPTION_DISPOSITION
-(DDKAPI *PEXCEPTION_ROUTINE)(
-  IN struct _EXCEPTION_RECORD *ExceptionRecord,
-  IN PVOID EstablisherFrame,
-  IN OUT struct _CONTEXT *ContextRecord,
-  IN OUT PVOID DispatcherContext);
-
-typedef VOID
-(DDKAPI *PDRIVER_LIST_CONTROL)(
-  IN struct _DEVICE_OBJECT  *DeviceObject,
-  IN struct _IRP  *Irp,
-  IN struct _SCATTER_GATHER_LIST  *ScatterGather,
-  IN PVOID  Context);
-
-typedef NTSTATUS
-(DDKAPI DRIVER_ADD_DEVICE)(
-  IN struct _DRIVER_OBJECT  *DriverObject,
-  IN struct _DEVICE_OBJECT  *PhysicalDeviceObject);
-typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
-
-typedef NTSTATUS
-(DDKAPI IO_COMPLETION_ROUTINE)(
-  IN struct _DEVICE_OBJECT  *DeviceObject,
-  IN struct _IRP  *Irp,
-  IN PVOID  Context);
-typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
-
-typedef VOID
-(DDKAPI DRIVER_CANCEL)(
-  IN struct _DEVICE_OBJECT  *DeviceObject,
-  IN struct _IRP  *Irp);
-typedef DRIVER_CANCEL *PDRIVER_CANCEL;
-
-typedef VOID
-(DDKAPI *PKDEFERRED_ROUTINE)(
-  IN struct _KDPC  *Dpc,
-  IN PVOID  DeferredContext,
-  IN PVOID  SystemArgument1,
-  IN PVOID  SystemArgument2);
-
-typedef NTSTATUS
-(DDKAPI DRIVER_DISPATCH)(
-  IN struct _DEVICE_OBJECT  *DeviceObject,
-  IN struct _IRP  *Irp);
-typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
-
-typedef VOID
-(DDKAPI *PIO_DPC_ROUTINE)(
-  IN struct _KDPC  *Dpc,
-  IN struct _DEVICE_OBJECT  *DeviceObject,
-  IN struct _IRP  *Irp,
-  IN PVOID  Context);
-
-typedef NTSTATUS
-(DDKAPI *PMM_DLL_INITIALIZE)(
-  IN PUNICODE_STRING  RegistryPath);
-
-typedef NTSTATUS
-(DDKAPI *PMM_DLL_UNLOAD)(
-  VOID);
-
-typedef NTSTATUS
-(DDKAPI *PDRIVER_ENTRY)(
-  IN struct _DRIVER_OBJECT  *DriverObject,
-  IN PUNICODE_STRING  RegistryPath);
-
-typedef NTSTATUS
-(DDKAPI DRIVER_INITIALIZE)(
-  IN struct _DRIVER_OBJECT  *DriverObject,
-  IN PUNICODE_STRING  RegistryPath);
-typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
-
-typedef BOOLEAN
-(DDKAPI KSERVICE_ROUTINE)(
-  IN struct _KINTERRUPT  *Interrupt,
-  IN PVOID  ServiceContext);
-typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
-
-typedef VOID
-(DDKAPI *PIO_TIMER_ROUTINE)(
-  IN struct _DEVICE_OBJECT  *DeviceObject,
-  IN PVOID  Context);
-
-typedef VOID
-(DDKAPI *PDRIVER_REINITIALIZE)(
-  IN struct _DRIVER_OBJECT  *DriverObject,
-  IN PVOID  Context,
-  IN ULONG  Count);
-
-typedef VOID
-(DDKAPI DRIVER_STARTIO)(
-  IN struct _DEVICE_OBJECT  *DeviceObject,
-  IN struct _IRP  *Irp);
-typedef DRIVER_STARTIO *PDRIVER_STARTIO;
-
-typedef BOOLEAN
-(DDKAPI *PKSYNCHRONIZE_ROUTINE)(
-  IN PVOID  SynchronizeContext);
-
-typedef VOID
-(DDKAPI DRIVER_UNLOAD)(
-  IN struct _DRIVER_OBJECT  *DriverObject);
-typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
-
-
-
-/*
-** Plug and Play structures
-*/
-
-typedef VOID
-(DDKAPI *PINTERFACE_REFERENCE)(
-  PVOID  Context);
-
-typedef VOID
-(DDKAPI *PINTERFACE_DEREFERENCE)(
-  PVOID Context);
-
-typedef BOOLEAN
-(DDKAPI *PTRANSLATE_BUS_ADDRESS)(
-  IN PVOID  Context,
-  IN PHYSICAL_ADDRESS  BusAddress,
-  IN ULONG  Length,
-  IN OUT PULONG  AddressSpace,
-  OUT PPHYSICAL_ADDRESS  TranslatedAddress);
-
-typedef struct _DMA_ADAPTER*
-(DDKAPI *PGET_DMA_ADAPTER)(
-  IN PVOID  Context,
-  IN struct _DEVICE_DESCRIPTION  *DeviceDescriptor,
-  OUT PULONG  NumberOfMapRegisters);
-
-typedef ULONG
-(DDKAPI *PGET_SET_DEVICE_DATA)(
-  IN PVOID  Context,
-  IN ULONG  DataType,
-  IN PVOID  Buffer,
-  IN ULONG  Offset,
-  IN ULONG  Length);
-
-/* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
-#define PCI_USE_SUBSYSTEM_IDS   0x00000001
-#define PCI_USE_REVISION        0x00000002
-#define PCI_USE_VENDEV_IDS      0x00000004
-#define PCI_USE_CLASS_SUBCLASS  0x00000008
-#define PCI_USE_PROGIF          0x00000010
-#define PCI_USE_LOCAL_BUS       0x00000020
-#define PCI_USE_LOCAL_DEVICE    0x00000040
-
-typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
-  ULONG   Size;
-  ULONG   Flags;
-  USHORT  VendorID;
-  USHORT  DeviceID;
-  UCHAR   RevisionID;
-  USHORT  SubVendorID;
-  USHORT  SubSystemID;
-  UCHAR   BaseClass;
-  UCHAR   SubClass;
-  UCHAR   ProgIf;
-} PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
-
-typedef BOOLEAN
-(DDKAPI *PPCI_IS_DEVICE_PRESENT)(
-  IN USHORT  VendorID,
-  IN USHORT  DeviceID,
-  IN UCHAR   RevisionID,
-  IN USHORT  SubVendorID,
-  IN USHORT  SubSystemID,
-  IN ULONG   Flags);
-
-typedef BOOLEAN
-(DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)(
-  IN PVOID Context,
-  IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
-
-typedef union _POWER_STATE {
-  SYSTEM_POWER_STATE  SystemState;
-  DEVICE_POWER_STATE  DeviceState;
-} POWER_STATE, *PPOWER_STATE;
-
-typedef enum _POWER_STATE_TYPE {
-  SystemPowerState,
-  DevicePowerState
-} POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
-
-typedef struct _BUS_INTERFACE_STANDARD {
-  USHORT  Size;
-  USHORT  Version;
-  PVOID  Context;
-  PINTERFACE_REFERENCE  InterfaceReference;
-  PINTERFACE_DEREFERENCE  InterfaceDereference;
-  PTRANSLATE_BUS_ADDRESS  TranslateBusAddress;
-  PGET_DMA_ADAPTER  GetDmaAdapter;
-  PGET_SET_DEVICE_DATA  SetBusData;
-  PGET_SET_DEVICE_DATA  GetBusData;
-} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
-
-typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
-  USHORT  Size;
-  USHORT  Version;
-  PVOID  Context;
-  PINTERFACE_REFERENCE  InterfaceReference;
-  PINTERFACE_DEREFERENCE  InterfaceDereference;
-  PPCI_IS_DEVICE_PRESENT  IsDevicePresent;
-  PPCI_IS_DEVICE_PRESENT_EX  IsDevicePresentEx;
-} PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
-
-typedef struct _DEVICE_CAPABILITIES {
-  USHORT  Size;
-  USHORT  Version;
-  ULONG  DeviceD1 : 1;
-  ULONG  DeviceD2 : 1;
-  ULONG  LockSupported : 1;
-  ULONG  EjectSupported : 1;
-  ULONG  Removable : 1;
-  ULONG  DockDevice : 1;
-  ULONG  UniqueID : 1;
-  ULONG  SilentInstall : 1;
-  ULONG  RawDeviceOK : 1;
-  ULONG  SurpriseRemovalOK : 1;
-  ULONG  WakeFromD0 : 1;
-  ULONG  WakeFromD1 : 1;
-  ULONG  WakeFromD2 : 1;
-  ULONG  WakeFromD3 : 1;
-  ULONG  HardwareDisabled : 1;
-  ULONG  NonDynamic : 1;
-  ULONG  WarmEjectSupported : 1;
-  ULONG  NoDisplayInUI : 1;
-  ULONG  Reserved : 14;
-  ULONG  Address;
-  ULONG  UINumber;
-  DEVICE_POWER_STATE  DeviceState[PowerSystemMaximum];
-  SYSTEM_POWER_STATE  SystemWake;
-  DEVICE_POWER_STATE  DeviceWake;
-  ULONG  D1Latency;
-  ULONG  D2Latency;
-  ULONG  D3Latency;
-} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
-
-typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
-  USHORT  Version;
-  USHORT  Size;
-  GUID  Event;
-  GUID  InterfaceClassGuid;
-  PUNICODE_STRING  SymbolicLinkName;
-} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
-
-typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
-  USHORT  Version;
-  USHORT  Size;
-  GUID  Event;
-} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
-
-#undef INTERFACE
-
-typedef struct _INTERFACE {
-  USHORT  Size;
-  USHORT  Version;
-  PVOID  Context;
-  PINTERFACE_REFERENCE  InterfaceReference;
-  PINTERFACE_DEREFERENCE  InterfaceDereference;
-} INTERFACE, *PINTERFACE;
-
-typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
-  USHORT  Version;
-  USHORT  Size;
-  GUID  Event;
-} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
-
-typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
-
-/* PNP_DEVICE_STATE */
-
-#define PNP_DEVICE_DISABLED                      0x00000001
-#define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
-#define PNP_DEVICE_FAILED                        0x00000004
-#define PNP_DEVICE_REMOVED                       0x00000008
-#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
-#define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
-
-typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
-  USHORT  Version;
-  USHORT  Size;
-  GUID  Event;
-  struct _FILE_OBJECT  *FileObject;
-  LONG  NameBufferOffset;
-  UCHAR  CustomDataBuffer[1];
-} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
-
-typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
-  USHORT  Version;
-  USHORT  Size;
-  GUID  Event;
-  struct _FILE_OBJECT  *FileObject;
-} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
-
-typedef enum _BUS_QUERY_ID_TYPE {
-  BusQueryDeviceID,
-  BusQueryHardwareIDs,
-  BusQueryCompatibleIDs,
-  BusQueryInstanceID,
-  BusQueryDeviceSerialNumber
-} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
-
-typedef enum _DEVICE_TEXT_TYPE {
-  DeviceTextDescription,
-  DeviceTextLocationInformation
-} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
-
-typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
-  DeviceUsageTypeUndefined,
-  DeviceUsageTypePaging,
-  DeviceUsageTypeHibernation,
-  DeviceUsageTypeDumpFile
-} DEVICE_USAGE_NOTIFICATION_TYPE;
-
-typedef struct _POWER_SEQUENCE {
-  ULONG  SequenceD1;
-  ULONG  SequenceD2;
-  ULONG  SequenceD3;
-} POWER_SEQUENCE, *PPOWER_SEQUENCE;
-
-typedef enum {
-  DevicePropertyDeviceDescription,
-  DevicePropertyHardwareID,
-  DevicePropertyCompatibleIDs,
-  DevicePropertyBootConfiguration,
-  DevicePropertyBootConfigurationTranslated,
-  DevicePropertyClassName,
-  DevicePropertyClassGuid,
-  DevicePropertyDriverKeyName,
-  DevicePropertyManufacturer,
-  DevicePropertyFriendlyName,
-  DevicePropertyLocationInformation,
-  DevicePropertyPhysicalDeviceObjectName,
-  DevicePropertyBusTypeGuid,
-  DevicePropertyLegacyBusType,
-  DevicePropertyBusNumber,
-  DevicePropertyEnumeratorName,
-  DevicePropertyAddress,
-  DevicePropertyUINumber,
-  DevicePropertyInstallState,
-  DevicePropertyRemovalPolicy
-} DEVICE_REGISTRY_PROPERTY;
-
-typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
-  EventCategoryReserved,
-  EventCategoryHardwareProfileChange,
-  EventCategoryDeviceInterfaceChange,
-  EventCategoryTargetDeviceChange
-} IO_NOTIFICATION_EVENT_CATEGORY;
-
-#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
-
-typedef NTSTATUS
-(DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
-  IN PVOID NotificationStructure,
-  IN PVOID Context);
-
-typedef VOID
-(DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)(
-  IN PVOID Context);
-
-
-/*
-** System structures
-*/
-
-#define SYMBOLIC_LINK_QUERY               0x0001
-#define SYMBOLIC_LINK_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED | 0x1)
-
-/* also in winnt,h */
-#define DUPLICATE_CLOSE_SOURCE            0x00000001
-#define DUPLICATE_SAME_ACCESS             0x00000002
-#define DUPLICATE_SAME_ATTRIBUTES         0x00000004
-/* end winnt.h */
-
-typedef struct _OBJECT_NAME_INFORMATION {
-  UNICODE_STRING  Name;
-} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
-
-typedef struct _IO_STATUS_BLOCK {
-  _ANONYMOUS_UNION union {
-    NTSTATUS  Status;
-    PVOID  Pointer;
-  } DUMMYUNIONNAME;
-  ULONG_PTR  Information;
-} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
-
-typedef VOID
-(DDKAPI *PIO_APC_ROUTINE)(
-  IN PVOID ApcContext,
-  IN PIO_STATUS_BLOCK IoStatusBlock,
-  IN ULONG Reserved);
-
-typedef VOID
-(DDKAPI *PKNORMAL_ROUTINE)(
-  IN PVOID  NormalContext,
-  IN PVOID  SystemArgument1,
-  IN PVOID  SystemArgument2);
-
-typedef VOID
-(DDKAPI *PKKERNEL_ROUTINE)(
-  IN struct _KAPC  *Apc,
-  IN OUT PKNORMAL_ROUTINE  *NormalRoutine,
-  IN OUT PVOID  *NormalContext,
-  IN OUT PVOID  *SystemArgument1,
-  IN OUT PVOID  *SystemArgument2);
-
-typedef VOID
-(DDKAPI *PKRUNDOWN_ROUTINE)(
-  IN struct _KAPC  *Apc);
-
-typedef BOOLEAN
-(DDKAPI *PKTRANSFER_ROUTINE)(
-  VOID);
-
-typedef struct _KAPC
-{
-    UCHAR Type;
-    UCHAR SpareByte0;
-    UCHAR Size;
-    UCHAR SpareByte1;
-    ULONG SpareLong0;
-    struct _KTHREAD *Thread;
-    LIST_ENTRY ApcListEntry;
-    PKKERNEL_ROUTINE KernelRoutine;
-    PKRUNDOWN_ROUTINE RundownRoutine;
-    PKNORMAL_ROUTINE NormalRoutine;
-    PVOID NormalContext;
-    PVOID SystemArgument1;
-    PVOID SystemArgument2;
-    CCHAR ApcStateIndex;
-    KPROCESSOR_MODE ApcMode;
-    BOOLEAN Inserted;
-} KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
-
-typedef struct _KDEVICE_QUEUE {
-  CSHORT  Type;
-  CSHORT  Size;
-  LIST_ENTRY  DeviceListHead;
-  KSPIN_LOCK  Lock;
-  BOOLEAN  Busy;
-} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
-
-typedef struct _KDEVICE_QUEUE_ENTRY {
-  LIST_ENTRY  DeviceListEntry;
-  ULONG  SortKey;
-  BOOLEAN  Inserted;
-} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
-*RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
-
-#define LOCK_QUEUE_WAIT                   1
-#define LOCK_QUEUE_OWNER                  2
-#define LOCK_QUEUE_TIMER_LOCK_SHIFT       4
-#define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
-
-typedef enum _KSPIN_LOCK_QUEUE_NUMBER
-{
-    LockQueueDispatcherLock,
-    LockQueueExpansionLock,
-    LockQueuePfnLock,
-    LockQueueSystemSpaceLock,
-    LockQueueVacbLock,
-    LockQueueMasterLock,
-    LockQueueNonPagedPoolLock,
-    LockQueueIoCancelLock,
-    LockQueueWorkQueueLock,
-    LockQueueIoVpbLock,
-    LockQueueIoDatabaseLock,
-    LockQueueIoCompletionLock,
-    LockQueueNtfsStructLock,
-    LockQueueAfdWorkQueueLock,
-    LockQueueBcbLock,
-    LockQueueMmNonPagedPoolLock,
-    LockQueueUnusedSpare16,
-    LockQueueTimerTableLock,
-    LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
-} KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
-
-typedef struct _KSPIN_LOCK_QUEUE {
-  struct _KSPIN_LOCK_QUEUE  *volatile Next;
-  PKSPIN_LOCK volatile  Lock;
-} KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
-
-typedef struct _KLOCK_QUEUE_HANDLE {
-  KSPIN_LOCK_QUEUE  LockQueue;
-  KIRQL  OldIrql;
-} KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
-
-#define DPC_NORMAL 0
-#define DPC_THREADED 1
-
-#define ASSERT_APC(Object) \
-    ASSERT((Object)->Type == ApcObject)
-
-#define ASSERT_DPC(Object) \
-    ASSERT(((Object)->Type == 0) || \
-           ((Object)->Type == DpcObject) || \
-           ((Object)->Type == ThreadedDpcObject))
-
-#define ASSERT_DEVICE_QUEUE(Object) \
-    ASSERT((Object)->Type == DeviceQueueObject)
-
-typedef struct _KDPC
-{
-    UCHAR Type;
-    UCHAR Importance;
-    USHORT Number;
-    LIST_ENTRY DpcListEntry;
-    PKDEFERRED_ROUTINE DeferredRoutine;
-    PVOID DeferredContext;
-    PVOID SystemArgument1;
-    PVOID SystemArgument2;
-    volatile PVOID  DpcData;
-} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
-
-typedef PVOID PKIPI_CONTEXT;
-
-typedef
-VOID
-(NTAPI *PKIPI_WORKER)(
-    IN PKIPI_CONTEXT PacketContext,
-    IN PVOID Parameter1,
-    IN PVOID Parameter2,
-    IN PVOID Parameter3
-);
-
-typedef struct _WAIT_CONTEXT_BLOCK {
-  KDEVICE_QUEUE_ENTRY  WaitQueueEntry;
-  PDRIVER_CONTROL  DeviceRoutine;
-  PVOID  DeviceContext;
-  ULONG  NumberOfMapRegisters;
-  PVOID  DeviceObject;
-  PVOID  CurrentIrp;
-  PKDPC  BufferChainingDpc;
-} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
-
-#define ASSERT_GATE(object) \
-    ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
-          (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
-
-typedef struct _KGATE
-{
-    DISPATCHER_HEADER Header;
-} KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
-
-#define GM_LOCK_BIT          0x1
-#define GM_LOCK_BIT_V        0x0
-#define GM_LOCK_WAITER_WOKEN 0x2
-#define GM_LOCK_WAITER_INC   0x4
-
-typedef struct _KGUARDED_MUTEX
-{
-    volatile LONG Count;
-    PKTHREAD Owner;
-    ULONG Contention;
-    KGATE Gate;
-    union
-    {
-        struct
-        {
-            SHORT KernelApcDisable;
-            SHORT SpecialApcDisable;
-        };
-        ULONG CombinedApcDisable;
-    };
-} KGUARDED_MUTEX, *PKGUARDED_MUTEX;
-
-#define TIMER_TABLE_SIZE 512
-#define TIMER_TABLE_SHIFT 9
-
-typedef struct _KTIMER {
-  DISPATCHER_HEADER  Header;
-  ULARGE_INTEGER  DueTime;
-  LIST_ENTRY  TimerListEntry;
-  struct _KDPC  *Dpc;
-  LONG  Period;
-} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
-
-#define ASSERT_TIMER(E) \
-    ASSERT(((E)->Header.Type == TimerNotificationObject) || \
-           ((E)->Header.Type == TimerSynchronizationObject))
-
-#define ASSERT_MUTANT(E) \
-    ASSERT((E)->Header.Type == MutantObject)
-
-#define ASSERT_SEMAPHORE(E) \
-    ASSERT((E)->Header.Type == SemaphoreObject)
-
-#define ASSERT_EVENT(E) \
-    ASSERT(((E)->Header.Type == NotificationEvent) || \
-           ((E)->Header.Type == SynchronizationEvent))
-
-typedef struct _KMUTANT {
-  DISPATCHER_HEADER  Header;
-  LIST_ENTRY  MutantListEntry;
-  struct _KTHREAD  *RESTRICTED_POINTER OwnerThread;
-  BOOLEAN  Abandoned;
-  UCHAR  ApcDisable;
-} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
-
-typedef enum _TIMER_TYPE {
-  NotificationTimer,
-  SynchronizationTimer
-} TIMER_TYPE;
-
-#define EVENT_INCREMENT                   1
-#define IO_NO_INCREMENT                   0
-#define IO_CD_ROM_INCREMENT               1
-#define IO_DISK_INCREMENT                 1
-#define IO_KEYBOARD_INCREMENT             6
-#define IO_MAILSLOT_INCREMENT             2
-#define IO_MOUSE_INCREMENT                6
-#define IO_NAMED_PIPE_INCREMENT           2
-#define IO_NETWORK_INCREMENT              2
-#define IO_PARALLEL_INCREMENT             1
-#define IO_SERIAL_INCREMENT               2
-#define IO_SOUND_INCREMENT                8
-#define IO_VIDEO_INCREMENT                1
-#define SEMAPHORE_INCREMENT               1
-
-#define MM_MAXIMUM_DISK_IO_SIZE          (0x10000)
-
-typedef struct _IRP {
-  CSHORT  Type;
-  USHORT  Size;
-  struct _MDL  *MdlAddress;
-  ULONG  Flags;
-  union {
-    struct _IRP  *MasterIrp;
-    volatile LONG  IrpCount;
-    PVOID  SystemBuffer;
-  } AssociatedIrp;
-  LIST_ENTRY  ThreadListEntry;
-  IO_STATUS_BLOCK  IoStatus;
-  KPROCESSOR_MODE  RequestorMode;
-  BOOLEAN  PendingReturned;
-  CHAR  StackCount;
-  CHAR  CurrentLocation;
-  BOOLEAN  Cancel;
-  KIRQL  CancelIrql;
-  CCHAR  ApcEnvironment;
-  UCHAR  AllocationFlags;
-  PIO_STATUS_BLOCK  UserIosb;
-  PKEVENT  UserEvent;
-  union {
-    struct {
-      PIO_APC_ROUTINE  UserApcRoutine;
-      PVOID  UserApcContext;
-    } AsynchronousParameters;
-    LARGE_INTEGER  AllocationSize;
-  } Overlay;
-  volatile PDRIVER_CANCEL  CancelRoutine;
-  PVOID  UserBuffer;
-  union {
-    struct {
-      _ANONYMOUS_UNION union {
-        KDEVICE_QUEUE_ENTRY  DeviceQueueEntry;
-        _ANONYMOUS_STRUCT struct {
-          PVOID  DriverContext[4];
-        } DUMMYSTRUCTNAME;
-      } DUMMYUNIONNAME;
-      PETHREAD  Thread;
-      PCHAR  AuxiliaryBuffer;
-      _ANONYMOUS_STRUCT struct {
-        LIST_ENTRY  ListEntry;
-        _ANONYMOUS_UNION union {
-          struct _IO_STACK_LOCATION  *CurrentStackLocation;
-          ULONG  PacketType;
-        } DUMMYUNIONNAME;
-      } DUMMYSTRUCTNAME;
-      struct _FILE_OBJECT  *OriginalFileObject;
-    } Overlay;
-    KAPC  Apc;
-    PVOID  CompletionKey;
-  } Tail;
-} IRP;
-typedef struct _IRP *PIRP;
-
-/* IRP.Flags */
-
-#define SL_FORCE_ACCESS_CHECK             0x01
-#define SL_OPEN_PAGING_FILE               0x02
-#define SL_OPEN_TARGET_DIRECTORY          0x04
-#define SL_CASE_SENSITIVE                 0x80
-
-#define SL_KEY_SPECIFIED                  0x01
-#define SL_OVERRIDE_VERIFY_VOLUME         0x02
-#define SL_WRITE_THROUGH                  0x04
-#define SL_FT_SEQUENTIAL_WRITE            0x08
-
-#define SL_FAIL_IMMEDIATELY               0x01
-#define SL_EXCLUSIVE_LOCK                 0x02
-
-#define SL_RESTART_SCAN                   0x01
-#define SL_RETURN_SINGLE_ENTRY            0x02
-#define SL_INDEX_SPECIFIED                0x04
-
-#define SL_WATCH_TREE                     0x01
-
-#define SL_ALLOW_RAW_MOUNT                0x01
-
-#define CTL_CODE(DeviceType, Function, Method, Access)( \
-  ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
-
-#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
-
-enum
-{
-   IRP_NOCACHE = 0x1,
-   IRP_PAGING_IO = 0x2,
-   IRP_MOUNT_COMPLETION = 0x2,
-   IRP_SYNCHRONOUS_API = 0x4,
-   IRP_ASSOCIATED_IRP = 0x8,
-   IRP_BUFFERED_IO = 0x10,
-   IRP_DEALLOCATE_BUFFER = 0x20,
-   IRP_INPUT_OPERATION = 0x40,
-   IRP_SYNCHRONOUS_PAGING_IO = 0x40,
-   IRP_CREATE_OPERATION = 0x80,
-   IRP_READ_OPERATION = 0x100,
-   IRP_WRITE_OPERATION = 0x200,
-   IRP_CLOSE_OPERATION = 0x400,
-   IRP_DEFER_IO_COMPLETION = 0x800,
-   IRP_OB_QUERY_NAME = 0x1000,
-   IRP_HOLD_DEVICE_QUEUE = 0x2000,
-   IRP_RETRY_IO_COMPLETION = 0x4000
-};
-
-#define IRP_QUOTA_CHARGED                 0x01
-#define IRP_ALLOCATED_MUST_SUCCEED        0x02
-#define IRP_ALLOCATED_FIXED_SIZE          0x04
-#define IRP_LOOKASIDE_ALLOCATION          0x08
-
-typedef struct _BOOTDISK_INFORMATION {
-  LONGLONG  BootPartitionOffset;
-  LONGLONG  SystemPartitionOffset;
-  ULONG  BootDeviceSignature;
-  ULONG  SystemDeviceSignature;
-} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
-
-typedef struct _BOOTDISK_INFORMATION_EX {
-  LONGLONG  BootPartitionOffset;
-  LONGLONG  SystemPartitionOffset;
-  ULONG  BootDeviceSignature;
-  ULONG  SystemDeviceSignature;
-  GUID  BootDeviceGuid;
-  GUID  SystemDeviceGuid;
-  BOOLEAN  BootDeviceIsGpt;
-  BOOLEAN  SystemDeviceIsGpt;
-} BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
-
-typedef struct _EISA_MEMORY_TYPE {
-  UCHAR  ReadWrite : 1;
-  UCHAR  Cached : 1;
-  UCHAR  Reserved0 : 1;
-  UCHAR  Type : 2;
-  UCHAR  Shared : 1;
-  UCHAR  Reserved1 : 1;
-  UCHAR  MoreEntries : 1;
-} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
-
-#include <pshpack1.h>
-typedef struct _EISA_MEMORY_CONFIGURATION {
-  EISA_MEMORY_TYPE  ConfigurationByte;
-  UCHAR  DataSize;
-  USHORT  AddressLowWord;
-  UCHAR  AddressHighByte;
-  USHORT  MemorySize;
-} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
-#include <poppack.h>
-
-typedef struct _EISA_IRQ_DESCRIPTOR {
-  UCHAR  Interrupt : 4;
-  UCHAR  Reserved : 1;
-  UCHAR  LevelTriggered : 1;
-  UCHAR  Shared : 1;
-  UCHAR  MoreEntries : 1;
-} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
-
-typedef struct _EISA_IRQ_CONFIGURATION {
-  EISA_IRQ_DESCRIPTOR  ConfigurationByte;
-  UCHAR  Reserved;
-} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
-
-typedef struct _DMA_CONFIGURATION_BYTE0 {
-  UCHAR Channel : 3;
-  UCHAR Reserved : 3;
-  UCHAR Shared : 1;
-  UCHAR MoreEntries : 1;
-} DMA_CONFIGURATION_BYTE0;
-
-typedef struct _DMA_CONFIGURATION_BYTE1 {
-  UCHAR  Reserved0 : 2;
-  UCHAR  TransferSize : 2;
-  UCHAR  Timing : 2;
-  UCHAR  Reserved1 : 2;
-} DMA_CONFIGURATION_BYTE1;
-
-typedef struct _EISA_DMA_CONFIGURATION {
-  DMA_CONFIGURATION_BYTE0  ConfigurationByte0;
-  DMA_CONFIGURATION_BYTE1  ConfigurationByte1;
-} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
-
-#include <pshpack1.h>
-typedef struct _EISA_PORT_DESCRIPTOR {
-  UCHAR  NumberPorts : 5;
-  UCHAR  Reserved : 1;
-  UCHAR  Shared : 1;
-  UCHAR  MoreEntries : 1;
-} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
-
-typedef struct _EISA_PORT_CONFIGURATION {
-  EISA_PORT_DESCRIPTOR  Configuration;
-  USHORT  PortAddress;
-} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
-#include <poppack.h>
-
-typedef struct _CM_EISA_FUNCTION_INFORMATION {
-  ULONG  CompressedId;
-  UCHAR  IdSlotFlags1;
-  UCHAR  IdSlotFlags2;
-  UCHAR  MinorRevision;
-  UCHAR  MajorRevision;
-  UCHAR  Selections[26];
-  UCHAR  FunctionFlags;
-  UCHAR  TypeString[80];
-  EISA_MEMORY_CONFIGURATION  EisaMemory[9];
-  EISA_IRQ_CONFIGURATION  EisaIrq[7];
-  EISA_DMA_CONFIGURATION  EisaDma[4];
-  EISA_PORT_CONFIGURATION  EisaPort[20];
-  UCHAR  InitializationData[60];
-} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
-
-/* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
-
-#define EISA_FUNCTION_ENABLED           0x80
-#define EISA_FREE_FORM_DATA             0x40
-#define EISA_HAS_PORT_INIT_ENTRY        0x20
-#define EISA_HAS_PORT_RANGE             0x10
-#define EISA_HAS_DMA_ENTRY              0x08
-#define EISA_HAS_IRQ_ENTRY              0x04
-#define EISA_HAS_MEMORY_ENTRY           0x02
-#define EISA_HAS_TYPE_ENTRY             0x01
-#define EISA_HAS_INFORMATION \
-  (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
-  + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
-
-typedef struct _CM_EISA_SLOT_INFORMATION {
-  UCHAR  ReturnCode;
-  UCHAR  ReturnFlags;
-  UCHAR  MajorRevision;
-  UCHAR  MinorRevision;
-  USHORT  Checksum;
-  UCHAR  NumberFunctions;
-  UCHAR  FunctionInformation;
-  ULONG  CompressedId;
-} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
-
-/* CM_EISA_SLOT_INFORMATION.ReturnCode */
-
-#define EISA_INVALID_SLOT               0x80
-#define EISA_INVALID_FUNCTION           0x81
-#define EISA_INVALID_CONFIGURATION      0x82
-#define EISA_EMPTY_SLOT                 0x83
-#define EISA_INVALID_BIOS_CALL          0x86
-
-typedef struct _CM_FLOPPY_DEVICE_DATA {
-  USHORT  Version;
-  USHORT  Revision;
-  CHAR  Size[8];
-  ULONG  MaxDensity;
-  ULONG  MountDensity;
-  UCHAR  StepRateHeadUnloadTime;
-  UCHAR  HeadLoadTime;
-  UCHAR  MotorOffTime;
-  UCHAR  SectorLengthCode;
-  UCHAR  SectorPerTrack;
-  UCHAR  ReadWriteGapLength;
-  UCHAR  DataTransferLength;
-  UCHAR  FormatGapLength;
-  UCHAR  FormatFillCharacter;
-  UCHAR  HeadSettleTime;
-  UCHAR  MotorSettleTime;
-  UCHAR  MaximumTrackValue;
-  UCHAR  DataTransferRate;
-} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
-
-typedef struct _PNP_BUS_INFORMATION {
-  GUID  BusTypeGuid;
-  INTERFACE_TYPE  LegacyBusType;
-  ULONG  BusNumber;
-} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
-
-#include <pshpack1.h>
-/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
-
-#define CmResourceTypeNull                0
-#define CmResourceTypePort                1
-#define CmResourceTypeInterrupt           2
-#define CmResourceTypeMemory              3
-#define CmResourceTypeDma                 4
-#define CmResourceTypeDeviceSpecific      5
-#define CmResourceTypeBusNumber           6
-#define CmResourceTypeMaximum             7
-#define CmResourceTypeNonArbitrated     128
-#define CmResourceTypeConfigData        128
-#define CmResourceTypeDevicePrivate     129
-#define CmResourceTypePcCardConfig      130
-#define CmResourceTypeMfCardConfig      131
-
-/* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
-
-typedef enum _CM_SHARE_DISPOSITION {
-  CmResourceShareUndetermined,
-  CmResourceShareDeviceExclusive,
-  CmResourceShareDriverExclusive,
-  CmResourceShareShared
-} CM_SHARE_DISPOSITION;
-
-/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
-
-#define CM_RESOURCE_PORT_MEMORY           0x0000
-#define CM_RESOURCE_PORT_IO               0x0001
-#define CM_RESOURCE_PORT_10_BIT_DECODE    0x0004
-#define CM_RESOURCE_PORT_12_BIT_DECODE    0x0008
-#define CM_RESOURCE_PORT_16_BIT_DECODE    0x0010
-#define CM_RESOURCE_PORT_POSITIVE_DECODE  0x0020
-#define CM_RESOURCE_PORT_PASSIVE_DECODE   0x0040
-#define CM_RESOURCE_PORT_WINDOW_DECODE    0x0080
-
-/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
-
-#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
-#define CM_RESOURCE_INTERRUPT_LATCHED         0x0001
-
-/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
-
-#define CM_RESOURCE_MEMORY_READ_WRITE     0x0000
-#define CM_RESOURCE_MEMORY_READ_ONLY      0x0001
-#define CM_RESOURCE_MEMORY_WRITE_ONLY     0x0002
-#define CM_RESOURCE_MEMORY_PREFETCHABLE   0x0004
-#define CM_RESOURCE_MEMORY_COMBINEDWRITE  0x0008
-#define CM_RESOURCE_MEMORY_24             0x0010
-#define CM_RESOURCE_MEMORY_CACHEABLE      0x0020
-
-/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
-
-#define CM_RESOURCE_DMA_8                 0x0000
-#define CM_RESOURCE_DMA_16                0x0001
-#define CM_RESOURCE_DMA_32                0x0002
-#define CM_RESOURCE_DMA_8_AND_16          0x0004
-#define CM_RESOURCE_DMA_BUS_MASTER        0x0008
-#define CM_RESOURCE_DMA_TYPE_A            0x0010
-#define CM_RESOURCE_DMA_TYPE_B            0x0020
-#define CM_RESOURCE_DMA_TYPE_F            0x0040
-
-typedef struct _CM_PARTIAL_RESOURCE_LIST {
-  USHORT  Version;
-  USHORT  Revision;
-  ULONG  Count;
-  CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
-} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
-
-typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
-  INTERFACE_TYPE  InterfaceType;
-  ULONG  BusNumber;
-  CM_PARTIAL_RESOURCE_LIST  PartialResourceList;
-} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
-
-typedef struct _CM_RESOURCE_LIST {
-  ULONG  Count;
-  CM_FULL_RESOURCE_DESCRIPTOR  List[1];
-} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
-
-typedef struct _CM_INT13_DRIVE_PARAMETER {
-  USHORT  DriveSelect;
-  ULONG  MaxCylinders;
-  USHORT  SectorsPerTrack;
-  USHORT  MaxHeads;
-  USHORT  NumberDrives;
-} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
-
-typedef struct _CM_PNP_BIOS_DEVICE_NODE
-{
-    USHORT Size;
-    UCHAR Node;
-    ULONG ProductId;
-    UCHAR DeviceType[3];
-    USHORT DeviceAttributes;
-} CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
-
-typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
-{
-    UCHAR Signature[4];
-    UCHAR Revision;
-    UCHAR Length;
-    USHORT ControlField;
-    UCHAR Checksum;
-    ULONG EventFlagAddress;
-    USHORT RealModeEntryOffset;
-    USHORT RealModeEntrySegment;
-    USHORT ProtectedModeEntryOffset;
-    ULONG ProtectedModeCodeBaseAddress;
-    ULONG OemDeviceId;
-    USHORT RealModeDataBaseAddress;
-    ULONG ProtectedModeDataBaseAddress;
-} CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
-
-#include <poppack.h>
-
-
-typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
-{
-    ULONG BytesPerSector;
-    ULONG NumberOfCylinders;
-    ULONG SectorsPerTrack;
-    ULONG NumberOfHeads;
-} CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
-
-typedef struct _CM_KEYBOARD_DEVICE_DATA {
-  USHORT  Version;
-  USHORT  Revision;
-  UCHAR  Type;
-  UCHAR  Subtype;
-  USHORT  KeyboardFlags;
-} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
-
-#define KEYBOARD_INSERT_ON                0x08
-#define KEYBOARD_CAPS_LOCK_ON             0x04
-#define KEYBOARD_NUM_LOCK_ON              0x02
-#define KEYBOARD_SCROLL_LOCK_ON           0x01
-#define KEYBOARD_ALT_KEY_DOWN             0x80
-#define KEYBOARD_CTRL_KEY_DOWN            0x40
-#define KEYBOARD_LEFT_SHIFT_DOWN          0x20
-#define KEYBOARD_RIGHT_SHIFT_DOWN         0x10
-
-typedef struct _CM_MCA_POS_DATA {
-  USHORT  AdapterId;
-  UCHAR  PosData1;
-  UCHAR  PosData2;
-  UCHAR  PosData3;
-  UCHAR  PosData4;
-} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
-
-typedef struct CM_Power_Data_s {
-  ULONG  PD_Size;
-  DEVICE_POWER_STATE  PD_MostRecentPowerState;
-  ULONG  PD_Capabilities;
-  ULONG  PD_D1Latency;
-  ULONG  PD_D2Latency;
-  ULONG  PD_D3Latency;
-  DEVICE_POWER_STATE  PD_PowerStateMapping[PowerSystemMaximum];
-} CM_POWER_DATA, *PCM_POWER_DATA;
-
-#define PDCAP_D0_SUPPORTED                0x00000001
-#define PDCAP_D1_SUPPORTED                0x00000002
-#define PDCAP_D2_SUPPORTED                0x00000004
-#define PDCAP_D3_SUPPORTED                0x00000008
-#define PDCAP_WAKE_FROM_D0_SUPPORTED      0x00000010
-#define PDCAP_WAKE_FROM_D1_SUPPORTED      0x00000020
-#define PDCAP_WAKE_FROM_D2_SUPPORTED      0x00000040
-#define PDCAP_WAKE_FROM_D3_SUPPORTED      0x00000080
-#define PDCAP_WARM_EJECT_SUPPORTED        0x00000100
-
-typedef struct _CM_SCSI_DEVICE_DATA {
-  USHORT  Version;
-  USHORT  Revision;
-  UCHAR  HostIdentifier;
-} CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
-
-typedef struct _CM_SERIAL_DEVICE_DATA {
-  USHORT  Version;
-  USHORT  Revision;
-  ULONG  BaudClock;
-} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
-
-typedef struct _IO_COUNTERS {
-    ULONGLONG  ReadOperationCount;
-    ULONGLONG  WriteOperationCount;
-    ULONGLONG  OtherOperationCount;
-    ULONGLONG ReadTransferCount;
-    ULONGLONG WriteTransferCount;
-    ULONGLONG OtherTransferCount;
-} IO_COUNTERS, *PIO_COUNTERS;
-
-typedef struct _VM_COUNTERS
-{
-    SIZE_T PeakVirtualSize;
-    SIZE_T VirtualSize;
-    ULONG PageFaultCount;
-    SIZE_T PeakWorkingSetSize;
-    SIZE_T WorkingSetSize;
-    SIZE_T QuotaPeakPagedPoolUsage;
-    SIZE_T QuotaPagedPoolUsage;
-    SIZE_T QuotaPeakNonPagedPoolUsage;
-    SIZE_T QuotaNonPagedPoolUsage;
-    SIZE_T PagefileUsage;
-    SIZE_T PeakPagefileUsage;
-} VM_COUNTERS, *PVM_COUNTERS;
-
-typedef struct _VM_COUNTERS_EX
-{
-    SIZE_T PeakVirtualSize;
-    SIZE_T VirtualSize;
-    ULONG PageFaultCount;
-    SIZE_T PeakWorkingSetSize;
-    SIZE_T WorkingSetSize;
-    SIZE_T QuotaPeakPagedPoolUsage;
-    SIZE_T QuotaPagedPoolUsage;
-    SIZE_T QuotaPeakNonPagedPoolUsage;
-    SIZE_T QuotaNonPagedPoolUsage;
-    SIZE_T PagefileUsage;
-    SIZE_T PeakPagefileUsage;
-    SIZE_T PrivateUsage;
-} VM_COUNTERS_EX, *PVM_COUNTERS_EX;
-
-typedef struct _POOLED_USAGE_AND_LIMITS
-{
-    SIZE_T PeakPagedPoolUsage;
-    SIZE_T PagedPoolUsage;
-    SIZE_T PagedPoolLimit;
-    SIZE_T PeakNonPagedPoolUsage;
-    SIZE_T NonPagedPoolUsage;
-    SIZE_T NonPagedPoolLimit;
-    SIZE_T PeakPagefileUsage;
-    SIZE_T PagefileUsage;
-    SIZE_T PagefileLimit;
-} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
-
-typedef enum _KINTERRUPT_POLARITY
-{
-    InterruptPolarityUnknown,
-    InterruptActiveHigh,
-    InterruptActiveLow
-} KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
-
-typedef struct _IO_ERROR_LOG_PACKET {
-  UCHAR  MajorFunctionCode;
-  UCHAR  RetryCount;
-  USHORT  DumpDataSize;
-  USHORT  NumberOfStrings;
-  USHORT  StringOffset;
-  USHORT  EventCategory;
-  NTSTATUS  ErrorCode;
-  ULONG  UniqueErrorValue;
-  NTSTATUS  FinalStatus;
-  ULONG  SequenceNumber;
-  ULONG  IoControlCode;
-  LARGE_INTEGER  DeviceOffset;
-  ULONG  DumpData[1];
-} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
-
-typedef struct _IO_ERROR_LOG_MESSAGE {
-  USHORT  Type;
-  USHORT  Size;
-  USHORT  DriverNameLength;
-  LARGE_INTEGER  TimeStamp;
-  ULONG  DriverNameOffset;
-  IO_ERROR_LOG_PACKET  EntryData;
-} IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
-
-#define ERROR_LOG_LIMIT_SIZE               240
-#define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
-                                            sizeof(IO_ERROR_LOG_PACKET) + \
-                                            (sizeof(WCHAR) * 40))
-#define ERROR_LOG_MESSAGE_LIMIT_SIZE                                          \
-    (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
-#define IO_ERROR_LOG_MESSAGE_LENGTH                                           \
-    ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ?           \
-        ERROR_LOG_MESSAGE_LIMIT_SIZE :                                        \
-        PORT_MAXIMUM_MESSAGE_LENGTH)
-#define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH -                 \
-                                IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
-
-typedef struct _CONTROLLER_OBJECT {
-  CSHORT  Type;
-  CSHORT  Size;
-  PVOID  ControllerExtension;
-  KDEVICE_QUEUE  DeviceWaitQueue;
-  ULONG  Spare1;
-  LARGE_INTEGER  Spare2;
-} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
-
-typedef enum _DMA_WIDTH {
-  Width8Bits,
-  Width16Bits,
-  Width32Bits,
-  MaximumDmaWidth
-} DMA_WIDTH, *PDMA_WIDTH;
-
-typedef enum _DMA_SPEED {
-  Compatible,
-  TypeA,
-  TypeB,
-  TypeC,
-  TypeF,
-  MaximumDmaSpeed
-} DMA_SPEED, *PDMA_SPEED;
-
-/* DEVICE_DESCRIPTION.Version */
-
-#define DEVICE_DESCRIPTION_VERSION        0x0000
-#define DEVICE_DESCRIPTION_VERSION1       0x0001
-#define DEVICE_DESCRIPTION_VERSION2       0x0002
-
-typedef struct _DEVICE_DESCRIPTION {
-  ULONG  Version;
-  BOOLEAN  Master;
-  BOOLEAN  ScatterGather;
-  BOOLEAN  DemandMode;
-  BOOLEAN  AutoInitialize;
-  BOOLEAN  Dma32BitAddresses;
-  BOOLEAN  IgnoreCount;
-  BOOLEAN  Reserved1;
-  BOOLEAN  Dma64BitAddresses;
-  ULONG  BusNumber;
-  ULONG  DmaChannel;
-  INTERFACE_TYPE  InterfaceType;
-  DMA_WIDTH  DmaWidth;
-  DMA_SPEED  DmaSpeed;
-  ULONG  MaximumLength;
-  ULONG  DmaPort;
-} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
-
-/* VPB.Flags */
-#define VPB_MOUNTED                       0x0001
-#define VPB_LOCKED                        0x0002
-#define VPB_PERSISTENT                    0x0004
-#define VPB_REMOVE_PENDING                0x0008
-#define VPB_RAW_MOUNT                     0x0010
-
-#define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
-
-typedef struct _VPB {
-  CSHORT  Type;
-  CSHORT  Size;
-  USHORT  Flags;
-  USHORT  VolumeLabelLength;
-  struct _DEVICE_OBJECT  *DeviceObject;
-  struct _DEVICE_OBJECT  *RealDevice;
-  ULONG  SerialNumber;
-  ULONG  ReferenceCount;
-  WCHAR  VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
-} VPB, *PVPB;
-
-/* DEVICE_OBJECT.Flags */
-
-#define DO_VERIFY_VOLUME                  0x00000002
-#define DO_BUFFERED_IO                    0x00000004
-#define DO_EXCLUSIVE                      0x00000008
-#define DO_DIRECT_IO                      0x00000010
-#define DO_MAP_IO_BUFFER                  0x00000020
-#define DO_DEVICE_HAS_NAME                0x00000040
-#define DO_DEVICE_INITIALIZING            0x00000080
-#define DO_SYSTEM_BOOT_PARTITION          0x00000100
-#define DO_LONG_TERM_REQUESTS             0x00000200
-#define DO_NEVER_LAST_DEVICE              0x00000400
-#define DO_SHUTDOWN_REGISTERED            0x00000800
-#define DO_BUS_ENUMERATED_DEVICE          0x00001000
-#define DO_POWER_PAGABLE                  0x00002000
-#define DO_POWER_INRUSH                   0x00004000
-#define DO_LOW_PRIORITY_FILESYSTEM        0x00010000
-#define DO_XIP                            0x00020000
-
-/* DEVICE_OBJECT.Characteristics */
-
-#define FILE_REMOVABLE_MEDIA            0x00000001
-#define FILE_READ_ONLY_DEVICE           0x00000002
-#define FILE_FLOPPY_DISKETTE            0x00000004
-#define FILE_WRITE_ONCE_MEDIA           0x00000008
-#define FILE_REMOTE_DEVICE              0x00000010
-#define FILE_DEVICE_IS_MOUNTED          0x00000020
-#define FILE_VIRTUAL_VOLUME             0x00000040
-#define FILE_AUTOGENERATED_DEVICE_NAME  0x00000080
-#define FILE_DEVICE_SECURE_OPEN         0x00000100
-
-/* DEVICE_OBJECT.AlignmentRequirement */
-
-#define FILE_BYTE_ALIGNMENT             0x00000000
-#define FILE_WORD_ALIGNMENT             0x00000001
-#define FILE_LONG_ALIGNMENT             0x00000003
-#define FILE_QUAD_ALIGNMENT             0x00000007
-#define FILE_OCTA_ALIGNMENT             0x0000000f
-#define FILE_32_BYTE_ALIGNMENT          0x0000001f
-#define FILE_64_BYTE_ALIGNMENT          0x0000003f
-#define FILE_128_BYTE_ALIGNMENT         0x0000007f
-#define FILE_256_BYTE_ALIGNMENT         0x000000ff
-#define FILE_512_BYTE_ALIGNMENT         0x000001ff
-
-/* DEVICE_OBJECT.DeviceType */
-
-#define DEVICE_TYPE ULONG
-
-#define FILE_DEVICE_BEEP                  0x00000001
-#define FILE_DEVICE_CD_ROM                0x00000002
-#define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
-#define FILE_DEVICE_CONTROLLER            0x00000004
-#define FILE_DEVICE_DATALINK              0x00000005
-#define FILE_DEVICE_DFS                   0x00000006
-#define FILE_DEVICE_DISK                  0x00000007
-#define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
-#define FILE_DEVICE_FILE_SYSTEM           0x00000009
-#define FILE_DEVICE_INPORT_PORT           0x0000000a
-#define FILE_DEVICE_KEYBOARD              0x0000000b
-#define FILE_DEVICE_MAILSLOT              0x0000000c
-#define FILE_DEVICE_MIDI_IN               0x0000000d
-#define FILE_DEVICE_MIDI_OUT              0x0000000e
-#define FILE_DEVICE_MOUSE                 0x0000000f
-#define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
-#define FILE_DEVICE_NAMED_PIPE            0x00000011
-#define FILE_DEVICE_NETWORK               0x00000012
-#define FILE_DEVICE_NETWORK_BROWSER       0x00000013
-#define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
-#define FILE_DEVICE_NULL                  0x00000015
-#define FILE_DEVICE_PARALLEL_PORT         0x00000016
-#define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
-#define FILE_DEVICE_PRINTER               0x00000018
-#define FILE_DEVICE_SCANNER               0x00000019
-#define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
-#define FILE_DEVICE_SERIAL_PORT           0x0000001b
-#define FILE_DEVICE_SCREEN                0x0000001c
-#define FILE_DEVICE_SOUND                 0x0000001d
-#define FILE_DEVICE_STREAMS               0x0000001e
-#define FILE_DEVICE_TAPE                  0x0000001f
-#define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
-#define FILE_DEVICE_TRANSPORT             0x00000021
-#define FILE_DEVICE_UNKNOWN               0x00000022
-#define FILE_DEVICE_VIDEO                 0x00000023
-#define FILE_DEVICE_VIRTUAL_DISK          0x00000024
-#define FILE_DEVICE_WAVE_IN               0x00000025
-#define FILE_DEVICE_WAVE_OUT              0x00000026
-#define FILE_DEVICE_8042_PORT             0x00000027
-#define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
-#define FILE_DEVICE_BATTERY               0x00000029
-#define FILE_DEVICE_BUS_EXTENDER          0x0000002a
-#define FILE_DEVICE_MODEM                 0x0000002b
-#define FILE_DEVICE_VDM                   0x0000002c
-#define FILE_DEVICE_MASS_STORAGE          0x0000002d
-#define FILE_DEVICE_SMB                   0x0000002e
-#define FILE_DEVICE_KS                    0x0000002f
-#define FILE_DEVICE_CHANGER               0x00000030
-#define FILE_DEVICE_SMARTCARD             0x00000031
-#define FILE_DEVICE_ACPI                  0x00000032
-#define FILE_DEVICE_DVD                   0x00000033
-#define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
-#define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
-#define FILE_DEVICE_DFS_VOLUME            0x00000036
-#define FILE_DEVICE_SERENUM               0x00000037
-#define FILE_DEVICE_TERMSRV               0x00000038
-#define FILE_DEVICE_KSEC                  0x00000039
-#define FILE_DEVICE_FIPS                  0x0000003a
-
-typedef struct _DEVICE_OBJECT {
-  CSHORT  Type;
-  USHORT  Size;
-  LONG  ReferenceCount;
-  struct _DRIVER_OBJECT  *DriverObject;
-  struct _DEVICE_OBJECT  *NextDevice;
-  struct _DEVICE_OBJECT  *AttachedDevice;
-  struct _IRP  *CurrentIrp;
-  PIO_TIMER  Timer;
-  ULONG  Flags;
-  ULONG  Characteristics;
-  volatile PVPB  Vpb;
-  PVOID  DeviceExtension;
-  DEVICE_TYPE  DeviceType;
-  CCHAR  StackSize;
-  union {
-    LIST_ENTRY  ListEntry;
-    WAIT_CONTEXT_BLOCK  Wcb;
-  } Queue;
-  ULONG  AlignmentRequirement;
-  KDEVICE_QUEUE  DeviceQueue;
-  KDPC  Dpc;
-  ULONG  ActiveThreadCount;
-  PSECURITY_DESCRIPTOR  SecurityDescriptor;
-  KEVENT  DeviceLock;
-  USHORT  SectorSize;
-  USHORT  Spare1;
-  struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
-  PVOID  Reserved;
-} DEVICE_OBJECT, *PDEVICE_OBJECT;
-
-typedef enum _DEVICE_RELATION_TYPE {
-  BusRelations,
-  EjectionRelations,
-  PowerRelations,
-  RemovalRelations,
-  TargetDeviceRelation,
-  SingleBusRelations
-} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
-
-typedef struct _DEVICE_RELATIONS {
-  ULONG  Count;
-  PDEVICE_OBJECT Objects[1];
-} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
-
-typedef struct _SCATTER_GATHER_ELEMENT {
-  PHYSICAL_ADDRESS  Address;
-  ULONG  Length;
-  ULONG_PTR  Reserved;
-} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
-
-typedef struct _SCATTER_GATHER_LIST {
-  ULONG  NumberOfElements;
-  ULONG_PTR  Reserved;
-  SCATTER_GATHER_ELEMENT  Elements[1];
-} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
-
-#define MDL_MAPPED_TO_SYSTEM_VA     0x0001
-#define MDL_PAGES_LOCKED            0x0002
-#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
-#define MDL_ALLOCATED_FIXED_SIZE    0x0008
-#define MDL_PARTIAL                 0x0010
-#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
-#define MDL_IO_PAGE_READ            0x0040
-#define MDL_WRITE_OPERATION         0x0080
-#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
-#define MDL_FREE_EXTRA_PTES         0x0200
-#define MDL_DESCRIBES_AWE           0x0400
-#define MDL_IO_SPACE                0x0800
-#define MDL_NETWORK_HEADER          0x1000
-#define MDL_MAPPING_CAN_FAIL        0x2000
-#define MDL_ALLOCATED_MUST_SUCCEED  0x4000
-#define MDL_INTERNAL                0x8000
-
-
-#define MDL_MAPPING_FLAGS ( \
-  MDL_MAPPED_TO_SYSTEM_VA     | \
-  MDL_PAGES_LOCKED            | \
-  MDL_SOURCE_IS_NONPAGED_POOL | \
-  MDL_PARTIAL_HAS_BEEN_MAPPED | \
-  MDL_PARENT_MAPPED_SYSTEM_VA | \
-  MDL_SYSTEM_VA               | \
-  MDL_IO_SPACE)
-
-typedef struct _DRIVER_EXTENSION {
-  struct _DRIVER_OBJECT  *DriverObject;
-  PDRIVER_ADD_DEVICE  AddDevice;
-  ULONG  Count;
-  UNICODE_STRING  ServiceKeyName;
-} DRIVER_EXTENSION, *PDRIVER_EXTENSION;
-
-#define DRVO_UNLOAD_INVOKED               0x00000001
-#define DRVO_LEGACY_DRIVER                0x00000002
-#define DRVO_BUILTIN_DRIVER               0x00000004
-#define DRVO_REINIT_REGISTERED            0x00000008
-#define DRVO_INITIALIZED                  0x00000010
-#define DRVO_BOOTREINIT_REGISTERED        0x00000020
-#define DRVO_LEGACY_RESOURCES             0x00000040
-
-typedef struct _DRIVER_OBJECT {
-  CSHORT  Type;
-  CSHORT  Size;
-  PDEVICE_OBJECT  DeviceObject;
-  ULONG  Flags;
-  PVOID  DriverStart;
-  ULONG  DriverSize;
-  PVOID  DriverSection;
-  PDRIVER_EXTENSION  DriverExtension;
-  UNICODE_STRING  DriverName;
-  PUNICODE_STRING  HardwareDatabase;
-  struct _FAST_IO_DISPATCH *FastIoDispatch;
-  PDRIVER_INITIALIZE  DriverInit;
-  PDRIVER_STARTIO  DriverStartIo;
-  PDRIVER_UNLOAD  DriverUnload;
-  PDRIVER_DISPATCH  MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
-} DRIVER_OBJECT;
-typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
-
-typedef struct _DMA_ADAPTER {
-  USHORT  Version;
-  USHORT  Size;
-  struct _DMA_OPERATIONS*  DmaOperations;
-} DMA_ADAPTER, *PDMA_ADAPTER;
-
-typedef VOID
-(DDKAPI *PPUT_DMA_ADAPTER)(
-  IN PDMA_ADAPTER  DmaAdapter);
-
-typedef PVOID
-(DDKAPI *PALLOCATE_COMMON_BUFFER)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN ULONG  Length,
-  OUT PPHYSICAL_ADDRESS  LogicalAddress,
-  IN BOOLEAN  CacheEnabled);
-
-typedef VOID
-(DDKAPI *PFREE_COMMON_BUFFER)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN ULONG  Length,
-  IN PHYSICAL_ADDRESS  LogicalAddress,
-  IN PVOID  VirtualAddress,
-  IN BOOLEAN  CacheEnabled);
-
-typedef NTSTATUS
-(DDKAPI *PALLOCATE_ADAPTER_CHANNEL)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  NumberOfMapRegisters,
-  IN PDRIVER_CONTROL  ExecutionRoutine,
-  IN PVOID  Context);
-
-typedef BOOLEAN
-(DDKAPI *PFLUSH_ADAPTER_BUFFERS)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN PMDL  Mdl,
-  IN PVOID  MapRegisterBase,
-  IN PVOID  CurrentVa,
-  IN ULONG  Length,
-  IN BOOLEAN  WriteToDevice);
-
-typedef VOID
-(DDKAPI *PFREE_ADAPTER_CHANNEL)(
-  IN PDMA_ADAPTER  DmaAdapter);
-
-typedef VOID
-(DDKAPI *PFREE_MAP_REGISTERS)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  PVOID  MapRegisterBase,
-  ULONG  NumberOfMapRegisters);
-
-typedef PHYSICAL_ADDRESS
-(DDKAPI *PMAP_TRANSFER)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN PMDL  Mdl,
-  IN PVOID  MapRegisterBase,
-  IN PVOID  CurrentVa,
-  IN OUT PULONG  Length,
-  IN BOOLEAN  WriteToDevice);
-
-typedef ULONG
-(DDKAPI *PGET_DMA_ALIGNMENT)(
-  IN PDMA_ADAPTER  DmaAdapter);
-
-typedef ULONG
-(DDKAPI *PREAD_DMA_COUNTER)(
-  IN PDMA_ADAPTER  DmaAdapter);
-
-typedef NTSTATUS
-(DDKAPI *PGET_SCATTER_GATHER_LIST)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PMDL  Mdl,
-  IN PVOID  CurrentVa,
-  IN ULONG  Length,
-  IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
-  IN PVOID  Context,
-  IN BOOLEAN  WriteToDevice);
-
-typedef VOID
-(DDKAPI *PPUT_SCATTER_GATHER_LIST)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN PSCATTER_GATHER_LIST  ScatterGather,
-  IN BOOLEAN  WriteToDevice);
-
-typedef NTSTATUS
-(DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN PMDL  Mdl  OPTIONAL,
-  IN PVOID  CurrentVa,
-  IN ULONG  Length,
-  OUT PULONG  ScatterGatherListSize,
-  OUT PULONG  pNumberOfMapRegisters  OPTIONAL);
-
-typedef NTSTATUS
-(DDKAPI *PBUILD_SCATTER_GATHER_LIST)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PMDL  Mdl,
-  IN PVOID  CurrentVa,
-  IN ULONG  Length,
-  IN PDRIVER_LIST_CONTROL  ExecutionRoutine,
-  IN PVOID  Context,
-  IN BOOLEAN  WriteToDevice,
-  IN PVOID  ScatterGatherBuffer,
-  IN ULONG  ScatterGatherLength);
-
-typedef NTSTATUS
-(DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
-  IN PDMA_ADAPTER  DmaAdapter,
-  IN PSCATTER_GATHER_LIST  ScatterGather,
-  IN PMDL  OriginalMdl,
-  OUT PMDL  *TargetMdl);
-
-typedef struct _DMA_OPERATIONS {
-  ULONG  Size;
-  PPUT_DMA_ADAPTER  PutDmaAdapter;
-  PALLOCATE_COMMON_BUFFER  AllocateCommonBuffer;
-  PFREE_COMMON_BUFFER  FreeCommonBuffer;
-  PALLOCATE_ADAPTER_CHANNEL  AllocateAdapterChannel;
-  PFLUSH_ADAPTER_BUFFERS  FlushAdapterBuffers;
-  PFREE_ADAPTER_CHANNEL  FreeAdapterChannel;
-  PFREE_MAP_REGISTERS  FreeMapRegisters;
-  PMAP_TRANSFER  MapTransfer;
-  PGET_DMA_ALIGNMENT  GetDmaAlignment;
-  PREAD_DMA_COUNTER  ReadDmaCounter;
-  PGET_SCATTER_GATHER_LIST  GetScatterGatherList;
-  PPUT_SCATTER_GATHER_LIST  PutScatterGatherList;
-  PCALCULATE_SCATTER_GATHER_LIST_SIZE  CalculateScatterGatherList;
-  PBUILD_SCATTER_GATHER_LIST  BuildScatterGatherList;
-  PBUILD_MDL_FROM_SCATTER_GATHER_LIST  BuildMdlFromScatterGatherList;
-} DMA_OPERATIONS, *PDMA_OPERATIONS;
-
-typedef enum _ARBITER_REQUEST_SOURCE {
-  ArbiterRequestUndefined = -1,
-  ArbiterRequestLegacyReported,
-  ArbiterRequestHalReported,
-  ArbiterRequestLegacyAssigned,
-  ArbiterRequestPnpDetected,
-  ArbiterRequestPnpEnumerated
-} ARBITER_REQUEST_SOURCE;
-
-typedef enum _ARBITER_RESULT {
-  ArbiterResultUndefined = -1,
-  ArbiterResultSuccess,
-  ArbiterResultExternalConflict,
-  ArbiterResultNullRequest
-} ARBITER_RESULT;
-
-typedef enum _ARBITER_ACTION {
-  ArbiterActionTestAllocation,
-  ArbiterActionRetestAllocation,
-  ArbiterActionCommitAllocation,
-  ArbiterActionRollbackAllocation,
-  ArbiterActionQueryAllocatedResources,
-  ArbiterActionWriteReservedResources,
-  ArbiterActionQueryConflict,
-  ArbiterActionQueryArbitrate,
-  ArbiterActionAddReserved,
-  ArbiterActionBootAllocation
-} ARBITER_ACTION, *PARBITER_ACTION;
-
-typedef struct _ARBITER_CONFLICT_INFO {
-  PDEVICE_OBJECT  OwningObject;
-  ULONGLONG  Start;
-  ULONGLONG  End;
-} ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
-
-typedef struct _ARBITER_PARAMETERS {
-  union {
-    struct {
-      IN OUT PLIST_ENTRY  ArbitrationList;
-      IN ULONG  AllocateFromCount;
-      IN PCM_PARTIAL_RESOURCE_DESCRIPTOR  AllocateFrom;
-    } TestAllocation;
-
-    struct {
-      IN OUT PLIST_ENTRY  ArbitrationList;
-      IN ULONG  AllocateFromCount;
-      IN PCM_PARTIAL_RESOURCE_DESCRIPTOR  AllocateFrom;
-    } RetestAllocation;
-
-    struct {
-      IN OUT PLIST_ENTRY  ArbitrationList;
-    } BootAllocation;
-
-    struct {
-      OUT PCM_PARTIAL_RESOURCE_LIST  *AllocatedResources;
-    } QueryAllocatedResources;
-
-    struct {
-      IN PDEVICE_OBJECT  PhysicalDeviceObject;
-      IN PIO_RESOURCE_DESCRIPTOR  ConflictingResource;
-      OUT PULONG  ConflictCount;
-      OUT PARBITER_CONFLICT_INFO  *Conflicts;
-    } QueryConflict;
-
-    struct {
-      IN PLIST_ENTRY  ArbitrationList;
-    } QueryArbitrate;
-
-    struct {
-      IN PDEVICE_OBJECT  ReserveDevice;
-    } AddReserved;
-  } Parameters;
-} ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
-
-#define ARBITER_FLAG_BOOT_CONFIG 0x00000001
-
-typedef struct _ARBITER_LIST_ENTRY {
-  LIST_ENTRY  ListEntry;
-  ULONG  AlternativeCount;
-  PIO_RESOURCE_DESCRIPTOR  Alternatives;
-  PDEVICE_OBJECT  PhysicalDeviceObject;
-  ARBITER_REQUEST_SOURCE  RequestSource;
-  ULONG  Flags;
-  LONG_PTR  WorkSpace;
-  INTERFACE_TYPE  InterfaceType;
-  ULONG  SlotNumber;
-  ULONG  BusNumber;
-  PCM_PARTIAL_RESOURCE_DESCRIPTOR  Assignment;
-  PIO_RESOURCE_DESCRIPTOR  SelectedAlternative;
-  ARBITER_RESULT  Result;
-} ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
-
-typedef NTSTATUS
-(DDKAPI *PARBITER_HANDLER)(
-  IN PVOID  Context,
-  IN ARBITER_ACTION  Action,
-  IN OUT PARBITER_PARAMETERS  Parameters);
-
-#define ARBITER_PARTIAL 0x00000001
-
-typedef struct _ARBITER_INTERFACE {
-  USHORT  Size;
-  USHORT  Version;
-  PVOID  Context;
-  PINTERFACE_REFERENCE  InterfaceReference;
-  PINTERFACE_DEREFERENCE  InterfaceDereference;
-  PARBITER_HANDLER  ArbiterHandler;
-  ULONG  Flags;
-} ARBITER_INTERFACE, *PARBITER_INTERFACE;
-
-typedef enum _KPROFILE_SOURCE {
-  ProfileTime,
-  ProfileAlignmentFixup,
-  ProfileTotalIssues,
-  ProfilePipelineDry,
-  ProfileLoadInstructions,
-  ProfilePipelineFrozen,
-  ProfileBranchInstructions,
-  ProfileTotalNonissues,
-  ProfileDcacheMisses,
-  ProfileIcacheMisses,
-  ProfileCacheMisses,
-  ProfileBranchMispredictions,
-  ProfileStoreInstructions,
-  ProfileFpInstructions,
-  ProfileIntegerInstructions,
-  Profile2Issue,
-  Profile3Issue,
-  Profile4Issue,
-  ProfileSpecialInstructions,
-  ProfileTotalCycles,
-  ProfileIcacheIssues,
-  ProfileDcacheAccesses,
-  ProfileMemoryBarrierCycles,
-  ProfileLoadLinkedIssues,
-  ProfileMaximum
-} KPROFILE_SOURCE;
-
-typedef enum _HAL_QUERY_INFORMATION_CLASS {
-  HalInstalledBusInformation,
-  HalProfileSourceInformation,
-  HalInformationClassUnused1,
-  HalPowerInformation,
-  HalProcessorSpeedInformation,
-  HalCallbackInformation,
-  HalMapRegisterInformation,
-  HalMcaLogInformation,
-  HalFrameBufferCachingInformation,
-  HalDisplayBiosInformation,
-  HalProcessorFeatureInformation,
-  HalNumaTopologyInterface,
-  HalErrorInformation,
-  HalCmcLogInformation,
-  HalCpeLogInformation,
-  HalQueryMcaInterface,
-  HalQueryAMLIIllegalIOPortAddresses,
-  HalQueryMaxHotPlugMemoryAddress,
-  HalPartitionIpiInterface,
-  HalPlatformInformation,
-  HalQueryProfileSourceList
-} HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
-
-typedef enum _HAL_SET_INFORMATION_CLASS {
-  HalProfileSourceInterval,
-  HalProfileSourceInterruptHandler,
-  HalMcaRegisterDriver,
-  HalKernelErrorHandler,
-  HalCmcRegisterDriver,
-  HalCpeRegisterDriver,
-  HalMcaLog,
-  HalCmcLog,
-  HalCpeLog,
-  HalGenerateCmcInterrupt
-} HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
-
-typedef struct _HAL_PROFILE_SOURCE_INTERVAL
-{
-    KPROFILE_SOURCE Source;
-    ULONG_PTR Interval;
-} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
-
-typedef struct _HAL_PROFILE_SOURCE_INFORMATION
-{
-    KPROFILE_SOURCE Source;
-    BOOLEAN Supported;
-    ULONG Interval;
-} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
-
-typedef struct _MAP_REGISTER_ENTRY
-{
-    PVOID MapRegister;
-    BOOLEAN WriteToDevice;
-} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
-
-typedef struct
-{
-    UCHAR Type;
-    BOOLEAN Valid;
-    UCHAR Reserved[2];
-    PUCHAR TranslatedAddress;
-    ULONG Length;
-} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
-
-typedef struct
-{
-    PHYSICAL_ADDRESS Start;
-    PHYSICAL_ADDRESS MaxEnd;
-    PVOID VirtualAddress;
-    ULONG Length;
-    BOOLEAN Cached;
-    BOOLEAN Aligned;
-} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
-
-typedef struct
-{
-    ULONG Bus;
-    ULONG Slot;
-    USHORT VendorID;
-    USHORT DeviceID;
-    UCHAR BaseClass;
-    UCHAR SubClass;
-    UCHAR ProgIf;
-    BOOLEAN Initialized;
-    DEBUG_DEVICE_ADDRESS BaseAddress[6];
-    DEBUG_MEMORY_REQUIREMENTS Memory;
-} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
-
-typedef enum _KD_OPTION {
-    KD_OPTION_SET_BLOCK_ENABLE,
-} KD_OPTION;
-
-/* Function Type Defintions for Dispatch Functions */
-struct _DEVICE_CONTROL_CONTEXT;
-
-typedef VOID
-(DDKAPI *PDEVICE_CONTROL_COMPLETION)(
-  IN struct _DEVICE_CONTROL_CONTEXT  *ControlContext);
-
-typedef struct _DEVICE_CONTROL_CONTEXT {
-  NTSTATUS  Status;
-  PDEVICE_HANDLER_OBJECT  DeviceHandler;
-  PDEVICE_OBJECT  DeviceObject;
-  ULONG  ControlCode;
-  PVOID  Buffer;
-  PULONG  BufferLength;
-  PVOID  Context;
-} DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT;
-
-typedef struct _PM_DISPATCH_TABLE {
-  ULONG  Signature;
-  ULONG  Version;
-  PVOID  Function[1];
-} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
-
-typedef enum _RESOURCE_TRANSLATION_DIRECTION {
-  TranslateChildToParent,
-  TranslateParentToChild
-} RESOURCE_TRANSLATION_DIRECTION;
-
-typedef NTSTATUS
-(DDKAPI *PTRANSLATE_RESOURCE_HANDLER)(
-  IN PVOID  Context,
-  IN PCM_PARTIAL_RESOURCE_DESCRIPTOR  Source,
-  IN RESOURCE_TRANSLATION_DIRECTION  Direction,
-  IN ULONG  AlternativesCount,
-  IN IO_RESOURCE_DESCRIPTOR  Alternatives[],
-  IN PDEVICE_OBJECT  PhysicalDeviceObject,
-  OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR  Target);
-
-typedef NTSTATUS
-(DDKAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
-  IN PVOID  Context,
-  IN PIO_RESOURCE_DESCRIPTOR  Source,
-  IN PDEVICE_OBJECT  PhysicalDeviceObject,
-  OUT PULONG  TargetCount,
-  OUT PIO_RESOURCE_DESCRIPTOR  *Target);
-
-typedef struct _TRANSLATOR_INTERFACE {
-  USHORT  Size;
-  USHORT  Version;
-  PVOID  Context;
-  PINTERFACE_REFERENCE  InterfaceReference;
-  PINTERFACE_DEREFERENCE  InterfaceDereference;
-  PTRANSLATE_RESOURCE_HANDLER  TranslateResources;
-  PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER  TranslateResourceRequirements;
-} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
-
-typedef NTSTATUS
-(DDKAPI *pHalDeviceControl)(
-  IN PDEVICE_HANDLER_OBJECT  DeviceHandler,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  ControlCode,
-  IN OUT PVOID  Buffer OPTIONAL,
-  IN OUT PULONG  BufferLength OPTIONAL,
-  IN PVOID  Context,
-  IN PDEVICE_CONTROL_COMPLETION  CompletionRoutine);
-
-typedef VOID
-(FASTCALL *pHalExamineMBR)(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  SectorSize,
-  IN ULONG  MBRTypeIdentifier,
-  OUT PVOID  *Buffer);
-
-typedef VOID
-(FASTCALL *pHalIoAssignDriveLetters)(
-  IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
-  IN PSTRING NtDeviceName,
-  OUT PUCHAR NtSystemPath,
-  OUT PSTRING NtSystemPathString);
-
-typedef NTSTATUS
-(FASTCALL *pHalIoReadPartitionTable)(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  SectorSize,
-  IN BOOLEAN  ReturnRecognizedPartitions,
-  OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
-
-typedef NTSTATUS
-(FASTCALL *pHalIoSetPartitionInformation)(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  SectorSize,
-  IN ULONG  PartitionNumber,
-  IN ULONG  PartitionType);
-
-typedef NTSTATUS
-(FASTCALL *pHalIoWritePartitionTable)(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  SectorSize,
-  IN ULONG  SectorsPerTrack,
-  IN ULONG  NumberOfHeads,
-  IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
-
-typedef PBUS_HANDLER
-(FASTCALL *pHalHandlerForBus)(
-  IN INTERFACE_TYPE  InterfaceType,
-  IN ULONG  BusNumber);
-
-typedef VOID
-(FASTCALL *pHalReferenceBusHandler)(
-  IN PBUS_HANDLER  BusHandler);
-
-typedef NTSTATUS
-(DDKAPI *pHalQuerySystemInformation)(
-  IN HAL_QUERY_INFORMATION_CLASS  InformationClass,
-  IN ULONG  BufferSize,
-  IN OUT PVOID  Buffer,
-  OUT PULONG  ReturnedLength);
-
-typedef NTSTATUS
-(DDKAPI *pHalSetSystemInformation)(
-  IN HAL_SET_INFORMATION_CLASS  InformationClass,
-  IN ULONG  BufferSize,
-  IN PVOID  Buffer);
-
-typedef NTSTATUS
-(DDKAPI *pHalQueryBusSlots)(
-  IN PBUS_HANDLER  BusHandler,
-  IN ULONG  BufferSize,
-  OUT PULONG  SlotNumbers,
-  OUT PULONG  ReturnedLength);
-
-typedef NTSTATUS
-(DDKAPI *pHalInitPnpDriver)(
-  VOID);
-
-typedef NTSTATUS
-(DDKAPI *pHalInitPowerManagement)(
-  IN PPM_DISPATCH_TABLE  PmDriverDispatchTable,
-  OUT PPM_DISPATCH_TABLE  *PmHalDispatchTable);
-
-typedef struct _DMA_ADAPTER*
-(DDKAPI *pHalGetDmaAdapter)(
-  IN PVOID  Context,
-  IN struct _DEVICE_DESCRIPTION  *DeviceDescriptor,
-  OUT PULONG  NumberOfMapRegisters);
-
-typedef NTSTATUS
-(DDKAPI *pHalGetInterruptTranslator)(
-  IN INTERFACE_TYPE  ParentInterfaceType,
-  IN ULONG  ParentBusNumber,
-  IN INTERFACE_TYPE  BridgeInterfaceType,
-  IN USHORT  Size,
-  IN USHORT  Version,
-  OUT PTRANSLATOR_INTERFACE  Translator,
-  OUT PULONG  BridgeBusNumber);
-
-typedef NTSTATUS
-(DDKAPI *pHalStartMirroring)(
-  VOID);
-
-typedef NTSTATUS
-(DDKAPI *pHalEndMirroring)(
-  IN ULONG  PassNumber);
-
-typedef NTSTATUS
-(DDKAPI *pHalMirrorPhysicalMemory)(
-  IN PHYSICAL_ADDRESS  PhysicalAddress,
-  IN LARGE_INTEGER  NumberOfBytes);
-
-typedef NTSTATUS
-(DDKAPI *pHalMirrorVerify)(
-  IN PHYSICAL_ADDRESS  PhysicalAddress,
-  IN LARGE_INTEGER  NumberOfBytes);
-
-typedef VOID
-(DDKAPI *pHalEndOfBoot)(
-  VOID);
-
-typedef
-BOOLEAN
-(DDKAPI *pHalTranslateBusAddress)(
-    IN INTERFACE_TYPE InterfaceType,
-    IN ULONG BusNumber,
-    IN PHYSICAL_ADDRESS BusAddress,
-    IN OUT PULONG AddressSpace,
-    OUT PPHYSICAL_ADDRESS TranslatedAddress
-);
-
-typedef
-NTSTATUS
-(DDKAPI *pHalAssignSlotResources)(
-    IN PUNICODE_STRING RegistryPath,
-    IN PUNICODE_STRING DriverClassName OPTIONAL,
-    IN PDRIVER_OBJECT DriverObject,
-    IN PDEVICE_OBJECT DeviceObject,
-    IN INTERFACE_TYPE BusType,
-    IN ULONG BusNumber,
-    IN ULONG SlotNumber,
-    IN OUT PCM_RESOURCE_LIST *AllocatedResources
-);
-
-typedef
-VOID
-(DDKAPI *pHalHaltSystem)(
-    VOID
-);
-
-typedef
-BOOLEAN
-(DDKAPI *pHalResetDisplay)(
-    VOID
-);
-
-typedef
-UCHAR
-(DDKAPI *pHalVectorToIDTEntry)(
-    ULONG Vector
-);
-
-typedef
-BOOLEAN
-(DDKAPI *pHalFindBusAddressTranslation)(
-    IN PHYSICAL_ADDRESS BusAddress,
-    IN OUT PULONG AddressSpace,
-    OUT PPHYSICAL_ADDRESS TranslatedAddress,
-    IN OUT PULONG_PTR Context,
-    IN BOOLEAN NextBus
-);
-
-typedef
-NTSTATUS
-(DDKAPI *pKdSetupPciDeviceForDebugging)(
-    IN PVOID LoaderBlock OPTIONAL,
-    IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
-);
-
-typedef
-NTSTATUS
-(DDKAPI *pKdReleasePciDeviceForDebugging)(
-    IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
-);
-
-typedef
-PVOID
-(DDKAPI *pKdGetAcpiTablePhase0)(
-    IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
-    IN ULONG Signature
-);
-
-typedef
-VOID
-(DDKAPI *pKdCheckPowerButton)(
-    VOID
-);
-
-typedef
-ULONG
-(DDKAPI *pHalGetInterruptVector)(
-    IN INTERFACE_TYPE InterfaceType,
-    IN ULONG BusNumber,
-    IN ULONG BusInterruptLevel,
-    IN ULONG BusInterruptVector,
-    OUT PKIRQL Irql,
-    OUT PKAFFINITY Affinity
-);
-
-typedef
-NTSTATUS
-(DDKAPI *pHalGetVectorInput)(
-    IN ULONG Vector,
-    IN KAFFINITY Affinity,
-    OUT PULONG Input,
-    OUT PKINTERRUPT_POLARITY Polarity
-);
-
-typedef
-PVOID
-(DDKAPI *pKdMapPhysicalMemory64)(
-    IN PHYSICAL_ADDRESS PhysicalAddress,
-    IN ULONG NumberPages
-);
-
-typedef
-VOID
-(DDKAPI *pKdUnmapVirtualAddress)(
-    IN PVOID VirtualAddress,
-    IN ULONG NumberPages
-);
-
-typedef
-ULONG
-(DDKAPI *pKdGetPciDataByOffset)(
-    IN ULONG BusNumber,
-    IN ULONG SlotNumber,
-    OUT PVOID Buffer,
-    IN ULONG Offset,
-    IN ULONG Length
-);
-
-typedef
-ULONG
-(DDKAPI *pKdSetPciDataByOffset)(
-    IN ULONG BusNumber,
-    IN ULONG SlotNumber,
-    IN PVOID Buffer,
-    IN ULONG Offset,
-    IN ULONG Length
-);
-
-typedef BOOLEAN
-(DDKAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
-  ULONG Columns, ULONG Rows);
-
-typedef struct {
-  ULONG  Version;
-  pHalQuerySystemInformation  HalQuerySystemInformation;
-  pHalSetSystemInformation  HalSetSystemInformation;
-  pHalQueryBusSlots  HalQueryBusSlots;
-  ULONG  Spare1;
-  pHalExamineMBR  HalExamineMBR;
-  pHalIoAssignDriveLetters  HalIoAssignDriveLetters;
-  pHalIoReadPartitionTable  HalIoReadPartitionTable;
-  pHalIoSetPartitionInformation  HalIoSetPartitionInformation;
-  pHalIoWritePartitionTable  HalIoWritePartitionTable;
-  pHalHandlerForBus  HalReferenceHandlerForBus;
-  pHalReferenceBusHandler  HalReferenceBusHandler;
-  pHalReferenceBusHandler  HalDereferenceBusHandler;
-  pHalInitPnpDriver  HalInitPnpDriver;
-  pHalInitPowerManagement  HalInitPowerManagement;
-  pHalGetDmaAdapter  HalGetDmaAdapter;
-  pHalGetInterruptTranslator  HalGetInterruptTranslator;
-  pHalStartMirroring  HalStartMirroring;
-  pHalEndMirroring  HalEndMirroring;
-  pHalMirrorPhysicalMemory  HalMirrorPhysicalMemory;
-  pHalEndOfBoot  HalEndOfBoot;
-  pHalMirrorVerify  HalMirrorVerify;
-} HAL_DISPATCH, *PHAL_DISPATCH;
-
-#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTHAL_)
-extern NTSYSAPI PHAL_DISPATCH HalDispatchTable;
-#define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable)
-#else
-extern __declspec(dllexport) HAL_DISPATCH HalDispatchTable;
-#define HALDISPATCH (&HalDispatchTable)
-#endif
-
-#define HAL_DISPATCH_VERSION            3
-#define HalDispatchTableVersion         HALDISPATCH->Version
-#define HalQuerySystemInformation       HALDISPATCH->HalQuerySystemInformation
-#define HalSetSystemInformation         HALDISPATCH->HalSetSystemInformation
-#define HalQueryBusSlots                HALDISPATCH->HalQueryBusSlots
-#define HalReferenceHandlerForBus       HALDISPATCH->HalReferenceHandlerForBus
-#define HalReferenceBusHandler          HALDISPATCH->HalReferenceBusHandler
-#define HalDereferenceBusHandler        HALDISPATCH->HalDereferenceBusHandler
-#define HalInitPnpDriver                HALDISPATCH->HalInitPnpDriver
-#define HalInitPowerManagement          HALDISPATCH->HalInitPowerManagement
-#define HalGetDmaAdapter                HALDISPATCH->HalGetDmaAdapter
-#define HalGetInterruptTranslator       HALDISPATCH->HalGetInterruptTranslator
-#define HalStartMirroring               HALDISPATCH->HalStartMirroring
-#define HalEndMirroring                 HALDISPATCH->HalEndMirroring
-#define HalMirrorPhysicalMemory         HALDISPATCH->HalMirrorPhysicalMemory
-#define HalEndOfBoot                    HALDISPATCH->HalEndOfBoot
-#define HalMirrorVerify                 HALDISPATCH->HalMirrorVerify
-
-typedef enum _FILE_INFORMATION_CLASS {
-  FileDirectoryInformation = 1,
-  FileFullDirectoryInformation,
-  FileBothDirectoryInformation,
-  FileBasicInformation,
-  FileStandardInformation,
-  FileInternalInformation,
-  FileEaInformation,
-  FileAccessInformation,
-  FileNameInformation,
-  FileRenameInformation,
-  FileLinkInformation,
-  FileNamesInformation,
-  FileDispositionInformation,
-  FilePositionInformation,
-  FileFullEaInformation,
-  FileModeInformation,
-  FileAlignmentInformation,
-  FileAllInformation,
-  FileAllocationInformation,
-  FileEndOfFileInformation,
-  FileAlternateNameInformation,
-  FileStreamInformation,
-  FilePipeInformation,
-  FilePipeLocalInformation,
-  FilePipeRemoteInformation,
-  FileMailslotQueryInformation,
-  FileMailslotSetInformation,
-  FileCompressionInformation,
-  FileObjectIdInformation,
-  FileCompletionInformation,
-  FileMoveClusterInformation,
-  FileQuotaInformation,
-  FileReparsePointInformation,
-  FileNetworkOpenInformation,
-  FileAttributeTagInformation,
-  FileTrackingInformation,
-  FileIdBothDirectoryInformation,
-  FileIdFullDirectoryInformation,
-  FileValidDataLengthInformation,
-  FileShortNameInformation,
-  FileMaximumInformation
-} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
-
-typedef struct _FILE_POSITION_INFORMATION {
-  LARGE_INTEGER  CurrentByteOffset;
-} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
-
-typedef struct _FILE_ALIGNMENT_INFORMATION {
-  ULONG  AlignmentRequirement;
-} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
-
-typedef struct _FILE_NAME_INFORMATION {
-  ULONG  FileNameLength;
-  WCHAR  FileName[1];
-} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
-
-#include <pshpack8.h>
-typedef struct _FILE_BASIC_INFORMATION {
-  LARGE_INTEGER  CreationTime;
-  LARGE_INTEGER  LastAccessTime;
-  LARGE_INTEGER  LastWriteTime;
-  LARGE_INTEGER  ChangeTime;
-  ULONG  FileAttributes;
-} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
-#include <poppack.h>
-
-typedef struct _FILE_STANDARD_INFORMATION {
-  LARGE_INTEGER  AllocationSize;
-  LARGE_INTEGER  EndOfFile;
-  ULONG  NumberOfLinks;
-  BOOLEAN  DeletePending;
-  BOOLEAN  Directory;
-} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
-
-typedef struct _FILE_NETWORK_OPEN_INFORMATION {
-  LARGE_INTEGER  CreationTime;
-  LARGE_INTEGER  LastAccessTime;
-  LARGE_INTEGER  LastWriteTime;
-  LARGE_INTEGER  ChangeTime;
-  LARGE_INTEGER  AllocationSize;
-  LARGE_INTEGER  EndOfFile;
-  ULONG  FileAttributes;
-} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
-
-typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
-  ULONG  FileAttributes;
-  ULONG  ReparseTag;
-} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
-
-typedef struct _FILE_DISPOSITION_INFORMATION {
-  BOOLEAN  DeleteFile;
-} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
-
-typedef struct _FILE_END_OF_FILE_INFORMATION {
-  LARGE_INTEGER  EndOfFile;
-} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
-
-typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
-  LARGE_INTEGER  ValidDataLength;
-} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
-
-typedef union _FILE_SEGMENT_ELEMENT {
-    PVOID64 Buffer;
-    ULONGLONG Alignment;
-}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
-
-typedef enum _FSINFOCLASS {
-  FileFsVolumeInformation = 1,
-  FileFsLabelInformation,
-  FileFsSizeInformation,
-  FileFsDeviceInformation,
-  FileFsAttributeInformation,
-  FileFsControlInformation,
-  FileFsFullSizeInformation,
-  FileFsObjectIdInformation,
-  FileFsDriverPathInformation,
-  FileFsMaximumInformation
-} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
-
-typedef struct _FILE_FS_DEVICE_INFORMATION {
-  DEVICE_TYPE  DeviceType;
-  ULONG  Characteristics;
-} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
-
-typedef struct _FILE_FULL_EA_INFORMATION {
-  ULONG  NextEntryOffset;
-  UCHAR  Flags;
-  UCHAR  EaNameLength;
-  USHORT  EaValueLength;
-  CHAR  EaName[1];
-} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
-
-/* ERESOURCE.Flag */
-
-#define ResourceNeverExclusive            0x0010
-#define ResourceReleaseByOtherThread      0x0020
-#define ResourceOwnedExclusive            0x0080
-
-#define RESOURCE_HASH_TABLE_SIZE          64
-
-typedef struct _DEVOBJ_EXTENSION
-{
-    CSHORT Type;
-    USHORT Size;
-    PDEVICE_OBJECT DeviceObject;
-} DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN ULONG  Length,
-  IN BOOLEAN  Wait,
-  IN ULONG  LockKey,
-  IN BOOLEAN  CheckForReadOperation,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_READ)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN ULONG  Length,
-  IN BOOLEAN  Wait,
-  IN ULONG  LockKey,
-  OUT PVOID  Buffer,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_WRITE)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN ULONG  Length,
-  IN BOOLEAN  Wait,
-  IN ULONG  LockKey,
-  IN PVOID  Buffer,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_QUERY_BASIC_INFO)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN BOOLEAN  Wait,
-  OUT PFILE_BASIC_INFORMATION  Buffer,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN BOOLEAN  Wait,
-  OUT PFILE_STANDARD_INFORMATION  Buffer,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_LOCK)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN PLARGE_INTEGER  Length,
-  PEPROCESS  ProcessId,
-  ULONG  Key,
-  BOOLEAN  FailImmediately,
-  BOOLEAN  ExclusiveLock,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_UNLOCK_SINGLE)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN PLARGE_INTEGER  Length,
-  PEPROCESS  ProcessId,
-  ULONG  Key,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_UNLOCK_ALL)(
-  IN struct _FILE_OBJECT  *FileObject,
-  PEPROCESS  ProcessId,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
-  IN struct _FILE_OBJECT  *FileObject,
-  PVOID  ProcessId,
-  ULONG  Key,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_DEVICE_CONTROL)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN BOOLEAN  Wait,
-  IN PVOID  InputBuffer  OPTIONAL,
-  IN ULONG  InputBufferLength,
-  OUT PVOID  OutputBuffer  OPTIONAL,
-  IN ULONG  OutputBufferLength,
-  IN ULONG  IoControlCode,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef VOID
-(DDKAPI *PFAST_IO_ACQUIRE_FILE)(
-  IN struct _FILE_OBJECT  *FileObject);
-
-typedef VOID
-(DDKAPI *PFAST_IO_RELEASE_FILE)(
-  IN struct _FILE_OBJECT  *FileObject);
-
-typedef VOID
-(DDKAPI *PFAST_IO_DETACH_DEVICE)(
-  IN struct _DEVICE_OBJECT  *SourceDevice,
-  IN struct _DEVICE_OBJECT  *TargetDevice);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN BOOLEAN  Wait,
-  OUT struct _FILE_NETWORK_OPEN_INFORMATION  *Buffer,
-  OUT struct _IO_STATUS_BLOCK  *IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef NTSTATUS
-(DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  EndingOffset,
-  OUT struct _ERESOURCE  **ResourceToRelease,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_MDL_READ)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN ULONG  Length,
-  IN ULONG  LockKey,
-  OUT PMDL  *MdlChain,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_MDL_READ_COMPLETE)(
-  IN struct _FILE_OBJECT *FileObject,
-  IN PMDL MdlChain,
-  IN struct _DEVICE_OBJECT *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN ULONG  Length,
-  IN ULONG  LockKey,
-  OUT PMDL  *MdlChain,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN PMDL  MdlChain,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_READ_COMPRESSED)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN ULONG  Length,
-  IN ULONG  LockKey,
-  OUT PVOID  Buffer,
-  OUT PMDL  *MdlChain,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  OUT struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
-  IN ULONG  CompressedDataInfoLength,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_WRITE_COMPRESSED)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN ULONG  Length,
-  IN ULONG  LockKey,
-  IN PVOID  Buffer,
-  OUT PMDL  *MdlChain,
-  OUT PIO_STATUS_BLOCK  IoStatus,
-  IN struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
-  IN ULONG  CompressedDataInfoLength,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PMDL  MdlChain,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN PLARGE_INTEGER  FileOffset,
-  IN PMDL  MdlChain,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef BOOLEAN
-(DDKAPI *PFAST_IO_QUERY_OPEN)(
-  IN struct _IRP  *Irp,
-  OUT PFILE_NETWORK_OPEN_INFORMATION  NetworkInformation,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef NTSTATUS
-(DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN struct _ERESOURCE  *ResourceToRelease,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef NTSTATUS
-(DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
-  IN struct _FILE_OBJECT  *FileObject,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef NTSTATUS
-(DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
-  IN struct _FILE_OBJECT  *FileObject,
-  IN struct _DEVICE_OBJECT  *DeviceObject);
-
-typedef struct _FAST_IO_DISPATCH {
-  ULONG  SizeOfFastIoDispatch;
-  PFAST_IO_CHECK_IF_POSSIBLE  FastIoCheckIfPossible;
-  PFAST_IO_READ  FastIoRead;
-  PFAST_IO_WRITE  FastIoWrite;
-  PFAST_IO_QUERY_BASIC_INFO  FastIoQueryBasicInfo;
-  PFAST_IO_QUERY_STANDARD_INFO  FastIoQueryStandardInfo;
-  PFAST_IO_LOCK  FastIoLock;
-  PFAST_IO_UNLOCK_SINGLE  FastIoUnlockSingle;
-  PFAST_IO_UNLOCK_ALL  FastIoUnlockAll;
-  PFAST_IO_UNLOCK_ALL_BY_KEY  FastIoUnlockAllByKey;
-  PFAST_IO_DEVICE_CONTROL  FastIoDeviceControl;
-  PFAST_IO_ACQUIRE_FILE  AcquireFileForNtCreateSection;
-  PFAST_IO_RELEASE_FILE  ReleaseFileForNtCreateSection;
-  PFAST_IO_DETACH_DEVICE  FastIoDetachDevice;
-  PFAST_IO_QUERY_NETWORK_OPEN_INFO  FastIoQueryNetworkOpenInfo;
-  PFAST_IO_ACQUIRE_FOR_MOD_WRITE  AcquireForModWrite;
-  PFAST_IO_MDL_READ  MdlRead;
-  PFAST_IO_MDL_READ_COMPLETE  MdlReadComplete;
-  PFAST_IO_PREPARE_MDL_WRITE  PrepareMdlWrite;
-  PFAST_IO_MDL_WRITE_COMPLETE  MdlWriteComplete;
-  PFAST_IO_READ_COMPRESSED  FastIoReadCompressed;
-  PFAST_IO_WRITE_COMPRESSED  FastIoWriteCompressed;
-  PFAST_IO_MDL_READ_COMPLETE_COMPRESSED  MdlReadCompleteCompressed;
-  PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED  MdlWriteCompleteCompressed;
-  PFAST_IO_QUERY_OPEN  FastIoQueryOpen;
-  PFAST_IO_RELEASE_FOR_MOD_WRITE  ReleaseForModWrite;
-  PFAST_IO_ACQUIRE_FOR_CCFLUSH  AcquireForCcFlush;
-  PFAST_IO_RELEASE_FOR_CCFLUSH  ReleaseForCcFlush;
-} FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
-
-typedef struct _SECTION_OBJECT_POINTERS {
-  PVOID  DataSectionObject;
-  PVOID  SharedCacheMap;
-  PVOID  ImageSectionObject;
-} SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
-
-typedef struct _IO_COMPLETION_CONTEXT {
-  PVOID  Port;
-  PVOID  Key;
-} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
-
-/* FILE_OBJECT.Flags */
-
-#define FO_FILE_OPEN                      0x00000001
-#define FO_SYNCHRONOUS_IO                 0x00000002
-#define FO_ALERTABLE_IO                   0x00000004
-#define FO_NO_INTERMEDIATE_BUFFERING      0x00000008
-#define FO_WRITE_THROUGH                  0x00000010
-#define FO_SEQUENTIAL_ONLY                0x00000020
-#define FO_CACHE_SUPPORTED                0x00000040
-#define FO_NAMED_PIPE                     0x00000080
-#define FO_STREAM_FILE                    0x00000100
-#define FO_MAILSLOT                       0x00000200
-#define FO_GENERATE_AUDIT_ON_CLOSE        0x00000400
-#define FO_DIRECT_DEVICE_OPEN             0x00000800
-#define FO_FILE_MODIFIED                  0x00001000
-#define FO_FILE_SIZE_CHANGED              0x00002000
-#define FO_CLEANUP_COMPLETE               0x00004000
-#define FO_TEMPORARY_FILE                 0x00008000
-#define FO_DELETE_ON_CLOSE                0x00010000
-#define FO_OPENED_CASE_SENSITIVE          0x00020000
-#define FO_HANDLE_CREATED                 0x00040000
-#define FO_FILE_FAST_IO_READ              0x00080000
-#define FO_RANDOM_ACCESS                  0x00100000
-#define FO_FILE_OPEN_CANCELLED            0x00200000
-#define FO_VOLUME_OPEN                    0x00400000
-#define FO_REMOTE_ORIGIN                  0x01000000
-
-typedef struct _FILE_OBJECT
-{
-    CSHORT Type;
-    CSHORT Size;
-    PDEVICE_OBJECT DeviceObject;
-    PVPB Vpb;
-    PVOID FsContext;
-    PVOID FsContext2;
-    PSECTION_OBJECT_POINTERS SectionObjectPointer;
-    PVOID PrivateCacheMap;
-    NTSTATUS FinalStatus;
-    struct _FILE_OBJECT *RelatedFileObject;
-    BOOLEAN LockOperation;
-    BOOLEAN DeletePending;
-    BOOLEAN ReadAccess;
-    BOOLEAN WriteAccess;
-    BOOLEAN DeleteAccess;
-    BOOLEAN SharedRead;
-    BOOLEAN SharedWrite;
-    BOOLEAN SharedDelete;
-    ULONG Flags;
-    UNICODE_STRING FileName;
-    LARGE_INTEGER CurrentByteOffset;
-    volatile ULONG Waiters;
-    volatile ULONG Busy;
-    PVOID LastLock;
-    KEVENT Lock;
-    KEVENT Event;
-    volatile PIO_COMPLETION_CONTEXT CompletionContext;
-    KSPIN_LOCK IrpListLock;
-    LIST_ENTRY IrpList;
-    volatile PVOID FileObjectExtension;
-} FILE_OBJECT;
-typedef struct _FILE_OBJECT *PFILE_OBJECT;
-
-typedef enum _SECURITY_OPERATION_CODE {
-  SetSecurityDescriptor,
-  QuerySecurityDescriptor,
-  DeleteSecurityDescriptor,
-  AssignSecurityDescriptor
-} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
-
-#define INITIAL_PRIVILEGE_COUNT           3
-
-typedef struct _INITIAL_PRIVILEGE_SET {
-  ULONG  PrivilegeCount;
-  ULONG  Control;
-  LUID_AND_ATTRIBUTES  Privilege[INITIAL_PRIVILEGE_COUNT];
-} INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
-
-#define SE_MIN_WELL_KNOWN_PRIVILEGE       2
-#define SE_CREATE_TOKEN_PRIVILEGE         2
-#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE   3
-#define SE_LOCK_MEMORY_PRIVILEGE          4
-#define SE_INCREASE_QUOTA_PRIVILEGE       5
-#define SE_UNSOLICITED_INPUT_PRIVILEGE    6
-#define SE_MACHINE_ACCOUNT_PRIVILEGE      6
-#define SE_TCB_PRIVILEGE                  7
-#define SE_SECURITY_PRIVILEGE             8
-#define SE_TAKE_OWNERSHIP_PRIVILEGE       9
-#define SE_LOAD_DRIVER_PRIVILEGE          10
-#define SE_SYSTEM_PROFILE_PRIVILEGE       11
-#define SE_SYSTEMTIME_PRIVILEGE           12
-#define SE_PROF_SINGLE_PROCESS_PRIVILEGE  13
-#define SE_INC_BASE_PRIORITY_PRIVILEGE    14
-#define SE_CREATE_PAGEFILE_PRIVILEGE      15
-#define SE_CREATE_PERMANENT_PRIVILEGE     16
-#define SE_BACKUP_PRIVILEGE               17
-#define SE_RESTORE_PRIVILEGE              18
-#define SE_SHUTDOWN_PRIVILEGE             19
-#define SE_DEBUG_PRIVILEGE                20
-#define SE_AUDIT_PRIVILEGE                21
-#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE   22
-#define SE_CHANGE_NOTIFY_PRIVILEGE        23
-#define SE_REMOTE_SHUTDOWN_PRIVILEGE      24
-#define SE_UNDOCK_PRIVILEGE               25
-#define SE_SYNC_AGENT_PRIVILEGE           26
-#define SE_ENABLE_DELEGATION_PRIVILEGE    27
-#define SE_MANAGE_VOLUME_PRIVILEGE        28
-#define SE_IMPERSONATE_PRIVILEGE          29
-#define SE_CREATE_GLOBAL_PRIVILEGE        30
-#define SE_MAX_WELL_KNOWN_PRIVILEGE       SE_CREATE_GLOBAL_PRIVILEGE
-
-typedef struct _SECURITY_SUBJECT_CONTEXT {
-  PACCESS_TOKEN  ClientToken;
-  SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
-  PACCESS_TOKEN  PrimaryToken;
-  PVOID  ProcessAuditId;
-} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
-
-#include <pshpack4.h>
-typedef struct _ACCESS_STATE {
-  LUID  OperationID;
-  BOOLEAN  SecurityEvaluated;
-  BOOLEAN  GenerateAudit;
-  BOOLEAN  GenerateOnClose;
-  BOOLEAN  PrivilegesAllocated;
-  ULONG  Flags;
-  ACCESS_MASK  RemainingDesiredAccess;
-  ACCESS_MASK  PreviouslyGrantedAccess;
-  ACCESS_MASK  OriginalDesiredAccess;
-  SECURITY_SUBJECT_CONTEXT  SubjectSecurityContext;
-  PSECURITY_DESCRIPTOR  SecurityDescriptor;
-  PVOID  AuxData;
-  union {
-    INITIAL_PRIVILEGE_SET  InitialPrivilegeSet;
-    PRIVILEGE_SET  PrivilegeSet;
-  } Privileges;
-
-  BOOLEAN  AuditPrivileges;
-  UNICODE_STRING  ObjectName;
-  UNICODE_STRING  ObjectTypeName;
-} ACCESS_STATE, *PACCESS_STATE;
-#include <poppack.h>
-
-typedef struct _IO_SECURITY_CONTEXT {
-  PSECURITY_QUALITY_OF_SERVICE  SecurityQos;
-  PACCESS_STATE  AccessState;
-  ACCESS_MASK  DesiredAccess;
-  ULONG  FullCreateOptions;
-} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
-
-#define IO_TYPE_ADAPTER                 1
-#define IO_TYPE_CONTROLLER              2
-#define IO_TYPE_DEVICE                  3
-#define IO_TYPE_DRIVER                  4
-#define IO_TYPE_FILE                    5
-#define IO_TYPE_IRP                     6
-#define IO_TYPE_MASTER_ADAPTER          7
-#define IO_TYPE_OPEN_PACKET             8
-#define IO_TYPE_TIMER                   9
-#define IO_TYPE_VPB                     10
-#define IO_TYPE_ERROR_LOG               11
-#define IO_TYPE_ERROR_MESSAGE           12
-#define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
-
-#define IO_TYPE_CSQ_IRP_CONTEXT 1
-#define IO_TYPE_CSQ 2
-
-struct _IO_CSQ;
-
-typedef struct _IO_CSQ_IRP_CONTEXT {
-  ULONG  Type;
-  struct _IRP  *Irp;
-  struct _IO_CSQ  *Csq;
-} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
-
-typedef VOID
-(DDKAPI *PIO_CSQ_INSERT_IRP)(
-  IN struct _IO_CSQ  *Csq,
-  IN PIRP  Irp);
-
-typedef VOID
-(DDKAPI *PIO_CSQ_REMOVE_IRP)(
-  IN struct _IO_CSQ  *Csq,
-  IN PIRP  Irp);
-
-typedef PIRP
-(DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
-  IN struct _IO_CSQ  *Csq,
-  IN PIRP  Irp,
-  IN PVOID  PeekContext);
-
-typedef VOID
-(DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
-  IN  struct _IO_CSQ  *Csq,
-  OUT PKIRQL  Irql);
-
-typedef VOID
-(DDKAPI *PIO_CSQ_RELEASE_LOCK)(
-  IN struct _IO_CSQ  *Csq,
-  IN KIRQL  Irql);
-
-typedef VOID
-(DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
-  IN  struct _IO_CSQ  *Csq,
-  IN  PIRP  Irp);
-
-typedef struct _IO_CSQ {
-  ULONG  Type;
-  PIO_CSQ_INSERT_IRP  CsqInsertIrp;
-  PIO_CSQ_REMOVE_IRP  CsqRemoveIrp;
-  PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp;
-  PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock;
-  PIO_CSQ_RELEASE_LOCK  CsqReleaseLock;
-  PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp;
-  PVOID  ReservePointer;
-} IO_CSQ, *PIO_CSQ;
-
-#if !defined(_ALPHA_)
-#include <pshpack4.h>
-#endif
-typedef struct _IO_STACK_LOCATION {
-  UCHAR  MajorFunction;
-  UCHAR  MinorFunction;
-  UCHAR  Flags;
-  UCHAR  Control;
-  union {
-    struct {
-      PIO_SECURITY_CONTEXT  SecurityContext;
-      ULONG  Options;
-      USHORT POINTER_ALIGNMENT  FileAttributes;
-      USHORT  ShareAccess;
-      ULONG POINTER_ALIGNMENT  EaLength;
-    } Create;
-    struct {
-      ULONG  Length;
-      ULONG POINTER_ALIGNMENT  Key;
-      LARGE_INTEGER  ByteOffset;
-    } Read;
-    struct {
-      ULONG  Length;
-      ULONG POINTER_ALIGNMENT  Key;
-      LARGE_INTEGER  ByteOffset;
-    } Write;
-    struct {
-      ULONG  Length;
-      PUNICODE_STRING  FileName;
-      FILE_INFORMATION_CLASS  FileInformationClass;
-      ULONG  FileIndex;
-    } QueryDirectory;
-    struct {
-      ULONG  Length;
-      ULONG  CompletionFilter;
-    } NotifyDirectory;
-    struct {
-      ULONG  Length;
-      FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
-    } QueryFile;
-    struct {
-      ULONG  Length;
-      FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
-      PFILE_OBJECT  FileObject;
-      _ANONYMOUS_UNION union {
-        _ANONYMOUS_STRUCT struct {
-          BOOLEAN  ReplaceIfExists;
-          BOOLEAN  AdvanceOnly;
-        } DUMMYSTRUCTNAME;
-        ULONG  ClusterCount;
-        HANDLE  DeleteHandle;
-      } DUMMYUNIONNAME;
-    } SetFile;
-    struct {
-      ULONG  Length;
-      PVOID  EaList;
-      ULONG  EaListLength;
-      ULONG  EaIndex;
-    } QueryEa;
-    struct {
-      ULONG  Length;
-    } SetEa;
-    struct {
-      ULONG  Length;
-      FS_INFORMATION_CLASS POINTER_ALIGNMENT  FsInformationClass;
-    } QueryVolume;
-    struct {
-      ULONG  Length;
-      FS_INFORMATION_CLASS  FsInformationClass;
-    } SetVolume;
-    struct {
-      ULONG  OutputBufferLength;
-      ULONG  InputBufferLength;
-      ULONG  FsControlCode;
-      PVOID  Type3InputBuffer;
-    } FileSystemControl;
-    struct {
-      PLARGE_INTEGER  Length;
-      ULONG  Key;
-      LARGE_INTEGER  ByteOffset;
-    } LockControl;
-    struct {
-      ULONG  OutputBufferLength;
-      ULONG POINTER_ALIGNMENT  InputBufferLength;
-      ULONG POINTER_ALIGNMENT  IoControlCode;
-      PVOID  Type3InputBuffer;
-    } DeviceIoControl;
-    struct {
-      SECURITY_INFORMATION  SecurityInformation;
-      ULONG POINTER_ALIGNMENT  Length;
-    } QuerySecurity;
-    struct {
-      SECURITY_INFORMATION  SecurityInformation;
-      PSECURITY_DESCRIPTOR  SecurityDescriptor;
-    } SetSecurity;
-    struct {
-      PVPB  Vpb;
-      PDEVICE_OBJECT  DeviceObject;
-    } MountVolume;
-    struct {
-      PVPB  Vpb;
-      PDEVICE_OBJECT  DeviceObject;
-    } VerifyVolume;
-    struct {
-      struct _SCSI_REQUEST_BLOCK  *Srb;
-    } Scsi;
-    struct {
-      ULONG  Length;
-      PSID  StartSid;
-      struct _FILE_GET_QUOTA_INFORMATION  *SidList;
-      ULONG  SidListLength;
-    } QueryQuota;
-    struct {
-      ULONG  Length;
-    } SetQuota;
-    struct {
-      DEVICE_RELATION_TYPE  Type;
-    } QueryDeviceRelations;
-    struct {
-      CONST GUID  *InterfaceType;
-      USHORT  Size;
-      USHORT  Version;
-      PINTERFACE  Interface;
-      PVOID  InterfaceSpecificData;
-    } QueryInterface;
-    struct {
-      PDEVICE_CAPABILITIES  Capabilities;
-    } DeviceCapabilities;
-    struct {
-      PIO_RESOURCE_REQUIREMENTS_LIST  IoResourceRequirementList;
-    } FilterResourceRequirements;
-    struct {
-      ULONG  WhichSpace;
-      PVOID  Buffer;
-      ULONG  Offset;
-      ULONG POINTER_ALIGNMENT  Length;
-    } ReadWriteConfig;
-    struct {
-      BOOLEAN  Lock;
-    } SetLock;
-    struct {
-      BUS_QUERY_ID_TYPE  IdType;
-    } QueryId;
-    struct {
-      DEVICE_TEXT_TYPE  DeviceTextType;
-      LCID POINTER_ALIGNMENT  LocaleId;
-    } QueryDeviceText;
-    struct {
-      BOOLEAN  InPath;
-      BOOLEAN  Reserved[3];
-      DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT  Type;
-    } UsageNotification;
-    struct {
-      SYSTEM_POWER_STATE  PowerState;
-    } WaitWake;
-    struct {
-      PPOWER_SEQUENCE  PowerSequence;
-    } PowerSequence;
-    struct {
-      ULONG  SystemContext;
-      POWER_STATE_TYPE POINTER_ALIGNMENT  Type;
-      POWER_STATE POINTER_ALIGNMENT  State;
-      POWER_ACTION POINTER_ALIGNMENT  ShutdownType;
-    } Power;
-    struct {
-      PCM_RESOURCE_LIST  AllocatedResources;
-      PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
-    } StartDevice;
-    struct {
-      ULONG_PTR  ProviderId;
-      PVOID  DataPath;
-      ULONG  BufferSize;
-      PVOID  Buffer;
-    } WMI;
-    struct {
-      PVOID  Argument1;
-      PVOID  Argument2;
-      PVOID  Argument3;
-      PVOID  Argument4;
-    } Others;
-  } Parameters;
-  PDEVICE_OBJECT  DeviceObject;
-  PFILE_OBJECT  FileObject;
-  PIO_COMPLETION_ROUTINE  CompletionRoutine;
-  PVOID  Context;
-} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
-#if !defined(_ALPHA_)
-#include <poppack.h>
-#endif
-
-/* IO_STACK_LOCATION.Control */
-
-#define SL_PENDING_RETURNED               0x01
-#define SL_ERROR_RETURNED                 0x02
-#define SL_INVOKE_ON_CANCEL               0x20
-#define SL_INVOKE_ON_SUCCESS              0x40
-#define SL_INVOKE_ON_ERROR                0x80
-
-/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
-
-#define PCI_WHICHSPACE_CONFIG             0x0
-#define PCI_WHICHSPACE_ROM                0x52696350 /* 'PciR' */
-
-typedef enum _KEY_INFORMATION_CLASS {
-  KeyBasicInformation,
-  KeyNodeInformation,
-  KeyFullInformation,
-  KeyNameInformation,
-  KeyCachedInformation,
-  KeyFlagsInformation
-} KEY_INFORMATION_CLASS;
-
-typedef struct _KEY_BASIC_INFORMATION {
-  LARGE_INTEGER  LastWriteTime;
-  ULONG  TitleIndex;
-  ULONG  NameLength;
-  WCHAR  Name[1];
-} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
-
-typedef struct _KEY_FULL_INFORMATION {
-  LARGE_INTEGER  LastWriteTime;
-  ULONG  TitleIndex;
-  ULONG  ClassOffset;
-  ULONG  ClassLength;
-  ULONG  SubKeys;
-  ULONG  MaxNameLen;
-  ULONG  MaxClassLen;
-  ULONG  Values;
-  ULONG  MaxValueNameLen;
-  ULONG  MaxValueDataLen;
-  WCHAR  Class[1];
-} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
-
-typedef struct _KEY_NODE_INFORMATION {
-  LARGE_INTEGER  LastWriteTime;
-  ULONG  TitleIndex;
-  ULONG  ClassOffset;
-  ULONG  ClassLength;
-  ULONG  NameLength;
-  WCHAR  Name[1];
-} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
-
-typedef struct _KEY_VALUE_BASIC_INFORMATION {
-  ULONG  TitleIndex;
-  ULONG  Type;
-  ULONG  NameLength;
-  WCHAR  Name[1];
-} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
-
-typedef struct _KEY_VALUE_FULL_INFORMATION {
-  ULONG  TitleIndex;
-  ULONG  Type;
-  ULONG  DataOffset;
-  ULONG  DataLength;
-  ULONG  NameLength;
-  WCHAR  Name[1];
-} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
-
-typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
-  ULONG  TitleIndex;
-  ULONG  Type;
-  ULONG  DataLength;
-  UCHAR  Data[1];
-} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
-
-typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
-  ULONG  Type;
-  ULONG  DataLength;
-  UCHAR  Data[1];
-} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
-
-typedef struct _KEY_VALUE_ENTRY {
-  PUNICODE_STRING  ValueName;
-  ULONG  DataLength;
-  ULONG  DataOffset;
-  ULONG  Type;
-} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
-
-typedef enum _KEY_VALUE_INFORMATION_CLASS {
-  KeyValueBasicInformation,
-  KeyValueFullInformation,
-  KeyValuePartialInformation,
-  KeyValueFullInformationAlign64,
-  KeyValuePartialInformationAlign64
-} KEY_VALUE_INFORMATION_CLASS;
-
-typedef struct _KEY_WRITE_TIME_INFORMATION {
-  LARGE_INTEGER  LastWriteTime;
-} KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
-
-typedef struct _KEY_USER_FLAGS_INFORMATION {
-  ULONG  UserFlags;
-} KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
-
-typedef enum _KEY_SET_INFORMATION_CLASS {
-  KeyWriteTimeInformation,
-  KeyUserFlagsInformation,
-  MaxKeySetInfoClass
-} KEY_SET_INFORMATION_CLASS;
-
-/* KEY_VALUE_Xxx.Type */
-
-#define REG_NONE                           0
-#define REG_SZ                             1
-#define REG_EXPAND_SZ                      2
-#define REG_BINARY                         3
-#define REG_DWORD                          4
-#define REG_DWORD_LITTLE_ENDIAN            4
-#define REG_DWORD_BIG_ENDIAN               5
-#define REG_LINK                           6
-#define REG_MULTI_SZ                       7
-#define REG_RESOURCE_LIST                  8
-#define REG_FULL_RESOURCE_DESCRIPTOR       9
-#define REG_RESOURCE_REQUIREMENTS_LIST    10
-#define REG_QWORD                         11
-#define REG_QWORD_LITTLE_ENDIAN           11
-
-#define PCI_TYPE0_ADDRESSES               6
-#define PCI_TYPE1_ADDRESSES               2
-#define PCI_TYPE2_ADDRESSES               5
-
-typedef struct _PCI_COMMON_CONFIG {
-  USHORT  VendorID;
-  USHORT  DeviceID;
-  USHORT  Command;
-  USHORT  Status;
-  UCHAR  RevisionID;
-  UCHAR  ProgIf;
-  UCHAR  SubClass;
-  UCHAR  BaseClass;
-  UCHAR  CacheLineSize;
-  UCHAR  LatencyTimer;
-  UCHAR  HeaderType;
-  UCHAR  BIST;
-  union {
-    struct _PCI_HEADER_TYPE_0 {
-      ULONG  BaseAddresses[PCI_TYPE0_ADDRESSES];
-      ULONG  CIS;
-      USHORT  SubVendorID;
-      USHORT  SubSystemID;
-      ULONG  ROMBaseAddress;
-      UCHAR  CapabilitiesPtr;
-      UCHAR  Reserved1[3];
-      ULONG  Reserved2;
-      UCHAR  InterruptLine;
-      UCHAR  InterruptPin;
-      UCHAR  MinimumGrant;
-      UCHAR  MaximumLatency;
-    } type0;
-    struct _PCI_HEADER_TYPE_1 {
-      ULONG  BaseAddresses[PCI_TYPE1_ADDRESSES];
-      UCHAR  PrimaryBus;
-      UCHAR  SecondaryBus;
-      UCHAR  SubordinateBus;
-      UCHAR  SecondaryLatency;
-      UCHAR  IOBase;
-      UCHAR  IOLimit;
-      USHORT  SecondaryStatus;
-      USHORT  MemoryBase;
-      USHORT  MemoryLimit;
-      USHORT  PrefetchBase;
-      USHORT  PrefetchLimit;
-      ULONG  PrefetchBaseUpper32;
-      ULONG  PrefetchLimitUpper32;
-      USHORT  IOBaseUpper16;
-      USHORT  IOLimitUpper16;
-      UCHAR  CapabilitiesPtr;
-      UCHAR  Reserved1[3];
-      ULONG  ROMBaseAddress;
-      UCHAR  InterruptLine;
-      UCHAR  InterruptPin;
-      USHORT  BridgeControl;
-    } type1;
-    struct _PCI_HEADER_TYPE_2 {
-      ULONG  SocketRegistersBaseAddress;
-      UCHAR  CapabilitiesPtr;
-      UCHAR  Reserved;
-      USHORT  SecondaryStatus;
-      UCHAR  PrimaryBus;
-      UCHAR  SecondaryBus;
-      UCHAR  SubordinateBus;
-      UCHAR  SecondaryLatency;
-      struct {
-        ULONG  Base;
-        ULONG  Limit;
-      } Range[PCI_TYPE2_ADDRESSES - 1];
-      UCHAR  InterruptLine;
-      UCHAR  InterruptPin;
-      USHORT  BridgeControl;
-    } type2;
-  } u;
-  UCHAR  DeviceSpecific[192];
-} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
-
-/* PCI_COMMON_CONFIG.Command */
-
-#define PCI_ENABLE_IO_SPACE               0x0001
-#define PCI_ENABLE_MEMORY_SPACE           0x0002
-#define PCI_ENABLE_BUS_MASTER             0x0004
-#define PCI_ENABLE_SPECIAL_CYCLES         0x0008
-#define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
-#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
-#define PCI_ENABLE_PARITY                 0x0040
-#define PCI_ENABLE_WAIT_CYCLE             0x0080
-#define PCI_ENABLE_SERR                   0x0100
-#define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
-
-/* PCI_COMMON_CONFIG.Status */
-
-#define PCI_STATUS_CAPABILITIES_LIST      0x0010
-#define PCI_STATUS_66MHZ_CAPABLE          0x0020
-#define PCI_STATUS_UDF_SUPPORTED          0x0040
-#define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
-#define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
-#define PCI_STATUS_DEVSEL                 0x0600
-#define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
-#define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
-#define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
-#define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
-#define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
-
-/* PCI_COMMON_CONFIG.HeaderType */
-
-#define PCI_MULTIFUNCTION                 0x80
-#define PCI_DEVICE_TYPE                   0x00
-#define PCI_BRIDGE_TYPE                   0x01
-#define PCI_CARDBUS_BRIDGE_TYPE           0x02
-
-#define PCI_CONFIGURATION_TYPE(PciData) \
-  (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
-
-#define PCI_MULTIFUNCTION_DEVICE(PciData) \
-  ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
-
-/* PCI device classes */
-
-#define PCI_CLASS_PRE_20                    0x00
-#define PCI_CLASS_MASS_STORAGE_CTLR         0x01
-#define PCI_CLASS_NETWORK_CTLR              0x02
-#define PCI_CLASS_DISPLAY_CTLR              0x03
-#define PCI_CLASS_MULTIMEDIA_DEV            0x04
-#define PCI_CLASS_MEMORY_CTLR               0x05
-#define PCI_CLASS_BRIDGE_DEV                0x06
-#define PCI_CLASS_SIMPLE_COMMS_CTLR         0x07
-#define PCI_CLASS_BASE_SYSTEM_DEV           0x08
-#define PCI_CLASS_INPUT_DEV                 0x09
-#define PCI_CLASS_DOCKING_STATION           0x0a
-#define PCI_CLASS_PROCESSOR                 0x0b
-#define PCI_CLASS_SERIAL_BUS_CTLR           0x0c
-
-/* PCI device subclasses for class 0 */
-
-#define PCI_SUBCLASS_PRE_20_NON_VGA         0x00
-#define PCI_SUBCLASS_PRE_20_VGA             0x01
-
-/* PCI device subclasses for class 1 (mass storage controllers)*/
-
-#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR      0x00
-#define PCI_SUBCLASS_MSC_IDE_CTLR           0x01
-#define PCI_SUBCLASS_MSC_FLOPPY_CTLR        0x02
-#define PCI_SUBCLASS_MSC_IPI_CTLR           0x03
-#define PCI_SUBCLASS_MSC_RAID_CTLR          0x04
-#define PCI_SUBCLASS_MSC_OTHER              0x80
-
-/* PCI device subclasses for class 2 (network controllers)*/
-
-#define PCI_SUBCLASS_NET_ETHERNET_CTLR      0x00
-#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR    0x01
-#define PCI_SUBCLASS_NET_FDDI_CTLR          0x02
-#define PCI_SUBCLASS_NET_ATM_CTLR           0x03
-#define PCI_SUBCLASS_NET_OTHER              0x80
-
-/* PCI device subclasses for class 3 (display controllers)*/
-
-#define PCI_SUBCLASS_VID_VGA_CTLR           0x00
-#define PCI_SUBCLASS_VID_XGA_CTLR           0x01
-#define PCI_SUBCLASS_VID_3D_CTLR            0x02
-#define PCI_SUBCLASS_VID_OTHER              0x80
-
-/* PCI device subclasses for class 4 (multimedia device)*/
-
-#define PCI_SUBCLASS_MM_VIDEO_DEV           0x00
-#define PCI_SUBCLASS_MM_AUDIO_DEV           0x01
-#define PCI_SUBCLASS_MM_TELEPHONY_DEV       0x02
-#define PCI_SUBCLASS_MM_OTHER               0x80
-
-/* PCI device subclasses for class 5 (memory controller)*/
-
-#define PCI_SUBCLASS_MEM_RAM                0x00
-#define PCI_SUBCLASS_MEM_FLASH              0x01
-#define PCI_SUBCLASS_MEM_OTHER              0x80
-
-/* PCI device subclasses for class 6 (bridge device)*/
-
-#define PCI_SUBCLASS_BR_HOST                0x00
-#define PCI_SUBCLASS_BR_ISA                 0x01
-#define PCI_SUBCLASS_BR_EISA                0x02
-#define PCI_SUBCLASS_BR_MCA                 0x03
-#define PCI_SUBCLASS_BR_PCI_TO_PCI          0x04
-#define PCI_SUBCLASS_BR_PCMCIA              0x05
-#define PCI_SUBCLASS_BR_NUBUS               0x06
-#define PCI_SUBCLASS_BR_CARDBUS             0x07
-#define PCI_SUBCLASS_BR_OTHER               0x80
-
-/* PCI device subclasses for class C (serial bus controller)*/
-
-#define PCI_SUBCLASS_SB_IEEE1394            0x00
-#define PCI_SUBCLASS_SB_ACCESS              0x01
-#define PCI_SUBCLASS_SB_SSA                 0x02
-#define PCI_SUBCLASS_SB_USB                 0x03
-#define PCI_SUBCLASS_SB_FIBRE_CHANNEL       0x04
-#define PCI_SUBCLASS_SB_SMBUS               0x05
-
-#define PCI_MAX_DEVICES        32
-#define PCI_MAX_FUNCTION       8
-#define PCI_MAX_BRIDGE_NUMBER  0xFF
-#define PCI_INVALID_VENDORID   0xFFFF
-#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
-
-#define PCI_ADDRESS_IO_SPACE                0x01
-#define PCI_ADDRESS_MEMORY_TYPE_MASK        0x06
-#define PCI_ADDRESS_MEMORY_PREFETCHABLE     0x08
-#define PCI_ADDRESS_IO_ADDRESS_MASK         0xfffffffc
-#define PCI_ADDRESS_MEMORY_ADDRESS_MASK     0xfffffff0
-#define PCI_ADDRESS_ROM_ADDRESS_MASK        0xfffff800
-
-#define PCI_TYPE_32BIT 0
-#define PCI_TYPE_20BIT 2
-#define PCI_TYPE_64BIT 4
-
-typedef struct _PCI_SLOT_NUMBER {
-  union {
-    struct {
-      ULONG  DeviceNumber : 5;
-      ULONG  FunctionNumber : 3;
-      ULONG  Reserved : 24;
-    } bits;
-    ULONG  AsULONG;
-  } u;
-} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
-
-#define POOL_COLD_ALLOCATION                256
-#define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE    8
-#define POOL_RAISE_IF_ALLOCATION_FAILURE    16
-
-typedef struct _OSVERSIONINFOA {
-    ULONG dwOSVersionInfoSize;
-    ULONG dwMajorVersion;
-    ULONG dwMinorVersion;
-    ULONG dwBuildNumber;
-    ULONG dwPlatformId;
-    CHAR   szCSDVersion[128];
-} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
-
-typedef struct _OSVERSIONINFOW {
-    ULONG dwOSVersionInfoSize;
-    ULONG dwMajorVersion;
-    ULONG dwMinorVersion;
-    ULONG dwBuildNumber;
-    ULONG dwPlatformId;
-    WCHAR  szCSDVersion[128];
-} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
-
-#ifdef UNICODE
-typedef OSVERSIONINFOW OSVERSIONINFO;
-typedef POSVERSIONINFOW POSVERSIONINFO;
-typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
-#else
-typedef OSVERSIONINFOA OSVERSIONINFO;
-typedef POSVERSIONINFOA POSVERSIONINFO;
-typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
-#endif // UNICODE
-
-typedef struct _OSVERSIONINFOEXA {
-    ULONG dwOSVersionInfoSize;
-    ULONG dwMajorVersion;
-    ULONG dwMinorVersion;
-    ULONG dwBuildNumber;
-    ULONG dwPlatformId;
-    CHAR   szCSDVersion[128];
-    USHORT wServicePackMajor;
-    USHORT wServicePackMinor;
-    USHORT wSuiteMask;
-    UCHAR wProductType;
-    UCHAR wReserved;
-} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
-
-typedef struct _OSVERSIONINFOEXW {
-    ULONG dwOSVersionInfoSize;
-    ULONG dwMajorVersion;
-    ULONG dwMinorVersion;
-    ULONG dwBuildNumber;
-    ULONG dwPlatformId;
-    WCHAR  szCSDVersion[128];
-    USHORT wServicePackMajor;
-    USHORT wServicePackMinor;
-    USHORT wSuiteMask;
-    UCHAR wProductType;
-    UCHAR wReserved;
-} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
-
-#ifdef UNICODE
-typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
-typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
-typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
-#else
-typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
-typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
-typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
-#endif // UNICODE
-
-NTSYSAPI
-ULONGLONG
-DDKAPI
-VerSetConditionMask(
-  IN ULONGLONG  ConditionMask,
-  IN ULONG  TypeMask,
-  IN UCHAR  Condition);
-
-#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType)  \
-        ((ConditionMask) = VerSetConditionMask((ConditionMask), \
-        (TypeBitMask), (ComparisonType)))
-
-/* RtlVerifyVersionInfo() TypeMask */
-
-#define VER_MINORVERSION                  0x0000001
-#define VER_MAJORVERSION                  0x0000002
-#define VER_BUILDNUMBER                   0x0000004
-#define VER_PLATFORMID                    0x0000008
-#define VER_SERVICEPACKMINOR              0x0000010
-#define VER_SERVICEPACKMAJOR              0x0000020
-#define VER_SUITENAME                     0x0000040
-#define VER_PRODUCT_TYPE                  0x0000080
-
-/* RtlVerifyVersionInfo() ComparisonType */
-
-#define VER_EQUAL                       1
-#define VER_GREATER                     2
-#define VER_GREATER_EQUAL               3
-#define VER_LESS                        4
-#define VER_LESS_EQUAL                  5
-#define VER_AND                         6
-#define VER_OR                          7
-
-#define VER_CONDITION_MASK              7
-#define VER_NUM_BITS_PER_CONDITION_MASK 3
-
-struct _RTL_RANGE;
-
-typedef BOOLEAN
-(NTAPI *PRTL_CONFLICT_RANGE_CALLBACK) (
-    PVOID Context,
-    struct _RTL_RANGE *Range
-);
-
-typedef enum _EVENT_TYPE {
-  NotificationEvent,
-  SynchronizationEvent
-} EVENT_TYPE;
-
-typedef enum _KWAIT_REASON {
-  Executive,
-  FreePage,
-  PageIn,
-  PoolAllocation,
-  DelayExecution,
-  Suspended,
-  UserRequest,
-  WrExecutive,
-  WrFreePage,
-  WrPageIn,
-  WrPoolAllocation,
-  WrDelayExecution,
-  WrSuspended,
-  WrUserRequest,
-  WrEventPair,
-  WrQueue,
-  WrLpcReceive,
-  WrLpcReply,
-  WrVirtualMemory,
-  WrPageOut,
-  WrRendezvous,
-  Spare2,
-  WrGuardedMutex,
-  Spare4,
-  Spare5,
-  Spare6,
-  WrKernel,
-  WrResource,
-  WrPushLock,
-  WrMutex,
-  WrQuantumEnd,
-  WrDispatchInt,
-  WrPreempted,
-  WrYieldExecution,
-  MaximumWaitReason
-} KWAIT_REASON;
-
-typedef struct _KWAIT_BLOCK {
-  LIST_ENTRY  WaitListEntry;
-  struct _KTHREAD * RESTRICTED_POINTER  Thread;
-  PVOID  Object;
-  struct _KWAIT_BLOCK * RESTRICTED_POINTER  NextWaitBlock;
-  USHORT  WaitKey;
-  UCHAR WaitType;
-  UCHAR SpareByte;
-} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
-
-typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
-
-typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
-  BOOLEAN  Removed;
-  BOOLEAN  Reserved[3];
-  volatile LONG  IoCount;
-  KEVENT  RemoveEvent;
-} IO_REMOVE_LOCK_COMMON_BLOCK;
-
-typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
-  LONG  Signature;
-  LONG  HighWatermark;
-  LONGLONG  MaxLockedTicks;
-  LONG  AllocateTag;
-  LIST_ENTRY  LockList;
-  KSPIN_LOCK  Spin;
-  volatile LONG  LowMemoryCount;
-  ULONG  Reserved1[4];
-  PVOID  Reserved2;
-  PIO_REMOVE_LOCK_TRACKING_BLOCK  Blocks;
-} IO_REMOVE_LOCK_DBG_BLOCK;
-
-typedef struct _IO_REMOVE_LOCK {
-  IO_REMOVE_LOCK_COMMON_BLOCK  Common;
-#if DBG
-  IO_REMOVE_LOCK_DBG_BLOCK  Dbg;
-#endif
-} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
-
-typedef struct _IO_WORKITEM *PIO_WORKITEM;
-
-typedef VOID
-(DDKAPI IO_WORKITEM_ROUTINE)(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PVOID  Context);
-typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
-
-typedef struct _SHARE_ACCESS {
-  ULONG  OpenCount;
-  ULONG  Readers;
-  ULONG  Writers;
-  ULONG  Deleters;
-  ULONG  SharedRead;
-  ULONG  SharedWrite;
-  ULONG  SharedDelete;
-} SHARE_ACCESS, *PSHARE_ACCESS;
-
-typedef enum _KINTERRUPT_MODE {
-  LevelSensitive,
-  Latched
-} KINTERRUPT_MODE;
-
-#define THREAD_WAIT_OBJECTS 3
-
-typedef VOID
-(DDKAPI *PKINTERRUPT_ROUTINE)(
-  VOID);
-
-typedef enum _CREATE_FILE_TYPE {
-  CreateFileTypeNone,
-  CreateFileTypeNamedPipe,
-  CreateFileTypeMailslot
-} CREATE_FILE_TYPE;
-
-typedef struct _CONFIGURATION_INFORMATION {
-  ULONG  DiskCount;
-  ULONG  FloppyCount;
-  ULONG  CdRomCount;
-  ULONG  TapeCount;
-  ULONG  ScsiPortCount;
-  ULONG  SerialCount;
-  ULONG  ParallelCount;
-  BOOLEAN  AtDiskPrimaryAddressClaimed;
-  BOOLEAN  AtDiskSecondaryAddressClaimed;
-  ULONG  Version;
-  ULONG  MediumChangerCount;
-} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
-
-typedef enum _CONFIGURATION_TYPE {
-  ArcSystem,
-  CentralProcessor,
-  FloatingPointProcessor,
-  PrimaryIcache,
-  PrimaryDcache,
-  SecondaryIcache,
-  SecondaryDcache,
-  SecondaryCache,
-  EisaAdapter,
-  TcAdapter,
-  ScsiAdapter,
-  DtiAdapter,
-  MultiFunctionAdapter,
-  DiskController,
-  TapeController,
-  CdromController,
-  WormController,
-  SerialController,
-  NetworkController,
-  DisplayController,
-  ParallelController,
-  PointerController,
-  KeyboardController,
-  AudioController,
-  OtherController,
-  DiskPeripheral,
-  FloppyDiskPeripheral,
-  TapePeripheral,
-  ModemPeripheral,
-  MonitorPeripheral,
-  PrinterPeripheral,
-  PointerPeripheral,
-  KeyboardPeripheral,
-  TerminalPeripheral,
-  OtherPeripheral,
-  LinePeripheral,
-  NetworkPeripheral,
-  SystemMemory,
-  DockingInformation,
-  RealModeIrqRoutingTable,
-  RealModePCIEnumeration,
-  MaximumType
-} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
-
-#define IO_FORCE_ACCESS_CHECK               0x001
-#define IO_NO_PARAMETER_CHECKING            0x100
-
-#define IO_REPARSE                      0x0
-#define IO_REMOUNT                      0x1
-
-typedef NTSTATUS
-(DDKAPI *PIO_QUERY_DEVICE_ROUTINE)(
-  IN PVOID  Context,
-  IN PUNICODE_STRING  PathName,
-  IN INTERFACE_TYPE  BusType,
-  IN ULONG  BusNumber,
-  IN PKEY_VALUE_FULL_INFORMATION  *BusInformation,
-  IN CONFIGURATION_TYPE  ControllerType,
-  IN ULONG  ControllerNumber,
-  IN PKEY_VALUE_FULL_INFORMATION  *ControllerInformation,
-  IN CONFIGURATION_TYPE  PeripheralType,
-  IN ULONG  PeripheralNumber,
-  IN PKEY_VALUE_FULL_INFORMATION  *PeripheralInformation);
-
-typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
-  IoQueryDeviceIdentifier = 0,
-  IoQueryDeviceConfigurationData,
-  IoQueryDeviceComponentInformation,
-  IoQueryDeviceMaxData
-} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
-
-typedef enum _KBUGCHECK_CALLBACK_REASON {
-  KbCallbackInvalid,
-  KbCallbackReserved1,
-  KbCallbackSecondaryDumpData,
-  KbCallbackDumpIo,
-} KBUGCHECK_CALLBACK_REASON;
-
-struct _KBUGCHECK_REASON_CALLBACK_RECORD;
-
-typedef VOID
-(DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)(
-  IN KBUGCHECK_CALLBACK_REASON  Reason,
-  IN struct _KBUGCHECK_REASON_CALLBACK_RECORD  *Record,
-  IN OUT PVOID  ReasonSpecificData,
-  IN ULONG  ReasonSpecificDataLength);
-
-typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
-  LIST_ENTRY  Entry;
-  PKBUGCHECK_REASON_CALLBACK_ROUTINE  CallbackRoutine;
-  PUCHAR  Component;
-  ULONG_PTR  Checksum;
-  KBUGCHECK_CALLBACK_REASON  Reason;
-  UCHAR  State;
-} KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
-
-typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
-  BufferEmpty,
-  BufferInserted,
-  BufferStarted,
-  BufferFinished,
-  BufferIncomplete
-} KBUGCHECK_BUFFER_DUMP_STATE;
-
-typedef VOID
-(DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)(
-  IN PVOID  Buffer,
-  IN ULONG  Length);
-
-typedef struct _KBUGCHECK_CALLBACK_RECORD {
-  LIST_ENTRY  Entry;
-  PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine;
-  PVOID  Buffer;
-  ULONG  Length;
-  PUCHAR  Component;
-  ULONG_PTR  Checksum;
-  UCHAR  State;
-} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
-
-typedef BOOLEAN
-(DDKAPI *PNMI_CALLBACK)(
-    IN PVOID Context,
-    IN BOOLEAN Handled);
-
-/*
- * VOID
- * KeInitializeCallbackRecord(
- *   IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord)
- */
-#define KeInitializeCallbackRecord(CallbackRecord) \
-  CallbackRecord->State = BufferEmpty;
-
-typedef enum _KDPC_IMPORTANCE {
-  LowImportance,
-  MediumImportance,
-  HighImportance
-} KDPC_IMPORTANCE;
-
-typedef enum _MEMORY_CACHING_TYPE_ORIG {
-  MmFrameBufferCached = 2
-} MEMORY_CACHING_TYPE_ORIG;
-
-typedef enum _MEMORY_CACHING_TYPE {
-  MmNonCached = FALSE,
-  MmCached = TRUE,
-  MmWriteCombined = MmFrameBufferCached,
-  MmHardwareCoherentCached,
-  MmNonCachedUnordered,
-  MmUSWCCached,
-  MmMaximumCacheType
-} MEMORY_CACHING_TYPE;
-
-typedef enum _MM_PAGE_PRIORITY {
-  LowPagePriority,
-  NormalPagePriority = 16,
-  HighPagePriority = 32
-} MM_PAGE_PRIORITY;
-
-typedef enum _LOCK_OPERATION {
-  IoReadAccess,
-  IoWriteAccess,
-  IoModifyAccess
-} LOCK_OPERATION;
-
-#define FLUSH_MULTIPLE_MAXIMUM 32
-
-typedef enum _MM_SYSTEM_SIZE {
-  MmSmallSystem,
-  MmMediumSystem,
-  MmLargeSystem
-} MM_SYSTEMSIZE;
-
-typedef struct _OBJECT_HANDLE_INFORMATION {
-  ULONG HandleAttributes;
-  ACCESS_MASK GrantedAccess;
-} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
-
-typedef struct _CLIENT_ID {
-  HANDLE  UniqueProcess;
-  HANDLE  UniqueThread;
-} CLIENT_ID, *PCLIENT_ID;
-
-typedef VOID
-(DDKAPI *PKSTART_ROUTINE)(
-  IN PVOID  StartContext);
-
-typedef VOID
-(DDKAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
-  IN HANDLE  ParentId,
-  IN HANDLE  ProcessId,
-  IN BOOLEAN  Create);
-
-typedef VOID
-(DDKAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
-  IN HANDLE  ProcessId,
-  IN HANDLE  ThreadId,
-  IN BOOLEAN  Create);
-
-typedef struct _IMAGE_INFO {
-  _ANONYMOUS_UNION union {
-    ULONG  Properties;
-    _ANONYMOUS_STRUCT struct {
-      ULONG  ImageAddressingMode  : 8;
-      ULONG  SystemModeImage      : 1;
-      ULONG  ImageMappedToAllPids : 1;
-      ULONG  Reserved             : 22;
-    } DUMMYSTRUCTNAME;
-  } DUMMYUNIONNAME;
-  PVOID  ImageBase;
-  ULONG  ImageSelector;
-  SIZE_T  ImageSize;
-  ULONG  ImageSectionNumber;
-} IMAGE_INFO, *PIMAGE_INFO;
-
-#define IMAGE_ADDRESSING_MODE_32BIT       3
-
-typedef VOID
-(DDKAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
-  IN PUNICODE_STRING  FullImageName,
-  IN HANDLE  ProcessId,
-  IN PIMAGE_INFO  ImageInfo);
-
-#pragma pack(push,4)
-typedef enum _BUS_DATA_TYPE {
-    ConfigurationSpaceUndefined = -1,
-    Cmos,
-    EisaConfiguration,
-    Pos,
-    CbusConfiguration,
-    PCIConfiguration,
-    VMEConfiguration,
-    NuBusConfiguration,
-    PCMCIAConfiguration,
-    MPIConfiguration,
-    MPSAConfiguration,
-    PNPISAConfiguration,
-    SgiInternalConfiguration,
-    MaximumBusDataType
-} BUS_DATA_TYPE, *PBUS_DATA_TYPE;
-#pragma pack(pop)
-
-typedef struct _NT_TIB {
-    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
-    PVOID StackBase;
-    PVOID StackLimit;
-    PVOID SubSystemTib;
-       _ANONYMOUS_UNION union {
-               PVOID FiberData;
-               ULONG Version;
-       } DUMMYUNIONNAME;
-    PVOID ArbitraryUserPointer;
-    struct _NT_TIB *Self;
-} NT_TIB, *PNT_TIB;
-
-typedef struct _NT_TIB32 {
-       ULONG ExceptionList;
-       ULONG StackBase;
-       ULONG StackLimit;
-       ULONG SubSystemTib;
-       union {
-               ULONG FiberData;
-               ULONG Version;
-       };
-       ULONG ArbitraryUserPointer;
-       ULONG Self;
-} NT_TIB32,*PNT_TIB32;
-
-typedef struct _NT_TIB64 {
-       ULONG64 ExceptionList;
-       ULONG64 StackBase;
-       ULONG64 StackLimit;
-       ULONG64 SubSystemTib;
-       union {
-               ULONG64 FiberData;
-               ULONG Version;
-       };
-       ULONG64 ArbitraryUserPointer;
-       ULONG64 Self;
-} NT_TIB64,*PNT_TIB64;
-
-typedef enum _PROCESSINFOCLASS {
-  ProcessBasicInformation,
-  ProcessQuotaLimits,
-  ProcessIoCounters,
-  ProcessVmCounters,
-  ProcessTimes,
-  ProcessBasePriority,
-  ProcessRaisePriority,
-  ProcessDebugPort,
-  ProcessExceptionPort,
-  ProcessAccessToken,
-  ProcessLdtInformation,
-  ProcessLdtSize,
-  ProcessDefaultHardErrorMode,
-  ProcessIoPortHandlers,
-  ProcessPooledUsageAndLimits,
-  ProcessWorkingSetWatch,
-  ProcessUserModeIOPL,
-  ProcessEnableAlignmentFaultFixup,
-  ProcessPriorityClass,
-  ProcessWx86Information,
-  ProcessHandleCount,
-  ProcessAffinityMask,
-  ProcessPriorityBoost,
-  ProcessDeviceMap,
-  ProcessSessionInformation,
-  ProcessForegroundInformation,
-  ProcessWow64Information,
-  ProcessImageFileName,
-  ProcessLUIDDeviceMapsEnabled,
-  ProcessBreakOnTermination,
-  ProcessDebugObjectHandle,
-  ProcessDebugFlags,
-  ProcessHandleTracing,
-  ProcessIoPriority,
-  ProcessExecuteFlags,
-  ProcessTlsInformation,
-  ProcessCookie,
-  ProcessImageInformation,
-  ProcessCycleTime,
-  ProcessPagePriority,
-  ProcessInstrumentationCallback,
-  MaxProcessInfoClass
-} PROCESSINFOCLASS;
-
-typedef enum _THREADINFOCLASS {
-  ThreadBasicInformation,
-  ThreadTimes,
-  ThreadPriority,
-  ThreadBasePriority,
-  ThreadAffinityMask,
-  ThreadImpersonationToken,
-  ThreadDescriptorTableEntry,
-  ThreadEnableAlignmentFaultFixup,
-  ThreadEventPair_Reusable,
-  ThreadQuerySetWin32StartAddress,
-  ThreadZeroTlsCell,
-  ThreadPerformanceCount,
-  ThreadAmILastThread,
-  ThreadIdealProcessor,
-  ThreadPriorityBoost,
-  ThreadSetTlsArrayAddress,
-  ThreadIsIoPending,
-  ThreadHideFromDebugger,
-  ThreadBreakOnTermination,
-  ThreadSwitchLegacyState,
-  ThreadIsTerminated,
-  ThreadLastSystemCall,
-  ThreadIoPriority,
-  ThreadCycleTime,
-  ThreadPagePriority,
-  ThreadActualBasePriority,
-  MaxThreadInfoClass
-} THREADINFOCLASS;
-
-typedef struct _PROCESS_BASIC_INFORMATION
-{
-    NTSTATUS ExitStatus;
-    struct _PEB *PebBaseAddress;
-    ULONG_PTR AffinityMask;
-    KPRIORITY BasePriority;
-    ULONG_PTR UniqueProcessId;
-    ULONG_PTR InheritedFromUniqueProcessId;
-} PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
-
-typedef struct _PROCESS_WS_WATCH_INFORMATION
-{
-    PVOID FaultingPc;
-    PVOID FaultingVa;
-} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
-
-typedef struct _PROCESS_DEVICEMAP_INFORMATION
-{
-    union
-    {
-        struct
-        {
-            HANDLE DirectoryHandle;
-        } Set;
-        struct
-        {
-            ULONG DriveMap;
-            UCHAR DriveType[32];
-        } Query;
-    };
-} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
-
-typedef struct _KERNEL_USER_TIMES
-{
-    LARGE_INTEGER CreateTime;
-    LARGE_INTEGER ExitTime;
-    LARGE_INTEGER KernelTime;
-    LARGE_INTEGER UserTime;
-} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
-
-typedef struct _PROCESS_ACCESS_TOKEN
-{
-    HANDLE Token;
-    HANDLE Thread;
-} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
-
-typedef struct _PROCESS_SESSION_INFORMATION
-{
-    ULONG SessionId;
-} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
-
-typedef VOID
-(DDKAPI *PREQUEST_POWER_COMPLETE)(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN UCHAR  MinorFunction,
-  IN POWER_STATE  PowerState,
-  IN PVOID  Context,
-  IN PIO_STATUS_BLOCK  IoStatus);
-
-typedef enum _TRACE_INFORMATION_CLASS {
-  TraceIdClass,
-  TraceHandleClass,
-  TraceEnableFlagsClass,
-  TraceEnableLevelClass,
-  GlobalLoggerHandleClass,
-  EventLoggerHandleClass,
-  AllLoggerHandlesClass,
-  TraceHandleByNameClass
-} TRACE_INFORMATION_CLASS;
-
-typedef enum _REG_NOTIFY_CLASS
-{
-  RegNtDeleteKey,
-  RegNtPreDeleteKey = RegNtDeleteKey,
-  RegNtSetValueKey,
-  RegNtPreSetValueKey = RegNtSetValueKey,
-  RegNtDeleteValueKey,
-  RegNtPreDeleteValueKey = RegNtDeleteValueKey,
-  RegNtSetInformationKey,
-  RegNtPreSetInformationKey = RegNtSetInformationKey,
-  RegNtRenameKey,
-  RegNtPreRenameKey = RegNtRenameKey,
-  RegNtEnumerateKey,
-  RegNtPreEnumerateKey = RegNtEnumerateKey,
-  RegNtEnumerateValueKey,
-  RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
-  RegNtQueryKey,
-  RegNtPreQueryKey = RegNtQueryKey,
-  RegNtQueryValueKey,
-  RegNtPreQueryValueKey = RegNtQueryValueKey,
-  RegNtQueryMultipleValueKey,
-  RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
-  RegNtPreCreateKey,
-  RegNtPostCreateKey,
-  RegNtPreOpenKey,
-  RegNtPostOpenKey,
-  RegNtKeyHandleClose,
-  RegNtPreKeyHandleClose = RegNtKeyHandleClose,
-  RegNtPostDeleteKey,
-  RegNtPostSetValueKey,
-  RegNtPostDeleteValueKey,
-  RegNtPostSetInformationKey,
-  RegNtPostRenameKey,
-  RegNtPostEnumerateKey,
-  RegNtPostEnumerateValueKey,
-  RegNtPostQueryKey,
-  RegNtPostQueryValueKey,
-  RegNtPostQueryMultipleValueKey,
-  RegNtPostKeyHandleClose,
-  RegNtPreCreateKeyEx,
-  RegNtPostCreateKeyEx,
-  RegNtPreOpenKeyEx,
-  RegNtPostOpenKeyEx
-} REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
-
-typedef NTSTATUS
-(NTAPI *PEX_CALLBACK_FUNCTION)(
-    IN PVOID CallbackContext,
-    IN PVOID Argument1,
-    IN PVOID Argument2
-);
-
-typedef struct _REG_DELETE_KEY_INFORMATION
-{
-    PVOID Object;
-} REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION;
-
-typedef struct _REG_SET_VALUE_KEY_INFORMATION
-{
-    PVOID Object;
-    PUNICODE_STRING ValueName;
-    ULONG TitleIndex;
-    ULONG Type;
-    PVOID Data;
-    ULONG DataSize;
-} REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
-
-typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
-{
-    PVOID Object;
-    PUNICODE_STRING ValueName;
-} REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
-
-typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
-{
-    PVOID Object;
-    KEY_SET_INFORMATION_CLASS KeySetInformationClass;
-    PVOID KeySetInformation;
-    ULONG KeySetInformationLength;
-} REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
-
-typedef struct _REG_ENUMERATE_KEY_INFORMATION
-{
-    PVOID Object;
-    ULONG Index;
-    KEY_INFORMATION_CLASS KeyInformationClass;
-    PVOID KeyInformation;
-    ULONG Length;
-    PULONG ResultLength;
-} REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
-
-typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
-{
-    PVOID Object;
-    ULONG Index;
-    KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
-    PVOID KeyValueInformation;
-    ULONG Length;
-    PULONG ResultLength;
-} REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
-
-typedef struct _REG_QUERY_KEY_INFORMATION
-{
-    PVOID Object;
-    KEY_INFORMATION_CLASS KeyInformationClass;
-    PVOID KeyInformation;
-    ULONG Length;
-    PULONG ResultLength;
-} REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
-
-typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
-{
-    PVOID Object;
-    PUNICODE_STRING ValueName;
-    KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
-    PVOID KeyValueInformation;
-    ULONG Length;
-    PULONG ResultLength;
-} REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
-
-typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
-{
-    PVOID Object;
-    PKEY_VALUE_ENTRY ValueEntries;
-    ULONG EntryCount;
-    PVOID ValueBuffer;
-    PULONG BufferLength;
-    PULONG RequiredBufferLength;
-} REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
-
-typedef struct _REG_PRE_CREATE_KEY_INFORMATION
-{
-    PUNICODE_STRING CompleteName;
-} REG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_CREATE_KEY_INFORMATION;
-
-typedef struct _REG_POST_CREATE_KEY_INFORMATION
-{
-    PUNICODE_STRING CompleteName;
-    PVOID Object;
-    NTSTATUS Status;
-} REG_POST_CREATE_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION;
-
-typedef struct _REG_PRE_OPEN_KEY_INFORMATION
-{
-    PUNICODE_STRING  CompleteName;
-} REG_PRE_OPEN_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;
-
-typedef struct _REG_POST_OPEN_KEY_INFORMATION
-{
-    PUNICODE_STRING CompleteName;
-    PVOID Object;
-    NTSTATUS Status;
-} REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
-
-typedef struct _REG_POST_OPERATION_INFORMATION
-{
-    PVOID Object;
-    NTSTATUS Status;
-} REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
-
-typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
-{
-    PVOID Object;
-} REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
-
-/*
-** Storage structures
-*/
-typedef enum _PARTITION_STYLE {
-  PARTITION_STYLE_MBR,
-  PARTITION_STYLE_GPT,
-  PARTITION_STYLE_RAW
-} PARTITION_STYLE;
-
-typedef struct _CREATE_DISK_MBR {
-  ULONG  Signature;
-} CREATE_DISK_MBR, *PCREATE_DISK_MBR;
-
-typedef struct _CREATE_DISK_GPT {
-  GUID  DiskId;
-  ULONG  MaxPartitionCount;
-} CREATE_DISK_GPT, *PCREATE_DISK_GPT;
-
-typedef struct _CREATE_DISK {
-  PARTITION_STYLE  PartitionStyle;
-  _ANONYMOUS_UNION union {
-    CREATE_DISK_MBR  Mbr;
-    CREATE_DISK_GPT  Gpt;
-  } DUMMYUNIONNAME;
-} CREATE_DISK, *PCREATE_DISK;
-
-typedef struct _DISK_SIGNATURE {
-  ULONG  PartitionStyle;
-  _ANONYMOUS_UNION union {
-    struct {
-      ULONG  Signature;
-      ULONG  CheckSum;
-    } Mbr;
-    struct {
-      GUID  DiskId;
-    } Gpt;
-  } DUMMYUNIONNAME;
-} DISK_SIGNATURE, *PDISK_SIGNATURE;
-
-typedef VOID
-(FASTCALL*PTIME_UPDATE_NOTIFY_ROUTINE)(
-  IN HANDLE  ThreadId,
-  IN KPROCESSOR_MODE  Mode);
-
-#define DBG_STATUS_CONTROL_C              1
-#define DBG_STATUS_SYSRQ                  2
-#define DBG_STATUS_BUGCHECK_FIRST         3
-#define DBG_STATUS_BUGCHECK_SECOND        4
-#define DBG_STATUS_FATAL                  5
-#define DBG_STATUS_DEBUG_CONTROL          6
-#define DBG_STATUS_WORKER                 7
-
-typedef struct _PHYSICAL_MEMORY_RANGE {
-  PHYSICAL_ADDRESS  BaseAddress;
-  LARGE_INTEGER  NumberOfBytes;
-} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
-
-typedef ULONG_PTR
-(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
-  IN PVOID  Context);
-
-typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
-  PDRIVER_VERIFIER_THUNK_ROUTINE  PristineRoutine;
-  PDRIVER_VERIFIER_THUNK_ROUTINE  NewRoutine;
-} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
-
-#define DRIVER_VERIFIER_SPECIAL_POOLING             0x0001
-#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING         0x0002
-#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES  0x0004
-#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS      0x0008
-#define DRIVER_VERIFIER_IO_CHECKING                 0x0010
-
-#define HASH_STRING_ALGORITHM_DEFAULT     0
-#define HASH_STRING_ALGORITHM_X65599      1
-#define HASH_STRING_ALGORITHM_INVALID     0xffffffff
-
-typedef VOID
-(DDKAPI *PTIMER_APC_ROUTINE)(
-  IN PVOID  TimerContext,
-  IN ULONG  TimerLowValue,
-  IN LONG  TimerHighValue);
-
-
-
-/*
-** WMI structures
-*/
-
-typedef VOID
-(DDKAPI *WMI_NOTIFICATION_CALLBACK)(
-  PVOID  Wnode,
-  PVOID  Context);
-
-
-/*
-** Architecture specific structures
-*/
-#define PCR_MINOR_VERSION 1
-#define PCR_MAJOR_VERSION 1
-
-#ifdef _X86_
-
-#define SIZE_OF_80387_REGISTERS        80
-#define CONTEXT_i386   0x10000
-#define CONTEXT_i486   0x10000
-#define CONTEXT_CONTROL        (CONTEXT_i386|0x00000001L)
-#define CONTEXT_INTEGER        (CONTEXT_i386|0x00000002L)
-#define CONTEXT_SEGMENTS       (CONTEXT_i386|0x00000004L)
-#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
-#define CONTEXT_DEBUG_REGISTERS        (CONTEXT_i386|0x00000010L)
-#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
-#define CONTEXT_FULL   (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
-#define MAXIMUM_SUPPORTED_EXTENSION  512
-
-typedef struct _FLOATING_SAVE_AREA {
-    ULONG ControlWord;
-    ULONG StatusWord;
-    ULONG TagWord;
-    ULONG ErrorOffset;
-    ULONG ErrorSelector;
-    ULONG DataOffset;
-    ULONG DataSelector;
-    UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
-    ULONG Cr0NpxState;
-} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
-
-typedef struct _CONTEXT {
-    ULONG ContextFlags;
-    ULONG Dr0;
-    ULONG Dr1;
-    ULONG Dr2;
-    ULONG Dr3;
-    ULONG Dr6;
-    ULONG Dr7;
-    FLOATING_SAVE_AREA FloatSave;
-    ULONG SegGs;
-    ULONG SegFs;
-    ULONG SegEs;
-    ULONG SegDs;
-    ULONG Edi;
-    ULONG Esi;
-    ULONG Ebx;
-    ULONG Edx;
-    ULONG Ecx;
-    ULONG Eax;
-    ULONG Ebp;
-    ULONG Eip;
-    ULONG SegCs;
-    ULONG EFlags;
-    ULONG Esp;
-    ULONG SegSs;
-    UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
-} CONTEXT;
-
-//
-// Used to contain PFNs and PFN counts
-//
-typedef ULONG PFN_COUNT;
-typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
-typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
-
-#define PASSIVE_LEVEL                      0
-#define LOW_LEVEL                          0
-#define APC_LEVEL                          1
-#define DISPATCH_LEVEL                     2
-#define PROFILE_LEVEL                     27
-#define CLOCK1_LEVEL                      28
-#define CLOCK2_LEVEL                      28
-#define IPI_LEVEL                         29
-#define POWER_LEVEL                       30
-#define HIGH_LEVEL                        31
-
-typedef struct _KPCR_TIB {
-  PVOID  ExceptionList;         /* 00 */
-  PVOID  StackBase;             /* 04 */
-  PVOID  StackLimit;            /* 08 */
-  PVOID  SubSystemTib;          /* 0C */
-  _ANONYMOUS_UNION union {
-    PVOID  FiberData;           /* 10 */
-    ULONG  Version;             /* 10 */
-  } DUMMYUNIONNAME;
-  PVOID  ArbitraryUserPointer;  /* 14 */
-  struct _KPCR_TIB *Self;       /* 18 */
-} KPCR_TIB, *PKPCR_TIB;         /* 1C */
-
-typedef struct _KPCR {
-  KPCR_TIB  Tib;                /* 00 */
-  struct _KPCR  *Self;          /* 1C */
-  struct _KPRCB  *Prcb;         /* 20 */
-  KIRQL  Irql;                  /* 24 */
-  ULONG  IRR;                   /* 28 */
-  ULONG  IrrActive;             /* 2C */
-  ULONG  IDR;                   /* 30 */
-  PVOID  KdVersionBlock;        /* 34 */
-  PUSHORT  IDT;                 /* 38 */
-  PUSHORT  GDT;                 /* 3C */
-  struct _KTSS  *TSS;           /* 40 */
-  USHORT  MajorVersion;         /* 44 */
-  USHORT  MinorVersion;         /* 46 */
-  KAFFINITY  SetMember;         /* 48 */
-  ULONG  StallScaleFactor;      /* 4C */
-  UCHAR  SpareUnused;           /* 50 */
-  UCHAR  Number;                /* 51 */
-  UCHAR Spare0;
-  UCHAR SecondLevelCacheAssociativity;
-  ULONG VdmAlert;
-  ULONG KernelReserved[14];         // For use by the kernel
-  ULONG SecondLevelCacheSize;
-  ULONG HalReserved[16];            // For use by Hal
-} KPCR, *PKPCR;                 /* 54 */
-
-#define KeGetPcr()                      PCR
-
-typedef struct _KFLOATING_SAVE {
-  ULONG  ControlWord;
-  ULONG  StatusWord;
-  ULONG  ErrorOffset;
-  ULONG  ErrorSelector;
-  ULONG  DataOffset;
-  ULONG  DataSelector;
-  ULONG  Cr0NpxState;
-  ULONG  Spare1;
-} KFLOATING_SAVE, *PKFLOATING_SAVE;
-
-FORCEINLINE
-ULONG
-KeGetCurrentProcessorNumber(VOID)
-{
-    return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
-}
-
-NTHALAPI
-KIRQL
-DDKAPI
-KeGetCurrentIrql(
-    VOID);
-
-NTKERNELAPI
-PRKTHREAD
-NTAPI
-KeGetCurrentThread(
-    VOID);
-
-#define KI_USER_SHARED_DATA               0xffdf0000
-
-#define PAGE_SIZE                         0x1000
-#define PAGE_SHIFT                        12L
-
-#define SharedUserData                    ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
-
-extern NTKERNELAPI PVOID MmHighestUserAddress;
-extern NTKERNELAPI PVOID MmSystemRangeStart;
-extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
-
-#define MM_HIGHEST_USER_ADDRESS           MmHighestUserAddress
-#define MM_SYSTEM_RANGE_START             MmSystemRangeStart
-#define MM_USER_PROBE_ADDRESS             MmUserProbeAddress
-#define MM_LOWEST_USER_ADDRESS            (PVOID)0x10000
-#define MM_LOWEST_SYSTEM_ADDRESS          (PVOID)0xC0C00000
-
-#define MM_KSEG0_BASE       MM_SYSTEM_RANGE_START
-#define MM_SYSTEM_SPACE_END 0xFFFFFFFF
-    
-#elif defined(__x86_64__)
-
-#define CONTEXT_AMD64 0x100000
-#if !defined(RC_INVOKED)
-#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
-#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
-#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
-#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
-
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
-#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
-
-#define CONTEXT_EXCEPTION_ACTIVE 0x8000000
-#define CONTEXT_SERVICE_ACTIVE 0x10000000
-#define CONTEXT_EXCEPTION_REQUEST 0x40000000
-#define CONTEXT_EXCEPTION_REPORTING 0x80000000
-#endif
-
-typedef struct DECLSPEC_ALIGN(16) _M128A {
-    ULONGLONG Low;
-    LONGLONG High;
-} M128A, *PM128A;
-
-typedef struct _XMM_SAVE_AREA32 {
-    USHORT ControlWord;
-    USHORT StatusWord;
-    UCHAR TagWord;
-    UCHAR Reserved1;
-    USHORT ErrorOpcode;
-    ULONG ErrorOffset;
-    USHORT ErrorSelector;
-    USHORT Reserved2;
-    ULONG DataOffset;
-    USHORT DataSelector;
-    USHORT Reserved3;
-    ULONG MxCsr;
-    ULONG MxCsr_Mask;
-    M128A FloatRegisters[8];
-    M128A XmmRegisters[16];
-    UCHAR Reserved4[96];
-} XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
-
-typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
-    ULONG64 P1Home;
-    ULONG64 P2Home;
-    ULONG64 P3Home;
-    ULONG64 P4Home;
-    ULONG64 P5Home;
-    ULONG64 P6Home;
-
-    /* Control flags */
-    ULONG ContextFlags;
-    ULONG MxCsr;
-
-    /* Segment */
-    USHORT SegCs;
-    USHORT SegDs;
-    USHORT SegEs;
-    USHORT SegFs;
-    USHORT SegGs;
-    USHORT SegSs;
-    ULONG EFlags;
-
-    /* Debug */
-    ULONG64 Dr0;
-    ULONG64 Dr1;
-    ULONG64 Dr2;
-    ULONG64 Dr3;
-    ULONG64 Dr6;
-    ULONG64 Dr7;
-
-    /* Integer */
-    ULONG64 Rax;
-    ULONG64 Rcx;
-    ULONG64 Rdx;
-    ULONG64 Rbx;
-    ULONG64 Rsp;
-    ULONG64 Rbp;
-    ULONG64 Rsi;
-    ULONG64 Rdi;
-    ULONG64 R8;
-    ULONG64 R9;
-    ULONG64 R10;
-    ULONG64 R11;
-    ULONG64 R12;
-    ULONG64 R13;
-    ULONG64 R14;
-    ULONG64 R15;
-
-    /* Counter */
-    ULONG64 Rip;
-
-   /* Floating point */
-   union {
-       XMM_SAVE_AREA32 FltSave;
-       struct {
-           M128A Header[2];
-           M128A Legacy[8];
-           M128A Xmm0;
-           M128A Xmm1;
-           M128A Xmm2;
-           M128A Xmm3;
-           M128A Xmm4;
-           M128A Xmm5;
-           M128A Xmm6;
-           M128A Xmm7;
-           M128A Xmm8;
-           M128A Xmm9;
-           M128A Xmm10;
-           M128A Xmm11;
-           M128A Xmm12;
-           M128A Xmm13;
-           M128A Xmm14;
-           M128A Xmm15;
-      } DUMMYSTRUCTNAME;
-    } DUMMYUNIONNAME;
-
-     /* Vector */
-    M128A VectorRegister[26];
-    ULONG64 VectorControl;
-
-    /* Debug control */
-    ULONG64 DebugControl;
-    ULONG64 LastBranchToRip;
-    ULONG64 LastBranchFromRip;
-    ULONG64 LastExceptionToRip;
-    ULONG64 LastExceptionFromRip;
-} CONTEXT;
-
-//
-// Used to contain PFNs and PFN counts
-//
-typedef ULONG PFN_COUNT;
-typedef ULONG64 PFN_NUMBER, *PPFN_NUMBER;
-typedef LONG64 SPFN_NUMBER, *PSPFN_NUMBER;
-
-#define PASSIVE_LEVEL                      0
-#define LOW_LEVEL                          0
-#define APC_LEVEL                          1
-#define DISPATCH_LEVEL                     2
-#define CLOCK_LEVEL                       13
-#define IPI_LEVEL                         14
-#define POWER_LEVEL                       14
-#define PROFILE_LEVEL                     15
-#define HIGH_LEVEL                        15
-
-#define PAGE_SIZE   0x1000
-#define PAGE_SHIFT 12L
-#define PTI_SHIFT  12L
-#define PDI_SHIFT  21L
-#define PPI_SHIFT  30L
-#define PXI_SHIFT  39L
-#define PTE_PER_PAGE 512
-#define PDE_PER_PAGE 512
-#define PPE_PER_PAGE 512
-#define PXE_PER_PAGE 512
-#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
-#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
-#define PPI_MASK (PPE_PER_PAGE - 1)
-#define PXI_MASK (PXE_PER_PAGE - 1)
-
-#define PXE_BASE    0xFFFFF6FB7DBED000ULL
-#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
-#define PPE_BASE    0xFFFFF6FB7DA00000ULL
-#define PDE_BASE    0xFFFFF6FB40000000ULL
-#define PTE_BASE    0xFFFFF68000000000ULL
-#define PXE_TOP     0xFFFFF6FB7DBEDFFFULL
-#define PPE_TOP     0xFFFFF6FB7DBFFFFFULL
-#define PDE_TOP     0xFFFFF6FB7FFFFFFFULL
-#define PTE_TOP     0xFFFFF6FFFFFFFFFFULL
-
-extern NTKERNELAPI PVOID MmHighestUserAddress;
-extern NTKERNELAPI PVOID MmSystemRangeStart;
-extern NTKERNELAPI ULONG_PTR MmUserProbeAddress;
-
-#define MM_HIGHEST_USER_ADDRESS           MmHighestUserAddress
-#define MM_SYSTEM_RANGE_START             MmSystemRangeStart
-#define MM_USER_PROBE_ADDRESS             MmUserProbeAddress
-#define MM_LOWEST_USER_ADDRESS   (PVOID)0x10000
-#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
-#define KI_USER_SHARED_DATA       0xFFFFF78000000000ULL
-
-#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
-#define SharedInterruptTime (&SharedUserData->InterruptTime)
-#define SharedSystemTime (&SharedUserData->SystemTime)
-#define SharedTickCount (&SharedUserData->TickCount)
-
-#define KeQueryInterruptTime() \
-    (*(volatile ULONG64*)SharedInterruptTime)
-#define KeQuerySystemTime(CurrentCount) \
-    *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
-#define KeQueryTickCount(CurrentCount) \
-    *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
-
-typedef struct _KPCR
-{
-    union
-    {
-        NT_TIB NtTib;
-        struct
-        {
-            union _KGDTENTRY64 *GdtBase;
-            struct _KTSS64 *TssBase;
-            ULONG64 UserRsp;
-            struct _KPCR *Self;
-            struct _KPRCB *CurrentPrcb;
-            PKSPIN_LOCK_QUEUE LockArray;
-            PVOID Used_Self;
-        };
-    };
-    union _KIDTENTRY64 *IdtBase;
-    ULONG64 Unused[2];
-    KIRQL Irql;
-    UCHAR SecondLevelCacheAssociativity;
-    UCHAR ObsoleteNumber;
-    UCHAR Fill0;
-    ULONG Unused0[3];
-    USHORT MajorVersion;
-    USHORT MinorVersion;
-    ULONG StallScaleFactor;
-    PVOID Unused1[3];
-    ULONG KernelReserved[15];
-    ULONG SecondLevelCacheSize;
-    ULONG HalReserved[16];
-    ULONG Unused2;
-    PVOID KdVersionBlock;
-    PVOID Unused3;
-    ULONG PcrAlign1[24];
-} KPCR, *PKPCR;
-
-typedef struct _KFLOATING_SAVE {
-  ULONG Dummy;
-} KFLOATING_SAVE, *PKFLOATING_SAVE;
-
-NTKERNELAPI
-PRKTHREAD
-NTAPI
-KeGetCurrentThread(
-    VOID);
-
-FORCEINLINE
-PKPCR
-KeGetPcr(VOID)
-{
-    return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
-}
-
-FORCEINLINE
-ULONG
-KeGetCurrentProcessorNumber(VOID)
-{
-    return (ULONG)__readgsword(0x184);
-}
-
-#elif defined(__PowerPC__)
-
-//
-// Used to contain PFNs and PFN counts
-//
-typedef ULONG PFN_COUNT;
-typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
-typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
-
-#define PASSIVE_LEVEL                      0
-#define LOW_LEVEL                          0
-#define APC_LEVEL                          1
-#define DISPATCH_LEVEL                     2
-#define PROFILE_LEVEL                     27
-#define CLOCK1_LEVEL                      28
-#define CLOCK2_LEVEL                      28
-#define IPI_LEVEL                         29
-#define POWER_LEVEL                       30
-#define HIGH_LEVEL                        31
-
-typedef struct _KFLOATING_SAVE {
-  ULONG Dummy;
-} KFLOATING_SAVE, *PKFLOATING_SAVE;
-
-typedef struct _KPCR_TIB {
-  PVOID  ExceptionList;         /* 00 */
-  PVOID  StackBase;             /* 04 */
-  PVOID  StackLimit;            /* 08 */
-  PVOID  SubSystemTib;          /* 0C */
-  _ANONYMOUS_UNION union {
-    PVOID  FiberData;           /* 10 */
-    ULONG  Version;             /* 10 */
-  } DUMMYUNIONNAME;
-  PVOID  ArbitraryUserPointer;  /* 14 */
-  struct _KPCR_TIB *Self;       /* 18 */
-} KPCR_TIB, *PKPCR_TIB;         /* 1C */
-
-#define PCR_MINOR_VERSION 1
-#define PCR_MAJOR_VERSION 1
-
-typedef struct _KPCR {
-  KPCR_TIB  Tib;                /* 00 */
-  struct _KPCR  *Self;          /* 1C */
-  struct _KPRCB  *Prcb;         /* 20 */
-  KIRQL  Irql;                  /* 24 */
-  ULONG  IRR;                   /* 28 */
-  ULONG  IrrActive;             /* 2C */
-  ULONG  IDR;                   /* 30 */
-  PVOID  KdVersionBlock;        /* 34 */
-  PUSHORT  IDT;                 /* 38 */
-  PUSHORT  GDT;                 /* 3C */
-  struct _KTSS  *TSS;           /* 40 */
-  USHORT  MajorVersion;         /* 44 */
-  USHORT  MinorVersion;         /* 46 */
-  KAFFINITY  SetMember;         /* 48 */
-  ULONG  StallScaleFactor;      /* 4C */
-  UCHAR  SpareUnused;           /* 50 */
-  UCHAR  Number;                /* 51 */
-} KPCR, *PKPCR;                 /* 54 */
-
-#define KeGetPcr()                      PCR
-
-static __inline
-ULONG
-DDKAPI
-KeGetCurrentProcessorNumber(VOID)
-{
-    ULONG Number;
-  __asm__ __volatile__ (
-    "lwz %0, %c1(12)\n"
-    : "=r" (Number)
-    : "i" (FIELD_OFFSET(KPCR, Number))
-  );
-  return Number;
-}
-
-#elif defined(_MIPS_)
-
-#error MIPS Headers are totally incorrect
-
-//
-// Used to contain PFNs and PFN counts
-//
-typedef ULONG PFN_COUNT;
-typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
-typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
-
-#define PASSIVE_LEVEL                      0
-#define APC_LEVEL                          1
-#define DISPATCH_LEVEL                     2
-#define PROFILE_LEVEL                     27
-#define IPI_LEVEL                         29
-#define HIGH_LEVEL                        31
-
-typedef struct _KPCR {
-    struct _KPRCB  *Prcb;         /* 20 */
-    KIRQL  Irql;                  /* 24 */
-    ULONG  IRR;                   /* 28 */
-    ULONG  IDR;                   /* 30 */
-} KPCR, *PKPCR;
-
-#define KeGetPcr()                      PCR
-
-typedef struct _KFLOATING_SAVE {
-} KFLOATING_SAVE, *PKFLOATING_SAVE;
-
-static __inline
-ULONG
-DDKAPI
-KeGetCurrentProcessorNumber(VOID)
-{
-    return 0;
-}
-
-#elif defined(_M_ARM)
-
-//
-// NT-ARM is not documented, need DDK-ARM
-//
-#include <armddk.h>
-
-#else
-#error Unknown architecture
-#endif
-
-#define MM_DONT_ZERO_ALLOCATION             0x00000001
-#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY    0x00000002
-
-    
-#define EFLAG_SIGN                        0x8000
-#define EFLAG_ZERO                        0x4000
-#define EFLAG_SELECT                      (EFLAG_SIGN | EFLAG_ZERO)
-
-#define RESULT_NEGATIVE                   ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
-#define RESULT_ZERO                       ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
-#define RESULT_POSITIVE                   ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
-
-typedef enum _INTERLOCKED_RESULT {
-  ResultNegative = RESULT_NEGATIVE,
-  ResultZero = RESULT_ZERO,
-  ResultPositive = RESULT_POSITIVE
-} INTERLOCKED_RESULT;
-
-typedef VOID
-(NTAPI *PciPin2Line)(
-    IN struct _BUS_HANDLER *BusHandler,
-    IN struct _BUS_HANDLER *RootHandler,
-    IN PCI_SLOT_NUMBER SlotNumber,
-    IN PPCI_COMMON_CONFIG PciData
-);
-
-typedef VOID
-(NTAPI *PciLine2Pin)(
-    IN struct _BUS_HANDLER *BusHandler,
-    IN struct _BUS_HANDLER *RootHandler,
-    IN PCI_SLOT_NUMBER SlotNumber,
-    IN PPCI_COMMON_CONFIG PciNewData,
-    IN PPCI_COMMON_CONFIG PciOldData
-);
-
-typedef VOID
-(NTAPI *PciReadWriteConfig)(
-    IN struct _BUS_HANDLER *BusHandler,
-    IN PCI_SLOT_NUMBER Slot,
-    IN PVOID Buffer,
-    IN ULONG Offset,
-    IN ULONG Length
-);
-
-#define PCI_DATA_TAG ' ICP'
-#define PCI_DATA_VERSION 1
-
-typedef struct _PCIBUSDATA
-{
-    ULONG Tag;
-    ULONG Version;
-    PciReadWriteConfig ReadConfig;
-    PciReadWriteConfig WriteConfig;
-    PciPin2Line Pin2Line;
-    PciLine2Pin Line2Pin;
-    PCI_SLOT_NUMBER ParentSlot;
-    PVOID Reserved[4];
-} PCIBUSDATA, *PPCIBUSDATA;
-
-
-/** SPINLOCK FUNCTIONS ********************************************************/
-
-NTKERNELAPI
-BOOLEAN
-FASTCALL
-KeTryToAcquireSpinLockAtDpcLevel(
-    IN OUT PKSPIN_LOCK SpinLock
-);
-
-NTKERNELAPI
-BOOLEAN
-FASTCALL
-KeTestSpinLock(
-    IN PKSPIN_LOCK SpinLock
-);
-
-#if defined (_X86_)
-
-#if defined(WIN9X_COMPAT_SPINLOCK)
-
-NTKERNELAPI
-VOID
-NTAPI
-KeInitializeSpinLock(
-    IN PKSPIN_LOCK SpinLock
-);
-
-#else
-
-FORCEINLINE
-VOID
-KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
-{
-    /* Clear the lock */
-    *SpinLock = 0;
-}
-
-#endif
-
-NTHALAPI
-KIRQL
-FASTCALL
-KfAcquireSpinLock(
-  IN PKSPIN_LOCK SpinLock);
-
-NTHALAPI
-VOID
-FASTCALL
-KfReleaseSpinLock(
-  IN PKSPIN_LOCK SpinLock,
-  IN KIRQL NewIrql);
-
-NTKERNELAPI
-VOID
-FASTCALL
-KefAcquireSpinLockAtDpcLevel(
-  IN PKSPIN_LOCK  SpinLock);
-
-NTKERNELAPI
-VOID
-FASTCALL
-KefReleaseSpinLockFromDpcLevel(
-  IN PKSPIN_LOCK  SpinLock);
-
-#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
-#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
-#define KeAcquireSpinLock(a,b)  *(b) = KfAcquireSpinLock(a)
-#define KeReleaseSpinLock(a,b)  KfReleaseSpinLock(a,b)
-
-#define KeGetDcacheFillSize() 1L
-    
-#elif defined(_M_ARM) // !defined (_X86_)
-    
-    FORCEINLINE
-    VOID
-    KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock)
-    {
-        /* Clear the lock */
-        *SpinLock = 0;
-    }
-    
-    NTHALAPI
-    KIRQL
-    FASTCALL
-    KfAcquireSpinLock(
-                      IN PKSPIN_LOCK SpinLock);
-    
-    NTHALAPI
-    VOID
-    FASTCALL
-    KfReleaseSpinLock(
-                      IN PKSPIN_LOCK SpinLock,
-                      IN KIRQL NewIrql);
-    
-    
-    NTKERNELAPI
-    VOID
-    FASTCALL
-    KefAcquireSpinLockAtDpcLevel(
-                                 IN PKSPIN_LOCK  SpinLock);
-    
-    NTKERNELAPI
-    VOID
-    FASTCALL
-    KefReleaseSpinLockFromDpcLevel(
-                                   IN PKSPIN_LOCK  SpinLock);
-    
-    
-#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
-#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
-#define KeAcquireSpinLock(a,b)  *(b) = KfAcquireSpinLock(a)
-#define KeReleaseSpinLock(a,b)  KfReleaseSpinLock(a,b)
-    
-    NTKERNELAPI
-    VOID
-    NTAPI
-    KeInitializeSpinLock(
-                         IN PKSPIN_LOCK  SpinLock);
-    
-#else
-    
-FORCEINLINE
-VOID
-NTAPI
-KeInitializeSpinLock(
-  PKSPIN_LOCK SpinLock)
-{
-    *SpinLock = 0;
-}
-
-NTKERNELAPI
-VOID
-KeReleaseSpinLock(
-  IN PKSPIN_LOCK SpinLock,
-  IN KIRQL NewIrql);
-
-NTKERNELAPI
-VOID
-KeAcquireSpinLockAtDpcLevel(
-  IN PKSPIN_LOCK SpinLock);
-
-NTKERNELAPI
-VOID
-KeReleaseSpinLockFromDpcLevel(
-  IN PKSPIN_LOCK SpinLock);
-
-NTKERNELAPI
-KIRQL
-KeAcquireSpinLockRaiseToDpc(
-  IN PKSPIN_LOCK SpinLock);
-
-#define KeAcquireSpinLock(SpinLock, OldIrql) \
-  *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
-    
-#endif // !defined (_X86_)
-
-/*
-** Utillity functions
-*/
-
-#define ARGUMENT_PRESENT(ArgumentPointer) \
-  ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
-
-/*
- * ULONG
- * BYTE_OFFSET(
- *   IN PVOID  Va)
- */
-#define BYTE_OFFSET(Va) \
-  ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
-
-/*
- * ULONG
- * BYTES_TO_PAGES(
- *   IN ULONG  Size)
- */
-#define BYTES_TO_PAGES(Size) \
-  ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
-
-/*
- * PVOID
- * PAGE_ALIGN(
- *   IN PVOID  Va)
- */
-#define PAGE_ALIGN(Va) \
-  ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
-
-/*
- * ULONG_PTR
- * ROUND_TO_PAGES(
- *   IN ULONG_PTR  Size)
- */
-#define ROUND_TO_PAGES(Size) \
-  ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
-
-
-
-#if defined(_X86_) || defined(_AMD64_)
-
-//
-// x86 and x64 performs a 0x2C interrupt
-//
-#define DbgRaiseAssertionFailure __int2c
-
-#elif defined(_ARM_)
-
-//
-// TODO
-//
-
-#else
-#error Unsupported Architecture
-#endif
-
-#if DBG
-
-#define ASSERT(exp) \
-  (VOID)((!(exp)) ? \
-    RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
-
-#define ASSERTMSG(msg, exp) \
-  (VOID)((!(exp)) ? \
-    RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
-
-#define RTL_SOFT_ASSERT(exp) \
-  (VOID)((!(exp)) ? \
-    DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
-
-#define RTL_SOFT_ASSERTMSG(msg, exp) \
-  (VOID)((!(exp)) ? \
-    DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n   Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
-
-#define RTL_VERIFY(exp) ASSERT(exp)
-#define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
-
-#define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
-#define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
-
-#if defined(_MSC_VER)
-
-#define NT_ASSERT(exp) \
-   ((!(exp)) ? \
-      (__annotation(L"Debug", L"AssertFail", L#exp), \
-       DbgRaiseAssertionFailure(), FALSE) : TRUE)
-
-#define NT_ASSERTMSG(msg, exp) \
-   ((!(exp)) ? \
-      (__annotation(L"Debug", L"AssertFail", L##msg), \
-      DbgRaiseAssertionFailure(), FALSE) : TRUE)
-
-#define NT_ASSERTMSGW(msg, exp) \
-    ((!(exp)) ? \
-        (__annotation(L"Debug", L"AssertFail", msg), \
-         DbgRaiseAssertionFailure(), FALSE) : TRUE)
-
-#else
-
-//
-// GCC doesn't support __annotation (nor PDB)
-//
-#define NT_ASSERT(exp) \
-   (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
-
-#define NT_ASSERTMSG NT_ASSERT
-#define NT_ASSERTMSGW NT_ASSERT
-
-#endif
-
-#else /* !DBG */
-
-#define ASSERT(exp) ((VOID) 0)
-#define ASSERTMSG(msg, exp) ((VOID) 0)
-
-#define RTL_SOFT_ASSERT(exp) ((VOID) 0)
-#define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
-
-#define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
-#define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
-
-#define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
-#define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
-
-#define NT_ASSERT(exp)     ((VOID)0)
-#define NT_ASSERTMSG(exp)  ((VOID)0)
-#define NT_ASSERTMSGW(exp) ((VOID)0)
-
-#endif /* DBG */
-
-/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
-#if defined(_NTSYSTEM_) || defined(__GNUC__)
-#define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
-#define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
-#else
-#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
-#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
-#endif /* _NT_SYSTEM */
-
-extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
-extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
-
-/*
-** Driver support routines
-*/
-
-/** Runtime library routines **/
-
-static __inline VOID
-InitializeListHead(
-  IN PLIST_ENTRY  ListHead)
-{
-  ListHead->Flink = ListHead->Blink = ListHead;
-}
-
-static __inline VOID
-InsertHeadList(
-  IN PLIST_ENTRY  ListHead,
-  IN PLIST_ENTRY  Entry)
-{
-  PLIST_ENTRY OldFlink;
-  OldFlink = ListHead->Flink;
-  Entry->Flink = OldFlink;
-  Entry->Blink = ListHead;
-  OldFlink->Blink = Entry;
-  ListHead->Flink = Entry;
-}
-
-static __inline VOID
-InsertTailList(
-  IN PLIST_ENTRY  ListHead,
-  IN PLIST_ENTRY  Entry)
-{
-  PLIST_ENTRY OldBlink;
-  OldBlink = ListHead->Blink;
-  Entry->Flink = ListHead;
-  Entry->Blink = OldBlink;
-  OldBlink->Flink = Entry;
-  ListHead->Blink = Entry;
-}
-
-/*
- * BOOLEAN
- * IsListEmpty(
- *   IN PLIST_ENTRY  ListHead)
- */
-#define IsListEmpty(_ListHead) \
-  ((_ListHead)->Flink == (_ListHead))
-
-/*
- * PSINGLE_LIST_ENTRY
- * PopEntryList(
- *   IN PSINGLE_LIST_ENTRY  ListHead)
- */
-#define PopEntryList(ListHead) \
-  (ListHead)->Next; \
-  { \
-    PSINGLE_LIST_ENTRY _FirstEntry; \
-    _FirstEntry = (ListHead)->Next; \
-    if (_FirstEntry != NULL) \
-      (ListHead)->Next = _FirstEntry->Next; \
-  }
-
-/*
- * VOID
- * PushEntryList(
- *   IN PSINGLE_LIST_ENTRY  ListHead,
- *   IN PSINGLE_LIST_ENTRY  Entry)
- */
-#define PushEntryList(_ListHead, _Entry) \
-       (_Entry)->Next = (_ListHead)->Next; \
-       (_ListHead)->Next = (_Entry); \
-
-static __inline BOOLEAN
-RemoveEntryList(
-  IN PLIST_ENTRY  Entry)
-{
-  PLIST_ENTRY OldFlink;
-  PLIST_ENTRY OldBlink;
-
-  OldFlink = Entry->Flink;
-  OldBlink = Entry->Blink;
-  OldFlink->Blink = OldBlink;
-  OldBlink->Flink = OldFlink;
-  return (BOOLEAN)(OldFlink == OldBlink);
-}
-
-static __inline PLIST_ENTRY
-RemoveHeadList(
-  IN PLIST_ENTRY  ListHead)
-{
-  PLIST_ENTRY Flink;
-  PLIST_ENTRY Entry;
-
-  Entry = ListHead->Flink;
-  Flink = Entry->Flink;
-  ListHead->Flink = Flink;
-  Flink->Blink = ListHead;
-  return Entry;
-}
-
-static __inline PLIST_ENTRY
-RemoveTailList(
-  IN PLIST_ENTRY  ListHead)
-{
-  PLIST_ENTRY Blink;
-  PLIST_ENTRY Entry;
-
-  Entry = ListHead->Blink;
-  Blink = Entry->Blink;
-  ListHead->Blink = Blink;
-  Blink->Flink = ListHead;
-  return Entry;
-}
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCharToInteger(
-  IN PCSZ  String,
-  IN ULONG  Base  OPTIONAL,
-  IN OUT PULONG  Value);
-
-NTSYSAPI
-LONG
-NTAPI
-RtlCompareString(
-  IN PSTRING  String1,
-  IN PSTRING  String2,
-  BOOLEAN  CaseInSensitive);
-
-#if !defined(MIDL_PASS)
-
-FORCEINLINE
-LUID
-NTAPI
-RtlConvertLongToLuid(
-    IN LONG Val)
-{
-    LUID Luid;
-    LARGE_INTEGER Temp;
-
-    Temp.QuadPart = Val;
-    Luid.LowPart = Temp.u.LowPart;
-    Luid.HighPart = Temp.u.HighPart;
-
-    return Luid;
-}
-
-FORCEINLINE
-LUID
-NTAPI
-RtlConvertUlongToLuid(
-    IN ULONG Val)
-{
-    LUID Luid;
-
-    Luid.LowPart = Val;
-    Luid.HighPart = 0;
-
-    return Luid;
-}
-#endif
-
-
-NTSYSAPI
-VOID
-NTAPI
-RtlCopyMemory32(
-  IN VOID UNALIGNED  *Destination,
-  IN CONST VOID UNALIGNED  *Source,
-  IN ULONG  Length);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlCopyString(
-  IN OUT PSTRING  DestinationString,
-  IN PSTRING  SourceString  OPTIONAL);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlEqualString(
-  IN PSTRING  String1,
-  IN PSTRING  String2,
-  IN BOOLEAN  CaseInSensitive);
-
-#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
-#define RtlGetCallersAddress(CallersAddress, CallersCaller) \
-    *CallersAddress = (PVOID)_ReturnAddress(); \
-    *CallersCaller = NULL;
-#else
-NTSYSAPI
-VOID
-NTAPI
-RtlGetCallersAddress(
-  OUT PVOID  *CallersAddress,
-  OUT PVOID  *CallersCaller);
-#endif
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetVersion(
-  IN OUT PRTL_OSVERSIONINFOW  lpVersionInformation);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlMapGenericMask(
-  IN OUT PACCESS_MASK  AccessMask,
-  IN PGENERIC_MAPPING  GenericMapping);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlPrefixUnicodeString(
-  IN PCUNICODE_STRING  String1,
-  IN PCUNICODE_STRING  String2,
-  IN BOOLEAN  CaseInSensitive);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUpcaseUnicodeString(
-  IN OUT PUNICODE_STRING  DestinationString  OPTIONAL,
-  IN PCUNICODE_STRING  SourceString,
-  IN BOOLEAN  AllocateDestinationString);
-
-NTSYSAPI
-CHAR
-NTAPI
-RtlUpperChar(
-  IN CHAR Character);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlUpperString(
-  IN OUT PSTRING  DestinationString,
-  IN PSTRING  SourceString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlVerifyVersionInfo(
-  IN PRTL_OSVERSIONINFOEXW  VersionInfo,
-  IN ULONG  TypeMask,
-  IN ULONGLONG  ConditionMask);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlVolumeDeviceToDosName(
-  IN PVOID  VolumeDeviceObject,
-  OUT PUNICODE_STRING  DosName);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlWalkFrameChain(
-  OUT PVOID  *Callers,
-  IN ULONG  Count,
-  IN ULONG  Flags);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeAreAllApcsDisabled(
-    VOID
-);
-
-/* Guarded Mutex routines */
-
-NTKERNELAPI
-VOID
-FASTCALL
-KeAcquireGuardedMutex(
-    IN OUT PKGUARDED_MUTEX GuardedMutex
-);
-
-NTKERNELAPI
-VOID
-FASTCALL
-KeAcquireGuardedMutexUnsafe(
-    IN OUT PKGUARDED_MUTEX GuardedMutex
-);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeEnterGuardedRegion(
-    VOID
-);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeLeaveGuardedRegion(
-    VOID
-);
-
-NTKERNELAPI
-VOID
-FASTCALL
-KeInitializeGuardedMutex(
-    OUT PKGUARDED_MUTEX GuardedMutex
-);
-
-NTKERNELAPI
-VOID
-FASTCALL
-KeReleaseGuardedMutexUnsafe(
-    IN OUT PKGUARDED_MUTEX GuardedMutex
-);
-
-NTKERNELAPI
-VOID
-FASTCALL
-KeReleaseGuardedMutex(
-    IN OUT PKGUARDED_MUTEX GuardedMutex
-);
-
-NTKERNELAPI
-BOOLEAN
-FASTCALL
-KeTryToAcquireGuardedMutex(
-    IN OUT PKGUARDED_MUTEX GuardedMutex
-);
-
-/* Fast Mutex */
-#define ExInitializeFastMutex(_FastMutex) \
-{ \
-    (_FastMutex)->Count = FM_LOCK_BIT; \
-    (_FastMutex)->Owner = NULL; \
-    (_FastMutex)->Contention = 0; \
-    KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
-}
-
-NTKERNELAPI
-VOID
-NTAPI
-KeInitializeEvent(
-  IN PRKEVENT  Event,
-  IN EVENT_TYPE  Type,
-  IN BOOLEAN  State);
-
-/******************************************************************************
- *                            Executive Types                                 *
- ******************************************************************************/
-
-typedef struct _ZONE_SEGMENT_HEADER {
-  SINGLE_LIST_ENTRY  SegmentList;
-  PVOID  Reserved;
-} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
-
-typedef struct _ZONE_HEADER {
-  SINGLE_LIST_ENTRY  FreeList;
-  SINGLE_LIST_ENTRY  SegmentList;
-  ULONG  BlockSize;
-  ULONG  TotalSegmentSize;
-} ZONE_HEADER, *PZONE_HEADER;
-
-#define PROTECTED_POOL                    0x80000000
-
-/******************************************************************************
- *                          Executive Functions                               *
- ******************************************************************************/
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExExtendZone(
-  IN PZONE_HEADER  Zone,
-  IN PVOID  Segment,
-  IN ULONG  SegmentSize);
-
-static __inline PVOID
-ExAllocateFromZone(
-  IN PZONE_HEADER  Zone)
-{
-  if (Zone->FreeList.Next)
-    Zone->FreeList.Next = Zone->FreeList.Next->Next;
-  return (PVOID) Zone->FreeList.Next;
-}
-
-static __inline PVOID
-ExFreeToZone(
-  IN PZONE_HEADER  Zone,
-  IN PVOID  Block)
-{
-  ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
-  Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
-  return ((PSINGLE_LIST_ENTRY) Block)->Next;
-}
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExInitializeZone(
-  IN PZONE_HEADER  Zone,
-  IN ULONG  BlockSize,
-  IN PVOID  InitialSegment,
-  IN ULONG  InitialSegmentSize);
-
-/*
- * PVOID
- * ExInterlockedAllocateFromZone(
- *   IN PZONE_HEADER  Zone,
- *   IN PKSPIN_LOCK  Lock)
- */
-#define ExInterlockedAllocateFromZone(Zone, Lock) \
-    ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExInterlockedExtendZone(
-  IN PZONE_HEADER  Zone,
-  IN PVOID  Segment,
-  IN ULONG  SegmentSize,
-  IN PKSPIN_LOCK  Lock);
-
-/* PVOID
- * ExInterlockedFreeToZone(
- *  IN PZONE_HEADER  Zone,
- *  IN PVOID  Block,
- *  IN PKSPIN_LOCK  Lock);
- */
-#define ExInterlockedFreeToZone(Zone, Block, Lock) \
-    ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
-
-/*
- * VOID
- * InitializeSListHead(
- *   IN PSLIST_HEADER  SListHead)
- */
-#define InitializeSListHead(_SListHead) \
-       (_SListHead)->Alignment = 0
-
-#define ExInitializeSListHead InitializeSListHead
-
-/*
- * BOOLEAN
- * ExIsFullZone(
- *  IN PZONE_HEADER  Zone)
- */
-#define ExIsFullZone(Zone) \
-  ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
-
-/* BOOLEAN
- * ExIsObjectInFirstZoneSegment(
- *     IN PZONE_HEADER Zone,
- *     IN PVOID Object);
- */
-#define ExIsObjectInFirstZoneSegment(Zone,Object) \
-    ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
-                ((PUCHAR)(Object) <  (PUCHAR)(Zone)->SegmentList.Next + \
-                         (Zone)->TotalSegmentSize)) )
-
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
-NTAPI
-ExRaiseAccessViolation(
-  VOID);
-
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
-NTAPI
-ExRaiseDatatypeMisalignment(
-  VOID);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExUuidCreate(
-  OUT UUID  *Uuid);
-
-#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
-#define ExAcquireResourceShared ExAcquireResourceSharedLite
-#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
-#define ExDeleteResource ExDeleteResourceLite
-#define ExInitializeResource ExInitializeResourceLite
-#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
-#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
-#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
-#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
-
-
-#if DBG
-
-#define PAGED_CODE() { \
-  if (KeGetCurrentIrql() > APC_LEVEL) { \
-    KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
-    ASSERT(FALSE); \
-  } \
-}
-
-#else
-
-#define PAGED_CODE()
-
-#endif
-
-NTKERNELAPI
-VOID
-NTAPI
-ProbeForRead(
-  IN CONST VOID  *Address,
-  IN SIZE_T  Length,
-  IN ULONG  Alignment);
-
-NTKERNELAPI
-VOID
-NTAPI
-ProbeForWrite(
-  IN PVOID  Address,
-  IN SIZE_T  Length,
-  IN ULONG  Alignment);
-
-
-
-/** Configuration manager routines **/
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-CmRegisterCallback(
-  IN PEX_CALLBACK_FUNCTION  Function,
-  IN PVOID  Context,
-  IN OUT PLARGE_INTEGER  Cookie);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-CmUnRegisterCallback(
-  IN LARGE_INTEGER  Cookie);
-
-
-
-/** Filesystem runtime library routines **/
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-FsRtlIsTotalDeviceFailure(
-  IN NTSTATUS  Status);
-
-
-
-/** Hardware abstraction layer routines **/
-
-NTHALAPI
-BOOLEAN
-NTAPI
-HalMakeBeep(
-  IN ULONG Frequency);
-
-NTKERNELAPI
-VOID
-FASTCALL
-HalExamineMBR(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  SectorSize,
-  IN ULONG  MBRTypeIdentifier,
-  OUT PVOID  *Buffer);
-
-VOID
-NTAPI
-HalPutDmaAdapter(
-    PADAPTER_OBJECT AdapterObject
-);
-
-
-/** Io access routines **/
-
-#if !defined(_M_AMD64)
-NTHALAPI
-VOID
-NTAPI
-READ_PORT_BUFFER_UCHAR(
-  IN PUCHAR  Port,
-  IN PUCHAR  Buffer,
-  IN ULONG  Count);
-
-NTHALAPI
-VOID
-NTAPI
-READ_PORT_BUFFER_ULONG(
-  IN PULONG  Port,
-  IN PULONG  Buffer,
-  IN ULONG  Count);
-
-NTHALAPI
-VOID
-NTAPI
-READ_PORT_BUFFER_USHORT(
-  IN PUSHORT  Port,
-  IN PUSHORT  Buffer,
-  IN ULONG  Count);
-
-NTHALAPI
-UCHAR
-NTAPI
-READ_PORT_UCHAR(
-  IN PUCHAR  Port);
-
-NTHALAPI
-ULONG
-NTAPI
-READ_PORT_ULONG(
-  IN PULONG  Port);
-
-NTHALAPI
-USHORT
-NTAPI
-READ_PORT_USHORT(
-  IN PUSHORT  Port);
-
-NTKERNELAPI
-VOID
-NTAPI
-READ_REGISTER_BUFFER_UCHAR(
-  IN PUCHAR  Register,
-  IN PUCHAR  Buffer,
-  IN ULONG  Count);
-
-NTKERNELAPI
-VOID
-NTAPI
-READ_REGISTER_BUFFER_ULONG(
-  IN PULONG  Register,
-  IN PULONG  Buffer,
-  IN ULONG  Count);
-
-NTKERNELAPI
-VOID
-NTAPI
-READ_REGISTER_BUFFER_USHORT(
-  IN PUSHORT  Register,
-  IN PUSHORT  Buffer,
-  IN ULONG  Count);
-
-NTKERNELAPI
-UCHAR
-NTAPI
-READ_REGISTER_UCHAR(
-  IN PUCHAR  Register);
-
-NTKERNELAPI
-ULONG
-NTAPI
-READ_REGISTER_ULONG(
-  IN PULONG  Register);
-
-NTKERNELAPI
-USHORT
-NTAPI
-READ_REGISTER_USHORT(
-  IN PUSHORT  Register);
-
-NTHALAPI
-VOID
-NTAPI
-WRITE_PORT_BUFFER_UCHAR(
-  IN PUCHAR  Port,
-  IN PUCHAR  Buffer,
-  IN ULONG  Count);
-
-NTHALAPI
-VOID
-NTAPI
-WRITE_PORT_BUFFER_ULONG(
-  IN PULONG  Port,
-  IN PULONG  Buffer,
-  IN ULONG  Count);
-
-NTHALAPI
-VOID
-NTAPI
-WRITE_PORT_BUFFER_USHORT(
-  IN PUSHORT  Port,
-  IN PUSHORT  Buffer,
-  IN ULONG  Count);
-
-NTHALAPI
-VOID
-NTAPI
-WRITE_PORT_UCHAR(
-  IN PUCHAR  Port,
-  IN UCHAR  Value);
-
-NTHALAPI
-VOID
-NTAPI
-WRITE_PORT_ULONG(
-  IN PULONG  Port,
-  IN ULONG  Value);
-
-NTHALAPI
-VOID
-NTAPI
-WRITE_PORT_USHORT(
-  IN PUSHORT  Port,
-  IN USHORT  Value);
-
-NTKERNELAPI
-VOID
-NTAPI
-WRITE_REGISTER_BUFFER_UCHAR(
-  IN PUCHAR  Register,
-  IN PUCHAR  Buffer,
-  IN ULONG  Count);
-
-NTKERNELAPI
-VOID
-NTAPI
-WRITE_REGISTER_BUFFER_ULONG(
-  IN PULONG  Register,
-  IN PULONG  Buffer,
-  IN ULONG  Count);
-
-NTKERNELAPI
-VOID
-NTAPI
-WRITE_REGISTER_BUFFER_USHORT(
-  IN PUSHORT  Register,
-  IN PUSHORT  Buffer,
-  IN ULONG  Count);
-
-NTKERNELAPI
-VOID
-NTAPI
-WRITE_REGISTER_UCHAR(
-  IN PUCHAR  Register,
-  IN UCHAR  Value);
-
-NTKERNELAPI
-VOID
-NTAPI
-WRITE_REGISTER_ULONG(
-  IN PULONG  Register,
-  IN ULONG  Value);
-
-NTKERNELAPI
-VOID
-NTAPI
-WRITE_REGISTER_USHORT(
-  IN PUSHORT  Register,
-  IN USHORT  Value);
-
-#else
-
-FORCEINLINE
-VOID
-READ_PORT_BUFFER_UCHAR(
-  IN PUCHAR  Port,
-  IN PUCHAR  Buffer,
-  IN ULONG  Count)
-{
-    __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
-}
-
-FORCEINLINE
-VOID
-READ_PORT_BUFFER_ULONG(
-  IN PULONG  Port,
-  IN PULONG  Buffer,
-  IN ULONG  Count)
-{
-    __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
-}
-
-FORCEINLINE
-VOID
-READ_PORT_BUFFER_USHORT(
-  IN PUSHORT  Port,
-  IN PUSHORT  Buffer,
-  IN ULONG  Count)
-{
-    __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
-}
-
-FORCEINLINE
-UCHAR
-READ_PORT_UCHAR(
-  IN PUCHAR  Port)
-{
-    return __inbyte((USHORT)(ULONG_PTR)Port);
-}
-
-FORCEINLINE
-ULONG
-READ_PORT_ULONG(
-  IN PULONG  Port)
-{
-    return __indword((USHORT)(ULONG_PTR)Port);
-}
-
-FORCEINLINE
-USHORT
-READ_PORT_USHORT(
-  IN PUSHORT  Port)
-{
-    return __inword((USHORT)(ULONG_PTR)Port);
-}
-
-FORCEINLINE
-VOID
-READ_REGISTER_BUFFER_UCHAR(
-  IN PUCHAR  Register,
-  IN PUCHAR  Buffer,
-  IN ULONG  Count)
-{
-    __movsb(Register, Buffer, Count);
-}
-
-FORCEINLINE
-VOID
-READ_REGISTER_BUFFER_ULONG(
-  IN PULONG  Register,
-  IN PULONG  Buffer,
-  IN ULONG  Count)
-{
-    __movsd(Register, Buffer, Count);
-}
-
-FORCEINLINE
-VOID
-READ_REGISTER_BUFFER_USHORT(
-  IN PUSHORT  Register,
-  IN PUSHORT  Buffer,
-  IN ULONG  Count)
-{
-    __movsw(Register, Buffer, Count);
-}
-
-FORCEINLINE
-UCHAR
-READ_REGISTER_UCHAR(
-  IN PUCHAR Register)
-{
-    return *Register;
-}
-
-FORCEINLINE
-ULONG
-READ_REGISTER_ULONG(
-  IN PULONG Register)
-{
-    return *Register;
-}
-
-FORCEINLINE
-USHORT
-READ_REGISTER_USHORT(
-  IN PUSHORT Register)
-{
-    return *Register;
-}
-
-FORCEINLINE
-VOID
-WRITE_PORT_BUFFER_UCHAR(
-  IN PUCHAR  Port,
-  IN PUCHAR  Buffer,
-  IN ULONG  Count)
-{
-    __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
-}
-
-FORCEINLINE
-VOID
-WRITE_PORT_BUFFER_ULONG(
-  IN PULONG  Port,
-  IN PULONG  Buffer,
-  IN ULONG  Count)
-{
-    __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
-}
-
-FORCEINLINE
-VOID
-WRITE_PORT_BUFFER_USHORT(
-  IN PUSHORT  Port,
-  IN PUSHORT  Buffer,
-  IN ULONG  Count)
-{
-    __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
-}
-
-FORCEINLINE
-VOID
-WRITE_PORT_UCHAR(
-  IN PUCHAR  Port,
-  IN UCHAR  Value)
-{
-    __outbyte((USHORT)(ULONG_PTR)Port, Value);
-}
-
-FORCEINLINE
-VOID
-WRITE_PORT_ULONG(
-  IN PULONG  Port,
-  IN ULONG  Value)
-{
-    __outdword((USHORT)(ULONG_PTR)Port, Value);
-}
-
-FORCEINLINE
-VOID
-WRITE_PORT_USHORT(
-  IN PUSHORT  Port,
-  IN USHORT  Value)
-{
-    __outword((USHORT)(ULONG_PTR)Port, Value);
-}
-
-FORCEINLINE
-VOID
-WRITE_REGISTER_BUFFER_UCHAR(
-  IN PUCHAR  Register,
-  IN PUCHAR  Buffer,
-  IN ULONG  Count)
-{
-    LONG Synch;
-    __movsb(Register, Buffer, Count);
-    InterlockedOr(&Synch, 1);
-}
-
-FORCEINLINE
-VOID
-WRITE_REGISTER_BUFFER_ULONG(
-  IN PULONG  Register,
-  IN PULONG  Buffer,
-  IN ULONG  Count)
-{
-    LONG Synch;
-    __movsd(Register, Buffer, Count);
-    InterlockedOr(&Synch, 1);
-}
-
-FORCEINLINE
-VOID
-WRITE_REGISTER_BUFFER_USHORT(
-  IN PUSHORT  Register,
-  IN PUSHORT  Buffer,
-  IN ULONG  Count)
-{
-    LONG Synch;
-    __movsw(Register, Buffer, Count);
-    InterlockedOr(&Synch, 1);
-}
-
-FORCEINLINE
-VOID
-WRITE_REGISTER_UCHAR(
-  IN PUCHAR  Register,
-  IN UCHAR  Value)
-{
-    LONG Synch;
-    *Register = Value;
-    InterlockedOr(&Synch, 1);
-}
-
-FORCEINLINE
-VOID
-WRITE_REGISTER_ULONG(
-  IN PULONG  Register,
-  IN ULONG  Value)
-{
-    LONG Synch;
-    *Register = Value;
-    InterlockedOr(&Synch, 1);
-}
-
-FORCEINLINE
-VOID
-WRITE_REGISTER_USHORT(
-  IN PUSHORT  Register,
-  IN USHORT  Value)
-{
-       LONG Sync;
-       *Register = Value;
-       InterlockedOr(&Sync, 1);
-}
-
-#endif
-
-/** I/O manager routines **/
-
-NTKERNELAPI
-VOID
-NTAPI
-IoAcquireCancelSpinLock(
-  OUT PKIRQL  Irql);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAcquireRemoveLockEx(
-  IN PIO_REMOVE_LOCK  RemoveLock,
-  IN OPTIONAL PVOID  Tag  OPTIONAL,
-  IN PCSTR  File,
-  IN ULONG  Line,
-  IN ULONG  RemlockSize);
-
-/*
- * NTSTATUS
- * IoAcquireRemoveLock(
- *   IN PIO_REMOVE_LOCK  RemoveLock,
- *   IN OPTIONAL PVOID  Tag)
- */
-#define IoAcquireRemoveLock(_RemoveLock, \
-                            _Tag) \
-  IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
-
-/*
- * VOID
- * IoAdjustPagingPathCount(
- *   IN PLONG  Count,
- *   IN BOOLEAN  Increment)
- */
-#define IoAdjustPagingPathCount(_Count, \
-                                _Increment) \
-{ \
-  if (_Increment) \
-    { \
-      InterlockedIncrement(_Count); \
-    } \
-  else \
-    { \
-      InterlockedDecrement(_Count); \
-    } \
-}
-
-#ifndef DMA_MACROS_DEFINED
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAllocateAdapterChannel(
-    IN PADAPTER_OBJECT AdapterObject,
-    IN PDEVICE_OBJECT DeviceObject,
-    IN ULONG NumberOfMapRegisters,
-    IN PDRIVER_CONTROL ExecutionRoutine,
-    IN PVOID Context);
-#endif
-
-NTKERNELAPI
-VOID
-NTAPI
-IoAllocateController(
-  IN PCONTROLLER_OBJECT  ControllerObject,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PDRIVER_CONTROL  ExecutionRoutine,
-  IN PVOID  Context);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAllocateDriverObjectExtension(
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PVOID  ClientIdentificationAddress,
-  IN ULONG  DriverObjectExtensionSize,
-  OUT PVOID  *DriverObjectExtension);
-
-NTKERNELAPI
-PVOID
-NTAPI
-IoAllocateErrorLogEntry(
-  IN PVOID  IoObject,
-  IN UCHAR  EntrySize);
-
-NTKERNELAPI
-PIRP
-NTAPI
-IoAllocateIrp(
-  IN CCHAR  StackSize,
-  IN BOOLEAN  ChargeQuota);
-
-NTKERNELAPI
-PMDL
-NTAPI
-IoAllocateMdl(
-  IN PVOID  VirtualAddress,
-  IN ULONG  Length,
-  IN BOOLEAN  SecondaryBuffer,
-  IN BOOLEAN  ChargeQuota,
-  IN OUT PIRP  Irp  OPTIONAL);
-
-NTKERNELAPI
-PIO_WORKITEM
-NTAPI
-IoAllocateWorkItem(
-  IN PDEVICE_OBJECT  DeviceObject);
-
-/*
- * VOID IoAssignArcName(
- *   IN PUNICODE_STRING  ArcName,
- *   IN PUNICODE_STRING  DeviceName);
- */
-#define IoAssignArcName(_ArcName, _DeviceName) ( \
-  IoCreateSymbolicLink((_ArcName), (_DeviceName)))
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAttachDevice(
-  IN PDEVICE_OBJECT  SourceDevice,
-  IN PUNICODE_STRING  TargetDevice,
-  OUT PDEVICE_OBJECT  *AttachedDevice);
-
-NTKERNELAPI
-PDEVICE_OBJECT
-NTAPI
-IoAttachDeviceToDeviceStack(
-  IN PDEVICE_OBJECT  SourceDevice,
-  IN PDEVICE_OBJECT  TargetDevice);
-
-NTKERNELAPI
-PIRP
-NTAPI
-IoBuildAsynchronousFsdRequest(
-  IN ULONG  MajorFunction,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN OUT PVOID  Buffer  OPTIONAL,
-  IN ULONG  Length  OPTIONAL,
-  IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
-  IN PIO_STATUS_BLOCK  IoStatusBlock  OPTIONAL);
-
-NTKERNELAPI
-PIRP
-NTAPI
-IoBuildDeviceIoControlRequest(
-  IN ULONG  IoControlCode,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PVOID  InputBuffer  OPTIONAL,
-  IN ULONG  InputBufferLength,
-  OUT PVOID  OutputBuffer  OPTIONAL,
-  IN ULONG  OutputBufferLength,
-  IN BOOLEAN  InternalDeviceIoControl,
-  IN PKEVENT  Event,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoBuildPartialMdl(
-  IN PMDL  SourceMdl,
-  IN OUT PMDL  TargetMdl,
-  IN PVOID  VirtualAddress,
-  IN ULONG  Length);
-
-NTKERNELAPI
-PIRP
-NTAPI
-IoBuildSynchronousFsdRequest(
-  IN ULONG  MajorFunction,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN OUT PVOID  Buffer  OPTIONAL,
-  IN ULONG  Length  OPTIONAL,
-  IN PLARGE_INTEGER  StartingOffset  OPTIONAL,
-  IN PKEVENT  Event,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock);
-
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IofCallDriver(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN OUT PIRP  Irp);
-
-/*
- * NTSTATUS
- * IoCallDriver(
- *   IN PDEVICE_OBJECT  DeviceObject,
- *   IN OUT PIRP  Irp)
- */
-#define IoCallDriver IofCallDriver
-
-NTKERNELAPI
-VOID
-NTAPI
-IoCancelFileOpen(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PFILE_OBJECT  FileObject);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoCancelIrp(
-  IN PIRP  Irp);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCheckShareAccess(
-  IN ACCESS_MASK  DesiredAccess,
-  IN ULONG  DesiredShareAccess,
-  IN OUT PFILE_OBJECT  FileObject,
-  IN OUT PSHARE_ACCESS  ShareAccess,
-  IN BOOLEAN  Update);
-
-NTKERNELAPI
-VOID
-FASTCALL
-IofCompleteRequest(
-  IN PIRP  Irp,
-  IN CCHAR  PriorityBoost);
-
-/*
- * VOID
- * IoCompleteRequest(
- *  IN PIRP  Irp,
- *  IN CCHAR  PriorityBoost)
- */
-#define IoCompleteRequest IofCompleteRequest
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoConnectInterrupt(
-  OUT PKINTERRUPT  *InterruptObject,
-  IN PKSERVICE_ROUTINE  ServiceRoutine,
-  IN PVOID  ServiceContext,
-  IN PKSPIN_LOCK  SpinLock  OPTIONAL,
-  IN ULONG  Vector,
-  IN KIRQL  Irql,
-  IN KIRQL  SynchronizeIrql,
-  IN KINTERRUPT_MODE    InterruptMode,
-  IN BOOLEAN  ShareVector,
-  IN KAFFINITY  ProcessorEnableMask,
-  IN BOOLEAN  FloatingSave);
-
-/*
- * PIO_STACK_LOCATION
- * IoGetCurrentIrpStackLocation(
- *   IN PIRP  Irp)
- */
-#define IoGetCurrentIrpStackLocation(_Irp) \
-  ((_Irp)->Tail.Overlay.CurrentStackLocation)
-
-/*
- * PIO_STACK_LOCATION
- * IoGetNextIrpStackLocation(
- *   IN PIRP  Irp)
- */
-#define IoGetNextIrpStackLocation(_Irp) \
-  ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
-
-/*
- * VOID
- * IoCopyCurrentIrpStackLocationToNext(
- *   IN PIRP  Irp)
- */
-#define IoCopyCurrentIrpStackLocationToNext(_Irp) \
-{ \
-  PIO_STACK_LOCATION _IrpSp; \
-  PIO_STACK_LOCATION _NextIrpSp; \
-  _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
-  _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
-  RtlCopyMemory(_NextIrpSp, _IrpSp, \
-    FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
-  _NextIrpSp->Control = 0; \
-}
-
-NTKERNELAPI
-PCONTROLLER_OBJECT
-NTAPI
-IoCreateController(
-  IN ULONG  Size);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCreateDevice(
-  IN PDRIVER_OBJECT  DriverObject,
-  IN ULONG  DeviceExtensionSize,
-  IN PUNICODE_STRING  DeviceName  OPTIONAL,
-  IN DEVICE_TYPE  DeviceType,
-  IN ULONG  DeviceCharacteristics,
-  IN BOOLEAN  Exclusive,
-  OUT PDEVICE_OBJECT  *DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCreateDisk(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PCREATE_DISK  Disk);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCreateFile(
-  OUT PHANDLE FileHandle,
-  IN ACCESS_MASK DesiredAccess,
-  IN POBJECT_ATTRIBUTES ObjectAttributes,
-  OUT PIO_STATUS_BLOCK IoStatusBlock,
-  IN PLARGE_INTEGER AllocationSize OPTIONAL,
-  IN ULONG FileAttributes,
-  IN ULONG ShareAccess,
-  IN ULONG Disposition,
-  IN ULONG CreateOptions,
-  IN PVOID EaBuffer OPTIONAL,
-  IN ULONG EaLength,
-  IN CREATE_FILE_TYPE CreateFileType,
-  IN PVOID ExtraCreateParameters OPTIONAL,
-  IN ULONG Options);
-
-NTKERNELAPI
-PKEVENT
-NTAPI
-IoCreateNotificationEvent(
-  IN PUNICODE_STRING  EventName,
-  OUT PHANDLE  EventHandle);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCreateSymbolicLink(
-  IN PUNICODE_STRING  SymbolicLinkName,
-  IN PUNICODE_STRING  DeviceName);
-
-NTKERNELAPI
-PKEVENT
-NTAPI
-IoCreateSynchronizationEvent(
-  IN PUNICODE_STRING  EventName,
-  OUT PHANDLE  EventHandle);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCreateUnprotectedSymbolicLink(
-  IN PUNICODE_STRING  SymbolicLinkName,
-  IN PUNICODE_STRING  DeviceName);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCsqInitialize(
-  PIO_CSQ  Csq,
-  IN PIO_CSQ_INSERT_IRP  CsqInsertIrp,
-  IN PIO_CSQ_REMOVE_IRP  CsqRemoveIrp,
-  IN PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp,
-  IN PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock,
-  IN PIO_CSQ_RELEASE_LOCK  CsqReleaseLock,
-  IN PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoCsqInsertIrp(
-  IN  PIO_CSQ  Csq,
-  IN  PIRP  Irp,
-  IN  PIO_CSQ_IRP_CONTEXT  Context);
-
-NTKERNELAPI
-PIRP
-NTAPI
-IoCsqRemoveIrp(
-  IN  PIO_CSQ  Csq,
-  IN  PIO_CSQ_IRP_CONTEXT  Context);
-
-NTKERNELAPI
-PIRP
-NTAPI
-IoCsqRemoveNextIrp(
-  IN PIO_CSQ  Csq,
-  IN PVOID  PeekContext);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoDeleteController(
-  IN PCONTROLLER_OBJECT  ControllerObject);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoDeleteDevice(
-  IN PDEVICE_OBJECT  DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoDeleteSymbolicLink(
-  IN PUNICODE_STRING  SymbolicLinkName);
-
-/*
- * VOID
- * IoDeassignArcName(
- *   IN PUNICODE_STRING  ArcName)
- */
-#define IoDeassignArcName IoDeleteSymbolicLink
-
-NTKERNELAPI
-VOID
-NTAPI
-IoDetachDevice(
-  IN OUT PDEVICE_OBJECT  TargetDevice);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoDisconnectInterrupt(
-  IN PKINTERRUPT  InterruptObject);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoForwardIrpSynchronously(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PIRP  Irp);
-
-#define IoForwardAndCatchIrp IoForwardIrpSynchronously
-
-NTKERNELAPI
-VOID
-NTAPI
-IoFreeController(
-  IN PCONTROLLER_OBJECT  ControllerObject);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoFreeErrorLogEntry(
-  PVOID  ElEntry);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoFreeIrp(
-  IN PIRP  Irp);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoFreeMdl(
-  IN PMDL  Mdl);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoFreeWorkItem(
-  IN PIO_WORKITEM  pIOWorkItem);
-
-NTKERNELAPI
-PDEVICE_OBJECT
-NTAPI
-IoGetAttachedDevice(
-  IN PDEVICE_OBJECT  DeviceObject);
-
-NTKERNELAPI
-PDEVICE_OBJECT
-NTAPI
-IoGetAttachedDeviceReference(
-  IN PDEVICE_OBJECT  DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoGetBootDiskInformation(
-  IN OUT PBOOTDISK_INFORMATION  BootDiskInformation,
-  IN ULONG  Size);
-
-NTKERNELAPI
-PCONFIGURATION_INFORMATION
-NTAPI
-IoGetConfigurationInformation(
-  VOID);
-
-NTKERNELAPI
-PEPROCESS
-NTAPI
-IoGetCurrentProcess(
-  VOID);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoGetDeviceInterfaceAlias(
-  IN PUNICODE_STRING  SymbolicLinkName,
-  IN CONST GUID  *AliasInterfaceClassGuid,
-  OUT PUNICODE_STRING  AliasSymbolicLinkName);
-
-#define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoGetDeviceInterfaces(
-  IN CONST GUID  *InterfaceClassGuid,
-  IN PDEVICE_OBJECT  PhysicalDeviceObject  OPTIONAL,
-  IN ULONG  Flags,
-  OUT PWSTR  *SymbolicLinkList);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoGetDeviceObjectPointer(
-  IN PUNICODE_STRING  ObjectName,
-  IN ACCESS_MASK  DesiredAccess,
-  OUT PFILE_OBJECT  *FileObject,
-  OUT PDEVICE_OBJECT  *DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoGetDeviceProperty(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN DEVICE_REGISTRY_PROPERTY  DeviceProperty,
-  IN ULONG  BufferLength,
-  OUT PVOID  PropertyBuffer,
-  OUT PULONG  ResultLength);
-
-NTKERNELAPI
-PDEVICE_OBJECT
-NTAPI
-IoGetDeviceToVerify(
-  IN PETHREAD  Thread);
-
-NTKERNELAPI
-PDMA_ADAPTER
-NTAPI
-IoGetDmaAdapter(
-  IN PDEVICE_OBJECT  PhysicalDeviceObject,
-  IN PDEVICE_DESCRIPTION  DeviceDescription,
-  IN OUT PULONG  NumberOfMapRegisters);
-
-NTKERNELAPI
-PVOID
-NTAPI
-IoGetDriverObjectExtension(
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PVOID  ClientIdentificationAddress);
-
-NTKERNELAPI
-PGENERIC_MAPPING
-NTAPI
-IoGetFileObjectGenericMapping(
-  VOID);
-
-/*
- * ULONG
- * IoGetFunctionCodeFromCtlCode(
- *   IN ULONG  ControlCode)
- */
-#define IoGetFunctionCodeFromCtlCode(_ControlCode) \
-  (((_ControlCode) >> 2) & 0x00000FFF)
-
-NTKERNELAPI
-PVOID
-NTAPI
-IoGetInitialStack(
-  VOID);
-
-NTKERNELAPI
-PDEVICE_OBJECT
-NTAPI
-IoGetRelatedDeviceObject(
-  IN PFILE_OBJECT  FileObject);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoGetStackLimits(
-  OUT PULONG_PTR  LowLimit,
-  OUT PULONG_PTR  HighLimit);
-
-FORCEINLINE
-ULONG_PTR
-IoGetRemainingStackSize(
-  VOID
-)
-{
-    ULONG_PTR End, Begin;
-    ULONG_PTR Result;
-
-    IoGetStackLimits(&Begin, &End);
-    Result = (ULONG_PTR)(&End) - Begin;
-    return Result;
-}
-
-NTKERNELAPI
-VOID
-NTAPI
-KeInitializeDpc(
-  IN PRKDPC  Dpc,
-  IN PKDEFERRED_ROUTINE  DeferredRoutine,
-  IN PVOID  DeferredContext);
-
-/*
- * VOID
- * IoInitializeDpcRequest(
- *   IN PDEVICE_OBJECT DeviceObject,
- *   IN PIO_DPC_ROUTINE DpcRoutine)
- */
-#define IoInitializeDpcRequest(_DeviceObject, \
-                               _DpcRoutine) \
-  KeInitializeDpc(&(_DeviceObject)->Dpc, \
-    (PKDEFERRED_ROUTINE) (_DpcRoutine), \
-    _DeviceObject)
-
-NTKERNELAPI
-VOID
-NTAPI
-IoInitializeIrp(
-  IN OUT PIRP  Irp,
-  IN USHORT  PacketSize,
-  IN CCHAR  StackSize);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoInitializeRemoveLockEx(
-  IN  PIO_REMOVE_LOCK Lock,
-  IN  ULONG   AllocateTag,
-  IN  ULONG   MaxLockedMinutes,
-  IN  ULONG   HighWatermark,
-  IN  ULONG   RemlockSize);
-
-/* VOID
- * IoInitializeRemoveLock(
- *   IN PIO_REMOVE_LOCK  Lock,
- *   IN ULONG  AllocateTag,
- *   IN ULONG  MaxLockedMinutes,
- *   IN ULONG  HighWatermark)
- */
-#define IoInitializeRemoveLock( \
-  Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
-  IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
-    HighWatermark, sizeof(IO_REMOVE_LOCK))
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoInitializeTimer(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PIO_TIMER_ROUTINE  TimerRoutine,
-  IN PVOID  Context);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoInvalidateDeviceRelations(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN DEVICE_RELATION_TYPE  Type);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoInvalidateDeviceState(
-  IN PDEVICE_OBJECT  PhysicalDeviceObject);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoIs32bitProcess(
-  IN PIRP  Irp  OPTIONAL);
-
-/*
- * BOOLEAN
- * IoIsErrorUserInduced(
- *   IN NTSTATUS  Status);
- */
-#define IoIsErrorUserInduced(Status) \
-   ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
-   ((Status) == STATUS_IO_TIMEOUT) || \
-   ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
-   ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
-   ((Status) == STATUS_VERIFY_REQUIRED) || \
-   ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
-   ((Status) == STATUS_WRONG_VOLUME)))
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoIsWdmVersionAvailable(
-  IN UCHAR  MajorVersion,
-  IN UCHAR  MinorVersion);
-
-NTKERNELAPI
-PIRP
-NTAPI
-IoMakeAssociatedIrp(
-  IN PIRP  Irp,
-  IN CCHAR  StackSize);
-
-/*
- * VOID
- * IoMarkIrpPending(
- *   IN OUT PIRP  Irp)
- */
-#define IoMarkIrpPending(_Irp) \
-  (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoOpenDeviceInterfaceRegistryKey(
-  IN PUNICODE_STRING  SymbolicLinkName,
-  IN ACCESS_MASK  DesiredAccess,
-  OUT PHANDLE  DeviceInterfaceKey);
-
-#define PLUGPLAY_REGKEY_DEVICE                            1
-#define PLUGPLAY_REGKEY_DRIVER                            2
-#define PLUGPLAY_REGKEY_CURRENT_HWPROFILE                 4
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoOpenDeviceRegistryKey(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  DevInstKeyType,
-  IN ACCESS_MASK  DesiredAccess,
-  OUT PHANDLE  DevInstRegKey);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoQueryDeviceDescription(
-  IN PINTERFACE_TYPE  BusType  OPTIONAL,
-  IN PULONG  BusNumber  OPTIONAL,
-  IN PCONFIGURATION_TYPE  ControllerType  OPTIONAL,
-  IN PULONG  ControllerNumber  OPTIONAL,
-  IN PCONFIGURATION_TYPE  PeripheralType  OPTIONAL,
-  IN PULONG  PeripheralNumber  OPTIONAL,
-  IN PIO_QUERY_DEVICE_ROUTINE  CalloutRoutine,
-  IN PVOID  Context);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoQueueWorkItem(
-  IN PIO_WORKITEM  pIOWorkItem,
-  IN PIO_WORKITEM_ROUTINE  Routine,
-  IN WORK_QUEUE_TYPE  QueueType,
-  IN PVOID  Context);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRaiseHardError(
-  IN PIRP  Irp,
-  IN PVPB  Vpb  OPTIONAL,
-  IN PDEVICE_OBJECT  RealDeviceObject);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoRaiseInformationalHardError(
-  IN NTSTATUS  ErrorStatus,
-  IN PUNICODE_STRING  String  OPTIONAL,
-  IN PKTHREAD  Thread  OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReadDiskSignature(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  BytesPerSector,
-  OUT PDISK_SIGNATURE  Signature);
-
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IoReadPartitionTable(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  SectorSize,
-  IN BOOLEAN  ReturnRecognizedPartitions,
-  OUT struct _DRIVE_LAYOUT_INFORMATION  **PartitionBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReadPartitionTableEx(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN struct _DRIVE_LAYOUT_INFORMATION_EX  **PartitionBuffer);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRegisterBootDriverReinitialization(
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
-  IN PVOID  Context);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRegisterBootDriverReinitialization(
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
-  IN PVOID  Context);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoRegisterDeviceInterface(
-  IN PDEVICE_OBJECT  PhysicalDeviceObject,
-  IN CONST GUID  *InterfaceClassGuid,
-  IN PUNICODE_STRING  ReferenceString  OPTIONAL,
-  OUT PUNICODE_STRING  SymbolicLinkName);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRegisterDriverReinitialization(
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
-  IN PVOID  Context);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoRegisterPlugPlayNotification(
-  IN IO_NOTIFICATION_EVENT_CATEGORY  EventCategory,
-  IN ULONG  EventCategoryFlags,
-  IN PVOID  EventCategoryData  OPTIONAL,
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE  CallbackRoutine,
-  IN PVOID  Context,
-  OUT PVOID  *NotificationEntry);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoRegisterShutdownNotification(
-  IN PDEVICE_OBJECT  DeviceObject);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoReleaseCancelSpinLock(
-  IN KIRQL  Irql);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoReleaseRemoveLockAndWaitEx(
-  IN PIO_REMOVE_LOCK  RemoveLock,
-  IN PVOID  Tag,
-  IN ULONG  RemlockSize);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoReleaseRemoveLockEx(
-  IN PIO_REMOVE_LOCK  RemoveLock,
-  IN PVOID  Tag,
-  IN ULONG  RemlockSize);
-
-/*
- * VOID
- * IoReleaseRemoveLock(
- *   IN PIO_REMOVE_LOCK  RemoveLock,
- *   IN PVOID  Tag)
- */
-#define IoReleaseRemoveLock(_RemoveLock, \
-                            _Tag) \
-  IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
-
-/*
- * VOID
- * IoReleaseRemoveLockAndWait(
- *   IN PIO_REMOVE_LOCK  RemoveLock,
- *   IN PVOID  Tag)
- */
-#define IoReleaseRemoveLockAndWait(_RemoveLock, \
-                                   _Tag) \
-  IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRemoveShareAccess(
-  IN PFILE_OBJECT  FileObject,
-  IN OUT PSHARE_ACCESS  ShareAccess);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportDetectedDevice(
-  IN PDRIVER_OBJECT  DriverObject,
-  IN INTERFACE_TYPE  LegacyBusType,
-  IN ULONG  BusNumber,
-  IN ULONG  SlotNumber,
-  IN PCM_RESOURCE_LIST  ResourceList,
-  IN PIO_RESOURCE_REQUIREMENTS_LIST  ResourceRequirements  OPTIONAL,
-  IN BOOLEAN  ResourceAssigned,
-  IN OUT PDEVICE_OBJECT  *DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportResourceForDetection(
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PCM_RESOURCE_LIST  DriverList  OPTIONAL,
-  IN ULONG  DriverListSize  OPTIONAL,
-  IN PDEVICE_OBJECT  DeviceObject  OPTIONAL,
-  IN PCM_RESOURCE_LIST  DeviceList  OPTIONAL,
-  IN ULONG  DeviceListSize  OPTIONAL,
-  OUT PBOOLEAN  ConflictDetected);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportResourceUsage(
-  IN PUNICODE_STRING  DriverClassName  OPTIONAL,
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PCM_RESOURCE_LIST  DriverList  OPTIONAL,
-  IN ULONG  DriverListSize  OPTIONAL,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PCM_RESOURCE_LIST  DeviceList  OPTIONAL,
-  IN ULONG  DeviceListSize  OPTIONAL,
-  IN BOOLEAN  OverrideConflict,
-  OUT PBOOLEAN  ConflictDetected);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportTargetDeviceChange(
-  IN PDEVICE_OBJECT  PhysicalDeviceObject,
-  IN PVOID  NotificationStructure);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportTargetDeviceChangeAsynchronous(
-  IN PDEVICE_OBJECT  PhysicalDeviceObject,
-  IN PVOID  NotificationStructure,
-  IN PDEVICE_CHANGE_COMPLETE_CALLBACK  Callback  OPTIONAL,
-  IN PVOID  Context  OPTIONAL);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRequestDeviceEject(
-  IN PDEVICE_OBJECT  PhysicalDeviceObject);
-
-/*
- * VOID
- * IoRequestDpc(
- *   IN PDEVICE_OBJECT  DeviceObject,
- *   IN PIRP  Irp,
- *   IN PVOID  Context);
- */
-#define IoRequestDpc(DeviceObject, Irp, Context)( \
-  KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
-
-NTKERNELAPI
-VOID
-NTAPI
-IoReuseIrp(
-  IN OUT PIRP  Irp,
-  IN NTSTATUS  Status);
-
-/*
- * PDRIVER_CANCEL
- * IoSetCancelRoutine(
- *   IN PIRP  Irp,
- *   IN PDRIVER_CANCEL  CancelRoutine)
- */
-#define IoSetCancelRoutine(_Irp, \
-                           _CancelRoutine) \
-  ((PDRIVER_CANCEL) InterlockedExchangePointer( \
-    (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
-
-/*
- * VOID
- * IoSetCompletionRoutine(
- *   IN PIRP  Irp,
- *   IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
- *   IN PVOID  Context,
- *   IN BOOLEAN  InvokeOnSuccess,
- *   IN BOOLEAN  InvokeOnError,
- *   IN BOOLEAN  InvokeOnCancel)
- */
-#define IoSetCompletionRoutine(_Irp, \
-                               _CompletionRoutine, \
-                               _Context, \
-                               _InvokeOnSuccess, \
-                               _InvokeOnError, \
-                               _InvokeOnCancel) \
-{ \
-  PIO_STACK_LOCATION _IrpSp; \
-  ASSERT((_InvokeOnSuccess) || (_InvokeOnError) || (_InvokeOnCancel) ? \
-    (_CompletionRoutine) != NULL : TRUE); \
-  _IrpSp = IoGetNextIrpStackLocation(_Irp); \
-  _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
-  _IrpSp->Context = (_Context); \
-  _IrpSp->Control = 0; \
-  if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
-  if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
-  if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
-}
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoSetCompletionRoutineEx(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PIRP  Irp,
-  IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
-  IN PVOID  Context,
-  IN BOOLEAN  InvokeOnSuccess,
-  IN BOOLEAN  InvokeOnError,
-  IN BOOLEAN  InvokeOnCancel);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoSetDeviceInterfaceState(
-  IN PUNICODE_STRING  SymbolicLinkName,
-  IN BOOLEAN  Enable);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoSetHardErrorOrVerifyDevice(
-  IN PIRP  Irp,
-  IN PDEVICE_OBJECT  DeviceObject);
-
-/*
- * VOID
- * IoSetNextIrpStackLocation(
- *   IN OUT PIRP  Irp)
- */
-#define IoSetNextIrpStackLocation(_Irp) \
-{ \
-  (_Irp)->CurrentLocation--; \
-  (_Irp)->Tail.Overlay.CurrentStackLocation--; \
-}
-
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IoSetPartitionInformation(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  SectorSize,
-  IN ULONG  PartitionNumber,
-  IN ULONG  PartitionType);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoSetPartitionInformationEx(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  PartitionNumber,
-  IN struct _SET_PARTITION_INFORMATION_EX  *PartitionInfo);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoSetShareAccess(
-  IN ACCESS_MASK  DesiredAccess,
-  IN ULONG  DesiredShareAccess,
-  IN OUT PFILE_OBJECT  FileObject,
-  OUT PSHARE_ACCESS  ShareAccess);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoSetStartIoAttributes(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN BOOLEAN  DeferredStartIo,
-  IN BOOLEAN  NonCancelable);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoSetSystemPartition(
-  IN PUNICODE_STRING  VolumeNameString);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoSetThreadHardErrorMode(
-  IN BOOLEAN  EnableHardErrors);
-
-/*
- * USHORT
- * IoSizeOfIrp(
- *   IN CCHAR  StackSize)
- */
-#define IoSizeOfIrp(_StackSize) \
-  ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
-
-/*
- * VOID
- * IoSkipCurrentIrpStackLocation(
- *   IN PIRP  Irp)
- */
-#define IoSkipCurrentIrpStackLocation(_Irp) \
-{ \
-  (_Irp)->CurrentLocation++; \
-  (_Irp)->Tail.Overlay.CurrentStackLocation++; \
-}
-
-NTKERNELAPI
-VOID
-NTAPI
-IoStartNextPacket(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN BOOLEAN  Cancelable);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoStartNextPacketByKey(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN BOOLEAN  Cancelable,
-  IN ULONG  Key);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoStartPacket(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PIRP  Irp,
-  IN PULONG  Key  OPTIONAL,
-  IN PDRIVER_CANCEL  CancelFunction  OPTIONAL);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoStartTimer(
-  IN PDEVICE_OBJECT  DeviceObject);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoStopTimer(
-  IN PDEVICE_OBJECT  DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoUnregisterPlugPlayNotification(
-  IN PVOID  NotificationEntry);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoUnregisterShutdownNotification(
-  IN PDEVICE_OBJECT  DeviceObject);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoUpdateShareAccess(
-  IN PFILE_OBJECT  FileObject,
-  IN OUT PSHARE_ACCESS  ShareAccess);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoVerifyPartitionTable(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN BOOLEAN  FixErrors);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoVolumeDeviceToDosName(
-  IN  PVOID  VolumeDeviceObject,
-  OUT PUNICODE_STRING  DosName);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIAllocateInstanceIds(
-  IN GUID  *Guid,
-  IN ULONG  InstanceCount,
-  OUT ULONG  *FirstInstanceId);
-
-NTKERNELAPI
-ULONG
-NTAPI
-IoWMIDeviceObjectToProviderId(
-  IN PDEVICE_OBJECT  DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIDeviceObjectToInstanceName(
-  IN PVOID  DataBlockObject,
-  IN PDEVICE_OBJECT  DeviceObject,
-  OUT PUNICODE_STRING  InstanceName);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIExecuteMethod(
-  IN PVOID  DataBlockObject,
-  IN PUNICODE_STRING  InstanceName,
-  IN ULONG  MethodId,
-  IN ULONG  InBufferSize,
-  IN OUT PULONG  OutBufferSize,
-  IN OUT  PUCHAR  InOutBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIHandleToInstanceName(
-  IN PVOID  DataBlockObject,
-  IN HANDLE  FileHandle,
-  OUT PUNICODE_STRING  InstanceName);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIOpenBlock(
-  IN GUID  *DataBlockGuid,
-  IN ULONG  DesiredAccess,
-  OUT PVOID  *DataBlockObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIQueryAllData(
-  IN PVOID  DataBlockObject,
-  IN OUT ULONG  *InOutBufferSize,
-  OUT PVOID  OutBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIQueryAllDataMultiple(
-  IN PVOID  *DataBlockObjectList,
-  IN ULONG  ObjectCount,
-  IN OUT ULONG  *InOutBufferSize,
-  OUT PVOID  OutBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIQuerySingleInstance(
-  IN PVOID  DataBlockObject,
-  IN PUNICODE_STRING  InstanceName,
-  IN OUT ULONG  *InOutBufferSize,
-  OUT PVOID OutBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIQuerySingleInstanceMultiple(
-  IN PVOID  *DataBlockObjectList,
-  IN PUNICODE_STRING  InstanceNames,
-  IN ULONG  ObjectCount,
-  IN OUT ULONG  *InOutBufferSize,
-  OUT PVOID  OutBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIRegistrationControl(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  Action);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMISetNotificationCallback(
-  IN PVOID  Object,
-  IN WMI_NOTIFICATION_CALLBACK  Callback,
-  IN PVOID  Context);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMISetSingleInstance(
-  IN PVOID  DataBlockObject,
-  IN PUNICODE_STRING  InstanceName,
-  IN ULONG  Version,
-  IN ULONG  ValueBufferSize,
-  IN PVOID  ValueBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMISetSingleItem(
-  IN PVOID  DataBlockObject,
-  IN PUNICODE_STRING  InstanceName,
-  IN ULONG  DataItemId,
-  IN ULONG  Version,
-  IN ULONG  ValueBufferSize,
-  IN PVOID  ValueBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMISuggestInstanceName(
-  IN PDEVICE_OBJECT  PhysicalDeviceObject OPTIONAL,
-  IN PUNICODE_STRING  SymbolicLinkName OPTIONAL,
-  IN BOOLEAN  CombineNames,
-  OUT PUNICODE_STRING  SuggestedInstanceName);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWMIWriteEvent(
-  IN PVOID  WnodeEventItem);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoWriteErrorLogEntry(
-  IN PVOID  ElEntry);
-
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IoWritePartitionTable(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  SectorSize,
-  IN ULONG  SectorsPerTrack,
-  IN ULONG  NumberOfHeads,
-  IN struct _DRIVE_LAYOUT_INFORMATION  *PartitionBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWritePartitionTableEx(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN struct _DRIVE_LAYOUT_INFORMATION_EX  *PartitionBuffer);
-
-
-
-/** Kernel routines **/
-
-#if defined (_M_AMD64)
-NTKERNELAPI
-VOID
-FASTCALL
-KeAcquireInStackQueuedSpinLock(
-  IN PKSPIN_LOCK  SpinLock,
-  IN PKLOCK_QUEUE_HANDLE  LockHandle);
-
-NTKERNELAPI
-VOID
-FASTCALL
-KeReleaseInStackQueuedSpinLock(
-  IN PKLOCK_QUEUE_HANDLE  LockHandle);
-#else
-NTHALAPI
-VOID
-FASTCALL
-KeAcquireInStackQueuedSpinLock(
-  IN PKSPIN_LOCK  SpinLock,
-  IN PKLOCK_QUEUE_HANDLE  LockHandle);
-
-NTHALAPI
-VOID
-FASTCALL
-KeReleaseInStackQueuedSpinLock(
-  IN PKLOCK_QUEUE_HANDLE  LockHandle);
-#endif
-
-NTKERNELAPI
-VOID
-FASTCALL
-KeAcquireInStackQueuedSpinLockAtDpcLevel(
-  IN PKSPIN_LOCK  SpinLock,
-  IN PKLOCK_QUEUE_HANDLE  LockHandle);
-
-NTKERNELAPI
-KIRQL
-NTAPI
-KeAcquireInterruptSpinLock(
-  IN PKINTERRUPT  Interrupt);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeAreApcsDisabled(
-  VOID);
-
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
-NTAPI
-KeBugCheck(
-  IN ULONG  BugCheckCode);
-
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
-NTAPI
-KeBugCheckEx(
-  IN ULONG  BugCheckCode,
-  IN ULONG_PTR  BugCheckParameter1,
-  IN ULONG_PTR  BugCheckParameter2,
-  IN ULONG_PTR  BugCheckParameter3,
-  IN ULONG_PTR  BugCheckParameter4);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeCancelTimer(
-  IN PKTIMER  Timer);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeClearEvent(
-  IN PRKEVENT  Event);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeDelayExecutionThread(
-  IN KPROCESSOR_MODE  WaitMode,
-  IN BOOLEAN  Alertable,
-  IN PLARGE_INTEGER  Interval);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeDeregisterBugCheckCallback(
-  IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeEnterCriticalRegion(
-  VOID);
-
-/*
- * VOID
- * KeFlushIoBuffers(
- *   IN PMDL  Mdl,
- *   IN BOOLEAN  ReadOperation,
- *   IN BOOLEAN  DmaOperation)
- */
-#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
-
-#define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
-#define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
-#define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
-#define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
-
-NTKERNELAPI
-VOID
-NTAPI
-KeFlushQueuedDpcs(
-    VOID
-);
-
-NTHALAPI
-VOID
-NTAPI
-KeFlushWriteBuffer(VOID);
-
-NTKERNELAPI
-ULONG
-NTAPI
-KeGetRecommendedSharedDataAlignment(
-  VOID);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeInitializeDeviceQueue(
-  IN PKDEVICE_QUEUE  DeviceQueue);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeInitializeMutex(
-  IN PRKMUTEX  Mutex,
-  IN ULONG  Level);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeInitializeSemaphore(
-  IN PRKSEMAPHORE  Semaphore,
-  IN LONG  Count,
-  IN LONG  Limit);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeInitializeTimer(
-  IN PKTIMER  Timer);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeInitializeTimerEx(
-  IN PKTIMER  Timer,
-  IN TIMER_TYPE  Type);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeInsertByKeyDeviceQueue(
-  IN PKDEVICE_QUEUE  DeviceQueue,
-  IN PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry,
-  IN ULONG  SortKey);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeInsertDeviceQueue(
-  IN PKDEVICE_QUEUE  DeviceQueue,
-  IN PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeInsertQueueDpc(
-  IN PRKDPC  Dpc,
-  IN PVOID  SystemArgument1,
-  IN PVOID  SystemArgument2);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeLeaveCriticalRegion(
-  VOID);
-
-#ifdef _X86_
-
-static __inline
-VOID
-KeMemoryBarrier(
-  VOID)
-{
-  volatile LONG Barrier;
-#if defined(__GNUC__)
-  __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
-#elif defined(_MSC_VER)
-  __asm xchg [Barrier], eax
-#endif
-}
-
-#endif
-
-NTKERNELAPI
-LONG
-NTAPI
-KePulseEvent(
-  IN PRKEVENT  Event,
-  IN KPRIORITY  Increment,
-  IN BOOLEAN  Wait);
-
-NTKERNELAPI
-KAFFINITY
-NTAPI
-KeQueryActiveProcessors(
-    VOID
-);
-
-NTHALAPI
-LARGE_INTEGER
-NTAPI
-KeQueryPerformanceCounter(
-  OUT PLARGE_INTEGER  PerformanceFrequency  OPTIONAL);
-
-NTKERNELAPI
-KPRIORITY
-NTAPI
-KeQueryPriorityThread(
-  IN PRKTHREAD  Thread);
-
-NTKERNELAPI
-ULONG
-NTAPI
-KeQueryRuntimeThread(
-  IN PKTHREAD Thread,
-  OUT PULONG UserTime);
-
-#if !defined(_M_AMD64)
-NTKERNELAPI
-ULONGLONG
-NTAPI
-KeQueryInterruptTime(
-  VOID);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeQuerySystemTime(
-  OUT PLARGE_INTEGER  CurrentTime);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeQueryTickCount(
-  OUT PLARGE_INTEGER  TickCount);
-#endif
-
-NTKERNELAPI
-ULONG
-NTAPI
-KeQueryTimeIncrement(
-  VOID);
-
-NTKERNELAPI
-LONG
-NTAPI
-KeReadStateEvent(
-  IN PRKEVENT  Event);
-
-NTKERNELAPI
-LONG
-NTAPI
-KeReadStateMutex(
-  IN PRKMUTEX  Mutex);
-
-
-NTKERNELAPI
-LONG
-NTAPI
-KeReadStateSemaphore(
-  IN PRKSEMAPHORE  Semaphore);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeReadStateTimer(
-  IN PKTIMER  Timer);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeRegisterBugCheckCallback(
-  IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord,
-  IN PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine,
-  IN PVOID  Buffer,
-  IN ULONG  Length,
-  IN PUCHAR  Component);
-
-NTKERNELAPI
-PVOID
-NTAPI
-KeRegisterNmiCallback(
-  IN PNMI_CALLBACK CallbackRoutine,
-  IN PVOID Context
-);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeDeregisterNmiCallback(
-  IN PVOID Handle
-);
-
-NTKERNELAPI
-VOID
-FASTCALL
-KeReleaseInStackQueuedSpinLockFromDpcLevel(
-  IN PKLOCK_QUEUE_HANDLE  LockHandle);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeReleaseInterruptSpinLock(
-  IN PKINTERRUPT  Interrupt,
-  IN KIRQL  OldIrql);
-
-NTKERNELAPI
-LONG
-NTAPI
-KeReleaseMutex(
-  IN PRKMUTEX  Mutex,
-  IN BOOLEAN  Wait);
-
-NTKERNELAPI
-LONG
-NTAPI
-KeReleaseSemaphore(
-  IN PRKSEMAPHORE  Semaphore,
-  IN KPRIORITY  Increment,
-  IN LONG  Adjustment,
-  IN BOOLEAN  Wait);
-
-NTKERNELAPI
-PKDEVICE_QUEUE_ENTRY
-NTAPI
-KeRemoveByKeyDeviceQueue(
-  IN PKDEVICE_QUEUE  DeviceQueue,
-  IN ULONG  SortKey);
-
-NTKERNELAPI
-PKDEVICE_QUEUE_ENTRY
-NTAPI
-KeRemoveDeviceQueue(
-  IN PKDEVICE_QUEUE  DeviceQueue);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeRemoveEntryDeviceQueue(
-  IN PKDEVICE_QUEUE  DeviceQueue,
-  IN PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeRemoveQueueDpc(
-  IN PRKDPC  Dpc);
-
-NTKERNELAPI
-LONG
-NTAPI
-KeResetEvent(
-  IN PRKEVENT  Event);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeRestoreFloatingPointState(
-  IN PKFLOATING_SAVE  FloatSave);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeRevertToUserAffinityThread(VOID);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeSaveFloatingPointState(
-  OUT PKFLOATING_SAVE  FloatSave);
-
-NTKERNELAPI
-LONG
-NTAPI
-KeSetBasePriorityThread(
-  IN PRKTHREAD  Thread,
-  IN LONG  Increment);
-
-NTKERNELAPI
-LONG
-NTAPI
-KeSetEvent(
-  IN PRKEVENT  Event,
-  IN KPRIORITY  Increment,
-  IN BOOLEAN  Wait);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeSetImportanceDpc(
-  IN PRKDPC  Dpc,
-  IN KDPC_IMPORTANCE  Importance);
-
-NTKERNELAPI
-KPRIORITY
-NTAPI
-KeSetPriorityThread(
-  IN PKTHREAD  Thread,
-  IN KPRIORITY  Priority);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeSetSystemAffinityThread(
-    IN KAFFINITY Affinity);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeSetTargetProcessorDpc(
-  IN PRKDPC  Dpc,
-  IN CCHAR  Number);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeSetTimer(
-  IN PKTIMER  Timer,
-  IN LARGE_INTEGER  DueTime,
-  IN PKDPC  Dpc  OPTIONAL);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeSetTimerEx(
-  IN PKTIMER  Timer,
-  IN LARGE_INTEGER  DueTime,
-  IN LONG  Period  OPTIONAL,
-  IN PKDPC  Dpc  OPTIONAL);
-
-NTKERNELAPI
-VOID
-FASTCALL
-KeSetTimeUpdateNotifyRoutine(
-  IN PTIME_UPDATE_NOTIFY_ROUTINE  NotifyRoutine);
-
-NTHALAPI
-VOID
-NTAPI
-KeStallExecutionProcessor(
-  IN ULONG  MicroSeconds);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeSynchronizeExecution(
-  IN PKINTERRUPT    Interrupt,
-  IN PKSYNCHRONIZE_ROUTINE  SynchronizeRoutine,
-  IN PVOID  SynchronizeContext);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeWaitForMultipleObjects(
-  IN ULONG  Count,
-  IN PVOID  Object[],
-  IN WAIT_TYPE  WaitType,
-  IN KWAIT_REASON  WaitReason,
-  IN KPROCESSOR_MODE  WaitMode,
-  IN BOOLEAN  Alertable,
-  IN PLARGE_INTEGER  Timeout  OPTIONAL,
-  IN PKWAIT_BLOCK  WaitBlockArray  OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeWaitForMutexObject(
-  IN PRKMUTEX  Mutex,
-  IN KWAIT_REASON  WaitReason,
-  IN KPROCESSOR_MODE  WaitMode,
-  IN BOOLEAN  Alertable,
-  IN PLARGE_INTEGER  Timeout  OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeWaitForSingleObject(
-  IN PVOID  Object,
-  IN KWAIT_REASON  WaitReason,
-  IN KPROCESSOR_MODE  WaitMode,
-  IN BOOLEAN  Alertable,
-  IN PLARGE_INTEGER  Timeout  OPTIONAL);
-
-typedef
-ULONG_PTR
-(NTAPI *PKIPI_BROADCAST_WORKER)(
-    IN ULONG_PTR Argument
-);
-
-NTKERNELAPI
-ULONG_PTR
-NTAPI
-KeIpiGenericCall(
-    IN PKIPI_BROADCAST_WORKER BroadcastFunction,
-    IN ULONG_PTR Context
-);
-
-#if defined(_X86_)
-
-NTHALAPI
-VOID
-FASTCALL
-KfLowerIrql(
-  IN KIRQL  NewIrql);
-
-NTHALAPI
-KIRQL
-FASTCALL
-KfRaiseIrql(
-  IN KIRQL  NewIrql);
-
-NTHALAPI
-KIRQL
-DDKAPI
-KeRaiseIrqlToDpcLevel(
-  VOID);
-
-NTHALAPI
-KIRQL
-DDKAPI
-KeRaiseIrqlToSynchLevel(
-    VOID);
-
-#define KeLowerIrql(a) KfLowerIrql(a)
-#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
-
-#elif defined(_M_AMD64)
-
-FORCEINLINE
-KIRQL
-KeGetCurrentIrql(VOID)
-{
-    return (KIRQL)__readcr8();
-}
-
-FORCEINLINE
-VOID
-KeLowerIrql(IN KIRQL NewIrql)
-{
-    ASSERT(KeGetCurrentIrql() >= NewIrql);
-    __writecr8(NewIrql);
-}
-
-FORCEINLINE
-KIRQL
-KfRaiseIrql(IN KIRQL NewIrql)
-{
-    KIRQL OldIrql;
-
-    OldIrql = __readcr8();
-    ASSERT(OldIrql <= NewIrql);
-    __writecr8(NewIrql);
-    return OldIrql;
-}
-#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
-
-FORCEINLINE
-KIRQL
-KeRaiseIrqlToDpcLevel(VOID)
-{
-    return KfRaiseIrql(DISPATCH_LEVEL);
-}
-
-FORCEINLINE
-KIRQL
-KeRaiseIrqlToSynchLevel(VOID)
-{
-    return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
-}
-
-#elif defined(__PowerPC__)
-
-NTHALAPI
-VOID
-FASTCALL
-KfLowerIrql(
-  IN KIRQL  NewIrql);
-
-NTHALAPI
-KIRQL
-FASTCALL
-KfRaiseIrql(
-  IN KIRQL  NewIrql);
-
-NTHALAPI
-KIRQL
-DDKAPI
-KeRaiseIrqlToDpcLevel(
-  VOID);
-
-NTHALAPI
-KIRQL
-DDKAPI
-KeRaiseIrqlToSynchLevel(
-    VOID);
-
-#define KeLowerIrql(a) KfLowerIrql(a)
-#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
-
-#elif defined(_M_MIPS)
-
-#define KeLowerIrql(a) KfLowerIrql(a)
-#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
-
-NTKERNELAPI
-VOID
-NTAPI
-KfLowerIrql(
-  IN KIRQL  NewIrql);
-
-NTKERNELAPI
-KIRQL
-NTAPI
-KfRaiseIrql(
-  IN KIRQL  NewIrql);
-
-NTKERNELAPI
-KIRQL
-NTAPI
-KeRaiseIrqlToDpcLevel(
-  VOID);
-
-NTKERNELAPI
-KIRQL
-DDKAPI
-KeRaiseIrqlToSynchLevel(
-    VOID);
-
-#elif defined(_M_ARM)
-
-#include <armddk.h>
-
-#else
-
-NTKERNELAPI
-VOID
-NTAPI
-KeLowerIrql(
-  IN KIRQL  NewIrql);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeRaiseIrql(
-  IN KIRQL  NewIrql,
-  OUT PKIRQL  OldIrql);
-
-NTKERNELAPI
-KIRQL
-NTAPI
-KeRaiseIrqlToDpcLevel(
-  VOID);
-
-NTKERNELAPI
-KIRQL
-DDKAPI
-KeRaiseIrqlToSynchLevel(
-    VOID);
-
-#endif
-
-/** Memory manager routines **/
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmAdvanceMdl(
-  IN PMDL  Mdl,
-  IN ULONG  NumberOfBytes);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmAllocateContiguousMemory(
-  IN ULONG  NumberOfBytes,
-  IN PHYSICAL_ADDRESS  HighestAcceptableAddress);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmAllocateContiguousMemorySpecifyCache(
-  IN SIZE_T  NumberOfBytes,
-  IN PHYSICAL_ADDRESS  LowestAcceptableAddress,
-  IN PHYSICAL_ADDRESS  HighestAcceptableAddress,
-  IN PHYSICAL_ADDRESS  BoundaryAddressMultiple  OPTIONAL,
-  IN MEMORY_CACHING_TYPE  CacheType);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmAllocateMappingAddress(
-  IN SIZE_T  NumberOfBytes,
-  IN ULONG  PoolTag);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmAllocateNonCachedMemory(
-  IN ULONG  NumberOfBytes);
-
-NTKERNELAPI
-PMDL
-NTAPI
-MmAllocatePagesForMdl(
-  IN PHYSICAL_ADDRESS  LowAddress,
-  IN PHYSICAL_ADDRESS  HighAddress,
-  IN PHYSICAL_ADDRESS  SkipBytes,
-  IN SIZE_T  TotalBytes);
-
-#if (NTDDI_VERSION >= NTDDI_WS03SP1)
-NTKERNELAPI
-PMDL
-NTAPI
-MmAllocatePagesForMdlEx(
-  IN PHYSICAL_ADDRESS LowAddress,
-  IN PHYSICAL_ADDRESS HighAddress,
-  IN PHYSICAL_ADDRESS SkipBytes,
-  IN SIZE_T TotalBytes,
-  IN MEMORY_CACHING_TYPE CacheType,
-  IN ULONG Flags);
-#endif
-
-NTKERNELAPI
-VOID
-NTAPI
-MmBuildMdlForNonPagedPool(
-  IN OUT PMDL  MemoryDescriptorList);
-
-typedef enum _MMFLUSH_TYPE {
-  MmFlushForDelete,
-  MmFlushForWrite
-} MMFLUSH_TYPE;
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmFlushImageSection(
-  IN PSECTION_OBJECT_POINTERS  SectionObjectPointer,
-  IN MMFLUSH_TYPE  FlushType);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmFreeContiguousMemory(
-  IN PVOID  BaseAddress);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmFreeContiguousMemorySpecifyCache(
-  IN PVOID  BaseAddress,
-  IN SIZE_T  NumberOfBytes,
-  IN MEMORY_CACHING_TYPE  CacheType);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmFreeMappingAddress(
-  IN PVOID  BaseAddress,
-  IN ULONG  PoolTag);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmFreeNonCachedMemory(
-  IN PVOID  BaseAddress,
-  IN SIZE_T  NumberOfBytes);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmFreePagesFromMdl(
-  IN PMDL  MemoryDescriptorList);
-
-/*
- * ULONG
- * MmGetMdlByteCount(
- *   IN PMDL  Mdl)
- */
-#define MmGetMdlByteCount(_Mdl) \
-  ((_Mdl)->ByteCount)
-
-/*
- * ULONG
- * MmGetMdlByteOffset(
- *   IN PMDL  Mdl)
- */
-#define MmGetMdlByteOffset(_Mdl) \
-  ((_Mdl)->ByteOffset)
-
-/*
- * PPFN_NUMBER
- * MmGetMdlPfnArray(
- *   IN PMDL  Mdl)
- */
-#define MmGetMdlPfnArray(_Mdl) \
-  ((PPFN_NUMBER) ((_Mdl) + 1))
-
-/*
- * PVOID
- * MmGetMdlVirtualAddress(
- *   IN PMDL  Mdl)
- */
-#define MmGetMdlVirtualAddress(_Mdl) \
-  ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
-
-NTKERNELAPI
-PHYSICAL_ADDRESS
-NTAPI
-MmGetPhysicalAddress(
-  IN PVOID  BaseAddress);
-
-NTKERNELAPI
-PPHYSICAL_MEMORY_RANGE
-NTAPI
-MmGetPhysicalMemoryRanges(
-  VOID);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmGetVirtualForPhysical(
-  IN PHYSICAL_ADDRESS  PhysicalAddress);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmMapLockedPagesSpecifyCache(
-  IN PMDL  MemoryDescriptorList,
-  IN KPROCESSOR_MODE  AccessMode,
-  IN MEMORY_CACHING_TYPE  CacheType,
-  IN PVOID  BaseAddress,
-  IN ULONG  BugCheckOnFailure,
-  IN MM_PAGE_PRIORITY  Priority);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmMapLockedPagesWithReservedMapping(
-  IN PVOID  MappingAddress,
-  IN ULONG  PoolTag,
-  IN PMDL  MemoryDescriptorList,
-  IN MEMORY_CACHING_TYPE  CacheType);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMapUserAddressesToPage(
-  IN PVOID  BaseAddress,
-  IN SIZE_T  NumberOfBytes,
-  IN PVOID  PageAddress);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmMapVideoDisplay(
-  IN PHYSICAL_ADDRESS  PhysicalAddress,
-  IN SIZE_T  NumberOfBytes,
-  IN MEMORY_CACHING_TYPE  CacheType);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMapViewInSessionSpace(
-  IN PVOID  Section,
-  OUT PVOID  *MappedBase,
-  IN OUT PSIZE_T  ViewSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMapViewInSystemSpace(
-  IN PVOID  Section,
-  OUT PVOID  *MappedBase,
-  IN PSIZE_T  ViewSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMarkPhysicalMemoryAsBad(
-  IN PPHYSICAL_ADDRESS  StartAddress,
-  IN OUT PLARGE_INTEGER  NumberOfBytes);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMarkPhysicalMemoryAsGood(
-  IN PPHYSICAL_ADDRESS  StartAddress,
-  IN OUT PLARGE_INTEGER  NumberOfBytes);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmGetSystemRoutineAddress(
-  IN PUNICODE_STRING  SystemRoutineName);
-
-/*
- * ULONG
- * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
- *   IN PVOID  Va,
- *   IN ULONG  Size)
- */
-#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
-                                       _Size) \
-  ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
-    + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
-
-/*
- * VOID
- * MmInitializeMdl(
- *   IN PMDL  MemoryDescriptorList,
- *   IN PVOID  BaseVa,
- *   IN SIZE_T  Length)
- */
-#define MmInitializeMdl(_MemoryDescriptorList, \
-                        _BaseVa, \
-                        _Length) \
-{ \
-  (_MemoryDescriptorList)->Next = (PMDL) NULL; \
-  (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
-    (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
-  (_MemoryDescriptorList)->MdlFlags = 0; \
-  (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
-  (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
-  (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
-}
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmIsAddressValid(
-  IN PVOID  VirtualAddress);
-
-NTKERNELAPI
-LOGICAL
-NTAPI
-MmIsDriverVerifying(
-  IN PDRIVER_OBJECT  DriverObject);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmIsThisAnNtAsSystem(
-  VOID);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmIsVerifierEnabled(
-  OUT PULONG  VerifierFlags);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmLockPagableDataSection(
-  IN PVOID  AddressWithinSection);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmLockPagableImageSection(
-  IN PVOID  AddressWithinSection);
-
-/*
- * PVOID
- * MmLockPagableCodeSection(
- *   IN PVOID  AddressWithinSection)
- */
-#define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
-
-NTKERNELAPI
-VOID
-NTAPI
-MmLockPagableSectionByHandle(
-  IN PVOID  ImageSectionHandle);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmMapIoSpace(
-  IN PHYSICAL_ADDRESS  PhysicalAddress,
-  IN ULONG  NumberOfBytes,
-  IN MEMORY_CACHING_TYPE  CacheEnable);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmMapLockedPages(
-  IN PMDL  MemoryDescriptorList,
-  IN KPROCESSOR_MODE  AccessMode);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmLockPageableDataSection (
-    IN PVOID AddressWithinSection
-);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnlockPageableImageSection(
-    IN PVOID ImageSectionHandle
-);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmPageEntireDriver(
-  IN PVOID  AddressWithinSection);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmProbeAndLockProcessPages(
-  IN OUT PMDL  MemoryDescriptorList,
-  IN PEPROCESS  Process,
-  IN KPROCESSOR_MODE  AccessMode,
-  IN LOCK_OPERATION  Operation);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmProtectMdlSystemAddress(
-  IN PMDL  MemoryDescriptorList,
-  IN ULONG  NewProtect);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnmapLockedPages(
-  IN PVOID  BaseAddress,
-  IN PMDL  MemoryDescriptorList);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmUnmapViewInSessionSpace(
-  IN PVOID  MappedBase);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmUnmapViewInSystemSpace(
-  IN PVOID MappedBase);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnsecureVirtualMemory(
-  IN HANDLE  SecureHandle);
-
-/*
- * VOID
- * MmPrepareMdlForReuse(
- *   IN PMDL  Mdl)
- */
-#define MmPrepareMdlForReuse(_Mdl) \
-{ \
-  if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
-    ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
-    MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
-  } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
-    ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
-  } \
-}
-
-#define MmGetProcedureAddress(Address) (Address)
-
-NTKERNELAPI
-VOID
-NTAPI
-MmProbeAndLockPages(
-  IN OUT PMDL  MemoryDescriptorList,
-  IN KPROCESSOR_MODE  AccessMode,
-  IN LOCK_OPERATION  Operation);
-
-NTKERNELAPI
-MM_SYSTEMSIZE
-NTAPI
-MmQuerySystemSize(
-  VOID);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmRemovePhysicalMemory(
-  IN PPHYSICAL_ADDRESS  StartAddress,
-  IN OUT PLARGE_INTEGER  NumberOfBytes);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmResetDriverPaging(
-  IN PVOID  AddressWithinSection);
-
-NTKERNELAPI
-HANDLE
-NTAPI
-MmSecureVirtualMemory(
-  IN PVOID  Address,
-  IN SIZE_T  Size,
-  IN ULONG  ProbeMode);
-
-NTKERNELAPI
-SIZE_T
-NTAPI
-MmSizeOfMdl(
-  IN PVOID  Base,
-  IN SIZE_T  Length);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnlockPagableImageSection(
-  IN PVOID  ImageSectionHandle);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnlockPages(
-  IN PMDL  MemoryDescriptorList);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnmapIoSpace(
-  IN PVOID  BaseAddress,
-  IN SIZE_T  NumberOfBytes);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnmapReservedMapping(
-  IN PVOID  BaseAddress,
-  IN ULONG  PoolTag,
-  IN PMDL  MemoryDescriptorList);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnmapVideoDisplay(
-  IN PVOID  BaseAddress,
-  IN SIZE_T  NumberOfBytes);
-
-
-
-/** Object manager routines **/
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObAssignSecurity(
-  IN PACCESS_STATE  AccessState,
-  IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
-  IN PVOID  Object,
-  IN POBJECT_TYPE  Type);
-
-NTKERNELAPI
-VOID
-NTAPI
-ObDereferenceSecurityDescriptor(
-  PSECURITY_DESCRIPTOR  SecurityDescriptor,
-  ULONG  Count);
-
-NTKERNELAPI
-LONG_PTR
-FASTCALL
-ObfDereferenceObject(
-  IN PVOID  Object);
-
-/*
- * VOID
- * ObDereferenceObject(
- *   IN PVOID  Object)
- */
-#define ObDereferenceObject ObfDereferenceObject
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObGetObjectSecurity(
-  IN PVOID  Object,
-  OUT PSECURITY_DESCRIPTOR  *SecurityDescriptor,
-  OUT PBOOLEAN  MemoryAllocated);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObInsertObject(
-  IN PVOID  Object,
-  IN PACCESS_STATE  PassedAccessState  OPTIONAL,
-  IN ACCESS_MASK  DesiredAccess,
-  IN ULONG  AdditionalReferences,
-  OUT PVOID*  ReferencedObject  OPTIONAL,
-  OUT PHANDLE  Handle);
-
-NTKERNELAPI
-LONG_PTR
-FASTCALL
-ObfReferenceObject(
-  IN PVOID  Object);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObLogSecurityDescriptor(
-  IN PSECURITY_DESCRIPTOR  InputSecurityDescriptor,
-  OUT PSECURITY_DESCRIPTOR  *OutputSecurityDescriptor,
-  IN ULONG RefBias);
-/*
- * VOID
- * ObReferenceObject(
- *   IN PVOID  Object)
- */
-#define ObReferenceObject ObfReferenceObject
-
-NTKERNELAPI
-VOID
-NTAPI
-ObMakeTemporaryObject(
-  IN PVOID  Object);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObOpenObjectByName(
-  IN POBJECT_ATTRIBUTES  ObjectAttributes,
-  IN POBJECT_TYPE  ObjectType,
-  IN KPROCESSOR_MODE  AccessMode,
-  IN PACCESS_STATE  PassedAccessState,
-  IN ACCESS_MASK  DesiredAccess,
-  IN OUT PVOID  ParseContext  OPTIONAL,
-  OUT PHANDLE  Handle);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObOpenObjectByPointer(
-  IN PVOID  Object,
-  IN ULONG  HandleAttributes,
-  IN PACCESS_STATE  PassedAccessState  OPTIONAL,
-  IN ACCESS_MASK  DesiredAccess  OPTIONAL,
-  IN POBJECT_TYPE  ObjectType  OPTIONAL,
-  IN KPROCESSOR_MODE  AccessMode,
-  OUT PHANDLE  Handle);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObQueryObjectAuditingByHandle(
-  IN HANDLE  Handle,
-  OUT PBOOLEAN  GenerateOnClose);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObReferenceObjectByHandle(
-  IN HANDLE  Handle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_TYPE  ObjectType  OPTIONAL,
-  IN KPROCESSOR_MODE  AccessMode,
-  OUT PVOID  *Object,
-  OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObReferenceObjectByName(
-  IN PUNICODE_STRING  ObjectPath,
-  IN ULONG  Attributes,
-  IN PACCESS_STATE  PassedAccessState  OPTIONAL,
-  IN ACCESS_MASK  DesiredAccess  OPTIONAL,
-  IN POBJECT_TYPE  ObjectType,
-  IN KPROCESSOR_MODE  AccessMode,
-  IN OUT PVOID  ParseContext  OPTIONAL,
-  OUT PVOID  *Object);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ObReferenceObjectByPointer(
-  IN PVOID  Object,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_TYPE  ObjectType,
-  IN KPROCESSOR_MODE  AccessMode);
-
-NTKERNELAPI
-VOID
-NTAPI
-ObReferenceSecurityDescriptor(
-  IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
-  IN ULONG  Count);
-
-NTKERNELAPI
-VOID
-NTAPI
-ObReleaseObjectSecurity(
-  IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
-  IN BOOLEAN  MemoryAllocated);
-
-
-
-/** Process manager routines **/
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsCreateSystemProcess(
-  IN PHANDLE  ProcessHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsCreateSystemThread(
-  OUT PHANDLE  ThreadHandle,
-  IN ULONG  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
-  IN HANDLE  ProcessHandle  OPTIONAL,
-  OUT PCLIENT_ID  ClientId  OPTIONAL,
-  IN PKSTART_ROUTINE  StartRoutine,
-  IN PVOID  StartContext);
-
-/*
- * PEPROCESS
- * PsGetCurrentProcess(VOID)
- */
-#define PsGetCurrentProcess IoGetCurrentProcess
-
-NTKERNELAPI
-HANDLE
-NTAPI
-PsGetCurrentProcessId(
-  VOID);
-
-/*
- * PETHREAD
- * PsGetCurrentThread(VOID)
- */
-#define PsGetCurrentThread() \
-  ((PETHREAD) KeGetCurrentThread())
-
-NTKERNELAPI
-HANDLE
-NTAPI
-PsGetCurrentThreadId(
-  VOID);
-
-NTKERNELAPI
-HANDLE
-NTAPI
-PsGetProcessId(PEPROCESS Process);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-PsGetVersion(
-  PULONG  MajorVersion  OPTIONAL,
-  PULONG  MinorVersion  OPTIONAL,
-  PULONG  BuildNumber  OPTIONAL,
-  PUNICODE_STRING  CSDVersion  OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsRemoveCreateThreadNotifyRoutine(
-  IN PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsRemoveLoadImageNotifyRoutine(
-  IN PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsSetCreateProcessNotifyRoutine(
-  IN PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine,
-  IN BOOLEAN  Remove);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsSetCreateThreadNotifyRoutine(
-  IN PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsSetLoadImageNotifyRoutine(
-  IN PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsTerminateSystemThread(
-  IN NTSTATUS  ExitStatus);
-
-extern NTSYSAPI PEPROCESS PsInitialSystemProcess;
-
-
-/** Security reference monitor routines **/
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-SeAccessCheck(
-  IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
-  IN PSECURITY_SUBJECT_CONTEXT  SubjectSecurityContext,
-  IN BOOLEAN  SubjectContextLocked,
-  IN ACCESS_MASK  DesiredAccess,
-  IN ACCESS_MASK  PreviouslyGrantedAccess,
-  OUT PPRIVILEGE_SET  *Privileges  OPTIONAL,
-  IN PGENERIC_MAPPING  GenericMapping,
-  IN KPROCESSOR_MODE  AccessMode,
-  OUT PACCESS_MASK  GrantedAccess,
-  OUT PNTSTATUS  AccessStatus);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-SeAssignSecurity(
-  IN PSECURITY_DESCRIPTOR  ParentDescriptor  OPTIONAL,
-  IN PSECURITY_DESCRIPTOR  ExplicitDescriptor  OPTIONAL,
-  OUT PSECURITY_DESCRIPTOR  *NewDescriptor,
-  IN BOOLEAN  IsDirectoryObject,
-  IN PSECURITY_SUBJECT_CONTEXT  SubjectContext,
-  IN PGENERIC_MAPPING  GenericMapping,
-  IN POOL_TYPE  PoolType);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-SeAssignSecurityEx(
-  IN PSECURITY_DESCRIPTOR  ParentDescriptor  OPTIONAL,
-  IN PSECURITY_DESCRIPTOR  ExplicitDescriptor  OPTIONAL,
-  OUT PSECURITY_DESCRIPTOR  *NewDescriptor,
-  IN GUID  *ObjectType  OPTIONAL,
-  IN BOOLEAN  IsDirectoryObject,
-  IN ULONG  AutoInheritFlags,
-  IN PSECURITY_SUBJECT_CONTEXT  SubjectContext,
-  IN PGENERIC_MAPPING  GenericMapping,
-  IN POOL_TYPE  PoolType);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-SeDeassignSecurity(
-  IN OUT PSECURITY_DESCRIPTOR  *SecurityDescriptor);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-SeSinglePrivilegeCheck(
-  LUID  PrivilegeValue,
-  KPROCESSOR_MODE  PreviousMode);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-SeValidSecurityDescriptor(
-  IN ULONG  Length,
-  IN PSECURITY_DESCRIPTOR  SecurityDescriptor);
-
-
-
-/** NtXxx routines **/
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtOpenProcess(
-  OUT PHANDLE  ProcessHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes,
-  IN PCLIENT_ID  ClientId  OPTIONAL);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtQueryInformationProcess(
-  IN HANDLE  ProcessHandle,
-  IN PROCESSINFOCLASS  ProcessInformationClass,
-  OUT PVOID  ProcessInformation,
-  IN ULONG  ProcessInformationLength,
-  OUT PULONG  ReturnLength OPTIONAL);
-
-
-
-/** NtXxx and ZwXxx routines **/
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwCancelTimer(
-  IN HANDLE  TimerHandle,
-  OUT PBOOLEAN  CurrentState  OPTIONAL);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtClose(
-  IN HANDLE  Handle);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwClose(
-  IN HANDLE  Handle);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwCreateDirectoryObject(
-  OUT PHANDLE  DirectoryHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtCreateEvent(
-  OUT PHANDLE  EventHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
-  IN EVENT_TYPE  EventType,
-  IN BOOLEAN  InitialState);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwCreateEvent(
-  OUT PHANDLE  EventHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
-  IN EVENT_TYPE  EventType,
-  IN BOOLEAN  InitialState);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwCreateFile(
-  OUT PHANDLE  FileHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  IN PLARGE_INTEGER  AllocationSize  OPTIONAL,
-  IN ULONG  FileAttributes,
-  IN ULONG  ShareAccess,
-  IN ULONG  CreateDisposition,
-  IN ULONG  CreateOptions,
-  IN PVOID  EaBuffer  OPTIONAL,
-  IN ULONG  EaLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwCreateKey(
-  OUT PHANDLE  KeyHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes,
-  IN ULONG  TitleIndex,
-  IN PUNICODE_STRING  Class  OPTIONAL,
-  IN ULONG  CreateOptions,
-  OUT PULONG  Disposition  OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwCreateTimer(
-  OUT PHANDLE  TimerHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,
-  IN TIMER_TYPE  TimerType);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwDeleteKey(
-  IN HANDLE  KeyHandle);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwDeleteValueKey(
-  IN HANDLE  KeyHandle,
-  IN PUNICODE_STRING  ValueName);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtDeviceIoControlFile(
-  IN HANDLE  DeviceHandle,
-  IN HANDLE  Event  OPTIONAL,
-  IN PIO_APC_ROUTINE  UserApcRoutine  OPTIONAL,
-  IN PVOID  UserApcContext  OPTIONAL,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  IN ULONG  IoControlCode,
-  IN PVOID  InputBuffer,
-  IN ULONG  InputBufferSize,
-  OUT PVOID  OutputBuffer,
-  IN ULONG  OutputBufferSize);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwDeviceIoControlFile(
-  IN HANDLE  DeviceHandle,
-  IN HANDLE  Event  OPTIONAL,
-  IN PIO_APC_ROUTINE  UserApcRoutine  OPTIONAL,
-  IN PVOID  UserApcContext  OPTIONAL,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  IN ULONG  IoControlCode,
-  IN PVOID  InputBuffer,
-  IN ULONG  InputBufferSize,
-  OUT PVOID  OutputBuffer,
-  IN ULONG  OutputBufferSize);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwEnumerateKey(
-  IN HANDLE  KeyHandle,
-  IN ULONG  Index,
-  IN KEY_INFORMATION_CLASS  KeyInformationClass,
-  OUT PVOID  KeyInformation,
-  IN ULONG  Length,
-  OUT PULONG  ResultLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwEnumerateValueKey(
-  IN HANDLE  KeyHandle,
-  IN ULONG  Index,
-  IN KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
-  OUT PVOID  KeyValueInformation,
-  IN ULONG  Length,
-  OUT PULONG  ResultLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwFlushKey(
-  IN HANDLE  KeyHandle);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwMakeTemporaryObject(
-  IN HANDLE  Handle);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtMapViewOfSection(
-  IN HANDLE  SectionHandle,
-  IN HANDLE  ProcessHandle,
-  IN OUT PVOID  *BaseAddress,
-  IN ULONG_PTR  ZeroBits,
-  IN SIZE_T  CommitSize,
-  IN OUT PLARGE_INTEGER  SectionOffset  OPTIONAL,
-  IN OUT PSIZE_T  ViewSize,
-  IN SECTION_INHERIT  InheritDisposition,
-  IN ULONG  AllocationType,
-  IN ULONG  Protect);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwMapViewOfSection(
-  IN HANDLE  SectionHandle,
-  IN HANDLE  ProcessHandle,
-  IN OUT PVOID  *BaseAddress,
-  IN ULONG_PTR  ZeroBits,
-  IN SIZE_T  CommitSize,
-  IN OUT PLARGE_INTEGER  SectionOffset  OPTIONAL,
-  IN OUT PSIZE_T  ViewSize,
-  IN SECTION_INHERIT  InheritDisposition,
-  IN ULONG  AllocationType,
-  IN ULONG  Protect);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtOpenFile(
-  OUT PHANDLE  FileHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  IN ULONG  ShareAccess,
-  IN ULONG  OpenOptions);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwOpenFile(
-  OUT PHANDLE  FileHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  IN ULONG  ShareAccess,
-  IN ULONG  OpenOptions);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwOpenKey(
-  OUT PHANDLE  KeyHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwOpenSection(
-  OUT PHANDLE  SectionHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwOpenSymbolicLinkObject(
-  OUT PHANDLE  LinkHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwOpenTimer(
-  OUT PHANDLE  TimerHandle,
-  IN ACCESS_MASK  DesiredAccess,
-  IN POBJECT_ATTRIBUTES  ObjectAttributes);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwQueryInformationFile(
-  IN HANDLE  FileHandle,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  OUT PVOID  FileInformation,
-  IN ULONG  Length,
-  IN FILE_INFORMATION_CLASS  FileInformationClass);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwQueryKey(
-  IN HANDLE  KeyHandle,
-  IN KEY_INFORMATION_CLASS  KeyInformationClass,
-  OUT PVOID  KeyInformation,
-  IN ULONG  Length,
-  OUT PULONG  ResultLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwQuerySymbolicLinkObject(
-  IN HANDLE  LinkHandle,
-  IN OUT PUNICODE_STRING  LinkTarget,
-  OUT PULONG  ReturnedLength  OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwQueryValueKey(
-  IN HANDLE  KeyHandle,
-  IN PUNICODE_STRING  ValueName,
-  IN KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
-  OUT PVOID  KeyValueInformation,
-  IN ULONG  Length,
-  OUT PULONG  ResultLength);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtReadFile(
-  IN HANDLE  FileHandle,
-  IN HANDLE  Event  OPTIONAL,
-  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
-  IN PVOID  ApcContext  OPTIONAL,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  OUT PVOID  Buffer,
-  IN ULONG  Length,
-  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
-  IN PULONG  Key  OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwReadFile(
-  IN HANDLE  FileHandle,
-  IN HANDLE  Event  OPTIONAL,
-  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
-  IN PVOID  ApcContext  OPTIONAL,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  OUT PVOID  Buffer,
-  IN ULONG  Length,
-  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
-  IN PULONG  Key  OPTIONAL);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtSetEvent(
-  IN HANDLE  EventHandle,
-  OUT PLONG  PreviousState  OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwSetEvent(
-  IN HANDLE  EventHandle,
-  OUT PLONG  PreviousState  OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwSetInformationFile(
-  IN HANDLE  FileHandle,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  IN PVOID  FileInformation,
-  IN ULONG  Length,
-  IN FILE_INFORMATION_CLASS  FileInformationClass);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwSetInformationThread(
-  IN HANDLE  ThreadHandle,
-  IN THREADINFOCLASS  ThreadInformationClass,
-  IN PVOID  ThreadInformation,
-  IN ULONG  ThreadInformationLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwSetTimer(
-  IN HANDLE  TimerHandle,
-  IN PLARGE_INTEGER  DueTime,
-  IN PTIMER_APC_ROUTINE  TimerApcRoutine  OPTIONAL,
-  IN PVOID  TimerContext  OPTIONAL,
-  IN BOOLEAN  WakeTimer,
-  IN LONG  Period  OPTIONAL,
-  OUT PBOOLEAN  PreviousState  OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwSetValueKey(
-  IN HANDLE  KeyHandle,
-  IN PUNICODE_STRING  ValueName,
-  IN ULONG  TitleIndex  OPTIONAL,
-  IN ULONG  Type,
-  IN PVOID  Data,
-  IN ULONG  DataSize);
-
-/* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
-#define AT_EXTENDABLE_FILE                0x00002000
-#define AT_RESERVED                       0x20000000
-#define AT_ROUND_TO_PAGE                  0x40000000
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtUnmapViewOfSection(
-  IN HANDLE  ProcessHandle,
-  IN PVOID  BaseAddress);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwUnmapViewOfSection(
-  IN HANDLE  ProcessHandle,
-  IN PVOID  BaseAddress);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtWaitForSingleObject(
-  IN HANDLE  ObjectHandle,
-  IN BOOLEAN  Alertable,
-  IN PLARGE_INTEGER  TimeOut  OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwWaitForSingleObject(
-  IN HANDLE  ObjectHandle,
-  IN BOOLEAN  Alertable,
-  IN PLARGE_INTEGER  TimeOut  OPTIONAL);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtWriteFile(
-  IN HANDLE  FileHandle,
-  IN HANDLE  Event  OPTIONAL,
-  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
-  IN PVOID  ApcContext  OPTIONAL,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  IN PVOID  Buffer,
-  IN ULONG  Length,
-  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
-  IN PULONG  Key  OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwWriteFile(
-  IN HANDLE  FileHandle,
-  IN HANDLE  Event  OPTIONAL,
-  IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,
-  IN PVOID  ApcContext  OPTIONAL,
-  OUT PIO_STATUS_BLOCK  IoStatusBlock,
-  IN PVOID  Buffer,
-  IN ULONG  Length,
-  IN PLARGE_INTEGER  ByteOffset  OPTIONAL,
-  IN PULONG  Key  OPTIONAL);
-
-
-
-/** Power management support routines **/
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PoCallDriver(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN OUT PIRP  Irp);
-
-NTKERNELAPI
-PULONG
-NTAPI
-PoRegisterDeviceForIdleDetection(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN ULONG  ConservationIdleTime,
-  IN ULONG  PerformanceIdleTime,
-  IN DEVICE_POWER_STATE  State);
-
-NTKERNELAPI
-PVOID
-NTAPI
-PoRegisterSystemState(
-  IN PVOID  StateHandle,
-  IN EXECUTION_STATE  Flags);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PoRequestPowerIrp(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN UCHAR  MinorFunction,
-  IN POWER_STATE  PowerState,
-  IN PREQUEST_POWER_COMPLETE  CompletionFunction,
-  IN PVOID  Context,
-  OUT PIRP  *Irp OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PoRequestShutdownEvent(
-  OUT PVOID  *Event);
-
-NTKERNELAPI
-VOID
-NTAPI
-PoSetDeviceBusy(
-  PULONG  IdlePointer);
-
-#define PoSetDeviceBusy(IdlePointer) \
- ((void)(*(IdlePointer) = 0))
-
-NTKERNELAPI
-POWER_STATE
-NTAPI
-PoSetPowerState(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN POWER_STATE_TYPE  Type,
-  IN POWER_STATE  State);
-
-NTKERNELAPI
-VOID
-NTAPI
-PoSetSystemState(
-  IN EXECUTION_STATE  Flags);
-
-NTKERNELAPI
-VOID
-NTAPI
-PoStartNextPowerIrp(
-  IN PIRP  Irp);
-
-NTKERNELAPI
-VOID
-NTAPI
-PoUnregisterSystemState(
-  IN PVOID  StateHandle);
-
-
-
-/** WMI library support routines **/
-
-NTSTATUS
-NTAPI
-WmiCompleteRequest(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PIRP  Irp,
-  IN NTSTATUS  Status,
-  IN ULONG  BufferUsed,
-  IN CCHAR  PriorityBoost);
-
-NTSTATUS
-NTAPI
-WmiFireEvent(
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN LPGUID  Guid,
-  IN ULONG  InstanceIndex,
-  IN ULONG  EventDataSize,
-  IN PVOID  EventData);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-WmiQueryTraceInformation(
-  IN TRACE_INFORMATION_CLASS  TraceInformationClass,
-  OUT PVOID  TraceInformation,
-  IN ULONG  TraceInformationLength,
-  OUT PULONG  RequiredLength OPTIONAL,
-  IN PVOID  Buffer OPTIONAL);
-
-NTSTATUS
-NTAPI
-WmiSystemControl(
-  IN PWMILIB_CONTEXT  WmiLibInfo,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN PIRP  Irp,
-  OUT PSYSCTL_IRP_DISPOSITION  IrpDisposition);
-
-NTKERNELAPI
-NTSTATUS
-DDKCDECLAPI
-WmiTraceMessage(
-  IN TRACEHANDLE  LoggerHandle,
-  IN ULONG  MessageFlags,
-  IN LPGUID  MessageGuid,
-  IN USHORT  MessageNumber,
-  IN ...);
-
-#if 0
-/* FIXME: Get va_list from where? */
-NTKERNELAPI
-NTSTATUS
-DDKCDECLAPI
-WmiTraceMessageVa(
-  IN TRACEHANDLE  LoggerHandle,
-  IN ULONG  MessageFlags,
-  IN LPGUID  MessageGuid,
-  IN USHORT  MessageNumber,
-  IN va_list  MessageArgList);
-#endif
-
-
-/** Kernel debugger routines **/
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KdDisableDebugger(
-  VOID);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KdEnableDebugger(
-  VOID);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KdRefreshDebuggerNotPresent(
-    VOID
-);
-
-#if (NTDDI_VERSION >= NTDDI_WS03SP1)
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KdChangeOption(
-  IN KD_OPTION Option,
-  IN ULONG InBufferBytes OPTIONAL,
-  IN PVOID InBuffer,
-  IN ULONG OutBufferBytes OPTIONAL,
-  OUT PVOID OutBuffer,
-  OUT PULONG OutBufferNeeded OPTIONAL);
-#endif
-
-VOID
-NTAPI
-DbgBreakPoint(
-  VOID);
-
-NTSYSAPI
-VOID
-NTAPI
-DbgBreakPointWithStatus(
-  IN ULONG  Status);
-
-ULONG
-DDKCDECLAPI
-DbgPrint(
-  IN PCCH  Format,
-  IN ...);
-
-NTSYSAPI
-ULONG
-DDKCDECLAPI
-DbgPrintEx(
-  IN ULONG  ComponentId,
-  IN ULONG  Level,
-  IN PCCH  Format,
-  IN ...);
-
-ULONG
-NTAPI
-vDbgPrintEx(
-  IN ULONG ComponentId,
-  IN ULONG Level,
-  IN PCCH Format,
-  IN va_list ap);
-
-ULONG
-NTAPI
-vDbgPrintExWithPrefix(
-  IN PCCH Prefix,
-  IN ULONG ComponentId,
-  IN ULONG Level,
-  IN PCCH Format,
-  IN va_list ap);
-
-NTKERNELAPI
-ULONG
-DDKCDECLAPI
-DbgPrintReturnControlC(
-  IN PCCH  Format,
-  IN ...);
-
-ULONG
-NTAPI
-DbgPrompt(
-    IN PCCH Prompt,
-    OUT PCH Response,
-    IN ULONG MaximumResponseLength
-);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-DbgQueryDebugFilterState(
-  IN ULONG  ComponentId,
-  IN ULONG  Level);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-DbgSetDebugFilterState(
-  IN ULONG  ComponentId,
-  IN ULONG  Level,
-  IN BOOLEAN  State);
-
-#if DBG
-
-#define KdPrint(_x_) DbgPrint _x_
-#define KdPrintEx(_x_) DbgPrintEx _x_
-#define KdBreakPoint() DbgBreakPoint()
-#define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
-
-#else /* !DBG */
-
-#define KdPrint(_x_)
-#define KdPrintEx(_x_)
-#define KdBreakPoint()
-#define KdBreakPointWithStatus(s)
-
-#endif /* !DBG */
-
-#if defined(__GNUC__)
-
-extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
-extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
-#define KD_DEBUGGER_ENABLED     KdDebuggerEnabled
-#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
-
-#elif defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
-
-extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
-extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
-#define KD_DEBUGGER_ENABLED     *KdDebuggerEnabled
-#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
-
-#else
-
-extern BOOLEAN KdDebuggerNotPresent;
-extern BOOLEAN KdDebuggerEnabled;
-#define KD_DEBUGGER_ENABLED     KdDebuggerEnabled
-#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
-
-#endif
-
-/** Stuff from winnt4.h */
-
-#ifndef DMA_MACROS_DEFINED
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-BOOLEAN
-NTAPI
-IoFlushAdapterBuffers(
-    IN PADAPTER_OBJECT AdapterObject,
-    IN PMDL Mdl,
-    IN PVOID MapRegisterBase,
-    IN PVOID CurrentVa,
-    IN ULONG Length,
-    IN BOOLEAN WriteToDevice);
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-VOID
-NTAPI
-IoFreeAdapterChannel(
-    IN PADAPTER_OBJECT AdapterObject);
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-VOID
-NTAPI
-IoFreeMapRegisters(
-    IN PADAPTER_OBJECT AdapterObject,
-    IN PVOID MapRegisterBase,
-    IN ULONG NumberOfMapRegisters);
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-PHYSICAL_ADDRESS
-NTAPI
-IoMapTransfer(
-    IN PADAPTER_OBJECT AdapterObject,
-    IN PMDL Mdl,
-    IN PVOID MapRegisterBase,
-    IN PVOID CurrentVa,
-    IN OUT PULONG Length,
-    IN BOOLEAN WriteToDevice);
-
-
-#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
-#endif // !defined(DMA_MACROS_DEFINED)
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAssignResources(
-  IN PUNICODE_STRING  RegistryPath,
-  IN PUNICODE_STRING  DriverClassName  OPTIONAL,
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PDEVICE_OBJECT  DeviceObject  OPTIONAL,
-  IN PIO_RESOURCE_REQUIREMENTS_LIST  RequestedResources,
-  IN OUT PCM_RESOURCE_LIST  *AllocatedResources);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAttachDeviceByPointer(
-  IN PDEVICE_OBJECT  SourceDevice,
-  IN PDEVICE_OBJECT  TargetDevice);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmIsNonPagedSystemAddressValid(
-  IN PVOID  VirtualAddress);
-
-#if defined(_AMD64_) || defined(_IA64_)
-//DECLSPEC_DEPRECATED_DDK_WINXP
-static __inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlLargeIntegerDivide(
-    IN LARGE_INTEGER Dividend,
-    IN LARGE_INTEGER Divisor,
-    IN OUT PLARGE_INTEGER Remainder)
-{
-    LARGE_INTEGER ret;
-    ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
-    if (Remainder)
-        Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
-    return ret;
-}
-#else
-NTSYSAPI
-LARGE_INTEGER
-NTAPI
-RtlLargeIntegerDivide(
-  IN LARGE_INTEGER  Dividend,
-  IN LARGE_INTEGER  Divisor,
-  IN OUT PLARGE_INTEGER  Remainder);
-#endif
-
-NTKERNELAPI
-INTERLOCKED_RESULT
-NTAPI
-ExInterlockedDecrementLong(
-  IN PLONG  Addend,
-  IN PKSPIN_LOCK  Lock);
-
-NTKERNELAPI
-ULONG
-NTAPI
-ExInterlockedExchangeUlong(
-  IN PULONG  Target,
-  IN ULONG  Value,
-  IN PKSPIN_LOCK  Lock);
-
-NTKERNELAPI
-INTERLOCKED_RESULT
-NTAPI
-ExInterlockedIncrementLong(
-  IN PLONG  Addend,
-  IN PKSPIN_LOCK  Lock);
-
-NTHALAPI
-VOID
-NTAPI
-HalAcquireDisplayOwnership(
-  IN PHAL_RESET_DISPLAY_PARAMETERS  ResetDisplayParameters);
-
-NTHALAPI
-NTSTATUS
-NTAPI
-HalAllocateAdapterChannel(
-  IN PADAPTER_OBJECT  AdapterObject,
-  IN PWAIT_CONTEXT_BLOCK  Wcb,
-  IN ULONG  NumberOfMapRegisters,
-  IN PDRIVER_CONTROL  ExecutionRoutine);
-
-NTHALAPI
-PVOID
-NTAPI
-HalAllocateCommonBuffer(
-  IN PADAPTER_OBJECT  AdapterObject,
-  IN ULONG  Length,
-  OUT PPHYSICAL_ADDRESS  LogicalAddress,
-  IN BOOLEAN  CacheEnabled);
-
-NTHALAPI
-NTSTATUS
-NTAPI
-HalAssignSlotResources(
-  IN PUNICODE_STRING  RegistryPath,
-  IN PUNICODE_STRING  DriverClassName,
-  IN PDRIVER_OBJECT  DriverObject,
-  IN PDEVICE_OBJECT  DeviceObject,
-  IN INTERFACE_TYPE  BusType,
-  IN ULONG  BusNumber,
-  IN ULONG  SlotNumber,
-  IN OUT PCM_RESOURCE_LIST  *AllocatedResources);
-
-NTHALAPI
-VOID
-NTAPI
-HalFreeCommonBuffer(
-  IN PADAPTER_OBJECT  AdapterObject,
-  IN ULONG  Length,
-  IN PHYSICAL_ADDRESS  LogicalAddress,
-  IN PVOID  VirtualAddress,
-  IN BOOLEAN  CacheEnabled);
-
-NTHALAPI
-PADAPTER_OBJECT
-NTAPI
-HalGetAdapter(
-  IN PDEVICE_DESCRIPTION  DeviceDescription,
-  IN OUT PULONG  NumberOfMapRegisters);
-
-NTHALAPI
-ULONG
-NTAPI
-HalGetBusData(
-  IN BUS_DATA_TYPE  BusDataType,
-  IN ULONG  BusNumber,
-  IN ULONG  SlotNumber,
-  IN PVOID  Buffer,
-  IN ULONG  Length);
-
-NTHALAPI
-ULONG
-NTAPI
-HalGetBusDataByOffset(
-  IN BUS_DATA_TYPE  BusDataType,
-  IN ULONG  BusNumber,
-  IN ULONG  SlotNumber,
-  IN PVOID  Buffer,
-  IN ULONG  Offset,
-  IN ULONG  Length);
-
-NTHALAPI
-ULONG
-NTAPI
-HalGetDmaAlignmentRequirement(
-  VOID);
-
-NTHALAPI
-ULONG
-NTAPI
-HalGetInterruptVector(
-  IN INTERFACE_TYPE  InterfaceType,
-  IN ULONG  BusNumber,
-  IN ULONG  BusInterruptLevel,
-  IN ULONG  BusInterruptVector,
-  OUT PKIRQL  Irql,
-  OUT PKAFFINITY  Affinity);
-
-NTHALAPI
-ULONG
-NTAPI
-HalReadDmaCounter(
-  IN PADAPTER_OBJECT  AdapterObject);
-
-NTHALAPI
-ULONG
-NTAPI
-HalSetBusData(
-  IN BUS_DATA_TYPE  BusDataType,
-  IN ULONG  BusNumber,
-  IN ULONG  SlotNumber,
-  IN PVOID  Buffer,
-  IN ULONG  Length);
-
-NTHALAPI
-ULONG
-NTAPI
-HalSetBusDataByOffset(
-  IN BUS_DATA_TYPE  BusDataType,
-  IN ULONG  BusNumber,
-  IN ULONG  SlotNumber,
-  IN PVOID  Buffer,
-  IN ULONG  Offset,
-  IN ULONG  Length);
-
-NTHALAPI
-BOOLEAN
-NTAPI
-HalTranslateBusAddress(
-  IN INTERFACE_TYPE  InterfaceType,
-  IN ULONG  BusNumber,
-  IN PHYSICAL_ADDRESS  BusAddress,
-  IN OUT PULONG  AddressSpace,
-  OUT PPHYSICAL_ADDRESS  TranslatedAddress);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerEqualToZero(
-  IN LARGE_INTEGER  Operand);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerGreaterOrEqualToZero(
-  IN LARGE_INTEGER  Operand);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerGreaterThan(
-  IN LARGE_INTEGER  Operand1,
-  IN LARGE_INTEGER  Operand2);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerGreaterThanOrEqualTo(
-  IN LARGE_INTEGER  Operand1,
-  IN LARGE_INTEGER  Operand2);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerGreaterThanZero(
-  IN LARGE_INTEGER  Operand);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerLessOrEqualToZero(
-  IN LARGE_INTEGER  Operand);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerLessThan(
-  IN LARGE_INTEGER  Operand1,
-  IN LARGE_INTEGER  Operand2);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerLessThanOrEqualTo(
-  IN LARGE_INTEGER  Operand1,
-  IN LARGE_INTEGER  Operand2);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerLessThanZero(
-  IN LARGE_INTEGER  Operand);
-
-NTSYSAPI
-LARGE_INTEGER
-NTAPI
-RtlLargeIntegerNegate(
-  IN LARGE_INTEGER  Subtrahend);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerNotEqualTo(
-  IN LARGE_INTEGER  Operand1,
-  IN LARGE_INTEGER  Operand2);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlLargeIntegerNotEqualToZero(
-  IN LARGE_INTEGER  Operand);
-
-NTSYSAPI
-LARGE_INTEGER
-NTAPI
-RtlLargeIntegerShiftLeft(
-  IN LARGE_INTEGER  LargeInteger,
-  IN CCHAR  ShiftCount);
-
-NTSYSAPI
-LARGE_INTEGER
-NTAPI
-RtlLargeIntegerShiftRight(
-  IN LARGE_INTEGER  LargeInteger,
-  IN CCHAR  ShiftCount);
-
-NTSYSAPI
-LARGE_INTEGER
-NTAPI
-RtlLargeIntegerSubtract(
-  IN LARGE_INTEGER  Minuend,
-  IN LARGE_INTEGER  Subtrahend);
-
-
-/*
- * ULONG
- * COMPUTE_PAGES_SPANNED(
- *   IN PVOID  Va,
- *   IN ULONG  Size)
- */
-#define COMPUTE_PAGES_SPANNED(Va, \
-                              Size) \
-  (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size))
-
-
-/*
-** Architecture specific structures
-*/
-
-#ifdef _X86_
-
-NTKERNELAPI
-INTERLOCKED_RESULT
-FASTCALL
-Exfi386InterlockedIncrementLong(
-  IN PLONG  Addend);
-
-NTKERNELAPI
-INTERLOCKED_RESULT
-FASTCALL
-Exfi386InterlockedDecrementLong(
-  IN PLONG  Addend);
-
-NTKERNELAPI
-ULONG
-FASTCALL
-Exfi386InterlockedExchangeUlong(
-  IN PULONG  Target,
-  IN ULONG  Value);
-
-#define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
-#define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
-#define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
-
-#endif /* _X86_ */
-    
-#ifdef _M_ARM
-//
-// NT-ARM is not documented
-//
-#include <armddk.h>   
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __WINDDK_H */
diff --git a/reactos/include/ddk/wmilib.h b/reactos/include/ddk/wmilib.h
new file mode 100644 (file)
index 0000000..22bb087
--- /dev/null
@@ -0,0 +1,126 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum _WMIENABLEDISABLECONTROL {
+  WmiEventControl,
+  WmiDataBlockControl
+} WMIENABLEDISABLECONTROL, *PWMIENABLEDISABLECONTROL;
+
+typedef enum _SYSCTL_IRP_DISPOSITION {
+  IrpProcessed,
+  IrpNotCompleted,
+  IrpNotWmi,
+  IrpForward
+} SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION;
+
+typedef struct _WMIGUIDREGINFO {
+  LPCGUID Guid;
+  ULONG InstanceCount;
+  ULONG Flags;
+} WMIGUIDREGINFO, *PWMIGUIDREGINFO;
+
+typedef NTSTATUS
+(NTAPI *PWMI_QUERY_REGINFO) (
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PULONG RegFlags,
+  IN OUT PUNICODE_STRING InstanceName,
+  OUT PUNICODE_STRING *RegistryPath OPTIONAL,
+  IN OUT PUNICODE_STRING MofResourceName,
+  OUT PDEVICE_OBJECT *Pdo OPTIONAL);
+
+typedef NTSTATUS
+(NTAPI *PWMI_QUERY_DATABLOCK) (
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN ULONG GuidIndex,
+  IN ULONG InstanceIndex,
+  IN ULONG InstanceCount,
+  OUT PULONG InstanceLengthArray OPTIONAL,
+  IN ULONG BufferAvail,
+  OUT PUCHAR Buffer OPTIONAL);
+
+typedef NTSTATUS
+(NTAPI *PWMI_SET_DATABLOCK) (
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN ULONG GuidIndex,
+  IN ULONG InstanceIndex,
+  IN ULONG BufferSize,
+  IN PUCHAR Buffer);
+
+typedef NTSTATUS
+(NTAPI *PWMI_SET_DATAITEM) (
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN ULONG GuidIndex,
+  IN ULONG InstanceIndex,
+  IN ULONG DataItemId,
+  IN ULONG BufferSize,
+  IN PUCHAR Buffer);
+
+typedef NTSTATUS
+(NTAPI *PWMI_EXECUTE_METHOD) (
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN ULONG GuidIndex,
+  IN ULONG InstanceIndex,
+  IN ULONG MethodId,
+  IN ULONG InBufferSize,
+  IN ULONG OutBufferSize,
+  IN OUT PUCHAR Buffer);
+
+typedef NTSTATUS
+(NTAPI *PWMI_FUNCTION_CONTROL) (
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN ULONG GuidIndex,
+  IN WMIENABLEDISABLECONTROL Function,
+  IN BOOLEAN Enable);
+
+typedef struct _WMILIB_CONTEXT {
+  ULONG GuidCount;
+  PWMIGUIDREGINFO GuidList;
+  PWMI_QUERY_REGINFO QueryWmiRegInfo;
+  PWMI_QUERY_DATABLOCK QueryWmiDataBlock;
+  PWMI_SET_DATABLOCK SetWmiDataBlock;
+  PWMI_SET_DATAITEM SetWmiDataItem;
+  PWMI_EXECUTE_METHOD ExecuteWmiMethod;
+  PWMI_FUNCTION_CONTROL WmiFunctionControl;
+} WMILIB_CONTEXT, *PWMILIB_CONTEXT;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTSTATUS
+NTAPI
+WmiCompleteRequest(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN NTSTATUS Status,
+  IN ULONG BufferUsed,
+  IN CCHAR PriorityBoost);
+
+NTSTATUS
+NTAPI
+WmiSystemControl(
+  IN PWMILIB_CONTEXT WmiLibInfo,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
+
+NTSTATUS
+NTAPI
+WmiFireEvent(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN LPCGUID Guid,
+  IN ULONG InstanceIndex,
+  IN ULONG EventDataSize,
+  IN PVOID EventData);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/reactos/include/ddk/wmlib.h b/reactos/include/ddk/wmlib.h
new file mode 100644 (file)
index 0000000..98b8575
--- /dev/null
@@ -0,0 +1,129 @@
+
+#ifndef _WMILIB_
+#define _WMILIB_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _WMIGUIDREGINFO {
+  LPCGUID Guid;
+  ULONG InstanceCount;
+  ULONG Flags;
+} WMIGUIDREGINFO, *PWMIGUIDREGINFO;
+
+typedef enum _WMIENABLEDISABLECONTROL {
+  WmiEventControl,
+  WmiDataBlockControl
+} WMIENABLEDISABLECONTROL, *PWMIENABLEDISABLECONTROL;
+
+typedef enum _SYSCTL_IRP_DISPOSITION {
+  IrpProcessed,
+  IrpNotCompleted,
+  IrpNotWmi,
+  IrpForward
+} SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION;
+
+typedef
+NTSTATUS
+(NTAPI WMI_QUERY_REGINFO_CALLBACK)(
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PULONG RegFlags,
+  IN OUT PUNICODE_STRING InstanceName,
+  IN OUT PUNICODE_STRING *RegistryPath OPTIONAL,
+  IN OUT PUNICODE_STRING MofResourceName,
+  OUT PDEVICE_OBJECT *Pdo OPTIONAL);
+
+typedef WMI_QUERY_REGINFO_CALLBACK *PWMI_QUERY_REGINFO;
+
+typedef
+NTSTATUS
+(NTAPI WMI_QUERY_DATABLOCK_CALLBACK)(
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN OUT ULONG GuidIndex,
+  IN ULONG InstanceIndex,
+  IN ULONG InstanceCount,
+  OUT PULONG InstanceLengthArray OPTIONAL,
+  IN ULONG BufferAvail,
+  OUT PUCHAR Buffer OPTIONAL);
+
+typedef WMI_QUERY_DATABLOCK_CALLBACK *PWMI_QUERY_DATABLOCK;
+
+typedef
+NTSTATUS
+(NTAPI WMI_SET_DATABLOCK_CALLBACK)(
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN ULONG GuidIndex,
+  IN ULONG InstanceIndex,
+  IN ULONG BufferSize,
+  IN  PUCHAR Buffer);
+
+typedef WMI_SET_DATABLOCK_CALLBACK *PWMI_SET_DATABLOCK;
+
+typedef
+NTSTATUS
+(NTAPI WMI_SET_DATAITEM_CALLBACK)(
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN ULONG GuidIndex,
+  IN ULONG InstanceIndex,
+  IN ULONG DataItemId,
+  IN ULONG BufferSize,
+  IN PUCHAR Buffer);
+
+typedef WMI_SET_DATAITEM_CALLBACK *PWMI_SET_DATAITEM;
+
+typedef
+NTSTATUS
+(NTAPI WMI_EXECUTE_METHOD_CALLBACK)(
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN ULONG GuidIndex,
+  IN ULONG InstanceIndex,
+  IN ULONG MethodId,
+  IN ULONG InBufferSize,
+  IN ULONG OutBufferSize,
+  IN OUT PUCHAR Buffer);
+
+typedef WMI_EXECUTE_METHOD_CALLBACK *PWMI_EXECUTE_METHOD;
+
+typedef
+NTSTATUS
+(NTAPI WMI_FUNCTION_CONTROL_CALLBACK)(
+  IN OUT PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  IN ULONG GuidIndex,
+  IN WMIENABLEDISABLECONTROL Function,
+  IN BOOLEAN Enable);
+
+typedef WMI_FUNCTION_CONTROL_CALLBACK *PWMI_FUNCTION_CONTROL;
+
+typedef struct _WMILIB_CONTEXT {
+  ULONG GuidCount;
+  PWMIGUIDREGINFO GuidList;
+  PWMI_QUERY_REGINFO QueryWmiRegInfo;
+  PWMI_QUERY_DATABLOCK QueryWmiDataBlock;
+  PWMI_SET_DATABLOCK SetWmiDataBlock;
+  PWMI_SET_DATAITEM SetWmiDataItem;
+  PWMI_EXECUTE_METHOD ExecuteWmiMethod;
+  PWMI_FUNCTION_CONTROL WmiFunctionControl;
+} WMILIB_CONTEXT, *PWMILIB_CONTEXT;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSTATUS
+NTAPI
+WmiSystemControl(
+  IN PWMILIB_CONTEXT WmiLibInfo,
+  IN PDEVICE_OBJECT DeviceObject,
+  IN OUT PIRP Irp,
+  OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_WMILIB_ */
+
index 52e6959..683003e 100644 (file)
@@ -348,6 +348,22 @@ interface IReferenceClock : IUnknown
 
 typedef IReferenceClock *PREFERENCECLOCK;
 
+
+[
+local,
+object,
+uuid(ebec459c-2eca-4d42-a8af-30df557614b8),
+pointer_default(unique)
+]
+interface IReferenceClockTimerControl : IUnknown {
+
+    HRESULT SetDefaultTimerResolution(
+        REFERENCE_TIME timerResolution);
+    HRESULT GetDefaultTimerResolution(
+        [out] REFERENCE_TIME* pTimerResolution);
+}
+
+
 /*
 [
 object,
index 27dd4db..72e37ce 100644 (file)
@@ -420,6 +420,10 @@ interface IOverlayNotify : IUnknown
 
 typedef IOverlayNotify *POVERLAYNOTIFY;
 
+cpp_quote("#if 0")
+typedef HANDLE HMONITOR;
+cpp_quote("#endif /* 0 */")
+
 [
 object,
 local,
@@ -548,6 +552,21 @@ interface IFileSinkFilter2 : IFileSinkFilter
 
 typedef IFileSinkFilter2 *PFILESINKFILTER2;
 
+[
+        object,
+        uuid(f90a6130-b658-11d2-ae49-0000f8754b99),
+        pointer_default(unique)
+]
+interface IAMDeviceRemoval : IUnknown
+{
+    HRESULT DeviceInfo(
+        [out] CLSID *pclsidInterfaceClass,
+        [out] LPWSTR *pwszSymbolicLink);
+    HRESULT Reassociate();
+    HRESULT Disassociate();
+}
+
+
 typedef enum
 {
     AM_FILE_OVERWRITE = 0x00000001,
@@ -775,6 +794,37 @@ interface IStreamBuilder : IUnknown
         );
 }
 
+[
+    object,
+    uuid(56a868af-0ad4-11ce-b03a-0020af0ba770),
+    pointer_default(unique)
+]
+interface IDistributorNotify : IUnknown
+{
+    HRESULT Stop(void);
+    HRESULT Pause(void);
+    HRESULT Run(REFERENCE_TIME tStart);
+    HRESULT SetSyncSource([in] IReferenceClock * pClock);
+    HRESULT NotifyGraphChange(void);
+}
+
+typedef enum
+{
+    AM_STREAM_INFO_START_DEFINED   = 0x01,
+    AM_STREAM_INFO_STOP_DEFINED    = 0x02,
+    AM_STREAM_INFO_DISCARDING      = 0x04,
+    AM_STREAM_INFO_STOP_SEND_EXTRA = 0x10
+} AM_STREAM_INFO_FLAGS;
+
+typedef struct
+{
+    REFERENCE_TIME tStart;
+    REFERENCE_TIME tStop;
+    DWORD dwStartCookie;
+    DWORD dwStopCookie;
+    DWORD dwFlags;
+}AM_STREAM_INFO;
+
 
 /*****************************************************************************
  * IAMStreamConfig interface
@@ -990,6 +1040,19 @@ interface ISeekingPassThru : IUnknown
     HRESULT Init( [in] BOOL bSupportRendering, [in] IPin *pPin);
 }
 
+[
+    local,
+    object,
+    uuid(4d5466b0-a49c-11d1-abe8-00a0c905f375),
+    pointer_default(unique)
+
+]
+interface IAMClockAdjust : IUnknown
+{
+    HRESULT SetClockDelta([in] REFERENCE_TIME rtDelta);
+};
+
+
 enum _AM_FILTER_MISC_FLAGS
 {
     AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x1,
@@ -1006,3 +1069,49 @@ interface IAMFilterMiscFlags : IUnknown
 {
     ULONG GetMiscFlags();
 };
+
+[
+    local,
+    object,
+    uuid(56ED71A0-AF5F-11D0-B3F0-00AA003761C5),
+    pointer_default(unique)
+]
+interface IAMBufferNegotiation : IUnknown
+{
+     HRESULT SuggestAllocatorProperties (
+        [in] const ALLOCATOR_PROPERTIES *pprop);
+
+     HRESULT GetAllocatorProperties (
+        [out] ALLOCATOR_PROPERTIES *pprop);
+
+}
+
+#include <axextendenums.h>
+
+[
+    object,
+    uuid(36b73881-c2c8-11cf-8b46-00805f6cef60),
+    pointer_default(unique)
+]
+interface IAMStreamControl : IUnknown
+{
+    HRESULT StartAt( [in] REFERENCE_TIME * ptStart,
+                     [in] DWORD dwCookie );
+    HRESULT StopAt(  [in] REFERENCE_TIME * ptStop,
+                     [in] BOOL bSendExtra,
+                     [in] DWORD dwCookie );
+    HRESULT GetInfo( [out] AM_STREAM_INFO *pInfo);
+}
+
+typedef enum tagTVAudioMode
+{
+    AMTVAUDIO_MODE_MONO     = 0x0001,
+    AMTVAUDIO_MODE_STEREO   = 0x0002,
+    AMTVAUDIO_MODE_LANG_A   = 0x0010,
+    AMTVAUDIO_MODE_LANG_B   = 0x0020,
+    AMTVAUDIO_MODE_LANG_C   = 0x0040,
+    AMTVAUDIO_PRESET_STEREO = 0x0200,
+    AMTVAUDIO_PRESET_LANG_A = 0x1000,
+    AMTVAUDIO_PRESET_LANG_B = 0x2000,
+    AMTVAUDIO_PRESET_LANG_C = 0x4000,
+}TVAudioMode;
diff --git a/reactos/include/dxsdk/axextendenums.h b/reactos/include/dxsdk/axextendenums.h
new file mode 100644 (file)
index 0000000..feb8b41
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef AXEXTEND_ENUM_H
+#define AXEXTEND_ENUM_H
+
+typedef enum tagAnalogVideoStandard
+{
+    AnalogVideo_None     = 0x00000000,
+    AnalogVideo_NTSC_M   = 0x00000001,
+    AnalogVideo_NTSC_M_J = 0x00000002,
+    AnalogVideo_NTSC_433 = 0x00000004,
+    AnalogVideo_PAL_B    = 0x00000010,
+    AnalogVideo_PAL_D    = 0x00000020,
+    AnalogVideo_PAL_G    = 0x00000040,
+    AnalogVideo_PAL_H    = 0x00000080,
+    AnalogVideo_PAL_I    = 0x00000100,
+    AnalogVideo_PAL_M    = 0x00000200,
+    AnalogVideo_PAL_N    = 0x00000400,
+    AnalogVideo_PAL_60   = 0x00000800,
+    AnalogVideo_SECAM_B  = 0x00001000,
+    AnalogVideo_SECAM_D  = 0x00002000,
+    AnalogVideo_SECAM_G  = 0x00004000,
+    AnalogVideo_SECAM_H  = 0x00008000,
+    AnalogVideo_SECAM_K  = 0x00010000,
+    AnalogVideo_SECAM_K1 = 0x00020000,
+    AnalogVideo_SECAM_L  = 0x00040000,
+    AnalogVideo_SECAM_L1 = 0x00080000,
+    AnalogVideo_PAL_N_COMBO = 0x00100000,
+    AnalogVideoMask_MCE_NTSC = AnalogVideo_NTSC_M | AnalogVideo_NTSC_M_J | AnalogVideo_NTSC_433 | AnalogVideo_PAL_M | AnalogVideo_PAL_N | AnalogVideo_PAL_60 | AnalogVideo_PAL_N_COMBO,
+    AnalogVideoMask_MCE_PAL = AnalogVideo_PAL_B | AnalogVideo_PAL_D | AnalogVideo_PAL_G | AnalogVideo_PAL_H | AnalogVideo_PAL_I,
+    AnalogVideoMask_MCE_SECAM = AnalogVideo_SECAM_B | AnalogVideo_SECAM_D  | AnalogVideo_SECAM_G |AnalogVideo_SECAM_H |AnalogVideo_SECAM_K | AnalogVideo_SECAM_K1 |AnalogVideo_SECAM_L | AnalogVideo_SECAM_L1,
+}AnalogVideoStandard;
+
+typedef enum tagTunerInputType
+{
+    TunerInputCable,
+    TunerInputAntenna
+} TunerInputType;
+
+#endif
index 2eab21c..3cf12d5 100644 (file)
@@ -201,4 +201,189 @@ typedef enum {
         NULL, 0, NULL, NULL, 0)
 
 
+/* ------------------------------------------------------------
+  BDA Change Sync Method Set {FD0A5AF3-B41D-11d2-9C95-00C04F7971E0}
+*/
+
+#define STATIC_KSMETHODSETID_BdaChangeSync \
+    0xfd0a5af3, 0xb41d, 0x11d2, {0x9c, 0x95, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}
+DEFINE_GUIDSTRUCT("FD0A5AF3-B41D-11d2-9C95-00C04F7971E0", KSMETHODSETID_BdaChangeSync);
+#define KSMETHODSETID_BdaChangeSync DEFINE_GUIDNAMED(KSMETHODSETID_BdaChangeSync)
+
+typedef enum {
+    KSMETHOD_BDA_START_CHANGES = 0,
+    KSMETHOD_BDA_CHECK_CHANGES,
+    KSMETHOD_BDA_COMMIT_CHANGES,
+    KSMETHOD_BDA_GET_CHANGE_STATE
+} KSMETHOD_BDA_CHANGE_SYNC;
+
+#define DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES(MethodHandler, SupportHandler)\
+    DEFINE_KSMETHOD_ITEM(\
+        KSMETHOD_BDA_START_CHANGES,\
+        KSMETHOD_TYPE_NONE,\
+        (MethodHandler),\
+        sizeof(KSMETHOD),\
+        0,\
+        SupportHandler)
+
+#define DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES(MethodHandler, SupportHandler)\
+    DEFINE_KSMETHOD_ITEM(\
+        KSMETHOD_BDA_CHECK_CHANGES,\
+        KSMETHOD_TYPE_NONE,\
+        (MethodHandler),\
+        sizeof(KSMETHOD),\
+        0,\
+        SupportHandler)
+
+#define DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES(MethodHandler, SupportHandler)\
+    DEFINE_KSMETHOD_ITEM(\
+        KSMETHOD_BDA_COMMIT_CHANGES,\
+        KSMETHOD_TYPE_NONE,\
+        (MethodHandler),\
+        sizeof(KSMETHOD),\
+        0,\
+        SupportHandler)
+
+#define DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE(MethodHandler, SupportHandler)\
+    DEFINE_KSMETHOD_ITEM(\
+        KSMETHOD_BDA_GET_CHANGE_STATE,\
+        KSMETHOD_TYPE_READ,\
+        (MethodHandler),\
+        sizeof(KSMETHOD),\
+        0,\
+        SupportHandler)
+
+#define STATIC_KSPROPSETID_BdaFrequencyFilter \
+    0x71985f47, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0
+DEFINE_GUIDSTRUCT("71985F47-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaFrequencyFilter);
+#define KSPROPSETID_BdaFrequencyFilter DEFINE_GUIDNAMED(KSPROPSETID_BdaFrequencyFilter)
+
+typedef enum {
+    KSPROPERTY_BDA_RF_TUNER_FREQUENCY = 0,
+    KSPROPERTY_BDA_RF_TUNER_POLARITY,
+    KSPROPERTY_BDA_RF_TUNER_RANGE,
+    KSPROPERTY_BDA_RF_TUNER_TRANSPONDER,
+    KSPROPERTY_BDA_RF_TUNER_BANDWIDTH,
+    KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER,
+    KSPROPERTY_BDA_RF_TUNER_CAPS,
+    KSPROPERTY_BDA_RF_TUNER_SCAN_STATUS,
+    KSPROPERTY_BDA_RF_TUNER_STANDARD,
+    KSPROPERTY_BDA_RF_TUNER_STANDARD_MODE
+}KSPROPERTY_BDA_FREQUENCY_FILTER;
+
+
+#define STATIC_KSPROPSETID_BdaDigitalDemodulator \
+    0xef30f379, 0x985b, 0x4d10, 0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x4, 0xe1, 0xe0
+DEFINE_GUIDSTRUCT("EF30F379-985B-4d10-B640-A79D5E04E1E0", KSPROPSETID_BdaDigitalDemodulator);
+#define KSPROPSETID_BdaDigitalDemodulator DEFINE_GUIDNAMED(KSPROPSETID_BdaDigitalDemodulator)
+
+typedef enum {
+    KSPROPERTY_BDA_MODULATION_TYPE = 0,
+    KSPROPERTY_BDA_INNER_FEC_TYPE,
+    KSPROPERTY_BDA_INNER_FEC_RATE,
+    KSPROPERTY_BDA_OUTER_FEC_TYPE,
+    KSPROPERTY_BDA_OUTER_FEC_RATE,
+    KSPROPERTY_BDA_SYMBOL_RATE,
+    KSPROPERTY_BDA_SPECTRAL_INVERSION,
+    KSPROPERTY_BDA_GUARD_INTERVAL,
+    KSPROPERTY_BDA_TRANSMISSION_MODE,
+    KSPROPERTY_BDA_ROLL_OFF,
+    KSPROPERTY_BDA_PILOT,
+    KSPROPERTY_BDA_SIGNALTIMEOUTS
+}KSPROPERTY_BDA_DIGITAL_DEMODULATOR;
+
+#define STATIC_KSPROPSETID_BdaLNBInfo \
+    0x992cf102, 0x49f9, 0x4719, 0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x8, 0xf4
+DEFINE_GUIDSTRUCT("992CF102-49F9-4719-A664-C4F23E2408F4", KSPROPSETID_BdaLNBInfo);
+#define KSPROPSETID_BdaLNBInfo DEFINE_GUIDNAMED(KSPROPSETID_BdaLNBInfo)
+
+typedef enum {
+    KSPROPERTY_BDA_LNB_LOF_LOW_BAND = 0,
+    KSPROPERTY_BDA_LNB_LOF_HIGH_BAND,
+    KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY
+}KSPROPERTY_BDA_LNB_INFO;
+
+#define STATIC_KSPROPSETID_BdaSignalStats \
+    0x1347d106, 0xcf3a, 0x428a, 0xa5, 0xcb, 0xac, 0xd, 0x9a, 0x2a, 0x43, 0x38
+DEFINE_GUIDSTRUCT("1347D106-CF3A-428a-A5CB-AC0D9A2A4338", KSPROPSETID_BdaSignalStats);
+#define KSPROPSETID_BdaSignalStats DEFINE_GUIDNAMED(KSPROPSETID_BdaSignalStats)
+
+typedef enum {
+    KSPROPERTY_BDA_SIGNAL_STRENGTH = 0,
+    KSPROPERTY_BDA_SIGNAL_QUALITY,
+    KSPROPERTY_BDA_SIGNAL_PRESENT,
+    KSPROPERTY_BDA_SIGNAL_LOCKED,
+    KSPROPERTY_BDA_SAMPLE_TIME
+}KSPROPERTY_BDA_SIGNAL_STATS;
+
+
+/* ------------------------------------------------------------
+  BDA Stream Format GUIDs
+*/
+
+#define STATIC_KSDATAFORMAT_TYPE_BDA_ANTENNA\
+    0x71985f41, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0
+DEFINE_GUIDSTRUCT("71985F41-1CA1-11d3-9CC8-00C04F7971E0", KSDATAFORMAT_TYPE_BDA_ANTENNA);
+#define KSDATAFORMAT_TYPE_BDA_ANTENNA DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_ANTENNA)
+
+
+#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT\
+    0xf4aeb342, 0x0329, 0x4fdd, 0xa8, 0xfd, 0x4a, 0xff, 0x49, 0x26, 0xc9, 0x78
+DEFINE_GUIDSTRUCT("F4AEB342-0329-4fdd-A8FD-4AFF4926C978", KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT);
+#define KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT)
+
+
+#define STATIC_KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT\
+    0x8deda6fd, 0xac5f, 0x4334, 0x8e, 0xcf, 0xa4, 0xba, 0x8f, 0xa7, 0xd0, 0xf0
+DEFINE_GUIDSTRUCT("8DEDA6FD-AC5F-4334-8ECF-A4BA8FA7D0F0", KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT);
+#define KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT)
+
+
+#define STATIC_KSDATAFORMAT_TYPE_BDA_IF_SIGNAL\
+    0x61be0b47, 0xa5eb, 0x499b, 0x9a, 0x85, 0x5b, 0x16, 0xc0, 0x7f, 0x12, 0x58
+DEFINE_GUIDSTRUCT("61BE0B47-A5EB-499b-9A85-5B16C07F1258", KSDATAFORMAT_TYPE_BDA_IF_SIGNAL);
+#define KSDATAFORMAT_TYPE_BDA_IF_SIGNAL DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_IF_SIGNAL)
+
+
+#define STATIC_KSDATAFORMAT_TYPE_MPEG2_SECTIONS\
+    0x455f176c, 0x4b06, 0x47ce, 0x9a, 0xef, 0x8c, 0xae, 0xf7, 0x3d, 0xf7, 0xb5
+DEFINE_GUIDSTRUCT("455F176C-4B06-47CE-9AEF-8CAEF73DF7B5", KSDATAFORMAT_TYPE_MPEG2_SECTIONS);
+#define KSDATAFORMAT_TYPE_MPEG2_SECTIONS DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_SECTIONS)
+
+
+#define STATIC_KSDATAFORMAT_SUBTYPE_ATSC_SI\
+    0xb3c7397c, 0xd303, 0x414d, 0xb3, 0x3c, 0x4e, 0xd2, 0xc9, 0xd2, 0x97, 0x33
+DEFINE_GUIDSTRUCT("B3C7397C-D303-414D-B33C-4ED2C9D29733", KSDATAFORMAT_SUBTYPE_ATSC_SI);
+#define KSDATAFORMAT_SUBTYPE_ATSC_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ATSC_SI)
+
+
+#define STATIC_KSDATAFORMAT_SUBTYPE_DVB_SI\
+    0xe9dd31a3, 0x221d, 0x4adb, 0x85, 0x32, 0x9a, 0xf3, 0x9, 0xc1, 0xa4, 0x8
+DEFINE_GUIDSTRUCT("e9dd31a3-221d-4adb-8532-9af309c1a408", KSDATAFORMAT_SUBTYPE_DVB_SI);
+#define KSDATAFORMAT_SUBTYPE_DVB_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DVB_SI)
+
+
+#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP\
+    0x762e3f66, 0x336f, 0x48d1, 0xbf, 0x83, 0x2b, 0x0, 0x35, 0x2c, 0x11, 0xf0
+DEFINE_GUIDSTRUCT("762E3F66-336F-48d1-BF83-2B00352C11F0", KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP);
+#define KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP)
+
+
+#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP\
+    0x951727db, 0xd2ce, 0x4528, 0x96, 0xf6, 0x33, 0x1, 0xfa, 0xbb, 0x2d, 0xe0
+DEFINE_GUIDSTRUCT("951727DB-D2CE-4528-96F6-3301FABB2DE0", KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP);
+#define KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP)
+
+
+#define STATIC_KSDATAFORMAT_SUBTYPE_ISDB_SI\
+    0x4a2eeb99, 0x6458, 0x4538, 0xb1, 0x87, 0x04, 0x01, 0x7c, 0x41, 0x41, 0x3f
+DEFINE_GUIDSTRUCT("4a2eeb99-6458-4538-b187-04017c41413f", KSDATAFORMAT_SUBTYPE_ISDB_SI);
+#define KSDATAFORMAT_SUBTYPE_ISDB_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ISDB_SI)
+
+
+#define STATIC_KSDATAFORMAT_SUBTYPE_PBDA_TRANSPORT_RAW\
+    0x0d7aed42, 0xcb9a, 0x11db, 0x97, 0x05, 0x00, 0x50, 0x56, 0xc0, 0x00, 0x08
+DEFINE_GUIDSTRUCT("0d7AED42-CB9A-11DB-9705-005056C00008", KSDATAFORMAT_SUBTYPE_PBDA_TRANSPORT_RAW);
+#define KSDATAFORMAT_SUBTYPE_PBDA_TRANSPORT_RAW DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_PBDA_TRANSPORT_RAW)
+
 #endif
index 6220d85..5dc72cd 100644 (file)
@@ -162,19 +162,6 @@ typedef struct
     MEDIA_SAMPLE_CONTENT MediaSampleContent ;
 } PID_MAP ;
 
-
-typedef struct _KSM_PIN
-{
-    KSMETHOD    Method;
-    union
-    {
-        ULONG       PinId;
-        ULONG       PinType;
-    };
-    ULONG       Reserved;
-} KSM_PIN, * PKSM_PIN;
-
-
 typedef struct _BDA_PID_MAP
 {
     MEDIA_SAMPLE_CONTENT MediaSampleContent;
index a15cab6..766d4ca 100644 (file)
 
 typedef LPCSTR D3DXHANDLE;
 
+typedef enum _D3DXREGISTER_SET
+{
+    D3DXRS_BOOL,
+    D3DXRS_INT4,
+    D3DXRS_FLOAT4,
+    D3DXRS_SAMPLER,
+    D3DXRS_FORCE_DWORD = 0x7fffffff
+} D3DXREGISTER_SET, *LPD3DXREGISTER_SET;
+
 typedef enum D3DXPARAMETER_CLASS
 {
     D3DXPC_SCALAR,
@@ -80,6 +89,131 @@ typedef enum D3DXPARAMETER_TYPE
     D3DXPT_FORCE_DWORD = 0x7fffffff,
 } D3DXPARAMETER_TYPE, *LPD3DXPARAMETER_TYPE;
 
+typedef struct _D3DXCONSTANTTABLE_DESC
+{
+    LPCSTR Creator;
+    DWORD Version;
+    UINT Constants;
+} D3DXCONSTANTTABLE_DESC, *LPD3DXCONSTANTTABLE_DESC;
+
+typedef struct _D3DXCONSTANT_DESC
+{
+    LPCSTR Name;
+    D3DXREGISTER_SET RegisterSet;
+    UINT RegisterIndex;
+    UINT RegisterCount;
+    D3DXPARAMETER_CLASS Class;
+    D3DXPARAMETER_TYPE Type;
+    UINT Rows;
+    UINT Columns;
+    UINT Elements;
+    UINT StructMembers;
+    UINT Bytes;
+    LPCVOID DefaultValue;
+} D3DXCONSTANT_DESC, *LPD3DXCONSTANT_DESC;
+
+DEFINE_GUID(IID_ID3DXConstantTable, 0x9dca3190, 0x38b9, 0x4fc3, 0x92, 0xe3, 0x39, 0xc6, 0xdd, 0xfb, 0x35, 0x8b);
+
+#undef INTERFACE
+#define INTERFACE ID3DXConstantTable
+
+DECLARE_INTERFACE_(ID3DXConstantTable, ID3DXBuffer)
+{
+    /*** IUnknown methods ***/
+    STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
+    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
+    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** ID3DXBuffer methods ***/
+    STDMETHOD_(LPVOID, GetBufferPointer)(THIS) PURE;
+    STDMETHOD_(DWORD, GetBufferSize)(THIS) PURE;
+    /*** ID3DXConstantTable methods ***/
+    STDMETHOD(GetDesc)(THIS_ D3DXCONSTANTTABLE_DESC *pDesc) PURE;
+    STDMETHOD(GetConstantDesc)(THIS_ D3DXHANDLE hConstant, D3DXCONSTANT_DESC *pConstantDesc, UINT *pCount) PURE;
+    STDMETHOD_(D3DXHANDLE, GetConstant)(THIS_ D3DXHANDLE hConstant, UINT Index) PURE;
+    STDMETHOD_(D3DXHANDLE, GetConstantByName)(THIS_ D3DXHANDLE hConstant, LPCSTR pName) PURE;
+    STDMETHOD_(D3DXHANDLE, GetConstantElement)(THIS_ D3DXHANDLE hConstant, UINT Index) PURE;
+    STDMETHOD(SetDefaults)(THIS_ LPDIRECT3DDEVICE9 pDevice) PURE;
+    STDMETHOD(SetValue)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, LPCVOID pData, UINT Bytes) PURE;
+    STDMETHOD(SetBool)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, BOOL b) PURE;
+    STDMETHOD(SetBoolArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST BOOL* pb, UINT Count) PURE;
+    STDMETHOD(SetInt)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, INT n) PURE;
+    STDMETHOD(SetIntArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST INT* pn, UINT Count) PURE;
+    STDMETHOD(SetFloat)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, FLOAT f) PURE;
+    STDMETHOD(SetFloatArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST FLOAT* pf, UINT Count) PURE;
+    STDMETHOD(SetVector)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXVECTOR4* pVector) PURE;
+    STDMETHOD(SetVectorArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXVECTOR4* pVector, UINT Count) PURE;
+    STDMETHOD(SetMatrix)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix) PURE;
+    STDMETHOD(SetMatrixArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix, UINT Count) PURE;
+    STDMETHOD(SetMatrixPointerArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX** ppMatrix, UINT Count) PURE;
+    STDMETHOD(SetMatrixTranspose)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix) PURE;
+    STDMETHOD(SetMatrixTransposeArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix, UINT Count) PURE;
+    STDMETHOD(SetMatrixTransposePointerArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX** ppMatrix, UINT Count) PURE;
+};
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define ID3DXConstantTable_QueryInterface(p,a,b)                      (p)->lpVtbl->QueryInterface(p,a,b)
+#define ID3DXConstantTable_AddRef(p)                                  (p)->lpVtbl->AddRef(p)
+#define ID3DXConstantTable_Release(p)                                 (p)->lpVtbl->Release(p)
+/*** ID3DXBuffer methods ***/
+#define ID3DXConstantTable_GetBufferPointer(p)                        (p)->lpVtbl->GetBufferPointer(p)
+#define ID3DXConstantTable_GetBufferSize(p)                           (p)->lpVtbl->GetBufferSize(p)
+/*** ID3DXConstantTable methods ***/
+#define ID3DXConstantTable_GetDesc(p,a)                               (p)->lpVtbl->GetDesc(p,a)
+#define ID3DXConstantTable_GetConstantDesc(p,a,b,c)                   (p)->lpVtbl->GetConstantDesc(p,a,b,c)
+#define ID3DXConstantTable_GetConstant(p,a,b)                         (p)->lpVtbl->GetConstant(p,a,b)
+#define ID3DXConstantTable_GetConstantByName(p,a,b)                   (p)->lpVtbl->GetConstantByName(p,a,b)
+#define ID3DXConstantTable_GetConstantElement(p,a,b)                  (p)->lpVtbl->GetConstantElement(p,a,b)
+#define ID3DXConstantTable_SetDefaults(p,a)                           (p)->lpVtbl->SetDefaults(p,a)
+#define ID3DXConstantTable_SetValue(p,a,b,c,d)                        (p)->lpVtbl->SetValue(p,a,b,c,d)
+#define ID3DXConstantTable_SetBool(p,a,b,c)                           (p)->lpVtbl->SetBool(p,a,b,c)
+#define ID3DXConstantTable_SetBoolArray(p,a,b,c,d)                    (p)->lpVtbl->SetBoolArray(p,a,b,c,d)
+#define ID3DXConstantTable_SetInt(p,a,b,c)                            (p)->lpVtbl->SetInt(p,a,b,c)
+#define ID3DXConstantTable_SetIntArray(p,a,b,c,d)                     (p)->lpVtbl->SetIntArray(p,a,b,c,d)
+#define ID3DXConstantTable_SetFloat(p,a,b,c)                          (p)->lpVtbl->SetFloat(p,a,b,c)
+#define ID3DXConstantTable_SetFloatArray(p,a,b,c,d)                   (p)->lpVtbl->SetFloatArray(p,a,b,c,d)
+#define ID3DXConstantTable_SetVector(p,a,b,c)                         (p)->lpVtbl->SetVector(p,a,b,c)
+#define ID3DXConstantTable_SetVectorArray(p,a,b,c,d)                  (p)->lpVtbl->SetVectorArray(p,a,b,c,d)
+#define ID3DXConstantTable_SetMatrix(p,a,b,c)                         (p)->lpVtbl->SetMatrix(p,a,b,c)
+#define ID3DXConstantTable_SetMatrixArray(p,a,b,c,d)                  (p)->lpVtbl->SetMatrixArray(p,a,b,c,d)
+#define ID3DXConstantTable_SetMatrixPointerArray(p,a,b,c,d)           (p)->lpVtbl->SetMatrixPointerArray(p,a,b,c,d)
+#define ID3DXConstantTable_SetMatrixTranspose(p,a,b,c)                (p)->lpVtbl->SetMatrixTranspose(p,a,b,c)
+#define ID3DXConstantTable_SetMatrixTransposeArray(p,a,b,c,d)         (p)->lpVtbl->SetMatrixTransposeArray(p,a,b,c,d)
+#define ID3DXConstantTable_SetMatrixTransposePointerArray(p,a,b,c,d)  (p)->lpVtbl->SetMatrixTransposePointerArray(p,a,b,c,d)
+#else
+/*** IUnknown methods ***/
+#define ID3DXConstantTable_QueryInterface(p,a,b)                      (p)->QueryInterface(a,b)
+#define ID3DXConstantTable_AddRef(p)                                  (p)->AddRef()
+#define ID3DXConstantTable_Release(p)                                 (p)->Release()
+/*** ID3DXBuffer methods ***/
+#define ID3DXConstantTable_GetBufferPointer(p)                        (p)->GetBufferPointer()
+#define ID3DXConstantTable_GetBufferSize(p)                           (p)->GetBufferSize()
+/*** ID3DXConstantTable methods ***/
+#define ID3DXConstantTable_GetDesc(p,a)                               (p)->GetDesc(a)
+#define ID3DXConstantTable_GetConstantDesc(p,a,b,c)                   (p)->GetConstantDesc(a,b,c)
+#define ID3DXConstantTable_GetConstant(p,a,b)                         (p)->GetConstant(a,b)
+#define ID3DXConstantTable_GetConstantByName(p,a,b)                   (p)->GetConstantByName(a,b)
+#define ID3DXConstantTable_GetConstantElement(p,a,b)                  (p)->GetConstantElement(a,b)
+#define ID3DXConstantTable_SetDefaults(p,a)                           (p)->SetDefaults(a)
+#define ID3DXConstantTable_SetValue(p,a,b,c,d)                        (p)->SetValue(a,b,c,d)
+#define ID3DXConstantTable_SetBool(p,a,b,c)                           (p)->SetBool(a,b,c)
+#define ID3DXConstantTable_SetBoolArray(p,a,b,c,d)                    (p)->SetBoolArray(a,b,c,d)
+#define ID3DXConstantTable_SetInt(p,a,b,c)                            (p)->SetInt(a,b,c)
+#define ID3DXConstantTable_SetIntArray(p,a,b,c,d)                     (p)->SetIntArray(a,b,c,d)
+#define ID3DXConstantTable_SetFloat(p,a,b,c)                          (p)->SetFloat(a,b,c)
+#define ID3DXConstantTable_SetFloatArray(p,a,b,c,d)                   (p)->SetFloatArray(a,b,c,d)
+#define ID3DXConstantTable_SetVector(p,a,b,c)                         (p)->SetVector(a,b,c)
+#define ID3DXConstantTable_SetVectorArray(p,a,b,c,d)                  (p)->SetVectorArray(a,b,c,d)
+#define ID3DXConstantTable_SetMatrix(p,a,b,c)                         (p)->SetMatrix(a,b,c)
+#define ID3DXConstantTable_SetMatrixArray(p,a,b,c,d)                  (p)->SetMatrixArray(a,b,c,d)
+#define ID3DXConstantTable_SetMatrixPointerArray(p,a,b,c,d)           (p)->SetMatrixPointerArray(a,b,c,d)
+#define ID3DXConstantTable_SetMatrixTranspose(p,a,b,c)                (p)->>SetMatrixTranspose(a,b,c)
+#define ID3DXConstantTable_SetMatrixTransposeArray(p,a,b,c,d)         (p)->SetMatrixTransposeArray(a,b,c,d)
+#define ID3DXConstantTable_SetMatrixTransposePointerArray(p,a,b,c,d)  (p)->SetMatrixTransposePointerArray(a,b,c,d)
+#endif
+
+typedef struct ID3DXConstantTable *LPD3DXCONSTANTTABLE;
+
 typedef struct _D3DXMACRO {
     LPCSTR Name;
     LPCSTR Definition;
@@ -114,6 +248,7 @@ LPCSTR WINAPI D3DXGetPixelShaderProfile(LPDIRECT3DDEVICE9 device);
 UINT WINAPI D3DXGetShaderSize(const DWORD *byte_code);
 DWORD WINAPI D3DXGetShaderVersion(const DWORD *byte_code);
 LPCSTR WINAPI D3DXGetVertexShaderProfile(LPDIRECT3DDEVICE9 device);
+HRESULT WINAPI D3DXFindShaderComment(CONST DWORD* byte_code, DWORD fourcc, LPCVOID* data, UINT* size);
 
 HRESULT WINAPI D3DXAssembleShaderFromFileA(LPCSTR filename,
                                            CONST D3DXMACRO* defines,
@@ -153,6 +288,13 @@ HRESULT WINAPI D3DXAssembleShader(LPCSTR data,
                                   LPD3DXBUFFER* shader,
                                   LPD3DXBUFFER* error_messages);
 
+HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD* byte_code,
+                                            DWORD flags,
+                                            LPD3DXCONSTANTTABLE* constant_table);
+
+HRESULT WINAPI D3DXGetShaderConstantTable(CONST DWORD* byte_code,
+                                          LPD3DXCONSTANTTABLE* constant_table);
+
 #ifdef __cplusplus
 }
 #endif
index 73bc011..adc24b0 100644 (file)
@@ -1,20 +1,34 @@
+/*
+ * Copyright (C) 2002 Alexandre Julliard
+ *
+ * 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 __DMO_H__
 #define __DMO_H__
 
-#include "mediaerr.h"
+#include <mediaerr.h>
 
 #ifdef FIX_LOCK_NAME
-  #define Lock DMOLock
+#define Lock DMOLock
 #endif
-
-#include "mediaobj.h"
-
+#include <mediaobj.h>
 #ifdef FIX_LOCK_NAME
-  #undef Lock
+#undef Lock
 #endif
+#include <dmoreg.h>
+#include <dmort.h>
 
-#include "dmoreg.h"
-#include "dmort.h"
-
-#endif /* __DMO_H__ */
+#endif  /* __DMO_H__ */
index 7fc7af2..66966f9 100644 (file)
@@ -1,75 +1,70 @@
+/*
+ * Copyright (C) 2002 Alexandre Julliard
+ *
+ * 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 __DMOREG_H__
 #define __DMOREG_H__
 
 #include "mediaobj.h"
 
-DEFINE_GUID(DMOCATEGORY_ACOUSTIC_ECHO_CANCEL, 0xBF963D80, 0xC559, 0x11D0, 0x8A, 0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1);
-DEFINE_GUID(DMOCATEGORY_AGC,                  0xE88C9BA0, 0xC557, 0x11D0, 0x8A, 0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1);
-DEFINE_GUID(DMOCATEGORY_AUDIO_CAPTURE_EFFECT, 0xF665AAba, 0x3E09, 0x4920, 0xAA, 0x5F,0x21,0x98,0x11,0x14,0x8F,0x09);
-DEFINE_GUID(DMOCATEGORY_AUDIO_DECODER,        0x57F2db8b, 0xE6BB, 0x4513, 0x9D, 0x43,0xDC,0xD2,0xA6,0x59,0x31,0x25);
-DEFINE_GUID(DMOCATEGORY_AUDIO_EFFECT,         0xF3602b3f, 0x0592, 0x48DF, 0xA4, 0xCD,0x67,0x47,0x21,0xE7,0xEB,0xEB);
-DEFINE_GUID(DMOCATEGORY_AUDIO_ENCODER,        0x33D9A761, 0x90C8, 0x11D0, 0xBD, 0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86);
-DEFINE_GUID(DMOCATEGORY_AUDIO_NOISE_SUPPRESS, 0xE07f903f, 0x62FD, 0x4e60, 0x8C, 0xDD,0xDE,0xA7,0x23,0x66,0x65,0xB5);
-DEFINE_GUID(DMOCATEGORY_VIDEO_DECODER,        0x4A69b442, 0x28BE, 0x4991, 0x96, 0x9C,0xB5,0x00,0xAD,0xF5,0xd8,0xA8);
-DEFINE_GUID(DMOCATEGORY_VIDEO_EFFECT,         0xd990eE14, 0x776C, 0x4723, 0xBE, 0x46,0x3D,0xA2,0xF5,0x6F,0x10,0xB9);
-DEFINE_GUID(DMOCATEGORY_VIDEO_ENCODER,        0x33D9A760, 0x90C8, 0x11D0, 0xBD, 0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86);
-
 typedef struct _DMO_PARTIAL_MEDIATYPE
 {
-  GUID type;
-  GUID subtype;
+   GUID type;
+   GUID subtype;
 } DMO_PARTIAL_MEDIATYPE, *PDMO_PARTIAL_MEDIATYPE;
 
 enum DMO_REGISTER_FLAGS
 {
-  DMO_REGISTERF_IS_KEYED = 0x00000001
+   DMO_REGISTERF_IS_KEYED = 1
 };
 
 enum DMO_ENUM_FLAGS
 {
-  DMO_ENUMF_INCLUDE_KEYED = 0x00000001
+   DMO_ENUMF_INCLUDE_KEYED = 1
 };
 
-STDAPI
-DMOEnum(
-  REFGUID guidCategory,
-  DWORD dwFlags,
-  DWORD cInTypes,
-  const DMO_PARTIAL_MEDIATYPE *pInTypes,
-  DWORD cOutTypes,
-  const DMO_PARTIAL_MEDIATYPE *pOutTypes,
-  IEnumDMO **ppEnum);
-
-STDAPI
-DMOGetName(
-  REFCLSID clsidDMO,
-  WCHAR szName[80]);
-
-STDAPI DMOGetTypes(
-   REFCLSID clsidDMO,
-   unsigned long ulInputTypesRequested,
-   unsigned long *pulInputTypesSupplied,
-   DMO_PARTIAL_MEDIATYPE *pInputTypes,
-   unsigned long ulOutputTypesRequested,
-   unsigned long *pulOutputTypesSupplied,
-   DMO_PARTIAL_MEDIATYPE *pOutputTypes
-);
-
-STDAPI
-DMORegister(
-  LPCWSTR szName,
-  REFCLSID clsidDMO,
-  REFGUID guidCategory,
-  DWORD dwFlags,
-  DWORD cInTypes,
-  const DMO_PARTIAL_MEDIATYPE *pInTypes,
-  DWORD cOutTypes,
-  const DMO_PARTIAL_MEDIATYPE *pOutTypes);
-
-STDAPI
-DMOUnregister(
-  REFCLSID clsidDMO,
-  REFGUID guidCategory);
+HRESULT WINAPI DMORegister(LPCWSTR,REFCLSID,REFGUID,DWORD,DWORD,const DMO_PARTIAL_MEDIATYPE*,
+                           DWORD,const DMO_PARTIAL_MEDIATYPE*);
+HRESULT WINAPI DMOUnregister(REFCLSID,REFGUID);
+HRESULT WINAPI DMOEnum(REFGUID,DWORD,DWORD,const DMO_PARTIAL_MEDIATYPE*,DWORD,
+                       const DMO_PARTIAL_MEDIATYPE*,IEnumDMO**);
+HRESULT WINAPI DMOGetTypes(REFCLSID,ULONG,ULONG*,DMO_PARTIAL_MEDIATYPE*,
+                           ULONG,ULONG*,DMO_PARTIAL_MEDIATYPE*);
+HRESULT WINAPI DMOGetName(REFCLSID,WCHAR[80]);
 
-#endif
+DEFINE_GUID(DMOCATEGORY_AUDIO_DECODER,
+            0x57f2db8b,0xe6bb,0x4513,0x9d,0x43,0xdc,0xd2,0xa6,0x59,0x31,0x25);
+DEFINE_GUID(DMOCATEGORY_AUDIO_ENCODER,
+            0x33d9a761,0x90c8,0x11d0,0xbd,0x43,0x00,0xa0,0xc9,0x11,0xce,0x86);
+DEFINE_GUID(DMOCATEGORY_VIDEO_DECODER,
+            0x4a69b442,0x28be,0x4991,0x96,0x9c,0xb5,0x00,0xad,0xf5,0xd8,0xa8);
+DEFINE_GUID(DMOCATEGORY_VIDEO_ENCODER,
+            0x33d9a760,0x90c8,0x11d0,0xbd,0x43,0x00,0xa0,0xc9,0x11,0xce,0x86);
+DEFINE_GUID(DMOCATEGORY_AUDIO_EFFECT,
+            0xf3602b3f,0x0592,0x48df,0xa4,0xcd,0x67,0x47,0x21,0xe7,0xeb,0xeb);
+DEFINE_GUID(DMOCATEGORY_VIDEO_EFFECT,
+            0xd990ee14,0x776c,0x4723,0xbe,0x46,0x3d,0xa2,0xf5,0x6f,0x10,0xb9);
+DEFINE_GUID(DMOCATEGORY_AUDIO_CAPTURE_EFFECT,
+            0xf665aaba,0x3e09,0x4920,0xaa,0x5f,0x21,0x98,0x11,0x14,0x8f,0x09);
+DEFINE_GUID(DMOCATEGORY_ACOUSTIC_ECHO_CANCEL,
+            0xbf963d80,0xc559,0x11d0,0x8a,0x2b,0x00,0xa0,0xc9,0x25,0x5a,0xc1);
+DEFINE_GUID(DMOCATEGORY_AUDIO_NOISE_SUPPRESS,
+            0xe07f903f,0x62fd,0x4e60,0x8c,0xdd,0xde,0xa7,0x23,0x66,0x65,0xb5);
+DEFINE_GUID(DMOCATEGORY_AGC,
+            0xe88c9ba0,0xc557,0x11d0,0x8a,0x2b,0x00,0xa0,0xc9,0x25,0x5a,0xc1);
 
+#endif /* __DMOREG_H__ */
index 6efe705..01b081d 100644 (file)
@@ -1,13 +1,29 @@
+/*
+ * Copyright (C) 2002 Alexandre Julliard
+ *
+ * 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 __DMORT_H__
 #define __DMORT_H__
 
-STDAPI MoCopyMediaType(DMO_MEDIA_TYPE *pmtDest, const DMO_MEDIA_TYPE *pmtSrc);
-STDAPI MoCreateMediaType(DMO_MEDIA_TYPE **ppmt, DWORD cbFormat);
-STDAPI MoDeleteMediaType(DMO_MEDIA_TYPE *pmt);
-STDAPI MoDuplicateMediaType(DMO_MEDIA_TYPE **ppmtDest, const DMO_MEDIA_TYPE *pmtSrc);
-STDAPI MoFreeMediaType(DMO_MEDIA_TYPE *pmt);
-STDAPI MoInitMediaType(DMO_MEDIA_TYPE *pmt, DWORD cbFormat);
-
-#endif
+HRESULT WINAPI MoCopyMediaType(DMO_MEDIA_TYPE*,const DMO_MEDIA_TYPE*);
+HRESULT WINAPI MoCreateMediaType(DMO_MEDIA_TYPE**,DWORD);
+HRESULT WINAPI MoDeleteMediaType(DMO_MEDIA_TYPE*);
+HRESULT WINAPI MoDuplicateMediaType(DMO_MEDIA_TYPE**,const DMO_MEDIA_TYPE*);
+HRESULT WINAPI MoFreeMediaType(DMO_MEDIA_TYPE*);
+HRESULT WINAPI MoInitMediaType(DMO_MEDIA_TYPE*,DWORD);
 
+#endif /* __DMORT_H__ */
index 48764c1..ea1e593 100644 (file)
@@ -37,7 +37,7 @@ interface ISampleGrabberCB : IUnknown
     HRESULT BufferCB(
         double SampleTime,
         BYTE * pBuffer,
-        long BufferLen
+        LONG BufferLen
     );
 }
 
@@ -66,8 +66,8 @@ interface ISampleGrabber: IUnknown
     );
 
     HRESULT GetCurrentBuffer(
-        [in,out] long * pBufferSize,
-        [out] long * pBuffer
+        [in,out] LONG * pBufferSize,
+        [out] LONG * pBuffer
     );
 
     HRESULT GetCurrentSample(
@@ -76,7 +76,7 @@ interface ISampleGrabber: IUnknown
 
     HRESULT SetCallback(
         ISampleGrabberCB * pCallback,
-        long WhichMethodToCallback
+        LONG WhichMethodToCallback
     );
 };
 
@@ -96,15 +96,15 @@ interface IMediaDet : IUnknown
     );
 
     HRESULT get_OutputStreams(
-        [out] long *pVal
+        [out] LONG *pVal
     );
 
     HRESULT get_CurrentStream(
-        [out] long *pVal
+        [out] LONG *pVal
     );
 
     HRESULT put_CurrentStream(
-        long newVal
+        LONG newVal
     );
 
     HRESULT get_StreamType(
@@ -129,16 +129,16 @@ interface IMediaDet : IUnknown
 
     HRESULT GetBitmapBits(
         double StreamTime,
-        long * pBufferSize,
+        LONG * pBufferSize,
         char * pBuffer,
-        long Width,
-        long Height
+        LONG Width,
+        LONG Height
     );
 
     HRESULT WriteBitmapBits(
         double StreamTime,
-        long Width,
-        long Height,
+        LONG Width,
+        LONG Height,
         BSTR Filename
     );
 
index 54a30fc..376cca7 100644 (file)
@@ -135,6 +135,7 @@ OUR_GUID_ENTRY(CLSID_WAVEParser,                     0xd51bd5a1, 0x7548, 0x11cf,
 OUR_GUID_ENTRY(CLSID_QTDec,                          0xfdfe9681, 0x74a3, 0x11d0, 0xaf, 0xa7, 0x00, 0xaa, 0x00, 0xb6, 0x7a, 0x42)
 OUR_GUID_ENTRY(CLSID_AVIDoc,                         0xd3588ab0, 0x0781, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)
 OUR_GUID_ENTRY(CLSID_AVIDocWriter,                   0xd3588ab1, 0x0781, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)
+OUR_GUID_ENTRY(CLSID_SampleGrabber,                  0xc1f400a0, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37)
 OUR_GUID_ENTRY(CLSID_NullRenderer,                   0xc1f400a4, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37)
 OUR_GUID_ENTRY(CLSID_VideoRenderer,                  0x70e102b0, 0x5556, 0x11ce, 0x97, 0xc0, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a)
 OUR_GUID_ENTRY(CLSID_VideoRendererDefault,           0x6bc1cffa, 0x8fc1, 0x4261, 0xac, 0x22, 0xcf, 0xb4, 0xcc, 0x38, 0xdb, 0x50)
index f29f7dd..cb44aab 100644 (file)
@@ -168,8 +168,7 @@ typedef struct _NORMALIZEDRECT
 
 typedef struct tagVMRGUID
 {
-    GUID* pGUID;
-    GUID GUID;
+    struct _GUID *pGUID, GUID;
 } VMRGUID;
 
 typedef struct tagVMRMONITORINFO
index aa024b1..bbf85af 100644 (file)
@@ -316,9 +316,13 @@ typedef struct _KPRCB
     UCHAR Reserved;
     USHORT BuildType;
     KAFFINITY SetMember;
+    UCHAR CpuType;
+    UCHAR CpuID;
+    USHORT CpuStep;
     KPROCESSOR_STATE ProcessorState;
     ULONG KernelReserved[16];
     ULONG HalReserved[16];
+    UCHAR PrcbPad0[92];
     KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
     struct _KTHREAD *NpxThread;
     ULONG InterruptCount;
@@ -334,7 +338,6 @@ typedef struct _KPRCB
     UCHAR NodeColor;
     UCHAR Spare1;
     ULONG NodeShiftedColor;
-    ULONG PcrPage;
     struct _KNODE *ParentNode;
     ULONG MultiThreadProcessorSet;
     struct _KPRCB *MultiThreadSetMaster;
@@ -361,19 +364,22 @@ typedef struct _KPRCB
     LARGE_INTEGER IoReadTransferCount;
     LARGE_INTEGER IoWriteTransferCount;
     LARGE_INTEGER IoOtherTransferCount;
-    ULONG KeContextSwitches;
+    ULONG SpareCounter1[8];
     PP_LOOKASIDE_LIST PPLookasideList[16];
     PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
     PP_LOOKASIDE_LIST PPPagedLookasideList[32];
     volatile ULONG PacketBarrier;
     volatile ULONG ReverseStall;
     PVOID IpiFrame;
+    UCHAR PrcbPad2[52];
     volatile PVOID CurrentPacket[3];
     volatile ULONG TargetSet;
     volatile PKIPI_WORKER WorkerRoutine;
     volatile ULONG IpiFrozen;
+    UCHAR PrcbPad3[40];
     volatile ULONG RequestSummary;
     volatile struct _KPRCB *SignalDone;
+    UCHAR PrcbPad4[56];
     struct _KDPC_DATA DpcData[2];
     PVOID DpcStack;
     ULONG MaximumDpcQueueDepth;
@@ -391,15 +397,19 @@ typedef struct _KPRCB
     KEVENT DpcEvent;
     UCHAR ThreadDpcEnable;
     volatile BOOLEAN QuantumEnd;
+    UCHAR PrcbPad50;
     volatile UCHAR IdleSchedule;
     LONG DpcSetEventRequest;
+    UCHAR PrcbPad5[18];
     LONG TickOffset;
     KDPC CallDpc;
+    ULONG PrcbPad7[8];
     LIST_ENTRY WaitListHead;
     ULONG ReadySummary;
     ULONG QueueIndex;
     LIST_ENTRY DispatcherReadyListHead[32];
     SINGLE_LIST_ENTRY DeferredReadyListHead;
+    ULONG PrcbPad72[11];
     PVOID ChainedInterruptList;
     LONG LookasideIrpFloat;
     volatile LONG MmPageFaultCount;
@@ -415,13 +425,79 @@ typedef struct _KPRCB
     volatile LONG MmDirtyWriteIoCount;
     volatile LONG MmMappedPagesWriteCount;
     volatile LONG MmMappedWriteIoCount;
+    ULONG SpareFields0[1];
     CHAR VendorString[13];
+    UCHAR InitialApicId;
+    UCHAR LogicalProcessorsPerPhysicalProcessor;
     ULONG MHz;
     ULONG FeatureBits;
+    LARGE_INTEGER UpdateSignature;
     volatile LARGE_INTEGER IsrTime;
+    LARGE_INTEGER SpareField1;
+    //FX_SAVE_AREA NpxSaveArea;
     PROCESSOR_POWER_STATE PowerState;
 } KPRCB, *PKPRCB;
 
+//
+// Processor Control Region
+//
+typedef struct _KIPCR
+{
+    union
+    {
+        NT_TIB NtTib;
+        struct
+        {
+            struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused
+            PVOID Used_StackBase; // Unused
+            PVOID PerfGlobalGroupMask;
+            PVOID TssCopy; // Unused
+            ULONG ContextSwitches;
+            KAFFINITY SetMemberCopy; // Unused
+            PVOID Used_Self;
+        };
+    };
+    struct _KPCR *Self;
+    struct _KPRCB *Prcb;
+    KIRQL Irql;
+    ULONG IRR; // Unused
+    ULONG IrrActive; // Unused
+    ULONG IDR; // Unused
+    PVOID KdVersionBlock;
+    PVOID IDT; // Unused
+    PVOID GDT; // Unused
+    PVOID TSS; // Unused
+    USHORT MajorVersion;
+    USHORT MinorVersion;
+    KAFFINITY SetMember;
+    ULONG StallScaleFactor;
+    UCHAR SpareUnused;
+    UCHAR Number;
+    // arm part
+    UCHAR Spare0[2];
+    UCHAR IrqlMask[32];
+    ULONG IrqlTable[32];
+    PKINTERRUPT_ROUTINE InterruptRoutine[32];
+    ULONG ReservedVectors;
+    ULONG FirstLevelDcacheSize;
+    ULONG FirstLevelDcacheFillSize;
+    ULONG FirstLevelIcacheSize;
+    ULONG FirstLevelIcacheFillSize;
+    ULONG SecondLevelDcacheSize;
+    ULONG SecondLevelDcacheFillSize;
+    ULONG SecondLevelIcacheSize;
+    ULONG SecondLevelIcacheFillSize;
+    ULONG DcacheFillSize;
+    ULONG DcacheAlignment;
+    ULONG IcacheAlignment;
+    ULONG IcacheFillSize;
+    ULONG ProcessorId;
+    PVOID InterruptStack;
+    PVOID PanicStack;
+    PVOID InitialStack;
+    KPRCB PrcbData;
+} KIPCR, *PKIPCR;
+
 //
 // Macro to get current KPRCB
 //
@@ -432,5 +508,17 @@ KeGetCurrentPrcb(VOID)
     return PCR->Prcb;
 }
 
+//
+// Just read it from the PCR
+//
+#define KeGetCurrentProcessorNumber()  (int)PCR->Number
+#define KeGetCurrentIrql()             PCR->Irql
+#define _KeGetCurrentThread()          KeGetCurrentPrcb()->CurrentThread
+#define _KeGetPreviousMode()           KeGetCurrentPrcb()->CurrentThread->PreviousMode
+#define _KeIsExecutingDpc()            (KeGetCurrentPrcb()->DpcRoutineActive != 0)
+#define KeGetCurrentThread()           _KeGetCurrentThread()
+#define KeGetPreviousMode()            _KeGetPreviousMode()
+#define KeGetDcacheFillSize()          PCR->DcacheFillSize
+
 #endif
 #endif
index 9875564..febadda 100644 (file)
@@ -47,90 +47,56 @@ C_ASSERT(MM_ALLOCATION_GRANULARITY >= PAGE_SIZE);
 //
 // Page Table Entry Definitions
 //
-typedef struct _HARDWARE_PTE_ARM
+typedef struct _HARDWARE_PDE_ARMV6
 {
-    union
-    {
-        union
-        {
-            struct
-            {
-                ULONG Type:2;
-                ULONG Unused:30;
-            } Fault;
-            struct
-            {
-                ULONG Type:2;
-                ULONG Ignored:2;
-                ULONG Reserved:1;
-                ULONG Domain:4;
-                ULONG Ignored1:1;
-                ULONG BaseAddress:22;
-            } Coarse;
-            struct
-            {
-                ULONG Type:2;
-                ULONG Buffered:1;
-                ULONG Cached:1;
-                ULONG Reserved:1;
-                ULONG Domain:4;
-                ULONG Ignored:1;
-                ULONG Access:2;
-                ULONG Ignored1:8;
-                ULONG BaseAddress:12;
-            } Section;
-            struct
-            {
-                ULONG Type:2;
-                ULONG Reserved:3;
-                ULONG Domain:4;
-                ULONG Ignored:3;
-                ULONG BaseAddress:20;
-            } Fine;
-        } L1;
-        union
-        {
-            struct
-            {
-                ULONG Type:2;
-                ULONG Unused:30;
-            } Fault;
-            struct
-            {
-                ULONG Type:2;
-                ULONG Buffered:1;
-                ULONG Cached:1;
-                ULONG Access0:2;
-                ULONG Access1:2;
-                ULONG Access2:2;
-                ULONG Access3:2;
-                ULONG Ignored:4;
-                ULONG BaseAddress:16;
-            } Large;
-            struct
-            {
-                ULONG Type:2;
-                ULONG Buffered:1;
-                ULONG Cached:1;
-                ULONG Access0:2;
-                ULONG Access1:2;
-                ULONG Access2:2;
-                ULONG Access3:2;
-                ULONG BaseAddress:20;
-            } Small;
-            struct
-            {
-                ULONG Type:2;
-                ULONG Buffered:1;
-                ULONG Cached:1;
-                ULONG Access0:2;
-                ULONG Ignored:4;
-                ULONG BaseAddress:22;
-            } Tiny; 
-        } L2;
-        ULONG AsUlong;
-    };
-} HARDWARE_PTE_ARM, *PHARDWARE_PTE_ARM;
+    ULONG Valid:1;     // Only for small pages
+    ULONG LargePage:1; // Note, if large then Valid = 0
+    ULONG Buffered:1;
+    ULONG Cached:1;
+    ULONG NoExecute:1;
+    ULONG Domain:4;
+    ULONG Ecc:1;
+    ULONG PageFrameNumber:22;
+} HARDWARE_PDE_ARMV6, *PHARDWARE_PDE_ARMV6;
+
+typedef struct _HARDWARE_LARGE_PTE_ARMV6
+{
+    ULONG Valid:1;     // Only for small pages
+    ULONG LargePage:1; // Note, if large then Valid = 0
+    ULONG Buffered:1;
+    ULONG Cached:1;
+    ULONG NoExecute:1;
+    ULONG Domain:4;
+    ULONG Ecc:1;
+    ULONG Accessed:1;
+    ULONG Owner:1;
+    ULONG CacheAttributes:3;
+    ULONG ReadOnly:1;
+    ULONG Shared:1;
+    ULONG NonGlobal:1;
+    ULONG SuperLagePage:1;
+    ULONG Reserved:1;
+    ULONG PageFrameNumber:12;
+} HARDWARE_LARGE_PTE_ARMV6, *PHARDWARE_LARGE_PTE_ARMV6;
+
+typedef struct _HARDWARE_PTE_ARMV6
+{
+    ULONG NoExecute:1;
+    ULONG Valid:1;
+    ULONG Buffered:1;
+    ULONG Cached:1;
+    ULONG Accessed:1;
+    ULONG Owner:1;
+    ULONG CacheAttributes:3;
+    ULONG ReadOnly:1;
+    ULONG Shared:1;
+    ULONG NonGlobal:1;
+    ULONG PageFrameNumber:20;
+} HARDWARE_PTE_ARMV6, *PHARDWARE_PTE_ARMV6;
+
+C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG));
+C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG));
+C_ASSERT(sizeof(HARDWARE_PTE_ARMV6) == sizeof(ULONG));
 
 typedef struct _MMPTE_SOFTWARE
 {
@@ -185,53 +151,18 @@ typedef struct _MMPTE_LIST
     ULONG filler1:1;
 } MMPTE_LIST;
 
-typedef struct _MMPDE_HARDWARE // FIXFIX: Find a way to make this more portable
-{
-    union
-    {
-        union
-        {
-            struct
-            {
-                ULONG Valid:1;
-                ULONG Section:1;
-                ULONG Sbz:3;
-                ULONG Domain:4;
-                ULONG EccEnabled:1;
-                ULONG PageFrameNumber:22;
-            } Coarse;
-            struct
-            {
-                ULONG Coarse:1;
-                ULONG Valid:1;
-                ULONG Buffered:1;
-                ULONG Cached:1;
-                ULONG Reserved:1;
-                ULONG Domain:4;
-                ULONG EccEnabled:1;
-                ULONG Access:2;
-                ULONG ExtendedAccess:3;
-                ULONG Sbz:3;
-                ULONG SuperSection:1;
-                ULONG Sbz1:1;
-                ULONG PageFrameNumber:12;
-            } Section;
-            ULONG AsUlong;
-        } Hard;
-    } u;
-} MMPDE_HARDWARE, *PMMPDE_HARDWARE;
-
 typedef union _MMPTE_HARDWARE
 {
     struct
     {
-        ULONG ExecuteNever:1;
+        ULONG NoExecute:1;
         ULONG Valid:1;
         ULONG Buffered:1;
         ULONG Cached:1;
-        ULONG Access:2;
-        ULONG TypeExtension:3;
-        ULONG ExtendedAccess:1;
+        ULONG Access:1;
+        ULONG Owner:1;
+        ULONG CacheAttributes:3;
+        ULONG ReadOnly:1;
         ULONG Shared:1;
         ULONG NonGlobal:1;
         ULONG PageFrameNumber:20;
@@ -239,10 +170,35 @@ typedef union _MMPTE_HARDWARE
     ULONG AsUlong;
 } MMPTE_HARDWARE, *PMMPTE_HARDWARE;
 
+typedef union _MMPDE_HARDWARE
+{
+    struct
+    {
+        ULONG Valid:1;
+        ULONG LargePage:1;
+        ULONG Buffered:1;
+        ULONG Cached:1;
+        ULONG NoExecute:1;
+        ULONG Domain:4;
+        ULONG Ecc:1;
+        ULONG PageFrameNumber:22;
+    };
+    ULONG AsUlong;
+} MMPDE_HARDWARE, *PMMPDE_HARDWARE;
+
+typedef struct _MMPDE
+{
+    union 
+    {
+        MMPDE_HARDWARE Hard;
+        ULONG Long;
+    } u;
+} MMPDE, *PMMPDE;
+
 //
 // Use the right PTE structure
 //
-#define HARDWARE_PTE        HARDWARE_PTE_ARM
-#define PHARDWARE_PTE       PHARDWARE_PTE_ARM
+#define HARDWARE_PTE        HARDWARE_PTE_ARMV6
+#define PHARDWARE_PTE       PHARDWARE_PTE_ARMV6
 
 #endif
index c800f13..36840f6 100644 (file)
@@ -54,7 +54,7 @@ Author:
 #define CmResourceTypeDma                       4
 #define CmResourceTypeDeviceSpecific            5
 #define CmResourceTypeBusNumber                 6
-#define CmResourceTypeMaximum                   7
+#define CmResourceTypeMemoryLarge               7
 #define CmResourceTypeNonArbitrated             128
 #define CmResourceTypeConfigData                128
 #define CmResourceTypeDevicePrivate             129
@@ -142,11 +142,14 @@ typedef enum _KEY_VALUE_INFORMATION_CLASS
     KeyValuePartialInformationAlign64
 } KEY_VALUE_INFORMATION_CLASS;
 
-typedef enum _KEY_SET_INFORMATION_CLASS
-{
-    KeyWriteTimeInformation,
-    KeyUserFlagsInformation,
-    MaxKeySetInfoClass
+typedef enum _KEY_SET_INFORMATION_CLASS {
+  KeyWriteTimeInformation,
+  KeyWow64FlagsInformation,
+  KeyControlFlagsInformation,
+  KeySetVirtualizationInformation,
+  KeySetDebugInformation,
+  KeySetHandleTagsInformation,
+  MaxKeySetInfoClass
 } KEY_SET_INFORMATION_CLASS;
 
 #endif
index f65655b..0d40a3f 100644 (file)
@@ -732,7 +732,7 @@ ZwFindAtom(
     OUT PRTL_ATOM Atom OPTIONAL
 );
 
-NTSYSAPI
+NTSYSCALLAPI
 NTSTATUS
 NTAPI
 ZwOpenEvent(
index e2dbeb6..eaaf2ae 100644 (file)
@@ -248,10 +248,12 @@ Author:
 #define KINTERRUPT_SERVICE_CONTEXT              0x10
 #define KINTERRUPT_TICK_COUNT                   0x18
 #define KINTERRUPT_ACTUAL_LOCK                  0x1C
+#define KINTERRUPT_DISPATCH_ADDRESS             0x20
 #define KINTERRUPT_VECTOR                       0x24
 #define KINTERRUPT_IRQL                         0x28
 #define KINTERRUPT_SYNCHRONIZE_IRQL             0x29
 #define KINTERRUPT_DISPATCH_COUNT               0x38
+#define KINTERRUPT_DISPATCH_CODE                0x3C
 
 //
 // KGDTENTRY Offsets
index 736c2ce..39d7752 100644 (file)
@@ -30,7 +30,7 @@ Author:
 #define PCR                     ((KPCR * const)K0IPCR)
 #if defined(CONFIG_SMP) || defined(NT_BUILD)
 #undef  KeGetPcr
-#define KeGetPcr()              ((KPCR * const)__readfsdword(FIELD_OFFSET(KPCR, Self)))
+#define KeGetPcr()              ((KPCR * const)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr)))
 #endif
 
 //
index 15e5833..b970ee3 100644 (file)
@@ -21,13 +21,35 @@ Author:
 
 #define TOKEN_SOURCE_LENGTH               8
 
+#ifndef _NTIFS_
 typedef enum _TOKEN_TYPE
 {
     TokenPrimary = 1,
     TokenImpersonation
 } TOKEN_TYPE, *PTOKEN_TYPE;
 
-typedef PVOID PRTL_HEAP_PARAMETERS;
+typedef NTSTATUS
+(NTAPI * PRTL_HEAP_COMMIT_ROUTINE)(
+    IN PVOID Base,
+    IN OUT PVOID *CommitAddress,
+    IN OUT PSIZE_T CommitSize
+);
+
+typedef struct _RTL_HEAP_PARAMETERS
+{
+    ULONG Length;
+    SIZE_T SegmentReserve;
+    SIZE_T SegmentCommit;
+    SIZE_T DeCommitFreeBlockThreshold;
+    SIZE_T DeCommitTotalFreeThreshold;
+    SIZE_T MaximumAllocationSize;
+    SIZE_T VirtualMemoryThreshold;
+    SIZE_T InitialCommit;
+    SIZE_T InitialReserve;
+    PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
+    SIZE_T Reserved[2];
+} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
+
 typedef PVOID PFS_FILTER_CALLBACKS;
 typedef USHORT SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
 
@@ -260,5 +282,7 @@ typedef struct _TOKEN_DEFAULT_DACL
 #define HEAP_CREATE_ENABLE_TRACING      0x00020000
 #define HEAP_CREATE_ENABLE_EXECUTE      0x00040000
 
+#endif
+
 #endif // !NTOS_MODE_USER
 #endif // _NTIFS_
index 04fd038..121ce2d 100644 (file)
@@ -107,7 +107,7 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
 #define FILE_CREATE_TREE_CONNECTION             0x00000080
 #define FILE_COMPLETE_IF_OPLOCKED               0x00000100
 #define FILE_NO_EA_KNOWLEDGE                    0x00000200
-#define FILE_OPEN_FOR_RECOVERY                  0x00000400
+#define FILE_OPEN_REMOTE_INSTANCE               0x00000400
 #define FILE_RANDOM_ACCESS                      0x00000800
 #define FILE_DELETE_ON_CLOSE                    0x00001000
 #define FILE_OPEN_BY_FILE_ID                    0x00002000
index af48d6e..19ed1fd 100644 (file)
@@ -74,6 +74,14 @@ ObCreateObjectType(
     OUT POBJECT_TYPE *ObjectType
 );
 
+NTKERNELAPI
+VOID
+NTAPI
+ObDereferenceSecurityDescriptor(
+  PSECURITY_DESCRIPTOR SecurityDescriptor,
+  ULONG Count
+);
+
 NTKERNELAPI
 ULONG
 NTAPI
@@ -81,6 +89,15 @@ ObGetObjectPointerCount(
     IN PVOID Object
 );
 
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObLogSecurityDescriptor(
+    IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
+    OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor,
+    IN ULONG RefBias
+);
+
 NTKERNELAPI
 NTSTATUS
 NTAPI
@@ -108,6 +125,14 @@ ObReferenceObjectByName(
     OUT PVOID *Object
 );
 
+NTKERNELAPI
+VOID
+NTAPI
+ObReferenceSecurityDescriptor(
+    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+    IN ULONG Count
+);
+
 NTKERNELAPI
 NTSTATUS
 NTAPI
index 960d8d2..210dd2f 100644 (file)
@@ -1479,7 +1479,7 @@ RtlUpcaseUnicodeToOemN(
     PCHAR OemString,
     ULONG OemSize,
     PULONG ResultSize,
-    PWCHAR UnicodeString,
+    PCWCH UnicodeString,
     ULONG UnicodeSize
 );
 
@@ -1509,7 +1509,7 @@ RtlUnicodeToOemN(
     PCHAR OemString,
     ULONG OemSize,
     PULONG ResultSize,
-    PWCHAR UnicodeString,
+    PCWCH UnicodeString,
     ULONG UnicodeSize
 );
 
@@ -1534,7 +1534,7 @@ RtlUpcaseUnicodeToMultiByteN(
     PCHAR MbString,
     ULONG MbSize,
     PULONG ResultSize,
-    PWCHAR UnicodeString,
+    PCWCH UnicodeString,
     ULONG UnicodeSize
 );
 
@@ -1543,7 +1543,7 @@ NTSTATUS
 NTAPI
 RtlUnicodeToMultiByteSize(
     PULONG MbSize,
-    PWCHAR UnicodeString,
+    PCWCH UnicodeString,
     ULONG UnicodeSize
 );
 
@@ -1571,7 +1571,7 @@ RtlOemToUnicodeN(
     PWSTR UnicodeString,
     ULONG MaxBytesInUnicodeString,
     PULONG BytesInUnicodeString,
-    IN PCHAR OemString,
+    IN PCCH OemString,
     ULONG BytesInOemString
 );
 
@@ -2653,6 +2653,7 @@ DbgPrintEx(
     IN ...
 );
 
+NTSYSAPI
 ULONG
 NTAPI
 DbgPrompt(
diff --git a/reactos/include/psdk/access.idl b/reactos/include/psdk/access.idl
new file mode 100644 (file)
index 0000000..d3d9424
--- /dev/null
@@ -0,0 +1,79 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a8c-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IAccessor : IUnknown\r
+{\r
+\r
+    typedef DWORD DBACCESSORFLAGS;\r
+\r
+    typedef DWORD DBBINDSTATUS;\r
+\r
+    [local]\r
+    HRESULT AddRefAccessor([in] HACCESSOR hAccessor,\r
+                           [in, out, unique, annotation("__out_opt")] DBREFCOUNT *pcRefCount);\r
+\r
+    [call_as(AddRefAccessor)]\r
+    HRESULT RemoteAddRefAccessor([in] HACCESSOR hAccessor,\r
+                                 [in, out, unique, annotation("__out_opt")] DBREFCOUNT *pcRefCount,\r
+                                 [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT CreateAccessor([in] DBACCESSORFLAGS dwAccessorFlags,\r
+                           [in] DBCOUNTITEM cBindings,\r
+                           [in, size_is(cBindings), annotation("__in_ecount(cBindings)")] const DBBINDING rgBindings[],\r
+                           [in] DBLENGTH cbRowSize,\r
+                           [out, annotation("__out")] HACCESSOR *phAccessor,\r
+                           [out, size_is(cBindings), annotation("__out_ecount_opt(cBindings)")] DBBINDSTATUS rgStatus[]);\r
+\r
+    [call_as(CreateAccessor)]\r
+    HRESULT RemoteCreateAccessor([in] DBACCESSORFLAGS dwAccessorFlags,\r
+                                 [in] DBCOUNTITEM cBindings,\r
+                                 [in, unique, size_is(cBindings)] DBBINDING *rgBindings,\r
+                                 [in] DBLENGTH cbRowSize,\r
+                                 [out] HACCESSOR *phAccessor,\r
+                                 [in, out, unique, size_is(cBindings)] DBBINDSTATUS *rgStatus,\r
+                                 [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT GetBindings([in] HACCESSOR hAccessor,\r
+                        [out, annotation("__out")] DBACCESSORFLAGS *pdwAccessorFlags,\r
+                        [in, out, annotation("__out_opt")] DBCOUNTITEM *pcBindings,\r
+                        [out, size_is(,*pcBindings), annotation("__deref_out_ecount_opt(*pcBindings)")] DBBINDING **prgBindings);\r
+\r
+    [call_as(GetBindings)]\r
+    HRESULT RemoteGetBindings([in] HACCESSOR hAccessor,\r
+                              [out] DBACCESSORFLAGS *pdwAccessorFlags,\r
+                              [in, out] DBCOUNTITEM *pcBindings,\r
+                              [out, size_is(,*pcBindings)] DBBINDING **prgBindings,\r
+                              [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT ReleaseAccessor([in] HACCESSOR hAccessor,\r
+                            [in, out, unique, annotation("__out_opt")] DBREFCOUNT *pcRefCount);\r
+\r
+    [call_as(ReleaseAccessor)]\r
+    HRESULT RemoteReleaseAccessor([in] HACCESSOR hAccessor,\r
+                                  [in, out, unique] DBREFCOUNT *pcRefCount,\r
+                                  [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+};\r
diff --git a/reactos/include/psdk/asynot.idl b/reactos/include/psdk/asynot.idl
new file mode 100644 (file)
index 0000000..b745bd9
--- /dev/null
@@ -0,0 +1,59 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a96-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IDBAsynchNotify : IUnknown\r
+{\r
+    [local]\r
+    HRESULT OnLowResource([in] DB_DWRESERVE dwReserved);\r
+\r
+    [call_as(OnLowResource)]\r
+    HRESULT RemoteOnLowResource([in] DB_DWRESERVE dwReserved);\r
+\r
+    [local]\r
+    HRESULT OnProgress([in] HCHAPTER hChapter,\r
+                       [in] DBASYNCHOP eOperation,\r
+                       [in] DBCOUNTITEM ulProgress,\r
+                       [in] DBCOUNTITEM ulProgressMax,\r
+                       [in] DBASYNCHPHASE eAsynchPhase,\r
+                       [in, annotation("__in_opt")] LPOLESTR pwszStatusText);\r
+\r
+    [call_as(OnProgress)]\r
+    HRESULT RemoteOnProgress([in] HCHAPTER hChapter,\r
+                             [in] DBASYNCHOP eOperation,\r
+                             [in] DBCOUNTITEM ulProgress,\r
+                             [in] DBCOUNTITEM ulProgressMax,\r
+                             [in] DBASYNCHPHASE eAsynchPhase,\r
+                             [in, unique, string] LPOLESTR pwszStatusText);\r
+\r
+    [local]\r
+    HRESULT OnStop([in] HCHAPTER hChapter,\r
+                   [in] DBASYNCHOP eOperation,\r
+                   [in] HRESULT hrStatus,\r
+                   [in, annotation("__in_opt")] LPOLESTR pwszStatusText);\r
+\r
+    [call_as(OnStop)]\r
+    HRESULT RemoteOnStop([in] HCHAPTER hChapter,\r
+                         [in] DBASYNCHOP eOperation,\r
+                         [in] HRESULT hrStatus,\r
+                         [in, unique, string] LPOLESTR pwszStatusText);\r
+}\r
diff --git a/reactos/include/psdk/asysta.idl b/reactos/include/psdk/asysta.idl
new file mode 100644 (file)
index 0000000..40bca84
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a95-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IDBAsynchStatus : IUnknown\r
+{\r
+    [local]\r
+    HRESULT Abort([in] HCHAPTER hChapter,\r
+                  [in] DBASYNCHOP eOperation);\r
+\r
+    [call_as(Abort)]\r
+    HRESULT RemoteAbort([in] HCHAPTER hChapter,\r
+                        [in] DBASYNCHOP eOperation,\r
+                        [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT GetStatus([in] HCHAPTER hChapter,\r
+                      [in] DBASYNCHOP eOperation,\r
+                      [out, annotation("__out_opt")] DBCOUNTITEM *pulProgress,\r
+                      [out, annotation("__out_opt")] DBCOUNTITEM *pulProgressMax,\r
+                      [out, annotation("__out")] DBASYNCHPHASE *peAsynchPhase,\r
+                      [out, annotation("__deref_opt_inout_opt")] LPOLESTR *ppwszStatusText);\r
+\r
+    [call_as(GetStatus)]\r
+    HRESULT RemoteGetStatus([in] HCHAPTER hChapter,\r
+                            [in] DBASYNCHOP eOperation,\r
+                            [in, out, unique] DBCOUNTITEM *pulProgress,\r
+                            [in, out, unique] DBCOUNTITEM *pulProgressMax,\r
+                            [in, out, unique] DBASYNCHPHASE *peAsynchPhase,\r
+                            [in, out, unique] LPOLESTR *ppwszStatusText,\r
+                            [out] IErrorInfo **ppErrorInfoRem);\r
+}\r
index fcddcb8..4572125 100644 (file)
@@ -274,10 +274,10 @@ NTSTATUS
 DDKAPI
 BatteryClassSystemControl(
   IN  PVOID  ClassData,
-  IN  PWMILIB_CONTEXT  WmiLibContext,
+  IN  PVOID  WmiLibContext, /* PWMILIB_CONTEXT */
   IN  PDEVICE_OBJECT  DeviceObject,
   IN  PIRP  Irp,
-  OUT PSYSCTL_IRP_DISPOSITION  Disposition);
+  OUT PVOID  Disposition); /* PSYSCTL_IRP_DISPOSITION */
 
 BCLASSAPI
 NTSTATUS
diff --git a/reactos/include/psdk/bdaiface.idl b/reactos/include/psdk/bdaiface.idl
new file mode 100644 (file)
index 0000000..712015c
--- /dev/null
@@ -0,0 +1,607 @@
+#ifndef DO_NO_IMPORTS\r
+import "unknwn.idl";\r
+import "strmif.idl";\r
+import "bdatypes.h";\r
+#endif\r
+\r
+/************************************************************\r
+ *      interface IBDA_NetworkProvider\r
+ */\r
+[\r
+    object,\r
+    uuid(fd501041-8ebe-11ce-8183-00aa00577da2),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_NetworkProvider : IUnknown\r
+{\r
+        HRESULT PutSignalSource(\r
+            [in] ULONG ulSignalSource);\r
+\r
+        HRESULT GetSignalSource(\r
+            [in, out] ULONG * pulSignalSource);\r
+\r
+        HRESULT GetNetworkType(\r
+            [in, out] GUID * pguidNetworkType);\r
+\r
+        HRESULT PutTuningSpace(\r
+            [in] REFGUID guidTuningSpace);\r
+\r
+        HRESULT GetTuningSpace(\r
+            [in, out] GUID * pguidTuingSpace);\r
+\r
+        HRESULT RegisterDeviceFilter(\r
+            [in] IUnknown * pUnkFilterControl,\r
+            [in, out] ULONG * ppvRegisitrationContext);\r
+\r
+        HRESULT UnRegisterDeviceFilter(\r
+            [in] ULONG pvRegistrationContext);\r
+}\r
+\r
+\r
+/************************************************************\r
+ *      interface IBDA_EthernetFilter\r
+ */\r
+[\r
+    object,\r
+    uuid(71985F43-1CA1-11d3-9CC8-00C04F7971E0),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_EthernetFilter : IUnknown\r
+{\r
+        HRESULT GetMulticastListSize(\r
+            [in, out] ULONG * pulcbAddresses);\r
+\r
+        HRESULT PutMulticastList(\r
+            [in] ULONG ulcbAddresses,\r
+            [in] BYTE * pAddressList);\r
+\r
+        HRESULT GetMulticastList(\r
+            [in, out] ULONG * pulcbAddresses,\r
+            [out] BYTE * pAddressList);\r
+\r
+        HRESULT PutMulticastMode(\r
+            [in] ULONG ulModeMask);\r
+\r
+        HRESULT GetMulticastMode(\r
+            [out] ULONG * pulModeMask);\r
+\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_IPV4Filter\r
+ */\r
+[\r
+    object,\r
+    uuid(71985F44-1CA1-11d3-9CC8-00C04F7971E0),\r
+    pointer_default(unique)\r
+]\r
+\r
+interface IBDA_IPV4Filter : IUnknown\r
+{\r
+        HRESULT GetMulticastListSize(\r
+            [in, out] ULONG * pulcbAddresses);\r
+\r
+        HRESULT PutMulticastList(\r
+            [in] ULONG ulcbAddresses,\r
+            [in] BYTE * pAddressList);\r
+\r
+        HRESULT GetMulticastList(\r
+            [in, out] ULONG * pulcbAddresses,\r
+            [out] BYTE * pAddressList);\r
+\r
+        HRESULT PutMulticastMode(\r
+            [in] ULONG ulModeMask);\r
+\r
+        HRESULT GetMulticastMode(\r
+            [out] ULONG * pulModeMask);\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_IPV6Filter\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(E1785A74-2A23-4fb3-9245-A8F88017EF33),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_IPV6Filter : IUnknown\r
+{\r
+\r
+        HRESULT GetMulticastListSize(\r
+            [in, out] ULONG * pulcbAddresses);\r
+\r
+        HRESULT PutMulticastList(\r
+            [in] ULONG ulcbAddresses,\r
+            [in] BYTE * pAddressList);\r
+\r
+        HRESULT GetMulticastList(\r
+            [in, out] ULONG * pulcbAddresses,\r
+            [out] BYTE * pAddressList);\r
+\r
+        HRESULT PutMulticastMode(\r
+            [in] ULONG ulModeMask);\r
+\r
+        HRESULT GetMulticastMode(\r
+            [out] ULONG * pulModeMask);\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_DeviceControl\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(FD0A5AF3-B41D-11d2-9C95-00C04F7971E0),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_DeviceControl : IUnknown\r
+{\r
+        HRESULT StartChanges(void);\r
+        HRESULT CheckChanges(void);\r
+        HRESULT CommitChanges(void);\r
+        HRESULT GetChangeState(\r
+            [in, out] ULONG * pState);\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_PinControl\r
+ */\r
+[\r
+    object,\r
+    uuid(0DED49D5-A8B7-4d5d-97A1-12B0C195874D),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_PinControl : IUnknown\r
+{\r
+        HRESULT GetPinID(\r
+            [in, out] ULONG * pulPinID);\r
+\r
+        HRESULT GetPinType(\r
+            [in, out] ULONG * pulPinType);\r
+\r
+        HRESULT RegistrationContext(\r
+            [in, out] ULONG * pulRegistrationCtx);\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_SignalProperties\r
+ */\r
+[\r
+    object,\r
+    uuid(D2F1644B-B409-11d2-BC69-00A0C9EE9E16),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_SignalProperties : IUnknown\r
+{\r
+        HRESULT PutNetworkType(\r
+            [in] REFGUID guidNetworkType);\r
+\r
+        HRESULT GetNetworkType(\r
+            [in, out] GUID * pguidNetworkType);\r
+\r
+        HRESULT PutSignalSource(\r
+            [in] ULONG ulSignalSource);\r
+\r
+        HRESULT GetSignalSource(\r
+            [in, out] ULONG * pulSignalSource);\r
+\r
+        HRESULT PutTuningSpace(\r
+            [in] REFGUID guidTuningSpace);\r
+\r
+        HRESULT GetTuningSpace(\r
+            [in, out] GUID * pguidTuingSpace);\r
+}\r
+\r
+\r
+/************************************************************\r
+ *      interface IBDA_SignalStatistics\r
+ */\r
+[\r
+    object,\r
+    uuid(1347D106-CF3A-428a-A5CB-AC0D9A2A4338),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_SignalStatistics : IUnknown\r
+{\r
+        HRESULT put_SignalStrength(\r
+            [in] LONG lDbStrength);\r
+\r
+        HRESULT get_SignalStrength(\r
+            [in, out] LONG * plDbStrength);\r
+\r
+        HRESULT put_SignalQuality(\r
+            [in] LONG lPercentQuality);\r
+\r
+        HRESULT get_SignalQuality(\r
+            [in, out] LONG * plPercentQuality);\r
+\r
+        HRESULT put_SignalPresent(\r
+            [in] BOOLEAN fPresent);\r
+\r
+        HRESULT get_SignalPresent(\r
+            [in, out] BOOLEAN * pfPresent);\r
+\r
+        HRESULT put_SignalLocked(\r
+            [in] BOOLEAN fLocked);\r
+\r
+        HRESULT get_SignalLocked(\r
+            [in, out] BOOLEAN * pfLocked);\r
+\r
+        HRESULT put_SampleTime(\r
+            [in] LONG lmsSampleTime);\r
+\r
+        HRESULT get_SampleTime(\r
+            [in, out] LONG * plmsSampleTime);\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_Topology\r
+ */\r
+[\r
+    object,\r
+    uuid(79B56888-7FEA-4690-B45D-38FD3C7849BE),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_Topology : IUnknown\r
+{\r
+        HRESULT GetNodeTypes(\r
+            [in, out] ULONG * pulcNodeTypes,\r
+            [in]  ULONG ulcNodeTypesMax,\r
+            [in, out] ULONG * rgulNodeTypes);\r
+\r
+        HRESULT GetNodeDescriptors(\r
+            [in, out] ULONG * ulcNodeDescriptors,\r
+            [in]  ULONG ulcNodeDescriptorsMax,\r
+            [in, out] BDANODE_DESCRIPTOR * rgNodeDescriptors);\r
+\r
+        HRESULT GetNodeInterfaces(\r
+            [in]  ULONG ulNodeType,\r
+            [in, out] ULONG * pulcInterfaces,\r
+            [in]  ULONG ulcInterfacesMax,\r
+            [in, out] GUID * rgguidInterfaces);\r
+\r
+        HRESULT GetPinTypes(\r
+            [in, out] ULONG * pulcPinTypes,\r
+            [in]  ULONG ulcPinTypesMax,\r
+            [in, out] ULONG * rgulPinTypes);\r
+\r
+        HRESULT GetTemplateConnections(\r
+            [in, out] ULONG * pulcConnections,\r
+            [in]  ULONG ulcConnectionsMax,\r
+            [in, out, ] BDA_TEMPLATE_CONNECTION * rgConnections);\r
+\r
+        HRESULT CreatePin(\r
+            [in]  ULONG ulPinType,\r
+            [in, out] ULONG * pulPinId);\r
+\r
+        HRESULT DeletePin(\r
+            [in] ULONG ulPinId);\r
+\r
+        HRESULT SetMediaType(\r
+            [in]  ULONG ulPinId,\r
+            [in]  AM_MEDIA_TYPE * pMediaType);\r
+\r
+        HRESULT SetMedium(\r
+            [in] ULONG ulPinId,\r
+            [in] REGPINMEDIUM * pMedium);\r
+\r
+        HRESULT CreateTopology(\r
+            [in] ULONG ulInputPinId,\r
+            [in] ULONG ulOutputPinId);\r
+\r
+        HRESULT GetControlNode(\r
+            [in] ULONG ulInputPinId,\r
+            [in] ULONG ulOutputPinId,\r
+            [in] ULONG ulNodeType,\r
+            [in, out] IUnknown ** ppControlNode);\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_VoidTransform\r
+ */\r
+[\r
+    object,\r
+    uuid(71985F46-1CA1-11d3-9CC8-00C04F7971E0),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_VoidTransform : IUnknown\r
+{\r
+        HRESULT Start();\r
+\r
+        HRESULT Stop();\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_NullTransform\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(DDF15B0D-BD25-11d2-9CA0-00C04F7971E0),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_NullTransform : IUnknown\r
+{\r
+        HRESULT Start();\r
+\r
+        HRESULT Stop();\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_FrequencyFilter\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(71985F47-1CA1-11d3-9CC8-00C04F7971E0),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_FrequencyFilter : IUnknown\r
+{\r
+        HRESULT put_Autotune(\r
+            [in] ULONG ulTransponder);\r
+\r
+        HRESULT get_Autotune(\r
+            [in, out] ULONG * pulTransponder);\r
+\r
+        HRESULT put_Frequency(\r
+            [in] ULONG ulFrequency);\r
+\r
+        HRESULT get_Frequency(\r
+            [in, out] ULONG * pulFrequency);\r
+\r
+        HRESULT put_Polarity(\r
+            [in] Polarisation Polarity);\r
+\r
+        HRESULT get_Polarity(\r
+            [in, out] Polarisation *    pPolarity);\r
+\r
+        HRESULT put_Range(\r
+            [in] ULONG ulRange);\r
+\r
+        HRESULT get_Range(\r
+            [in, out] ULONG * pulRange);\r
+\r
+        HRESULT put_Bandwidth(\r
+            [in] ULONG ulBandwidth);\r
+\r
+        HRESULT get_Bandwidth(\r
+            [in, out] ULONG * pulBandwidth);\r
+\r
+        HRESULT put_FrequencyMultiplier(\r
+            [in] ULONG ulMultiplier);\r
+\r
+        HRESULT get_FrequencyMultiplier(\r
+            [in, out] ULONG * pulMultiplier);\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_LNBInfo\r
+ */\r
+[\r
+    object,\r
+    uuid(992CF102-49F9-4719-A664-C4F23E2408F4),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_LNBInfo : IUnknown\r
+{\r
+        HRESULT put_LocalOscilatorFrequencyLowBand(\r
+            [in] ULONG ulLOFLow);\r
+\r
+        HRESULT get_LocalOscilatorFrequencyLowBand(\r
+            [in, out] ULONG * pulLOFLow);\r
+\r
+        HRESULT put_LocalOscilatorFrequencyHighBand(\r
+            [in] ULONG ulLOFHigh);\r
+\r
+        HRESULT get_LocalOscilatorFrequencyHighBand(\r
+            [in, out] ULONG * pulLOFHigh);\r
+\r
+        HRESULT put_HighLowSwitchFrequency(\r
+            [in] ULONG ulSwitchFrequency);\r
+\r
+        HRESULT get_HighLowSwitchFrequency(\r
+            [in, out] ULONG * pulSwitchFrequency);\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_AutoDemodulate\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(DDF15B12-BD25-11d2-9CA0-00C04F7971E0),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_AutoDemodulate : IUnknown\r
+{\r
+        HRESULT put_AutoDemodulate();\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_DigitalDemodulator\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(EF30F379-985B-4d10-B640-A79D5E04E1E0),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_DigitalDemodulator : IUnknown\r
+{\r
+        HRESULT put_ModulationType(\r
+            [in] ModulationType * pModulationType);\r
+\r
+        HRESULT get_ModulationType(\r
+            [in, out] ModulationType * pModulationType);\r
+\r
+        HRESULT put_InnerFECMethod(\r
+            [in] FECMethod * pFECMethod);\r
+\r
+        HRESULT get_InnerFECMethod(\r
+            [in, out] FECMethod * pFECMethod);\r
+\r
+        HRESULT put_InnerFECRate(\r
+            [in] BinaryConvolutionCodeRate * pFECRate);\r
+\r
+        HRESULT get_InnerFECRate(\r
+            [in, out] BinaryConvolutionCodeRate * pFECRate);\r
+\r
+        HRESULT put_OuterFECMethod(\r
+            [in] FECMethod * pFECMethod);\r
+\r
+        HRESULT get_OuterFECMethod(\r
+            [in, out] FECMethod * pFECMethod);\r
+\r
+        HRESULT put_OuterFECRate(\r
+            [in] BinaryConvolutionCodeRate * pFECRate);\r
+\r
+        HRESULT get_OuterFECRate(\r
+            [in, out] BinaryConvolutionCodeRate * pFECRate);\r
+\r
+        HRESULT put_SymbolRate(\r
+            [in] ULONG * pSymbolRate);\r
+\r
+        HRESULT get_SymbolRate(\r
+            [in, out] ULONG * pSymbolRate);\r
+\r
+        HRESULT put_SpectralInversion(\r
+            [in] SpectralInversion * pSpectralInversion);\r
+\r
+        HRESULT get_SpectralInversion(\r
+            [in, out] SpectralInversion * pSpectralInversion);\r
+}\r
+\r
+typedef enum\r
+{\r
+    KSPROPERTY_IPSINK_MULTICASTLIST,\r
+    KSPROPERTY_IPSINK_ADAPTER_DESCRIPTION,\r
+    KSPROPERTY_IPSINK_ADAPTER_ADDRESS\r
+}KSPROPERTY_IPSINK;\r
+\r
+/************************************************************\r
+ *      interface IBDA_IPSinkControl\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(3F4DC8E2-4050-11d3-8F4B-00C04F7971E2),\r
+    pointer_default(unique),\r
+]\r
+interface IBDA_IPSinkControl : IUnknown\r
+{\r
+        HRESULT GetMulticastList(\r
+            [in, out] unsigned long *pulcbSize,\r
+            [in, out] BYTE **pbBuffer);\r
+\r
+        HRESULT GetAdapterIPAddress(\r
+            [in, out] unsigned long *pulcbSize,\r
+            [in, out] BYTE ** pbBuffer);\r
+\r
+}\r
+\r
+/************************************************************\r
+ *      interface IBDA_IPSinkInfo\r
+ */\r
+[\r
+    object,\r
+    uuid(A750108F-492E-4d51-95F7-649B23FF7AD7),\r
+    pointer_default(unique)\r
+]\r
+interface IBDA_IPSinkInfo : IUnknown\r
+{\r
+        HRESULT get_MulticastList(\r
+            [in, out] ULONG * pulcbAddresses,\r
+            [out] BYTE    **ppbAddressList);\r
+\r
+        HRESULT get_AdapterIPAddress(\r
+            [out] BSTR *pbstrBuffer);\r
+\r
+        HRESULT get_AdapterDescription(\r
+            [out] BSTR *pbstrBuffer);\r
+}\r
+\r
+/************************************************************\r
+ *      interface IEnumPIDMap\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(afb6c2a2-2c41-11d3-8a60-0000f81e0e4a),\r
+    pointer_default(unique)\r
+]\r
+interface IEnumPIDMap : IUnknown\r
+{\r
+        HRESULT Next(\r
+            [in] ULONG cRequest,\r
+            [in, out] PID_MAP * pPIDMap,\r
+            [out] ULONG * pcReceived);\r
+\r
+        HRESULT Skip(\r
+            [in] ULONG cRecords);\r
+\r
+        HRESULT Reset();\r
+\r
+        HRESULT Clone(\r
+            [out] IEnumPIDMap ** ppIEnumPIDMap);\r
+} ;\r
+\r
+/************************************************************\r
+ *      interface IMPEG2PIDMap\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(afb6c2a1-2c41-11d3-8a60-0000f81e0e4a),\r
+    pointer_default(unique)\r
+]\r
+interface IMPEG2PIDMap : IUnknown\r
+{\r
+        HRESULT MapPID(\r
+            [in] ULONG culPID,\r
+            [in] ULONG * pulPID,\r
+            [in] MEDIA_SAMPLE_CONTENT MediaSampleContent);\r
+\r
+        HRESULT UnmapPID(\r
+            [in] ULONG culPID,\r
+            [in] ULONG * pulPID);\r
+\r
+        HRESULT EnumPIDMap(\r
+            [out] IEnumPIDMap ** pIEnumPIDMap);\r
+} ;\r
+\r
+/************************************************************\r
+ *      interface IFrequencyMap\r
+ */\r
+\r
+    [\r
+     object,\r
+     uuid(06FB45C1-693C-4ea7-B79F-7A6A54D8DEF2),\r
+     pointer_default(unique),\r
+    ]\r
+\r
+    interface IFrequencyMap : IUnknown\r
+    {\r
+        HRESULT get_FrequencyMapping(\r
+            [out] ULONG* ulCount,\r
+            [out] ULONG** ppulList);\r
+\r
+        HRESULT put_FrequencyMapping(\r
+            [in] ULONG ulCount,\r
+            [in] ULONG *pList);\r
+\r
+        HRESULT get_CountryCode([out] ULONG *pulCountryCode);\r
+\r
+        HRESULT put_CountryCode(\r
+            [in] ULONG ulCountryCode);\r
+\r
+        HRESULT get_DefaultFrequencyMapping(\r
+            [in] ULONG ulCountryCode,\r
+            [out] ULONG* pulCount,\r
+            [out] ULONG** ppulList);\r
+\r
+        HRESULT get_CountryCodeList(\r
+            [out] ULONG* pulCount,\r
+            [out] ULONG** ppulList);\r
+    };\r
diff --git a/reactos/include/psdk/binres.idl b/reactos/include/psdk/binres.idl
new file mode 100644 (file)
index 0000000..f09d124
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733ab1-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IBindResource : IUnknown\r
+{\r
+    [local]\r
+    HRESULT Bind([in] IUnknown *pUnkOuter,\r
+                 [in] LPCOLESTR pwszURL,\r
+                 [in] DBBINDURLFLAG dwBindURLFlags,\r
+                 [in] REFGUID rguid,\r
+                 [in] REFIID riid,\r
+                 [in] IAuthenticate *pAuthenticate,\r
+                 [in, out, unique] DBIMPLICITSESSION *pImplSession,\r
+                 [in, out, unique] DBBINDURLSTATUS *pdwBindStatus,\r
+                 [out, iid_is(riid)] IUnknown **ppUnk);\r
+\r
+    [call_as(Bind)]\r
+    HRESULT RemoteBind([in] IUnknown *pUnkOuter,\r
+                       [in] LPCOLESTR pwszURL,\r
+                       [in] DBBINDURLFLAG dwBindURLFlags,\r
+                       [in] REFGUID rguid,\r
+                       [in] REFIID riid,\r
+                       [in] IAuthenticate *pAuthenticate,\r
+                       [in] IUnknown *pSessionUnkOuter,\r
+                       [in, unique] IID *piid,\r
+                       [in, out, unique, iid_is(piid)] IUnknown **ppSession,\r
+                       [in, out, unique] DBBINDURLSTATUS *pdwBindStatus,\r
+                       [out, iid_is(riid)] IUnknown **ppUnk);\r
+}\r
index 386d6c0..89b916d 100644 (file)
@@ -30,6 +30,10 @@ cpp_quote("#define BG_NOTIFY_JOB_ERROR 0x0002")
 cpp_quote("#define BG_NOTIFY_DISABLE 0x0004")
 cpp_quote("#define BG_NOTIFY_JOB_MODIFICATION 0x0008")
 
+cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
+cpp_quote("#undef EnumJobs")
+cpp_quote("#undef GetJob")
+cpp_quote("#endif")
 
 #define BG_ENUM_SIZEIS(maxcount) maxcount
 #define BG_ENUM_LENGTHIS(maxcount,lengthptr) lengthptr ? *lengthptr : maxcount
diff --git a/reactos/include/psdk/cmdbas.idl b/reactos/include/psdk/cmdbas.idl
new file mode 100644 (file)
index 0000000..01be460
--- /dev/null
@@ -0,0 +1,62 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a63-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface ICommand : IUnknown\r
+{\r
+    [local]\r
+    HRESULT Cancel();\r
+\r
+    [call_as(Cancel)]\r
+    HRESULT RemoteCancel([out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT Execute([in, annotation("__in_opt")] IUnknown *pUnkOuter,\r
+                    [in] REFIID riid,\r
+                    [in, out, annotation("__inout_opt")] DBPARAMS *pParams,\r
+                    [out, annotation("__out_opt")] DBROWCOUNT *pcRowsAffected,\r
+                    [out, iid_is(riid), annotation("__deref_opt_out")] IUnknown **ppRowset);\r
+\r
+    [call_as(Execute)]\r
+    HRESULT RemoteExecute([in] IUnknown *pUnkOuter,\r
+                          [in] REFIID riid,\r
+                          [in] HACCESSOR hAccessor,\r
+                          [in] DB_UPARAMS cParamSets,\r
+                          [in, unique] GUID *pGuid,\r
+                          [in] ULONG ulGuidOffset,\r
+                          [in, unique] RMTPACK *pInputParams,\r
+                          [in, out, unique] RMTPACK *pOutputParams,\r
+                          [in] DBCOUNTITEM cBindings,\r
+                          [in, unique, size_is(cBindings)] DBBINDING *rgBindings,\r
+                          [in, out, unique, size_is(cBindings)] DBSTATUS *rgStatus,\r
+                          [in, out, unique] DBROWCOUNT *pcRowsAffected,\r
+                          [in, out, unique, iid_is(riid)] IUnknown **ppRowset);\r
+\r
+    [local]\r
+    HRESULT GetDBSession([in] REFIID riid,\r
+                         [out, iid_is(riid), annotation("__deref_out_opt")] IUnknown **ppSession);\r
+\r
+    [call_as(GetDBSession)]\r
+    HRESULT RemoteGetDBSession([in] REFIID riid,\r
+                               [out, iid_is(riid)] IUnknown **ppSession,\r
+                               [out] IErrorInfo **ppErrorInfoRem);\r
+};\r
diff --git a/reactos/include/psdk/cmdtxt.idl b/reactos/include/psdk/cmdtxt.idl
new file mode 100644 (file)
index 0000000..3220884
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a27-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface ICommandText : ICommand\r
+{\r
+    [local]\r
+    HRESULT GetCommandText([in, out /*, annotation("__inout_opt")*/] GUID *pguidDialect,\r
+                           [out /*, annotation("__deref_out")*/] LPOLESTR *ppwszCommand);\r
+\r
+    [call_as(GetCommandText)]\r
+    HRESULT RemoteGetCommandText([in, out, unique] GUID *pguidDialect,\r
+                                 [out] LPOLESTR *ppwszCommand,\r
+                                 [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT SetCommandText([in] REFGUID rguidDialect,\r
+                           [in, unique /*, annotation("__in_z_opt")*/] LPCOLESTR pwszCommand);\r
+\r
+    [call_as(SetCommandText)]\r
+    HRESULT RemoteSetCommandText([in] REFGUID rguidDialect,\r
+                                 [in, unique] LPCOLESTR pwszCommand,\r
+                                 [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+};\r
index ddb5279..84a4f88 100644 (file)
@@ -27,7 +27,7 @@ interface IMediaEvent;
 interface IMediaEventEx;
 interface IMediaPosition;
 
-typedef long OAFilterState;
+typedef LONG OAFilterState;
 typedef LONG_PTR OAHWND;
 typedef LONG_PTR OAEVENT;
 
@@ -68,10 +68,10 @@ interface IMediaControl : IDispatch
 ]
 interface IBasicAudio : IDispatch
 {
-    [propput] HRESULT Volume( [in] long lVolume );
-    [propget] HRESULT Volume( [out] long *plVolume );
-    [propput] HRESULT Balance( [in] long lBalance );
-    [propget] HRESULT Balance( [out] long *plBalance );
+    [propput] HRESULT Volume( [in] LONG lVolume );
+    [propget] HRESULT Volume( [out] LONG *plVolume );
+    [propput] HRESULT Balance( [in] LONG lBalance );
+    [propget] HRESULT Balance( [out] LONG *plBalance );
 }
 
 
@@ -87,43 +87,43 @@ interface IVideoWindow : IDispatch
 {
     [propput] HRESULT Caption( [in] BSTR strCaption );
     [propget] HRESULT Caption( [out] BSTR *strCaption );
-    [propput] HRESULT WindowStyle( [in] long WindowStyle );
-    [propget] HRESULT WindowStyle( [out] long *WindowStyle );
-    [propput] HRESULT WindowStyleEx( [in] long WindowStyleEx );
-    [propget] HRESULT WindowStyleEx( [out] long *WindowStyleEx );
-    [propput] HRESULT AutoShow( [in] long AutoShow );
-    [propget] HRESULT AutoShow( [out] long *AutoShow );
-    [propput] HRESULT WindowState( [in] long WindowState );
-    [propget] HRESULT WindowState( [out] long *WindowState );
-    [propput] HRESULT BackgroundPalette( [in] long BackgroundPalette );
-    [propget] HRESULT BackgroundPalette( [out] long *pBackgroundPalette );
-    [propput] HRESULT Visible( [in] long Visible );
-    [propget] HRESULT Visible( [out] long *pVisible );
-    [propput] HRESULT Left( [in] long Left );
-    [propget] HRESULT Left( [out] long *pLeft );
-    [propput] HRESULT Width( [in] long Width );
-    [propget] HRESULT Width( [out] long *pWidth );
-    [propput] HRESULT Top( [in] long Top );
-    [propget] HRESULT Top( [out] long *pTop );
-    [propput] HRESULT Height( [in] long Height );
-    [propget] HRESULT Height( [out] long *pHeight );
+    [propput] HRESULT WindowStyle( [in] LONG WindowStyle );
+    [propget] HRESULT WindowStyle( [out] LONG *WindowStyle );
+    [propput] HRESULT WindowStyleEx( [in] LONG WindowStyleEx );
+    [propget] HRESULT WindowStyleEx( [out] LONG *WindowStyleEx );
+    [propput] HRESULT AutoShow( [in] LONG AutoShow );
+    [propget] HRESULT AutoShow( [out] LONG *AutoShow );
+    [propput] HRESULT WindowState( [in] LONG WindowState );
+    [propget] HRESULT WindowState( [out] LONG *WindowState );
+    [propput] HRESULT BackgroundPalette( [in] LONG BackgroundPalette );
+    [propget] HRESULT BackgroundPalette( [out] LONG *pBackgroundPalette );
+    [propput] HRESULT Visible( [in] LONG Visible );
+    [propget] HRESULT Visible( [out] LONG *pVisible );
+    [propput] HRESULT Left( [in] LONG Left );
+    [propget] HRESULT Left( [out] LONG *pLeft );
+    [propput] HRESULT Width( [in] LONG Width );
+    [propget] HRESULT Width( [out] LONG *pWidth );
+    [propput] HRESULT Top( [in] LONG Top );
+    [propget] HRESULT Top( [out] LONG *pTop );
+    [propput] HRESULT Height( [in] LONG Height );
+    [propget] HRESULT Height( [out] LONG *pHeight );
     [propput] HRESULT Owner( [in] OAHWND Owner );
     [propget] HRESULT Owner( [out] OAHWND *Owner );
     [propput] HRESULT MessageDrain( [in] OAHWND Drain );
     [propget] HRESULT MessageDrain( [out] OAHWND *Drain );
-    [propget] HRESULT BorderColor( [out] long *Color );
-    [propput] HRESULT BorderColor( [in] long Color );
-    [propget] HRESULT FullScreenMode( [out] long *FullScreenMode );
-    [propput] HRESULT FullScreenMode( [in] long FullScreenMode );
-    HRESULT SetWindowForeground( [in] long Focus );
-    HRESULT NotifyOwnerMessage( [in] OAHWND hwnd, [in] long uMsg, [in] LONG_PTR wParam, [in] LONG_PTR lParam );
-    HRESULT SetWindowPosition( [in] long Left, [in] long Top, [in] long Width, [in] long Height );
-    HRESULT GetWindowPosition( [out] long *pLeft, [out] long *pTop, [out] long *pWidth, [out] long *pHeight );
-    HRESULT GetMinIdealImageSize( [out] long *pWidth, [out] long *pHeight );
-    HRESULT GetMaxIdealImageSize( [out] long *pWidth, [out] long *pHeight );
-    HRESULT GetRestorePosition( [out] long *pLeft, [out] long *pTop, [out] long *pWidth, [out] long *pHeight );
-    HRESULT HideCursor( [in] long HideCursor );
-    HRESULT IsCursorHidden( [out] long *CursorHidden );
+    [propget] HRESULT BorderColor( [out] LONG *Color );
+    [propput] HRESULT BorderColor( [in] LONG Color );
+    [propget] HRESULT FullScreenMode( [out] LONG *FullScreenMode );
+    [propput] HRESULT FullScreenMode( [in] LONG FullScreenMode );
+    HRESULT SetWindowForeground( [in] LONG Focus );
+    HRESULT NotifyOwnerMessage( [in] OAHWND hwnd, [in] LONG uMsg, [in] LONG_PTR wParam, [in] LONG_PTR lParam );
+    HRESULT SetWindowPosition( [in] LONG Left, [in] LONG Top, [in] LONG Width, [in] LONG Height );
+    HRESULT GetWindowPosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight );
+    HRESULT GetMinIdealImageSize( [out] LONG *pWidth, [out] LONG *pHeight );
+    HRESULT GetMaxIdealImageSize( [out] LONG *pWidth, [out] LONG *pHeight );
+    HRESULT GetRestorePosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight );
+    HRESULT HideCursor( [in] LONG HideCursor );
+    HRESULT IsCursorHidden( [out] LONG *CursorHidden );
 }
 
 
@@ -138,39 +138,39 @@ interface IVideoWindow : IDispatch
 interface IBasicVideo : IDispatch
 {
     [propget] HRESULT AvgTimePerFrame( [out] REFTIME *pAvgTimePerFrame );
-    [propget] HRESULT BitRate( [out] long *pBitRate );
-    [propget] HRESULT BitErrorRate( [out] long *pBitErrorRate );
-    [propget] HRESULT VideoWidth( [out] long *pVideoWidth );
-    [propget] HRESULT VideoHeight( [out] long *pVideoHeight );
-    [propput] HRESULT SourceLeft( [in] long SourceLeft );
-    [propget] HRESULT SourceLeft( [out] long *pSourceLeft );
-    [propput] HRESULT SourceWidth( [in] long SourceWidth );
-    [propget] HRESULT SourceWidth( [out] long *pSourceWidth );
-    [propput] HRESULT SourceTop( [in] long SourceTop );
-    [propget] HRESULT SourceTop( [out] long *pSourceTop );
-    [propput] HRESULT SourceHeight( [in] long SourceHeight );
-    [propget] HRESULT SourceHeight( [out] long *pSourceHeight );
-    [propput] HRESULT DestinationLeft( [in] long DestinationLeft );
-    [propget] HRESULT DestinationLeft( [out] long *pDestinationLeft );
-    [propput] HRESULT DestinationWidth( [in] long DestinationWidth );
-    [propget] HRESULT DestinationWidth( [out] long *pDestinationWidth );
-    [propput] HRESULT DestinationTop( [in] long DestinationTop );
-    [propget] HRESULT DestinationTop( [out] long *pDestinationTop );
-    [propput] HRESULT DestinationHeight( [in] long DestinationHeight );
-    [propget] HRESULT DestinationHeight( [out] long *pDestinationHeight );
-    HRESULT SetSourcePosition( [in] long Left, [in] long Top, [in] long Width, [in] long Height );
-    HRESULT GetSourcePosition( [out] long *pLeft, [out] long *pTop, [out] long *pWidth, [out] long *pHeight );
+    [propget] HRESULT BitRate( [out] LONG *pBitRate );
+    [propget] HRESULT BitErrorRate( [out] LONG *pBitErrorRate );
+    [propget] HRESULT VideoWidth( [out] LONG *pVideoWidth );
+    [propget] HRESULT VideoHeight( [out] LONG *pVideoHeight );
+    [propput] HRESULT SourceLeft( [in] LONG SourceLeft );
+    [propget] HRESULT SourceLeft( [out] LONG *pSourceLeft );
+    [propput] HRESULT SourceWidth( [in] LONG SourceWidth );
+    [propget] HRESULT SourceWidth( [out] LONG *pSourceWidth );
+    [propput] HRESULT SourceTop( [in] LONG SourceTop );
+    [propget] HRESULT SourceTop( [out] LONG *pSourceTop );
+    [propput] HRESULT SourceHeight( [in] LONG SourceHeight );
+    [propget] HRESULT SourceHeight( [out] LONG *pSourceHeight );
+    [propput] HRESULT DestinationLeft( [in] LONG DestinationLeft );
+    [propget] HRESULT DestinationLeft( [out] LONG *pDestinationLeft );
+    [propput] HRESULT DestinationWidth( [in] LONG DestinationWidth );
+    [propget] HRESULT DestinationWidth( [out] LONG *pDestinationWidth );
+    [propput] HRESULT DestinationTop( [in] LONG DestinationTop );
+    [propget] HRESULT DestinationTop( [out] LONG *pDestinationTop );
+    [propput] HRESULT DestinationHeight( [in] LONG DestinationHeight );
+    [propget] HRESULT DestinationHeight( [out] LONG *pDestinationHeight );
+    HRESULT SetSourcePosition( [in] LONG Left, [in] LONG Top, [in] LONG Width, [in] LONG Height );
+    HRESULT GetSourcePosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight );
     HRESULT SetDefaultSourcePosition();
-    HRESULT SetDestinationPosition( [in] long Left, [in] long Top, [in] long Width, [in] long Height );
-    HRESULT GetDestinationPosition( [out] long *pLeft, [out] long *pTop, [out] long *pWidth, [out] long *pHeight );
+    HRESULT SetDestinationPosition( [in] LONG Left, [in] LONG Top, [in] LONG Width, [in] LONG Height );
+    HRESULT GetDestinationPosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight );
     HRESULT SetDefaultDestinationPosition();
-    HRESULT GetVideoSize( [out] long *pWidth, [out] long *pHeight );
-    HRESULT GetVideoPaletteEntries( [in] long StartIndex,
-                                    [in] long Entries,
-                                    [out] long *pRetrieved,
-                                    [out, size_is(Entries), length_is(*pRetrieved)] long *pPalette );
-    HRESULT GetCurrentImage( [in, out] long *pBufferSize,
-                             [out, size_is(*pBufferSize), length_is(*pBufferSize)] long *pDIBImage );
+    HRESULT GetVideoSize( [out] LONG *pWidth, [out] LONG *pHeight );
+    HRESULT GetVideoPaletteEntries( [in] LONG StartIndex,
+                                    [in] LONG Entries,
+                                    [out] LONG *pRetrieved,
+                                    [out, size_is(Entries), length_is(*pRetrieved)] LONG *pPalette );
+    HRESULT GetCurrentImage( [in, out] LONG *pBufferSize,
+                             [out, size_is(*pBufferSize), length_is(*pBufferSize)] LONG *pDIBImage );
     HRESULT IsUsingDefaultSource();
     HRESULT IsUsingDefaultDestination();
 }
@@ -198,11 +198,11 @@ interface IBasicVideo2 : IBasicVideo
 interface IMediaEvent : IDispatch
 {
     HRESULT GetEventHandle( [out] OAEVENT *hEvent );
-    HRESULT GetEvent( [out] long *lEventCode, [out] LONG_PTR *lParam1, [out] LONG_PTR *lParam2, [in] long msTimeout );
-    HRESULT WaitForCompletion( [in] long msTimeout, [out] long *pEvCode );
-    HRESULT CancelDefaultHandling( [in] long lEvCode );
-    HRESULT RestoreDefaultHandling( [in] long lEvCode );
-    HRESULT FreeEventParams( [in] long lEvCode, [in] LONG_PTR lParam1, [in] LONG_PTR lParam2 );
+    HRESULT GetEvent( [out] LONG *lEventCode, [out] LONG_PTR *lParam1, [out] LONG_PTR *lParam2, [in] LONG msTimeout );
+    HRESULT WaitForCompletion( [in] LONG msTimeout, [out] LONG *pEvCode );
+    HRESULT CancelDefaultHandling( [in] LONG lEvCode );
+    HRESULT RestoreDefaultHandling( [in] LONG lEvCode );
+    HRESULT FreeEventParams( [in] LONG lEvCode, [in] LONG_PTR lParam1, [in] LONG_PTR lParam2 );
 }
 
 
@@ -216,9 +216,9 @@ interface IMediaEvent : IDispatch
 ]
 interface IMediaEventEx : IMediaEvent
 {
-    HRESULT SetNotifyWindow( [in] OAHWND hwnd, [in] long lMsg, [in] LONG_PTR lInstanceData );
-    HRESULT SetNotifyFlags( [in] long lNoNotifyFlags );
-    HRESULT GetNotifyFlags( [out] long *lplNoNotifyFlags );
+    HRESULT SetNotifyWindow( [in] OAHWND hwnd, [in] LONG lMsg, [in] LONG_PTR lInstanceData );
+    HRESULT SetNotifyFlags( [in] LONG lNoNotifyFlags );
+    HRESULT GetNotifyFlags( [out] LONG *lplNoNotifyFlags );
 }
 
 
@@ -244,3 +244,21 @@ interface IMediaPosition : IDispatch
     HRESULT CanSeekForward( [out] LONG *pCanSeekForward );
     HRESULT CanSeekBackward( [out] LONG *pCanSeekBackward );
 }
+
+/*****************************************************************************
+ * IDeferredCommand interface
+ */
+[
+    object,
+    uuid(56a868b8-0ad4-11ce-b03a-0020af0ba770),
+    pointer_default(unique)
+]
+interface IDeferredCommand : IUnknown
+{
+    HRESULT Cancel( void);
+    HRESULT Confidence([out] LONG *pConfidence);
+    HRESULT Postpone([in] REFTIME newtime);
+    HRESULT GetHResult([out] HRESULT *phrResult);
+}
+
diff --git a/reactos/include/psdk/crtrow.idl b/reactos/include/psdk/crtrow.idl
new file mode 100644 (file)
index 0000000..7088e00
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733ab2-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface ICreateRow : IUnknown\r
+{\r
+    [local]\r
+    HRESULT CreateRow([in, unique] IUnknown *pUnkOuter,\r
+                      [in] LPCOLESTR pwszURL,\r
+                      [in] DBBINDURLFLAG dwBindURLFlags,\r
+                      [in] REFGUID rguid,\r
+                      [in] REFIID riid,\r
+                      [in,  unique] IAuthenticate *pAuthenticate,\r
+                      [in, out, unique] DBIMPLICITSESSION *pImplSession,\r
+                      [in, out, unique] DBBINDURLSTATUS *pdwBindStatus,\r
+                      [out, annotation("__deref_opt_out_opt")] LPOLESTR *ppwszNewURL,\r
+                      [out, iid_is(riid)] IUnknown **ppUnk);\r
+\r
+    [call_as(CreateRow)]\r
+    HRESULT RemoteCreateRow([in] IUnknown *pUnkOuter,\r
+                            [in] LPCOLESTR pwszURL,\r
+                            [in] DBBINDURLFLAG dwBindURLFlags,\r
+                            [in] REFGUID rguid,\r
+                            [in] REFIID riid,\r
+                            [in] IAuthenticate *pAuthenticate,\r
+                            [in] IUnknown *pSessionUnkOuter,\r
+                            [in, unique] IID *piid,\r
+                            [in, out, unique, iid_is(piid)] IUnknown **ppSession,\r
+                            [in, out, unique] DBBINDURLSTATUS *pdwBindStatus,\r
+                            [in, out, unique] LPOLESTR *ppwszNewURL,\r
+                            [out, iid_is(riid)] IUnknown **ppUnk);\r
+}\r
diff --git a/reactos/include/psdk/ctfutb.idl b/reactos/include/psdk/ctfutb.idl
new file mode 100644 (file)
index 0000000..6d80b38
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2010 Justin Chevrier
+ *
+ * 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 DO_NO_IMPORTS
+import "oaidl.idl";
+#endif
+
+interface ITfLangBarEventSink;
+interface ITfLangBarItemMgr;
+interface ITfInputProcessorProfiles;
+
+[
+    object,
+    uuid(87955690-e627-11d2-8ddb-00105a2799b5),
+    pointer_default(unique)
+]
+interface ITfLangBarMgr: IUnknown
+{
+    HRESULT AdviseEventSink(
+        [in] ITfLangBarEventSink *pSink,
+        [in] HWND hwnd,
+        [in] DWORD dwflags,
+        [in] DWORD *pdwCookie);
+
+    HRESULT UnAdviseEventSink(
+        [in] DWORD dwCookie);
+
+    HRESULT GetThreadMarshalInterface(
+        [in] DWORD dwThreadId,
+        [in] DWORD dwType,
+        [in] REFIID riid,
+        [out] IUnknown **ppunk);
+
+    HRESULT GetThreadLangBarItemMgr(
+        [in] DWORD dwThreadId,
+        [out] ITfLangBarItemMgr **pplbie,
+        [out] DWORD *pdwThreadid);
+
+    HRESULT GetInputProcessorProfiles(
+        [in] DWORD dwThreadId,
+        [out] ITfInputProcessorProfiles **ppaip,
+        [out] DWORD *pdwThreadid);
+
+    HRESULT RestoreLastFocus(
+        [out] DWORD *dwThreadId,
+        [in] BOOL fPrev);
+
+    HRESULT SetModalInput(
+        [in] ITfLangBarEventSink *pSink,
+        [in] DWORD dwThreadId,
+        [in] DWORD dwFlags);
+
+    HRESULT ShowFloating(
+        [in] DWORD dwFlags);
+
+    HRESULT GetShowFloatingStatus(
+        [out] DWORD *pdwFlags);
+};
diff --git a/reactos/include/psdk/dbccmd.idl b/reactos/include/psdk/dbccmd.idl
new file mode 100644 (file)
index 0000000..99274bc
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a1d-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IDBCreateCommand : IUnknown\r
+{\r
+    [local]\r
+    HRESULT CreateCommand([in] IUnknown *pUnkOuter,\r
+                          [in] REFIID riid,\r
+                          [out, iid_is(riid)] IUnknown **ppCommand);\r
+\r
+    [call_as(CreateCommand)]\r
+    HRESULT RemoteCreateCommand([in] IUnknown *pUnkOuter,\r
+                                [in] REFIID riid,\r
+                                [out, iid_is(riid)] IUnknown **ppCommand,\r
+                                [out] IErrorInfo **ppErrorInfoRem);\r
+}\r
diff --git a/reactos/include/psdk/dbcses.idl b/reactos/include/psdk/dbcses.idl
new file mode 100644 (file)
index 0000000..3bdb0d7
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a5d-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IDBCreateSession : IUnknown\r
+{\r
+    [local]\r
+    HRESULT CreateSession([in] IUnknown *pUnkOuter,\r
+                          [in] REFIID riid,\r
+                          [out, iid_is(riid)] IUnknown **ppDBSession);\r
+\r
+    [call_as(CreateSession)]\r
+    HRESULT RemoteCreateSession([in] IUnknown *pUnkOuter,\r
+                                [in] REFIID riid,\r
+                                [out, iid_is(riid)] IUnknown **ppDBSession,\r
+                                [out] IErrorInfo **ppErrorInfoRem);\r
+}\r
diff --git a/reactos/include/psdk/dbdsad.idl b/reactos/include/psdk/dbdsad.idl
new file mode 100644 (file)
index 0000000..c6fb2b4
--- /dev/null
@@ -0,0 +1,75 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a7a-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IDBDataSourceAdmin : IUnknown\r
+{\r
+    [local]\r
+    HRESULT CreateDataSource([in] ULONG cPropertySets,\r
+                             [in, out, size_is(cPropertySets)] DBPROPSET rgPropertySets[],\r
+                             [in] IUnknown *pUnkOuter,\r
+                             [in] REFIID riid,\r
+                             [out, iid_is(riid)] IUnknown **ppDBSession);\r
+\r
+    [call_as(CreateDataSource)]\r
+    HRESULT RemoteCreateDataSource([in] ULONG cPropertySets,\r
+                                   [in, unique, size_is(cPropertySets)] DBPROPSET *rgPropertySets,\r
+                                   [in] IUnknown *pUnkOuter,\r
+                                   [in] REFIID riid,\r
+                                   [in, out, unique, iid_is(riid)] IUnknown **ppDBSession,\r
+                                   [in] ULONG cTotalProps,\r
+                                   [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus,\r
+                                   [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT DestroyDataSource();\r
+\r
+    [call_as(DestroyDataSource)]\r
+    HRESULT RemoteDestroyDataSource([out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT GetCreationProperties([in] ULONG cPropertyIDSets,\r
+                                  [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[],\r
+                                  [in, out] ULONG *pcPropertyInfoSets,\r
+                                  [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets,\r
+                                  [out, annotation("__deref_out_z_opt")] OLECHAR **ppDescBuffer);\r
+\r
+    [call_as(GetCreationProperties)]\r
+    HRESULT RemoteGetCreationProperties([in] ULONG cPropertyIDSets,\r
+                                        [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets,\r
+                                        [in, out] ULONG *pcPropertyInfoSets,\r
+                                        [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets,\r
+                                        [in, out] DBCOUNTITEM *pcOffsets,\r
+                                        [out, size_is(,(ULONG)*pcOffsets)] DBBYTEOFFSET **prgDescOffsets,\r
+                                        [in, out] ULONG *pcbDescBuffer,\r
+                                        [in, out, unique, size_is(,*pcbDescBuffer)] OLECHAR **ppDescBuffer,\r
+                                        [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT ModifyDataSource([in] ULONG cPropertySets,\r
+                             [in, size_is(cPropertySets)] DBPROPSET rgPropertySets[]);\r
+\r
+    [call_as(ModifyDataSource)]\r
+    HRESULT RemoteModifyDataSource([in] ULONG cPropertySets,\r
+                                   [in, size_is(cPropertySets)] DBPROPSET *rgPropertySets,\r
+                                   [out] IErrorInfo **ppErrorInfoRem);\r
+}\r
index 5ed5301..782191a 100644 (file)
@@ -30,7 +30,7 @@ interface IDBProperties : IUnknown {
 
     [call_as(GetProperties)] HRESULT RemoteGetProperties(
              [in] ULONG cPropertyIDSets,
-             [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[],
+             [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets,
              [in, out] ULONG *pcPropertySets,
              [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets,
              [out] IErrorInfo **ppErrorInfoRem);
@@ -39,17 +39,18 @@ interface IDBProperties : IUnknown {
              [in] ULONG cPropertyIDSets,
              [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[],
              [in, out] ULONG *pcPropertyInfoSets,
-             [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets);
+             [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets,
+             [out, annotation("__deref_out_z_opt")] OLECHAR **ppDescBuffer);
 
     [call_as(GetPropertyInfo)] HRESULT RemoteGetPropertyInfo(
              [in] ULONG cPropertyIDSets,
-             [in,size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets,
+             [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets,
              [in, out] ULONG *pcPropertyInfoSets,
              [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets,
              [in, out] ULONG *pcOffsets,
              [out, size_is(,*pcOffsets)] DBBYTEOFFSET **prgDescOffsets,
              [in, out] ULONG *pcbDescBuffer,
-             [out, size_is(,*pcbDescBuffer)] OLECHAR **ppDescBuffer,
+             [in, out, unique, size_is(,*pcbDescBuffer)] OLECHAR **ppDescBuffer,
              [out] IErrorInfo **ppErrorInfoRem);
 
     [local] HRESULT SetProperties(
@@ -58,7 +59,7 @@ interface IDBProperties : IUnknown {
 
     [call_as(SetProperties)] HRESULT RemoteSetProperties(
              [in] ULONG cPropertySets,
-             [in, out, size_is(cPropertySets)] DBPROPSET *rgPropertySets,
+             [in, unique, size_is(cPropertySets)] DBPROPSET *rgPropertySets,
              [in] ULONG cTotalProps,
              [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus,
              [out] IErrorInfo **ppErrorInfoRem);
index 19c2997..8ca2e2a 100644 (file)
@@ -99,3 +99,247 @@ typedef struct tagDBPROPINFOSET {
     ULONG cPropertyInfos;
     GUID guidPropertySet;
 } DBPROPINFOSET;
+
+typedef DWORD DBBINDURLFLAG;
+typedef DWORD DBBINDURLSTATUS;
+
+typedef struct tagDBIMPLICITSESSION
+{
+    IUnknown *pUnkOuter;
+    IID *piid;
+    IUnknown *pSession;
+} DBIMPLICITSESSION;
+
+typedef WORD DBTYPE;
+
+enum DBTYPEENUM
+{
+    DBTYPE_EMPTY         = 0,
+    DBTYPE_NULL          = 1,
+    DBTYPE_I2            = 2,
+    DBTYPE_I4            = 3,
+    DBTYPE_R4            = 4,
+    DBTYPE_R8            = 5,
+    DBTYPE_CY            = 6,
+    DBTYPE_DATE          = 7,
+    DBTYPE_BSTR          = 8,
+    DBTYPE_IDISPATCH     = 9,
+    DBTYPE_ERROR         = 10,
+    DBTYPE_BOOL          = 11,
+    DBTYPE_VARIANT       = 12,
+    DBTYPE_IUNKNOWN      = 13,
+    DBTYPE_DECIMAL       = 14,
+    DBTYPE_I1            = 16,
+    DBTYPE_UI1           = 17,
+    DBTYPE_UI2           = 18,
+    DBTYPE_UI4           = 19,
+    DBTYPE_I8            = 20,
+    DBTYPE_UI8           = 21,
+    DBTYPE_GUID          = 72,
+    DBTYPE_BYTES         = 128,
+    DBTYPE_STR           = 129,
+    DBTYPE_WSTR          = 130,
+    DBTYPE_NUMERIC       = 131,
+    DBTYPE_UDT           = 132,
+    DBTYPE_DBDATE        = 133,
+    DBTYPE_DBTIME        = 134,
+    DBTYPE_DBTIMESTAMP   = 135,
+
+    DBTYPE_VECTOR        = 0x1000,
+    DBTYPE_ARRAY         = 0x2000,
+    DBTYPE_BYREF         = 0x4000,
+    DBTYPE_RESERVED      = 0x8000
+};
+
+enum DBTYPEENUM15
+{
+    DBTYPE_HCHAPTER      = 136
+};
+
+enum DBTYPEENUM20
+{
+    DBTYPE_FILETIME      = 64,
+    DBTYPE_PROPVARIANT   = 138,
+    DBTYPE_VARNUMERIC    = 139
+};
+
+typedef DWORD DBSTATUS;
+
+enum DBSTATUSENUM
+{
+    DBSTATUS_S_OK = 0,
+    DBSTATUS_E_BADACCESSOR = 1,
+    DBSTATUS_E_CANTCONVERTVALUE = 2,
+    DBSTATUS_S_ISNULL = 3,
+    DBSTATUS_S_TRUNCATED = 4,
+    DBSTATUS_E_SIGNMISMATCH = 5,
+    DBSTATUS_E_DATAOVERFLOW = 6,
+    DBSTATUS_E_CANTCREATE = 7,
+    DBSTATUS_E_UNAVAILABLE = 8,
+    DBSTATUS_E_PERMISSIONDENIED = 9,
+    DBSTATUS_E_INTEGRITYVIOLATION = 10,
+    DBSTATUS_E_SCHEMAVIOLATION = 11,
+    DBSTATUS_E_BADSTATUS = 12,
+    DBSTATUS_S_DEFAULT = 13
+};
+
+cpp_quote("#ifdef DBINITCONSTANTS")
+cpp_quote("#ifdef __cplusplus")
+cpp_quote("#define DEFINE_DBGUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\")
+cpp_quote("        EXTERN_C const GUID name DECLSPEC_HIDDEN;     \\")
+cpp_quote("        EXTERN_C const GUID name =                    \\")
+cpp_quote("    { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }")
+cpp_quote("#else")
+cpp_quote("#define DEFINE_DBGUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\")
+cpp_quote("        const GUID name DECLSPEC_HIDDEN;      \\")
+cpp_quote("        const GUID name =                             \\")
+cpp_quote("    { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }")
+cpp_quote("#endif")
+cpp_quote("#else")
+cpp_quote("#define DEFINE_DBGUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\")
+cpp_quote("    EXTERN_C const GUID name DECLSPEC_HIDDEN")
+cpp_quote("#endif")
+
+cpp_quote("DEFINE_DBGUID(DBGUID_SESSION,    0xc8b522f5, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);")
+cpp_quote("DEFINE_DBGUID(DBGUID_ROWSET,     0xc8b522f6, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);")
+cpp_quote("DEFINE_DBGUID(DBGUID_ROW,        0xc8b522f7, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);")
+cpp_quote("DEFINE_DBGUID(DBGUID_STREAM,     0xc8b522f9, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);")
+
+typedef struct tagDBCOLUMNACCESS
+{
+    void *pData;
+    DBID columnid;
+    DBLENGTH cbDataLen;
+    DBSTATUS dwStatus;
+    DBLENGTH cbMaxLen;
+    DB_DWRESERVE dwReserved;
+    DBTYPE wType;
+    BYTE bPrecision;
+    BYTE bScale;
+} DBCOLUMNACCESS;
+
+typedef DWORD DBROWSTATUS;
+
+enum DBROWSTATUSENUM
+{
+    DBROWSTATUS_S_OK         = 0,
+    /* FIXME */
+    DBROWSTATUS_E_FAIL       = 19,
+
+};
+
+typedef DWORD DBPART;
+
+enum DBPARTENUM
+{
+    DBPART_INVALID  = 0,
+    DBPART_VALUE    = 1,
+    DBPART_LENGTH   = 2,
+    DBPART_STATUS   = 4,
+};
+
+typedef DWORD DBPARAMIO;
+
+enum DBPARAMIOENUM
+{
+    DBPARAMIO_NOTPARAM = 0,
+    DBPARAMIO_INPUT    = 1,
+    DBPARAMIO_OUTPUT   = 2,
+};
+
+typedef DWORD DBMEMOWNER;
+
+enum DBMEMOWNERENUM
+{
+    DBMEMOWNER_CLIENTOWNED    = 0,
+    DBMEMOWNER_PROVIDEROWNED  = 1,
+};
+
+typedef struct tagDBOBJECT
+{
+    DWORD dwFlags;
+    IID iid;
+} DBOBJECT;
+
+typedef struct tagDBBINDEXT
+{
+    [size_is((ULONG)ulExtension)] BYTE *pExtension;
+    DBCOUNTITEM ulExtension;
+} DBBINDEXT;
+
+typedef struct tagDBBINDING
+{
+    DBORDINAL iOrdinal;
+    DBBYTEOFFSET obValue;
+    DBBYTEOFFSET obLength;
+    DBBYTEOFFSET obStatus;
+    ITypeInfo *pTypeInfo;
+    DBOBJECT *pObject;
+    DBBINDEXT *pBindExt;
+    DBPART dwPart;
+    DBMEMOWNER dwMemOwner;
+    DBPARAMIO eParamIO;
+    DBLENGTH cbMaxLen;
+    DWORD dwFlags;
+    DBTYPE wType;
+    BYTE bPrecision;
+    BYTE bScale;
+} DBBINDING;
+
+typedef ULONG_PTR HACCESSOR;
+
+cpp_quote("#define DB_INVALID_HACCESSOR 0x00")
+
+typedef ULONG_PTR HROW;
+
+cpp_quote("#define DB_NULL_HROW 0x00")
+
+typedef ULONG_PTR HWATCHREGION;
+
+cpp_quote("#define DBWATCHREGION_NULL NULL")
+
+typedef ULONG_PTR HCHAPTER;
+
+cpp_quote("#define DB_NULL_HCHAPTER 0x00")
+
+typedef struct tagDBPARAMS
+{
+    void *pData;
+    DB_UPARAMS cParamSets;
+    HACCESSOR hAccessor;
+} DBPARAMS;
+
+typedef DWORD DBASYNCHOP;
+
+enum DBASYNCHOPENUM
+{
+    DBSYNCHOP_OPEN,
+};
+
+typedef DWORD DBASYNCHPHASE;
+
+enum DBASYNCHPHASEENUM
+{
+    DBASYNCHPHASE_INITIALIZATION,
+    DBASYNCHPHASE_POPULATION,
+    DBASYNCHPHASE_COMPLETE,
+    DBASYNCHPHASE_CANCELED,
+};
+
+typedef struct tagRMTPACK
+{
+    ISequentialStream *pISeqStream;
+    ULONG cbData;
+    ULONG cBSTR;
+    [size_is(cBSTR)] BSTR *rgBSTR;
+    ULONG cVARIANT;
+    [size_is(cVARIANT)] VARIANT *rgVARIANT;
+    ULONG cIDISPATCH;
+    [size_is(cIDISPATCH)] IDispatch **rgIDISPATCH;
+    ULONG cIUNKNOWN;
+    [size_is(cIUNKNOWN)] IUnknown **rgIUNKNOWN;
+    ULONG cPROPVARIANT;
+    [size_is(cPROPVARIANT)] PROPVARIANT *rgPROPVARIANT;
+    ULONG cArray;
+    [size_is(cArray)] VARIANT *rgArray;
+} RMTPACK;
index 07e04b2..851ec90 100644 (file)
@@ -24,8 +24,6 @@ cpp_quote("#include <imm.h>")
 
 cpp_quote("#if 0")
 
-typedef WORD LANGID;
-
 typedef struct {
     LPSTR lpReading;
     LPSTR lpWord;
index b44448e..6f1c545 100644 (file)
@@ -23,6 +23,9 @@ import "oaidl.idl";
 import "servprov.idl";
 #endif
 
+cpp_quote("DEFINE_GUID(SID_VariantConversion, 0x1f101481,0xbccd,0x11d0,0x93,0x36,0x00,0xa0,0xc9,0xd,0xca,0xa9);")
+cpp_quote("DEFINE_GUID(SID_GetCaller, 0x4717cc40,0xbcb9,0x11d0,0x93,0x36,0x00,0xa0,0xc9,0xd,0xca,0xa9);")
+
 cpp_quote("#define fdexNameCaseSensitive       0x00000001L")
 cpp_quote("#define fdexNameEnsure              0x00000002L")
 cpp_quote("#define fdexNameImplicit            0x00000004L")
@@ -78,13 +81,13 @@ interface IDispatchEx : IDispatch
 
     [local]
     HRESULT InvokeEx(
-            [in] DISPID id,
-            [in] LCID lcid,
-            [in] WORD wFlags,
-            [in] DISPPARAMS *pdp,
-            [out] VARIANT *pvarRes,
-            [out] EXCEPINFO *pei,
-            [in, unique] IServiceProvider *pspCaller);
+            [in, annotation("__in")] DISPID id,
+            [in, annotation("__in")] LCID lcid,
+            [in, annotation("__in")] WORD wFlags,
+            [in, annotation("__in")] DISPPARAMS *pdp,
+            [out, annotation("__out_opt")] VARIANT *pvarRes,
+            [out, annotation("__out_opt")] EXCEPINFO *pei,
+            [in, unique, annotation("__in_opt")] IServiceProvider *pspCaller);
 
     [call_as(InvokeEx)]
     HRESULT RemoteInvokeEx(
@@ -188,3 +191,15 @@ interface ICanHandleException : IUnknown
             [in] EXCEPINFO *pExcepInfo,
             [in] VARIANT *pvar);
 }
+
+[
+    object,
+    uuid(10e2414a-ec59-49d2-bc51-5add2c36febc),
+    pointer_default(unique)
+]
+interface IProvideRuntimeContext : IUnknown
+{
+    HRESULT GetCurrentSourceContext(
+            [out] DWORD_PTR *pdwContext,
+            [out] VARIANT_BOOL *pfExecutingGlobalCode);
+}
diff --git a/reactos/include/psdk/dpfilter.h b/reactos/include/psdk/dpfilter.h
new file mode 100644 (file)
index 0000000..912549b
--- /dev/null
@@ -0,0 +1,267 @@
+
+#define DPFLTR_ERROR_LEVEL                  0
+#define DPFLTR_WARNING_LEVEL                1
+#define DPFLTR_TRACE_LEVEL                  2
+#define DPFLTR_INFO_LEVEL                   3
+#define DPFLTR_MASK                         0x80000000
+
+#if 1
+typedef enum _DPFLTR_TYPE
+{
+    DPFLTR_SYSTEM_ID = 0,
+    DPFLTR_SMSS_ID = 1,
+    DPFLTR_SETUP_ID = 2,
+    DPFLTR_NTFS_ID = 3,
+    DPFLTR_FSTUB_ID = 4,
+    DPFLTR_CRASHDUMP_ID = 5,
+    DPFLTR_CDAUDIO_ID = 6,
+    DPFLTR_CDROM_ID = 7,
+    DPFLTR_CLASSPNP_ID = 8,
+    DPFLTR_DISK_ID = 9,
+    DPFLTR_REDBOOK_ID = 10,
+    DPFLTR_STORPROP_ID = 11,
+    DPFLTR_SCSIPORT_ID = 12,
+    DPFLTR_SCSIMINIPORT_ID = 13,
+    DPFLTR_CONFIG_ID = 14,
+    DPFLTR_I8042PRT_ID = 15,
+    DPFLTR_SERMOUSE_ID = 16,
+    DPFLTR_LSERMOUS_ID = 17,
+    DPFLTR_KBDHID_ID = 18,
+    DPFLTR_MOUHID_ID = 19,
+    DPFLTR_KBDCLASS_ID = 20,
+    DPFLTR_MOUCLASS_ID = 21,
+    DPFLTR_TWOTRACK_ID = 22,
+    DPFLTR_WMILIB_ID = 23,
+    DPFLTR_ACPI_ID = 24,
+    DPFLTR_AMLI_ID = 25,
+    DPFLTR_HALIA64_ID = 26,
+    DPFLTR_VIDEO_ID = 27,
+    DPFLTR_SVCHOST_ID = 28,
+    DPFLTR_VIDEOPRT_ID = 29,
+    DPFLTR_TCPIP_ID = 30,
+    DPFLTR_DMSYNTH_ID = 31,
+    DPFLTR_NTOSPNP_ID = 32,
+    DPFLTR_FASTFAT_ID = 33,
+    DPFLTR_SAMSS_ID = 34,
+    DPFLTR_PNPMGR_ID = 35,
+    DPFLTR_NETAPI_ID = 36,
+    DPFLTR_SCSERVER_ID = 37,
+    DPFLTR_SCCLIENT_ID = 38,
+    DPFLTR_SERIAL_ID = 39,
+    DPFLTR_SERENUM_ID = 40,
+    DPFLTR_UHCD_ID = 41,
+    DPFLTR_BOOTOK_ID = 42,
+    DPFLTR_BOOTVRFY_ID = 43,
+    DPFLTR_RPCPROXY_ID = 44,
+    DPFLTR_AUTOCHK_ID = 45,
+    DPFLTR_DCOMSS_ID = 46,
+    DPFLTR_UNIMODEM_ID = 47,
+    DPFLTR_SIS_ID = 48,
+    DPFLTR_FLTMGR_ID = 49,
+    DPFLTR_WMICORE_ID = 50,
+    DPFLTR_BURNENG_ID = 51,
+    DPFLTR_IMAPI_ID = 52,
+    DPFLTR_SXS_ID = 53,
+    DPFLTR_FUSION_ID = 54,
+    DPFLTR_IDLETASK_ID = 55,
+    DPFLTR_SOFTPCI_ID = 56,
+    DPFLTR_TAPE_ID = 57,
+    DPFLTR_MCHGR_ID = 58,
+    DPFLTR_IDEP_ID = 59,
+    DPFLTR_PCIIDE_ID = 60,
+    DPFLTR_FLOPPY_ID = 61,
+    DPFLTR_FDC_ID = 62,
+    DPFLTR_TERMSRV_ID = 63,
+    DPFLTR_W32TIME_ID = 64,
+    DPFLTR_PREFETCHER_ID = 65,
+    DPFLTR_RSFILTER_ID = 66,
+    DPFLTR_FCPORT_ID = 67,
+    DPFLTR_PCI_ID = 68,
+    DPFLTR_DMIO_ID = 69,
+    DPFLTR_DMCONFIG_ID = 70,
+    DPFLTR_DMADMIN_ID = 71,
+    DPFLTR_WSOCKTRANSPORT_ID = 72,
+    DPFLTR_VSS_ID = 73,
+    DPFLTR_PNPMEM_ID = 74,
+    DPFLTR_PROCESSOR_ID = 75,
+    DPFLTR_DMSERVER_ID = 76,
+    DPFLTR_SR_ID = 77,
+    DPFLTR_INFINIBAND_ID = 78,
+    DPFLTR_IHVDRIVER_ID = 79,
+    DPFLTR_IHVVIDEO_ID = 80,
+    DPFLTR_IHVAUDIO_ID = 81,
+    DPFLTR_IHVNETWORK_ID = 82,
+    DPFLTR_IHVSTREAMING_ID = 83,
+    DPFLTR_IHVBUS_ID = 84,
+    DPFLTR_HPS_ID = 85,
+    DPFLTR_RTLTHREADPOOL_ID = 86,
+    DPFLTR_LDR_ID = 87,
+    DPFLTR_TCPIP6_ID = 88,
+    DPFLTR_ISAPNP_ID = 89,
+    DPFLTR_SHPC_ID = 90,
+    DPFLTR_STORPORT_ID = 91,
+    DPFLTR_STORMINIPORT_ID = 92,
+    DPFLTR_PRINTSPOOLER_ID = 93,
+    DPFLTR_VDS_ID = 94,
+    DPFLTR_VDSBAS_ID = 95,
+    DPFLTR_VDSDYNDR_ID = 96,
+    DPFLTR_VDSUTIL_ID = 97,
+    DPFLTR_DFRGIFC_ID = 98,
+    DPFLTR_DEFAULT_ID = 99,
+    DPFLTR_MM_ID = 100,
+    DPFLTR_DFSC_ID = 101,
+    DPFLTR_WOW64_ID = 102,
+    DPFLTR_ENDOFTABLE_ID
+} DPFLTR_TYPE;
+#else
+typedef enum _DPFLTR_TYPE
+{
+    DPFLTR_SYSTEM_ID = 0,
+    DPFLTR_SMSS_ID = 1,
+    DPFLTR_SETUP_ID = 2,
+    DPFLTR_NTFS_ID = 3,
+    DPFLTR_FSTUB_ID = 4,
+    DPFLTR_CRASHDUMP_ID = 5,
+    DPFLTR_CDAUDIO_ID = 6,
+    DPFLTR_CDROM_ID = 7,
+    DPFLTR_CLASSPNP_ID = 8,
+    DPFLTR_DISK_ID = 9,
+    DPFLTR_REDBOOK_ID = 10,
+    DPFLTR_STORPROP_ID = 11,
+    DPFLTR_SCSIPORT_ID = 12,
+    DPFLTR_SCSIMINIPORT_ID = 13,
+    DPFLTR_CONFIG_ID = 14,
+    DPFLTR_I8042PRT_ID = 15,
+    DPFLTR_SERMOUSE_ID = 16,
+    DPFLTR_LSERMOUS_ID = 17,
+    DPFLTR_KBDHID_ID = 18,
+    DPFLTR_MOUHID_ID = 19,
+    DPFLTR_KBDCLASS_ID = 20,
+    DPFLTR_MOUCLASS_ID = 21,
+    DPFLTR_TWOTRACK_ID = 22,
+    DPFLTR_WMILIB_ID = 23,
+    DPFLTR_ACPI_ID = 24,
+    DPFLTR_AMLI_ID = 25,
+    DPFLTR_HALIA64_ID = 26,
+    DPFLTR_VIDEO_ID = 27,
+    DPFLTR_SVCHOST_ID = 28,
+    DPFLTR_VIDEOPRT_ID = 29,
+    DPFLTR_TCPIP_ID = 30,
+    DPFLTR_DMSYNTH_ID = 31,
+    DPFLTR_NTOSPNP_ID = 32,
+    DPFLTR_FASTFAT_ID = 33,
+    DPFLTR_SAMSS_ID = 34,
+    DPFLTR_PNPMGR_ID = 35,
+    DPFLTR_NETAPI_ID = 36,
+    DPFLTR_SCSERVER_ID = 37,
+    DPFLTR_SCCLIENT_ID = 38,
+    DPFLTR_SERIAL_ID = 39,
+    DPFLTR_SERENUM_ID = 40,
+    DPFLTR_UHCD_ID = 41,
+    DPFLTR_RPCPROXY_ID = 42,
+    DPFLTR_AUTOCHK_ID = 43,
+    DPFLTR_DCOMSS_ID = 44,
+    DPFLTR_UNIMODEM_ID = 45,
+    DPFLTR_SIS_ID = 46,
+    DPFLTR_FLTMGR_ID = 47,
+    DPFLTR_WMICORE_ID = 48,
+    DPFLTR_BURNENG_ID = 49,
+    DPFLTR_IMAPI_ID = 50,
+    DPFLTR_SXS_ID = 51,
+    DPFLTR_FUSION_ID = 52,
+    DPFLTR_IDLETASK_ID = 53,
+    DPFLTR_SOFTPCI_ID = 54,
+    DPFLTR_TAPE_ID = 55,
+    DPFLTR_MCHGR_ID = 56,
+    DPFLTR_IDEP_ID = 57,
+    DPFLTR_PCIIDE_ID = 58,
+    DPFLTR_FLOPPY_ID = 59,
+    DPFLTR_FDC_ID = 60,
+    DPFLTR_TERMSRV_ID = 61,
+    DPFLTR_W32TIME_ID = 62,
+    DPFLTR_PREFETCHER_ID = 63,
+    DPFLTR_RSFILTER_ID = 64,
+    DPFLTR_FCPORT_ID = 65,
+    DPFLTR_PCI_ID = 66,
+    DPFLTR_DMIO_ID = 67,
+    DPFLTR_DMCONFIG_ID = 68,
+    DPFLTR_DMADMIN_ID = 69,
+    DPFLTR_WSOCKTRANSPORT_ID = 70,
+    DPFLTR_VSS_ID = 71,
+    DPFLTR_PNPMEM_ID = 72,
+    DPFLTR_PROCESSOR_ID = 73,
+    DPFLTR_DMSERVER_ID = 74,
+    DPFLTR_SR_ID = 75,
+    DPFLTR_INFINIBAND_ID = 76,
+    DPFLTR_IHVDRIVER_ID = 77,
+    DPFLTR_IHVVIDEO_ID = 78,
+    DPFLTR_IHVAUDIO_ID = 79,
+    DPFLTR_IHVNETWORK_ID = 80,
+    DPFLTR_IHVSTREAMING_ID = 81,
+    DPFLTR_IHVBUS_ID = 82,
+    DPFLTR_HPS_ID = 83,
+    DPFLTR_RTLTHREADPOOL_ID = 84,
+    DPFLTR_LDR_ID = 85,
+    DPFLTR_TCPIP6_ID = 86,
+    DPFLTR_ISAPNP_ID = 87,
+    DPFLTR_SHPC_ID = 88,
+    DPFLTR_STORPORT_ID = 89,
+    DPFLTR_STORMINIPORT_ID = 90,
+    DPFLTR_PRINTSPOOLER_ID = 91,
+    DPFLTR_VSSDYNDISK_ID = 92,
+    DPFLTR_VERIFIER_ID = 93,
+    DPFLTR_VDS_ID = 94,
+    DPFLTR_VDSBAS_ID = 95,
+    DPFLTR_VDSDYN_ID = 96,
+    DPFLTR_VDSDYNDR_ID = 97,
+    DPFLTR_VDSLDR_ID = 98,
+    DPFLTR_VDSUTIL_ID = 99,
+    DPFLTR_DFRGIFC_ID = 100,
+    DPFLTR_DEFAULT_ID = 101,
+    DPFLTR_MM_ID = 102,
+    DPFLTR_DFSC_ID = 103,
+    DPFLTR_WOW64_ID = 104,
+    DPFLTR_ALPC_ID = 105,
+    DPFLTR_WDI_ID = 106,
+    DPFLTR_PERFLIB_ID = 107,
+    DPFLTR_KTM_ID = 108,
+    DPFLTR_IOSTRESS_ID = 109,
+    DPFLTR_HEAP_ID = 110,
+    DPFLTR_WHEA_ID = 111,
+    DPFLTR_USERGDI_ID = 112,
+    DPFLTR_MMCSS_ID = 113,
+    DPFLTR_TPM_ID = 114,
+    DPFLTR_THREADORDER_ID = 115,
+    DPFLTR_ENVIRON_ID = 116,
+    DPFLTR_EMS_ID = 117,
+    DPFLTR_WDT_ID = 118,
+    DPFLTR_FVEVOL_ID = 119,
+    DPFLTR_NDIS_ID = 120,
+    DPFLTR_NVCTRACE_ID = 121,
+    DPFLTR_LUAFV_ID = 122,
+    DPFLTR_APPCOMPAT_ID = 123,
+    DPFLTR_USBSTOR_ID = 124,
+    DPFLTR_SBP2PORT_ID = 125,
+    DPFLTR_COVERAGE_ID = 126,
+    DPFLTR_CACHEMGR_ID = 127,
+    DPFLTR_MOUNTMGR_ID = 128,
+    DPFLTR_CFR_ID = 129,
+    DPFLTR_TXF_ID = 130,
+    DPFLTR_KSECDD_ID = 131,
+    DPFLTR_FLTREGRESS_ID = 132,
+    DPFLTR_MPIO_ID = 133,
+    DPFLTR_MSDSM_ID = 134,
+    DPFLTR_UDFS_ID = 135,
+    DPFLTR_PSHED_ID = 136,
+    DPFLTR_STORVSP_ID = 137,
+    DPFLTR_LSASS_ID = 138,
+    DPFLTR_SSPICLI_ID = 139,
+    DPFLTR_CNG_ID = 140,
+    DPFLTR_EXFAT_ID = 141,
+    DPFLTR_FILETRACE_ID = 142,
+    DPFLTR_XSAVE_ID = 143,
+    DPFLTR_SE_ID = 144,
+    DPFLTR_DRIVEEXTENDER_ID = 145,
+    DPFLTR_ENDOFTABLE_ID
+} DPFLTR_TYPE;
+#endif
index 532e8f4..fbf1b2a 100644 (file)
@@ -45,7 +45,7 @@ enum ColorAdjustType
 struct ColorMap
 {
     Color oldColor;
-    Color newCOlor;
+    Color newColor;
 };
 
 #ifndef __cplusplus
index 886acb3..af3f8f5 100644 (file)
@@ -151,7 +151,7 @@ interface IHlink: IUnknown
 }
 
 /*****************************************************************************
- *    IHlink interface
+ *    IHlinkSite interface
  */
 [
     object,
index 1a844d3..56c32fd 100644 (file)
@@ -22,6 +22,7 @@ DWORD WINAPI GetAdapterIndex(LPWSTR,PULONG);
 DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO,PULONG);
 DWORD WINAPI GetBestInterface(IPAddr,PDWORD);
 DWORD WINAPI GetBestRoute(DWORD,DWORD,PMIB_IPFORWARDROW);
+DWORD WINAPI GetExtendedTcpTable(PVOID,PDWORD,BOOL,ULONG,TCP_TABLE_CLASS,ULONG);
 DWORD WINAPI GetFriendlyIfIndex(DWORD);
 DWORD WINAPI GetIcmpStatistics(PMIB_ICMP);
 DWORD WINAPI GetIfEntry(PMIB_IFROW);
@@ -34,6 +35,7 @@ DWORD WINAPI GetIpStatistics(PMIB_IPSTATS);
 DWORD WINAPI GetIpStatisticsEx(PMIB_IPSTATS,DWORD);
 DWORD WINAPI GetNetworkParams(PFIXED_INFO,PULONG);
 DWORD WINAPI GetNumberOfInterfaces(PDWORD);
+DWORD WINAPI GetOwnerModuleFromTcpEntry(PMIB_TCPROW_OWNER_MODULE,TCPIP_OWNER_MODULE_INFO_CLASS,PVOID,PDWORD);
 DWORD WINAPI GetPerAdapterInfo(ULONG,PIP_PER_ADAPTER_INFO, PULONG);
 BOOL WINAPI GetRTTAndHopCount(IPAddr,PULONG,ULONG,PULONG);
 DWORD WINAPI GetTcpStatistics(PMIB_TCPSTATS);
index a59796f..179a793 100644 (file)
@@ -25,6 +25,9 @@
 #define MAXLEN_IFDESCR 256
 #define MAXLEN_PHYSADDR 8
 
+//It should be 16 according to Lei Shen blog (http://www.mychinaworks.com/blog/lshen/2008/04/16/220/
+#define TCPIP_OWNING_MODULE_SIZE 16
+
 typedef struct _MIB_IFROW
 {
     WCHAR wszName[MAX_INTERFACE_NAME_LEN];
@@ -286,4 +289,31 @@ typedef struct _MIB_IPNETTABLE
     MIB_IPNETROW table[1];
 } MIB_IPNETTABLE, *PMIB_IPNETTABLE;
 
+typedef struct _MIB_TCPROW_OWNER_MODULE {
+  DWORD         dwState;
+  DWORD         dwLocalAddr;
+  DWORD         dwLocalPort;
+  DWORD         dwRemoteAddr;
+  DWORD         dwRemotePort;
+  DWORD         dwOwningPid;
+  LARGE_INTEGER liCreateTimestamp;
+  ULONGLONG     OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
+} MIB_TCPROW_OWNER_MODULE, *PMIB_TCPROW_OWNER_MODULE;
+
+typedef enum  {
+  TCPIP_OWNER_MODULE_INFO_BASIC 
+} TCPIP_OWNER_MODULE_INFO_CLASS, *PTCPIP_OWNER_MODULE_INFO_CLASS;
+
+typedef enum {
+    TCP_TABLE_BASIC_LISTENER,
+    TCP_TABLE_BASIC_CONNECTIONS,
+    TCP_TABLE_BASIC_ALL,
+    TCP_TABLE_OWNER_PID_LISTENER,
+    TCP_TABLE_OWNER_PID_CONNECTIONS,
+    TCP_TABLE_OWNER_PID_ALL,
+    TCP_TABLE_OWNER_MODULE_LISTENER,
+    TCP_TABLE_OWNER_MODULE_CONNECTIONS,
+    TCP_TABLE_OWNER_MODULE_ALL
+} TCP_TABLE_CLASS, *PTCP_TABLE_CLASS;
+
 #endif /* WINE_IPRTRMIB_H__ */
index 430c1f0..2249af3 100644 (file)
@@ -290,7 +290,6 @@ typedef struct
 #if 0
 #define KSINTERFACESETID_Media
 
-#define KSINTERFACESETID_Standard
 #define KSINTERFACE_STANDARD_STREAMING
 #define KSINTERFACE_STANDARD_LOOPED_STREAMING
 #define KSINTERFACE_STANDARD_CONTROL
@@ -337,22 +336,28 @@ DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard
     Clock Properties/Methods/Events
 */
 
-#define KSPROPSETID_Clock \
+#define STATIC_KSPROPSETID_Clock \
     0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
+#define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
 
 typedef enum
 {
     KSPROPERTY_CLOCK_TIME,
     KSPROPERTY_CLOCK_PHYSICALTIME,
-    KSPROPERTY_CORRELATEDTIME,
-    KSPROPERTY_CORRELATEDPHYSICALTIME,
+    KSPROPERTY_CLOCK_CORRELATEDTIME,
+    KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
     KSPROPERTY_CLOCK_RESOLUTION,
     KSPROPERTY_CLOCK_STATE,
+#if defined(_NTDDK_)
     KSPROPERTY_CLOCK_FUNCTIONTABLE
+#endif // defined(_NTDDK_)
 } KSPROPERTY_CLOCK;
 
-#define KSEVENTSETID_Clock \
+#define STATIC_KSEVENTSETID_Clock \
     0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
+#define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
 
 typedef enum
 {
@@ -502,11 +507,12 @@ typedef enum
     Properties/Methods/Events
 */
 
-#define KSPROPSETID_MediaSeeking \
+#define STATIC_KSPROPSETID_MediaSeeking\
     0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
+#define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
 
-typedef enum
-{
+typedef enum {
     KSPROPERTY_MEDIASEEKING_CAPABILITIES,
     KSPROPERTY_MEDIASEEKING_FORMATS,
     KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
@@ -519,6 +525,126 @@ typedef enum
     KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
 } KSPROPERTY_MEDIASEEKING;
 
+typedef enum {
+    KS_SEEKING_NoPositioning,
+    KS_SEEKING_AbsolutePositioning,
+    KS_SEEKING_RelativePositioning,
+    KS_SEEKING_IncrementalPositioning,
+    KS_SEEKING_PositioningBitsMask = 0x3,
+    KS_SEEKING_SeekToKeyFrame,
+    KS_SEEKING_ReturnTime = 0x8
+} KS_SEEKING_FLAGS;
+
+typedef enum {
+    KS_SEEKING_CanSeekAbsolute = 0x1,
+    KS_SEEKING_CanSeekForwards = 0x2,
+    KS_SEEKING_CanSeekBackwards = 0x4,
+    KS_SEEKING_CanGetCurrentPos = 0x8,
+    KS_SEEKING_CanGetStopPos = 0x10,
+    KS_SEEKING_CanGetDuration = 0x20,
+    KS_SEEKING_CanPlayBackwards = 0x40
+} KS_SEEKING_CAPABILITIES;
+
+typedef struct {
+    LONGLONG            Current;
+    LONGLONG            Stop;
+    KS_SEEKING_FLAGS    CurrentFlags;
+    KS_SEEKING_FLAGS    StopFlags;
+} KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
+
+typedef struct {
+    LONGLONG    Earliest;
+    LONGLONG    Latest;
+} KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
+
+typedef struct {
+    KSPROPERTY  Property;
+    GUID        SourceFormat;
+    GUID        TargetFormat;
+    LONGLONG    Time;
+} KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_CAPABILITIES,\
+        (Handler),\
+        sizeof(KSPROPERTY),\
+        sizeof(KS_SEEKING_CAPABILITIES),\
+        NULL, NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_FORMATS,\
+        (Handler),\
+        sizeof(KSPROPERTY),\
+        0,\
+        NULL, NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\
+        (GetHandler),\
+        sizeof(KSPROPERTY),\
+        sizeof(GUID),\
+        (SetHandler),\
+        NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_POSITION,\
+        (Handler),\
+        sizeof(KSPROPERTY),\
+        sizeof(LONGLONG),\
+        NULL, NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_STOPPOSITION,\
+        (Handler),\
+        sizeof(KSPROPERTY),\
+        sizeof(LONGLONG),\
+        NULL, NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_POSITIONS,\
+        NULL,\
+        sizeof(KSPROPERTY),\
+        sizeof(KSPROPERTY_POSITIONS),\
+        (Handler),\
+        NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_DURATION,\
+        (Handler),\
+        sizeof(KSPROPERTY),\
+        sizeof(LONGLONG),\
+        NULL, NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_AVAILABLE,\
+        (Handler),\
+        sizeof(KSPROPERTY),\
+        sizeof(KSPROPERTY_MEDIAAVAILABLE),\
+        NULL, NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_PREROLL,\
+        (Handler),\
+        sizeof(KSPROPERTY),\
+        sizeof(LONGLONG),\
+        NULL, NULL, 0, NULL, NULL, 0)
+
+#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\
+    DEFINE_KSPROPERTY_ITEM(\
+        KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\
+        (Handler),\
+        sizeof(KSP_TIMEFORMAT),\
+        sizeof(LONGLONG),\
+        NULL, NULL, 0, NULL, NULL, 0)
 
 /* ===============================================================
     Pin
@@ -598,8 +724,10 @@ typedef enum
     Properties/Methods/Events
 */
 
-#define KSPROPSETID_Stream \
+#define STATIC_KSPROPSETID_Stream\
     0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
+#define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
 
 typedef enum
 {
@@ -1384,24 +1512,6 @@ typedef struct
 #define KSPROPERTY_MEMBER_VALUES        0x00000003
 #define KSPROPERTY_MEMBER_FLAG_DEFAULT  KSPROPERTY_MEMBER_RANGES
 
-typedef enum {
-    KS_SEEKING_NoPositioning,
-    KS_SEEKING_AbsolutePositioning,
-    KS_SEEKING_RelativePositioning,
-    KS_SEEKING_IncrementalPositioning,
-    KS_SEEKING_PositioningBitsMask = 0x3,
-    KS_SEEKING_SeekToKeyFrame,
-    KS_SEEKING_ReturnTime = 0x8
-} KS_SEEKING_FLAGS;
-
-typedef struct
-{
-    LONGLONG            Current;
-    LONGLONG            Stop;
-    KS_SEEKING_FLAGS    CurrentFlags;
-    KS_SEEKING_FLAGS    StopFlags;
-} KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
-
 typedef struct
 {
     GUID            PropertySet;
@@ -1474,13 +1584,6 @@ typedef struct
     ULONG           Reserved;
 } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
 
-typedef struct
-{
-    LONGLONG    Earliest;
-    LONGLONG    Latest;
-} KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
-
-
 typedef struct
 {
     ULONG   MembersFlags;
@@ -1743,11 +1846,32 @@ typedef struct
     KSEVENTDATA EventData;
 } KSRELATIVEEVENT, *PKSRELATIVEEVENT;
 
+#define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001
+#define KSRELATIVEEVENT_FLAG_POINTER 0x00000002
 
 /* ===============================================================
     Timing
 */
 
+
+typedef struct {
+    KSEVENTDATA     EventData;
+    LONGLONG        MarkTime;
+} KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
+
+typedef struct {
+    KSEVENTDATA     EventData;
+    LONGLONG        TimeBase;
+    LONGLONG        Interval;
+} KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
+
+typedef struct {
+    LONGLONG        TimeBase;
+    LONGLONG        Interval;
+} KSINTERVAL, *PKSINTERVAL;
+
+
+
 typedef struct
 {
     LONGLONG Time;
@@ -1761,20 +1885,6 @@ typedef struct
     LONGLONG    SystemTime;
 } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
 
-typedef struct
-{
-    KSPROPERTY Property;
-    GUID SourceFormat;
-    GUID TargetFormat;
-    LONGLONG Time;
-} KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
-
-typedef struct
-{
-    LONGLONG        TimeBase;
-    LONGLONG        Interval;
-} KSINTERVAL, *PKSINTERVAL;
-
 typedef struct
 {
     LONGLONG    Duration;
@@ -1983,19 +2093,7 @@ typedef struct {
 typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY;
 
 #if defined(_NTDDK_)
-typedef struct
-{
-    KSEVENTDATA     EventData;
-    LONGLONG        MarkTime;
-} KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
-
-typedef struct
-{
-    KSEVENTDATA     EventData;
-    LONGLONG        TimeBase;
-    LONGLONG        Interval;
-} KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
-
+       
 typedef NTSTATUS (NTAPI *PFNKSADDEVENT)(
     IN  PIRP Irp,
     IN  PKSEVENTDATA EventData,
@@ -3780,6 +3878,26 @@ KsPinGetConnectedPinFileObject(
 
 #else
 
+#if !defined( KS_NO_CREATE_FUNCTIONS )
+
+KSDDKAPI
+DWORD
+WINAPI
+KsCreateAllocator(
+    IN HANDLE ConnectionHandle,
+    IN PKSALLOCATOR_FRAMING AllocatorFraming,
+    OUT PHANDLE AllocatorHandle
+    );
+
+KSDDKAPI
+DWORD
+NTAPI
+KsCreateClock(
+    IN HANDLE ConnectionHandle,
+    IN PKSCLOCK_CREATE ClockCreate,
+    OUT PHANDLE ClockHandle
+    );
+
 KSDDKAPI
 DWORD
 WINAPI
@@ -3790,6 +3908,17 @@ KsCreatePin(
     OUT PHANDLE ConnectionHandle
     );
 
+KSDDKAPI
+DWORD
+WINAPI
+KsCreateTopologyNode(
+    IN HANDLE ParentHandle,
+    IN PKSNODE_CREATE NodeCreate,
+    IN ACCESS_MASK DesiredAccess,
+    OUT PHANDLE NodeHandle
+    );
+    
+#endif
 
 #endif
 
diff --git a/reactos/include/psdk/ksproxy.h b/reactos/include/psdk/ksproxy.h
new file mode 100644 (file)
index 0000000..db2f312
--- /dev/null
@@ -0,0 +1,798 @@
+#ifndef __KSPROXY__
+#define __KSPROXY__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#undef KSDDKAPI
+#ifdef _KSDDK_
+#define KSDDKAPI
+#else
+#define KSDDKAPI DECLSPEC_IMPORT
+#endif
+
+#define STATIC_IID_IKsObject\
+    0x423c13a2L, 0x2070, 0x11d0, 0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1
+
+#define STATIC_IID_IKsPinEx\
+    0x7bb38260L, 0xd19c, 0x11d2, 0xb3, 0x8a, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e
+
+#define STATIC_IID_IKsPin\
+    0xb61178d1L, 0xa2d9, 0x11cf, 0x9e, 0x53, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1
+    
+#define STATIC_IID_IKsPinPipe\
+    0xe539cd90L, 0xa8b4, 0x11d1, 0x81, 0x89, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
+
+#define STATIC_IID_IKsDataTypeHandler\
+    0x5ffbaa02L, 0x49a3, 0x11d0, 0x9f, 0x36, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1
+
+#define STATIC_IID_IKsDataTypeCompletion\
+    0x827D1A0EL, 0x0F73, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+
+#define STATIC_IID_IKsInterfaceHandler\
+    0xD3ABC7E0L, 0x9A61, 0x11D0, 0xA4, 0x0D, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+
+#define STATIC_IID_IKsClockPropertySet\
+    0x5C5CBD84L, 0xE755, 0x11D0, 0xAC, 0x18, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+
+#define STATIC_IID_IKsAllocator\
+    0x8da64899L, 0xc0d9, 0x11d0, 0x84, 0x13, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
+    
+#define STATIC_IID_IKsAllocatorEx\
+    0x091bb63aL, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
+    
+
+#ifndef STATIC_IID_IKsPropertySet
+#define STATIC_IID_IKsPropertySet\
+    0x31EFAC30L, 0x515C, 0x11d0, 0xA9, 0xAA, 0x00, 0xAA, 0x00, 0x61, 0xBE, 0x93
+#endif
+
+#define STATIC_IID_IKsTopology\
+    0x28F54683L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+
+#ifndef STATIC_IID_IKsControl
+#define STATIC_IID_IKsControl\
+    0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+#endif
+
+#define STATIC_IID_IKsAggregateControl\
+    0x7F40EAC0L, 0x3947, 0x11D2, 0x87, 0x4E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+
+#define STATIC_CLSID_Proxy \
+    0x17CCA71BL, 0xECD7, 0x11D0, 0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+
+#ifdef _KS_
+
+#if !defined(__cplusplus) || _MSC_VER < 1100
+
+#define IID_IKsQualityForwarder KSCATEGORY_QUALITY
+
+DEFINE_GUIDEX(IID_IKsObject);
+DEFINE_GUIDEX(IID_IKsPin);
+DEFINE_GUIDEX(IID_IKsPinEx);
+DEFINE_GUIDEX(IID_IKsPinPipe);
+DEFINE_GUIDEX(IID_IKsDataTypeHandler);
+DEFINE_GUIDEX(IID_IKsDataTypeCompletion);
+DEFINE_GUIDEX(IID_IKsInterfaceHandler);
+DEFINE_GUIDEX(IID_IKsClockPropertySet);
+DEFINE_GUIDEX(IID_IKsAllocator);
+DEFINE_GUIDEX(IID_IKsAllocatorEx);
+#endif
+
+#define STATIC_IID_IKsQualityForwarder STATIC_KSCATEGORY_QUALITY
+
+typedef enum
+{
+    KsAllocatorMode_User,
+    KsAllocatorMode_Kernel
+}KSALLOCATORMODE;
+
+
+typedef enum
+{
+    FramingProp_Uninitialized,
+    FramingProp_None,
+    FramingProp_Old,
+    FramingProp_Ex
+}FRAMING_PROP;
+
+typedef FRAMING_PROP *PFRAMING_PROP;
+
+
+typedef enum
+{
+    Framing_Cache_Update,
+    Framing_Cache_ReadLast,
+    Framing_Cache_ReadOrig,
+    Framing_Cache_Write
+}FRAMING_CACHE_OPS;
+
+
+typedef struct
+{
+    LONGLONG     MinTotalNominator;  
+    LONGLONG     MaxTotalNominator;
+    LONGLONG     TotalDenominator;
+}OPTIMAL_WEIGHT_TOTALS;
+
+typedef struct IPin IPin;
+typedef struct IKsPin IKsPin;
+typedef struct IKsAllocator IKsAllocator;
+typedef struct IKsAllocatorEx IKsAllocatorEx;
+
+                      
+#define AllocatorStrategy_DontCare                      0
+#define AllocatorStrategy_MinimizeNumberOfFrames        1
+#define AllocatorStrategy_MinimizeFrameSize             2
+#define AllocatorStrategy_MinimizeNumberOfAllocators    4
+#define AllocatorStrategy_MaximizeSpeed                 8 
+
+#define PipeFactor_None                   0x0
+#define PipeFactor_UserModeUpstream       0x1
+#define PipeFactor_UserModeDownstream     0x2
+#define PipeFactor_MemoryTypes            0x4
+#define PipeFactor_Flags                  0x8
+#define PipeFactor_PhysicalRanges         0x10
+#define PipeFactor_OptimalRanges          0x20
+#define PipeFactor_FixedCompression       0x40
+#define PipeFactor_UnknownCompression     0x80
+#define PipeFactor_Buffers                0x100
+#define PipeFactor_Align                  0x200
+#define PipeFactor_PhysicalEnd            0x400
+#define PipeFactor_LogicalEnd             0x800
+
+typedef enum
+{
+    PipeState_DontCare,
+    PipeState_RangeNotFixed,
+    PipeState_RangeFixed,
+    PipeState_CompressionUnknown,
+    PipeState_Finalized
+}PIPE_STATE;
+
+
+typedef struct _PIPE_DIMENSIONS
+{
+    KS_COMPRESSION AllocatorPin;
+    KS_COMPRESSION MaxExpansionPin;
+    KS_COMPRESSION EndPin;
+}PIPE_DIMENSIONS, *PPIPE_DIMENSIONS;
+
+
+typedef enum
+{
+    Pipe_Allocator_None,
+    Pipe_Allocator_FirstPin,
+    Pipe_Allocator_LastPin,
+    Pipe_Allocator_MiddlePin
+}PIPE_ALLOCATOR_PLACE, *PPIPE_ALLOCATOR_PLACE;;
+
+typedef enum
+{
+    KS_MemoryTypeDontCare = 0,
+    KS_MemoryTypeKernelPaged,
+    KS_MemoryTypeKernelNonPaged,
+    KS_MemoryTypeDeviceHostMapped,
+    KS_MemoryTypeDeviceSpecific,
+    KS_MemoryTypeUser,
+    KS_MemoryTypeAnyHost
+}KS_LogicalMemoryType, *PKS_LogicalMemoryType;;
+
+typedef struct _PIPE_TERMINATION {
+    ULONG                       Flags;
+    ULONG                       OutsideFactors;
+    ULONG                       Weigth;
+    KS_FRAMING_RANGE            PhysicalRange;
+    KS_FRAMING_RANGE_WEIGHTED   OptimalRange;
+    KS_COMPRESSION              Compression;
+}PIPE_TERMINATION;
+
+
+typedef struct _ALLOCATOR_PROPERTIES_EX
+{
+    long cBuffers;
+    long cbBuffer;
+    long cbAlign;
+    long cbPrefix;
+
+    GUID                       MemoryType;
+    GUID                       BusType;
+    PIPE_STATE                 State;
+    PIPE_TERMINATION           Input;
+    PIPE_TERMINATION           Output;
+    ULONG                      Strategy;
+    ULONG                      Flags;
+    ULONG                      Weight;
+    KS_LogicalMemoryType       LogicalMemoryType;
+    PIPE_ALLOCATOR_PLACE       AllocatorPlace;
+    PIPE_DIMENSIONS            Dimensions;
+    KS_FRAMING_RANGE           PhysicalRange;
+    IKsAllocatorEx*            PrevSegment;
+    ULONG                      CountNextSegments;
+    IKsAllocatorEx**           NextSegments;
+    ULONG                      InsideFactors;
+    ULONG                      NumberPins;
+}ALLOCATOR_PROPERTIES_EX;
+
+typedef ALLOCATOR_PROPERTIES_EX *PALLOCATOR_PROPERTIES_EX;
+
+
+#ifdef __STREAMS__
+
+struct DECLSPEC_UUID("5C5CBD84-E755-11D0-AC18-00A0C9223196") IKsClockPropertySet;
+#undef INTERFACE
+#define INTERFACE IKsClockPropertySet
+DECLARE_INTERFACE_(IKsClockPropertySet, IUnknown)
+{
+    STDMETHOD(KsGetTime)(
+        THIS_
+        LONGLONG* Time
+    ) PURE;
+    STDMETHOD(KsSetTime)(
+        THIS_
+        LONGLONG Time
+    ) PURE;
+    STDMETHOD(KsGetPhysicalTime)(
+        THIS_
+        LONGLONG* Time
+    ) PURE;
+    STDMETHOD(KsSetPhysicalTime)(
+        THIS_
+        LONGLONG Time
+    ) PURE;
+    STDMETHOD(KsGetCorrelatedTime)(
+        THIS_
+        KSCORRELATED_TIME* CorrelatedTime
+    ) PURE;
+    STDMETHOD(KsSetCorrelatedTime)(
+        THIS_
+        KSCORRELATED_TIME* CorrelatedTime
+    ) PURE;
+    STDMETHOD(KsGetCorrelatedPhysicalTime)(
+        THIS_
+        KSCORRELATED_TIME* CorrelatedTime
+    ) PURE;
+    STDMETHOD(KsSetCorrelatedPhysicalTime)(
+        THIS_
+        KSCORRELATED_TIME* CorrelatedTime
+    ) PURE;
+    STDMETHOD(KsGetResolution)(
+        THIS_
+        KSRESOLUTION* Resolution
+    ) PURE;
+    STDMETHOD(KsGetState)(
+        THIS_
+        KSSTATE* State
+    ) PURE;
+};
+
+
+interface DECLSPEC_UUID("8da64899-c0d9-11d0-8413-0000f822fe8a") IKsAllocator;
+#undef INTERFACE
+#define INTERFACE IKsAllocator
+DECLARE_INTERFACE_(IKsAllocator, IUnknown)
+{
+    STDMETHOD_(HANDLE, KsGetAllocatorHandle)(
+        THIS
+    ) PURE;
+    STDMETHOD_(KSALLOCATORMODE, KsGetAllocatorMode)(
+        THIS
+    ) PURE;
+    STDMETHOD(KsGetAllocatorStatus)(
+        THIS_
+        PKSSTREAMALLOCATOR_STATUS AllocatorStatus
+    ) PURE;
+    STDMETHOD_(VOID, KsSetAllocatorMode)(
+        THIS_
+        KSALLOCATORMODE Mode
+    ) PURE;
+};
+
+interface DECLSPEC_UUID("091bb63a-603f-11d1-b067-00a0c9062802") IKsAllocatorEx;
+#undef INTERFACE
+#define INTERFACE IKsAllocatorEx
+DECLARE_INTERFACE_(IKsAllocatorEx, IKsAllocator)
+{
+    STDMETHOD_(PALLOCATOR_PROPERTIES_EX, KsGetProperties)(
+        THIS
+    ) PURE;
+    STDMETHOD_(VOID, KsSetProperties)(
+        THIS_
+        PALLOCATOR_PROPERTIES_EX 
+    ) PURE;
+    STDMETHOD_(VOID, KsSetAllocatorHandle)(
+        THIS_
+        HANDLE AllocatorHandle
+    ) PURE;
+    STDMETHOD_(HANDLE, KsCreateAllocatorAndGetHandle)(
+        THIS_
+        IKsPin*   KsPin
+    ) PURE;
+};  
+
+typedef enum {
+    KsPeekOperation_PeekOnly,
+    KsPeekOperation_AddRef
+} KSPEEKOPERATION;
+
+typedef struct _KSSTREAM_SEGMENT *PKSSTREAM_SEGMENT;
+
+interface DECLSPEC_UUID("b61178d1-a2d9-11cf-9e53-00aa00a216a1") IKsPin;
+
+#undef INTERFACE
+#define INTERFACE IKsPin
+DECLARE_INTERFACE_(IKsPin, IUnknown)
+{
+    STDMETHOD(KsQueryMediums)(
+        THIS_
+        PKSMULTIPLE_ITEM* MediumList
+    ) PURE;
+    STDMETHOD(KsQueryInterfaces)(
+        THIS_
+        PKSMULTIPLE_ITEM* InterfaceList
+    ) PURE;
+    STDMETHOD(KsCreateSinkPinHandle)(
+        THIS_
+        KSPIN_INTERFACE& Interface,
+        KSPIN_MEDIUM& Medium
+    ) PURE;
+    STDMETHOD(KsGetCurrentCommunication)(
+        THIS_
+        KSPIN_COMMUNICATION *Communication,
+        KSPIN_INTERFACE *Interface,
+        KSPIN_MEDIUM *Medium
+    ) PURE;
+    STDMETHOD(KsPropagateAcquire)(
+        THIS
+    ) PURE;
+    STDMETHOD(KsDeliver)(
+        THIS_
+        IMediaSample* Sample,
+        ULONG Flags
+    ) PURE;
+    STDMETHOD(KsMediaSamplesCompleted)(
+        THIS_
+        PKSSTREAM_SEGMENT StreamSegment
+    ) PURE;
+    STDMETHOD_(IMemAllocator *, KsPeekAllocator)(
+        THIS_
+        KSPEEKOPERATION Operation
+    ) PURE;
+    STDMETHOD(KsReceiveAllocator)(
+        THIS_
+        IMemAllocator *MemAllocator
+    ) PURE;
+    STDMETHOD(KsRenegotiateAllocator)(
+        THIS
+    ) PURE;
+    STDMETHOD_(LONG, KsIncrementPendingIoCount)(
+        THIS
+    ) PURE;
+    STDMETHOD_(LONG, KsDecrementPendingIoCount)(
+        THIS
+    ) PURE;
+    STDMETHOD(KsQualityNotify)(
+        THIS_
+        ULONG Proportion,
+        REFERENCE_TIME TimeDelta
+    ) PURE;
+};
+
+interface DECLSPEC_UUID("7bb38260-d19c-11d2-b38a-00a0c95ec22e") IKsPinEx;
+#undef INTERFACE
+#define INTERFACE IKsPinEx
+DECLARE_INTERFACE_(IKsPinEx, IKsPin)
+{
+    STDMETHOD_(VOID, KsNotifyError)(
+        THIS_
+        IMediaSample* Sample,
+        HRESULT hr
+    ) PURE;        
+};
+                         
+interface DECLSPEC_UUID("e539cd90-a8b4-11d1-8189-00a0c9062802") IKsPinPipe;
+#undef INTERFACE
+#define INTERFACE IKsPinPipe
+DECLARE_INTERFACE_(IKsPinPipe, IUnknown)
+{
+    STDMETHOD(KsGetPinFramingCache)(
+        THIS_
+        PKSALLOCATOR_FRAMING_EX *FramingEx,
+        PFRAMING_PROP FramingProp,
+        FRAMING_CACHE_OPS Option
+    ) PURE;
+    STDMETHOD(KsSetPinFramingCache)(
+        THIS_
+        PKSALLOCATOR_FRAMING_EX FramingEx,
+        PFRAMING_PROP FramingProp,
+        FRAMING_CACHE_OPS Option
+    ) PURE;
+    STDMETHOD_(IPin*, KsGetConnectedPin)(
+        THIS
+    ) PURE;
+    STDMETHOD_(IKsAllocatorEx*, KsGetPipe)(
+        THIS_
+        KSPEEKOPERATION Operation
+    ) PURE;
+    STDMETHOD(KsSetPipe)(
+        THIS_
+        IKsAllocatorEx *KsAllocator
+    ) PURE;
+    STDMETHOD_(ULONG, KsGetPipeAllocatorFlag)(
+        THIS
+    ) PURE;
+    STDMETHOD(KsSetPipeAllocatorFlag)(
+        THIS_
+        ULONG Flag
+    ) PURE;
+    STDMETHOD_(GUID, KsGetPinBusCache)(
+        THIS
+    ) PURE;
+    STDMETHOD(KsSetPinBusCache)(
+        THIS_
+        GUID Bus
+    ) PURE;
+
+    STDMETHOD_(PWCHAR, KsGetPinName)(
+        THIS
+    ) PURE;
+    STDMETHOD_(PWCHAR, KsGetFilterName)(
+        THIS
+    ) PURE;
+};
+
+
+interface DECLSPEC_UUID("CD5EBE6B-8B6E-11D1-8AE0-00A0C9223196") IKsPinFactory;
+#undef INTERFACE
+#define INTERFACE IKsPinFactory
+DECLARE_INTERFACE_(IKsPinFactory, IUnknown)
+{
+    STDMETHOD(KsPinFactory)(
+        THIS_
+        ULONG* PinFactory
+    ) PURE;
+};
+
+typedef enum {
+    KsIoOperation_Write,
+    KsIoOperation_Read
+} KSIOOPERATION;
+
+interface DECLSPEC_UUID("5ffbaa02-49a3-11d0-9f36-00aa00a216a1") IKsDataTypeHandler;
+#undef INTERFACE
+#define INTERFACE IKsDataTypeHandler
+DECLARE_INTERFACE_(IKsDataTypeHandler, IUnknown)
+{
+    STDMETHOD(KsCompleteIoOperation)(
+        THIS_
+        IMediaSample *Sample,
+        PVOID StreamHeader,
+        KSIOOPERATION IoOperation,
+        BOOL Cancelled
+    ) PURE;
+    STDMETHOD(KsIsMediaTypeInRanges)(
+        THIS_
+        PVOID DataRanges
+        ) PURE;
+    STDMETHOD(KsPrepareIoOperation)(
+        THIS_
+        IMediaSample *Sample,
+        PVOID StreamHeader,
+        KSIOOPERATION IoOperation
+    ) PURE;
+    STDMETHOD(KsQueryExtendedSize)(
+        THIS_
+        ULONG* ExtendedSize
+    ) PURE;
+    STDMETHOD(KsSetMediaType)(
+        THIS_
+        const AM_MEDIA_TYPE* AmMediaType
+    ) PURE;
+};
+
+interface DECLSPEC_UUID("827D1A0E-0F73-11D2-B27A-00A0C9223196") IKsDataTypeCompletion;
+#undef INTERFACE
+#define INTERFACE IKsDataTypeCompletion
+DECLARE_INTERFACE_(IKsDataTypeCompletion, IUnknown)
+{
+    STDMETHOD(KsCompleteMediaType)(
+        THIS_
+        HANDLE FilterHandle,
+        ULONG PinFactoryId,
+        AM_MEDIA_TYPE* AmMediaType
+    ) PURE;
+};
+
+interface DECLSPEC_UUID("D3ABC7E0-9A61-11d0-A40D-00A0C9223196") IKsInterfaceHandler;
+#undef INTERFACE
+#define INTERFACE IKsInterfaceHandler
+DECLARE_INTERFACE_(IKsInterfaceHandler, IUnknown)
+{
+    STDMETHOD(KsSetPin)(
+        THIS_
+        IKsPin *KsPin
+    ) PURE;
+    STDMETHOD(KsProcessMediaSamples)(
+        THIS_
+        IKsDataTypeHandler *KsDataTypeHandler,
+        IMediaSample** SampleList,
+        PLONG SampleCount,
+        KSIOOPERATION IoOperation,
+        PKSSTREAM_SEGMENT *StreamSegment
+    ) PURE;
+    STDMETHOD(KsCompleteIo)(
+        THIS_
+        PKSSTREAM_SEGMENT StreamSegment
+    ) PURE;
+};
+
+
+typedef struct _KSSTREAM_SEGMENT
+{
+    IKsInterfaceHandler     *KsInterfaceHandler;
+    IKsDataTypeHandler      *KsDataTypeHandler;
+    KSIOOPERATION           IoOperation;
+    HANDLE                  CompletionEvent;
+    
+}KSSTREAM_SEGMENT;
+
+interface DECLSPEC_UUID("423c13a2-2070-11d0-9ef7-00aa00a216a1") IKsObject;
+#undef INTERFACE
+#define INTERFACE IKsObject
+DECLARE_INTERFACE_(IKsObject, IUnknown)
+{
+    STDMETHOD_(HANDLE, KsGetObjectHandle)(
+        THIS
+    ) PURE;
+};
+
+interface DECLSPEC_UUID("97ebaacb-95bd-11d0-a3ea-00a0c9223196") IKsQualityForwarder;
+#undef INTERFACE
+#define INTERFACE IKsQualityForwarder
+DECLARE_INTERFACE_(IKsQualityForwarder, IKsObject)
+{
+    STDMETHOD_(VOID, KsFlushClient)(
+        THIS_
+        IKsPin* Pin
+    ) PURE;
+};
+
+#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+interface DECLSPEC_UUID("412bd695-f84b-46c1-ac73-54196dbc8fa7") IKsNotifyEvent;
+#undef INTERFACE
+#define INTERFACE IKsNotifyEvent
+DECLARE_INTERFACE_(IKsNotifyEvent, IUnknown)
+{
+    STDMETHOD(KsNotifyEvent)(
+        THIS_
+        ULONG Event,
+        ULONG_PTR lParam1,
+        ULONG_PTR lParam2
+    ) PURE;
+};
+
+#endif
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsResolveRequiredAttributes(
+    PKSDATARANGE DataRange,
+    PKSMULTIPLE_ITEM Attributes OPTIONAL);
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsOpenDefaultDevice(
+    REFGUID Category,
+    ACCESS_MASK Access,
+    PHANDLE DeviceHandle);
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsSynchronousDeviceControl(
+    HANDLE      Handle,
+    ULONG       IoControl,
+    PVOID       InBuffer,
+    ULONG       InLength,
+    PVOID       OutBuffer,
+    ULONG       OutLength,
+    PULONG      BytesReturned);
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsGetMultiplePinFactoryItems(
+    HANDLE  FilterHandle,
+    ULONG   PinFactoryId,
+    ULONG   PropertyId,
+    PVOID*  Items);
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsGetMediaTypeCount(
+    HANDLE      FilterHandle,
+    ULONG       PinFactoryId,
+    ULONG*      MediaTypeCount);
+
+KSDDKAPI
+HRESULT
+WINAPI
+KsGetMediaType(
+    int         Position,
+    AM_MEDIA_TYPE* AmMediaType,
+    HANDLE      FilterHandle,
+    ULONG       PinFactoryId);
+
+#endif
+
+#ifndef _IKsPropertySet_
+#if !defined(__cplusplus) || _MSC_VER < 1100
+DEFINE_GUIDEX(IID_IKsPropertySet);
+#endif
+#endif
+
+#ifndef _IKsControl_
+#if !defined(__cplusplus) || _MSC_VER < 1100
+DEFINE_GUIDEX(IID_IKsControl);
+#endif
+#endif
+
+#if !defined(__cplusplus) || _MSC_VER < 1100
+DEFINE_GUIDEX(IID_IKsAggregateControl);
+#endif
+
+#ifndef _IKsTopology_
+#if !defined(__cplusplus) || _MSC_VER < 1100
+DEFINE_GUIDEX(IID_IKsTopology);
+#endif
+#endif
+
+DEFINE_GUIDSTRUCT("17CCA71B-ECD7-11D0-B908-00A0C9223196", CLSID_Proxy);
+#define CLSID_Proxy DEFINE_GUIDNAMED(CLSID_Proxy)
+
+#else
+
+#ifndef _IKsPropertySet_
+#if !defined(__cplusplus) || _MSC_VER < 1100
+DEFINE_GUID(IID_IKsPropertySet, STATIC_IID_IKsPropertySet);
+#endif
+#endif
+
+#if !defined(__cplusplus) || _MSC_VER < 1100
+DEFINE_GUID(CLSID_Proxy, STATIC_CLSID_Proxy);
+#else
+DECLSPEC_UUID("17CCA71B-ECD7-11D0-B908-00A0C9223196") CLSID_Proxy;
+#endif
+
+#endif
+
+#ifndef _IKsPropertySet_
+#define _IKsPropertySet_
+
+#define KSPROPERTY_SUPPORT_GET 1
+#define KSPROPERTY_SUPPORT_SET 2
+
+interface DECLSPEC_UUID("31EFAC30-515C-11d0-A9AA-00aa0061be93") 
+#undef INTERFACE
+#define INTERFACE IKsPropertySet
+DECLARE_INTERFACE_(IKsPropertySet, IUnknown)
+{
+    STDMETHOD(Set)(
+        THIS_
+        IN REFGUID PropSet,
+        IN ULONG Id,
+        IN LPVOID InstanceData,
+        IN ULONG InstanceLength,
+        IN LPVOID PropertyData,
+        IN ULONG DataLength
+    ) PURE;
+
+    STDMETHOD(Get)(
+        THIS_
+        IN REFGUID PropSet,
+        IN ULONG Id,
+        IN LPVOID InstanceData,
+        IN ULONG InstanceLength,
+        OUT LPVOID PropertyData,
+        IN ULONG DataLength,
+        OUT ULONG* BytesReturned
+    ) PURE;
+
+    STDMETHOD(QuerySupported)(
+        THIS_
+        IN REFGUID PropSet,
+        IN ULONG Id,
+        OUT ULONG* TypeSupport
+    ) PURE;
+};
+
+#endif
+
+#ifndef _IKsControl_
+#define _IKsControl_
+
+DEFINE_GUID(IID_IKsControl, 28F54685, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0A0, 0xC9, 0x22, 0x31, 0x96);
+
+
+interface DECLSPEC_UUID("28F54685-06FD-11D2-B27A-00A0C9223196") IKsControl;
+#undef INTERFACE
+#define INTERFACE IKsControl
+DECLARE_INTERFACE_(IKsControl, IUnknown)
+{
+    STDMETHOD(KsProperty)(
+        THIS_
+        IN PKSPROPERTY Property,
+        IN ULONG PropertyLength,
+        IN OUT LPVOID PropertyData,
+        IN ULONG DataLength,
+        OUT ULONG* BytesReturned
+    ) PURE;
+    STDMETHOD(KsMethod)(
+        THIS_
+        IN PKSMETHOD Method,
+        IN ULONG MethodLength,
+        IN OUT LPVOID MethodData,
+        IN ULONG DataLength,
+        OUT ULONG* BytesReturned
+    ) PURE;
+    STDMETHOD(KsEvent)(
+        THIS_
+        IN PKSEVENT Event OPTIONAL,
+        IN ULONG EventLength,
+        IN OUT LPVOID EventData,
+        IN ULONG DataLength,
+        OUT ULONG* BytesReturned
+    ) PURE;
+};
+
+#endif
+
+
+DEFINE_GUID(IID_IKsAggregateControl, 0x7F40EAC0, 0x3947, 0x11D2, 0x87, 0x4E, 0x00, 0A0, 0xC9, 0x22, 0x31, 0x96);
+
+#undef INTERFACE
+#define INTERFACE IKsAggregateControl
+DECLARE_INTERFACE_(IKsAggregateControl, IUnknown)
+{
+    STDMETHOD(KsAddAggregate)(
+        THIS_
+        IN REFGUID AggregateClass
+    ) PURE;
+    STDMETHOD(KsRemoveAggregate)(
+        THIS_
+        IN REFGUID AggregateClass
+    ) PURE;
+};
+
+#ifndef _IKsTopology_
+#define _IKsTopology_
+
+DEFINE_GUID(IID_IKsAggregateControl, 0x28F54683, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0A0, 0xC9, 0x22, 0x31, 0x96);
+
+#undef INTERFACE
+#define INTERFACE IKsTopology
+DECLARE_INTERFACE_(IKsTopology, IUnknown)
+{
+    STDMETHOD(CreateNodeInstance)(
+        THIS_
+        IN ULONG NodeId,
+        IN ULONG Flags,
+        IN ACCESS_MASK DesiredAccess,
+        IN IUnknown* UnkOuter OPTIONAL,
+        IN REFGUID InterfaceId,
+        OUT LPVOID* Interface
+    ) PURE;
+};
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/reactos/include/psdk/ktmtypes.h b/reactos/include/psdk/ktmtypes.h
new file mode 100644 (file)
index 0000000..77cf578
--- /dev/null
@@ -0,0 +1,147 @@
+
+#ifndef _KTMTYPES_
+#define _KTMTYPES_
+
+#define TRANSACTION_MANAGER_VOLATILE             0x00000001
+#define TRANSACTION_MANAGER_COMMIT_DEFAULT       0x00000000
+#define TRANSACTION_MANAGER_COMMIT_SYSTEM_VOLUME 0x00000002
+#define TRANSACTION_MANAGER_COMMIT_SYSTEM_HIVES  0x00000004
+#define TRANSACTION_MANAGER_COMMIT_LOWEST        0x00000008
+#define TRANSACTION_MANAGER_CORRUPT_FOR_RECOVERY 0x00000010
+#define TRANSACTION_MANAGER_CORRUPT_FOR_PROGRESS 0x00000020
+#define TRANSACTION_MANAGER_MAXIMUM_OPTION       0x0000003F
+
+#define TRANSACTION_DO_NOT_PROMOTE               0x00000001
+#define TRANSACTION_MAXIMUM_OPTION               0x00000001
+
+#define RESOURCE_MANAGER_VOLATILE                0x00000001
+#define RESOURCE_MANAGER_COMMUNICATION           0x00000002
+#define RESOURCE_MANAGER_MAXIMUM_OPTION          0x00000003
+
+#define CRM_PROTOCOL_EXPLICIT_MARSHAL_ONLY       0x00000001
+#define CRM_PROTOCOL_DYNAMIC_MARSHAL_INFO        0x00000002
+#define CRM_PROTOCOL_MAXIMUM_OPTION              0x00000003
+
+#define ENLISTMENT_SUPERIOR                      0x00000001
+#define ENLISTMENT_MAXIMUM_OPTION                0x00000001
+
+#define TRANSACTION_NOTIFY_MASK                  0x3FFFFFFF
+#define TRANSACTION_NOTIFY_PREPREPARE            0x00000001
+#define TRANSACTION_NOTIFY_PREPARE               0x00000002
+#define TRANSACTION_NOTIFY_COMMIT                0x00000004
+#define TRANSACTION_NOTIFY_ROLLBACK              0x00000008
+#define TRANSACTION_NOTIFY_PREPREPARE_COMPLETE   0x00000010
+#define TRANSACTION_NOTIFY_PREPARE_COMPLETE      0x00000020
+#define TRANSACTION_NOTIFY_COMMIT_COMPLETE       0x00000040
+#define TRANSACTION_NOTIFY_ROLLBACK_COMPLETE     0x00000080
+#define TRANSACTION_NOTIFY_RECOVER               0x00000100
+#define TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT   0x00000200
+#define TRANSACTION_NOTIFY_DELEGATE_COMMIT       0x00000400
+#define TRANSACTION_NOTIFY_RECOVER_QUERY         0x00000800
+#define TRANSACTION_NOTIFY_ENLIST_PREPREPARE     0x00001000
+#define TRANSACTION_NOTIFY_LAST_RECOVER          0x00002000
+#define TRANSACTION_NOTIFY_INDOUBT               0x00004000
+#define TRANSACTION_NOTIFY_PROPAGATE_PULL        0x00008000
+#define TRANSACTION_NOTIFY_PROPAGATE_PUSH        0x00010000
+#define TRANSACTION_NOTIFY_MARSHAL               0x00020000
+#define TRANSACTION_NOTIFY_ENLIST_MASK           0x00040000
+#define TRANSACTION_NOTIFY_RM_DISCONNECTED       0x01000000
+#define TRANSACTION_NOTIFY_TM_ONLINE             0x02000000
+#define TRANSACTION_NOTIFY_COMMIT_REQUEST        0x04000000
+#define TRANSACTION_NOTIFY_PROMOTE               0x08000000
+#define TRANSACTION_NOTIFY_PROMOTE_NEW           0x10000000
+#define TRANSACTION_NOTIFY_REQUEST_OUTCOME       0x20000000
+
+#define TRANSACTION_NOTIFY_COMMIT_FINALIZE       0x40000000
+
+#define TRANSACTIONMANAGER_OBJECT_PATH L"\\TransactionManager\\"
+#define TRANSACTION_OBJECT_PATH        L"\\Transaction\\"
+#define ENLISTMENT_OBJECT_PATH         L"\\Enlistment\\"
+#define RESOURCE_MANAGER_OBJECT_PATH   L"\\ResourceManager\\"
+
+#define TRANSACTIONMANAGER_OBJECT_NAME_LENGTH_IN_BYTES (sizeof(TRANSACTIONMANAGER_OBJECT_PATH)+(38*sizeof(WCHAR)))
+#define TRANSACTION_OBJECT_NAME_LENGTH_IN_BYTES        (sizeof(TRANSACTION_OBJECT_PATH)+(38*sizeof(WCHAR)))
+#define ENLISTMENT_OBJECT_NAME_LENGTH_IN_BYTES         (sizeof(ENLISTMENT_OBJECT_PATH)+(38*sizeof(WCHAR)))
+#define RESOURCE_MANAGER_OBJECT_NAME_LENGTH_IN_BYTES   (sizeof(RESOURCE_MANAGER_OBJECT_PATH)+(38*sizeof(WCHAR)))
+
+#define TRANSACTION_NOTIFICATION_TM_ONLINE_FLAG_IS_CLUSTERED 0x1
+
+#define KTM_MARSHAL_BLOB_VERSION_MAJOR 1
+#define KTM_MARSHAL_BLOB_VERSION_MINOR 1
+
+#define MAX_TRANSACTION_DESCRIPTION_LENGTH  64
+#define MAX_RESOURCEMANAGER_DESCRIPTION_LENGTH  64
+
+typedef GUID UOW, *PUOW;
+typedef GUID CRM_PROTOCOL_ID, *PCRM_PROTOCOL_ID;
+typedef ULONG NOTIFICATION_MASK;
+typedef ULONG SAVEPOINT_ID, *PSAVEPOINT_ID;
+
+typedef struct _TRANSACTION_NOTIFICATION {
+  PVOID TransactionKey;
+  ULONG TransactionNotification;
+  LARGE_INTEGER TmVirtualClock;
+  ULONG ArgumentLength;
+} TRANSACTION_NOTIFICATION, *PTRANSACTION_NOTIFICATION;
+
+typedef struct _TRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT {
+  GUID EnlistmentId;
+#if defined(__cplusplus)
+  ::UOW UOW;
+#else
+  UOW UOW;
+#endif
+} TRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT, *PTRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT;
+
+typedef struct _TRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT {
+  GUID TmIdentity;
+  ULONG Flags;
+} TRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT, *PTRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT;
+
+typedef struct _TRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT {
+  SAVEPOINT_ID SavepointId;
+} TRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT, *PTRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT;
+
+typedef struct _TRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT {
+  ULONG PropagationCookie;
+  GUID UOW;
+  GUID TmIdentity;
+  ULONG BufferLength;
+} TRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT, *PTRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT,
+  TRANSACTION_NOTIFICATION_PROMOTE_ARGUMENT, *PTRANSACTION_NOTIFICATION_PROMOTE_ARGUMENT;
+
+typedef struct _TRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT {
+  ULONG MarshalCookie;
+  GUID UOW;
+} TRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT, *PTRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT;
+
+typedef struct _KCRM_MARSHAL_HEADER {
+  ULONG VersionMajor;
+  ULONG VersionMinor;
+  ULONG NumProtocols;
+  ULONG Unused;
+} KCRM_MARSHAL_HEADER, *PKCRM_MARSHAL_HEADER, *RESTRICTED_POINTER PRKCRM_MARSHAL_HEADER;
+
+typedef struct _KCRM_TRANSACTION_BLOB {
+#if defined(__cplusplus)
+  ::UOW UOW;
+#else
+  UOW UOW;
+#endif
+  GUID TmIdentity;
+  ULONG IsolationLevel;
+  ULONG IsolationFlags;
+  ULONG Timeout;
+  WCHAR Description[MAX_TRANSACTION_DESCRIPTION_LENGTH];
+} KCRM_TRANSACTION_BLOB, *PKCRM_TRANSACTION_BLOB, *RESTRICTED_POINTER PRKCRM_TRANSACTION_BLOB;
+
+typedef struct _KCRM_PROTOCOL_BLOB {
+  CRM_PROTOCOL_ID ProtocolId;
+  ULONG StaticInfoLength;
+  ULONG TransactionIdInfoLength;
+  ULONG Unused1;
+  ULONG Unused2;
+} KCRM_PROTOCOL_BLOB, *PKCRM_PROTOCOL_BLOB, *RESTRICTED_POINTER PRKCRM_PROTOCOL_BLOB;
+
+#endif /* _KTMTYPES_ */
+
index 2d335ea..7d19734 100644 (file)
@@ -27,7 +27,7 @@ extern "C" {
 
 #ifndef __LHANDLE
 #define __LHANDLE
-typedef ULONG                   LHANDLE, *LPLHANDLE;
+typedef ULONG_PTR               LHANDLE, *LPLHANDLE;
 #endif
 #define lhSessionNull           ((LHANDLE)0)
 
index c9d90cb..a5b1b47 100644 (file)
@@ -25,11 +25,6 @@ interface IStream;
 cpp_quote("#define CPIOD_PEEK          0x40000000")
 cpp_quote("#define CPIOD_FORCE_PROMPT  0x80000000")
 
-/* FIXME: LANGID is defined in winnt.h and mlang.h in the platform SDK */
-cpp_quote("#ifndef _WINNT_H")
-typedef WORD LANGID;
-cpp_quote("#endif")
-
 [
   object,
   uuid(359f3443-bd4a-11d0-b188-00aa0038c969),
@@ -42,10 +37,10 @@ interface IMLangCodePages : IUnknown
         [out] DWORD *pdwCodePages);
     HRESULT GetStrCodePages(      
         [in, size_is(cchSrc)] const WCHAR *pszSrc,
-        [in] long cchSrc,
+        [in] LONG cchSrc,
         [in] DWORD dwPriorityCodePages,
         [out] DWORD *pdwCodePages,
-        [out] long *pcchCodePages);
+        [out] LONG *pcchCodePages);
     HRESULT CodePageToCodePages(      
         [in] UINT uCodePage,
         [out] DWORD *pdwCodePages);
@@ -233,11 +228,11 @@ interface IMLangString : IUnknown
 {
 #ifdef NEWMLSTR
     HRESULT LockMLStr(
-        [in] long lPos,
+        [in] LONG lPos,
         [in] DWORD dwFlags,
         [out] DWORD* pdwCookie,
-        [out] long* plActualPos,
-        [out] long* plActualLen);
+        [out] LONG* plActualPos,
+        [out] LONG* plActualLen);
 
     HRESULT UnlockMLStr(
         [in] DWORD dwCookie);
@@ -246,13 +241,13 @@ interface IMLangString : IUnknown
         [in] BOOL fNoAccess);
 #endif
     HRESULT GetLength(
-        [out, retval] long* plLen);
+        [out, retval] LONG* plLen);
     HRESULT SetMLStr(
-        [in] long lDestPos,
-        [in] long lDestLen,
+        [in] LONG lDestPos,
+        [in] LONG lDestLen,
         [in] IUnknown *pSrcMLStr,
-        [in] long lSrcPos,
-        [in] long lSrcLen);
+        [in] LONG lSrcPos,
+        [in] LONG lSrcLen);
 #ifdef NEWMLSTR
     HRESULT RegisterAttr(
         [in] IUnknown *pUnk,
@@ -267,14 +262,14 @@ interface IMLangString : IUnknown
         [out] IUnknown **ppUnk);
 #else
     HRESULT GetMLStr(
-        [in] long lSrcPos,
-        [in] long lSrcLen,
+        [in] LONG lSrcPos,
+        [in] LONG lSrcLen,
         [in] IUnknown *pUnkOuter,
         [in] DWORD dwClsContext,
         [in] const IID* piid,
         [out] IUnknown** ppDestMLStr,
-        [out] long* plDestPos,
-        [out] long* plDestLen);
+        [out] LONG* plDestPos,
+        [out] LONG* plDestLen);
 #endif
 }
 
@@ -287,29 +282,29 @@ interface IMLangLineBreakConsole : IUnknown
 {
     HRESULT BreakLineML(
         [in] IMLangString* pSrcMLStr,
-        [in] long lSrcPos,
-        [in] long lSrcLen,
-        [in] long cMinColumns,
-        [in] long cMaxColumns,
-        [out] long* plLineLen,
-        [out] long* plSkipLen);
+        [in] LONG lSrcPos,
+        [in] LONG lSrcLen,
+        [in] LONG cMinColumns,
+        [in] LONG cMaxColumns,
+        [out] LONG* plLineLen,
+        [out] LONG* plSkipLen);
 
     HRESULT BreakLineW(
         [in] LCID locale,
         [in, size_is(cchSrc)] const WCHAR* pszSrc,
-        [in] long cchSrc,
-        [in] long cMaxColumns,
-        [out] long* pcchLine,
-        [out] long* pcchSkip );
+        [in] LONG cchSrc,
+        [in] LONG cMaxColumns,
+        [out] LONG* pcchLine,
+        [out] LONG* pcchSkip );
 
     HRESULT BreakLineA(
         [in] LCID locale,
         [in] UINT uCodePage,
         [in, size_is(cchSrc)] const CHAR* pszSrc,
-        [in] long cchSrc,
-        [in] long cMaxColumns,
-        [out] long* pcchLine,
-        [out] long* pcchSkip);
+        [in] LONG cchSrc,
+        [in] LONG cMaxColumns,
+        [out] LONG* pcchLine,
+        [out] LONG* pcchSkip);
 }
 
 [
index aed31da..19749fb 100644 (file)
@@ -27,7 +27,11 @@ cpp_quote("HRESULT     WINAPI GetCORSystemDirectory(LPWSTR,DWORD,DWORD*);")
 cpp_quote("HRESULT     WINAPI GetCORVersion(LPWSTR,DWORD,DWORD*);")
 cpp_quote("HRESULT     WINAPI GetRequestedRuntimeInfo(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,DWORD,LPWSTR,DWORD,DWORD*,LPWSTR,DWORD,DWORD*);")
 cpp_quote("HRESULT     WINAPI LoadLibraryShim(LPCWSTR,LPCWSTR,LPVOID,HMODULE*);")
+cpp_quote("#ifdef WINE_STRICT_PROTOTYPES")
+cpp_quote("typedef HRESULT (__stdcall *FLockClrVersionCallback)(void);")
+cpp_quote("#else")
 cpp_quote("typedef HRESULT (__stdcall *FLockClrVersionCallback)();")
+cpp_quote("#endif")
 cpp_quote("HRESULT     WINAPI LockClrVersion(FLockClrVersionCallback,FLockClrVersionCallback*,FLockClrVersionCallback*);")
 
 typedef void* HDOMAINENUM;
index 5d8cb2a..fcb568e 100644 (file)
 import "oaidl.idl";
 import "comcat.idl";
 import "textstor.idl";
-/* import "ctfutb.idl"; */
+import "ctfutb.idl";
 #endif
 cpp_quote("#include <winuser.h>")
 
-/* FIXME: LANGID is defined in winnt.h and mlang.h in the platform SDK */
-cpp_quote("#ifndef _WINNT_H")
-typedef WORD LANGID;
-cpp_quote("#endif")
-
 cpp_quote("#define TF_E_STACKFULL MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0501)")
 cpp_quote("#define TF_E_DISCONNECTED    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0504)")
 cpp_quote("#define TF_E_ALREADY_EXISTS  MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0506)")
@@ -37,6 +32,7 @@ cpp_quote("#define TF_E_NOLOCK          MAKE_HRESULT(SEVERITY_ERROR, FACILITY_IT
 cpp_quote("HRESULT WINAPI TF_CreateThreadMgr(ITfThreadMgr **pptim);")
 cpp_quote("HRESULT WINAPI TF_GetThreadMgr(ITfThreadMgr **pptim);")
 cpp_quote("HRESULT WINAPI TF_CreateInputProcessorProfiles(ITfInputProcessorProfiles **ppipr);")
+cpp_quote("HRESULT WINAPI TF_CreateLangBarMgr(ITfLangBarMgr **pppbm);")
 
 cpp_quote("EXTERN_C const GUID GUID_PROP_TEXTOWNER;")
 cpp_quote("DEFINE_GUID(GUID_PROP_ATTRIBUTE,0x34b45670,0x7526,0x11d2,0xa1,0x47,0x00,0x10,0x5a,0x27,0x99,0xb5);")
@@ -46,6 +42,7 @@ cpp_quote("EXTERN_C const GUID GUID_PROP_COMPOSING;")
 
 cpp_quote("EXTERN_C const CLSID CLSID_TF_ThreadMgr;")
 cpp_quote("EXTERN_C const CLSID CLSID_TF_InputProcessorProfiles;")
+cpp_quote("EXTERN_C const CLSID CLSID_TF_LangBarMgr;")
 cpp_quote("EXTERN_C const CLSID CLSID_TF_CategoryMgr;")
 cpp_quote("DEFINE_GUID(CLSID_TF_DisplayAttributeMgr,0x3ce74de4,0x53d3,0x4d74,0x8b,0x83,0x43,0x1b,0x38,0x28,0xba,0x53);")
 
@@ -1349,3 +1346,16 @@ interface ITfSourceSingle : IUnknown
         [in] TfClientId tid,
         [in] REFIID riid);
 };
+
+[
+  object,
+  local,
+  uuid(c0f1db0c-3a20-405c-a303-96b6010a885f),
+  pointer_default(unique)
+]
+interface ITfThreadFocusSink : IUnknown
+{
+    HRESULT OnSetThreadFocus();
+
+    HRESULT OnKillThreadFocus();
+};
index 0d12849..e3683e9 100644 (file)
 #define DISPID_IE8_ELEMENTMAX   (DISPID_SITE-1)
 #define DISPID_IE8_ELEMENT      DISPID_IE8_ELEMENTBASE
 
+#define DISPID_IE8_FRAMESITEBASE  (DISPID_FRAMESITE+1120)
+#define DISPID_IE8_FRAMEMAX       (WEBOC_DISPIDBASE-1)
+#define DISPID_IE8_FRAME          DISPID_IE8_FRAMESITEBASE
+#define DISPID_IE8_IFRAME         DISPID_IE8_FRAMESITEBASE
+
 #define DISPID_COLLECTION      (DISPID_NORMAL_FIRST+500)
 #define DISPID_OPTIONS_COL     (DISPID_NORMAL_FIRST+500)
 #define DISPID_IMG             (DISPID_IMGBASE+1000)
 /* IHTMLScriptElement2 */
 #define DISPID_IHTMLSCRIPTELEMENT2_CHARSET  DISPID_SCRIPT+10
 
+/* IHTMLScriptElement3 */
+#define DISPID_IHTMLSCRIPTELEMENT3_IE8_SRC  DISPID_IE8_SCRIPT
+
 /* IHTMLFrameBase */
 #define DISPID_IHTMLFRAMEBASE_SRC           DISPID_FRAMESITE+0
 #define DISPID_IHTMLFRAMEBASE_NAME          STDPROPID_XOBJ_NAME
 /* IHTMLFrameBase3 */
 #define DISPID_IHTMLFRAMEBASE3_LONGDESC  DISPID_FRAMESITE+10
 
+/* IHTMLFrameElement */
+#define DISPID_IHTMLFRAMEELEMENT_BORDERCOLOR  DISPID_FRAME+1
+
+/* IHTMLFrameElement2 */
+#define DISPID_IHTMLFRAMEELEMENT2_HEIGHT  STDPROPID_XOBJ_HEIGHT
+#define DISPID_IHTMLFRAMEELEMENT2_WIDTH   STDPROPID_XOBJ_WIDTH
+
+/* IHTMLFrameElement3 */
+#define DISPID_IHTMLFRAMEELEMENT3_CONTENTDOCUMENT  DISPID_IE8_FRAME
+#define DISPID_IHTMLFRAMEELEMENT3_IE8_SRC          DISPID_IE8_FRAME+1
+#define DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC     DISPID_IE8_FRAME+2
+#define DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER  DISPID_IE8_FRAME+3
+
 /* IHTMLIFrameElement */
 #define DISPID_IHTMLIFRAMEELEMENT_VSPACE  DISPID_IFRAME+1
 #define DISPID_IHTMLIFRAMEELEMENT_HSPACE  DISPID_IFRAME+2
index 4a182f2..1941b92 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2004-2007 Jacek Caban for CodeWeavers
+ * Copyright 2004-2010 Jacek Caban for CodeWeavers
  * Copyright 2008      Konstantin Kondratyuk (Etersoft)
  *
  * This library is free software; you can redistribute it and/or
@@ -2876,7 +2876,7 @@ interface IHTMLCurrentStyle4 : IDispatch
 
     [propget, id(DISPID_IHTMLCURRENTSTYLE4_MAXWIDTH), displaybind, bindable]
     HRESULT maxWidth([retval, out] VARIANT * p);
-};
+}
 
 /*****************************************************************************
  *    DispHTMLCurrentStyle dispinterface
@@ -5903,7 +5903,7 @@ coclass HTMLStyleSheetPage
     [default]           dispinterface DispHTMLStyleSheetPage;
                         interface IHTMLStyleSheetPage;
                         interface IHTMLDOMConstructor;
-};
+}
 
 [
     odl,
@@ -6702,7 +6702,7 @@ methods:
 
     [id(DISPID_HTMLFORMELEMENTEVENTS_ONRESET)]
     VARIANT_BOOL onreset();
-};
+}
 
 interface IHTMLEventObj;
 
@@ -6905,7 +6905,7 @@ methods:
 
     [id(DISPID_HTMLFORMELEMENTEVENTS2_ONRESET)]
     VARIANT_BOOL onreset([in] IHTMLEventObj* pEvtObj);
-};
+}
 
 [
     noncreatable,
@@ -7365,7 +7365,7 @@ interface IHTMLControlElement : IDispatch
 
     [propget, id(DISPID_IHTMLCONTROLELEMENT_CLIENTLEFT), displaybind, bindable]
     HRESULT clientLeft([retval, out] LONG * p);
-};
+}
 
 /*****************************************************************************
  *    IHTMLBodyElement interface
@@ -7634,7 +7634,7 @@ methods:
 
     [propget, id(DISPID_IHTMLBODYELEMENT2_ONAFTERPRINT), displaybind, bindable]
     VARIANT onafterprint();
-};
+}
 
 [
     uuid(3050f24a-98b5-11cf-bb82-00aa00bdce0b)
@@ -7655,7 +7655,7 @@ coclass HTMLBody
                         interface IHTMLTextContainer;
                         interface IHTMLBodyElement;
                         interface IHTMLBodyElement2;
-};
+}
 
 /*****************************************************************************
  *    IHTMLAnchorElement interface
@@ -8970,6 +8970,92 @@ interface IHTMLTextAreaElement : IDispatch
     HRESULT createTextRange([retval, out] IHTMLTxtRange **range);
 }
 
+/*****************************************************************************
+ *    DispHTMLTextAreaElement dispinterface
+ */
+[
+    hidden,
+    uuid(3050f521-98b5-11cf-bb82-00aa00bdce0b)
+]
+dispinterface DispHTMLTextAreaElement
+{
+properties:
+methods:
+    WINE_HTMLDATAELEMENT_DISPINTERFACE_DECL;
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_TYPE)]
+    BSTR type();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_VALUE), displaybind, bindable]
+    void value(BSTR v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_VALUE), displaybind, bindable]
+    BSTR value();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_NAME), displaybind, bindable]
+    void name(BSTR v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_NAME), displaybind, bindable]
+    BSTR name();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_STATUS)]
+    void status(VARIANT v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_STATUS)]
+    VARIANT status();
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_FORM)]
+    IHTMLFormElement *form();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_DEFAULTVALUE), displaybind, bindable, hidden]
+    void defaultValue(BSTR v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_DEFAULTVALUE), displaybind, bindable, hidden]
+    BSTR defaultValue();
+
+    [id(DISPID_IHTMLTEXTAREAELEMENT_SELECT)]
+    void select();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_ONCHANGE), displaybind, bindable]
+    void onchange(VARIANT v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_ONCHANGE), displaybind, bindable]
+    VARIANT onchange();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_ONSELECT), displaybind, bindable]
+    void onselect(VARIANT v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_ONSELECT), displaybind, bindable]
+    VARIANT onselect();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_READONLY), displaybind, bindable]
+    void readOnly(VARIANT_BOOL v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_READONLY), displaybind, bindable]
+    VARIANT_BOOL readOnly();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_ROWS), displaybind, bindable]
+    void rows(LONG v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_ROWS), displaybind, bindable]
+    LONG rows();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_COLS), displaybind, bindable]
+    void cols(LONG v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_COLS), displaybind, bindable]
+    LONG cols();
+
+    [propput, id(DISPID_IHTMLTEXTAREAELEMENT_WRAP), displaybind, bindable]
+    void wrap(BSTR v);
+
+    [propget, id(DISPID_IHTMLTEXTAREAELEMENT_WRAP), displaybind, bindable]
+    BSTR wrap();
+
+    [id(DISPID_IHTMLTEXTAREAELEMENT_CREATETEXTRANGE)]
+    IHTMLTxtRange *createTextRange();
+}
+
 /*****************************************************************************
  *    DispHTMLUnknownElement interface
  */
@@ -10245,7 +10331,7 @@ interface IHTMLWindow4 : IDispatch
 
     [propget, id(DISPID_IHTMLWINDOW4_FRAMEELEMENT)]
     HRESULT frameElement([retval, out] IHTMLFrameBase* * p);
-};
+}
 
 /*****************************************************************************
  *    IHTMLWindow5 interface
@@ -10263,7 +10349,7 @@ interface IHTMLWindow5 : IDispatch
 
     [propget, id(DISPID_IHTMLWINDOW5_XMLHTTPREQUEST)]
     HRESULT XMLHttpRequest([retval, out] VARIANT * p);
-};
+}
 
 /*****************************************************************************
  *    DispHTMLScreen dispinterface
@@ -10902,7 +10988,7 @@ methods:
 
     [propget, id(DISPID_IHTMLWINDOW5_XMLHTTPREQUEST)]
     VARIANT XMLHttpRequest();
-};
+}
 
 /*****************************************************************************
  *    HTMLWindowEvents interface
@@ -10949,7 +11035,7 @@ methods:
 
     [id(DISPID_HTMLWINDOWEVENTS_ONAFTERPRINT)]
     void onafterprint();
-};
+}
 
 /*****************************************************************************
  *    HTMLWindowEvents2 interface
@@ -10996,7 +11082,7 @@ methods:
 
     [id(DISPID_HTMLWINDOWEVENTS2_ONAFTERPRINT)]
     void onafterprint([in] IHTMLEventObj* pEvtObj);
-};
+}
 
 /*****************************************************************************
  *    HTMLWindowProxy class
@@ -11013,7 +11099,7 @@ coclass HTMLWindowProxy
                         interface IHTMLWindow3;
                         interface IHTMLWindow4;
                         interface IHTMLWindow5;
-};
+}
 
 /*****************************************************************************
  *    HTMLDocumentEvents2 interface
@@ -11473,7 +11559,7 @@ methods:
 
     [id(DISPID_HTMLTEXTCONTAINEREVENTS_ONSELECT)]
     void onselect();
-};
+}
 
 /*****************************************************************************
  *    HTMLTextContainerEvents2 interface
@@ -11677,7 +11763,7 @@ methods:
 
     [id(DISPID_HTMLTEXTCONTAINEREVENTS2_ONSELECT)]
     void onselect([in] IHTMLEventObj* pEvtObj);
-};
+}
 
 /*****************************************************************************
  *    IHTMLDocument interface
@@ -13329,7 +13415,8 @@ methods:
 
     [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL)]
     VARIANT_BOOL onmousewheel([in] IHTMLEventObj* pEvtObj);
-};
+}
+
 [
     hidden,
     uuid(3050f33c-98b5-11cf-bb82-00aa00bdce0b)
@@ -13526,8 +13613,7 @@ methods:
 
     [id(DISPID_HTMLELEMENTEVENTS_ONFOCUSOUT)]
     void onfocusout();
-
-};
+}
 
 [
     noncreatable,
@@ -13943,7 +14029,7 @@ methods:
 
     [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL)]
     VARIANT_BOOL onmousewheel([in] IHTMLEventObj* pEvtObj);
-};
+}
 
 /*****************************************************************************
  *    IHTMLTableCaption interface
@@ -14153,7 +14239,7 @@ interface IHTMLTable2 : IDispatch
     HRESULT moveRow([defaultvalue(-1), in] LONG indexFrom,
         [defaultvalue(-1), in] LONG indexTo,
         [retval, out] IDispatch** row);
-};
+}
 
 [
     odl,
@@ -14168,7 +14254,7 @@ interface IHTMLTable3 : IDispatch
 
     [propget, id(DISPID_IHTMLTABLE3_SUMMARY), displaybind, bindable]
     HRESULT summary([retval, out] BSTR * p);
-};
+}
 
 [
     noncreatable,
@@ -14191,7 +14277,7 @@ coclass HTMLTable
                         interface IHTMLTable;
                         interface IHTMLTable2;
                         interface IHTMLTable3;
-};
+}
 
 [
     odl,
@@ -14626,6 +14712,74 @@ interface IHTMLScriptElement2 : IDispatch
     HRESULT charset([retval, out] BSTR *p);
 }
 
+/*****************************************************************************
+ *    DispHTMLScriptElement dispinterface
+ */
+[
+    hidden,
+    uuid(3050f530-98b5-11cf-bb82-00aa00bdce0b)
+]
+dispinterface DispHTMLScriptElement
+{
+properties:
+methods:
+    WINE_HTMLELEMENT_DISPINTERFACE_DECL;
+
+    [propput, id(DISPID_IHTMLSCRIPTELEMENT_SRC), displaybind, bindable]
+    void src(BSTR v);
+
+    [propget, id(DISPID_IHTMLSCRIPTELEMENT_SRC), displaybind, bindable]
+    BSTR src();
+
+    [propput, id(DISPID_IHTMLSCRIPTELEMENT_HTMLFOR), displaybind, bindable]
+    void htmlFor(BSTR v);
+
+    [propget, id(DISPID_IHTMLSCRIPTELEMENT_HTMLFOR), displaybind, bindable]
+    BSTR htmlFor();
+
+    [propput, id(DISPID_IHTMLSCRIPTELEMENT_EVENT), displaybind, bindable]
+    void event(BSTR v);
+
+    [propget, id(DISPID_IHTMLSCRIPTELEMENT_EVENT), displaybind, bindable]
+    BSTR event();
+
+    [propput, id(DISPID_IHTMLSCRIPTELEMENT_TEXT), displaybind, bindable]
+    void text(BSTR v);
+
+    [propget, id(DISPID_IHTMLSCRIPTELEMENT_TEXT), displaybind, bindable]
+    BSTR text();
+
+    [propput, id(DISPID_IHTMLSCRIPTELEMENT_DEFER), displaybind, bindable]
+    void defer(VARIANT_BOOL v);
+
+    [propget, id(DISPID_IHTMLSCRIPTELEMENT_DEFER), displaybind, bindable]
+    VARIANT_BOOL defer();
+
+    [propput, id(DISPID_IHTMLSCRIPTELEMENT_ONERROR), displaybind, bindable]
+    void onerror(VARIANT v);
+
+    [propget, id(DISPID_IHTMLSCRIPTELEMENT_ONERROR), displaybind, bindable]
+    VARIANT onerror();
+
+    [propput, id(DISPID_IHTMLSCRIPTELEMENT_TYPE), displaybind, bindable]
+    void type(BSTR v);
+
+    [propget, id(DISPID_IHTMLSCRIPTELEMENT_TYPE), displaybind, bindable]
+    BSTR type();
+
+    [propput, id(DISPID_IHTMLSCRIPTELEMENT2_CHARSET), displaybind, bindable]
+    void charset(BSTR v);
+
+    [propget, id(DISPID_IHTMLSCRIPTELEMENT2_CHARSET), displaybind, bindable]
+    BSTR charset();
+
+    [propput, id(DISPID_IHTMLSCRIPTELEMENT3_IE8_SRC)]
+    void ie8_src(BSTR v);
+
+    [propget, id(DISPID_IHTMLSCRIPTELEMENT3_IE8_SRC)]
+    BSTR ie8_src();
+}
+
 /*****************************************************************************
  *    IHTMLFrameBase interface
  */
@@ -14692,6 +14846,61 @@ interface IHTMLFrameBase : IDispatch
     HRESULT scrolling([out, retval] BSTR *p);
 }
 
+#define WINE_IHTMLFRAMEBASE_DISPINTERFACE_DECL          \
+    [propput, id(DISPID_IHTMLFRAMEBASE_SRC)]            \
+    void src(BSTR v);                                   \
+                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE_SRC)]            \
+    BSTR src();                                         \
+                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE_NAME)]           \
+    void name(BSTR v);                                  \
+                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE_NAME)]           \
+    BSTR name();                                        \
+                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE_BORDER)]         \
+    void border(VARIANT v);                             \
+                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE_BORDER)]         \
+    VARIANT border();                                   \
+                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE_FRAMEBORDER)]    \
+    void frameBorder(BSTR v);                           \
+                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE_FRAMEBORDER)]    \
+    BSTR frameBorder();                                 \
+                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE_FRAMESPACING)]   \
+    void frameSpacing(VARIANT v);                       \
+                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE_FRAMESPACING)]   \
+    VARIANT frameSpacing();                             \
+                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE_MARGINWIDTH)]    \
+    void marginWidth(VARIANT v);                        \
+                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE_MARGINWIDTH)]    \
+    VARIANT marginWidth();                              \
+                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE_MARGINHEIGHT)]   \
+    void marginHeight(VARIANT v);                       \
+                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE_MARGINHEIGHT)]   \
+    VARIANT marginHeight();                             \
+                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE_NORESIZE)]       \
+    void noResize(VARIANT_BOOL v);                      \
+                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE_NORESIZE)]       \
+    VARIANT_BOOL noResize();                            \
+                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE_SCROLLING)]      \
+    void scrolling(BSTR v);                             \
+                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE_SCROLLING)]      \
+    BSTR scrolling()
+
 /*****************************************************************************
  *    IHTMLFrameBase2 interface
  */
@@ -14728,93 +14937,164 @@ interface IHTMLFrameBase2 : IDispatch
     HRESULT allowTransparency([retval, out] VARIANT_BOOL *p);
 }
 
+#define WINE_IHTMLFRAMEBASE2_DISPINTERFACE_DECL                         \
+    [propget, id(DISPID_IHTMLFRAMEBASE2_CONTENTWINDOW)]                 \
+    IHTMLWindow2 *contentWindow();                                      \
+                                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE2_ONLOAD), displaybind, bindable] \
+    void onload(VARIANT v);                                             \
+                                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE2_ONLOAD), displaybind, bindable] \
+    VARIANT onload();                                                   \
+                                                                        \
+    [propput, id(DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY)]             \
+    void allowTransparency(VARIANT_BOOL v);                             \
+                                                                        \
+    [propget, id(DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY)]             \
+    VARIANT_BOOL allowTransparency()
+
+#define WINE_IHTMLFRAMEBASE3_DISPINTERFACE_DECL                           \
+    [propput, id(DISPID_IHTMLFRAMEBASE3_LONGDESC), displaybind, bindable] \
+    void longDesc(BSTR v);                                                \
+                                                                          \
+    [propget, id(DISPID_IHTMLFRAMEBASE3_LONGDESC), displaybind, bindable] \
+    BSTR longDesc()
+
+
+#define WINE_HTMLFRAMEBASE_DISPINTERFACE_DECL \
+    WINE_HTMLDATAELEMENT_DISPINTERFACE_DECL;  \
+    WINE_IHTMLFRAMEBASE_DISPINTERFACE_DECL;   \
+    WINE_IHTMLFRAMEBASE2_DISPINTERFACE_DECL;  \
+    WINE_IHTMLFRAMEBASE3_DISPINTERFACE_DECL
+
 /*****************************************************************************
- *    DispHTMLIFrame dispinterface
+ *    IHTMLFrameElement3 interface
  */
 [
-    hidden,
-    uuid(3050f51b-98b5-11cf-bb82-00aa00bdce0b)
+    odl,
+    oleautomation,
+    dual,
+    uuid(3051042d-98b5-11cf-bb82-00aa00bdce0b)
 ]
-dispinterface DispHTMLIFrame
+interface IHTMLFrameElement3 : IDispatch
 {
-properties:
-methods:
-    WINE_HTMLDATAELEMENT_DISPINTERFACE_DECL;
+    [propget, id(DISPID_IHTMLFRAMEELEMENT3_CONTENTDOCUMENT)]
+    HRESULT contentDocument([out, retval] IDispatch **p);
 
-    [propput, id(DISPID_IHTMLFRAMEBASE_SRC)]
-    void src(BSTR v);
+    [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_SRC)]
+    HRESULT src([in] BSTR v);
 
-    [propget, id(DISPID_IHTMLFRAMEBASE_SRC)]
-    BSTR src();
+    [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_SRC)]
+    HRESULT src([out, retval] BSTR *p);
 
-    [propput, id(DISPID_IHTMLFRAMEBASE_NAME)]
-    void name(BSTR v);
+    [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC)]
+    HRESULT longDesc([in] BSTR v);
 
-    [propget, id(DISPID_IHTMLFRAMEBASE_NAME)]
-    BSTR name();
+    [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC)]
+    HRESULT longDesc([out, retval] BSTR *p);
 
-    [propput, id(DISPID_IHTMLFRAMEBASE_BORDER)]
-    void border(VARIANT v);
+    [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER)]
+    HRESULT frameBorder([in] BSTR v);
 
-    [propget, id(DISPID_IHTMLFRAMEBASE_BORDER)]
-    VARIANT border();
+    [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER)]
+    HRESULT frameBorder([out, retval] BSTR * p);
+}
 
-    [propput, id(DISPID_IHTMLFRAMEBASE_FRAMEBORDER)]
-    void frameBorder(BSTR v);
+/*****************************************************************************
+ *    DispHTMLFrameElement dispinterface
+ */
+[
+    hidden,
+    uuid(3050f513-98b5-11cf-bb82-00aa00bdce0b)
+]
+dispinterface DispHTMLFrameElement
+{
+properties:
+methods:
+    WINE_HTMLFRAMEBASE_DISPINTERFACE_DECL;
 
-    [propget, id(DISPID_IHTMLFRAMEBASE_FRAMEBORDER)]
-    BSTR frameBorder();
+    [propput, id(DISPID_IHTMLFRAMEELEMENT_BORDERCOLOR)]
+    void borderColor(VARIANT v);
 
-    [propput, id(DISPID_IHTMLFRAMEBASE_FRAMESPACING)]
-    void frameSpacing(VARIANT v);
+    [propget, id(DISPID_IHTMLFRAMEELEMENT_BORDERCOLOR)]
+    VARIANT borderColor();
 
-    [propget, id(DISPID_IHTMLFRAMEBASE_FRAMESPACING)]
-    VARIANT frameSpacing();
+    [propput, id(DISPID_IHTMLFRAMEELEMENT2_HEIGHT)]
+    void height(VARIANT v);
 
-    [propput, id(DISPID_IHTMLFRAMEBASE_MARGINWIDTH)]
-    void marginWidth(VARIANT v);
+    [propget, id(DISPID_IHTMLFRAMEELEMENT2_HEIGHT)]
+    VARIANT height();
 
-    [propget, id(DISPID_IHTMLFRAMEBASE_MARGINWIDTH)]
-    VARIANT marginWidth();
+    [propput, id(DISPID_IHTMLFRAMEELEMENT2_WIDTH)]
+    void width(VARIANT v);
 
-    [propput, id(DISPID_IHTMLFRAMEBASE_MARGINHEIGHT)]
-    void marginHeight(VARIANT v);
+    [propget, id(DISPID_IHTMLFRAMEELEMENT2_WIDTH)]
+    VARIANT width();
 
-    [propget, id(DISPID_IHTMLFRAMEBASE_MARGINHEIGHT)]
-    VARIANT marginHeight();
+    [propget, id(DISPID_IHTMLFRAMEELEMENT3_CONTENTDOCUMENT)]
+    IDispatch *contentDocument();
 
-    [propput, id(DISPID_IHTMLFRAMEBASE_NORESIZE)]
-    void noResize(VARIANT_BOOL v);
+    [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_SRC)]
+    void ie8_src(BSTR v);
 
-    [propget, id(DISPID_IHTMLFRAMEBASE_NORESIZE)]
-    VARIANT_BOOL noResize();
+    [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_SRC)]
+    BSTR ie8_src();
 
-    [propput, id(DISPID_IHTMLFRAMEBASE_SCROLLING)]
-    void scrolling(BSTR v);
+    [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC)]
+    void ie8_longDesc(BSTR v);
 
-    [propget, id(DISPID_IHTMLFRAMEBASE_SCROLLING)]
-    BSTR scrolling();
+    [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC)]
+    BSTR ie8_longDesc();
 
-    [propget, id(DISPID_IHTMLFRAMEBASE2_CONTENTWINDOW)]
-    IHTMLWindow2 *contentWindow();
+    [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER)]
+    void ie8_frameBorder(BSTR v);
 
-    [propput, id(DISPID_IHTMLFRAMEBASE2_ONLOAD), displaybind, bindable]
-    void onload(VARIANT v);
+    [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER)]
+    BSTR ie8_frameBorder();
+}
 
-    [propget, id(DISPID_IHTMLFRAMEBASE2_ONLOAD), displaybind, bindable]
-    VARIANT onload();
+/*****************************************************************************
+ *    IHTMLIFrameElement interface
+ */
+[
+    odl,
+    oleautomation,
+    dual,
+    uuid(3050f315-98b5-11cf-bb82-00aa00bdce0b)
+]
+interface IHTMLIFrameElement : IDispatch
+{
+    [propput, id(DISPID_IHTMLIFRAMEELEMENT_VSPACE)]
+    HRESULT vspace([in] LONG v);
 
-    [propput, id(DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY)]
-    void allowTransparency(VARIANT_BOOL v);
+    [propget, id(DISPID_IHTMLIFRAMEELEMENT_VSPACE)]
+    HRESULT vspace([retval, out] LONG *p);
 
-    [propget, id(DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY)]
-    VARIANT_BOOL allowTransparency();
+    [propput, id(DISPID_IHTMLIFRAMEELEMENT_HSPACE)]
+    HRESULT hspace([in] LONG v);
 
-    [propput, id(DISPID_IHTMLFRAMEBASE3_LONGDESC), displaybind, bindable]
-    void longDesc(BSTR v);
+    [propget, id(DISPID_IHTMLIFRAMEELEMENT_HSPACE)]
+    HRESULT hspace([retval, out] LONG *p);
 
-    [propget, id(DISPID_IHTMLFRAMEBASE3_LONGDESC), displaybind, bindable]
-    BSTR longDesc();
+    [propput, id(DISPID_IHTMLIFRAMEELEMENT_ALIGN), displaybind, bindable]
+    HRESULT align([in] BSTR v);
+
+    [propget, id(DISPID_IHTMLIFRAMEELEMENT_ALIGN), displaybind, bindable]
+    HRESULT align([retval, out] BSTR *p);
+}
+
+/*****************************************************************************
+ *    DispHTMLIFrame dispinterface
+ */
+[
+    hidden,
+    uuid(3050f51b-98b5-11cf-bb82-00aa00bdce0b)
+]
+dispinterface DispHTMLIFrame
+{
+properties:
+methods:
+    WINE_HTMLFRAMEBASE_DISPINTERFACE_DECL;
 
     [propput, id(DISPID_IHTMLIFRAMEELEMENT_VSPACE)]
     void vspace(LONG v);
@@ -15127,3 +15407,23 @@ interface IElementBehaviorFactory : IUnknown
 }
 
 } /* library MSHTML */
+
+interface IOleCommandTarget;
+
+/*****************************************************************************
+ *    IHTMLPrivateWindow interface
+ */
+[
+    object,
+    uuid(3050f6dc-98b5-11cf-bb82-00aa00bdce0b),
+    local
+]
+interface IHTMLPrivateWindow : IUnknown
+{
+    HRESULT SuperNavigate(BSTR url, BSTR arg2, BSTR arg3, BSTR arg4, VARIANT *post_data, VARIANT *headers, ULONG flags);
+    HRESULT GetPendingUrl(BSTR *url);
+    HRESULT SetPICSTarget(IOleCommandTarget *cmdtrg);
+    HRESULT PICSComplete(int arg);
+    HRESULT FindWindowByName(LPCWSTR name, IHTMLWindow2 **ret);
+    HRESULT GetAddressBarUrl(BSTR *url);
+}
index 2c0a37f..b331057 100644 (file)
@@ -503,6 +503,10 @@ UINT WINAPI MsiGetPatchInfoExA(LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPCSTR
 UINT WINAPI MsiGetPatchInfoExW(LPCWSTR, LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, LPCWSTR, LPWSTR, LPDWORD);
 #define     MsiGetPatchInfoEx WINELIB_NAME_AW(MsiGetPatchInfoEx)
 
+UINT WINAPI MsiGetPatchInfoA(LPCSTR, LPCSTR, LPSTR, LPDWORD);
+UINT WINAPI MsiGetPatchInfoW(LPCWSTR, LPCWSTR, LPWSTR, LPDWORD);
+#define     MsiGetPatchInfo WINELIB_NAME_AW(MsiGetPatchInfo)
+
 UINT WINAPI MsiEnableLogA(DWORD, LPCSTR, DWORD);
 UINT WINAPI MsiEnableLogW(DWORD, LPCWSTR, DWORD);
 #define     MsiEnableLog WINELIB_NAME_AW(MsiEnableLog)
@@ -597,6 +601,10 @@ UINT WINAPI MsiSourceListEnumSourcesA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD,
 UINT WINAPI MsiSourceListEnumSourcesW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPWSTR, LPDWORD);
 #define     MsiSourceListEnumSources WINELIB_NAME_AW(MsiSourceListEnumSources)
 
+UINT WINAPI MsiSourceListClearSourceA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR);
+UINT WINAPI MsiSourceListClearSourceW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, LPCWSTR);
+#define     MsiSourceListClearSource WINELIB_NAME_AW(MsiSourceListClearSource)
+
 UINT WINAPI MsiSourceListClearAllA(LPCSTR, LPCSTR, DWORD);
 UINT WINAPI MsiSourceListClearAllW(LPCWSTR, LPCWSTR, DWORD);
 #define     MsiSourceListClearAll WINELIB_NAME_AW(MsiSourceListClearAll)
index d87569f..a3b487c 100644 (file)
@@ -222,6 +222,15 @@ enum msidbRemoveFileInstallMode
     msidbRemoveFileInstallModeOnBoth = 0x00000003,
 };
 
+enum
+{
+    msidbIniFileActionAddLine    = 0x00000000,
+    msidbIniFileActionCreateLine = 0x00000001,
+    msidbIniFileActionRemoveLine = 0x00000002,
+    msidbIniFileActionAddTag     = 0x00000003,
+    msidbIniFileActionRemoveTag  = 0x00000004
+};
+
 /*
  * Windows SDK braindamage alert
  *
index e6f07b3..8991400 100644 (file)
@@ -1070,6 +1070,14 @@ coclass DOMDocument30
     [default, source] dispinterface XMLDOMDocumentEvents;
 }
 
+[
+    uuid(88d969c0-f192-11d4-a65f-0040963251e5)
+]
+coclass DOMDocument40
+{
+    [default] interface IXMLDOMDocument2;
+    [default, source] dispinterface XMLDOMDocumentEvents;
+}
 
 [
     uuid(F6D90F12-9C73-11D3-B32E-00C04F990BB4)
@@ -1971,6 +1979,15 @@ coclass SAXXMLReader30
     interface IMXReaderControl;
 };
 
+[
+    uuid(7c6e29bc-8b8b-4c3d-859e-af6cd158be0f)
+]
+coclass SAXXMLReader40
+{
+    [default] interface IVBSAXXMLReader;
+    interface ISAXXMLReader;
+};
+
 [
     uuid(fc220ad8-a72a-4ee8-926e-0b7ad152a020)
 ]
similarity index 94%
rename from reactos/include/ddk/ntddkbd.h
rename to reactos/include/psdk/ntddkbd.h
index eb96245..2f06bcf 100644 (file)
@@ -63,6 +63,13 @@ DEFINE_GUID(GUID_DEVINTERFACE_KEYBOARD, \
 #define KEY_E0                            2
 #define KEY_E1                            4
 
+#define KEYBOARD_LED_INJECTED     0x8000
+#define KEYBOARD_SHADOW           0x4000
+#define KEYBOARD_KANA_LOCK_ON     8
+#define KEYBOARD_CAPS_LOCK_ON     4
+#define KEYBOARD_NUM_LOCK_ON      2
+#define KEYBOARD_SCROLL_LOCK_ON   1
+
 typedef struct _KEYBOARD_INPUT_DATA {
   USHORT  UnitId;
   USHORT  MakeCode;
similarity index 93%
rename from reactos/include/ddk/ntdef.h
rename to reactos/include/psdk/ntdef.h
index 49772bf..a0aae3e 100644 (file)
 #include <stdarg.h>
 #include <string.h>
 
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
 
 typedef unsigned long POINTER_64; // FIXME! HACK!!!
 
@@ -79,22 +87,33 @@ typedef unsigned long POINTER_64; // FIXME! HACK!!!
 #endif
 #endif // NULL
 
+typedef enum _EVENT_TYPE {
+  NotificationEvent,
+  SynchronizationEvent
+} EVENT_TYPE;
+
+typedef enum _TIMER_TYPE {
+    NotificationTimer,
+    SynchronizationTimer
+} TIMER_TYPE;
+
+typedef enum _WAIT_TYPE {
+  WaitAll,
+  WaitAny
+} WAIT_TYPE;
 
 //
 // FIXME
 // We should use the -fms-extensions compiler flag for gcc,
 // and clean up the mess.
 //
+#ifndef __ANONYMOUS_DEFINED
+#define __ANONYMOUS_DEFINED
+
 #ifndef NONAMELESSUNION
 #ifdef __GNUC__
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
-#define _ANONYMOUS_UNION __extension__
-#define _ANONYMOUS_STRUCT __extension__
-#else
-#if defined(__cplusplus)
-#define _ANONYMOUS_UNION __extension__
-#endif /* __cplusplus */
-#endif /* __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) */
+#define _ANONYMOUS_UNION __GNU_EXTENSION
+#define _ANONYMOUS_STRUCT __GNU_EXTENSION
 #elif defined(__WATCOMC__) || defined(_MSC_VER)
 #define _ANONYMOUS_UNION
 #define _ANONYMOUS_STRUCT
@@ -130,20 +149,28 @@ typedef unsigned long POINTER_64; // FIXME! HACK!!!
 #define DUMMYSTRUCTNAME s
 #define DUMMYSTRUCTNAME2 s2
 #define DUMMYSTRUCTNAME3 s3
+#define DUMMYSTRUCTNAME4 s4
+#define DUMMYSTRUCTNAME5 s5
 #else
 #define _STRUCT_NAME(x)
 #define DUMMYSTRUCTNAME
 #define DUMMYSTRUCTNAME2
 #define DUMMYSTRUCTNAME3
+#define DUMMYSTRUCTNAME4
+#define DUMMYSTRUCTNAME5
 #endif
 
-
+#endif /* __ANONYMOUS_DEFINED */
 
 // FIXME
 #undef UNALIGNED
 #define UNALIGNED
 #define RESTRICTED_POINTER
 
+
+#define ARGUMENT_PRESENT(ArgumentPointer) \
+  ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL)
+
 //
 // Returns the base address of a structure from a structure member
 //
@@ -332,7 +359,7 @@ typedef struct _QUAD
 {
     _ANONYMOUS_UNION union
     {
-        __int64 UseThisFieldToCopy;
+        __GNU_EXTENSION __int64 UseThisFieldToCopy;
         double DoNotUseThisField;
     };
 } QUAD, *PQUAD, UQUAD, *PUQUAD;
@@ -354,6 +381,9 @@ typedef ULONG FLONG;
 typedef UCHAR BOOLEAN;
 typedef BOOLEAN *PBOOLEAN;
 
+typedef ULONG LOGICAL;
+typedef ULONG *PLOGICAL;
+
 //
 // Signed Types
 //
@@ -374,8 +404,8 @@ typedef LONG HRESULT;
 //
 // 64-bit types
 //
-typedef __int64 LONGLONG, *PLONGLONG;
-typedef unsigned __int64 ULONGLONG, *PULONGLONG;
+__GNU_EXTENSION typedef __int64 LONGLONG, *PLONGLONG;
+__GNU_EXTENSION typedef unsigned __int64 ULONGLONG, *PULONGLONG;
 typedef ULONGLONG DWORDLONG, *PDWORDLONG;
 
 //
@@ -644,6 +674,19 @@ typedef struct _SINGLE_LIST_ENTRY {
 } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
 
 
+typedef struct _PROCESSOR_NUMBER {
+  USHORT Group;
+  UCHAR Number;
+  UCHAR Reserved;
+} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER;
+
+typedef EXCEPTION_DISPOSITION
+(DDKAPI *PEXCEPTION_ROUTINE)(
+  IN struct _EXCEPTION_RECORD *ExceptionRecord,
+  IN PVOID EstablisherFrame,
+  IN OUT struct _CONTEXT *ContextRecord,
+  IN OUT PVOID DispatcherContext);
+
 
 //
 // Helper Macros
index e54fb1c..70f93ab 100644 (file)
@@ -907,7 +907,7 @@ interface IStorage : IUnknown
   [call_as(OpenStream)]
   HRESULT RemoteOpenStream(
     [in] LPCOLESTR pwcsName,
-    [in] ULONG cbReserved1,
+    [in] unsigned long cbReserved1,
     [in, unique, size_is(cbReserved1)] byte *reserved1,
     [in] DWORD grfMode,
     [in] DWORD reserved2,
@@ -955,7 +955,7 @@ interface IStorage : IUnknown
   [call_as(EnumElements)]
   HRESULT RemoteEnumElements(
     [in] DWORD reserved1,
-    [in] ULONG cbReserved2,
+    [in] unsigned long cbReserved2,
     [in, unique, size_is(cbReserved2)] byte *reserved2,
     [in] DWORD reserved3,
     [out] IEnumSTATSTG **ppenum);
@@ -1950,6 +1950,9 @@ interface IClientSecurity : IUnknown
     void *pAuthInfo;
   } SOLE_AUTHENTICATION_INFO;
 
+  const OLECHAR *COLE_DEFAULT_PRINCIPAL = (OLECHAR*) -1;
+  const void *COLE_DEFAULT_AUTHINFO = (void*) -1;
+
   typedef struct tagSOLE_AUTHENTICATION_LIST {
     DWORD cAuthInfo;
     SOLE_AUTHENTICATION_INFO *aAuthInfo;
index dd6b218..127df2b 100644 (file)
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
+cpp_quote("#ifdef _WIN64")
+cpp_quote("#include <pshpack8.h>")
+cpp_quote("#else")
+cpp_quote("#include <pshpack2.h>")
+cpp_quote("#endif")
+cpp_quote("")
 
 import "wtypes.idl";
 import "oaidl.idl";
 import "ocidl.idl";
 import "propidl.idl";
+import "urlmon.idl";
 
 typedef ULONG DBBYTEOFFSET;
+typedef LONG  DBROWOFFSET;
+typedef LONG  DBROWCOUNT;
+typedef ULONG DBCOUNTITEM;
+typedef ULONG DBLENGTH;
+typedef ULONG DBORDINAL;
+typedef ULONG DBBKMARK;
+typedef DWORD DB_DWRESERVE;
+typedef ULONG DBREFCOUNT;
+typedef ULONG DB_UPARAMS;
+typedef LONG  DB_LPARAMS;
+typedef DWORD DBHASHVALUE;
 
-#include "dbinit.idl"
 #include "dbs.idl"
+
+#include "access.idl"
+#include "rstbas.idl"
+#include "rstinf.idl"
+#include "rstloc.idl"
+#include "cmdbas.idl"
+#include "cmdtxt.idl"
+#include "dbccmd.idl"
+#include "dbcses.idl"
 #include "dbprop.idl"
+#include "dbinit.idl"
+#include "dbdsad.idl"
+#include "asynot.idl"
+#include "asysta.idl"
+#include "sesprp.idl"
+#include "opnrst.idl"
+#include "row.idl"
+#include "rowchg.idl"
+#include "binres.idl"
+#include "crtrow.idl"
+
+cpp_quote("#include <poppack.h>")
+cpp_quote("")
diff --git a/reactos/include/psdk/opnrst.idl b/reactos/include/psdk/opnrst.idl
new file mode 100644 (file)
index 0000000..e6b5237
--- /dev/null
@@ -0,0 +1,47 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a69-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IOpenRowset : IUnknown\r
+{\r
+    [local]\r
+    HRESULT OpenRowset([in] IUnknown *pUnkOuter,\r
+                       [in, unique] DBID *pTableID,\r
+                       [in, unique] DBID *pIndexID,\r
+                       [in] REFIID riid,\r
+                       [in] ULONG cPropertySets,\r
+                       [in, out, size_is(cPropertySets)] DBPROPSET rgPropertySets[],\r
+                       [out, iid_is(riid)] IUnknown **ppRowset);\r
+\r
+    [call_as(OpenRowset)]\r
+    HRESULT RemoteOpenRowset([in] IUnknown *pUnkOuter,\r
+                             [in, unique] DBID *pTableID,\r
+                             [in, unique] DBID *pIndexID,\r
+                             [in] REFIID riid,\r
+                             [in] ULONG cPropertySets,\r
+                             [in, unique, size_is(cPropertySets)] DBPROPSET *rgPropertySets,\r
+                             [in, out, unique, iid_is(riid)] IUnknown **ppRowset,\r
+                             [in] ULONG cTotalProps,\r
+                             [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus,\r
+                             [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+}\r
index d79241b..7f3d334 100644 (file)
@@ -37,6 +37,10 @@ typedef HANDLE PDH_HQUERY;
 typedef HANDLE PDH_HCOUNTER;
 typedef HANDLE PDH_HLOG;
 
+#define PDH_CVERSION_WIN40  0x0400
+#define PDH_CVERSION_WIN50  0x0500
+#define PDH_VERSION         0x0503
+
 #define PDH_MAX_SCALE 7
 #define PDH_MIN_SCALE (-7)
 
@@ -49,6 +53,10 @@ typedef HANDLE PDH_HLOG;
 #define PDH_FMT_1000        0x00002000
 #define PDH_FMT_NOCAP100    0x00008000
 
+#define DATA_SOURCE_REGISTRY    0x00000001
+#define DATA_SOURCE_LOGFILE     0x00000002
+#define DATA_SOURCE_WBEM        0x00000004
+
 typedef struct _PDH_FMT_COUNTERVALUE
 {
     DWORD CStatus;
@@ -182,6 +190,7 @@ PDH_STATUS WINAPI PdhGetCounterInfoA(PDH_HCOUNTER, BOOLEAN, LPDWORD, PPDH_COUNTE
 PDH_STATUS WINAPI PdhGetCounterInfoW(PDH_HCOUNTER, BOOLEAN, LPDWORD, PPDH_COUNTER_INFO_W);
 #define    PdhGetCounterInfo WINELIB_NAME_AW(PdhGetCounterInfo)
 PDH_STATUS WINAPI PdhGetCounterTimeBase(PDH_HCOUNTER, LONGLONG *);
+PDH_STATUS WINAPI PdhGetDllVersion(LPDWORD);
 PDH_STATUS WINAPI PdhGetFormattedCounterValue(PDH_HCOUNTER, DWORD, LPDWORD, PPDH_FMT_COUNTERVALUE);
 PDH_STATUS WINAPI PdhGetRawCounterValue(PDH_HCOUNTER, LPDWORD, PPDH_RAW_COUNTER);
 PDH_STATUS WINAPI PdhLookupPerfIndexByNameA(LPCSTR, LPCSTR, LPDWORD);
@@ -198,6 +207,7 @@ PDH_STATUS WINAPI PdhOpenQueryW(LPCWSTR, DWORD_PTR, PDH_HQUERY *);
 #define    PdhOpenQuery WINELIB_NAME_AW(PdhOpenQuery)
 PDH_STATUS WINAPI PdhRemoveCounter(PDH_HCOUNTER);
 PDH_STATUS WINAPI PdhSetCounterScaleFactor(PDH_HCOUNTER, LONG);
+PDH_STATUS WINAPI PdhSetDefaultRealTimeDataSource(DWORD);
 PDH_STATUS WINAPI PdhValidatePathA(LPCSTR);
 PDH_STATUS WINAPI PdhValidatePathW(LPCWSTR);
 #define    PdhValidatePath WINELIB_NAME_AW(PdhValidatePath)
index be67394..e2da625 100644 (file)
@@ -206,7 +206,17 @@ interface IPropertyStorage : IUnknown
 
   typedef struct tagPROPVARIANT *LPPROPVARIANT;
 
-  cpp_quote("#define REFPROPVARIANT const PROPVARIANT *")
+  cpp_quote("#if 0")
+  typedef const PROPVARIANT * REFPROPVARIANT;
+  cpp_quote("#endif")
+  cpp_quote("#ifndef _REFPROPVARIANT_DEFINED")
+  cpp_quote("#define _REFPROPVARIANT_DEFINED")
+  cpp_quote("#ifdef __cplusplus")
+  cpp_quote("#define REFPROPVARIANT const PROPVARIANT &")
+  cpp_quote("#else")
+  cpp_quote("#define REFPROPVARIANT const PROPVARIANT * __MIDL_CONST")
+  cpp_quote("#endif")
+  cpp_quote("#endif")
 
   cpp_quote("#define PIDDI_THUMBNAIL 0x00000002L /* VT_BLOB */")
   cpp_quote("")
index 3be7924..02256eb 100644 (file)
@@ -1,13 +1,16 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
+<group>
 <module name="psdk" type="idlheader">
        <file>activaut.idl</file>
        <file>activdbg.idl</file>
        <file>activscp.idl</file>
+       <file>bdaiface.idl</file>
        <file>bits1_5.idl</file>
        <file>bits.idl</file>
        <file>commoncontrols.idl</file>
        <file>control.idl</file>
+       <file>ctfutb.idl</file>
        <file>ctxtcall.idl</file>
        <file>dimm.idl</file>
        <file>dispex.idl</file>
@@ -49,6 +52,7 @@
        <file>shtypes.idl</file>
        <file>strmif.idl</file>
        <file>textstor.idl</file>
+       <file>tuner.idl</file>
        <file>tom.idl</file>
        <file>unknwn.idl</file>
        <file>urlhist.idl</file>
@@ -63,7 +67,9 @@
        <file>comcat.idl</file>
        <file>xmldso.idl</file>
        <file>xmldom.idl</file>
+       <file>xmllite.idl</file>
 </module>
 <module name="stdole2" type="embeddedtypelib">
        <file>stdole2.idl</file>
-</module>
\ No newline at end of file
+</module>
+</group>
\ No newline at end of file
index 62ce00b..590b905 100644 (file)
@@ -34,6 +34,18 @@ typedef DWORD PST_KEY;
 typedef DWORD PST_PROVIDERCAPABILITIES;
 typedef GUID PST_PROVIDERID, *PPST_PROVIDERID;
 
+/*****************************************************************************
+ * PSTOREC library
+ */
+[
+    uuid(5a6f1ebd-2db1-11d0-8c39-00c04fd9126b),
+    version(1.0),
+    helpstring("PStore 1.0 Type Library")
+]
+library PSTORECLib
+{
+    importlib("stdole2.tlb");
+
 typedef struct _PST_PROVIDERINFO
 {
     DWORD cbSize;
@@ -50,27 +62,27 @@ typedef struct _PST_PROMPTINFO
     LPCWSTR szPrompt;
 } PST_PROMPTINFO, *PPST_PROMPTINFO;
 
-typedef struct {
+typedef struct _PST_ACCESSCLAUSE {
     DWORD cbSize;
     PST_ACCESSCLAUSETYPE ClauseType;
     DWORD cbClauseData;
     BYTE* pbClauseData;
 } PST_ACCESSCLAUSE, *PPST_ACCESSCLAUSE;
 
-typedef struct {
+typedef struct _PST_ACCESSRULE {
     DWORD cbSize;
     PST_ACCESSMODE AccessModeFlags;
     DWORD cClauses;
     PST_ACCESSCLAUSE* rgClauses;
 } PST_ACCESSRULE, *PPST_ACCESSRULE;
 
-typedef struct {
+typedef struct _PST_ACCESSRULESET {
     DWORD cbSize;
     DWORD cClause;
     PST_ACCESSRULE* rgRules;
 } PST_ACCESSRULESET, *PPST_ACCESSRULESET;
 
-typedef struct {
+typedef struct _PST_TYPEINFO {
     DWORD cbSize;
     LPWSTR szDisplayName;
 } PST_TYPEINFO, *PPST_TYPEINFO;
@@ -259,3 +271,5 @@ interface IPStore : IUnknown
         [in] DWORD dwFlags,
         [in] IEnumPStoreItems** ppenum );
 }
+
+};
diff --git a/reactos/include/psdk/row.idl b/reactos/include/psdk/row.idl
new file mode 100644 (file)
index 0000000..59df279
--- /dev/null
@@ -0,0 +1,42 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    local,\r
+    object,\r
+    uuid(0c733ab4-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IRow : IUnknown\r
+{\r
+    [local]\r
+    HRESULT GetColumns([in] DBORDINAL cColumns,\r
+                       [in, out, size_is(cColumns), annotation("__inout_ecount(cColumns)")] DBCOLUMNACCESS rgColumns[]);\r
+\r
+\r
+    HRESULT GetSourceRowset([in, annotation("__in")] REFIID riid,\r
+                            [out, iid_is(riid), annotation("__deref_opt_out_opt")] IUnknown **ppRowset,\r
+                            [out, annotation("__out_opt")] HROW *phRow);\r
+\r
+   HRESULT Open([in, unique, annotation("__in_opt")] IUnknown *pUnkOuter,\r
+                [in, annotation("__in")] DBID *pColumnID,\r
+                [in, annotation("__in")] REFGUID rguidColumnType,\r
+                [in] DWORD dwBindFlags,\r
+                [in, annotation("__in")] REFIID riid,\r
+                [out, iid_is(riid), annotation("__deref_opt_out")] IUnknown **ppUnk);\r
+}\r
diff --git a/reactos/include/psdk/rowchg.idl b/reactos/include/psdk/rowchg.idl
new file mode 100644 (file)
index 0000000..86c7ad4
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    local,\r
+    object,\r
+    uuid(0c733ab5-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IRowChange : IUnknown\r
+{\r
+    [local]\r
+    HRESULT SetColumns([in] DBORDINAL  cColumns,\r
+                       [in, out, size_is(cColumns), annotation("__in_ecount(cColumns)")] DBCOLUMNACCESS rgColumns[]);\r
+}\r
index 9486a35..439f164 100644 (file)
@@ -108,6 +108,11 @@ typedef I_RPC_HANDLE *RPC_EP_INQ_HANDLE;
 #define RPC_C_LISTEN_MAX_CALLS_DEFAULT 1234
 #define RPC_C_PROTSEQ_MAX_REQS_DEFAULT 10
 
+#define RPC_PROTSEQ_TCP     0x1
+#define RPC_PROTSEQ_NMP     0x2
+#define RPC_PROTSEQ_LRPC    0x3
+#define RPC_PROTSEQ_HTTP    0x4
+
 /* RPC_POLICY EndpointFlags */
 #define RPC_C_BIND_TO_ALL_NICS          0x1
 #define RPC_C_USE_INTERNET_PORT         0x1
@@ -158,8 +163,8 @@ typedef I_RPC_HANDLE *RPC_EP_INQ_HANDLE;
 #define RPC_C_IMP_LEVEL_DELEGATE    4
 
 /* values for RPC_SECURITY_QOS*::IdentityTracking */
-#define RPC_C_QOS_IDENTIFY_STATIC   0
-#define RPC_C_QOS_IDENTIFY_DYNAMIC  1
+#define RPC_C_QOS_IDENTITY_STATIC   0
+#define RPC_C_QOS_IDENTITY_DYNAMIC  1
 
 /* flags for RPC_SECURITY_QOS*::Capabilities */
 #define RPC_C_QOS_CAPABILITIES_DEFAULT          0x0
@@ -190,7 +195,7 @@ typedef I_RPC_HANDLE *RPC_EP_INQ_HANDLE;
 #define RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE   0x10
 
 typedef RPC_STATUS RPC_ENTRY RPC_IF_CALLBACK_FN( RPC_IF_HANDLE InterfaceUuid, void *Context );
-typedef void (__RPC_USER *RPC_AUTH_KEY_RETRIEVAL_FN)( void *Arg, unsigned char *ServerPrincName, unsigned long KeyVer, void **Key, RPC_STATUS *Status );
+typedef void (__RPC_USER *RPC_AUTH_KEY_RETRIEVAL_FN)(void *, RPC_WSTR, ULONG, void **, RPC_STATUS *);
 
 typedef struct _RPC_POLICY
 {
@@ -504,6 +509,28 @@ RPCRTAPI RPC_STATUS RPC_ENTRY
                           ULONG *AuthnSvc, RPC_AUTH_IDENTITY_HANDLE *AuthIdentity, ULONG *AuthzSvc );
 #define RpcBindingInqAuthInfo WINELIB_NAME_AW(RpcBindingInqAuthInfo)
 
+RPCRTAPI RPC_STATUS RPC_ENTRY
+  RpcBindingInqAuthClientA( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *Privs,
+                            RPC_CSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc,
+                            ULONG *AuthzSvc );
+
+RPCRTAPI RPC_STATUS RPC_ENTRY
+  RpcBindingInqAuthClientW( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *Privs,
+                            RPC_WSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc,
+                            ULONG *AuthzSvc );
+#define RpcBindingInqAuthClient WINELIB_NAME_AW(RpcBindingInqAuthClient)
+
+RPCRTAPI RPC_STATUS RPC_ENTRY
+  RpcBindingInqAuthClientExA( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *Privs,
+                              RPC_CSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc,
+                              ULONG *AuthzSvc, ULONG Flags );
+
+RPCRTAPI RPC_STATUS RPC_ENTRY
+  RpcBindingInqAuthClientExW( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *Privs,
+                              RPC_WSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc,
+                              ULONG *AuthzSvc, ULONG Flags );
+#define RpcBindingInqAuthClientEx WINELIB_NAME_AW(RpcBindingInqAuthClientEx)
+
 RPCRTAPI RPC_STATUS RPC_ENTRY RpcCancelThread(void*);
 RPCRTAPI RPC_STATUS RPC_ENTRY RpcCancelThreadEx(void*,LONG);
 
index 9d0df1a..9691dba 100644 (file)
@@ -104,8 +104,8 @@ extern "C" {
 
 #define small char
 typedef unsigned char byte;
-#define hyper __int64
-#define MIDL_uhyper unsigned __int64
+typedef INT64 hyper;
+typedef UINT64 MIDL_uhyper;
 typedef unsigned char boolean;
 
 #define __RPC_CALLEE WINAPI
@@ -128,7 +128,7 @@ typedef unsigned char boolean;
    (RpcExceptionCode() == RPC_X_BAD_STUB_DATA) || \
    (RpcExceptionCode() == RPC_S_INVALID_BOUND))
 
-typedef struct _NDR_SCONTEXT
+typedef struct
 {
   void *pad[2];
   void *userContext;
@@ -211,19 +211,19 @@ typedef struct _MIDL_STUB_MESSAGE
   struct _FULL_PTR_XLAT_TABLES *FullPtrXlatTables;
   ULONG FullPtrRefId;
   ULONG PointerLength;
-  int fInDontFree:1;
-  int fDontCallFreeInst:1;
-  int fInOnlyParam:1;
-  int fHasReturn:1;
-  int fHasExtensions:1;
-  int fHasNewCorrDesc:1;
-  int fIsIn:1;
-  int fIsOut:1;
-  int fIsOicf:1;
-  int fBufferValid:1;
-  int fHasMemoryValidateCallback:1;
-  int fInFree:1;
-  int fNeedMCCP:1;
+  unsigned int fInDontFree:1;
+  unsigned int fDontCallFreeInst:1;
+  unsigned int fInOnlyParam:1;
+  unsigned int fHasReturn:1;
+  unsigned int fHasExtensions:1;
+  unsigned int fHasNewCorrDesc:1;
+  unsigned int fIsIn:1;
+  unsigned int fIsOut:1;
+  unsigned int fIsOicf:1;
+  unsigned int fBufferValid:1;
+  unsigned int fHasMemoryValidateCallback:1;
+  unsigned int fInFree:1;
+  unsigned int fNeedMCCP:1;
   int fUnused:3;
   int fUnused2:16;
   DWORD dwDestContext;
@@ -390,7 +390,11 @@ typedef struct _MIDL_SYNTAX_INFO
 
 typedef void (__RPC_API *STUB_THUNK)( PMIDL_STUB_MESSAGE );
 
+#ifdef WINE_STRICT_PROTOTYPES
+typedef LONG (__RPC_API *SERVER_ROUTINE)(void);
+#else
 typedef LONG (__RPC_API *SERVER_ROUTINE)();
+#endif
 
 typedef struct _MIDL_SERVER_INFO_
 {
diff --git a/reactos/include/psdk/rstbas.idl b/reactos/include/psdk/rstbas.idl
new file mode 100644 (file)
index 0000000..d7859ed
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    local,\r
+    object,\r
+    uuid(0c733a7c-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IRowset : IUnknown\r
+{\r
+    typedef DWORD DBROWOPTIONS;\r
+\r
+    HRESULT AddRefRows([in] DBCOUNTITEM cRows,\r
+                       [in, size_is(cRows)] const HROW rghRows[],\r
+                       [out, size_is(cRows)] DBREFCOUNT rgRefCounts[],\r
+                       [out, size_is(cRows)] DBROWSTATUS rgRowStatus[]);\r
+\r
+    HRESULT GetData([in] HROW hRow,\r
+                    [in] HACCESSOR hAccessor,\r
+                    [out] void *pData);\r
+\r
+    HRESULT GetNextRows([in] HCHAPTER hReserved,\r
+                        [in] DBROWOFFSET lRowsOffset,\r
+                        [in] DBROWCOUNT cRows,\r
+                        [out] DBCOUNTITEM *pcRowObtained,\r
+                        [out, size_is(,cRows)] HROW **prghRows);\r
+\r
+    HRESULT ReleaseRows([in] DBCOUNTITEM cRows,\r
+                        [in, size_is(cRows)] const HROW rghRows[],\r
+                        [in, size_is(cRows)] DBROWOPTIONS rgRowOptions[],\r
+                        [out, size_is(cRows)] DBREFCOUNT rgRefCounts[],\r
+                        [out, size_is(cRows)] DBROWSTATUS rgRowStatus[]);\r
+\r
+    HRESULT RestartPosition([in] HCHAPTER hReserved);\r
+}\r
diff --git a/reactos/include/psdk/rstinf.idl b/reactos/include/psdk/rstinf.idl
new file mode 100644 (file)
index 0000000..16d2693
--- /dev/null
@@ -0,0 +1,58 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a55-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IRowsetInfo : IUnknown\r
+{\r
+    [local]\r
+    HRESULT GetProperties([in] const ULONG cPropertyIDSets,\r
+                          [in, size_is(cPropertyIDSets), annotation("__in_ecount_opt(cPropertyIDSets)")] const DBPROPIDSET rgPropertyIDSets[],\r
+                          [in, out, annotation("__out")] ULONG *pcPropertySets,\r
+                          [out, size_is(,*pcPropertySets), annotation("__deref_out_ecount_opt(*pcPropertySets)")] DBPROPSET **prgPropertySets);\r
+\r
+    [call_as(GetProperties)]\r
+    HRESULT RemoteGetProperties([in] ULONG cPropertyIDSets,\r
+                                [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets,\r
+                                [in, out] ULONG *pcPropertySets,\r
+                                [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets,\r
+                                [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+    [local]\r
+    HRESULT GetReferencedRowset([in] DBORDINAL iOrdinal,\r
+                                [in, annotation("__in")] REFIID riid,\r
+                                [out, iid_is(riid), annotation("deref_out_opt")] IUnknown **ppReferencedRowset);\r
+\r
+    [call_as(GetReferencedRowset)]\r
+    HRESULT RemoteGetReferencedRowset([in] DBORDINAL iOrdinal,\r
+                                      [in] REFIID riid,\r
+                                      [out, iid_is(riid)] IUnknown **ppReferencedRowset,\r
+                                      [out] IErrorInfo **ppErrorInfoRem);\r
+    [local]\r
+    HRESULT GetSpecification([in, annotation("__in")] REFIID riid,\r
+                             [out, iid_is(riid), annotation("__deref_out_opt")] IUnknown **ppSpecification);\r
+\r
+    [call_as(GetSpecification)]\r
+    HRESULT RemoteGetSpecification([in] REFIID riid,\r
+                                   [out, iid_is(riid)] IUnknown **ppSpecification,\r
+                                   [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+}\r
diff --git a/reactos/include/psdk/rstloc.idl b/reactos/include/psdk/rstloc.idl
new file mode 100644 (file)
index 0000000..f579581
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    local,\r
+    object,\r
+    uuid(0c733a7d-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface IRowsetLocate : IRowset\r
+{\r
+    typedef DWORD DBCOMPARE;\r
+\r
+    enum DBCOMPAREENUM\r
+    {\r
+        DBCOMPARE_LT,\r
+        DBCOMPARE_EQ,\r
+        DBCOMPARE_GT,\r
+        DBCOMPARE_NE,\r
+        DBCOMPARE_NOTCOMPARABLE\r
+    };\r
+\r
+    HRESULT Compare([in] HCHAPTER hReserved,\r
+                    [in] DBBKMARK cbBookmark1,\r
+                    [in, size_is(cbBookmark1)] const BYTE *pBookmark1,\r
+                    [in] DBBKMARK cbBookmark2,\r
+                    [in, size_is(cbBookmark2)] const BYTE *pBookmark2,\r
+                    [out] DBCOMPARE *pComparison);\r
+\r
+    HRESULT GetRowsAt([in] HWATCHREGION hReserved1,\r
+                      [in] HCHAPTER hReserved2,\r
+                      [in] DBBKMARK cbBookmark,\r
+                      [in, size_is(cbBookmark)] const BYTE *pBookmark,\r
+                      [in] DBROWOFFSET lRowsOffset,\r
+                      [in] DBROWCOUNT cRows,\r
+                      [out] DBCOUNTITEM *pcRowsObtained,\r
+                      [out, size_is(,cRows)] HROW **prghRows);\r
+\r
+    HRESULT GetRowsByBookmark([in] HCHAPTER hReserved,\r
+                              [in] DBCOUNTITEM cRows,\r
+                              [in, size_is(cRows)] const DBBKMARK rgcbBookmarks[],\r
+                              [in, size_is(cRows)] const BYTE *rgpBookmarks[],\r
+                              [out, size_is(cRows)] HROW rghRows[],\r
+                              [out, size_is(cRows)] DBROWSTATUS rgRowStatus[]);\r
+\r
+    HRESULT Hash([in] HCHAPTER hReserved,\r
+                 [in] DBBKMARK cBookmarks,\r
+                 [in, size_is(cBookmarks)] const DBBKMARK rgcbBookmarks[],\r
+                 [in, size_is(cBookmarks)] const BYTE *rgpBookmarks[],\r
+                 [out, size_is(cBookmarks)] DBHASHVALUE rgHashedValues[],\r
+                 [out, size_is(cBookmarks)] DBROWSTATUS rgBookmarkStatus[]);\r
+}\r
index 22ca227..80ed6be 100644 (file)
@@ -24,6 +24,7 @@ Abstract:
 #define _WIN32_WINNT_VISTA                  0x0600
 #define _WIN32_WINNT_WS08                   0x0600
 #define _WIN32_WINNT_LONGHORN               0x0600
+#define _WIN32_WINNT_WIN7                   0x0601
 
 /* _WIN32_IE */
 #define _WIN32_IE_IE20                      0x0200
@@ -38,6 +39,7 @@ Abstract:
 #define _WIN32_IE_IE60SP1                   0x0601
 #define _WIN32_IE_IE60SP2                   0x0603
 #define _WIN32_IE_IE70                      0x0700
+#define _WIN32_IE_IE80                      0x0800
 
 /* Mappings Between IE Version  and Windows Version */
 #define _WIN32_IE_NT4                       _WIN32_IE_IE20
@@ -62,6 +64,7 @@ Abstract:
 #define _WIN32_IE_WS03SP1                   _WIN32_IE_IE60SP2
 #define _WIN32_IE_WIN6                      _WIN32_IE_IE70
 #define _WIN32_IE_LONGHORN                  _WIN32_IE_IE70
+#define _WIN32_IE_WIN7                      _WIN32_IE_IE80
 
 /* NTDDI_VERSION */
 #define NTDDI_WIN2K                         0x05000000
@@ -94,6 +97,7 @@ Abstract:
 #define NTDDI_WS08SP2                       NTDDI_WIN6SP2
 #define NTDDI_WS08SP3                       NTDDI_WIN6SP3
 #define NTDDI_WS08SP4                       NTDDI_WIN6SP4
+#define NTDDI_WIN7                          0x06010000
 
 /* Version Fields in NTDDI_VERSION */
 #define OSVERSION_MASK                      0xFFFF0000
index ec018a9..1ecb9f7 100644 (file)
@@ -28,6 +28,7 @@ typedef struct SENS_QOCINFO
 
 [
   object,
+  uuid(d597bab1-5b9f-11d1-8dd2-00aa004abd5e),
   pointer_default(unique)
 ]
 interface ISensNetwork : IDispatch
@@ -55,6 +56,7 @@ interface ISensNetwork : IDispatch
 
 [
   object,
+  uuid(d597bab2-5b9f-11d1-8dd2-00aa004abd5e),
   pointer_default(unique)
 ]
 interface ISensOnNow : IDispatch
@@ -68,6 +70,7 @@ interface ISensOnNow : IDispatch
 
 [
   object,
+  uuid(d597bab3-5b9f-11d1-8dd2-00aa004abd5e),
   pointer_default(unique)
 ]
 interface ISensLogon : IDispatch
@@ -90,6 +93,7 @@ interface ISensLogon : IDispatch
 
 [
   object,
+  uuid(d597bab4-5b9f-11d1-8dd2-00aa004abd5e),
   pointer_default(unique)
 ]
 interface ISensLogon2 : IDispatch
diff --git a/reactos/include/psdk/sesprp.idl b/reactos/include/psdk/sesprp.idl
new file mode 100644 (file)
index 0000000..d621be1
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (C) 2009 Huw Davies\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
+ */\r
+\r
+[\r
+    object,\r
+    uuid(0c733a85-2a1c-11ce-ade5-00aa0044773d),\r
+    pointer_default(unique)\r
+]\r
+interface ISessionProperties : IUnknown\r
+{\r
+    [local]\r
+    HRESULT GetProperties([in] ULONG cPropertyIDSets,\r
+                          [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[],\r
+                          [in, out] ULONG *pcPropertySets,\r
+                          [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets);\r
+\r
+    [call_as(GetProperties)]\r
+    HRESULT RemoteGetProperties([in] ULONG cPropertyIDSets,\r
+                                [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets,\r
+                                [in, out] ULONG *pcPropertySets,\r
+                                [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets,\r
+                                [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+\r
+    [local]\r
+    HRESULT SetProperties([in] ULONG cPropertySets,\r
+                          [in, out, unique, size_is(cPropertySets)] DBPROPSET rgPropertySets[]);\r
+\r
+    [call_as(SetProperties)]\r
+    HRESULT RemoteSetProperties([in] ULONG cPropertySets,\r
+                                [in, unique, size_is(cPropertySets)] DBPROPSET *rgPropertySets,\r
+                                [in] ULONG cTotalProps,\r
+                                [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus,\r
+                                [out] IErrorInfo **ppErrorInfoRem);\r
+\r
+}\r
index 3f12542..3db2837 100644 (file)
@@ -78,9 +78,11 @@ DECLARE_HANDLE(HPSXA);
 #endif
 
 UINT         WINAPI SHAddFromPropSheetExtArray(HPSXA,LPFNADDPROPSHEETPAGE,LPARAM);
-LPVOID       WINAPI SHAlloc(ULONG);
+LPVOID       WINAPI SHAlloc(ULONG) __WINE_ALLOC_SIZE(1);
 HRESULT      WINAPI SHCoCreateInstance(LPCWSTR,const CLSID*,IUnknown*,REFIID,LPVOID*);
 HPSXA        WINAPI SHCreatePropSheetExtArray(HKEY,LPCWSTR,UINT);
+HPSXA        WINAPI SHCreatePropSheetExtArrayEx(HKEY,LPCWSTR,UINT,IDataObject*);
+HRESULT      WINAPI SHCreateShellItem(LPCITEMIDLIST,IShellFolder*,LPCITEMIDLIST,IShellItem**);
 DWORD        WINAPI SHCLSIDFromStringA(LPCSTR,CLSID*);
 DWORD        WINAPI SHCLSIDFromStringW(LPCWSTR,CLSID*);
 #define             SHCLSIDFromString WINELIB_NAME_AW(SHCLSIDFromString)
@@ -100,6 +102,10 @@ BOOL         WINAPI SHGetPathFromIDListW(LPCITEMIDLIST,LPWSTR);
 INT          WINAPI SHHandleUpdateImage(LPCITEMIDLIST);
 HRESULT      WINAPI SHILCreateFromPath(LPCWSTR,LPITEMIDLIST*,DWORD*);
 HRESULT      WINAPI SHLoadOLE(LPARAM);
+HRESULT      WINAPI SHParseDisplayName(LPCWSTR,IBindCtx*,LPITEMIDLIST*,SFGAOF,SFGAOF*);
+HRESULT      WINAPI SHPathPrepareForWriteA(HWND,IUnknown*,LPCSTR,DWORD);
+HRESULT      WINAPI SHPathPrepareForWriteW(HWND,IUnknown*,LPCWSTR,DWORD);
+#define             SHPathPrepareForWrite WINELIB_NAME_AW(SHPathPrepareForWrite);
 UINT         WINAPI SHReplaceFromPropSheetExtArray(HPSXA,UINT,LPFNADDPROPSHEETPAGE,LPARAM);
 LPITEMIDLIST WINAPI SHSimpleIDListFromPath(LPCWSTR);
 int          WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder*,LPCITEMIDLIST,int*);
@@ -110,16 +116,26 @@ INT          WINAPI PickIconDlg(HWND,LPWSTR,UINT,int *);
 #define             SHUpdateImage WINELIB_NAME_AW(SHUpdateImage)
 int          WINAPI RestartDialog(HWND,LPCWSTR,DWORD);
 int          WINAPI RestartDialogEx(HWND,LPCWSTR,DWORD,DWORD);
+BOOL         WINAPI IsUserAnAdmin(void);
 
-#define SHFMT_ERROR     0xFFFFFFFFL  /* Error on last format, drive may be formatable */
-#define SHFMT_CANCEL    0xFFFFFFFEL  /* Last format was canceled */
-#define SHFMT_NOFORMAT  0xFFFFFFFDL  /* Drive is not formatable */
+#define SHFMT_ERROR     0xFFFFFFFFL  /* Error on last format, drive may be formattable */
+#define SHFMT_CANCEL    0xFFFFFFFEL  /* Last format was cancelled */
+#define SHFMT_NOFORMAT  0xFFFFFFFDL  /* Drive is not formattable */
 
 /* SHFormatDrive flags */
 #define SHFMT_ID_DEFAULT       0xFFFF
 #define SHFMT_OPT_FULL         1
 #define SHFMT_OPT_SYSONLY      2
 
+/* SHPathPrepareForWrite flags */
+#define SHPPFW_NONE             0x00000000
+#define SHPPFW_DIRCREATE        0x00000001
+#define SHPPFW_DEFAULT          SHPPFW_DIRCREATE
+#define SHPPFW_ASKDIRCREATE     0x00000002
+#define SHPPFW_IGNOREFILENAME   0x00000004
+#define SHPPFW_NOWRITECHECK     0x00000008
+#define SHPPFW_MEDIACHECKONLY   0x00000010
+
 /* SHObjectProperties flags */
 #define SHOP_PRINTERNAME 0x01
 #define SHOP_FILEPATH    0x02
@@ -141,54 +157,168 @@ int WINAPI PathCleanupSpec(LPCWSTR,LPWSTR);
 
 
 /* DATAOBJECT_InitShellIDList*/
-#define CFSTR_SHELLIDLIST       "Shell IDList Array"      /* CF_IDLIST */
-
-typedef struct
-{      UINT cidl;
-       UINT aoffset[1];
-} CIDA, *LPIDA;
-
-#define CFSTR_SHELLIDLISTA      "Shell IDList Array"      /* CF_IDLIST */
-#define CFSTR_SHELLIDLISTOFFSET "Shell Object Offsets"    /* CF_OBJECTPOSITIONS */
-#define CFSTR_NETRESOURCES      "Net Resource"            /* CF_NETRESOURCE */
-
+#define CFSTR_SHELLIDLISTA           "Shell IDList Array"   /* CF_IDLIST */
+#define CFSTR_SHELLIDLISTOFFSETA     "Shell Object Offsets" /* CF_OBJECTPOSITIONS */
+#define CFSTR_NETRESOURCESA          "Net Resource"         /* CF_NETRESOURCE */
 /* DATAOBJECT_InitFileGroupDesc */
-#define CFSTR_FILEDESCRIPTORA   "FileGroupDescriptor"     /* CF_FILEGROUPDESCRIPTORA */
-
-#define CFSTR_FILEDESCRIPTORW   "FileGroupDescriptorW"    /* CF_FILEGROUPDESCRIPTORW */
-
+#define CFSTR_FILEDESCRIPTORA        "FileGroupDescriptor"  /* CF_FILEGROUPDESCRIPTORA */
 /* DATAOBJECT_InitFileContents*/
-#define CFSTR_FILECONTENTS      "FileContents"            /* CF_FILECONTENTS */
-
-#ifdef UNICODE
-#define CFSTR_FILENAME         L"FileNameW"
-#define CFSTR_FILENAMEMAP      L"FileNameMapW"
-#define CFSTR_FILEDESCRIPTOR   L"FileGroupDescriptorW"
-#define CFSTR_SHELLURL         L"UniformResourceLocatorW"
+#define CFSTR_FILECONTENTSA          "FileContents"         /* CF_FILECONTENTS */
+#define CFSTR_FILENAMEA              "FileName"             /* CF_FILENAMEA */
+#define CFSTR_FILENAMEMAPA           "FileNameMap"          /* CF_FILENAMEMAPA */
+#define CFSTR_PRINTERGROUPA          "PrinterFriendlyName"  /* CF_PRINTERS */
+#define CFSTR_SHELLURLA              "UniformResourceLocator"
+#define CFSTR_INETURLA               CFSTR_SHELLURLA
+#define CFSTR_PREFERREDDROPEFFECTA   "Preferred DropEffect"
+#define CFSTR_PERFORMEDDROPEFFECTA   "Performed DropEffect"
+#define CFSTR_PASTESUCCEEDEDA        "Paste Succeeded"
+#define CFSTR_INDRAGLOOPA            "InShellDragLoop"
+#define CFSTR_DRAGCONTEXTA           "DragContext"
+#define CFSTR_MOUNTEDVOLUMEA         "MountedVolume"
+#define CFSTR_PERSISTEDDATAOBJECTA   "PersistedDataObject"
+#define CFSTR_TARGETCLSIDA           "TargetCLSID"
+#define CFSTR_AUTOPLAY_SHELLIDLISTSA "Autoplay Enumerated IDList Array"
+#define CFSTR_LOGICALPERFORMEDDROPEFFECTA "Logical Performed DropEffect"
+
+#if defined(__GNUC__)
+# define CFSTR_SHELLIDLISTW \
+    (const WCHAR []){ 'S','h','e','l','l',' ','I','D','L','i','s','t',' ','A','r','r','a','y',0 }
+# define CFSTR_SHELLIDLISTOFFSETW \
+    (const WCHAR []){ 'S','h','e','l','l',' ','O','b','j','e','c','t',' ','O','f','f','s','e','t','s',0 }
+# define CFSTR_NETRESOURCESW \
+    (const WCHAR []){ 'N','e','t',' ','R','e','s','o','u','r','c','e',0 }
+# define CFSTR_FILEDESCRIPTORW \
+    (const WCHAR []){ 'F','i','l','e','G','r','o','u','p','D','e','s','c','r','i','p','t','o','r','W',0 }
+# define CFSTR_FILECONTENTSW \
+    (const WCHAR []){ 'F','i','l','e','C','o','n','t','e','n','t','s',0 }
+# define CFSTR_FILENAMEW \
+    (const WCHAR []){ 'F','i','l','e','N','a','m','e','W',0 }
+# define CFSTR_FILENAMEMAPW \
+    (const WCHAR []){ 'F','i','l','e','N','a','m','e','M','a','p','W',0 }
+# define CFSTR_PRINTERGROUPW \
+    (const WCHAR []){ 'P','r','i','n','t','e','r','F','r','i','e','n','d','l','y','N','a','m','e',0 }
+# define CFSTR_SHELLURLW \
+    (const WCHAR []){ 'U','n','i','f','o','r','m','R','e','s','o','u','r','c','e','L','o','c','a','t','o','r',0 }
+# define CFSTR_INETURLW \
+    (const WCHAR []){ 'U','n','i','f','o','r','m','R','e','s','o','u','r','c','e','L','o','c','a','t','o','r','W',0 }
+# define CFSTR_PREFERREDDROPEFFECTW \
+    (const WCHAR []){ 'P','r','e','f','e','r','r','e','d',' ','D','r','o','p','E','f','f','e','c','t',0 }
+# define CFSTR_PERFORMEDDROPEFFECTW \
+    (const WCHAR []){ 'P','e','r','f','o','r','m','e','d',' ','D','r','o','p','E','f','f','e','c','t',0 }
+# define CFSTR_PASTESUCCEEDEDW \
+    (const WCHAR []){ 'P','a','s','t','e',' ','S','u','c','c','e','e','d','e','d',0 }
+# define CFSTR_INDRAGLOOPW \
+    (const WCHAR []){ 'I','n','S','h','e','l','l','D','r','a','g','L','o','o','p',0 }
+# define CFSTR_DRAGCONTEXTW \
+    (const WCHAR []){ 'D','r','a','g','C','o','n','t','e','x','t',0 }
+# define CFSTR_MOUNTEDVOLUMEW \
+    (const WCHAR []){ 'M','o','u','n','t','e','d','V','o','l','u','m','e',0 }
+# define CFSTR_PERSISTEDDATAOBJECTW \
+    (const WCHAR []){ 'P','e','r','s','i','s','t','e','d','D','a','t','a','O','b','j','e','c','t',0 }
+# define CFSTR_TARGETCLSIDW \
+    (const WCHAR []){ 'T','a','r','g','e','t','C','L','S','I','D',0 }
+# define CFSTR_AUTOPLAY_SHELLIDLISTSW \
+    (const WCHAR []){ 'A','u','t','o','p','l','a','y',' ','E','n','u','m','e','r','a','t','e','d',\
+                      ' ','I','D','L','i','s','t',' ','A','r','r','a','y',0 }
+# define CFSTR_LOGICALPERFORMEDDROPEFFECTW \
+    (const WCHAR []){ 'L','o','g','i','c','a','l',' ','P','e','r','f','o','r','m','e','d',\
+                      ' ','D','r','o','p','E','f','f','e','c','t',0 }
+#elif defined(_MSC_VER)
+# define CFSTR_SHELLIDLISTW           L"Shell IDList Array"
+# define CFSTR_SHELLIDLISTOFFSETW     L"Shell Object Offsets"
+# define CFSTR_NETRESOURCESW          L"Net Resource"
+# define CFSTR_FILEDESCRIPTORW        L"FileGroupDescriptorW"
+# define CFSTR_FILECONTENTSW          L"FileContents"
+# define CFSTR_FILENAMEW              L"FileNameW"
+# define CFSTR_FILENAMEMAPW           L"FileNameMapW"
+# define CFSTR_PRINTERGROUPW          L"PrinterFriendlyName"
+# define CFSTR_SHELLURLW              L"UniformResourceLocator"
+# define CFSTR_INETURLW               L"UniformResourceLocatorW"
+# define CFSTR_PREFERREDDROPEFFECTW   L"Preferred DropEffect"
+# define CFSTR_PERFORMEDDROPEFFECTW   L"Performed DropEffect"
+# define CFSTR_PASTESUCCEEDEDW        L"Paste Succeeded"
+# define CFSTR_INDRAGLOOPW            L"InShellDragLoop"
+# define CFSTR_DRAGCONTEXTW           L"DragContext"
+# define CFSTR_MOUNTEDVOLUMEW         L"MountedVolume"
+# define CFSTR_PERSISTEDDATAOBJECTW   L"PersistedDataObject"
+# define CFSTR_TARGETCLSIDW           L"TargetCLSID"
+# define CFSTR_AUTOPLAY_SHELLIDLISTSW L"Autoplay Enumerated IDList Array"
+# define CFSTR_LOGICALPERFORMEDDROPEFFECTW L"Logical Performed DropEffect"
 #else
-#define CFSTR_FILENAME         "FileName"
-#define CFSTR_FILENAMEMAP      "FileNameMap"
-#define CFSTR_FILEDESCRIPTOR   "FileGroupDescriptor"
-#define CFSTR_SHELLURL         "UniformResourceLocator"
+static const WCHAR CFSTR_SHELLIDLISTW[] =
+    { 'S','h','e','l','l',' ','I','D','L','i','s','t',' ','A','r','r','a','y',0 };
+static const WCHAR CFSTR_SHELLIDLISTOFFSETW[] =
+    { 'S','h','e','l','l',' ','O','b','j','e','c','t',' ','O','f','f','s','e','t','s',0 };
+static const WCHAR CFSTR_NETRESOURCESW[] =
+    { 'N','e','t',' ','R','e','s','o','u','r','c','e',0 };
+static const WCHAR CFSTR_FILEDESCRIPTORW[] =
+    { 'F','i','l','e','G','r','o','u','p','D','e','s','c','r','i','p','t','o','r','W',0 };
+static const WCHAR CFSTR_FILECONTENTSW[] =
+    { 'F','i','l','e','C','o','n','t','e','n','t','s',0 };
+static const WCHAR CFSTR_FILENAMEW[] =
+    { 'F','i','l','e','N','a','m','e','W',0 };
+static const WCHAR CFSTR_FILENAMEMAPW[] =
+    { 'F','i','l','e','N','a','m','e','M','a','p','W',0 };
+static const WCHAR CFSTR_PRINTERGROUPW[] =
+    { 'P','r','i','n','t','e','r','F','r','i','e','n','d','l','y','N','a','m','e',0 };
+static const WCHAR CFSTR_SHELLURLW[] =
+    { 'U','n','i','f','o','r','m','R','e','s','o','u','r','c','e','L','o','c','a','t','o','r',0 };
+static const WCHAR CFSTR_INETURLW[] =
+    { 'U','n','i','f','o','r','m','R','e','s','o','u','r','c','e','L','o','c','a','t','o','r','W',0 };
+static const WCHAR CFSTR_PREFERREDDROPEFFECTW[] =
+    { 'P','r','e','f','e','r','r','e','d',' ','D','r','o','p','E','f','f','e','c','t',0 };
+static const WCHAR CFSTR_PERFORMEDDROPEFFECTW[] =
+    { 'P','e','r','f','o','r','m','e','d',' ','D','r','o','p','E','f','f','e','c','t',0 };
+static const WCHAR CFSTR_PASTESUCCEEDEDW[] =
+    { 'P','a','s','t','e',' ','S','u','c','c','e','e','d','e','d',0 };
+static const WCHAR CFSTR_INDRAGLOOPW[] =
+    { 'I','n','S','h','e','l','l','D','r','a','g','L','o','o','p',0 };
+static const WCHAR CFSTR_DRAGCONTEXTW[] =
+    { 'D','r','a','g','C','o','n','t','e','x','t',0 };
+static const WCHAR CFSTR_MOUNTEDVOLUMEW[] =
+    { 'M','o','u','n','t','e','d','V','o','l','u','m','e',0 };
+static const WCHAR CFSTR_PERSISTEDDATAOBJECTW[] =
+    { 'P','e','r','s','i','s','t','e','d','D','a','t','a','O','b','j','e','c','t',0 };
+static const WCHAR CFSTR_TARGETCLSIDW[] =
+    { 'T','a','r','g','e','t','C','L','S','I','D',0 };
+static const WCHAR CFSTR_AUTOPLAY_SHELLIDLISTSW[] =
+    { 'A','u','t','o','p','l','a','y',' ','E','n','u','m','e','r','a','t','e','d',
+      ' ','I','D','L','i','s','t',' ','A','r','r','a','y',0 };
+static const WCHAR CFSTR_LOGICALPERFORMEDDROPEFFECTW[] =
+    { 'L','o','g','i','c','a','l',' ','P','e','r','f','o','r','m','e','d',
+      ' ','D','r','o','p','E','f','f','e','c','t',0 };
 #endif
 
-#define CFSTR_FILENAMEW         "FileNameW"
-#define CFSTR_FILENAMEA         "FileName"
-#define CFSTR_FILENAMEMAPA      "FileNameMap"             /* CF_FILENAMEMAPA */
-#define CFSTR_FILENAMEMAPW      "FileNameMapW"            /* CF_FILENAMEMAPW */
+#define CFSTR_SHELLIDLIST           WINELIB_NAME_AW(CFSTR_SHELLIDLIST)
+#define CFSTR_SHELLIDLISTOFFSET     WINELIB_NAME_AW(CFSTR_SHELLIDLISTOFFSET)
+#define CFSTR_NETRESOURCES          WINELIB_NAME_AW(CFSTR_NETRESOURCES)
+#define CFSTR_FILEDESCRIPTOR        WINELIB_NAME_AW(CFSTR_FILEDESCRIPTOR)
+#define CFSTR_FILECONTENTS          WINELIB_NAME_AW(CFSTR_FILECONTENTS)
+#define CFSTR_FILENAME              WINELIB_NAME_AW(CFSTR_FILENAME)
+#define CFSTR_FILENAMEMAP           WINELIB_NAME_AW(CFSTR_FILENAMEMAP)
+#define CFSTR_PRINTERGROUP          WINELIB_NAME_AW(CFSTR_PRINTERGROUP)
+#define CFSTR_SHELLURL              WINELIB_NAME_AW(CFSTR_SHELLURL)
+#define CFSTR_INETURL               WINELIB_NAME_AW(CFSTR_INETURL)
+#define CFSTR_PREFERREDDROPEFFECT   WINELIB_NAME_AW(CFSTR_PREFERREDDROPEFFECT)
+#define CFSTR_PERFORMEDDROPEFFECT   WINELIB_NAME_AW(CFSTR_PERFORMEDDROPEFFECT)
+#define CFSTR_PASTESUCCEEDED        WINELIB_NAME_AW(CFSTR_PASTESUCCEEDED)
+#define CFSTR_INDRAGLOOP            WINELIB_NAME_AW(CFSTR_INDRAGLOOP)
+#define CFSTR_DRAGCONTEXT           WINELIB_NAME_AW(CFSTR_DRAGCONTEXT)
+#define CFSTR_MOUNTEDVOLUME         WINELIB_NAME_AW(CFSTR_MOUNTEDVOLUME)
+#define CFSTR_PERSISTEDDATAOBJECT   WINELIB_NAME_AW(CFSTR_PERSISTEDDATAOBJECT)
+#define CFSTR_TARGETCLSID           WINELIB_NAME_AW(CFSTR_TARGETCLSID)
+#define CFSTR_AUTOPLAY_SHELLIDLISTS WINELIB_NAME_AW(CFSTR_AUTOPLAY_SHELLIDLISTS)
+#define CFSTR_LOGICALPERFORMEDDROPEFFECT WINELIB_NAME_AW(CFSTR_LOGICALPERFORMEDDROPEFFECT)
 
-#define CFSTR_PRINTERGROUP      "PrinterFriendlyName"     /* CF_PRINTERS */
-#define CFSTR_PREFERREDDROPEFFECT "Preferred DropEffect"
-#define CFSTR_PERFORMEDDROPEFFECT "Performed DropEffect"
-#define CFSTR_PASTESUCCEEDED    "Paste Succeeded"
-#define CFSTR_INDRAGLOOP        "InShellDragLoop"
+typedef struct
+{      UINT cidl;
+       UINT aoffset[1];
+} CIDA, *LPIDA;
 
 /************************************************************************
 * IShellView interface
 */
 
-#define SV_CLASS_NAME   ("SHELLDLL_DefView")
-
 #define FCIDM_SHVIEWFIRST       0x0000
 /* undocumented */
 #define FCIDM_SHVIEW_ARRANGE    0x7001
@@ -252,24 +382,10 @@ typedef struct
 #define FCIDM_STATUS       (FCIDM_BROWSERFIRST + 1)
 
 
-VOID WINAPI SHSetInstanceExplorer(LPUNKNOWN);
-BOOL WINAPI IsUserAnAdmin(VOID);
-
 /****************************************************************************
  * IShellIcon interface
  */
 
-#undef  INTERFACE
-#define INTERFACE   IShellFolderViewCB
-DECLARE_INTERFACE_(IShellFolderViewCB, IUnknown)
-{
-    STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
-    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
-    STDMETHOD_(ULONG,Release) (THIS) PURE;
-    STDMETHOD(MessageSFVCB)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE;
-};
-#undef INTERFACE
-
 #define INTERFACE IShellIcon
 DECLARE_INTERFACE_(IShellIcon,IUnknown)
 {
@@ -411,6 +527,57 @@ DECLARE_INTERFACE_(IACList,IUnknown)
 #define IACList_Expand(p,a)             (p)->lpVtbl->Expand(p,a)
 #endif
 
+/* IACList2 interface */
+#define INTERFACE IACList2
+DECLARE_INTERFACE_(IACList2,IACList)
+{
+    /*** IUnknown methods ***/
+    STDMETHOD_(HRESULT,QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+    /*** IACList methods ***/
+    STDMETHOD(Expand)(THIS_ LPCOLESTR str) PURE;
+    /*** IACList2 methods ***/
+    STDMETHOD(SetOptions)(THIS_ DWORD dwFlag) PURE;
+    STDMETHOD(GetOptions)(THIS_ DWORD* pdwFlag) PURE;
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IACList2_QueryInterface(p,a,b)  (p)->lpVtbl->QueryInterface(p,a,b)
+#define IACList2_AddRef(p)              (p)->lpVtbl->AddRef(p)
+#define IACList2_Release(p)             (p)->lpVtbl->Release(p)
+/*** IACList2 methods ***/
+#define IACList2_GetOptions(p,a)        (p)->lpVtbl->GetOptions(p,a)
+#define IACList2_SetOptions(p,a)        (p)->lpVtbl->SetOptions(p,a)
+#endif
+
+/****************************************************************************
+ * IShellFolderViewCB interface
+ */
+
+#define INTERFACE IShellFolderViewCB
+DECLARE_INTERFACE_(IShellFolderViewCB,IUnknown)
+{
+    /*** IUnknown methods ***/
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+    STDMETHOD_(ULONG,Release)(THIS) PURE;
+    /*** IShellFolderViewCB methods ***/
+    STDMETHOD(MessageSFVCB)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE;
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IShellFolderViewCB_QueryInterface(p,a,b)      (p)->lpVtbl->QueryInterface(p,a,b)
+#define IShellFolderViewCB_AddRef(p)                  (p)->lpVtbl->AddRef(p)
+#define IShellFolderViewCB_Release(p)                 (p)->lpVtbl->Release(p)
+/*** IShellFolderViewCB methods ***/
+#define IShellFolderViewCB_MessageSFVCB(p,a,b,c)      (p)->lpVtbl->MessageSFVCB(p,a,b,c)
+#endif
+
 /* IProgressDialog interface */
 #define PROGDLG_NORMAL           0x00000000
 #define PROGDLG_MODAL            0x00000001
@@ -502,15 +669,6 @@ DECLARE_INTERFACE_(IDeskBarClient,IOleWindow)
 
 void WINAPI SHAddToRecentDocs(UINT,LPCVOID);
 
-HANDLE WINAPI SHChangeNotification_Lock(
-       HANDLE hChange,
-       DWORD dwProcessId,
-       LPITEMIDLIST **lppidls,
-       LPLONG lpwEventId);
-BOOL WINAPI SHChangeNotification_Unlock ( HANDLE hLock);
-
-
-
 /****************************************************************************
  * SHBrowseForFolder API
  */
@@ -567,8 +725,9 @@ typedef struct tagBROWSEINFOW {
 /* message from browser */
 #define BFFM_INITIALIZED        1
 #define BFFM_SELCHANGED         2
-#define BFFM_VALIDATEFAILEDA    3   /* lParam:szPath ret:1(cont),0(EndDialog) */
-#define BFFM_VALIDATEFAILEDW    4   /* lParam:wzPath ret:1(cont),0(EndDialog) */
+#define BFFM_VALIDATEFAILEDA    3
+#define BFFM_VALIDATEFAILEDW    4
+#define BFFM_IUNKNOWN           5
 
 /* messages to browser */
 #define BFFM_SETSTATUSTEXTA     (WM_USER+100)
@@ -669,15 +828,6 @@ HRESULT WINAPI SHCreateShellFolderViewEx(LPCSFV pshfvi, IShellView **ppshv);
 #define SFVM_GET_WEBVIEW_THEME        86 /* undocumented */
 #define SFVM_GETDEFERREDVIEWSETTINGS  92 /* undocumented */
 
-#define SHPPFW_NONE 0
-#define SHPPFW_DIRCREATE 1
-#define SHPPFW_DEFAULT SHPPFW_DIRCREATE
-#define SHPPFW_ASKDIRCREATE 2
-#define SHPPFW_IGNOREFILENAME 4
-#define SHPPFW_NOWRITECHECK 8
-
-/* Types and definitions for the SFM_* parameters */
-#include <pshpack8.h>
 typedef struct _SFV_CREATE
 {
     UINT cbSize;
@@ -686,6 +836,10 @@ typedef struct _SFV_CREATE
     IShellFolderViewCB *psfvcb;
 } SFV_CREATE;
 
+HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pscfv, IShellView **ppsv);
+
+/* Types and definitions for the SFM_* parameters */
+#include <pshpack8.h>
 
 #define QCMINFO_PLACE_BEFORE          0
 #define QCMINFO_PLACE_AFTER           1
@@ -801,19 +955,13 @@ HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int n
 HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID pv, int cb);
 #define  SHGetDataFromIDList WINELIB_NAME_AW(SHGetDataFromIDList)
 
-PIDLIST_ABSOLUTE WINAPI SHCloneSpecialIDList(HWND hwnd, int csidl, BOOL fCreate);
+LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwnd, int csidl, BOOL fCreate);
 BOOL WINAPI SHGetSpecialFolderPathA (HWND hwndOwner, LPSTR szPath, int nFolder, BOOL bCreate);
 BOOL WINAPI SHGetSpecialFolderPathW (HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate);
 #define  SHGetSpecialFolderPath WINELIB_NAME_AW(SHGetSpecialFolderPath)
 
 HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal) ;
 
-/**********************************************************************
- * SHCreateShellFolderView ()
- */
-
-HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv);
-
 /**********************************************************************
  * SHGetSetSettings ()
  */
@@ -1147,6 +1295,10 @@ typedef enum {
     SLDF_NO_PIDL_ALIAS = 0x00008000,
     SLDF_FORCE_UNCNAME = 0x00010000,
     SLDF_RUN_WITH_SHIMLAYER = 0x00020000,
+    SLDF_FORCE_NO_LINKTRACK = 0x00040000,
+    SLDF_ENABLE_TARGET_METADATA = 0x00080000,
+    SLDF_DISABLE_KNOWNFOLDER_RELATIVE_TRACKING = 0x00200000,
+    SLDF_VALID = 0x003ff7ff,
     SLDF_RESERVED = 0x80000000,
 } SHELL_LINK_DATA_FLAGS;
 
@@ -1158,41 +1310,6 @@ typedef struct tagDATABLOCKHEADER
 
 typedef struct {
     DATABLOCK_HEADER dbh;
-    WORD wFillAttribute;
-    WORD wPopupFillAttribute;
-    COORD dwScreenBufferSize;
-    COORD dwWindowSize;
-    COORD dwWindowOrigin;
-    DWORD nFont;
-    DWORD nInputBufferSize;
-    COORD dwFontSize;
-    UINT uFontFamily;
-    UINT uFontWeight;
-    WCHAR FaceName[LF_FACESIZE];
-    UINT uCursorSize;
-    BOOL bFullScreen;
-    BOOL bQuickEdit;
-    BOOL bInsertMode;
-    BOOL bAutoPosition;
-    UINT uHistoryBufferSize;
-    UINT uNumberOfHistoryBuffers;
-    BOOL bHistoryNoDup;
-    COLORREF ColorTable[16];
-} NT_CONSOLE_PROPS, *LPNT_CONSOLE_PROPS;
-
-typedef struct {
-    DATABLOCK_HEADER dbh;
-    UINT uCodePage;
-} NT_FE_CONSOLE_PROPS, *LPNT_FE_CONSOLE_PROPS;
-
-typedef struct {
-
-#ifdef __cplusplus
-    DATABLOCK_HEADER dbh;
-#else
-    DWORD cbSize;
-    DWORD dwSignature;
-#endif
     CHAR szDarwinID[MAX_PATH];
     WCHAR szwDarwinID[MAX_PATH];
 } EXP_DARWIN_LINK, *LPEXP_DARWIN_LINK;
@@ -1211,13 +1328,20 @@ typedef struct {
     DWORD cbOffset;
 } EXP_SPECIAL_FOLDER, *LPEXP_SPECIAL_FOLDER;
 
+typedef struct {
+    DWORD cbSize;
+    DWORD dwSignature;
+    BYTE abPropertyStorage[1];
+} EXP_PROPERTYSTORAGE;
+
 #define EXP_SZ_LINK_SIG         0xa0000001
 #define NT_CONSOLE_PROPS_SIG    0xa0000002
 #define NT_FE_CONSOLE_PROPS_SIG 0xa0000004
 #define EXP_SPECIAL_FOLDER_SIG  0xa0000005
 #define EXP_DARWIN_ID_SIG       0xa0000006
-#define EXP_LOGO3_ID_SIG        0xa0000007
 #define EXP_SZ_ICON_SIG         0xa0000007
+#define EXP_LOGO3_ID_SIG        EXP_SZ_ICON_SIG /* Old SDKs only */
+#define EXP_PROPERTYSTORAGE_SIG 0xa0000009
 
 typedef struct _SHChangeDWORDAsIDList {
     USHORT   cb;
@@ -1235,6 +1359,8 @@ typedef struct _SHChangeProductKeyAsIDList {
 ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, int fSources, LONG fEvents, UINT wMsg,
                                     int cEntries, const SHChangeNotifyEntry *pshcne);
 BOOL WINAPI SHChangeNotifyDeregister(ULONG ulID);
+HANDLE WINAPI SHChangeNotification_Lock(HANDLE hChangeNotification, DWORD dwProcessId,
+                                        LPITEMIDLIST **pppidl, LONG *plEvent);
 BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock);
 
 HRESULT WINAPI SHGetRealIDL(IShellFolder *psf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST * ppidlReal);
@@ -1245,6 +1371,7 @@ HRESULT WINAPI SHGetRealIDL(IShellFolder *psf, LPCITEMIDLIST pidlSimple, LPITEMI
 DWORD WINAPI SHCreateDirectory(HWND, LPCWSTR);
 int WINAPI SHCreateDirectoryExA(HWND, LPCSTR, LPSECURITY_ATTRIBUTES);
 int WINAPI SHCreateDirectoryExW(HWND, LPCWSTR, LPSECURITY_ATTRIBUTES);
+#define    SHCreateDirectoryEx WINELIB_NAME_AW(SHCreateDirectoryEx)
 
 /****************************************************************************
 * SHGetSpecialFolderLocation API
@@ -1276,7 +1403,7 @@ HRESULT WINAPI SHGetFolderPathW(HWND hwnd, int nFolder, HANDLE hToken, DWORD dwF
 #define CSIDL_SENDTO           0x0009
 #define CSIDL_BITBUCKET                0x000a
 #define CSIDL_STARTMENU                0x000b
-#define CSIDL_MYDOCUMENTS      0x000c
+#define CSIDL_MYDOCUMENTS      CSIDL_PERSONAL
 #define CSIDL_MYMUSIC          0x000d
 #define CSIDL_MYVIDEO          0x000e
 #define CSIDL_DESKTOPDIRECTORY 0x0010
@@ -1322,6 +1449,7 @@ HRESULT WINAPI SHGetFolderPathW(HWND hwnd, int nFolder, HANDLE hToken, DWORD dwF
 #define CSIDL_CDBURN_AREA      0x003b
 #define CSIDL_COMPUTERSNEARME  0x003d
 #define CSIDL_PROFILES         0x003e
+#define CSIDL_FOLDER_MASK      0x00ff
 #define CSIDL_FLAG_PER_USER_INIT 0x0800
 #define CSIDL_FLAG_NO_ALIAS    0x1000
 #define CSIDL_FLAG_DONT_VERIFY 0x4000
@@ -1438,8 +1566,26 @@ BOOL WINAPI WriteCabinetState(CABINETSTATE *);
 /****************************************************************************
  * Path Manipulation Routines
  */
+
+/* PathProcessCommand flags */
+#define PPCF_ADDQUOTES        0x01
+#define PPCF_INCLUDEARGS      0x02
+#define PPCF_ADDARGUMENTS     0x03
+#define PPCF_NODIRECTORIES    0x10
+#define PPCF_DONTRESOLVE      0x20
+#define PPCF_FORCEQUALIFY     0x40
+#define PPCF_LONGESTPOSSIBLE  0x80
+
+/* PathResolve flags */
+#define PRF_VERIFYEXISTS         0x01
+#define PRF_EXECUTABLE           0x02
+#define PRF_TRYPROGRAMEXTENSIONS 0x03
+#define PRF_FIRSTDIRDEF          0x04
+#define PRF_DONTFINDLINK         0x08
+
 VOID WINAPI PathGetShortPath(LPWSTR pszPath);
 LONG WINAPI PathProcessCommand(LPCWSTR, LPWSTR, int, DWORD);
+BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR, LPCWSTR, LPCWSTR, LPCWSTR);
 
 /****************************************************************************
  * Drag And Drop Routines
@@ -1515,7 +1661,6 @@ HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *,REFIID,void **p
 
 typedef HRESULT (CALLBACK * LPFNDFMCALLBACK)(IShellFolder*,HWND,IDataObject*,UINT,WPARAM,LPARAM);
 HRESULT WINAPI CDefFolderMenu_Create2(LPCITEMIDLIST,HWND,UINT,LPCITEMIDLIST*,IShellFolder*,LPFNDFMCALLBACK,UINT,const HKEY *,IContextMenu **);
-
 /****************************************************************************
  * SHCreateDefaultContextMenu API
  */
@@ -1524,7 +1669,6 @@ HRESULT WINAPI
 SHCreateDefaultExtractIcon(
   REFIID riid,
   void **ppv);
-
 /****************************************************************************
  * SHCreateDataObject API
  */
index df1e1aa..29e70b7 100644 (file)
@@ -85,6 +85,34 @@ DWORD WINAPI SHCopyKeyW(HKEY,LPCWSTR,HKEY,DWORD);
 
 HKEY WINAPI  SHRegDuplicateHKey(HKEY);
 
+/* SHRegGetValue flags */
+typedef INT SRRF;
+
+#define SRRF_RT_REG_NONE 0x1
+#define SRRF_RT_REG_SZ 0x2
+#define SRRF_RT_REG_EXPAND_SZ 0x4
+#define SRRF_RT_REG_BINARY 0x8
+#define SRRF_RT_REG_DWORD 0x10
+#define SRRF_RT_REG_MULTI_SZ 0x20
+#define SRRF_RT_REG_QWORD 0x40
+
+#define SRRF_RT_DWORD (SRRF_RT_REG_BINARY|SRRF_RT_REG_DWORD)
+#define SRRF_RT_QWORD (SRRF_RT_REG_BINARY|SRRF_RT_REG_QWORD)
+#define SRRF_RT_ANY 0xffff
+
+#define SRRF_RM_ANY 0
+#define SRRF_RM_NORMAL 0x10000
+#define SRRF_RM_SAFE 0x20000
+#define SRRF_RM_SAFENETWORK 0x40000
+
+#define SRRF_NOEXPAND 0x10000000
+#define SRRF_ZEROONFAILURE 0x20000000
+#define SRRF_NOVIRT 0x40000000
+
+LSTATUS WINAPI SHRegGetValueA(HKEY,LPCSTR,LPCSTR,SRRF,LPDWORD,LPVOID,LPDWORD);
+LSTATUS WINAPI SHRegGetValueW(HKEY,LPCWSTR,LPCWSTR,SRRF,LPDWORD,LPVOID,LPDWORD);
+#define SHRegGetValue WINELIB_NAME_AW(SHRegGetValue)
+
 /* Undocumented registry functions */
 
 DWORD WINAPI SHDeleteOrphanKeyA(HKEY,LPCSTR);
@@ -388,7 +416,7 @@ BOOL WINAPI PathIsDirectoryEmptyW(LPCWSTR);
 
 BOOL WINAPI PathIsFileSpecA(LPCSTR);
 BOOL WINAPI PathIsFileSpecW(LPCWSTR);
-#define PathIsFileSpec WINELIB_NAME_AW(PathIsFileSpec)
+#define PathIsFileSpec WINELIB_NAME_AW(PathIsFileSpec);
 
 BOOL WINAPI PathIsPrefixA(LPCSTR,LPCSTR);
 BOOL WINAPI PathIsPrefixW(LPCWSTR,LPCWSTR);
@@ -1064,6 +1092,17 @@ BOOL WINAPI IsOS(DWORD);
 #define TPS_EXECUTEIO    0x00000001
 #define TPS_LONGEXECTIME 0x00000008
 
+/* SHFormatDateTimeA/SHFormatDateTimeW flags */
+#define FDTF_SHORTTIME          0x00000001
+#define FDTF_SHORTDATE          0x00000002
+#define FDTF_DEFAULT            (FDTF_SHORTDATE | FDTF_SHORTTIME)
+#define FDTF_LONGDATE           0x00000004
+#define FDTF_LONGTIME           0x00000008
+#define FDTF_RELATIVE           0x00000010
+#define FDTF_LTRDATE            0x00000100
+#define FDTF_RTLDATE            0x00000200
+#define FDTF_NOAUTOREADINGORDER 0x00000400
+
 #include <poppack.h> 
 
 #ifdef __cplusplus
index cd2320e..221ab04 100644 (file)
@@ -323,22 +323,6 @@ interface IEnumExtraSearch : IUnknown
 ]
 interface IShellFolder2 : IShellFolder
 {
-    typedef enum
-    {
-        SHCOLSTATE_TYPE_STR = 0x00000001,
-        SHCOLSTATE_TYPE_INT = 0x00000002,
-        SHCOLSTATE_TYPE_DATE = 0x00000003,
-        SHCOLSTATE_TYPEMASK = 0x0000000f,
-        SHCOLSTATE_ONBYDEFAULT = 0x00000010,
-        SHCOLSTATE_SLOW = 0x00000020,
-        SHCOLSTATE_EXTENDED = 0x00000040,
-        SHCOLSTATE_SECONDARYUI = 0x00000080,
-        SHCOLSTATE_HIDDEN = 0x00000100,
-        SHCOLSTATE_PREFER_VARCMP = 0x00000200
-    } SHCOLSTATE;
-
-    typedef DWORD SHCOLSTATEF;
-
     typedef struct
     {
         GUID    fmtid;
@@ -2310,6 +2294,10 @@ interface IBrowserService : IUnknown
 
        typedef BASEBROWSERDATA *LPBASEBROWSERDATA;
 
+cpp_quote("#if 0")
+typedef HANDLE HMONITOR;
+cpp_quote("#endif /* 0 */")
+
        typedef struct SToolbarItem
        {
                IDockingWindow          *ptbar;
index 3a922b8..021d467 100644 (file)
@@ -21,8 +21,6 @@
 
 import "wtypes.idl";
 
-
-
 cpp_quote("#include <pshpack1.h>")
 typedef struct
 {
@@ -34,60 +32,13 @@ typedef const SHITEMID *LPCSHITEMID;
 typedef struct _ITEMIDLIST
 {
     SHITEMID mkid; /* first itemid in list */
-} ITEMIDLIST;
-
-cpp_quote("#if defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)")
-cpp_quote("typedef struct _ITEMIDLIST_RELATIVE : ITEMIDLIST {} ITEMIDLIST_RELATIVE;")
-cpp_quote("typedef struct _ITEMID_CHILD : ITEMIDLIST_RELATIVE {} ITEMID_CHILD;")
-cpp_quote("typedef struct _ITEMIDLIST_ABSOLUTE : ITEMIDLIST_RELATIVE {} ITEMIDLIST_ABSOLUTE;")
-cpp_quote("#else /* !(defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)) */")
-typedef ITEMIDLIST ITEMIDLIST_RELATIVE;
-typedef ITEMIDLIST ITEMID_CHILD;
-typedef ITEMIDLIST ITEMIDLIST_ABSOLUTE;
-cpp_quote("#endif /* defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) */")
-
+} ITEMIDLIST,*LPITEMIDLIST;
+typedef const ITEMIDLIST *LPCITEMIDLIST;
+typedef LPITEMIDLIST PITEMID_CHILD;
+typedef LPCITEMIDLIST PCUITEMID_CHILD;
+typedef LPCITEMIDLIST *PCUITEMID_CHILD_ARRAY;
 cpp_quote("#include <poppack.h>")
 
-typedef [unique] BYTE_BLOB * wirePIDL;
-typedef ITEMIDLIST /*__unaligned*/ * LPITEMIDLIST;
-typedef const ITEMIDLIST /*__unaligned*/ * LPCITEMIDLIST;
-
-cpp_quote("#if defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)")
-typedef ITEMIDLIST_ABSOLUTE * PIDLIST_ABSOLUTE;
-typedef const ITEMIDLIST_ABSOLUTE * PCIDLIST_ABSOLUTE;
-typedef const ITEMIDLIST_ABSOLUTE /*__unaligned*/ * PCUIDLIST_ABSOLUTE;
-typedef ITEMIDLIST_RELATIVE * PIDLIST_RELATIVE;
-typedef const ITEMIDLIST_RELATIVE * PCIDLIST_RELATIVE;
-typedef ITEMIDLIST_RELATIVE /*__unaligned*/ * PUIDLIST_RELATIVE;
-typedef const ITEMIDLIST_RELATIVE /*__unaligned*/ * PCUIDLIST_RELATIVE;
-typedef ITEMID_CHILD * PITEMID_CHILD;
-typedef const ITEMID_CHILD * PCITEMID_CHILD;
-typedef ITEMID_CHILD /*__unaligned*/ * PUITEMID_CHILD;
-typedef const ITEMID_CHILD /*__unaligned*/ * PCUITEMID_CHILD;
-
-typedef PCUITEMID_CHILD const *PCUITEMID_CHILD_ARRAY;
-typedef PCUIDLIST_RELATIVE const *PCUIDLIST_RELATIVE_ARRAY;
-typedef PCIDLIST_ABSOLUTE const *PCIDLIST_ABSOLUTE_ARRAY;
-typedef PCUIDLIST_ABSOLUTE const *PCUIDLIST_ABSOLUTE_ARRAY;
-cpp_quote("#else /* !(defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)) */")
-cpp_quote("#define PIDLIST_ABSOLUTE         LPITEMIDLIST")
-cpp_quote("#define PCIDLIST_ABSOLUTE        LPCITEMIDLIST")
-cpp_quote("#define PCUIDLIST_ABSOLUTE       LPCITEMIDLIST")
-cpp_quote("#define PIDLIST_RELATIVE         LPITEMIDLIST")
-cpp_quote("#define PCIDLIST_RELATIVE        LPCITEMIDLIST")
-cpp_quote("#define PUIDLIST_RELATIVE        LPITEMIDLIST")
-cpp_quote("#define PCUIDLIST_RELATIVE       LPCITEMIDLIST")
-cpp_quote("#define PITEMID_CHILD            LPITEMIDLIST")
-cpp_quote("#define PCITEMID_CHILD           LPCITEMIDLIST")
-cpp_quote("#define PUITEMID_CHILD           LPITEMIDLIST")
-cpp_quote("#define PCUITEMID_CHILD          LPCITEMIDLIST")
-cpp_quote("#define PCUITEMID_CHILD_ARRAY    LPCITEMIDLIST *")
-cpp_quote("#define PCUIDLIST_RELATIVE_ARRAY LPCITEMIDLIST *")
-cpp_quote("#define PCIDLIST_ABSOLUTE_ARRAY  LPCITEMIDLIST *")
-cpp_quote("#define PCUIDLIST_ABSOLUTE_ARRAY LPCITEMIDLIST *")
-cpp_quote("#endif /* defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) */")
-
-
 #ifndef MAX_PATH
 #define MAX_PATH 260
 #endif
@@ -103,7 +54,7 @@ typedef enum tagSTRRET_TYPE
     STRRET_CSTR = 2
 } STRRET_TYPE;
 
-cpp_quote("#include <pshpack4.h>")
+cpp_quote("#include <pshpack8.h>")
 typedef struct _STRRET
 {
     UINT uType;                        /* STRRET_xxx */
@@ -124,3 +75,29 @@ typedef struct
     STRRET str;
 } SHELLDETAILS, *LPSHELLDETAILS;
 cpp_quote("#include <poppack.h>")
+
+typedef [v1_enum] enum tagSHCOLSTATE
+{
+    SHCOLSTATE_DEFAULT = 0,
+    SHCOLSTATE_TYPE_STR,
+    SHCOLSTATE_TYPE_INT,
+    SHCOLSTATE_TYPE_DATE,
+    SHCOLSTATE_TYPEMASK = 0xf,
+    SHCOLSTATE_ONBYDEFAULT = 0x10,
+    SHCOLSTATE_SLOW = 0x20,
+    SHCOLSTATE_EXTENDED = 0x40,
+    SHCOLSTATE_SECONDARYUI = 0x80,
+    SHCOLSTATE_HIDDEN = 0x100,
+    SHCOLSTATE_PREFER_VARCMP = 0x200,
+    SHCOLSTATE_PREFER_FMTCMP = 0x400,
+    SHCOLSTATE_NOSORTBYFOLDERNESS = 0x800,
+    SHCOLSTATE_VIEWONLY = 0x10000,
+    SHCOLSTATE_BATCHREAD = 0x20000,
+    SHCOLSTATE_NO_GROUPBY = 0x40000,
+    SHCOLSTATE_FIXED_WIDTH = 0x1000,
+    SHCOLSTATE_NODPISCALE = 0x2000,
+    SHCOLSTATE_FIXED_RATIO = 0x4000,
+    SHCOLSTATE_DISPLAYMASK = 0xf000
+} SHCOLSTATE;
+
+typedef DWORD SHCOLSTATEF;
index 669fbcf..35be7f7 100644 (file)
 
 import "oaidl.idl";
 
+cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
+cpp_quote("#undef FindText")
+cpp_quote("#endif")
+
 typedef enum tagTomConstants
 {
     tomFalse       = 0,
@@ -200,23 +204,23 @@ interface ITextDocument : IDispatch
 {
     HRESULT GetName([retval, out]BSTR *pName);
     HRESULT GetSelection([retval, out]ITextSelection **ppSel);
-    HRESULT GetStoryCount([retval, out]long *pCount);
+    HRESULT GetStoryCount([retval, out]LONG *pCount);
     HRESULT GetStoryRanges([retval, out]ITextStoryRanges **ppStories);
-    HRESULT GetSaved([retval, out]long *pValue);
-    HRESULT SetSaved([in]long Value);
+    HRESULT GetSaved([retval, out]LONG *pValue);
+    HRESULT SetSaved([in]LONG Value);
     HRESULT GetDefaultTabStop([retval, out]float *pValue);
     HRESULT SetDefaultTabStop([in]float Value);
     HRESULT New();
-    HRESULT Open([in]VARIANT *pVar, [in]long Flags, [in]long CodePage);
-    HRESULT Save([in]VARIANT *pVar, [in]long Flags, [in]long CodePage);
-    HRESULT Freeze([retval, out]long *pCount);
-    HRESULT Unfreeze([retval, out]long *pCount);
+    HRESULT Open([in]VARIANT *pVar, [in]LONG Flags, [in]LONG CodePage);
+    HRESULT Save([in]VARIANT *pVar, [in]LONG Flags, [in]LONG CodePage);
+    HRESULT Freeze([retval, out]LONG *pCount);
+    HRESULT Unfreeze([retval, out]LONG *pCount);
     HRESULT BeginEditCollection();
     HRESULT EndEditCollection();
-    HRESULT Undo([in]long Count, [retval, out]long *prop);
-    HRESULT Redo([in]long Count, [retval, out]long *prop);
-    HRESULT Range([in]long cp1, [in]long cp2, [retval, out]ITextRange**ppRange);
-    HRESULT RangeFromPoint([in]long x, [in]long y, [retval, out]ITextRange**ppRange);
+    HRESULT Undo([in]LONG Count, [retval, out]LONG *prop);
+    HRESULT Redo([in]LONG Count, [retval, out]LONG *prop);
+    HRESULT Range([in]LONG cp1, [in]LONG cp2, [retval, out]ITextRange **ppRange);
+    HRESULT RangeFromPoint([in]LONG x, [in]LONG y, [retval, out]ITextRange **ppRange);
 }
 
 interface ITextFont;
@@ -230,54 +234,54 @@ interface ITextRange : IDispatch
 {
     HRESULT GetText([retval, out]BSTR *pbstr);
     HRESULT SetText([in]BSTR bstr);
-    HRESULT GetChar([retval, out]long *pch);
-    HRESULT SetChar([in]long ch);
+    HRESULT GetChar([retval, out]LONG *pch);
+    HRESULT SetChar([in]LONG ch);
     HRESULT GetDuplicate([retval, out]ITextRange **ppRange);
     HRESULT GetFormattedText([retval, out]ITextRange **ppRange);
     HRESULT SetFormattedText([in]ITextRange *pRange);
-    HRESULT GetStart([retval, out]long *pcpFirst);
-    HRESULT SetStart([in]long cpFirst);
-    HRESULT GetEnd([retval, out]long *pcpLim);
-    HRESULT SetEnd([in]long cpLim);
+    HRESULT GetStart([retval, out]LONG *pcpFirst);
+    HRESULT SetStart([in]LONG cpFirst);
+    HRESULT GetEnd([retval, out]LONG *pcpLim);
+    HRESULT SetEnd([in]LONG cpLim);
     HRESULT GetFont([retval, out]ITextFont **pFont);
     HRESULT SetFont([in]ITextFont *pFont);
     HRESULT GetPara([retval, out]ITextPara **ppPara);
     HRESULT SetPara([in]ITextPara *pPara);
-    HRESULT GetStoryLength([retval, out]long *pcch);
-    HRESULT GetStoryType([retval, out]long *pValue);
-    HRESULT Collapse([in]long bStart);
-    HRESULT Expand([in]long Unit, [retval, out]long *pDelta);
-    HRESULT GetIndex([in]long Unit, [retval, out]long *pIndex);
-    HRESULT SetIndex([in]long Unit, [in]long Index, [in]long Extend);
-    HRESULT SetRange([in]long cpActive, [in]long cpOther);
-    HRESULT InRange([in]ITextRange *pRange, [retval, out]long *pb);
-    HRESULT InStory([in]ITextRange *pRange, [retval, out]long *pb);
-    HRESULT IsEqual([in]ITextRange *pRange, [retval, out]long *pb);
+    HRESULT GetStoryLength([retval, out]LONG *pcch);
+    HRESULT GetStoryType([retval, out]LONG *pValue);
+    HRESULT Collapse([in]LONG bStart);
+    HRESULT Expand([in]LONG Unit, [retval, out]LONG *pDelta);
+    HRESULT GetIndex([in]LONG Unit, [retval, out]LONG *pIndex);
+    HRESULT SetIndex([in]LONG Unit, [in]LONG Index, [in]LONG Extend);
+    HRESULT SetRange([in]LONG cpActive, [in]LONG cpOther);
+    HRESULT InRange([in]ITextRange *pRange, [retval, out]LONG *pb);
+    HRESULT InStory([in]ITextRange *pRange, [retval, out]LONG *pb);
+    HRESULT IsEqual([in]ITextRange *pRange, [retval, out]LONG *pb);
     HRESULT Select();
-    HRESULT StartOf([in]long Unit, [in]long Extend, [retval, out]long *pDelta);
-    HRESULT EndOf([in]long Unit, [in]long Extend, [retval, out]long *pDelta);
-    HRESULT Move([in]long Unit, [in]long Count, [retval, out]long *pDelta);
-    HRESULT MoveStart([in]long Unit, [in]long Count, [retval, out]long *pDelta);
-    HRESULT MoveEnd([in]long Unit, [in]long Count, [retval, out]long *pDelta);
-    HRESULT MoveWhile([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta);
-    HRESULT MoveStartWhile([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta);
-    HRESULT MoveEndWhile([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta);
-    HRESULT MoveUntil([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta);
-    HRESULT MoveStartUntil([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta);
-    HRESULT MoveEndUntil([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta);
-    HRESULT FindText([in]BSTR bstr, [in]long cch, [in]long Flags, [retval, out]long *pLength);
-    HRESULT FindTextStart([in]BSTR bstr, [in]long cch, [in]long Flags, [retval, out]long *pLength);
-    HRESULT FindTextEnd([in]BSTR bstr, [in]long cch, [in]long Flags, [retval, out]long *pLength);
-    HRESULT Delete([in]long Unit, [in]long Count, [retval, out]long *pDelta);
+    HRESULT StartOf([in]LONG Unit, [in]LONG Extend, [retval, out]LONG *pDelta);
+    HRESULT EndOf([in]LONG Unit, [in]LONG Extend, [retval, out]LONG *pDelta);
+    HRESULT Move([in]LONG Unit, [in]LONG Count, [retval, out]LONG *pDelta);
+    HRESULT MoveStart([in]LONG Unit, [in]LONG Count, [retval, out]LONG *pDelta);
+    HRESULT MoveEnd([in]LONG Unit, [in]LONG Count, [retval, out]LONG *pDelta);
+    HRESULT MoveWhile([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta);
+    HRESULT MoveStartWhile([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta);
+    HRESULT MoveEndWhile([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta);
+    HRESULT MoveUntil([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta);
+    HRESULT MoveStartUntil([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta);
+    HRESULT MoveEndUntil([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta);
+    HRESULT FindText([in]BSTR bstr, [in]LONG cch, [in]LONG Flags, [retval, out]LONG *pLength);
+    HRESULT FindTextStart([in]BSTR bstr, [in]LONG cch, [in]LONG Flags, [retval, out]LONG *pLength);
+    HRESULT FindTextEnd([in]BSTR bstr, [in]LONG cch, [in]LONG Flags, [retval, out]LONG *pLength);
+    HRESULT Delete([in]LONG Unit, [in]LONG Count, [retval, out]LONG *pDelta);
     HRESULT Cut([out]VARIANT *pVar);
     HRESULT Copy([out]VARIANT *pVar);
-    HRESULT Paste([in]VARIANT *pVar, [in]long Format);
-    HRESULT CanPaste([in]VARIANT *pVar, [in]long Format, [retval, out]long *pb);
-    HRESULT CanEdit([retval, out]long *pb);
-    HRESULT ChangeCase([in]long Type);
-    HRESULT GetPoint([in]long Type, [out]long *cx, [out]long *cy);
-    HRESULT SetPoint([in]long x, [in]long y, [in]long Type, [in]long Extend);
-    HRESULT ScrollIntoView([in]long Value);
+    HRESULT Paste([in]VARIANT *pVar, [in]LONG Format);
+    HRESULT CanPaste([in]VARIANT *pVar, [in]LONG Format, [retval, out]LONG *pb);
+    HRESULT CanEdit([retval, out]LONG *pb);
+    HRESULT ChangeCase([in]LONG Type);
+    HRESULT GetPoint([in]LONG Type, [out]LONG *cx, [out]LONG *cy);
+    HRESULT SetPoint([in]LONG x, [in]LONG y, [in]LONG Type, [in]LONG Extend);
+    HRESULT ScrollIntoView([in]LONG Value);
     HRESULT GetEmbeddedObject([retval, out]IUnknown **ppv);
 }
 
@@ -287,15 +291,15 @@ interface ITextRange : IDispatch
 ]
 interface ITextSelection : ITextRange
 {
-    HRESULT GetFlags([retval, out]long *pFlags);
-    HRESULT SetFlags([in]long Flags);
-    HRESULT GetType([retval, out]long *pType);
-    HRESULT MoveLeft([in]long Unit, [in]long Count, [in]long Extend, [retval, out]long *pDelta);
-    HRESULT MoveRight([in]long Unit, [in]long Count, [in]long Extend, [retval, out]long *pDelta);
-    HRESULT MoveUp([in]long Unit, [in]long Count, [in]long Extend, [retval, out]long *pDelta);
-    HRESULT MoveDown([in]long Unit, [in]long Count, [in]long Extend, [retval, out]long *pDelta);
-    HRESULT HomeKey([in]long Unit, [in]long Extend, [retval, out]long *pDelta);
-    HRESULT EndKey([in]long Unit, [in]long Extend, [retval, out]long *pDelta);
+    HRESULT GetFlags([retval, out]LONG *pFlags);
+    HRESULT SetFlags([in]LONG Flags);
+    HRESULT GetType([retval, out]LONG *pType);
+    HRESULT MoveLeft([in]LONG Unit, [in]LONG Count, [in]LONG Extend, [retval, out]LONG *pDelta);
+    HRESULT MoveRight([in]LONG Unit, [in]LONG Count, [in]LONG Extend, [retval, out]LONG *pDelta);
+    HRESULT MoveUp([in]LONG Unit, [in]LONG Count, [in]LONG Extend, [retval, out]LONG *pDelta);
+    HRESULT MoveDown([in]LONG Unit, [in]LONG Count, [in]LONG Extend, [retval, out]LONG *pDelta);
+    HRESULT HomeKey([in]LONG Unit, [in]LONG Extend, [retval, out]LONG *pDelta);
+    HRESULT EndKey([in]LONG Unit, [in]LONG Extend, [retval, out]LONG *pDelta);
     HRESULT TypeText([in]BSTR bstr);
 }
 
@@ -307,59 +311,59 @@ interface ITextFont : IDispatch
 {
     HRESULT GetDuplicate([retval, out]ITextFont **ppFont);
     HRESULT SetDuplicate([in]ITextFont *pFont);
-    HRESULT CanChange([out]long *pB);
-    HRESULT IsEqual([in]ITextFont *pFont, [retval, out]long *pB);
-    HRESULT Reset([in]long Value);
-    HRESULT GetStyle([retval, out]long *pValue);
-    HRESULT SetStyle([in]long Value);
-    HRESULT GetAllCaps([retval, out]long *pValue);
-    HRESULT SetAllCaps([in]long Value);
-    HRESULT GetAnimation([retval, out]long *pValue);
-    HRESULT SetAnimation([in]long Value);
-    HRESULT GetBackColor([retval, out]long *pValue);
-    HRESULT SetBackColor([in]long Value);
-    HRESULT GetBold([retval, out]long *pValue);
-    HRESULT SetBold([in]long Value);
-    HRESULT GetEmboss([retval, out]long *pValue);
-    HRESULT SetEmboss([in]long Value);
-    HRESULT GetForeColor([retval, out]long *pValue);
-    HRESULT SetForeColor([in]long Value);
-    HRESULT GetHidden([retval, out]long *pValue);
-    HRESULT SetHidden([in]long Value);
-    HRESULT GetEngrave([retval, out]long *pValue);
-    HRESULT SetEngrave([in]long Value);
-    HRESULT GetItalic([retval, out]long *pValue);
-    HRESULT SetItalic([in]long Value);
-    HRESULT GetKerning([retval, out]long *pValue);
-    HRESULT SetKerning([in]long Value);
-    HRESULT GetLanguageID([retval, out]long *pValue);
-    HRESULT SetLanguageID([in]long Value);
+    HRESULT CanChange([out]LONG *pB);
+    HRESULT IsEqual([in]ITextFont *pFont, [retval, out]LONG *pB);
+    HRESULT Reset([in]LONG Value);
+    HRESULT GetStyle([retval, out]LONG *pValue);
+    HRESULT SetStyle([in]LONG Value);
+    HRESULT GetAllCaps([retval, out]LONG *pValue);
+    HRESULT SetAllCaps([in]LONG Value);
+    HRESULT GetAnimation([retval, out]LONG *pValue);
+    HRESULT SetAnimation([in]LONG Value);
+    HRESULT GetBackColor([retval, out]LONG *pValue);
+    HRESULT SetBackColor([in]LONG Value);
+    HRESULT GetBold([retval, out]LONG *pValue);
+    HRESULT SetBold([in]LONG Value);
+    HRESULT GetEmboss([retval, out]LONG *pValue);
+    HRESULT SetEmboss([in]LONG Value);
+    HRESULT GetForeColor([retval, out]LONG *pValue);
+    HRESULT SetForeColor([in]LONG Value);
+    HRESULT GetHidden([retval, out]LONG *pValue);
+    HRESULT SetHidden([in]LONG Value);
+    HRESULT GetEngrave([retval, out]LONG *pValue);
+    HRESULT SetEngrave([in]LONG Value);
+    HRESULT GetItalic([retval, out]LONG *pValue);
+    HRESULT SetItalic([in]LONG Value);
+    HRESULT GetKerning([retval, out]LONG *pValue);
+    HRESULT SetKerning([in]LONG Value);
+    HRESULT GetLanguageID([retval, out]LONG *pValue);
+    HRESULT SetLanguageID([in]LONG Value);
     HRESULT GetName([retval, out]BSTR *pValue);
     HRESULT SetName([in]BSTR Value);
-    HRESULT GetOutline([retval, out]long *pValue);
-    HRESULT SetOutline([in]long Value);
-    HRESULT GetPosition([retval, out]long *pValue);
-    HRESULT SetPosition([in]long Value);
-    HRESULT GetProtected([retval, out]long *pValue);
-    HRESULT SetProtected([in]long Value);
-    HRESULT GetShadow([retval, out]long *pValue);
-    HRESULT SetShadow([in]long Value);
-    HRESULT GetSize([retval, out]long *pValue);
-    HRESULT SetSize([in]long Value);
-    HRESULT GetSmallCaps([retval, out]long *pValue);
-    HRESULT SetSmallCaps([in]long Value);
+    HRESULT GetOutline([retval, out]LONG *pValue);
+    HRESULT SetOutline([in]LONG Value);
+    HRESULT GetPosition([retval, out]LONG *pValue);
+    HRESULT SetPosition([in]LONG Value);
+    HRESULT GetProtected([retval, out]LONG *pValue);
+    HRESULT SetProtected([in]LONG Value);
+    HRESULT GetShadow([retval, out]LONG *pValue);
+    HRESULT SetShadow([in]LONG Value);
+    HRESULT GetSize([retval, out]LONG *pValue);
+    HRESULT SetSize([in]LONG Value);
+    HRESULT GetSmallCaps([retval, out]LONG *pValue);
+    HRESULT SetSmallCaps([in]LONG Value);
     HRESULT GetSpacing([retval, out]float *pValue);
     HRESULT SetSpacing([in]float Value);
-    HRESULT GetStrikeThrough([retval, out]long *pValue);
-    HRESULT SetStrikeThrough([in]long Value);
-    HRESULT GetSubscript([retval, out]long *pValue);
-    HRESULT SetSubscript([in]long Value);
-    HRESULT GetSuperscript([retval, out]long *pValue);
-    HRESULT SetSuperscript([in]long Value);
-    HRESULT GetUnderline([retval, out]long *pValue);
-    HRESULT SetUnderline([in]long Value);
-    HRESULT GetWeight([retval, out]long *pValue);
-    HRESULT SetWeight([in]long Value);
+    HRESULT GetStrikeThrough([retval, out]LONG *pValue);
+    HRESULT SetStrikeThrough([in]LONG Value);
+    HRESULT GetSubscript([retval, out]LONG *pValue);
+    HRESULT SetSubscript([in]LONG Value);
+    HRESULT GetSuperscript([retval, out]LONG *pValue);
+    HRESULT SetSuperscript([in]LONG Value);
+    HRESULT GetUnderline([retval, out]LONG *pValue);
+    HRESULT SetUnderline([in]LONG Value);
+    HRESULT GetWeight([retval, out]LONG *pValue);
+    HRESULT SetWeight([in]LONG Value);
 }
 
 [
@@ -370,52 +374,52 @@ interface ITextPara : IDispatch
 {
     HRESULT GetDuplicate([retval, out]ITextPara **ppPara);
     HRESULT SetDuplicate([in]ITextPara *pPara);
-    HRESULT CanChange([out]long *pB);
-    HRESULT IsEqual([in]ITextPara *pPara, [retval, out]long *pB);
-    HRESULT Reset([in]long Value);
-    HRESULT GetStyle([retval, out]long *pValue);
-    HRESULT SetStyle([in]long Value);
-    HRESULT GetAlignment([retval, out]long *pValue);
-    HRESULT SetAlignment([in]long Value);
-    HRESULT GetHyphenation([retval, out]long *pValue);
-    HRESULT SetHyphenation([in]long Value);
+    HRESULT CanChange([out]LONG *pB);
+    HRESULT IsEqual([in]ITextPara *pPara, [retval, out]LONG *pB);
+    HRESULT Reset([in]LONG Value);
+    HRESULT GetStyle([retval, out]LONG *pValue);
+    HRESULT SetStyle([in]LONG Value);
+    HRESULT GetAlignment([retval, out]LONG *pValue);
+    HRESULT SetAlignment([in]LONG Value);
+    HRESULT GetHyphenation([retval, out]LONG *pValue);
+    HRESULT SetHyphenation([in]LONG Value);
     HRESULT GetFirstLineIndent([retval, out]float *pValue);
-    HRESULT GetKeepTogether([retval, out]long *pValue);
-    HRESULT SetKeepTogether([in]long Value);
-    HRESULT GetKeepWithNext([retval, out]long *pValue);
-    HRESULT SetKeepWithNext([in]long Value);
+    HRESULT GetKeepTogether([retval, out]LONG *pValue);
+    HRESULT SetKeepTogether([in]LONG Value);
+    HRESULT GetKeepWithNext([retval, out]LONG *pValue);
+    HRESULT SetKeepWithNext([in]LONG Value);
     HRESULT GetLeftIndent([retval, out]float *pValue);
     HRESULT GetLineSpacing([retval, out]float *pValue);
-    HRESULT GetLineSpacingRule([retval, out]long *pValue);
-    HRESULT GetListAlignment([retval, out]long *pValue);
-    HRESULT SetListAlignment([in]long Value);
-    HRESULT GetListLevelIndex([retval, out]long *pValue);
-    HRESULT SetListLevelIndex([in]long Value);
-    HRESULT GetListStart([retval, out]long *pValue);
-    HRESULT SetListStart([in]long Value);
-    HRESULT GetListTab([retval, out]long *pValue);
-    HRESULT SetListTab([in]long Value);
-    HRESULT GetListType([retval, out]long *pValue);
-    HRESULT SetListType([in]long Value);
-    HRESULT GetNoLineNumber([retval, out]long *pValue);
-    HRESULT SetNoLineNumber([in]long Value);
-    HRESULT GetPageBreakBefore([retval, out]long *pValue);
-    HRESULT SetPageBreakBefore([in]long Value);
+    HRESULT GetLineSpacingRule([retval, out]LONG *pValue);
+    HRESULT GetListAlignment([retval, out]LONG *pValue);
+    HRESULT SetListAlignment([in]LONG Value);
+    HRESULT GetListLevelIndex([retval, out]LONG *pValue);
+    HRESULT SetListLevelIndex([in]LONG Value);
+    HRESULT GetListStart([retval, out]LONG *pValue);
+    HRESULT SetListStart([in]LONG Value);
+    HRESULT GetListTab([retval, out]LONG *pValue);
+    HRESULT SetListTab([in]LONG Value);
+    HRESULT GetListType([retval, out]LONG *pValue);
+    HRESULT SetListType([in]LONG Value);
+    HRESULT GetNoLineNumber([retval, out]LONG *pValue);
+    HRESULT SetNoLineNumber([in]LONG Value);
+    HRESULT GetPageBreakBefore([retval, out]LONG *pValue);
+    HRESULT SetPageBreakBefore([in]LONG Value);
     HRESULT GetRightIndent([retval, out]float *pValue);
     HRESULT SetRightIndent([in]float Value);
     HRESULT SetIndents([in]float StartIndent, [in]float LeftIndent, [in]float RightIndent);
-    HRESULT SetLineSpacing([in]long LineSpacingRule, [in]float LineSpacing);
+    HRESULT SetLineSpacing([in]LONG LineSpacingRule, [in]float LineSpacing);
     HRESULT GetSpaceAfter([retval, out]float *pValue);
     HRESULT SetSpaceAfter([in]float Value);
     HRESULT GetSpaceBefore([retval, out]float *pValue);
     HRESULT SetSpaceBefore([in]float Value);
     HRESULT GetWindowControl([retval, out]float *pValue);
     HRESULT SetWindowControl([in]float Value);
-    HRESULT GetTabCount([retval, out]long *pCount);
-    HRESULT AddTab([in]float tbPos, [in]long tbAlign, [in]long tbLeader);
+    HRESULT GetTabCount([retval, out]LONG *pCount);
+    HRESULT AddTab([in]float tbPos, [in]LONG tbAlign, [in]LONG tbLeader);
     HRESULT ClearAllTabs();
     HRESULT DeleteTab([in]float tbPos);
-    HRESULT GetTab([in]long iTab, [out]float *ptbPos, [out]long *ptbAlign, [out]long *ptbLeader);
+    HRESULT GetTab([in]LONG iTab, [out]float *ptbPos, [out]LONG *ptbAlign, [out]LONG *ptbLeader);
 }
 
 [
@@ -425,6 +429,6 @@ interface ITextPara : IDispatch
 interface ITextStoryRanges : IDispatch
 {
     HRESULT _NewEnum([retval, out]IUnknown **ppUnkEnum);
-    HRESULT Item([in]long Index, [retval, out]ITextRange **ppRange);
-    HRESULT GetCount([retval, out]long *pCount);
+    HRESULT Item([in]LONG Index, [retval, out]ITextRange **ppRange);
+    HRESULT GetCount([retval, out]LONG *pCount);
 }
diff --git a/reactos/include/psdk/tuner.idl b/reactos/include/psdk/tuner.idl
new file mode 100644 (file)
index 0000000..57f4de1
--- /dev/null
@@ -0,0 +1,1817 @@
+
+
+cpp_quote("#pragma once")
+
+#include <olectl.h>
+#ifndef DO_NO_IMPORTS
+import "oaidl.idl";
+import "comcat.idl";
+import "strmif.idl";
+import "bdaiface.idl";
+import "regbag.idl";
+#else
+cpp_quote("#include <bdaiface.h>")
+#endif
+
+interface ITuningSpaceContainer;
+interface ITuningSpace;
+interface IEnumTuningSpaces;
+interface ITuneRequest;
+interface ITuner;
+interface ITunerCap;
+interface IScanningTuner;
+interface IEnumComponentTypes;
+interface IComponentTypes;
+interface IComponentType;
+interface ILanguageComponentType;
+interface IEnumComponents;
+interface IComponents;
+interface IComponent;
+interface IMPEG2ComponentType;
+interface IMPEG2Component;
+interface ILocator;
+interface IATSCLocator;
+interface IDVBSLocator;
+interface IDVBTLocator;
+interface IDVBCLocator;
+interface IDigitalCableLocator;
+interface IAnalogLocator;
+interface IDigitalCableTuneRequest;
+interface IDigitalCableTuningSpace;
+
+[
+    object,
+    uuid(901284E4-33FE-4b69-8D63-634A596F3756),
+    dual,
+    oleautomation,
+    nonextensible,
+    pointer_default(unique)
+]
+interface ITuningSpaces : IDispatch
+{
+    HRESULT get_Count(
+        [out] long *Count);
+
+    HRESULT get__NewEnum(
+        [out] IEnumVARIANT** NewEnum);
+
+    HRESULT get_Item(
+        [in] VARIANT varIndex,
+        [out] ITuningSpace** TuningSpace);
+
+    HRESULT get_EnumTuningSpaces(
+        [out] IEnumTuningSpaces** NewEnum);
+}
+
+[
+    object,
+    uuid(5B692E84-E2F1-11d2-9493-00C04F72D980),
+    dual,
+    oleautomation,
+    hidden,
+    nonextensible,
+    pointer_default(unique)
+]
+interface ITuningSpaceContainer : IDispatch
+{
+    HRESULT get_Count(
+        [out] long *Count);
+
+    HRESULT get__NewEnum(
+        [out] IEnumVARIANT** NewEnum);
+
+    HRESULT get_Item(
+        [in] VARIANT varIndex,
+        [out] ITuningSpace** TuningSpace);
+
+    HRESULT put_Item(
+        [in] VARIANT varIndex,
+        [in] ITuningSpace *TuningSpace);
+
+    HRESULT TuningSpacesForCLSID(
+        [in] BSTR SpaceCLSID,
+        [out] ITuningSpaces** NewColl);
+
+    HRESULT _TuningSpacesForCLSID(
+        [in] REFCLSID SpaceCLSID,
+        [out] ITuningSpaces** NewColl);
+
+    HRESULT TuningSpacesForName(
+        [in] BSTR Name,
+        [out] ITuningSpaces** NewColl);
+
+    HRESULT FindID(
+        [in] ITuningSpace *TuningSpace,
+        [out] long *ID);
+
+    HRESULT Add(
+        [in] ITuningSpace* TuningSpace,
+        [out] VARIANT* NewIndex);
+
+    HRESULT get_EnumTuningSpaces(
+        [out] IEnumTuningSpaces **ppEnum);
+
+    HRESULT Remove(
+        [in] VARIANT Index);
+
+    HRESULT get_MaxCount(
+        [out] long *MaxCount);
+
+    HRESULT put_MaxCount(
+        [in] long MaxCount);
+}
+
+
+[
+    object,
+    uuid(061C6E30-E622-11d2-9493-00C04F72D980),
+    dual,
+    oleautomation,
+    nonextensible,
+    pointer_default(unique)
+]
+interface ITuningSpace : IDispatch
+{
+    HRESULT get_UniqueName(
+        [out] BSTR *Name);
+
+    HRESULT put_UniqueName(
+        [in] BSTR Name);
+
+    HRESULT get_FriendlyName(
+        [out] BSTR *Name);
+
+    HRESULT put_FriendlyName(
+        [in] BSTR Name);
+
+    HRESULT get_CLSID(
+        [out] BSTR* SpaceCLSID);
+
+    HRESULT get_NetworkType(
+        [out] BSTR *NetworkTypeGuid);
+
+    HRESULT put_NetworkType(
+        [in] BSTR NetworkTypeGuid);
+
+    HRESULT get__NetworkType(
+        [out] GUID* NetworkTypeGuid);
+
+    HRESULT put__NetworkType(
+        [in] REFCLSID NetworkTypeGuid);
+
+    HRESULT CreateTuneRequest(
+        [out] ITuneRequest **TuneRequest);
+
+    HRESULT EnumCategoryGUIDs(
+        [out] IEnumGUID **ppEnum);
+
+    HRESULT EnumDeviceMonikers(
+        [out] IEnumMoniker **ppEnum);
+
+    HRESULT get_DefaultPreferredComponentTypes(
+        [out] IComponentTypes** ComponentTypes);
+
+    HRESULT put_DefaultPreferredComponentTypes(
+        [in] IComponentTypes* NewComponentTypes);
+
+    HRESULT get_FrequencyMapping(
+        [out] BSTR *pMapping);
+
+    HRESULT put_FrequencyMapping(
+        BSTR Mapping);
+
+    HRESULT get_DefaultLocator(
+        [out] ILocator **LocatorVal);
+
+    HRESULT put_DefaultLocator(
+        [in]ILocator *LocatorVal);
+
+    HRESULT Clone(
+        [out] ITuningSpace **NewTS);
+}
+
+[
+    hidden,
+    restricted,
+    object,
+    uuid(8B8EB248-FC2B-11d2-9D8C-00C04F72D980),
+    pointer_default(unique)
+]
+interface IEnumTuningSpaces : IUnknown
+{
+    HRESULT Next(
+        [in] ULONG celt,
+        [in, out]ITuningSpace** rgelt,
+        [out] ULONG* pceltFetched);
+
+    HRESULT Skip(
+        [in] ULONG celt);
+
+    HRESULT Reset();
+
+    HRESULT Clone(
+        [out] IEnumTuningSpaces** ppEnum);
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(ADA0B268-3B19-4e5b-ACC4-49F852BE13BA),
+    pointer_default(unique)
+]
+interface IDVBTuningSpace : ITuningSpace
+{
+    HRESULT get_SystemType(
+        [out] DVBSystemType *SysType);
+
+    HRESULT put_SystemType(
+        [in] DVBSystemType SysType);
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(843188B4-CE62-43db-966B-8145A094E040),
+    pointer_default(unique)
+]
+interface IDVBTuningSpace2 : IDVBTuningSpace
+{
+    HRESULT get_NetworkID(
+        [out] long *NetworkID);
+
+    HRESULT put_NetworkID(
+        [in] long NetworkID);
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(CDF7BE60-D954-42fd-A972-78971958E470),
+    pointer_default(unique)
+]
+interface IDVBSTuningSpace : IDVBTuningSpace2
+{
+
+    HRESULT get_LowOscillator(
+        [out] long *LowOscillator);
+
+    HRESULT put_LowOscillator(
+        [in] long LowOscillator);
+
+    HRESULT get_HighOscillator(
+        [out] long *HighOscillator);
+
+    HRESULT put_HighOscillator(
+        [in] long HighOscillator);
+
+    HRESULT get_LNBSwitch(
+        [out] long *LNBSwitch);
+
+    HRESULT put_LNBSwitch(
+        [in] long LNBSwitch);
+
+    HRESULT get_InputRange(
+        [out] BSTR *InputRange);
+
+    HRESULT put_InputRange(
+        [in] BSTR InputRange);
+
+    HRESULT get_SpectralInversion(
+        [out] SpectralInversion *SpectralInversionVal);
+
+    HRESULT put_SpectralInversion(
+        [in] SpectralInversion SpectralInversionVal);
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(E48244B8-7E17-4f76-A763-5090FF1E2F30),
+    pointer_default(unique)
+]
+interface IAuxInTuningSpace : ITuningSpace
+{
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(B10931ED-8BFE-4AB0-9DCE-E469C29A9729),
+    pointer_default(unique)
+]
+interface IAuxInTuningSpace2 : IAuxInTuningSpace
+{
+    HRESULT get_CountryCode([out] long *CountryCodeVal);
+
+    HRESULT put_CountryCode([in] long NewCountryCodeVal);
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(2A6E293C-2595-11d3-B64C-00C04F79498E),
+    pointer_default(unique)
+]
+interface IAnalogTVTuningSpace : ITuningSpace
+{
+    HRESULT get_MinChannel(
+        [out] long *MinChannelVal);
+
+    HRESULT put_MinChannel(
+        [in] long NewMinChannelVal);
+
+    HRESULT get_MaxChannel(
+        [out] long *MaxChannelVal);
+
+    HRESULT put_MaxChannel(
+        [in] long NewMaxChannelVal);
+
+    HRESULT get_InputType(
+        [out] TunerInputType *InputTypeVal);
+
+    HRESULT put_InputType(
+        [in] TunerInputType NewInputTypeVal);
+
+    HRESULT get_CountryCode(
+        [out] long *CountryCodeVal);
+
+    HRESULT put_CountryCode(
+        [in] long NewCountryCodeVal);
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(0369B4E2-45B6-11d3-B650-00C04F79498E),
+    pointer_default(unique)
+]
+interface IATSCTuningSpace : IAnalogTVTuningSpace
+{
+    HRESULT get_MinMinorChannel(
+        [out] long *MinMinorChannelVal);
+
+    HRESULT put_MinMinorChannel(
+        [in] long NewMinMinorChannelVal);
+
+    HRESULT get_MaxMinorChannel(
+        [out] long *MaxMinorChannelVal);
+
+    HRESULT put_MaxMinorChannel(
+        [in] long NewMaxMinorChannelVal);
+
+    HRESULT get_MinPhysicalChannel(
+        [out] long *MinPhysicalChannelVal);
+
+    HRESULT put_MinPhysicalChannel(
+        [in] long NewMinPhysicalChannelVal);
+
+    HRESULT get_MaxPhysicalChannel(
+        [out] long *MaxPhysicalChannelVal);
+
+    HRESULT put_MaxPhysicalChannel(
+        [in] long NewMaxPhysicalChannelVal);
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(013F9F9C-B449-4ec7-A6D2-9D4F2FC70AE5),
+    pointer_default(unique)
+]
+interface IDigitalCableTuningSpace : IATSCTuningSpace
+{
+    HRESULT get_MinMajorChannel(
+        [out] long *MinMajorChannelVal);
+
+    HRESULT put_MinMajorChannel(
+        [in] long NewMinMajorChannelVal);
+
+    HRESULT get_MaxMajorChannel(
+        [out] long *MaxMajorChannelVal);
+
+    HRESULT put_MaxMajorChannel(
+        [in] long NewMaxMajorChannelVal);
+
+    HRESULT get_MinSourceID(
+        [out] long *MinSourceIDVal);
+
+    HRESULT put_MinSourceID(
+        [in] long NewMinSourceIDVal);
+
+    HRESULT get_MaxSourceID(
+        [out] long *MaxSourceIDVal);
+
+    HRESULT put_MaxSourceID(
+        [in] long NewMaxSourceIDVal);
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(2A6E293B-2595-11d3-B64C-00C04F79498E),
+    pointer_default(unique)
+]
+interface IAnalogRadioTuningSpace : ITuningSpace
+{
+    HRESULT get_MinFrequency(
+        [out] long *MinFrequencyVal);
+
+    HRESULT put_MinFrequency(
+        [in] long NewMinFrequencyVal);
+
+    HRESULT get_MaxFrequency(
+        [out] long *MaxFrequencyVal);
+
+    HRESULT put_MaxFrequency(
+        [in] long NewMaxFrequencyVal);
+
+    HRESULT get_Step(
+        [out] long *StepVal);
+
+    HRESULT put_Step(
+        [in] long NewStepVal);
+}
+
+[
+    object,
+    hidden,
+    dual,
+    oleautomation,
+    nonextensible,
+    uuid(39DD45DA-2DA8-46BA-8A8A-87E2B73D983A),
+    pointer_default(unique)
+]
+interface IAnalogRadioTuningSpace2 : IAnalogRadioTuningSpace {
+    HRESULT get_CountryCode([out] long *CountryCodeVal);
+    HRESULT put_CountryCode([in] long NewCountryCodeVal);
+}
+[
+    object,
+    nonextensible,
+    uuid(07DDC146-FC3D-11d2-9D8C-00C04F72D980),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface ITuneRequest : IDispatch
+{
+    HRESULT get_TuningSpace(
+        [out] ITuningSpace **TuningSpace);
+
+    HRESULT get_Components(
+        [out] IComponents **Components);
+
+    HRESULT Clone(
+        [out] ITuneRequest **NewTuneRequest);
+
+    HRESULT get_Locator(
+        [out] ILocator **Locator);
+
+    HRESULT put_Locator(
+        [in] ILocator *Locator);
+}
+
+[
+    object,
+    nonextensible,
+    uuid(0369B4E0-45B6-11d3-B650-00C04F79498E),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IChannelTuneRequest : ITuneRequest
+{
+    HRESULT get_Channel(
+        [out] long *Channel);
+
+    HRESULT put_Channel(
+        [in] long Channel);
+}
+
+[
+    object,
+    nonextensible,
+    uuid(0369B4E1-45B6-11d3-B650-00C04F79498E),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IATSCChannelTuneRequest : IChannelTuneRequest
+{
+    HRESULT get_MinorChannel(
+        [out] long *MinorChannel);
+
+    HRESULT put_MinorChannel(
+        [in] long MinorChannel);
+}
+
+[
+    object,
+    nonextensible,
+    uuid(BAD7753B-6B37-4810-AE57-3CE0C4A9E6CB),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IDigitalCableTuneRequest : IATSCChannelTuneRequest
+{
+    HRESULT get_MajorChannel(
+        [out] long *pMajorChannel);
+
+    HRESULT put_MajorChannel(
+        [in] long MajorChannel);
+
+    HRESULT get_SourceID(
+        [out] long *pSourceID);
+
+    HRESULT put_SourceID(
+        [in] long SourceID);
+}
+
+
+[
+    object,
+    nonextensible,
+    uuid(0D6F567E-A636-42bb-83BA-CE4C1704AFA2),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IDVBTuneRequest : ITuneRequest
+{
+    HRESULT get_ONID(
+        [out] long *ONID);
+
+    HRESULT put_ONID(
+        [in] long ONID);
+
+    HRESULT get_TSID(
+        [out] long *TSID);
+
+    HRESULT put_TSID(
+        [in] long TSID);
+
+    HRESULT get_SID(
+        [out] long *SID);
+
+    HRESULT put_SID(
+        [in] long SID);
+}
+
+[
+    object,
+    nonextensible,
+    uuid(EB7D987F-8A01-42ad-B8AE-574DEEE44D1A),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IMPEG2TuneRequest : ITuneRequest
+{
+    HRESULT get_TSID(
+        [out] long *TSID);
+
+    HRESULT put_TSID(
+        [in] long TSID);
+
+    HRESULT get_ProgNo(
+        [out] long *ProgNo);
+
+    HRESULT put_ProgNo(
+        [in] long ProgNo);
+}
+
+[
+    object,
+    nonextensible,
+    hidden,
+    uuid(14E11ABD-EE37-4893-9EA1-6964DE933E39),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IMPEG2TuneRequestFactory : IDispatch
+{
+    HRESULT CreateTuneRequest(
+        [in] ITuningSpace *TuningSpace,
+        [out] IMPEG2TuneRequest **TuneRequest);
+}
+
+[
+    object,
+    hidden,
+    restricted,
+    nonextensible,
+    uuid(1B9D5FC3-5BBC-4b6c-BB18-B9D10E3EEEBF),
+    pointer_default(unique)
+]
+interface IMPEG2TuneRequestSupport : IUnknown
+{
+}
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(E60DFA45-8D56-4e65-A8AB-D6BE9412C249),
+    pointer_default(unique)
+]
+interface ITunerCap : IUnknown
+{
+    HRESULT get_SupportedNetworkTypes(
+        [in] ULONG ulcNetworkTypesMax, 
+        [out] ULONG *pulcNetworkTypes, 
+        [in, out] GUID *pguidNetworkTypes);
+
+    HRESULT get_SupportedVideoFormats(
+        [out] ULONG *pulAMTunerModeType, 
+        [out] ULONG *pulAnalogVideoStandard);
+
+    HRESULT get_AuxInputCount(
+        [in, out] ULONG *pulCompositeCount,
+        [in, out] ULONG *pulSvideoCount);
+}
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(28C52640-018A-11d3-9D8E-00C04F72D980),
+    pointer_default(unique)
+]
+interface ITuner : IUnknown
+{
+    HRESULT get_TuningSpace(
+        [out] ITuningSpace **TuningSpace);
+
+    HRESULT put_TuningSpace(
+        [in] ITuningSpace *TuningSpace);
+
+    HRESULT EnumTuningSpaces(
+        [out] IEnumTuningSpaces **ppEnum);
+
+    HRESULT get_TuneRequest(
+        [out] ITuneRequest **TuneRequest);
+
+    HRESULT put_TuneRequest(
+        [in] ITuneRequest *TuneRequest);
+
+    HRESULT Validate(
+        [in] ITuneRequest *TuneRequest);
+
+    HRESULT get_PreferredComponentTypes(
+        [out] IComponentTypes **ComponentTypes);
+
+    HRESULT put_PreferredComponentTypes(
+        [in] IComponentTypes *ComponentTypes);
+
+    HRESULT get_SignalStrength(
+        [out] long *Strength);
+
+    HRESULT TriggerSignalEvents(
+        [in] long Interval);
+}
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(1DFD0A5C-0284-11d3-9D8E-00C04F72D980),
+    pointer_default(unique)
+]
+interface IScanningTuner : ITuner
+{
+    HRESULT SeekUp();
+
+    HRESULT SeekDown();
+
+    HRESULT ScanUp(
+        [in] long MillisecondsPause);
+
+    HRESULT ScanDown(
+        [in] long MillisecondsPause);
+
+    HRESULT AutoProgram();
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(04BBD195-0E2D-4593-9BD5-4F908BC33CF5),
+    pointer_default(unique)
+]
+interface IScanningTunerEx : IScanningTuner
+{
+    HRESULT GetCurrentLocator(
+        [in]ILocator **pILocator);
+
+    HRESULT PerformExhaustiveScan(
+         [in]  long dwLowerFreq,
+         [in]  long dwHigherFreq,
+         [in]  VARIANT_BOOL bFineTune,
+         [in]  HEVENT hEvent);
+
+    HRESULT TerminateCurrentScan(
+         [out] long *pcurrentFreq);
+
+    HRESULT ResumeCurrentScan(
+         [in] HEVENT hEvent);
+
+    HRESULT GetTunerScanningCapability(
+         [out] long *HardwareAssistedScanning,
+         [out] long *NumStandardsSupported,
+         [out] GUID *BroadcastStandards);
+
+    HRESULT GetTunerStatus(
+         [out] long *SecondsLeft,
+         [out] long *CurrentLockType,
+         [out] long *AutoDetect,
+         [out] long *CurrentFreq);
+
+    HRESULT GetCurrentTunerStandardCapability(
+         [in] GUID CurrentBroadcastStandard,
+         [out] long  *SettlingTime,
+         [out] long  *TvStandardsSupported);
+
+    HRESULT SetScanSignalTypeFilter( 
+        [in] long ScanModulationTypes,
+        [in] long AnalogVideoStandard);
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(6A340DC0-0311-11d3-9D8E-00C04F72D980),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IComponentType : IDispatch
+{
+    HRESULT get_Category(
+        [out] ComponentCategory *Category);
+
+    HRESULT put_Category(
+        [in] ComponentCategory Category);
+
+    HRESULT get_MediaMajorType(
+        [out] BSTR *MediaMajorType);
+
+    HRESULT put_MediaMajorType(
+        [in] BSTR MediaMajorType);
+
+    HRESULT get__MediaMajorType(
+        [out] GUID* MediaMajorTypeGuid);
+
+    HRESULT put__MediaMajorType(
+        [in] REFCLSID MediaMajorTypeGuid);
+
+    HRESULT get_MediaSubType(
+        [out] BSTR *MediaSubType);
+
+    HRESULT put_MediaSubType(
+        [in] BSTR MediaSubType);
+
+    HRESULT get__MediaSubType(
+        [out] GUID* MediaSubTypeGuid);
+
+    HRESULT put__MediaSubType(
+        [in] REFCLSID MediaSubTypeGuid);
+
+    HRESULT get_MediaFormatType(
+        [out] BSTR *MediaFormatType);
+
+    HRESULT put_MediaFormatType(
+        [in] BSTR MediaFormatType);
+
+    HRESULT get__MediaFormatType(
+        [out] GUID* MediaFormatTypeGuid);
+
+    HRESULT put__MediaFormatType(
+        [in] REFCLSID MediaFormatTypeGuid);
+
+    HRESULT get_MediaType(
+        [out] AM_MEDIA_TYPE *MediaType);
+
+    HRESULT put_MediaType(
+        [in] AM_MEDIA_TYPE *MediaType);
+
+    HRESULT Clone(
+        [out] IComponentType **NewCT);
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(B874C8BA-0FA2-11d3-9D8E-00C04F72D980),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface ILanguageComponentType : IComponentType
+{
+    HRESULT get_LangID(
+        [out] long *LangID);
+
+    HRESULT put_LangID(
+        [in] long LangID);
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(2C073D84-B51C-48c9-AA9F-68971E1F6E38),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IMPEG2ComponentType : ILanguageComponentType
+{
+    HRESULT get_StreamType(
+        [out] MPEG2StreamType *MP2StreamType);
+
+    HRESULT put_StreamType(
+        [in] MPEG2StreamType MP2StreamType);
+};
+
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(FC189E4D-7BD4-4125-B3B3-3A76A332CC96),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IATSCComponentType : IMPEG2ComponentType
+{
+    HRESULT get_Flags(
+        [out] long *Flags);
+
+    HRESULT put_Flags(
+        [in] long flags);
+};
+
+[
+    hidden, restricted,
+    object,
+    uuid(8A674B4A-1F63-11d3-B64C-00C04F79498E),
+    pointer_default(unique)
+]
+interface IEnumComponentTypes : IUnknown
+{
+    HRESULT Next(
+        [in] ULONG celt,
+        [in, out]IComponentType** rgelt,
+        [out] ULONG* pceltFetched);
+
+    HRESULT Skip(
+        [in] ULONG celt);
+
+    HRESULT Reset(void);
+
+    HRESULT Clone(
+        [out] IEnumComponentTypes** ppEnum);
+}
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(0DC13D4A-0313-11d3-9D8E-00C04F72D980),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IComponentTypes : IDispatch
+{
+    HRESULT get_Count(
+        [out] long *Count);
+
+    HRESULT get__NewEnum(
+        [out] IEnumVARIANT **ppNewEnum);
+
+    HRESULT EnumComponentTypes(
+        [out] IEnumComponentTypes **ppNewEnum);
+
+    HRESULT get_Item(
+        [in] VARIANT Index,
+        [out] IComponentType **ComponentType);
+
+    HRESULT put_Item(
+        [in] VARIANT Index,
+        [in] IComponentType *ComponentType);
+
+    HRESULT Add(
+        [in] IComponentType *ComponentType,
+        [out] VARIANT *NewIndex);
+
+    HRESULT Remove(
+        [in] VARIANT Index);
+
+    HRESULT Clone([out] IComponentTypes **NewList);
+};
+
+[
+    object,
+    nonextensible,
+    uuid(1A5576FC-0E19-11d3-9D8E-00C04F72D980),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IComponent : IDispatch
+{
+    HRESULT get_Type(
+        [out] IComponentType** CT);
+
+    HRESULT put_Type(
+        [in] IComponentType* CT);
+
+    HRESULT get_DescLangID(
+        [out] long *LangID);
+
+    HRESULT put_DescLangID(
+        [in] long LangID);
+
+    HRESULT get_Status(
+        [out] ComponentStatus *Status);
+
+    HRESULT put_Status(
+        [in] ComponentStatus Status);
+
+    HRESULT get_Description(
+        [out] BSTR *Description);
+
+    HRESULT put_Description(
+        [in] BSTR Description);
+
+    HRESULT Clone(
+        [out] IComponent **NewComponent);
+
+};
+
+[
+    object,
+    nonextensible,
+    uuid(2CFEB2A8-1787-4A24-A941-C6EAEC39C842),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IAnalogAudioComponentType : IComponentType
+{
+    HRESULT get_AnalogAudioMode(
+        [out] TVAudioMode *Mode);
+
+    HRESULT put_AnalogAudioMode(
+        [in] TVAudioMode Mode);
+}
+
+[
+    object,
+    nonextensible,
+    uuid(1493E353-1EB6-473c-802D-8E6B8EC9D2A9),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IMPEG2Component : IComponent
+{
+    HRESULT get_PID(
+        [out] long *PID);
+
+    HRESULT put_PID(
+        [in] long PID);
+
+    HRESULT get_PCRPID(
+        [out] long *PCRPID);
+
+    HRESULT put_PCRPID(
+        [in] long PCRPID);
+
+    HRESULT get_ProgramNumber(
+        [out] long *ProgramNumber);
+
+    HRESULT put_ProgramNumber(
+        [in] long ProgramNumber);
+};
+
+[
+    hidden,
+    restricted,
+    object,
+    uuid(2A6E2939-2595-11d3-B64C-00C04F79498E),
+    pointer_default(unique)
+]
+interface IEnumComponents : IUnknown
+{
+    HRESULT Next(
+        [in] ULONG celt,
+        [in, out]IComponent** rgelt,
+        [out] ULONG* pceltFetched);
+
+    HRESULT Skip(
+        [in] ULONG celt);
+
+    HRESULT Reset(void);
+
+    HRESULT Clone(
+        [out] IEnumComponents** ppEnum);
+}
+
+
+
+[
+    object,
+    nonextensible,
+    uuid(39A48091-FFFE-4182-A161-3FF802640E26),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IComponents : IDispatch
+{
+    HRESULT get_Count(
+        [out] long *Count);
+
+    HRESULT get__NewEnum(
+        [out] IEnumVARIANT **ppNewEnum);
+
+    HRESULT EnumComponents(
+        [out] IEnumComponents **ppNewEnum);
+
+    HRESULT get_Item(
+        [in] VARIANT Index,
+        [out] IComponent **ppComponent);
+
+    HRESULT Add(
+        [in] IComponent *Component,
+        [out] VARIANT *NewIndex);
+
+    HRESULT Remove(
+        [in] VARIANT Index);
+
+    HRESULT Clone(
+        [out] IComponents **NewList);
+
+    HRESULT put_Item(
+        [in] VARIANT Index,
+        [in] IComponent *ppComponent);
+
+};
+
+[
+    object,
+    nonextensible,
+    uuid(FCD01846-0E19-11d3-9D8E-00C04F72D980),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IComponentsOld : IDispatch
+{
+    HRESULT get_Count(
+        [out] long *Count);
+
+    HRESULT get__NewEnum(
+        [out] IEnumVARIANT **ppNewEnum);
+
+    HRESULT EnumComponents(
+        [out] IEnumComponents **ppNewEnum);
+
+    HRESULT get_Item(
+        [in] VARIANT Index,
+        [out] IComponent **ppComponent);
+
+    HRESULT Add(
+        [in] IComponent *Component,
+        [out] VARIANT *NewIndex);
+
+    HRESULT Remove(
+        [in] VARIANT Index);
+
+    HRESULT Clone(
+        [out] IComponents **NewList);
+
+};
+
+[
+    object,
+    nonextensible,
+    uuid(286D7F89-760C-4F89-80C4-66841D2507AA),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface ILocator : IDispatch
+{
+
+    HRESULT get_CarrierFrequency(
+        [out] long* Frequency);
+
+    HRESULT put_CarrierFrequency(
+        [in] long Frequency);
+
+    HRESULT get_InnerFEC(
+        [out] FECMethod* FEC);
+
+    HRESULT put_InnerFEC(
+        [in] FECMethod FEC);
+
+    HRESULT get_InnerFECRate(
+        [out] BinaryConvolutionCodeRate* FEC);
+
+    HRESULT put_InnerFECRate(
+        [in] BinaryConvolutionCodeRate FEC);
+
+    HRESULT get_OuterFEC(
+        [out] FECMethod* FEC);
+
+    HRESULT put_OuterFEC(
+        [in] FECMethod FEC);
+
+    HRESULT get_OuterFECRate(
+        [out] BinaryConvolutionCodeRate* FEC);
+
+    HRESULT put_OuterFECRate(
+        [in] BinaryConvolutionCodeRate FEC);
+
+    HRESULT get_Modulation(
+        [out] ModulationType* Modulation);
+
+    HRESULT put_Modulation(
+        [in] ModulationType Modulation);
+
+    HRESULT get_SymbolRate(
+        [out] long* Rate);
+
+    HRESULT put_SymbolRate(
+        [in] long Rate);
+
+    HRESULT Clone(
+        [out] ILocator **NewLocator);
+};
+
+[
+    object,
+    nonextensible,
+    uuid(34D1F26B-E339-430D-ABCE-738CB48984DC),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IAnalogLocator : ILocator
+{
+    HRESULT get_VideoStandard(
+        [out] AnalogVideoStandard* AVS);
+
+    HRESULT put_VideoStandard(
+        [in] AnalogVideoStandard AVS);
+}
+
+[
+    object,
+    nonextensible,
+    uuid(19B595D8-839A-47F0-96DF-4F194F3C768C),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IDigitalLocator : ILocator
+{
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(BF8D986F-8C2B-4131-94D7-4D3D9FCC21EF),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IATSCLocator : IDigitalLocator
+{
+    HRESULT get_PhysicalChannel(
+        [out] long *PhysicalChannel);
+
+    HRESULT put_PhysicalChannel(
+        [in] long PhysicalChannel);
+
+    HRESULT get_TSID(
+        [out] long *TSID);
+
+    HRESULT put_TSID(
+        [in] long TSID);
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(612AA885-66CF-4090-BA0A-566F5312E4CA),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IATSCLocator2 : IATSCLocator
+{
+    HRESULT get_ProgramNumber(
+        [out] long *ProgramNumber);
+
+    HRESULT put_ProgramNumber(
+        [in] long ProgramNumber);
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(48F66A11-171A-419A-9525-BEEECD51584C),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IDigitalCableLocator : IATSCLocator2
+{
+}
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(8664DA16-DDA2-42ac-926A-C18F9127C302),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IDVBTLocator : IDigitalLocator
+{
+    HRESULT get_Bandwidth(
+        [out] long* BandWidthVal);
+
+    HRESULT put_Bandwidth(
+        [in] long BandwidthVal);
+
+    HRESULT get_LPInnerFEC(
+        [out] FECMethod* FEC);
+
+    HRESULT put_LPInnerFEC(
+        [in] FECMethod FEC);
+
+    HRESULT get_LPInnerFECRate(
+        [out] BinaryConvolutionCodeRate* FEC);
+
+    HRESULT put_LPInnerFECRate(
+        [in] BinaryConvolutionCodeRate FEC);
+
+    HRESULT get_HAlpha(
+        [out] HierarchyAlpha* Alpha);
+
+    HRESULT put_HAlpha(
+        [in] HierarchyAlpha Alpha);
+
+    HRESULT get_Guard(
+        [out] GuardInterval* GI);
+
+    HRESULT put_Guard(
+        [in] GuardInterval GI);
+
+    HRESULT get_Mode(
+        [out] TransmissionMode* mode);
+
+    HRESULT put_Mode(
+        [in] TransmissionMode mode);
+
+    HRESULT get_OtherFrequencyInUse(
+        [out] VARIANT_BOOL* OtherFrequencyInUseVal);
+
+    HRESULT put_OtherFrequencyInUse(
+        [in] VARIANT_BOOL OtherFrequencyInUseVal);
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(3D7C353C-0D04-45f1-A742-F97CC1188DC8),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IDVBSLocator : IDigitalLocator
+{
+
+    HRESULT get_SignalPolarisation(
+        [out] Polarisation* PolarisationVal);
+
+    HRESULT put_SignalPolarisation(
+        [in] Polarisation PolarisationVal);
+
+    HRESULT get_WestPosition(
+        [out] VARIANT_BOOL* WestLongitude);
+
+    HRESULT put_WestPosition(
+        [in] VARIANT_BOOL WestLongitude);
+
+    HRESULT get_OrbitalPosition(
+        [out] long* longitude);
+
+    HRESULT put_OrbitalPosition(
+        [in] long longitude);
+
+    HRESULT get_Azimuth(
+        [out] long* Azimuth);
+
+    HRESULT put_Azimuth(
+        [in] long Azimuth);
+
+    HRESULT get_Elevation(
+        [out] long* Elevation);
+
+    HRESULT put_Elevation(
+        [in] long Elevation);
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(6E42F36E-1DD2-43c4-9F78-69D25AE39034),
+    dual,
+    oleautomation,
+    pointer_default(unique)
+]
+interface IDVBCLocator : IDigitalLocator
+{
+};
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(3B21263F-26E8-489d-AAC4-924F7EFD9511),
+    pointer_default(unique)
+]
+interface IBroadcastEvent : IUnknown
+{
+    HRESULT Fire([in] GUID EventID);
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(3d9e3887-1929-423f-8021-43682de95448),
+    pointer_default(unique)
+]
+interface IBroadcastEventEx : IBroadcastEvent
+{
+    HRESULT FireEx(
+        [in] GUID EventID,
+        [in] ULONG Param1,
+        [in] ULONG Param2,
+        [in] ULONG Param3,
+        [in] ULONG Param4);
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(359B3901-572C-4854-BB49-CDEF66606A25),
+    pointer_default(unique)
+]
+interface IRegisterTuner : IUnknown
+{
+    HRESULT Register(
+        [in] ITuner* pTuner,
+        [in] IGraphBuilder* pGraph);
+
+    HRESULT Unregister();
+};
+
+[
+    object,
+    hidden,
+    nonextensible,
+    uuid(B34505E0-2F0E-497b-80BC-D43F3B24ED7F),
+    pointer_default(unique)
+]
+interface IBDAComparable : IUnknown
+{
+    HRESULT CompareExact(
+       [in] IDispatch* CompareTo,
+       [out] long* Result);
+
+    HRESULT CompareEquivalent(
+       [in] IDispatch* CompareTo,
+       [in] DWORD dwFlags,
+       [out] long* Result);
+
+    HRESULT HashExact(
+       [out] __int64* Result);
+
+    HRESULT HashExactIncremental(
+       [in] __int64 PartialResult,
+       [out] __int64* Result);
+
+    HRESULT HashEquivalent(
+       [in] DWORD dwFlags,
+       [out] __int64* Result);
+
+    HRESULT HashEquivalentIncremental(
+       [in] __int64 PartialResult,
+       [in] DWORD dwFlags,
+       [out] __int64* Result);
+};
+
+[
+    uuid(9B085638-018E-11d3-9D8E-00C04F72D980),
+    version(1.0),
+]
+library TunerLib
+{
+    importlib("stdole2.tlb");
+
+[
+    uuid(D02AAC50-027E-11d3-9D8E-00C04F72D980)
+]
+
+    coclass SystemTuningSpaces
+{
+        [default] interface ITuningSpaceContainer;
+};
+
+[
+    noncreatable,
+    hidden,
+    uuid(5FFDC5E6-B83A-4b55-B6E8-C69E765FE9DB)
+]
+    coclass TuningSpace
+{
+    [default] interface ITuningSpace;
+    interface IBDAComparable;
+};
+
+
+[
+    uuid(A2E30750-6C3D-11d3-B653-00C04F79498E)
+]
+    coclass ATSCTuningSpace
+{
+    [default] interface IATSCTuningSpace;
+    interface IBDAComparable;
+};
+
+[
+    uuid(D9BB4CEE-B87A-47F1-AC92-B08D9C7813FC)
+]
+    coclass DigitalCableTuningSpace
+{
+    [default] interface IDigitalCableTuningSpace;
+    interface IBDAComparable;
+};
+
+
+[
+    uuid(8A674B4C-1F63-11d3-B64C-00C04F79498E)
+]
+    coclass AnalogRadioTuningSpace
+{
+    [default] interface IAnalogRadioTuningSpace2;
+    interface IAnalogRadioTuningSpace;
+    interface IBDAComparable;
+};
+
+[
+    uuid(F9769A06-7ACA-4e39-9CFB-97BB35F0E77E)
+]
+    coclass AuxInTuningSpace
+{
+    interface IAuxInTuningSpace;
+    [default] interface IAuxInTuningSpace2;
+    interface IBDAComparable;
+};
+
+[
+    uuid(8A674B4D-1F63-11d3-B64C-00C04F79498E)
+]
+    coclass AnalogTVTuningSpace
+{
+    [default] interface IAnalogTVTuningSpace;
+    interface IBDAComparable;
+};
+
+[
+    uuid(C6B14B32-76AA-4a86-A7AC-5C79AAF58DA7)
+]
+    coclass DVBTuningSpace
+{
+    [default] interface IDVBTuningSpace2;
+    interface IDVBTuningSpace;
+    interface IBDAComparable;
+};
+
+[
+    uuid(B64016F3-C9A2-4066-96F0-BD9563314726)
+]
+    coclass DVBSTuningSpace
+{
+    [default] interface IDVBSTuningSpace;
+    interface IBDAComparable;
+};
+
+
+[
+    uuid(A1A2B1C4-0E3A-11d3-9D8E-00C04F72D980)
+]
+    coclass ComponentTypes
+{
+        [default] interface IComponentTypes;
+        };
+
+[
+    uuid(823535A0-0318-11d3-9D8E-00C04F72D980)
+]
+    coclass ComponentType
+{
+        [default] interface IComponentType;
+        };
+
+[
+    uuid(1BE49F30-0E1B-11d3-9D8E-00C04F72D980)
+]
+    coclass LanguageComponentType
+{
+        [default] interface ILanguageComponentType;
+        };
+
+[
+    uuid(418008F3-CF67-4668-9628-10DC52BE1D08)
+]
+    coclass MPEG2ComponentType
+{
+        [default] interface IMPEG2ComponentType;
+        };
+
+[
+    uuid(A8DCF3D5-0780-4ef4-8A83-2CFFAACB8ACE)
+]
+    coclass ATSCComponentType
+{
+        [default] interface IATSCComponentType;
+        };
+
+[
+    hidden,
+    uuid(809B6661-94C4-49e6-B6EC-3F0F862215AA)
+]
+    coclass Components
+{
+    [default] interface IComponents;
+    interface IComponentsOld;
+};
+
+[
+    hidden,
+    uuid(59DC47A8-116C-11d3-9D8E-00C04F72D980)
+]
+    coclass Component
+{
+        [default] interface IComponent;
+        };
+
+[
+    hidden,
+    uuid(055CB2D7-2969-45cd-914B-76890722F112)
+]
+    coclass MPEG2Component
+{
+        [default] interface IMPEG2Component;
+        };
+
+
+[
+    hidden,
+    uuid(28AB0005-E845-4FFA-AA9B-F4665236141C)
+]
+    coclass AnalogAudioComponentType
+{
+        [default] interface IAnalogAudioComponentType;
+        };
+
+[
+    noncreatable,
+    hidden,
+    uuid(B46E0D38-AB35-4a06-A137-70576B01B39F)
+]
+    coclass TuneRequest
+{
+    [default] interface ITuneRequest;
+    interface IBDAComparable;
+};
+
+
+[
+    hidden,
+    uuid(0369B4E5-45B6-11d3-B650-00C04F79498E)
+]
+    coclass ChannelTuneRequest
+{
+    [default] interface IChannelTuneRequest;
+    interface IBDAComparable;
+};
+
+[
+    hidden,
+    uuid(0369B4E6-45B6-11d3-B650-00C04F79498E)
+]
+    coclass ATSCChannelTuneRequest
+{
+    [default] interface IATSCChannelTuneRequest;
+    interface IBDAComparable;
+};
+
+[
+    hidden,
+    uuid(26EC0B63-AA90-458A-8DF4-5659F2C8A18A)
+]
+    coclass DigitalCableTuneRequest
+{
+    [default] interface IDigitalCableTuneRequest;
+    interface IBDAComparable;
+};
+
+
+[
+    hidden,
+    uuid(0955AC62-BF2E-4cba-A2B9-A63F772D46CF)
+]
+    coclass MPEG2TuneRequest
+{
+    [default] interface IMPEG2TuneRequest;
+    interface IBDAComparable;
+};
+
+[
+    uuid(2C63E4EB-4CEA-41b8-919C-E947EA19A77C)
+]
+    coclass MPEG2TuneRequestFactory
+{
+        [default] interface IMPEG2TuneRequestFactory;
+};
+
+
+[
+    noncreatable,
+    hidden,
+    uuid(0888C883-AC4F-4943-B516-2C38D9B34562)
+]
+    coclass Locator
+{
+        [default] interface ILocator;
+    interface IBDAComparable;
+};
+[
+    noncreatable,
+    hidden,
+    uuid(6E50CC0D-C19B-4BF6-810B-5BD60761F5CC)
+]
+    coclass DigitalLocator
+{
+    [default] interface IDigitalLocator;
+    interface IBDAComparable;
+};
+
+[
+    uuid(49638B91-48AB-48B7-A47A-7D0E75A08EDE)
+]
+    coclass AnalogLocator
+{
+    [default] interface IAnalogLocator;
+    interface IBDAComparable;
+};
+
+[
+    uuid(8872FF1B-98FA-4d7a-8D93-C9F1055F85BB)
+]
+    coclass ATSCLocator
+{
+    [default] interface IATSCLocator2;
+    interface IATSCLocator;
+    interface IBDAComparable;
+};
+
+[
+    uuid(03C06416-D127-407A-AB4C-FDD279ABBE5D)
+]
+    coclass DigitalCableLocator
+{
+    [default] interface IDigitalCableLocator;
+    interface IBDAComparable;
+};
+
+[
+    uuid(9CD64701-BDF3-4d14-8E03-F12983D86664)
+]
+    coclass DVBTLocator
+{
+    [default] interface IDVBTLocator;
+    interface IBDAComparable;
+};
+
+[
+    uuid(1DF7D126-4050-47f0-A7CF-4C4CA9241333)
+]
+    coclass DVBSLocator
+{
+    [default] interface IDVBSLocator;
+    interface IBDAComparable;
+};
+
+[
+    uuid(C531D9FD-9685-4028-8B68-6E1232079F1E)
+]
+    coclass DVBCLocator
+{
+    [default] interface IDVBCLocator;
+    interface IBDAComparable;
+};
+
+[
+    hidden,
+    uuid(15D6504A-5494-499c-886C-973C9E53B9F1)
+]
+    coclass DVBTuneRequest
+{
+        [default] interface IDVBTuneRequest;
+    interface IBDAComparable;
+};
+
+
+[
+    hidden,
+    uuid(8A674B49-1F63-11d3-B64C-00C04F79498E)
+]
+    coclass CreatePropBagOnRegKey
+{
+    interface ICreatePropBagOnRegKey;
+};
+
+[
+    hidden,
+    uuid(0B3FFB92-0919-4934-9D5B-619C719D0202)
+]
+    coclass BroadcastEventService
+{
+    interface IBroadcastEvent;
+};
+
+[
+    hidden,
+    uuid(6438570B-0C08-4a25-9504-8012BB4D50CF)
+]
+    coclass TunerMarshaler
+{
+    interface IRegisterTuner;
+    interface ITuner;
+};
+
+cpp_quote("#define SID_SBroadcastEventService CLSID_BroadcastEventService")
+cpp_quote("#define SID_SContentTuneRequest IID_ITuner")
+cpp_quote("#define SID_ScanningTuner IID_IScanningTuner")
+cpp_quote("#define SID_ScanningTunerEx IID_IScanningTunerEx")
+}
index 78afd16..2ab3b2b 100644 (file)
@@ -24,6 +24,7 @@ import "msxml.idl";
 
 cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
 cpp_quote("#undef GetUserName")
+cpp_quote("#undef SetPort")
 cpp_quote("#endif")
 
 interface IInternetProtocolSink;
@@ -1646,6 +1647,62 @@ interface IUri : IUnknown
         [out] BOOL *pfEqual);
 }
 
+cpp_quote("HRESULT WINAPI CreateUri(LPCWSTR,DWORD,DWORD_PTR,IUri**);")
+cpp_quote("HRESULT WINAPI CreateUriWithFragment(LPCWSTR,LPCWSTR,DWORD,DWORD_PTR,IUri**);")
+cpp_quote("HRESULT WINAPI CreateUriFromMultiByteString(LPCSTR,DWORD,DWORD,DWORD,DWORD_PTR,IUri**);")
+
+cpp_quote("#define Uri_HAS_ABSOLUTE_URI    (1 << Uri_PROPERTY_ABSOLUTE_URI)")
+cpp_quote("#define Uri_HAS_AUTHORITY       (1 << Uri_PROPERTY_AUTHORITY)")
+cpp_quote("#define Uri_HAS_DISPLAY_URI     (1 << Uri_PROPERTY_DISPLAY_URI)")
+cpp_quote("#define Uri_HAS_DOMAIN          (1 << Uri_PROPERTY_DOMAIN)")
+cpp_quote("#define Uri_HAS_EXTENSION       (1 << Uri_PROPERTY_EXTENSION)")
+cpp_quote("#define Uri_HAS_FRAGMENT        (1 << Uri_PROPERTY_FRAGMENT)")
+cpp_quote("#define Uri_HAS_HOST            (1 << Uri_PROPERTY_HOST)")
+cpp_quote("#define Uri_HAS_PASSWORD        (1 << Uri_PROPERTY_PASSWORD)")
+cpp_quote("#define Uri_HAS_PATH            (1 << Uri_PROPERTY_PATH)")
+cpp_quote("#define Uri_HAS_QUERY           (1 << Uri_PROPERTY_QUERY)")
+cpp_quote("#define Uri_HAS_RAW_URI         (1 << Uri_PROPERTY_RAW_URI)")
+cpp_quote("#define Uri_HAS_SCHEME_NAME     (1 << Uri_PROPERTY_SCHEME_NAME)")
+cpp_quote("#define Uri_HAS_USER_NAME       (1 << Uri_PROPERTY_USER_NAME)")
+cpp_quote("#define Uri_HAS_PATH_AND_QUERY  (1 << Uri_PROPERTY_PATH_AND_QUERY)")
+cpp_quote("#define Uri_HAS_USER_INFO       (1 << Uri_PROPERTY_USER_INFO)")
+cpp_quote("#define Uri_HAS_HOST_TYPE       (1 << Uri_PROPERTY_HOST_TYPE)")
+cpp_quote("#define Uri_HAS_PORT            (1 << Uri_PROPERTY_PORT)")
+cpp_quote("#define Uri_HAS_SCHEME          (1 << Uri_PROPERTY_SCHEME)")
+cpp_quote("#define Uri_HAS_ZONE            (1 << Uri_PROPERTY_ZONE)")
+
+cpp_quote("#define Uri_CREATE_ALLOW_RELATIVE                  0x0001")
+cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME  0x0002")
+cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME      0x0004")
+cpp_quote("#define Uri_CREATE_NOFRAG                          0x0008")
+cpp_quote("#define Uri_CREATE_NO_CANONICALIZE                 0x0010")
+cpp_quote("#define Uri_CREATE_CANONICALIZE                    0x0100")
+cpp_quote("#define Uri_CREATE_FILE_USE_DOS_PATH               0x0020")
+cpp_quote("#define Uri_CREATE_DECODE_EXTRA_INFO               0x0040")
+cpp_quote("#define Uri_CREATE_NO_DECODE_EXTRA_INFO            0x0080")
+cpp_quote("#define Uri_CREATE_CRACK_UNKNOWN_SCHEMES           0x0200")
+cpp_quote("#define Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES        0x0400")
+cpp_quote("#define Uri_CREATE_PRE_PROCESS_HTML_URI            0x0800")
+cpp_quote("#define Uri_CREATE_NO_PRE_PROCESS_HTML_URI         0x1000")
+cpp_quote("#define Uri_CREATE_IE_SETTINGS                     0x2000")
+cpp_quote("#define Uri_CREATE_NO_IE_SETTINGS                  0x4000")
+cpp_quote("#define Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS  0x8000")
+
+cpp_quote("#define Uri_DISPLAY_NO_FRAGMENT  0x00000001")
+cpp_quote("#define Uri_PUNYCODE_IDN_HOST    0x00000002")
+cpp_quote("#define Uri_DISPLAY_IDN_HOST     0x00000004")
+
+cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8   0x00000001")
+cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_CP                     0x00000002")
+cpp_quote("#define Uri_ENCODING_HOST_IS_IDN                                  0x00000004")
+cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8                 0x00000008")
+cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_CP                   0x00000010")
+cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8   0x00000020")
+cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_CP                     0x00000040")
+cpp_quote("#define Uri_ENCODING_RFC (Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8)")
+
+cpp_quote("#define UriBuilder_USE_ORIGINAL_FLAGS  0x00000001")
+
 /*****************************************************************************
  * IUriContainer interface
  */
@@ -1660,6 +1717,105 @@ interface IUriContainer : IUnknown
     HRESULT GetIUri([out] IUri **ppIUri);
 }
 
+/*****************************************************************************
+ * IUriBuilder interface
+ */
+[
+    local,
+    object,
+    uuid(4221b2e1-8955-46c0-bd5b-de9897565de7),
+    pointer_default(unique)
+]
+interface IUriBuilder: IUnknown
+{
+    HRESULT CreateUriSimple(
+        [in]  DWORD       dwAllowEncodingPropertyMask,
+        [in]  DWORD_PTR   dwReserved,
+        [out] IUri      **ppIUri);
+
+    HRESULT CreateUri(
+        [in]  DWORD       dwCreateFlags,
+        [in]  DWORD       dwAllowEncodingPropertyMask,
+        [in]  DWORD_PTR   dwReserved,
+        [out] IUri      **ppIUri);
+
+    HRESULT CreateUriWithFlags(
+        [in]  DWORD       dwCreateFlags,
+        [in]  DWORD       dwUriBuilderFlags,
+        [in]  DWORD       dwAllowEncodingPropertyMask,
+        [in]  DWORD_PTR   dwReserved,
+        [out] IUri      **ppIUri);
+
+    HRESULT GetIUri(
+        [out] IUri **ppIUri);
+
+    HRESULT SetIUri(
+        [in, unique] IUri *pIUri);
+
+    HRESULT GetFragment(
+        [out] DWORD   *pcchFragment,
+        [out] LPCWSTR *ppwzFragment);
+
+    HRESULT GetHost(
+        [out] DWORD   *pcchHost,
+        [out] LPCWSTR *ppwzHost);
+
+    HRESULT GetPassword(
+        [out] DWORD   *pcchPassword,
+        [out] LPCWSTR *ppwzPassword);
+
+    HRESULT GetPath(
+        [out] DWORD   *pcchPath,
+        [out] LPCWSTR *ppwzPath);
+
+    HRESULT GetPort(
+        [out] BOOL  *pfHasPort,
+        [out] DWORD *pdwPort);
+
+    HRESULT GetQuery(
+        [out] DWORD   *pcchQuery,
+        [out] LPCWSTR *ppwzQuery);
+
+    HRESULT GetSchemeName(
+        [out] DWORD   *pcchSchemeName,
+        [out] LPCWSTR *ppwzSchemeName);
+
+    HRESULT GetUserName(
+        [out] DWORD   *pcchUserName,
+        [out] LPCWSTR *ppwzUserName);
+
+    HRESULT SetFragment(
+        [in] LPCWSTR pwzNewValue);
+
+    HRESULT SetHost(
+        [in] LPCWSTR pwzNewValue);
+
+    HRESULT SetPassword(
+        [in] LPCWSTR pwzNewValue);
+
+    HRESULT SetPath(
+        [in] LPCWSTR pwzNewValue);
+
+    HRESULT SetPort(
+        [in] BOOL  fHasPort,
+        [in] DWORD dwNewValue);
+
+    HRESULT SetQuery(
+        [in] LPCWSTR pwzNewValue);
+
+    HRESULT SetSchemeName(
+        [in] LPCWSTR pwzNewValue);
+
+    HRESULT SetUserName(
+        [in] LPCWSTR pwzNewValue);
+
+    HRESULT RemoveProperties(
+        [in] DWORD dwPropertyMask);
+
+    HRESULT HasBeenModified(
+        [out] BOOL *pfModified);
+};
+
 /*****************************************************************************
  * IInternetProtocolEx interface
  */
@@ -1740,6 +1896,8 @@ cpp_quote("#define INET_E_DEFAULT_ACTION            INET_E_USE_DEFAULT_PROTOCOLH
 
 cpp_quote("HRESULT WINAPI CoGetClassObjectFromURL(REFCLSID, LPCWSTR, DWORD, DWORD, LPCWSTR, LPBINDCTX, DWORD, LPVOID, REFIID, LPVOID*);")
 cpp_quote("HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk);")
+cpp_quote("HRESULT WINAPI CreateURLMonikerEx(IMoniker*,LPCWSTR,IMoniker**,DWORD);")
+cpp_quote("HRESULT WINAPI CreateURLMonikerEx2(IMoniker*,IUri*,IMoniker**,DWORD);")
 cpp_quote("HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbsc, DWORD dwReserved);")
 cpp_quote("HRESULT WINAPI CompareSecurityIds(BYTE*,DWORD,BYTE*,DWORD,DWORD);")
 cpp_quote("HRESULT WINAPI URLDownloadToFileA(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);")
@@ -1758,6 +1916,7 @@ cpp_quote("HRESULT WINAPI CoInternetCreateZoneManager(IServiceProvider*, IIntern
 cpp_quote("HRESULT WINAPI CoInternetParseUrl(LPCWSTR,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD);")
 cpp_quote("HRESULT WINAPI CoInternetQueryInfo(LPCWSTR,QUERYOPTION,DWORD,LPVOID,DWORD,DWORD*,DWORD);")
 cpp_quote("HRESULT WINAPI CoInternetSetFeatureEnabled(INTERNETFEATURELIST,DWORD,BOOL);")
+cpp_quote("HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR,LPWSTR*,PSUACTION,DWORD);")
 cpp_quote("HRESULT WINAPI CreateFormatEnumerator(UINT,FORMATETC*,IEnumFORMATETC**);")
 cpp_quote("HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi);")
 cpp_quote("HRESULT WINAPI FaultInIEFeature(HWND,uCLSSPEC*,QUERYCONTEXT*,DWORD);")
similarity index 75%
rename from reactos/include/ddk/usb.h
rename to reactos/include/psdk/usb.h
index 4a294b1..8edf7a9 100644 (file)
@@ -1,10 +1,12 @@
-
-
-#ifndef   __USB_H__
-#define   __USB_H__
-
-#ifdef __USBDI_H__
-error
+#pragma once
+
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
 #endif
 
 #ifdef OSR21_COMPAT
@@ -18,49 +20,223 @@ typedef PVOID PMDL;
 #endif
 #endif
 
-#define USBDI_VERSION    0x00000500
+#define USBDI_VERSION    0x00000600
 
 #include "usb200.h"
 
-typedef LONG USBD_STATUS;
-typedef PVOID USBD_PIPE_HANDLE;
-typedef PVOID USBD_CONFIGURATION_HANDLE;
-typedef PVOID USBD_INTERFACE_HANDLE;
+#define USB_PORTATTR_NO_CONNECTOR                       0x00000001
+#define USB_PORTATTR_SHARED_USB2                        0x00000002
+#define USB_PORTATTR_MINI_CONNECTOR                     0x00000004
+#define USB_PORTATTR_OEM_CONNECTOR                      0x00000008
+#define USB_PORTATTR_OWNED_BY_CC                        0x01000000
+#define USB_PORTATTR_NO_OVERCURRENT_UI                  0x02000000
 
-typedef enum _USB_CONTROLLER_FLAVOR
-{
+typedef enum _USB_CONTROLLER_FLAVOR {
   USB_HcGeneric = 0,
   OHCI_Generic = 100,
   OHCI_Hydra,
   OHCI_NEC,
   UHCI_Generic = 200,
-  UHCI_Piix4,
-  UHCI_Piix3,
-  UHCI_Ich2_1,
-  UHCI_Ich2_2,
-  UHCI_Ich1,
+  UHCI_Piix4 = 201,
+  UHCI_Piix3 = 202,
+  UHCI_Ich2 = 203,
+  UHCI_Reserved204 = 204,
+  UHCI_Ich1 = 205,
+  UHCI_Ich3m = 206,
+  UHCI_Ich4 = 207,
+  UHCI_Ich5 = 208,
+  UHCI_Ich6 = 209,
+  UHCI_Intel = 249,
   UHCI_VIA = 250,
+  UHCI_VIA_x01 = 251,
+  UHCI_VIA_x02 = 252,
+  UHCI_VIA_x03 = 253,
+  UHCI_VIA_x04 = 254,
+  UHCI_VIA_x0E_FIFO = 264,
   EHCI_Generic = 1000,
   EHCI_NEC = 2000,
   EHCI_Lucent = 3000
 } USB_CONTROLLER_FLAVOR;
 
-typedef enum _USBD_PIPE_TYPE
-{
+
+#define USB_DEFAULT_DEVICE_ADDRESS                      0
+#define USB_DEFAULT_ENDPOINT_ADDRESS                    0
+#define USB_DEFAULT_MAX_PACKET                          64
+#define URB_FROM_IRP(Irp)                               ((IoGetCurrentIrpStackLocation(Irp))->Parameters.Others.Argument1)
+#define URB_FUNCTION_SELECT_CONFIGURATION               0x0000
+#define URB_FUNCTION_SELECT_INTERFACE                   0x0001
+#define URB_FUNCTION_ABORT_PIPE                         0x0002
+#define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL          0x0003
+#define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL       0x0004
+#define URB_FUNCTION_GET_FRAME_LENGTH                   0x0005
+#define URB_FUNCTION_SET_FRAME_LENGTH                   0x0006
+#define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER           0x0007
+#define URB_FUNCTION_CONTROL_TRANSFER                   0x0008
+#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER         0x0009
+#define URB_FUNCTION_ISOCH_TRANSFER                     0x000A
+#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE         0x000B
+#define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE           0x000C
+#define URB_FUNCTION_SET_FEATURE_TO_DEVICE              0x000D
+#define URB_FUNCTION_SET_FEATURE_TO_INTERFACE           0x000E
+#define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT            0x000F
+#define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE            0x0010
+#define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE         0x0011
+#define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT          0x0012
+#define URB_FUNCTION_GET_STATUS_FROM_DEVICE             0x0013
+#define URB_FUNCTION_GET_STATUS_FROM_INTERFACE          0x0014
+#define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT           0x0015
+#define URB_FUNCTION_RESERVED_0X0016                    0x0016
+#define URB_FUNCTION_VENDOR_DEVICE                      0x0017
+#define URB_FUNCTION_VENDOR_INTERFACE                   0x0018
+#define URB_FUNCTION_VENDOR_ENDPOINT                    0x0019
+#define URB_FUNCTION_CLASS_DEVICE                       0x001A
+#define URB_FUNCTION_CLASS_INTERFACE                    0x001B
+#define URB_FUNCTION_CLASS_ENDPOINT                     0x001C
+#define URB_FUNCTION_RESERVE_0X001D                     0x001D
+#define URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL    0x001E
+#define URB_FUNCTION_CLASS_OTHER                        0x001F
+#define URB_FUNCTION_VENDOR_OTHER                       0x0020
+#define URB_FUNCTION_GET_STATUS_FROM_OTHER              0x0021
+#define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER             0x0022
+#define URB_FUNCTION_SET_FEATURE_TO_OTHER               0x0023
+#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT       0x0024
+#define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT         0x0025
+#define URB_FUNCTION_GET_CONFIGURATION                  0x0026
+#define URB_FUNCTION_GET_INTERFACE                      0x0027
+#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE      0x0028
+#define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE        0x0029
+
+#if (_WIN32_WINNT >= 0x0501)
+
+#define URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR          0x002A
+#define URB_FUNCTION_SYNC_RESET_PIPE                    0x0030
+#define URB_FUNCTION_SYNC_CLEAR_STALL                   0x0031
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define URB_FUNCTION_CONTROL_TRANSFER_EX             0x0032
+#define URB_FUNCTION_RESERVE_0X0033                  0x0033
+#define URB_FUNCTION_RESERVE_0X0034                  0x0034
+
+#endif
+
+#define URB_FUNCTION_RESERVE_0X002B                     0x002B
+#define URB_FUNCTION_RESERVE_0X002C                     0x002C
+#define URB_FUNCTION_RESERVE_0X002D                     0x002D
+#define URB_FUNCTION_RESERVE_0X002E                     0x002E
+#define URB_FUNCTION_RESERVE_0X002F                     0x002F
+
+#define URB_FUNCTION_RESET_PIPE                         URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
+
+#define USBD_TRANSFER_DIRECTION                         0x00000001
+#define USBD_SHORT_TRANSFER_OK                          0x00000002
+#define USBD_START_ISO_TRANSFER_ASAP                    0x00000004
+#define USBD_DEFAULT_PIPE_TRANSFER                      0x00000008
+#define USBD_TRANSFER_DIRECTION_FLAG(flags)             ((flags) & USBD_TRANSFER_DIRECTION)
+
+#define USBD_TRANSFER_DIRECTION_OUT                     0
+#define USBD_TRANSFER_DIRECTION_IN                      1
+#define VALID_TRANSFER_FLAGS_MASK                       (USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION | \
+                                                         USBD_START_ISO_TRANSFER_ASAP | USBD_DEFAULT_PIPE_TRANSFER)
+#define USBD_ISO_START_FRAME_RANGE                      1024
+
+typedef LONG USBD_STATUS;
+
+#define USBD_SUCCESS(Status)                            ((USBD_STATUS)(Status) >= 0)
+#define USBD_PENDING(Status)                            ((ULONG)(Status) >> 30 == 1)
+#define USBD_ERROR(Status)                              ((USBD_STATUS)(Status) < 0)
+#define USBD_STATUS_SUCCESS                             ((USBD_STATUS)0x00000000L)
+#define USBD_STATUS_PENDING                             ((USBD_STATUS)0x40000000L)
+#define USBD_STATUS_CRC                                 ((USBD_STATUS)0xC0000001L)
+#define USBD_STATUS_BTSTUFF                             ((USBD_STATUS)0xC0000002L)
+#define USBD_STATUS_DATA_TOGGLE_MISMATCH                ((USBD_STATUS)0xC0000003L)
+#define USBD_STATUS_STALL_PID                           ((USBD_STATUS)0xC0000004L)
+#define USBD_STATUS_DEV_NOT_RESPONDING                  ((USBD_STATUS)0xC0000005L)
+#define USBD_STATUS_PID_CHECK_FAILURE                   ((USBD_STATUS)0xC0000006L)
+#define USBD_STATUS_UNEXPECTED_PID                      ((USBD_STATUS)0xC0000007L)
+#define USBD_STATUS_DATA_OVERRUN                        ((USBD_STATUS)0xC0000008L)
+#define USBD_STATUS_DATA_UNDERRUN                       ((USBD_STATUS)0xC0000009L)
+#define USBD_STATUS_RESERVED1                           ((USBD_STATUS)0xC000000AL)
+#define USBD_STATUS_RESERVED2                           ((USBD_STATUS)0xC000000BL)
+#define USBD_STATUS_BUFFER_OVERRUN                      ((USBD_STATUS)0xC000000CL)
+#define USBD_STATUS_BUFFER_UNDERRUN                     ((USBD_STATUS)0xC000000DL)
+#define USBD_STATUS_NOT_ACCESSED                        ((USBD_STATUS)0xC000000FL)
+#define USBD_STATUS_FIFO                                ((USBD_STATUS)0xC0000010L)
+#define USBD_STATUS_XACT_ERROR                          ((USBD_STATUS)0xC0000011L)
+#define USBD_STATUS_BABBLE_DETECTED                     ((USBD_STATUS)0xC0000012L)
+#define USBD_STATUS_DATA_BUFFER_ERROR                   ((USBD_STATUS)0xC0000013L)
+#define USBD_STATUS_ENDPOINT_HALTED                     ((USBD_STATUS)0xC0000030L)
+#define USBD_STATUS_INVALID_URB_FUNCTION                ((USBD_STATUS)0x80000200L)
+#define USBD_STATUS_INVALID_PARAMETER                   ((USBD_STATUS)0x80000300L)
+#define USBD_STATUS_ERROR_BUSY                          ((USBD_STATUS)0x80000400L)
+#define USBD_STATUS_INVALID_PIPE_HANDLE                 ((USBD_STATUS)0x80000600L)
+#define USBD_STATUS_NO_BANDWIDTH                        ((USBD_STATUS)0x80000700L)
+#define USBD_STATUS_INTERNAL_HC_ERROR                   ((USBD_STATUS)0x80000800L)
+#define USBD_STATUS_ERROR_SHORT_TRANSFER                ((USBD_STATUS)0x80000900L)
+#define USBD_STATUS_BAD_START_FRAME                     ((USBD_STATUS)0xC0000A00L)
+#define USBD_STATUS_ISOCH_REQUEST_FAILED                ((USBD_STATUS)0xC0000B00L)
+#define USBD_STATUS_FRAME_CONTROL_OWNED                 ((USBD_STATUS)0xC0000C00L)
+#define USBD_STATUS_FRAME_CONTROL_NOT_OWNED             ((USBD_STATUS)0xC0000D00L)
+#define USBD_STATUS_NOT_SUPPORTED                       ((USBD_STATUS)0xC0000E00L)
+#define USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR    ((USBD_STATUS)0xC0000F00L)
+#define USBD_STATUS_INSUFFICIENT_RESOURCES              ((USBD_STATUS)0xC0001000L)
+#define USBD_STATUS_SET_CONFIG_FAILED                   ((USBD_STATUS)0xC0002000L)
+#define USBD_STATUS_BUFFER_TOO_SMALL                    ((USBD_STATUS)0xC0003000L)
+#define USBD_STATUS_INTERFACE_NOT_FOUND                 ((USBD_STATUS)0xC0004000L)
+#define USBD_STATUS_INAVLID_PIPE_FLAGS                  ((USBD_STATUS)0xC0005000L)
+#define USBD_STATUS_TIMEOUT                             ((USBD_STATUS)0xC0006000L)
+#define USBD_STATUS_DEVICE_GONE                         ((USBD_STATUS)0xC0007000L)
+#define USBD_STATUS_STATUS_NOT_MAPPED                   ((USBD_STATUS)0xC0008000L)
+#define USBD_STATUS_HUB_INTERNAL_ERROR                  ((USBD_STATUS)0xC0009000L)
+#define USBD_STATUS_CANCELED                            ((USBD_STATUS)0xC0010000L)
+#define USBD_STATUS_ISO_NOT_ACCESSED_BY_HW              ((USBD_STATUS)0xC0020000L)
+#define USBD_STATUS_ISO_TD_ERROR                        ((USBD_STATUS)0xC0030000L)
+#define USBD_STATUS_ISO_NA_LATE_USBPORT                 ((USBD_STATUS)0xC0040000L)
+#define USBD_STATUS_ISO_NOT_ACCESSED_LATE               ((USBD_STATUS)0xC0050000L)
+#define USBD_STATUS_BAD_DESCRIPTOR                      ((USBD_STATUS)0xC0100000L)
+#define USBD_STATUS_BAD_DESCRIPTOR_BLEN                 ((USBD_STATUS)0xC0100001L)
+#define USBD_STATUS_BAD_DESCRIPTOR_TYPE                 ((USBD_STATUS)0xC0100002L)
+#define USBD_STATUS_BAD_INTERFACE_DESCRIPTOR            ((USBD_STATUS)0xC0100003L)
+#define USBD_STATUS_BAD_ENDPOINT_DESCRIPTOR             ((USBD_STATUS)0xC0100004L)
+#define USBD_STATUS_BAD_INTERFACE_ASSOC_DESCRIPTOR      ((USBD_STATUS)0xC0100005L)
+#define USBD_STATUS_BAD_CONFIG_DESC_LENGTH              ((USBD_STATUS)0xC0100006L)
+#define USBD_STATUS_BAD_NUMBER_OF_INTERFACES            ((USBD_STATUS)0xC0100007L)
+#define USBD_STATUS_BAD_NUMBER_OF_ENDPOINTS             ((USBD_STATUS)0xC0100008L)
+#define USBD_STATUS_BAD_ENDPOINT_ADDRESS                ((USBD_STATUS)0xC0100009L)
+
+typedef PVOID USBD_PIPE_HANDLE;
+typedef PVOID USBD_CONFIGURATION_HANDLE;
+typedef PVOID USBD_INTERFACE_HANDLE;
+
+#if (_WIN32_WINNT >= 0x0501)
+#define USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE              0xFFFFFFFF
+#else
+#define USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE  PAGE_SIZE
+#endif
+
+typedef struct _USBD_VERSION_INFORMATION {
+  ULONG USBDI_Version;
+  ULONG Supported_USB_Version;
+} USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION;
+
+typedef enum _USBD_PIPE_TYPE {
   UsbdPipeTypeControl,
   UsbdPipeTypeIsochronous,
   UsbdPipeTypeBulk,
   UsbdPipeTypeInterrupt
 } USBD_PIPE_TYPE;
 
-typedef struct _USBD_VERSION_INFORMATION
-{
-  ULONG USBDI_Version;
-  ULONG Supported_USB_Version;
-} USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION;
+#define USBD_PIPE_DIRECTION_IN(pipeInformation)         ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK)
+
+typedef struct _USBD_DEVICE_INFORMATION {
+  ULONG OffsetNext;
+  PVOID UsbdDeviceHandle;
+  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
+} USBD_DEVICE_INFORMATION, *PUSBD_DEVICE_INFORMATION;
 
-typedef struct _USBD_PIPE_INFORMATION
-{
+typedef struct _USBD_PIPE_INFORMATION {
   USHORT MaximumPacketSize;
   UCHAR EndpointAddress;
   UCHAR Interval;
@@ -70,15 +246,14 @@ typedef struct _USBD_PIPE_INFORMATION
   ULONG PipeFlags;
 } USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION;
 
-typedef struct _USBD_DEVICE_INFORMATION
-{
-  ULONG OffsetNext;
-  PVOID UsbdDeviceHandle;
-  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
-} USBD_DEVICE_INFORMATION, *PUSBD_DEVICE_INFORMATION;
+#define USBD_PF_CHANGE_MAX_PACKET                       0x00000001
+#define USBD_PF_SHORT_PACKET_OPT                        0x00000002
+#define USBD_PF_ENABLE_RT_THREAD_ACCESS                 0x00000004
+#define USBD_PF_MAP_ADD_TRANSFERS                       0x00000008
+#define USBD_PF_VALID_MASK                              (USBD_PF_CHANGE_MAX_PACKET | USBD_PF_SHORT_PACKET_OPT | \
+                                                         USBD_PF_ENABLE_RT_THREAD_ACCESS | USBD_PF_MAP_ADD_TRANSFERS)
 
-typedef struct _USBD_INTERFACE_INFORMATION
-{
+typedef struct _USBD_INTERFACE_INFORMATION {
   USHORT Length;
   UCHAR InterfaceNumber;
   UCHAR AlternateSetting;
@@ -91,13 +266,11 @@ typedef struct _USBD_INTERFACE_INFORMATION
   USBD_PIPE_INFORMATION Pipes[1];
 } USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION;
 
-struct _URB_HCD_AREA
-{
+struct _URB_HCD_AREA {
   PVOID Reserved8[8];
 };
 
-struct _URB_HEADER
-{
+struct _URB_HEADER {
   USHORT Length;
   USHORT Function;
   USBD_STATUS Status;
@@ -105,54 +278,46 @@ struct _URB_HEADER
   ULONG UsbdFlags;
 };
 
-struct _URB_SELECT_INTERFACE
-{
+struct _URB_SELECT_INTERFACE {
   struct _URB_HEADER Hdr;
   USBD_CONFIGURATION_HANDLE ConfigurationHandle;
   USBD_INTERFACE_INFORMATION Interface;
 };
 
-struct _URB_SELECT_CONFIGURATION
-{
+struct _URB_SELECT_CONFIGURATION {
   struct _URB_HEADER Hdr;
   PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
   USBD_CONFIGURATION_HANDLE ConfigurationHandle;
   USBD_INTERFACE_INFORMATION Interface;
 };
 
-struct _URB_PIPE_REQUEST
-{
+struct _URB_PIPE_REQUEST {
   struct _URB_HEADER Hdr;
   USBD_PIPE_HANDLE PipeHandle;
   ULONG Reserved;
 };
 
-struct _URB_FRAME_LENGTH_CONTROL
-{
+struct _URB_FRAME_LENGTH_CONTROL {
   struct _URB_HEADER Hdr;
 };
 
-struct _URB_GET_FRAME_LENGTH
-{
+struct _URB_GET_FRAME_LENGTH {
   struct _URB_HEADER Hdr;
   ULONG FrameLength;
   ULONG FrameNumber;
 };
 
-struct _URB_SET_FRAME_LENGTH
-{
+struct _URB_SET_FRAME_LENGTH {
   struct _URB_HEADER Hdr;
   LONG FrameLengthDelta;
 };
 
-struct _URB_GET_CURRENT_FRAME_NUMBER
-{
+struct _URB_GET_CURRENT_FRAME_NUMBER {
   struct _URB_HEADER Hdr;
   ULONG FrameNumber;
 };
 
-struct _URB_CONTROL_DESCRIPTOR_REQUEST
-{
+struct _URB_CONTROL_DESCRIPTOR_REQUEST {
   struct _URB_HEADER Hdr;
   PVOID Reserved;
   ULONG Reserved0;
@@ -168,8 +333,7 @@ struct _URB_CONTROL_DESCRIPTOR_REQUEST
   USHORT Reserved2;
 };
 
-struct _URB_CONTROL_GET_STATUS_REQUEST
-{
+struct _URB_CONTROL_GET_STATUS_REQUEST {
   struct _URB_HEADER Hdr;
   PVOID Reserved;
   ULONG Reserved0;
@@ -183,8 +347,7 @@ struct _URB_CONTROL_GET_STATUS_REQUEST
   USHORT Reserved2;
 };
 
-struct _URB_CONTROL_FEATURE_REQUEST
-{
+struct _URB_CONTROL_FEATURE_REQUEST {
   struct _URB_HEADER Hdr;
   PVOID Reserved;
   ULONG Reserved2;
@@ -199,8 +362,7 @@ struct _URB_CONTROL_FEATURE_REQUEST
   USHORT Reserved1;
 };
 
-struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST
-{
+struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST {
   struct _URB_HEADER Hdr;
   PVOID Reserved;
   ULONG TransferFlags;
@@ -216,8 +378,7 @@ struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST
   USHORT Reserved1;
 };
 
-struct _URB_CONTROL_GET_INTERFACE_REQUEST
-{
+struct _URB_CONTROL_GET_INTERFACE_REQUEST {
   struct _URB_HEADER Hdr;
   PVOID Reserved;
   ULONG Reserved0;
@@ -231,8 +392,7 @@ struct _URB_CONTROL_GET_INTERFACE_REQUEST
   USHORT Reserved2;
 };
 
-struct _URB_CONTROL_GET_CONFIGURATION_REQUEST
-{
+struct _URB_CONTROL_GET_CONFIGURATION_REQUEST {
   struct _URB_HEADER Hdr;
   PVOID Reserved;
   ULONG Reserved0;
@@ -244,18 +404,26 @@ struct _URB_CONTROL_GET_CONFIGURATION_REQUEST
   UCHAR Reserved1[8];
 };
 
-typedef struct _OS_STRING
-{
+#if (_WIN32_WINNT >= 0x0501)
+
+#define OS_STRING_DESCRIPTOR_INDEX                      0xEE
+#define MS_GENRE_DESCRIPTOR_INDEX                       0x0001
+#define MS_POWER_DESCRIPTOR_INDEX                       0x0002
+#define MS_OS_STRING_SIGNATURE                          L"MSFT100"
+#define MS_OS_FLAGS_CONTAINERID                         0x02
+
+typedef struct _OS_STRING {
   UCHAR bLength;
   UCHAR bDescriptorType;
   WCHAR MicrosoftString[7];
   UCHAR bVendorCode;
-  UCHAR bPad;
+  union {
+    UCHAR bPad;
+    UCHAR bFlags;
+  };
 } OS_STRING, *POS_STRING;
 
-
-struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST
-{
+struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST {
   struct _URB_HEADER Hdr;
   PVOID Reserved;
   ULONG Reserved0;
@@ -264,17 +432,18 @@ struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST
   PMDL TransferBufferMDL;
   struct _URB *UrbLink;
   struct _URB_HCD_AREA hca;
-  UCHAR   Recipient:5;
-  UCHAR   Reserved1:3;
-  UCHAR   Reserved2;
-  UCHAR   InterfaceNumber;
-  UCHAR   MS_PageIndex;
-  USHORT  MS_FeatureDescriptorIndex;
-  USHORT  Reserved3;
+  UCHAR Recipient:5;
+  UCHAR Reserved1:3;
+  UCHAR Reserved2;
+  UCHAR InterfaceNumber;
+  UCHAR MS_PageIndex;
+  USHORT MS_FeatureDescriptorIndex;
+  USHORT Reserved3;
 };
 
-struct _URB_CONTROL_TRANSFER
-{
+#endif
+
+struct _URB_CONTROL_TRANSFER {
   struct _URB_HEADER Hdr;
   USBD_PIPE_HANDLE PipeHandle;
   ULONG TransferFlags;
@@ -286,8 +455,26 @@ struct _URB_CONTROL_TRANSFER
   UCHAR SetupPacket[8];
 };
 
-struct _URB_BULK_OR_INTERRUPT_TRANSFER
-{
+#if (_WIN32_WINNT >= 0x0600)
+
+struct _URB_CONTROL_TRANSFER_EX {
+  struct _URB_HEADER Hdr;
+  USBD_PIPE_HANDLE PipeHandle;
+  ULONG TransferFlags;
+  ULONG TransferBufferLength;
+  PVOID TransferBuffer;
+  PMDL TransferBufferMDL;
+  ULONG Timeout;
+#ifdef WIN64
+  ULONG Pad;
+#endif
+  struct _URB_HCD_AREA hca;
+  UCHAR SetupPacket[8];
+};
+
+#endif
+
+struct _URB_BULK_OR_INTERRUPT_TRANSFER {
   struct _URB_HEADER Hdr;
   USBD_PIPE_HANDLE PipeHandle;
   ULONG TransferFlags;
@@ -298,15 +485,13 @@ struct _URB_BULK_OR_INTERRUPT_TRANSFER
   struct _URB_HCD_AREA hca;
 };
 
-typedef struct _USBD_ISO_PACKET_DESCRIPTOR
-{
+typedef struct _USBD_ISO_PACKET_DESCRIPTOR {
   ULONG Offset;
   ULONG Length;
   USBD_STATUS Status;
 } USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR;
 
-struct _URB_ISOCH_TRANSFER
-{
+struct _URB_ISOCH_TRANSFER {
   struct _URB_HEADER Hdr;
   USBD_PIPE_HANDLE PipeHandle;
   ULONG TransferFlags;
@@ -321,182 +506,30 @@ struct _URB_ISOCH_TRANSFER
   USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1];
 };
 
-typedef struct _URB
-{
-  union
-  {
-      struct _URB_HEADER
-         UrbHeader;
-      struct _URB_SELECT_INTERFACE
-          UrbSelectInterface;
-      struct _URB_SELECT_CONFIGURATION
-          UrbSelectConfiguration;
-      struct _URB_PIPE_REQUEST
-          UrbPipeRequest;
-      struct _URB_FRAME_LENGTH_CONTROL
-          UrbFrameLengthControl;
-      struct _URB_GET_FRAME_LENGTH
-          UrbGetFrameLength;
-      struct _URB_SET_FRAME_LENGTH
-          UrbSetFrameLength;
-      struct _URB_GET_CURRENT_FRAME_NUMBER
-          UrbGetCurrentFrameNumber;
-      struct _URB_CONTROL_TRANSFER
-          UrbControlTransfer;
-      struct _URB_BULK_OR_INTERRUPT_TRANSFER
-          UrbBulkOrInterruptTransfer;
-      struct _URB_ISOCH_TRANSFER
-          UrbIsochronousTransfer;
-      struct _URB_CONTROL_DESCRIPTOR_REQUEST
-          UrbControlDescriptorRequest;
-      struct _URB_CONTROL_GET_STATUS_REQUEST
-          UrbControlGetStatusRequest;
-      struct _URB_CONTROL_FEATURE_REQUEST
-          UrbControlFeatureRequest;
-      struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST
-          UrbControlVendorClassRequest;
-      struct _URB_CONTROL_GET_INTERFACE_REQUEST
-          UrbControlGetInterfaceRequest;
-      struct _URB_CONTROL_GET_CONFIGURATION_REQUEST
-          UrbControlGetConfigurationRequest;
-      struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST
-          UrbOSFeatureDescriptorRequest;
-    };
+typedef struct _URB {
+  __GNU_EXTENSION union {
+    struct _URB_HEADER UrbHeader;
+    struct _URB_SELECT_INTERFACE UrbSelectInterface;
+    struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration;
+    struct _URB_PIPE_REQUEST UrbPipeRequest;
+    struct _URB_FRAME_LENGTH_CONTROL UrbFrameLengthControl;
+    struct _URB_GET_FRAME_LENGTH UrbGetFrameLength;
+    struct _URB_SET_FRAME_LENGTH UrbSetFrameLength;
+    struct _URB_GET_CURRENT_FRAME_NUMBER UrbGetCurrentFrameNumber;
+    struct _URB_CONTROL_TRANSFER UrbControlTransfer;
+#if (_WIN32_WINNT >= 0x0600)
+    struct _URB_CONTROL_TRANSFER_EX UrbControlTransferEx;
+#endif
+    struct _URB_BULK_OR_INTERRUPT_TRANSFER UrbBulkOrInterruptTransfer;
+    struct _URB_ISOCH_TRANSFER UrbIsochronousTransfer;
+    struct _URB_CONTROL_DESCRIPTOR_REQUEST UrbControlDescriptorRequest;
+    struct _URB_CONTROL_GET_STATUS_REQUEST UrbControlGetStatusRequest;
+    struct _URB_CONTROL_FEATURE_REQUEST UrbControlFeatureRequest;
+    struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST UrbControlVendorClassRequest;
+    struct _URB_CONTROL_GET_INTERFACE_REQUEST UrbControlGetInterfaceRequest;
+    struct _URB_CONTROL_GET_CONFIGURATION_REQUEST UrbControlGetConfigurationRequest;
+#if (_WIN32_WINNT >= 0x0501)
+    struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST UrbOSFeatureDescriptorRequest;
+#endif
+  };
 } URB, *PURB;
-
-#define USB_PORTATTR_NO_CONNECTOR                       0x00000001
-#define USB_PORTATTR_SHARED_USB2                        0x00000002
-#define USB_PORTATTR_MINI_CONNECTOR                     0x00000004
-#define USB_PORTATTR_OEM_CONNECTOR                      0x00000008
-#define USB_PORTATTR_OWNED_BY_CC                        0x01000000
-#define USB_PORTATTR_NO_OVERCURRENT_UI                  0x02000000
-#define USB_DEFAULT_DEVICE_ADDRESS                      0
-#define USB_DEFAULT_ENDPOINT_ADDRESS                    0
-#define USB_DEFAULT_MAX_PACKET                          64
-#define URB_FROM_IRP(Irp)                               ((IoGetCurrentIrpStackLocation(Irp))->Parameters.Others.Argument1)
-#define URB_FUNCTION_SELECT_CONFIGURATION               0x0000
-#define URB_FUNCTION_SELECT_INTERFACE                   0x0001
-#define URB_FUNCTION_ABORT_PIPE                         0x0002
-#define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL          0x0003
-#define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL       0x0004
-#define URB_FUNCTION_GET_FRAME_LENGTH                   0x0005
-#define URB_FUNCTION_SET_FRAME_LENGTH                   0x0006
-#define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER           0x0007
-#define URB_FUNCTION_CONTROL_TRANSFER                   0x0008
-#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER         0x0009
-#define URB_FUNCTION_ISOCH_TRANSFER                     0x000A
-#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE         0x000B
-#define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE           0x000C
-#define URB_FUNCTION_SET_FEATURE_TO_DEVICE              0x000D
-#define URB_FUNCTION_SET_FEATURE_TO_INTERFACE           0x000E
-#define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT            0x000F
-#define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE            0x0010
-#define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE         0x0011
-#define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT          0x0012
-#define URB_FUNCTION_GET_STATUS_FROM_DEVICE             0x0013
-#define URB_FUNCTION_GET_STATUS_FROM_INTERFACE          0x0014
-#define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT           0x0015
-#define URB_FUNCTION_RESERVED_0X0016                    0x0016
-#define URB_FUNCTION_VENDOR_DEVICE                      0x0017
-#define URB_FUNCTION_VENDOR_INTERFACE                   0x0018
-#define URB_FUNCTION_VENDOR_ENDPOINT                    0x0019
-#define URB_FUNCTION_CLASS_DEVICE                       0x001A
-#define URB_FUNCTION_CLASS_INTERFACE                    0x001B
-#define URB_FUNCTION_CLASS_ENDPOINT                     0x001C
-#define URB_FUNCTION_RESERVE_0X001D                     0x001D
-#define URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL    0x001E
-#define URB_FUNCTION_CLASS_OTHER                        0x001F
-#define URB_FUNCTION_VENDOR_OTHER                       0x0020
-#define URB_FUNCTION_GET_STATUS_FROM_OTHER              0x0021
-#define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER             0x0022
-#define URB_FUNCTION_SET_FEATURE_TO_OTHER               0x0023
-#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT       0x0024
-#define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT         0x0025
-#define URB_FUNCTION_GET_CONFIGURATION                  0x0026
-#define URB_FUNCTION_GET_INTERFACE                      0x0027
-#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE      0x0028
-#define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE        0x0029
-#define URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR          0x002A
-#define URB_FUNCTION_RESERVE_0X002B                     0x002B
-#define URB_FUNCTION_RESERVE_0X002C                     0x002C
-#define URB_FUNCTION_RESERVE_0X002D                     0x002D
-#define URB_FUNCTION_RESERVE_0X002E                     0x002E
-#define URB_FUNCTION_RESERVE_0X002F                     0x002F
-#define URB_FUNCTION_SYNC_RESET_PIPE                    0x0030
-#define URB_FUNCTION_SYNC_CLEAR_STALL                   0x0031
-#define URB_FUNCTION_RESET_PIPE                         URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
-#define USBD_TRANSFER_DIRECTION                         0x00000001
-#define USBD_SHORT_TRANSFER_OK                          0x00000002
-#define USBD_START_ISO_TRANSFER_ASAP                    0x00000004
-#define USBD_DEFAULT_PIPE_TRANSFER                      0x00000008
-#define USBD_TRANSFER_DIRECTION_FLAG(flags)             ((flags) & USBD_TRANSFER_DIRECTION)
-
-#define USBD_TRANSFER_DIRECTION_OUT                     0
-#define USBD_TRANSFER_DIRECTION_IN                      1
-#define VALID_TRANSFER_FLAGS_MASK                       (USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION | \
-                                                         USBD_START_ISO_TRANSFER_ASAP | USBD_DEFAULT_PIPE_TRANSFER)
-#define USBD_ISO_START_FRAME_RANGE                      1024
-#define USBD_SUCCESS(Status)                            ((USBD_STATUS)(Status) >= 0)
-#define USBD_PENDING(Status)                            ((ULONG)(Status) >> 30 == 1)
-#define USBD_ERROR(Status)                              ((USBD_STATUS)(Status) < 0)
-#define USBD_STATUS_SUCCESS                             ((USBD_STATUS)0x00000000L)
-#define USBD_STATUS_PENDING                             ((USBD_STATUS)0x40000000L)
-#define USBD_STATUS_CRC                                 ((USBD_STATUS)0xC0000001L)
-#define USBD_STATUS_BTSTUFF                             ((USBD_STATUS)0xC0000002L)
-#define USBD_STATUS_DATA_TOGGLE_MISMATCH                ((USBD_STATUS)0xC0000003L)
-#define USBD_STATUS_STALL_PID                           ((USBD_STATUS)0xC0000004L)
-#define USBD_STATUS_DEV_NOT_RESPONDING                  ((USBD_STATUS)0xC0000005L)
-#define USBD_STATUS_PID_CHECK_FAILURE                   ((USBD_STATUS)0xC0000006L)
-#define USBD_STATUS_UNEXPECTED_PID                      ((USBD_STATUS)0xC0000007L)
-#define USBD_STATUS_DATA_OVERRUN                        ((USBD_STATUS)0xC0000008L)
-#define USBD_STATUS_DATA_UNDERRUN                       ((USBD_STATUS)0xC0000009L)
-#define USBD_STATUS_RESERVED1                           ((USBD_STATUS)0xC000000AL)
-#define USBD_STATUS_RESERVED2                           ((USBD_STATUS)0xC000000BL)
-#define USBD_STATUS_BUFFER_OVERRUN                      ((USBD_STATUS)0xC000000CL)
-#define USBD_STATUS_BUFFER_UNDERRUN                     ((USBD_STATUS)0xC000000DL)
-#define USBD_STATUS_NOT_ACCESSED                        ((USBD_STATUS)0xC000000FL)
-#define USBD_STATUS_FIFO                                ((USBD_STATUS)0xC0000010L)
-#define USBD_STATUS_XACT_ERROR                          ((USBD_STATUS)0xC0000011L)
-#define USBD_STATUS_BABBLE_DETECTED                     ((USBD_STATUS)0xC0000012L)
-#define USBD_STATUS_DATA_BUFFER_ERROR                   ((USBD_STATUS)0xC0000013L)
-#define USBD_STATUS_ENDPOINT_HALTED                     ((USBD_STATUS)0xC0000030L)
-#define USBD_STATUS_INVALID_URB_FUNCTION                ((USBD_STATUS)0x80000200L)
-#define USBD_STATUS_INVALID_PARAMETER                   ((USBD_STATUS)0x80000300L)
-#define USBD_STATUS_ERROR_BUSY                          ((USBD_STATUS)0x80000400L)
-#define USBD_STATUS_INVALID_PIPE_HANDLE                 ((USBD_STATUS)0x80000600L)
-#define USBD_STATUS_NO_BANDWIDTH                        ((USBD_STATUS)0x80000700L)
-#define USBD_STATUS_INTERNAL_HC_ERROR                   ((USBD_STATUS)0x80000800L)
-#define USBD_STATUS_ERROR_SHORT_TRANSFER                ((USBD_STATUS)0x80000900L)
-#define USBD_STATUS_BAD_START_FRAME                     ((USBD_STATUS)0xC0000A00L)
-#define USBD_STATUS_ISOCH_REQUEST_FAILED                ((USBD_STATUS)0xC0000B00L)
-#define USBD_STATUS_FRAME_CONTROL_OWNED                 ((USBD_STATUS)0xC0000C00L)
-#define USBD_STATUS_FRAME_CONTROL_NOT_OWNED             ((USBD_STATUS)0xC0000D00L)
-#define USBD_STATUS_NOT_SUPPORTED                       ((USBD_STATUS)0xC0000E00L)
-#define USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR    ((USBD_STATUS)0xC0000F00L)
-#define USBD_STATUS_INSUFFICIENT_RESOURCES              ((USBD_STATUS)0xC0001000L)
-#define USBD_STATUS_SET_CONFIG_FAILED                   ((USBD_STATUS)0xC0002000L)
-#define USBD_STATUS_BUFFER_TOO_SMALL                    ((USBD_STATUS)0xC0003000L)
-#define USBD_STATUS_INTERFACE_NOT_FOUND                 ((USBD_STATUS)0xC0004000L)
-#define USBD_STATUS_INAVLID_PIPE_FLAGS                  ((USBD_STATUS)0xC0005000L)
-#define USBD_STATUS_TIMEOUT                             ((USBD_STATUS)0xC0006000L)
-#define USBD_STATUS_DEVICE_GONE                         ((USBD_STATUS)0xC0007000L)
-#define USBD_STATUS_STATUS_NOT_MAPPED                   ((USBD_STATUS)0xC0008000L)
-#define USBD_STATUS_CANCELED                            ((USBD_STATUS)0xC0010000L)
-#define USBD_STATUS_ISO_NOT_ACCESSED_BY_HW              ((USBD_STATUS)0xC0020000L)
-#define USBD_STATUS_ISO_TD_ERROR                        ((USBD_STATUS)0xC0030000L)
-#define USBD_STATUS_ISO_NA_LATE_USBPORT                 ((USBD_STATUS)0xC0040000L)
-#define USBD_STATUS_ISO_NOT_ACCESSED_LATE               ((USBD_STATUS)0xC0050000L)
-#define USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE              0xFFFFFFFF
-#define USBD_PF_CHANGE_MAX_PACKET                       0x00000001
-#define USBD_PF_SHORT_PACKET_OPT                        0x00000002
-#define USBD_PF_ENABLE_RT_THREAD_ACCESS                 0x00000004
-#define USBD_PF_MAP_ADD_TRANSFERS                       0x00000008
-#define USBD_PF_VALID_MASK                              (USBD_PF_CHANGE_MAX_PACKET | USBD_PF_SHORT_PACKET_OPT | \
-                                                         USBD_PF_ENABLE_RT_THREAD_ACCESS | USBD_PF_MAP_ADD_TRANSFERS)
-#define OS_STRING_DESCRIPTOR_INDEX                      0xEE
-#define MS_GENRE_DESCRIPTOR_INDEX                       0x0001
-#define MS_POWER_DESCRIPTOR_INDEX                       0x0002
-#define MS_OS_STRING_SIGNATURE                          L"MSFT100"
-#define USBD_PIPE_DIRECTION_IN(pipeInformation)         ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK)
-
-#endif /* __USB_H */
similarity index 71%
rename from reactos/include/ddk/usb100.h
rename to reactos/include/psdk/usb100.h
index 16a474a..7e43d30 100644 (file)
  *
  */
 
-#ifndef __USB100_H
-#define __USB100_H
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#define MAXIMUM_USB_STRING_LENGTH         255
-
-#define USB_DEVICE_CLASS_RESERVED           0x00
-#define USB_DEVICE_CLASS_AUDIO              0x01
-#define USB_DEVICE_CLASS_COMMUNICATIONS     0x02
-#define USB_DEVICE_CLASS_HUMAN_INTERFACE    0x03
-#define USB_DEVICE_CLASS_MONITOR            0x04
-#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05
-#define USB_DEVICE_CLASS_POWER              0x06
-#define USB_DEVICE_CLASS_PRINTER            0x07
-#define USB_DEVICE_CLASS_STORAGE            0x08
-#define USB_DEVICE_CLASS_HUB                0x09
-#define USB_DEVICE_CLASS_VENDOR_SPECIFIC    0xFF
-
-#define USB_RESERVED_DESCRIPTOR_TYPE        0x06
-#define USB_CONFIG_POWER_DESCRIPTOR_TYPE    0x07
-#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 0x08
-
-#define USB_REQUEST_GET_STATUS            0x00
-#define USB_REQUEST_CLEAR_FEATURE         0x01
-#define USB_REQUEST_SET_FEATURE           0x03
-#define USB_REQUEST_SET_ADDRESS           0x05
-#define USB_REQUEST_GET_DESCRIPTOR        0x06
-#define USB_REQUEST_SET_DESCRIPTOR        0x07
-#define USB_REQUEST_GET_CONFIGURATION     0x08
-#define USB_REQUEST_SET_CONFIGURATION     0x09
-#define USB_REQUEST_GET_INTERFACE         0x0A
-#define USB_REQUEST_SET_INTERFACE         0x0B
-#define USB_REQUEST_SYNC_FRAME            0x0C
-
-#define USB_GETSTATUS_SELF_POWERED            0x01
-#define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED   0x02
+#include <pshpack1.h>
 
 #define BMREQUEST_HOST_TO_DEVICE          0
 #define BMREQUEST_DEVICE_TO_HOST          1
@@ -72,111 +40,142 @@ extern "C" {
 #define BMREQUEST_TO_ENDPOINT             2
 #define BMREQUEST_TO_OTHER                3
 
+#define MAXIMUM_USB_STRING_LENGTH         255
+
+#define USB_GETSTATUS_SELF_POWERED            0x01
+#define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED   0x02
+
 /* USB_COMMON_DESCRIPTOR.bDescriptorType constants */
 #define USB_DEVICE_DESCRIPTOR_TYPE        0x01
 #define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02
 #define USB_STRING_DESCRIPTOR_TYPE        0x03
 #define USB_INTERFACE_DESCRIPTOR_TYPE     0x04
 #define USB_ENDPOINT_DESCRIPTOR_TYPE      0x05
-
-typedef struct _USB_COMMON_DESCRIPTOR {
-       UCHAR  bLength;
-       UCHAR  bDescriptorType;
-} USB_COMMON_DESCRIPTOR, *PUSB_COMMON_DESCRIPTOR;
+#define USB_RESERVED_DESCRIPTOR_TYPE        0x06
+#define USB_CONFIG_POWER_DESCRIPTOR_TYPE    0x07
+#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 0x08
 
 #define USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i) ((USHORT)((USHORT)d << 8 | i))
 
+/* USB_ENDPOINT_DESCRIPTOR.bmAttributes constants */
+#define USB_ENDPOINT_TYPE_MASK            0x03
+#define USB_ENDPOINT_TYPE_CONTROL         0x00
+#define USB_ENDPOINT_TYPE_ISOCHRONOUS     0x01
+#define USB_ENDPOINT_TYPE_BULK            0x02
+#define USB_ENDPOINT_TYPE_INTERRUPT       0x03
+
 /* USB_CONFIGURATION_DESCRIPTOR.bmAttributes constants */
 #define USB_CONFIG_POWERED_MASK           0xc0
 #define USB_CONFIG_BUS_POWERED            0x80
 #define USB_CONFIG_SELF_POWERED           0x40
 #define USB_CONFIG_REMOTE_WAKEUP          0x20
 
-#include <pshpack1.h>
-typedef struct _USB_CONFIGURATION_DESCRIPTOR {
-  UCHAR  bLength;
-  UCHAR  bDescriptorType;
-  USHORT  wTotalLength;
-  UCHAR  bNumInterfaces;
-  UCHAR  bConfigurationValue;
-  UCHAR  iConfiguration;
-  UCHAR  bmAttributes;
-  UCHAR  MaxPower;
-} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;
-#include <poppack.h>
-
-typedef struct _USB_DEVICE_DESCRIPTOR {
-  UCHAR  bLength;
-  UCHAR  bDescriptorType;
-  USHORT  bcdUSB;
-  UCHAR  bDeviceClass;
-  UCHAR  bDeviceSubClass;
-  UCHAR  bDeviceProtocol;
-  UCHAR  bMaxPacketSize0;
-  USHORT  idVendor;
-  USHORT  idProduct;
-  USHORT  bcdDevice;
-  UCHAR  iManufacturer;
-  UCHAR  iProduct;
-  UCHAR  iSerialNumber;
-  UCHAR  bNumConfigurations;
-} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;
-
 #define USB_ENDPOINT_DIRECTION_MASK       0x80
 
 #define USB_ENDPOINT_DIRECTION_OUT(x) (!((x) & USB_ENDPOINT_DIRECTION_MASK))
 #define USB_ENDPOINT_DIRECTION_IN(x) ((x) & USB_ENDPOINT_DIRECTION_MASK)
 
-/* USB_ENDPOINT_DESCRIPTOR.bmAttributes constants */
-#define USB_ENDPOINT_TYPE_MASK            0x03
-#define USB_ENDPOINT_TYPE_CONTROL         0x00
-#define USB_ENDPOINT_TYPE_ISOCHRONOUS     0x01
-#define USB_ENDPOINT_TYPE_BULK            0x02
-#define USB_ENDPOINT_TYPE_INTERRUPT       0x03
+#define USB_REQUEST_GET_STATUS            0x00
+#define USB_REQUEST_CLEAR_FEATURE         0x01
+#define USB_REQUEST_SET_FEATURE           0x03
+#define USB_REQUEST_SET_ADDRESS           0x05
+#define USB_REQUEST_GET_DESCRIPTOR        0x06
+#define USB_REQUEST_SET_DESCRIPTOR        0x07
+#define USB_REQUEST_GET_CONFIGURATION     0x08
+#define USB_REQUEST_SET_CONFIGURATION     0x09
+#define USB_REQUEST_GET_INTERFACE         0x0A
+#define USB_REQUEST_SET_INTERFACE         0x0B
+#define USB_REQUEST_SYNC_FRAME            0x0C
 
-#include <pshpack1.h>
-typedef struct _USB_ENDPOINT_DESCRIPTOR {
-  UCHAR  bLength;
-  UCHAR  bDescriptorType;
-  UCHAR  bEndpointAddress;
-  UCHAR  bmAttributes;
-  USHORT  wMaxPacketSize;
-  UCHAR  bInterval;
-} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
-#include <poppack.h>
+#define USB_DEVICE_CLASS_RESERVED           0x00
+#define USB_DEVICE_CLASS_AUDIO              0x01
+#define USB_DEVICE_CLASS_COMMUNICATIONS     0x02
+#define USB_DEVICE_CLASS_HUMAN_INTERFACE    0x03
+#define USB_DEVICE_CLASS_MONITOR            0x04
+#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05
+#define USB_DEVICE_CLASS_POWER              0x06
+#define USB_DEVICE_CLASS_PRINTER            0x07
+#define USB_DEVICE_CLASS_STORAGE            0x08
+#define USB_DEVICE_CLASS_HUB                0x09
+#define USB_DEVICE_CLASS_VENDOR_SPECIFIC    0xFF
 
 #define USB_FEATURE_ENDPOINT_STALL        0x0000
 #define USB_FEATURE_REMOTE_WAKEUP         0x0001
 
+#define USB_FEATURE_INTERFACE_POWER_D0    0x0002
+#define USB_FEATURE_INTERFACE_POWER_D1    0x0003
+#define USB_FEATURE_INTERFACE_POWER_D2    0x0004
+#define USB_FEATURE_INTERFACE_POWER_D3    0x0005
+
+typedef struct _USB_DEVICE_DESCRIPTOR {
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+  USHORT bcdUSB;
+  UCHAR bDeviceClass;
+  UCHAR bDeviceSubClass;
+  UCHAR bDeviceProtocol;
+  UCHAR bMaxPacketSize0;
+  USHORT idVendor;
+  USHORT idProduct;
+  USHORT bcdDevice;
+  UCHAR iManufacturer;
+  UCHAR iProduct;
+  UCHAR iSerialNumber;
+  UCHAR bNumConfigurations;
+} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;
+
+typedef struct _USB_ENDPOINT_DESCRIPTOR {
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+  UCHAR bEndpointAddress;
+  UCHAR bmAttributes;
+  USHORT wMaxPacketSize;
+  UCHAR bInterval;
+} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
+
+typedef struct _USB_CONFIGURATION_DESCRIPTOR {
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+  USHORT wTotalLength;
+  UCHAR bNumInterfaces;
+  UCHAR bConfigurationValue;
+  UCHAR iConfiguration;
+  UCHAR bmAttributes;
+  UCHAR MaxPower;
+} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;
+
 typedef struct _USB_INTERFACE_DESCRIPTOR {
-  UCHAR  bLength;
-  UCHAR  bDescriptorType;
-  UCHAR  bInterfaceNumber;
-  UCHAR  bAlternateSetting;
-  UCHAR  bNumEndpoints;
-  UCHAR  bInterfaceClass;
-  UCHAR  bInterfaceSubClass;
-  UCHAR  bInterfaceProtocol;
-  UCHAR  iInterface;
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+  UCHAR bInterfaceNumber;
+  UCHAR bAlternateSetting;
+  UCHAR bNumEndpoints;
+  UCHAR bInterfaceClass;
+  UCHAR bInterfaceSubClass;
+  UCHAR bInterfaceProtocol;
+  UCHAR iInterface;
 } USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;
 
 typedef struct _USB_STRING_DESCRIPTOR {
-  UCHAR  bLength;
-  UCHAR  bDescriptorType;
-  WCHAR  bString[1];
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+  WCHAR bString[1];
 } USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;
 
-#include <pshpack1.h>
+typedef struct _USB_COMMON_DESCRIPTOR {
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+} USB_COMMON_DESCRIPTOR, *PUSB_COMMON_DESCRIPTOR;
+
 typedef struct _USB_HUB_DESCRIPTOR {
-       UCHAR  bDescriptorLength;
-       UCHAR  bDescriptorType;
-       UCHAR  bNumberOfPorts;
-       USHORT  wHubCharacteristics;
-       UCHAR  bPowerOnToPowerGood;
-       UCHAR  bHubControlCurrent;
-       UCHAR  bRemoveAndPowerMask[64];
+  UCHAR bDescriptorLength;
+  UCHAR bDescriptorType;
+  UCHAR bNumberOfPorts;
+  USHORT wHubCharacteristics;
+  UCHAR bPowerOnToPowerGood;
+  UCHAR bHubControlCurrent;
+  UCHAR bRemoveAndPowerMask[64];
 } USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR;
-#include <poppack.h>
 
 #define USB_SUPPORT_D0_COMMAND            0x01
 #define USB_SUPPORT_D1_COMMAND            0x02
@@ -187,45 +186,38 @@ typedef struct _USB_HUB_DESCRIPTOR {
 #define USB_SUPPORT_D2_WAKEUP             0x20
 
 typedef struct _USB_CONFIGURATION_POWER_DESCRIPTOR {
-       UCHAR  bLength;
-       UCHAR  bDescriptorType;
-       UCHAR  SelfPowerConsumedD0[3];
-       UCHAR  bPowerSummaryId;
-       UCHAR  bBusPowerSavingD1;
-       UCHAR  bSelfPowerSavingD1;
-       UCHAR  bBusPowerSavingD2;
-       UCHAR  bSelfPowerSavingD2;
-       UCHAR  bBusPowerSavingD3;
-       UCHAR  bSelfPowerSavingD3;
-       USHORT  TransitionTimeFromD1;
-       USHORT  TransitionTimeFromD2;
-       USHORT  TransitionTimeFromD3;
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+  UCHAR SelfPowerConsumedD0[3];
+  UCHAR bPowerSummaryId;
+  UCHAR bBusPowerSavingD1;
+  UCHAR bSelfPowerSavingD1;
+  UCHAR bBusPowerSavingD2;
+  UCHAR bSelfPowerSavingD2;
+  UCHAR bBusPowerSavingD3;
+  UCHAR bSelfPowerSavingD3;
+  USHORT TransitionTimeFromD1;
+  USHORT TransitionTimeFromD2;
+  USHORT TransitionTimeFromD3;
 } USB_CONFIGURATION_POWER_DESCRIPTOR, *PUSB_CONFIGURATION_POWER_DESCRIPTOR;
 
-#define USB_FEATURE_INTERFACE_POWER_D0    0x0002
-#define USB_FEATURE_INTERFACE_POWER_D1    0x0003
-#define USB_FEATURE_INTERFACE_POWER_D2    0x0004
-#define USB_FEATURE_INTERFACE_POWER_D3    0x0005
-
-#include <pshpack1.h>
 typedef struct _USB_INTERFACE_POWER_DESCRIPTOR {
-       UCHAR  bLength;
-       UCHAR  bDescriptorType;
-       UCHAR  bmCapabilitiesFlags;
-       UCHAR  bBusPowerSavingD1;
-       UCHAR  bSelfPowerSavingD1;
-       UCHAR  bBusPowerSavingD2;
-       UCHAR  bSelfPowerSavingD2;
-       UCHAR  bBusPowerSavingD3;
-       UCHAR  bSelfPowerSavingD3;
-       USHORT  TransitionTimeFromD1;
-       USHORT  TransitionTimeFromD2;
-       USHORT  TransitionTimeFromD3;
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+  UCHAR bmCapabilitiesFlags;
+  UCHAR bBusPowerSavingD1;
+  UCHAR bSelfPowerSavingD1;
+  UCHAR bBusPowerSavingD2;
+  UCHAR bSelfPowerSavingD2;
+  UCHAR bBusPowerSavingD3;
+  UCHAR bSelfPowerSavingD3;
+  USHORT TransitionTimeFromD1;
+  USHORT TransitionTimeFromD2;
+  USHORT TransitionTimeFromD3;
 } USB_INTERFACE_POWER_DESCRIPTOR, *PUSB_INTERFACE_POWER_DESCRIPTOR;
+
 #include <poppack.h>
 
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* __USB100_H */
diff --git a/reactos/include/psdk/usb200.h b/reactos/include/psdk/usb200.h
new file mode 100644 (file)
index 0000000..ad021d1
--- /dev/null
@@ -0,0 +1,106 @@
+#pragma once
+
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
+#include "usb100.h"
+
+#include <pshpack1.h>
+
+typedef enum _USB_DEVICE_TYPE {
+  Usb11Device = 0,
+  Usb20Device
+} USB_DEVICE_TYPE;
+
+typedef enum _USB_DEVICE_SPEED {
+  UsbLowSpeed = 0,
+  UsbFullSpeed,
+  UsbHighSpeed
+} USB_DEVICE_SPEED;
+
+#define USB_PORT_STATUS_CONNECT                       0x0001
+#define USB_PORT_STATUS_ENABLE                        0x0002
+#define USB_PORT_STATUS_SUSPEND                       0x0004
+#define USB_PORT_STATUS_OVER_CURRENT                  0x0008
+#define USB_PORT_STATUS_RESET                         0x0010
+#define USB_PORT_STATUS_POWER                         0x0100
+#define USB_PORT_STATUS_LOW_SPEED                     0x0200
+#define USB_PORT_STATUS_HIGH_SPEED                    0x0400
+
+
+typedef union _BM_REQUEST_TYPE {
+  struct _BM {
+    UCHAR Recipient:2;
+    UCHAR Reserved:3;
+    UCHAR Type:2;
+    UCHAR Dir:1;
+  } _BM;
+  UCHAR B;
+} BM_REQUEST_TYPE, *PBM_REQUEST_TYPE;
+
+typedef struct _USB_DEFAULT_PIPE_SETUP_PACKET {
+  BM_REQUEST_TYPE bmRequestType;
+  UCHAR bRequest;
+  union _wValue {
+    __GNU_EXTENSION struct {
+      UCHAR LowByte;
+      UCHAR HiByte;
+    };
+    USHORT W;
+  } wValue;
+  union _wIndex {
+    __GNU_EXTENSION struct {
+      UCHAR LowByte;
+      UCHAR HiByte;
+    };
+    USHORT W;
+  } wIndex;
+  USHORT wLength;
+} USB_DEFAULT_PIPE_SETUP_PACKET, *PUSB_DEFAULT_PIPE_SETUP_PACKET;
+
+C_ASSERT(sizeof(USB_DEFAULT_PIPE_SETUP_PACKET) == 8);
+
+#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE          0x06
+#define USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR_TYPE 0x07
+
+typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR {
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+  USHORT bcdUSB;
+  UCHAR bDeviceClass;
+  UCHAR bDeviceSubClass;
+  UCHAR bDeviceProtocol;
+  UCHAR bMaxPacketSize0;
+  UCHAR bNumConfigurations;
+  UCHAR bReserved;
+} USB_DEVICE_QUALIFIER_DESCRIPTOR, *PUSB_DEVICE_QUALIFIER_DESCRIPTOR;
+
+typedef union _USB_HIGH_SPEED_MAXPACKET {
+  struct _MP {
+    USHORT MaxPacket:11;
+    USHORT HSmux:2;
+    USHORT Reserved:3;
+  } _MP;
+  USHORT us;
+} USB_HIGH_SPEED_MAXPACKET, *PUSB_HIGH_SPEED_MAXPACKET;
+
+#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE     0x0B
+
+typedef struct _USB_INTERFACE_ASSOCIATION_DESCRIPTOR {
+  UCHAR bLength;
+  UCHAR bDescriptorType;
+  UCHAR bFirstInterface;
+  UCHAR bInterfaceCount;
+  UCHAR bFunctionClass;
+  UCHAR bFunctionSubClass;
+  UCHAR bFunctionProtocol;
+  UCHAR iFunction;
+} USB_INTERFACE_ASSOCIATION_DESCRIPTOR, *PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR;
+
+#include <poppack.h>
diff --git a/reactos/include/psdk/usbcamdi.h b/reactos/include/psdk/usbcamdi.h
new file mode 100644 (file)
index 0000000..31d7773
--- /dev/null
@@ -0,0 +1,384 @@
+/*
+ * usbcamdi.h
+ *
+ * USB Camera driver interface.
+ *
+ * This file is part of the w32api package.
+ *
+ * Contributors:
+ *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(_BATTERYCLASS_)
+  #define USBCAMAPI
+#else
+  #define USBCAMAPI DECLSPEC_IMPORT
+#endif
+
+typedef struct _pipe_config_descriptor {
+  CHAR StreamAssociation;
+  UCHAR PipeConfigFlags;
+} USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor;
+
+#define USBCAMD_DATA_PIPE                 0x0001
+#define USBCAMD_MULTIPLEX_PIPE            0x0002
+#define USBCAMD_SYNC_PIPE                 0x0004
+#define USBCAMD_DONT_CARE_PIPE            0x0008
+
+#define USBCAMD_VIDEO_STREAM              0x1
+#define USBCAMD_STILL_STREAM              0x2
+#define USBCAMD_VIDEO_STILL_STREAM        (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM)
+
+#define USBCAMD_PROCESSPACKETEX_DropFrame             0x0002
+#define USBCAMD_PROCESSPACKETEX_NextFrameIsStill      0x0004
+#define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill   0x0008
+
+#define USBCAMD_STOP_STREAM               0x00000001
+#define USBCAMD_START_STREAM              0x00000000
+
+typedef enum {
+  USBCAMD_CamControlFlag_NoVideoRawProcessing = 1,
+  USBCAMD_CamControlFlag_NoStillRawProcessing = 2,
+  USBCAMD_CamControlFlag_AssociatedFormat = 4,
+  USBCAMD_CamControlFlag_EnableDeviceEvents = 8
+} USBCAMD_CamControlFlags;
+
+typedef NTSTATUS
+(NTAPI *PCOMMAND_COMPLETE_FUNCTION)(
+  IN PVOID DeviceContext,
+  IN OUT PVOID CommandContext,
+  IN NTSTATUS NtStatus);
+
+typedef VOID
+(NTAPI *PSTREAM_RECEIVE_PACKET)(
+  IN PVOID Srb,
+  IN PVOID DeviceContext,
+  IN PBOOLEAN Completed);
+
+typedef NTSTATUS
+(NTAPI *PCAM_INITIALIZE_ROUTINE)(
+  PDEVICE_OBJECT BusDeviceObject,
+  PVOID DeviceContext);
+
+typedef NTSTATUS
+(NTAPI *PCAM_CONFIGURE_ROUTINE)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN PUSBD_INTERFACE_INFORMATION Interface,
+  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+  IN PLONG DataPipeIndex,
+  IN PLONG SyncPipeIndex);
+
+typedef NTSTATUS
+(NTAPI *PCAM_CONFIGURE_ROUTINE_EX)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN PUSBD_INTERFACE_INFORMATION Interface,
+  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
+  IN ULONG PipeConfigListSize,
+  IN PUSBCAMD_Pipe_Config_Descriptor PipeConfig,
+  IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
+
+typedef NTSTATUS
+(NTAPI *PCAM_START_CAPTURE_ROUTINE)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext);
+
+typedef NTSTATUS
+(NTAPI *PCAM_START_CAPTURE_ROUTINE_EX)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN ULONG StreamNumber);
+
+typedef NTSTATUS
+(NTAPI *PCAM_ALLOCATE_BW_ROUTINE)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN PULONG RawFrameLength,
+  IN PVOID Format);
+
+typedef NTSTATUS
+(NTAPI *PCAM_ALLOCATE_BW_ROUTINE_EX)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN PULONG RawFrameLength,
+  IN PVOID Format,
+  IN ULONG StreamNumber);
+
+typedef NTSTATUS
+(NTAPI *PCAM_FREE_BW_ROUTINE)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext);
+
+typedef NTSTATUS
+(NTAPI *PCAM_FREE_BW_ROUTINE_EX)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN ULONG StreamNumber);
+
+typedef VOID
+(NTAPI *PADAPTER_RECEIVE_PACKET_ROUTINE)(
+  IN OUT PHW_STREAM_REQUEST_BLOCK Srb);
+
+typedef NTSTATUS
+(NTAPI *PCAM_STOP_CAPTURE_ROUTINE)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext);
+
+typedef NTSTATUS
+(NTAPI *PCAM_STOP_CAPTURE_ROUTINE_EX)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN ULONG StreamNumber);
+
+typedef ULONG
+(NTAPI *PCAM_PROCESS_PACKET_ROUTINE)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN PVOID CurrentFrameContext,
+  IN PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket OPTIONAL,
+  IN PVOID SyncBuffer OPTIONAL,
+  IN PUSBD_ISO_PACKET_DESCRIPTOR DataPacket OPTIONAL,
+  IN OUT PVOID DataBuffer,
+  OUT PBOOLEAN FrameComplete,
+  OUT PBOOLEAN NextFrameIsStill);
+
+typedef ULONG
+(NTAPI *PCAM_PROCESS_PACKET_ROUTINE_EX)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN PVOID CurrentFrameContext,
+  IN PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket OPTIONAL,
+  IN PVOID SyncBuffer OPTIONAL,
+  IN PUSBD_ISO_PACKET_DESCRIPTOR DataPacket OPTIONAL,
+  IN OUT PVOID DataBuffer,
+  OUT PBOOLEAN FrameComplete,
+  OUT PULONG PacketFlag,
+  OUT PULONG ValidDataOffset);
+
+typedef VOID
+(NTAPI *PCAM_NEW_FRAME_ROUTINE)(
+  IN PVOID DeviceContext,
+  IN PVOID FrameContext);
+
+typedef VOID
+(NTAPI *PCAM_NEW_FRAME_ROUTINE_EX)(
+  IN PVOID DeviceContext,
+  IN PVOID FrameContext,
+  IN ULONG StreamNumber,
+  OUT PULONG FrameLength);
+
+typedef NTSTATUS
+(NTAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN PVOID FrameContext,
+  IN PVOID FrameBuffer,
+  IN ULONG FrameLength,
+  OUT PVOID RawFrameBuffer,
+  IN ULONG RawFrameLength,
+  IN ULONG NumberOfPackets,
+  OUT PULONG BytesReturned);
+
+typedef NTSTATUS
+(NTAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext,
+  IN PVOID FrameContext,
+  IN PVOID FrameBuffer,
+  IN ULONG FrameLength,
+  OUT PVOID RawFrameBuffer,
+  IN ULONG RawFrameLength,
+  IN ULONG NumberOfPackets,
+  OUT PULONG BytesReturned,
+  IN ULONG ActualRawFrameLength,
+  IN ULONG StreamNumber);
+
+typedef NTSTATUS
+(NTAPI *PCAM_STATE_ROUTINE)(
+  IN PDEVICE_OBJECT BusDeviceObject,
+  IN PVOID DeviceContext);
+
+#if defined(DEBUG_LOG)
+
+USBCAMAPI
+VOID
+NTAPI
+USBCAMD_Debug_LogEntry(
+  IN CHAR *Name,
+  IN ULONG Info1,
+  IN ULONG Info2,
+  IN ULONG Info3);
+
+#define ILOGENTRY(sig, info1, info2, info3) \
+  USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
+
+#else
+
+#define ILOGENTRY(sig, info1, info2, info3)
+
+#endif /* DEBUG_LOG */
+
+typedef struct _USBCAMD_DEVICE_DATA {
+  ULONG Sig;
+  PCAM_INITIALIZE_ROUTINE CamInitialize;
+  PCAM_INITIALIZE_ROUTINE CamUnInitialize;
+  PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket;
+  PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame;
+  PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame;
+  PCAM_START_CAPTURE_ROUTINE CamStartCapture;
+  PCAM_STOP_CAPTURE_ROUTINE CamStopCapture;
+  PCAM_CONFIGURE_ROUTINE CamConfigure;
+  PCAM_STATE_ROUTINE CamSaveState;
+  PCAM_STATE_ROUTINE CamRestoreState;
+  PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth;
+  PCAM_FREE_BW_ROUTINE CamFreeBandwidth;
+} USBCAMD_DEVICE_DATA, *PUSBCAMD_DEVICE_DATA;
+
+typedef struct _USBCAMD_DEVICE_DATA2 {
+  ULONG Sig;
+  PCAM_INITIALIZE_ROUTINE CamInitialize;
+  PCAM_INITIALIZE_ROUTINE CamUnInitialize;
+  PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx;
+  PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx;
+  PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx;
+  PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx;
+  PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx;
+  PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx;
+  PCAM_STATE_ROUTINE CamSaveState;
+  PCAM_STATE_ROUTINE CamRestoreState;
+  PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx;
+  PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx;
+} USBCAMD_DEVICE_DATA2, *PUSBCAMD_DEVICE_DATA2;
+
+DEFINE_GUID(GUID_USBCAMD_INTERFACE,
+  0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5);
+
+typedef NTSTATUS
+(NTAPI *PFNUSBCAMD_SetVideoFormat)(
+  IN PVOID DeviceContext,
+  IN PHW_STREAM_REQUEST_BLOCK pSrb);
+
+typedef NTSTATUS
+(NTAPI *PFNUSBCAMD_WaitOnDeviceEvent)(
+  IN PVOID DeviceContext,
+  IN ULONG PipeIndex,
+  IN PVOID Buffer,
+  IN ULONG BufferLength,
+  IN PCOMMAND_COMPLETE_FUNCTION EventComplete,
+  IN PVOID EventContext,
+  IN BOOLEAN LoopBack);
+
+typedef NTSTATUS
+(NTAPI *PFNUSBCAMD_CancelBulkReadWrite)(
+  IN PVOID DeviceContext,
+  IN ULONG PipeIndex);
+
+typedef NTSTATUS
+(NTAPI *PFNUSBCAMD_SetIsoPipeState)(
+  IN PVOID DeviceContext,
+  IN ULONG PipeStateFlags);
+
+typedef NTSTATUS
+(NTAPI *PFNUSBCAMD_BulkReadWrite)(
+  IN PVOID DeviceContext,
+  IN USHORT PipeIndex,
+  IN PVOID Buffer,
+  IN ULONG BufferLength,
+  IN PCOMMAND_COMPLETE_FUNCTION CommandComplete,
+  IN PVOID CommandContext);
+
+#define USBCAMD_VERSION_200               0x200
+
+typedef struct _USBCAMD_INTERFACE {
+  INTERFACE Interface;
+  PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent;
+  PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite;
+  PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat;
+  PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState;
+  PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite;
+} USBCAMD_INTERFACE, *PUSBCAMD_INTERFACE;
+
+/* FIXME : Do we need USBCAMAPI here ? */
+
+USBCAMAPI
+ULONG
+NTAPI
+USBCAMD_DriverEntry(
+  IN PVOID Context1,
+  IN PVOID Context2,
+  IN ULONG DeviceContextSize,
+  IN ULONG FrameContextSize,
+  IN PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket);
+
+USBCAMAPI
+PVOID
+NTAPI
+USBCAMD_AdapterReceivePacket(
+  IN PHW_STREAM_REQUEST_BLOCK Srb,
+  IN PUSBCAMD_DEVICE_DATA DeviceData,
+  IN PDEVICE_OBJECT *DeviceObject,
+  IN BOOLEAN NeedsCompletion);
+
+USBCAMAPI
+NTSTATUS
+NTAPI
+USBCAMD_ControlVendorCommand(
+  IN PVOID DeviceContext,
+  IN UCHAR Request,
+  IN USHORT Value,
+  IN USHORT Index,
+  IN OUT PVOID Buffer,
+  IN OUT PULONG BufferLength,
+  IN BOOLEAN GetData,
+  IN PCOMMAND_COMPLETE_FUNCTION CommandComplete OPTIONAL,
+  IN PVOID CommandContext OPTIONAL);
+
+USBCAMAPI
+NTSTATUS
+NTAPI
+USBCAMD_SelectAlternateInterface(
+  IN PVOID DeviceContext,
+  IN OUT PUSBD_INTERFACE_INFORMATION RequestInterface);
+
+USBCAMAPI
+NTSTATUS
+NTAPI
+USBCAMD_GetRegistryKeyValue(
+  IN HANDLE Handle,
+  IN PWCHAR KeyNameString,
+  IN ULONG KeyNameStringLength,
+  IN PVOID Data,
+  IN ULONG DataLength);
+
+USBCAMAPI
+ULONG
+NTAPI
+USBCAMD_InitializeNewInterface(
+  IN PVOID DeviceContext,
+  IN PVOID DeviceData,
+  IN ULONG Version,
+  IN ULONG CamControlFlag);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !defined(__USB_H) && !defined(__USBDI_H) */
diff --git a/reactos/include/psdk/usbdi.h b/reactos/include/psdk/usbdi.h
new file mode 100644 (file)
index 0000000..014b029
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * usbdi.h
+ *
+ * USBD and USB device driver definitions
+ *
+ * FIXME : Obsolete header.. Use usb.h instead.
+ *
+ * This file is part of the w32api package.
+ *
+ * Contributors:
+ *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#pragma once
+
+/* Helper macro to enable gcc's extension.  */
+#ifndef __GNU_EXTENSION
+#ifdef __GNUC__
+#define __GNU_EXTENSION __extension__
+#else
+#define __GNU_EXTENSION
+#endif
+#endif
+
+#include <usb.h>
+#include <usbioctl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define USBD_STATUS_CANCELLING      ((USBD_STATUS)0x00020000L)
+#define USBD_STATUS_CANCELING       ((USBD_STATUS)0x00020000L)
+#define USBD_STATUS_NO_MEMORY       ((USBD_STATUS)0x80000100L)
+#define USBD_STATUS_ERROR           ((USBD_STATUS)0x80000000L)
+#define USBD_STATUS_REQUEST_FAILED  ((USBD_STATUS)0x80000500L)
+#define USBD_STATUS_HALTED          ((USBD_STATUS)0xC0000000L)
+
+
+#define USBD_HALTED(Status)  ((ULONG)(Status) >> 30 == 3)
+#define USBD_STATUS(Status) ((ULONG)(Status) & 0x0FFFFFFFL)
+
+#define URB_FUNCTION_RESERVED0                      0x0016
+#define URB_FUNCTION_RESERVED                       0x001D
+#define URB_FUNCTION_LAST                           0x0029
+
+#define USBD_PF_DOUBLE_BUFFER           0x00000002
+
+#ifdef USBD_PF_VALID_MASK
+#undef USBD_PF_VALID_MASK
+#endif
+
+#define USBD_PF_VALID_MASK    (USBD_PF_CHANGE_MAX_PACKET | USBD_PF_DOUBLE_BUFFER | \
+                              USBD_PF_ENABLE_RT_THREAD_ACCESS | USBD_PF_MAP_ADD_TRANSFERS)
+
+#define USBD_TRANSFER_DIRECTION_BIT             0
+#define USBD_SHORT_TRANSFER_OK_BIT              1
+#define USBD_START_ISO_TRANSFER_ASAP_BIT        2
+
+#ifdef USBD_TRANSFER_DIRECTION
+#undef USBD_TRANSFER_DIRECTION
+#endif
+
+#define USBD_TRANSFER_DIRECTION(x)      ((x) & USBD_TRANSFER_DIRECTION_IN)
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/reactos/include/psdk/usbioctl.h b/reactos/include/psdk/usbioctl.h
new file mode 100644 (file)
index 0000000..69541cb
--- /dev/null
@@ -0,0 +1,670 @@
+/*
+ * usbioctl.h
+ *
+ * USB IOCTL interface.
+ *
+ * This file is part of the w32api package.
+ *
+ * Contributors:
+ *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#pragma once
+
+#include "usb100.h"
+#include "usbiodef.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define IOCTL_INTERNAL_USB_SUBMIT_URB  \
+  CTL_CODE(FILE_DEVICE_USB, USB_SUBMIT_URB, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_RESET_PORT \
+  CTL_CODE(FILE_DEVICE_USB, USB_RESET_PORT, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_ROOTHUB_PDO, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define USBD_PORT_ENABLED                 1
+#define USBD_PORT_CONNECTED               2
+
+#define IOCTL_INTERNAL_USB_GET_PORT_STATUS \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_PORT_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_ENABLE_PORT \
+  CTL_CODE(FILE_DEVICE_USB, USB_ENABLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_HUB_COUNT \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_COUNT, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_CYCLE_PORT \
+  CTL_CODE(FILE_DEVICE_USB, USB_CYCLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_HUB_NAME \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_BUS_INFO \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_BUS_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_CONTROLLER_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_BUSGUID_INFO \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_BUSGUID_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_PARENT_HUB_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#if (_WIN32_WINNT >= 0x0501)
+
+#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION \
+  CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define IOCTL_INTERNAL_USB_NOTIFY_IDLE_READY \
+  CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION_EX, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_REQ_GLOBAL_SUSPEND \
+  CTL_CODE(FILE_DEVICE_USB, USB_REQ_GLOBAL_SUSPEND, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_REQ_GLOBAL_RESUME \
+  CTL_CODE(FILE_DEVICE_USB, USB_REQ_GLOBAL_RESUME, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#ifdef USB20_API
+typedef struct _USB_START_FAILDATA {
+  ULONG LengthInBytes;
+  NTSTATUS NtStatus;
+  USBD_STATUS UsbdStatus;
+  ULONG ConnectStatus;
+  UCHAR DriverData[4];
+} USB_START_FAILDATA, *PUSB_START_FAILDATA;
+#endif
+
+#define IOCTL_INTERNAL_USB_RECORD_FAILURE \
+  CTL_CODE(FILE_DEVICE_USB, USB_RECORD_FAILURE, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE_EX \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE_EX, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_TT_DEVICE_HANDLE \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_TT_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+typedef struct _USB_TOPOLOGY_ADDRESS {
+  ULONG PciBusNumber;
+  ULONG PciDeviceNumber;
+  ULONG PciFunctionNumber;
+  ULONG Reserved;
+  USHORT RootHubPortNumber;
+  USHORT HubPortNumber[5];
+  USHORT Reserved2;
+} USB_TOPOLOGY_ADDRESS, *PUSB_TOPOLOGY_ADDRESS;
+
+#define IOCTL_INTERNAL_USB_GET_TOPOLOGY_ADDRESS \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_TOPOLOGY_ADDRESS, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_INTERNAL_USB_GET_DEVICE_CONFIG_INFO \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CONFIG_INFO, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#endif
+
+#ifndef USB_KERNEL_IOCTL
+
+#define IOCTL_USB_HCD_GET_STATS_1 \
+  CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_HCD_GET_STATS_2 \
+  CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_HCD_DISABLE_PORT \
+  CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_HCD_ENABLE_PORT \
+  CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_HCD_DISABLE_PORT \
+  CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_HCD_ENABLE_PORT \
+  CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#ifndef IOCTL_USB_DIAGNOSTIC_MODE_OFF
+#define IOCTL_USB_DIAGNOSTIC_MODE_OFF \
+  CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#endif
+
+#ifndef IOCTL_USB_DIAGNOSTIC_MODE_ON
+#define IOCTL_USB_DIAGNOSTIC_MODE_ON \
+  CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_ON, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#endif
+
+#ifndef IOCTL_USB_GET_ROOT_HUB_NAME
+#define IOCTL_USB_GET_ROOT_HUB_NAME \
+  CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#endif
+
+#ifndef IOCTL_GET_HCD_DRIVERKEY_NAME
+#define IOCTL_GET_HCD_DRIVERKEY_NAME \
+  CTL_CODE(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#endif
+
+#define IOCTL_USB_GET_NODE_INFORMATION \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_GET_NODE_CONNECTION_NAME \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_DIAG_IGNORE_HUBS_ON \
+  CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_ON, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_DIAG_IGNORE_HUBS_OFF \
+  CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#if (_WIN32_WINNT >= 0x0501)
+
+#define IOCTL_USB_GET_HUB_CAPABILITIES \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_HUB_CYCLE_PORT \
+  CTL_CODE(FILE_DEVICE_USB, USB_HUB_CYCLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define IOCTL_USB_RESET_HUB \
+  CTL_CODE(FILE_DEVICE_USB, USB_RESET_HUB, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \
+  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#endif
+
+#include <pshpack1.h>
+
+typedef enum _USB_HUB_NODE {
+  UsbHub,
+  UsbMIParent
+} USB_HUB_NODE;
+
+typedef struct _USB_HUB_INFORMATION {
+  USB_HUB_DESCRIPTOR HubDescriptor;
+  BOOLEAN HubIsBusPowered;
+} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;
+
+typedef struct _USB_MI_PARENT_INFORMATION {
+  ULONG NumberOfInterfaces;
+} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;
+
+typedef struct _USB_NODE_INFORMATION {
+  USB_HUB_NODE NodeType;
+  union {
+    USB_HUB_INFORMATION HubInformation;
+    USB_MI_PARENT_INFORMATION MiParentInformation;
+  } u;
+} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;
+
+typedef struct _USB_PIPE_INFO {
+  USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
+  ULONG ScheduleOffset;
+} USB_PIPE_INFO, *PUSB_PIPE_INFO;
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef enum _USB_CONNECTION_STATUS {
+  NoDeviceConnected,
+  DeviceConnected,
+  DeviceFailedEnumeration,
+  DeviceGeneralFailure,
+  DeviceCausedOvercurrent,
+  DeviceNotEnoughPower,
+  DeviceNotEnoughBandwidth,
+  DeviceHubNestedTooDeeply,
+  DeviceInLegacyHub,
+  DeviceEnumerating,
+  DeviceReset
+} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
+
+#elif (_WIN32_WINNT >= 0x0501)
+
+typedef enum _USB_CONNECTION_STATUS {
+  NoDeviceConnected,
+  DeviceConnected,
+  DeviceFailedEnumeration,
+  DeviceGeneralFailure,
+  DeviceCausedOvercurrent,
+  DeviceNotEnoughPower,
+  DeviceNotEnoughBandwidth,
+  DeviceHubNestedTooDeeply,
+  DeviceInLegacyHub
+} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
+
+#else
+
+typedef enum _USB_CONNECTION_STATUS {
+  NoDeviceConnected,
+  DeviceConnected,
+  DeviceFailedEnumeration,
+  DeviceGeneralFailure,
+  DeviceCausedOvercurrent,
+  DeviceNotEnoughPower,
+  DeviceNotEnoughBandwidth
+} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
+
+#endif
+
+typedef struct _USB_NODE_CONNECTION_INFORMATION {
+  ULONG ConnectionIndex;
+  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
+  UCHAR CurrentConfigurationValue;
+  BOOLEAN LowSpeed;
+  BOOLEAN DeviceIsHub;
+  USHORT DeviceAddress;
+  ULONG NumberOfOpenPipes;
+  USB_CONNECTION_STATUS ConnectionStatus;
+  USB_PIPE_INFO PipeList[0];
+} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION;
+
+typedef struct _USB_NODE_CONNECTION_DRIVERKEY_NAME {
+  ULONG ConnectionIndex;
+  ULONG ActualLength;
+  WCHAR DriverKeyName[1];
+} USB_NODE_CONNECTION_DRIVERKEY_NAME, *PUSB_NODE_CONNECTION_DRIVERKEY_NAME;
+
+typedef struct _USB_NODE_CONNECTION_NAME {
+  ULONG ConnectionIndex;
+  ULONG ActualLength;
+  WCHAR NodeName[1];
+} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME;
+
+typedef struct _USB_HUB_NAME {
+  ULONG ActualLength;
+  WCHAR HubName[1];
+} USB_HUB_NAME, *PUSB_HUB_NAME;
+
+typedef struct _USB_ROOT_HUB_NAME {
+  ULONG ActualLength;
+  WCHAR RootHubName[1];
+} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;
+
+typedef struct _USB_HCD_DRIVERKEY_NAME {
+  ULONG ActualLength;
+  WCHAR DriverKeyName[1];
+} USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME;
+
+typedef struct _USB_DESCRIPTOR_REQUEST {
+  ULONG ConnectionIndex;
+  struct {
+    UCHAR bmRequest;
+    UCHAR bRequest;
+    USHORT wValue;
+    USHORT wIndex;
+    USHORT wLength;
+  } SetupPacket;
+  UCHAR Data[0];
+} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST;
+
+#if (_WIN32_WINNT >= 0x0501)
+
+typedef struct _USB_HUB_CAPABILITIES {
+  ULONG  HubIs2xCapable:1;
+} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES;
+
+typedef struct _USB_NODE_CONNECTION_ATTRIBUTES {
+  ULONG ConnectionIndex;
+  USB_CONNECTION_STATUS ConnectionStatus;
+  ULONG PortAttributes;
+} USB_NODE_CONNECTION_ATTRIBUTES, *PUSB_NODE_CONNECTION_ATTRIBUTES;
+
+typedef struct _USB_NODE_CONNECTION_INFORMATION_EX {
+  ULONG ConnectionIndex;
+  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
+  UCHAR CurrentConfigurationValue;
+  UCHAR Speed;
+  BOOLEAN DeviceIsHub;
+  USHORT DeviceAddress;
+  ULONG NumberOfOpenPipes;
+  USB_CONNECTION_STATUS ConnectionStatus;
+  USB_PIPE_INFO PipeList[0];
+} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX;
+
+C_ASSERT(sizeof(USB_NODE_CONNECTION_INFORMATION_EX) == sizeof(USB_NODE_CONNECTION_INFORMATION));
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef union _USB_HUB_CAP_FLAGS {
+  ULONG ul;
+  struct {
+    ULONG HubIsHighSpeedCapable:1;
+    ULONG HubIsHighSpeed:1;
+    ULONG HubIsMultiTtCapable:1;
+    ULONG HubIsMultiTt:1;
+    ULONG HubIsRoot:1;
+    ULONG HubIsArmedWakeOnConnect:1;
+    ULONG HubIsBusPowered:1;
+    ULONG ReservedMBZ:25;
+  };
+} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS;
+
+C_ASSERT(sizeof(USB_HUB_CAP_FLAGS) == sizeof(ULONG));
+
+typedef struct _USB_HUB_CAPABILITIES_EX {
+  USB_HUB_CAP_FLAGS CapabilityFlags;
+} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX;
+
+typedef struct _USB_CYCLE_PORT_PARAMS {
+  ULONG ConnectionIndex;
+  ULONG StatusReturned;
+} USB_CYCLE_PORT_PARAMS, *PUSB_CYCLE_PORT_PARAMS;
+
+typedef struct _USB_ID_STRING {
+  USHORT LanguageId;
+  USHORT Pad;
+  ULONG LengthInBytes;
+  PWCHAR Buffer;
+} USB_ID_STRING, *PUSB_ID_STRING;
+
+typedef struct _USB_HUB_DEVICE_UXD_SETTINGS {
+  ULONG Version;
+  GUID PnpGuid;
+  GUID OwnerGuid;
+  ULONG DeleteOnShutdown;
+  ULONG DeleteOnReload;
+  ULONG DeleteOnDisconnect;
+  ULONG Reserved[5];
+} USB_HUB_DEVICE_UXD_SETTINGS, *PUSB_HUB_DEVICE_UXD_SETTINGS;
+
+typedef struct _HUB_DEVICE_CONFIG_INFO_V1 {
+  ULONG Version;
+  ULONG Length;
+  USB_HUB_CAP_FLAGS HubFlags;
+  USB_ID_STRING HardwareIds;
+  USB_ID_STRING CompatibleIds;
+  USB_ID_STRING DeviceDescription;
+  ULONG Reserved[19];
+  USB_HUB_DEVICE_UXD_SETTINGS UxdSettings;
+} HUB_DEVICE_CONFIG_INFO, *PHUB_DEVICE_CONFIG_INFO;
+
+#endif
+
+typedef struct _HCD_ISO_STAT_COUNTERS {
+  USHORT LateUrbs;
+  USHORT DoubleBufferedPackets;
+  USHORT TransfersCF_5ms;
+  USHORT TransfersCF_2ms;
+  USHORT TransfersCF_1ms;
+  USHORT MaxInterruptLatency;
+  USHORT BadStartFrame;
+  USHORT StaleUrbs;
+  USHORT IsoPacketNotAccesed;
+  USHORT IsoPacketHWError;
+  USHORT SmallestUrbPacketCount;
+  USHORT LargestUrbPacketCount;
+  USHORT IsoCRC_Error;
+  USHORT IsoOVERRUN_Error;
+  USHORT IsoINTERNAL_Error;
+  USHORT IsoUNKNOWN_Error;
+  ULONG IsoBytesTransferred;
+  USHORT LateMissedCount;
+  USHORT HWIsoMissedCount;
+  ULONG Reserved7[8];
+} HCD_ISO_STAT_COUNTERS, *PHCD_ISO_STAT_COUNTERS;
+
+typedef struct _HCD_STAT_COUNTERS {
+  ULONG BytesTransferred;
+  USHORT IsoMissedCount;
+  USHORT DataOverrunErrorCount;
+  USHORT CrcErrorCount;
+  USHORT ScheduleOverrunCount;
+  USHORT TimeoutErrorCount;
+  USHORT InternalHcErrorCount;
+  USHORT BufferOverrunErrorCount;
+  USHORT SWErrorCount;
+  USHORT StallPidCount;
+  USHORT PortDisableCount;
+} HCD_STAT_COUNTERS, *PHCD_STAT_COUNTERS;
+
+typedef struct _HCD_STAT_INFORMATION_1 {
+  ULONG Reserved1;
+  ULONG Reserved2;
+  ULONG ResetCounters;
+  LARGE_INTEGER TimeRead;
+  HCD_STAT_COUNTERS Counters;
+} HCD_STAT_INFORMATION_1, *PHCD_STAT_INFORMATION_1;
+
+typedef struct _HCD_STAT_INFORMATION_2 {
+  ULONG Reserved1;
+  ULONG Reserved2;
+  ULONG ResetCounters;
+  LARGE_INTEGER TimeRead;
+  LONG LockedMemoryUsed;
+  HCD_STAT_COUNTERS Counters;
+  HCD_ISO_STAT_COUNTERS IsoCounters;
+} HCD_STAT_INFORMATION_2, *PHCD_STAT_INFORMATION_2;
+
+#define WMI_USB_DRIVER_INFORMATION        0
+#define WMI_USB_DRIVER_NOTIFICATION       1
+#define WMI_USB_POWER_DEVICE_ENABLE       2
+#define WMI_USB_HUB_NODE_INFORMATION      4
+
+#define WMI_USB_PERFORMANCE_INFORMATION   1
+#define WMI_USB_DEVICE_NODE_INFORMATION   2
+
+#if (_WIN32_WINNT >= 0x0501)
+
+typedef enum _USB_NOTIFICATION_TYPE {
+  EnumerationFailure = 0,
+  InsufficentBandwidth,
+  InsufficentPower,
+  OverCurrent,
+  ResetOvercurrent,
+  AcquireBusInfo,
+  AcquireHubName,
+  AcquireControllerName,
+  HubOvercurrent,
+  HubPowerChange,
+  HubNestedTooDeeply,
+ ModernDeviceInLegacyHub
+} USB_NOTIFICATION_TYPE;
+
+#else
+
+typedef enum _USB_NOTIFICATION_TYPE {
+  EnumerationFailure = 0,
+  InsufficentBandwidth,
+  InsufficentPower,
+  OverCurrent,
+  ResetOvercurrent,
+  AcquireBusInfo,
+  AcquireHubName,
+  AcquireControllerName,
+  HubOvercurrent,
+  HubPowerChange
+} USB_NOTIFICATION_TYPE;
+
+#endif
+
+typedef struct _USB_NOTIFICATION {
+  USB_NOTIFICATION_TYPE NotificationType;
+} USB_NOTIFICATION, *PUSB_NOTIFICATION;
+
+typedef struct _USB_CONNECTION_NOTIFICATION {
+  USB_NOTIFICATION_TYPE NotificationType;
+  ULONG ConnectionNumber;
+  ULONG RequestedBandwidth;
+  ULONG EnumerationFailReason;
+  ULONG PowerRequested;
+  ULONG HubNameLength;
+} USB_CONNECTION_NOTIFICATION, *PUSB_CONNECTION_NOTIFICATION;
+
+typedef struct _USB_BUS_NOTIFICATION {
+  USB_NOTIFICATION_TYPE NotificationType;
+  ULONG TotalBandwidth;
+  ULONG ConsumedBandwidth;
+  ULONG ControllerNameLength;
+} USB_BUS_NOTIFICATION, *PUSB_BUS_NOTIFICATION;
+
+typedef struct _USB_ACQUIRE_INFO {
+  USB_NOTIFICATION_TYPE NotificationType;
+  ULONG TotalSize;
+  WCHAR Buffer[1];
+} USB_ACQUIRE_INFO, *PUSB_ACQUIRE_INFO;
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define USB_NODE_INFO_SIG 'USBN'
+
+typedef enum _USB_WMI_DEVICE_NODE_TYPE {
+  UsbDevice,
+  HubDevice,
+  CompositeDevice,
+  UsbController
+} USB_WMI_DEVICE_NODE_TYPE, *PUSB_WMI_DEVICE_NODE_TYPE;
+
+typedef struct _USB_DEVICE_STATE {
+  ULONG DeviceConnected:1;
+  ULONG DeviceStarted:1;
+} USB_DEVICE_STATE, *PUSB_DEVICE_STATE;
+
+typedef struct _USB_HUB_PORT_INFORMATION {
+  USB_DEVICE_STATE DeviceState;
+  USHORT PortNumber;
+  USHORT DeviceAddress;
+  ULONG ConnectionIndex;
+  USB_CONNECTION_STATUS ConnectionStatus;
+} USB_HUB_PORT_INFORMATION, *PUSB_HUB_PORT_INFORMATION;
+
+typedef struct _USB_HUB_DEVICE_INFO {
+  USB_HUB_DESCRIPTOR HubDescriptor;
+  ULONG HubNumber;
+  USHORT DeviceAddress;
+  BOOLEAN HubIsSelfPowered;
+  BOOLEAN HubIsRootHub;
+  USB_HUB_CAPABILITIES HubCapabilities;
+  ULONG NumberOfHubPorts;
+  USB_HUB_PORT_INFORMATION PortInfo[1];
+} USB_HUB_DEVICE_INFO, *PUSB_HUB_DEVICE_INFO;
+
+typedef struct _USB_COMPOSITE_FUNCTION_INFO {
+  UCHAR FunctionNumber;
+  UCHAR BaseInterfaceNumber;
+  UCHAR NumberOfInterfaces;
+  BOOLEAN FunctionIsIdle;
+} USB_COMPOSITE_FUNCTION_INFO, *PUSB_COMPOSITE_FUNCTION_INFO;
+
+typedef struct _USB_COMPOSITE_DEVICE_INFO {
+  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
+  USB_CONFIGURATION_DESCRIPTOR CurrentConfigDescriptor;
+  UCHAR CurrentConfigurationValue;
+  UCHAR NumberOfFunctions;
+  USB_COMPOSITE_FUNCTION_INFO FunctionInfo[1];
+} USB_COMPOSITE_DEVICE_INFO, *PUSB_COMPOSITE_DEVICE_INFO;
+
+typedef struct _USB_CONTROLLER_DEVICE_INFO {
+  ULONG PciVendorId;
+  ULONG PciDeviceId;
+  ULONG PciRevision;
+  ULONG NumberOfRootPorts;
+  ULONG HcFeatureFlags;
+} USB_CONTROLLER_DEVICE_INFO, *PUSB_CONTROLLER_DEVICE_INFO;
+
+typedef struct _USB_DEVICE_INFO {
+  USB_DEVICE_STATE DeviceState;
+  USHORT PortNumber;
+  USB_DEVICE_DESCRIPTOR DeviceDescriptor;
+  UCHAR CurrentConfigurationValue;
+  USB_DEVICE_SPEED Speed;
+  USHORT DeviceAddress;
+  ULONG ConnectionIndex;
+  USB_CONNECTION_STATUS ConnectionStatus;
+  WCHAR PnpHardwareId[128];
+  WCHAR PnpCompatibleId[128];
+  WCHAR SerialNumberId[128];
+  WCHAR PnpDeviceDescription[128];
+  ULONG NumberOfOpenPipes;
+  USB_PIPE_INFO PipeList[1];
+} USB_DEVICE_INFO, *PUSB_DEVICE_INFO;
+
+typedef struct _USB_DEVICE_NODE_INFO {
+  ULONG Sig;
+  ULONG LengthInBytes;
+  WCHAR DeviceDescription[40];
+  USB_WMI_DEVICE_NODE_TYPE NodeType;
+  USB_TOPOLOGY_ADDRESS BusAddress;
+  union{
+    USB_DEVICE_INFO UsbDeviceInfo;
+    USB_HUB_DEVICE_INFO HubDeviceInfo;
+    USB_COMPOSITE_DEVICE_INFO CompositeDeviceInfo;
+    USB_CONTROLLER_DEVICE_INFO ControllerDeviceInfo;
+    UCHAR DeviceInformation[4];
+  };
+} USB_DEVICE_NODE_INFO, *PUSB_DEVICE_NODE_INFO;
+
+typedef struct _USB_DEVICE_PERFORMANCE_INFO {
+  ULONG BulkBytes;
+  ULONG ControlDataBytes;
+  ULONG IsoBytes;
+  ULONG InterruptBytes;
+  ULONG BulkUrbCount;
+  ULONG ControlUrbCount;
+  ULONG IsoUrbCount;
+  ULONG InterruptUrbCount;
+  ULONG AllocedInterrupt[6];
+  ULONG AllocedIso;
+  ULONG Total32secBandwidth;
+  ULONG TotalTtBandwidth;
+  WCHAR DeviceDescription[60];
+  USB_DEVICE_SPEED DeviceSpeed;
+  ULONG TotalIsoLatency;
+  ULONG DroppedIsoPackets;
+  ULONG TransferErrors;
+  ULONG PciInterruptCount;
+  ULONG HcIdleState;
+  ULONG HcAsyncIdleState;
+  ULONG HcAsyncCacheFlushCount;
+  ULONG HcPeriodicIdleState;
+  ULONG HcPeriodicCacheFlushCount;
+} USB_DEVICE_PERFORMANCE_INFO, *PUSB_DEVICE_PERFORMANCE_INFO;
+
+#endif
+
+#include <poppack.h>
+
+#ifdef __cplusplus
+}
+#endif
similarity index 58%
rename from reactos/include/ddk/usbiodef.h
rename to reactos/include/psdk/usbiodef.h
index e1008c6..94238ac 100644 (file)
@@ -1,26 +1,5 @@
+#pragma once
 
-
-#ifndef   __USBIODEF_H__
-#define   __USBIODEF_H__
-
-DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB, 0xF18A0E88, 0xc30C, 0x11D0, 0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8);
-DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
-DEFINE_GUID(GUID_DEVINTERFACE_USB_HOST_CONTROLLER, 0x3ABF6F2D, 0x71C4, 0x462A, 0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27);
-DEFINE_GUID(GUID_USB_WMI_STD_DATA, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2);
-DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2);
-
-#define GUID_CLASS_USBHUB GUID_DEVINTERFACE_USB_HUB
-#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE
-#define GUID_CLASS_USB_HOST_CONTROLLER GUID_DEVINTERFACE_USB_HOST_CONTROLLER
-#define HCD_GET_STATS_1 255
-#define HCD_DIAGNOSTIC_MODE_ON 256
-#define HCD_DIAGNOSTIC_MODE_OFF 257
-#define HCD_GET_ROOT_HUB_NAME 258
-#define HCD_GET_DRIVERKEY_NAME 265
-#define HCD_GET_STATS_2 266
-#define HCD_DISABLE_PORT 268
-#define HCD_ENABLE_PORT 269
-#define HCD_USER_REQUEST 270
 #define USB_SUBMIT_URB 0
 #define USB_RESET_PORT 1
 #define USB_GET_ROOTHUB_PDO 3
@@ -30,11 +9,20 @@ DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x
 #define USB_CYCLE_PORT 7
 #define USB_GET_HUB_NAME 8
 #define USB_IDLE_NOTIFICATION 9
+#define USB_RECORD_FAILURE 10
 #define USB_GET_BUS_INFO 264
 #define USB_GET_CONTROLLER_NAME 265
 #define USB_GET_BUSGUID_INFO 266
 #define USB_GET_PARENT_HUB_INFO 267
 #define USB_GET_DEVICE_HANDLE 268
+#define USB_GET_DEVICE_HANDLE_EX 269
+#define USB_GET_TT_DEVICE_HANDLE 270
+#define USB_GET_TOPOLOGY_ADDRESS 271
+#define USB_IDLE_NOTIFICATION_EX 272
+#define USB_REQ_GLOBAL_SUSPEND 273
+#define USB_REQ_GLOBAL_RESUME 274
+#define USB_GET_HUB_CONFIG_INFO 275
+
 #define USB_GET_NODE_INFORMATION 258
 #define USB_GET_NODE_CONNECTION_INFORMATION 259
 #define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260
@@ -44,9 +32,57 @@ DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x
 #define USB_GET_NODE_CONNECTION_DRIVERKEY_NAME 264
 #define USB_GET_HUB_CAPABILITIES 271
 #define USB_GET_NODE_CONNECTION_ATTRIBUTES 272
-#define        USB_HUB_CYCLE_PORT 273
+#define USB_HUB_CYCLE_PORT 273
 #define USB_GET_NODE_CONNECTION_INFORMATION_EX 274
+#define USB_RESET_HUB 275
+#define USB_GET_HUB_CAPABILITIES_EX 276
+
+#define HCD_GET_STATS_1 255
+#define HCD_DIAGNOSTIC_MODE_ON 256
+#define HCD_DIAGNOSTIC_MODE_OFF 257
+#define HCD_GET_ROOT_HUB_NAME 258
+#define HCD_GET_DRIVERKEY_NAME 265
+#define HCD_GET_STATS_2 266
+#define HCD_DISABLE_PORT 268
+#define HCD_ENABLE_PORT 269
+#define HCD_USER_REQUEST 270
+#define HCD_TRACE_READ_REQUEST 275
+
 #define FILE_DEVICE_USB         FILE_DEVICE_UNKNOWN
 #define USB_CTL(id)  CTL_CODE(FILE_DEVICE_USB, (id), METHOD_BUFFERED, FILE_ANY_ACCESS)
 #define USB_KERNEL_CTL(id)  CTL_CODE(FILE_DEVICE_USB, (id), METHOD_NEITHER, FILE_ANY_ACCESS)
+#define USB_KERNEL_CTL_BUFFERED(id)  CTL_CODE(FILE_DEVICE_USB, (id), METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB, 0xF18A0E88, 0xc30C, 0x11D0, 0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8);
+DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
+DEFINE_GUID(GUID_DEVINTERFACE_USB_HOST_CONTROLLER, 0x3ABF6F2D, 0x71C4, 0x462A, 0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27);
+DEFINE_GUID(GUID_USB_WMI_STD_DATA, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2);
+DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2);
+
+#if (_WIN32_WINNT >= 0x0600)
+
+DEFINE_GUID(GUID_USB_WMI_DEVICE_PERF_INFO, 0x66c1aa3c, 0x499f, 0x49a0, 0xa9, 0xa5, 0x61, 0xe2, 0x35, 0x9f, 0x64, 0x7);
+DEFINE_GUID(GUID_USB_WMI_NODE_INFO, 0x9c179357, 0xdc7a, 0x4f41, 0xb6, 0x6b, 0x32, 0x3b, 0x9d, 0xdc, 0xb5, 0xb1);
+DEFINE_GUID(GUID_USB_WMI_HUB_DIAGNOSTICS, 0xad0379e4, 0x72db, 0x42ed, 0xba, 0x6e, 0x67, 0x57, 0x4, 0x79, 0x7, 0xd);
+DEFINE_GUID(GUID_USB_WMI_TRACING, 0x3a61881b, 0xb4e6, 0x4bf9, 0xae, 0xf, 0x3c, 0xd8, 0xf3, 0x94, 0xe5, 0x2f);
+DEFINE_GUID(GUID_USB_TRANSFER_TRACING, 0x681eb8aa, 0x403d, 0x452c, 0x9f, 0x8a, 0xf0, 0x61, 0x6f, 0xac, 0x95, 0x40);
+DEFINE_GUID(GUID_USB_PERFORMANCE_TRACING, 0xd5de77a6, 0x6ae9, 0x425c, 0xb1, 0xe2, 0xf5, 0x61, 0x5f, 0xd3, 0x48, 0xa9);
+
+#endif
+
+#define GUID_CLASS_USBHUB GUID_DEVINTERFACE_USB_HUB
+#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE
+#define GUID_CLASS_USB_HOST_CONTROLLER GUID_DEVINTERFACE_USB_HOST_CONTROLLER
+
+#if (_WIN32_WINNT >= 0x0501)
+
+typedef VOID
+(NTAPI *USB_IDLE_CALLBACK)(
+  IN PVOID Context);
+
+typedef struct _USB_IDLE_CALLBACK_INFO {
+  USB_IDLE_CALLBACK IdleCallback;
+  PVOID IdleContext;
+} USB_IDLE_CALLBACK_INFO, *PUSB_IDLE_CALLBACK_INFO;
+
 #endif
diff --git a/reactos/include/psdk/usbrpmif.h b/reactos/include/psdk/usbrpmif.h
new file mode 100644 (file)
index 0000000..c6ee0c4
--- /dev/null
@@ -0,0 +1,64 @@
+#pragma once
+
+#include "windef.h"
+#include "usb100.h"
+
+#if !defined(_USBRPM_DRIVER_)
+#define USBRPMAPI DECLSPEC_IMPORT
+#else
+#define USBRPMAPI
+#endif
+
+typedef struct _USBRPM_DEVICE_INFORMATION {
+  ULONG64 HubId;
+  ULONG ConnectionIndex;
+  UCHAR DeviceClass;
+  USHORT VendorId;
+  USHORT ProductId;
+  WCHAR ManufacturerString[MAXIMUM_USB_STRING_LENGTH];
+  WCHAR ProductString[MAXIMUM_USB_STRING_LENGTH];
+  WCHAR HubSymbolicLinkName[MAX_PATH];
+} USBRPM_DEVICE_INFORMATION, *PUSBRPM_DEVICE_INFORMATION;
+
+typedef struct _USBRPM_DEVICE_LIST {
+  ULONG NumberOfDevices;
+  USBRPM_DEVICE_INFORMATION Device[0];
+} USBRPM_DEVICE_LIST, *PUSBRPM_DEVICE_LIST;
+
+USBRPMAPI
+NTSTATUS
+NTAPI
+RPMRegisterAlternateDriver(
+  IN PDRIVER_OBJECT  DriverObject,
+  IN LPCWSTR CompatibleId, 
+  OUT PHANDLE RegisteredDriver);
+
+USBRPMAPI
+NTSTATUS
+NTAPI
+RPMUnregisterAlternateDriver(
+  IN HANDLE RegisteredDriver);
+
+USBRPMAPI
+NTSTATUS
+RPMGetAvailableDevices(
+  IN HANDLE RegisteredDriver,
+  IN USHORT Locale,
+  OUT PUSBRPM_DEVICE_LIST *DeviceList);
+
+USBRPMAPI
+NTSTATUS
+NTAPI
+RPMLoadAlternateDriverForDevice(
+  IN HANDLE RegisteredDriver,
+  IN ULONG64 HubID,
+  IN ULONG ConnectionIndex,
+  IN OPTIONAL REFGUID OwnerGuid);
+
+USBRPMAPI
+NTSTATUS
+NTAPI
+RPMUnloadAlternateDriverForDevice(
+  IN HANDLE RegisteredDriver,
+  IN ULONG64 HubID,
+  IN ULONG ConnectionIndex);
similarity index 54%
rename from reactos/include/ddk/usbuser.h
rename to reactos/include/psdk/usbuser.h
index 51af1ba..0087467 100644 (file)
  *
  */
 
-#ifndef __USBUSER_H
-#define __USBUSER_H
-
-#include "usb.h"
-#include "usbiodef.h"
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#if (_WIN32_WINNT >= 0x0501)
+
+#include "usbiodef.h"
+
 #include <pshpack1.h>
 
 #define USBUSER_VERSION                   0x0004
@@ -51,17 +51,17 @@ extern "C" {
 #endif
 
 typedef enum _USB_USER_ERROR_CODE {
-       UsbUserSuccess = 0,
-       UsbUserNotSupported,
-       UsbUserInvalidRequestCode,
-       UsbUserFeatureDisabled,
-       UsbUserInvalidHeaderParameter,
-       UsbUserInvalidParameter,
-       UsbUserMiniportError,
-       UsbUserBufferTooSmall,
-       UsbUserErrorNotMapped,
-       UsbUserDeviceNotStarted,
-       UsbUserNoDeviceConnected
+  UsbUserSuccess = 0,
+  UsbUserNotSupported,
+  UsbUserInvalidRequestCode,
+  UsbUserFeatureDisabled,
+  UsbUserInvalidHeaderParameter,
+  UsbUserInvalidParameter,
+  UsbUserMiniportError,
+  UsbUserBufferTooSmall,
+  UsbUserErrorNotMapped,
+  UsbUserDeviceNotStarted,
+  UsbUserNoDeviceConnected
 } USB_USER_ERROR_CODE;
 
 #define USBUSER_GET_CONTROLLER_INFO_0     0x00000001
@@ -73,11 +73,17 @@ typedef enum _USB_USER_ERROR_CODE {
 #define USBUSER_GET_ROOTHUB_SYMBOLIC_NAME 0x00000007
 #define USBUSER_GET_USB_DRIVER_VERSION    0x00000008
 #define USBUSER_GET_USB2_HW_VERSION       0x00000009
+#define USBUSER_USB_REFRESH_HCT_REG       0x0000000a
+
 #define USBUSER_OP_SEND_ONE_PACKET        0x10000001
 #define USBUSER_OP_RAW_RESET_PORT         0x20000001
 #define USBUSER_OP_OPEN_RAW_DEVICE        0x20000002
 #define USBUSER_OP_CLOSE_RAW_DEVICE       0x20000003
 #define USBUSER_OP_SEND_RAW_COMMAND       0x20000004
+#define USBUSER_SET_ROOTPORT_FEATURE      0x20000005
+#define USBUSER_CLEAR_ROOTPORT_FEATURE    0x20000006
+#define USBUSER_GET_ROOTPORT_STATUS       0x20000007
+
 #define USBUSER_INVALID_REQUEST           0xFFFFFFF0
 #define USBUSER_OP_MASK_DEVONLY_API       0x10000000
 #define USBUSER_OP_MASK_HCTEST_API        0x20000000
@@ -93,231 +99,249 @@ typedef enum _USB_USER_ERROR_CODE {
 #define USB_PACKETFLAG_TOGGLE0            0x00000100
 #define USB_PACKETFLAG_TOGGLE1            0x00000200
 
+/* USB_CONTROLLER_INFO_0.HcFeatureFlags constants */
+#define USB_HC_FEATURE_FLAG_PORT_POWER_SWITCHING  0x00000001
+#define USB_HC_FEATURE_FLAG_SEL_SUSPEND           0x00000002
+#define USB_HC_FEATURE_LEGACY_BIOS                0x00000004
+
+typedef struct _USBUSER_REQUEST_HEADER {
+  ULONG UsbUserRequest;
+  USB_USER_ERROR_CODE UsbUserStatusCode;
+  ULONG RequestBufferLength;
+  ULONG ActualBufferLength;
+} USBUSER_REQUEST_HEADER, *PUSBUSER_REQUEST_HEADER;
+
 typedef struct _PACKET_PARAMETERS {
-       UCHAR  DeviceAddress;
-       UCHAR  EndpointAddress;
-       USHORT  MaximumPacketSize;
-       ULONG  Timeout;
-       ULONG  Flags;
-       ULONG  DataLength;
-       USHORT  HubDeviceAddress;
-       USHORT  PortTTNumber;
-       UCHAR  ErrorCount;
-       UCHAR  Pad[3];
-       USBD_STATUS  UsbdStatusCode;
-       UCHAR  Data[4];
+  UCHAR DeviceAddress;
+  UCHAR EndpointAddress;
+  USHORT MaximumPacketSize;
+  ULONG Timeout;
+  ULONG Flags;
+  ULONG DataLength;
+  USHORT HubDeviceAddress;
+  USHORT PortTTNumber;
+  UCHAR ErrorCount;
+  UCHAR Pad[3];
+  USBD_STATUS UsbdStatusCode;
+  UCHAR Data[4];
 } PACKET_PARAMETERS, *PPACKET_PARAMETERS;
 
+typedef struct _USBUSER_SEND_ONE_PACKET {
+  USBUSER_REQUEST_HEADER Header;
+  PACKET_PARAMETERS PacketParameters;
+} USBUSER_SEND_ONE_PACKET, *PUSBUSER_SEND_ONE_PACKET;
+
 typedef struct _RAW_RESET_PORT_PARAMETERS {
-       USHORT  PortNumber;
-       USHORT  PortStatus;
+  USHORT PortNumber;
+  USHORT PortStatus;
 } RAW_RESET_PORT_PARAMETERS, *PRAW_RESET_PORT_PARAMETERS;
 
-typedef struct _USB_BANDWIDTH_INFO {
-       ULONG  DeviceCount;
-       ULONG  TotalBusBandwidth;
-       ULONG  Total32secBandwidth;
-       ULONG  AllocedBulkAndControl;
-       ULONG  AllocedIso;
-       ULONG  AllocedInterrupt_1ms;
-       ULONG  AllocedInterrupt_2ms;
-       ULONG  AllocedInterrupt_4ms;
-       ULONG  AllocedInterrupt_8ms;
-       ULONG  AllocedInterrupt_16ms;
-       ULONG  AllocedInterrupt_32ms;
-} USB_BANDWIDTH_INFO, *PUSB_BANDWIDTH_INFO;
-
-typedef struct _USBUSER_REQUEST_HEADER {
-       ULONG  UsbUserRequest;
-       USB_USER_ERROR_CODE  UsbUserStatusCode;
-       ULONG  RequestBufferLength;
-       ULONG  ActualBufferLength;
-} USBUSER_REQUEST_HEADER, *PUSBUSER_REQUEST_HEADER;
-
-typedef struct _USBUSER_BANDWIDTH_INFO_REQUEST {
-       USBUSER_REQUEST_HEADER  Header;
-       USB_BANDWIDTH_INFO  BandwidthInformation;
-} USBUSER_BANDWIDTH_INFO_REQUEST, *PUSBUSER_BANDWIDTH_INFO_REQUEST;
-
-typedef struct _USB_BUS_STATISTICS_0 {
-       ULONG  DeviceCount;
-       LARGE_INTEGER  CurrentSystemTime;
-       ULONG  CurrentUsbFrame;
-       ULONG  BulkBytes;
-       ULONG  IsoBytes;
-       ULONG  InterruptBytes;
-       ULONG  ControlDataBytes;
-       ULONG  PciInterruptCount;
-       ULONG  HardResetCount;
-       ULONG  WorkerSignalCount;
-       ULONG  CommonBufferBytes;
-       ULONG  WorkerIdleTimeMs;
-       BOOLEAN  RootHubEnabled;
-       UCHAR  RootHubDevicePowerState;
-       UCHAR  Unused;
-       UCHAR  NameIndex;
-} USB_BUS_STATISTICS_0, *PUSB_BUS_STATISTICS_0;
+typedef struct _USBUSER_RAW_RESET_ROOT_PORT {
+  USBUSER_REQUEST_HEADER Header;
+  RAW_RESET_PORT_PARAMETERS Parameters;
+} USBUSER_RAW_RESET_ROOT_PORT, *PUSBUSER_RAW_RESET_ROOT_PORT;
 
-typedef struct _USBUSER_BUS_STATISTICS_0_REQUEST {
-       USBUSER_REQUEST_HEADER  Header;
-       USB_BUS_STATISTICS_0  BusStatistics0;
-} USBUSER_BUS_STATISTICS_0_REQUEST, *PUSBUSER_BUS_STATISTICS_0_REQUEST;
+typedef struct _RAW_ROOTPORT_FEATURE {
+  USHORT PortNumber;
+  USHORT PortFeature;
+  USHORT PortStatus;
+} RAW_ROOTPORT_FEATURE, *PRAW_ROOTPORT_FEATURE;
 
-/* USB_CONTROLLER_INFO_0.HcFeatureFlags constants */
-#define USB_HC_FEATURE_FLAG_PORT_POWER_SWITCHING  0x00000001
-#define USB_HC_FEATURE_FLAG_SEL_SUSPEND           0x00000002
-#define USB_HC_FEATURE_LEGACY_BIOS                0x00000004
+typedef struct _USBUSER_ROOTPORT_FEATURE_REQUEST {
+  USBUSER_REQUEST_HEADER Header;
+  RAW_ROOTPORT_FEATURE Parameters;
+} USBUSER_ROOTPORT_FEATURE_REQUEST, *PUSBUSER_ROOTPORT_FEATURE_REQUEST;
 
-typedef struct _USB_CLOSE_RAW_DEVICE_PARAMETERS {
-  ULONG  xxx;
-} USB_CLOSE_RAW_DEVICE_PARAMETERS , *PUSB_CLOSE_RAW_DEVICE_PARAMETERS;
+typedef struct _RAW_ROOTPORT_PARAMETERS {
+  USHORT PortNumber;
+  USHORT PortStatus;
+} RAW_ROOTPORT_PARAMETERS, *PRAW_ROOTPORT_PARAMETERS;
 
-typedef struct _USBUSER_CLOSE_RAW_DEVICE {
-       USBUSER_REQUEST_HEADER  Header;
-       USB_CLOSE_RAW_DEVICE_PARAMETERS  Parameters;
-} USBUSER_CLOSE_RAW_DEVICE, *PUSBUSER_CLOSE_RAW_DEVICE;
+typedef struct _USBUSER_ROOTPORT_PARAMETERS {
+  USBUSER_REQUEST_HEADER Header;
+  RAW_ROOTPORT_PARAMETERS Parameters;
+} USBUSER_ROOTPORT_PARAMETERS, *PUSBUSER_ROOTPORT_PARAMETERS;
 
 typedef struct _USB_CONTROLLER_INFO_0 {
-  ULONG  PciVendorId;
-  ULONG  PciDeviceId;
-  ULONG  PciRevision;
-  ULONG  NumberOfRootPorts;
-  USB_CONTROLLER_FLAVOR  ControllerFlavor;
-  ULONG  HcFeatureFlags;
+  ULONG PciVendorId;
+  ULONG PciDeviceId;
+  ULONG PciRevision;
+  ULONG NumberOfRootPorts;
+  USB_CONTROLLER_FLAVOR ControllerFlavor;
+  ULONG HcFeatureFlags;
 } USB_CONTROLLER_INFO_0 , *PUSB_CONTROLLER_INFO_0;
 
 typedef struct _USBUSER_CONTROLLER_INFO_0 {
-  USBUSER_REQUEST_HEADER  Header;
-  USB_CONTROLLER_INFO_0  Info0;
+  USBUSER_REQUEST_HEADER Header;
+  USB_CONTROLLER_INFO_0 Info0;
 } USBUSER_CONTROLLER_INFO_0, *PUSBUSER_CONTROLLER_INFO_0;
 
-typedef struct _USB_DRIVER_VERSION_PARAMETERS {
-       ULONG  DriverTrackingCode;
-       ULONG  USBDI_Version;
-       ULONG  USBUSER_Version;
-       BOOLEAN  CheckedPortDriver;
-       BOOLEAN  CheckedMiniportDriver;
-       USHORT  USB_Version;
-} USB_DRIVER_VERSION_PARAMETERS , *PUSB_DRIVER_VERSION_PARAMETERS;
+typedef struct _USB_UNICODE_NAME {
+  ULONG Length;
+  WCHAR String[1];
+} USB_UNICODE_NAME, *PUSB_UNICODE_NAME;
 
-typedef struct _USBUSER_GET_DRIVER_VERSION {
-       USBUSER_REQUEST_HEADER  Header;
-       USB_DRIVER_VERSION_PARAMETERS  Parameters;
-} USBUSER_GET_DRIVER_VERSION, *PUSBUSER_GET_DRIVER_VERSION;
+typedef struct _USBUSER_CONTROLLER_UNICODE_NAME {
+  USBUSER_REQUEST_HEADER Header;
+  USB_UNICODE_NAME UnicodeName;
+} USBUSER_CONTROLLER_UNICODE_NAME, *PUSBUSER_CONTROLLER_UNICODE_NAME;
 
-typedef struct _USB_OPEN_RAW_DEVICE_PARAMETERS {
-       USHORT  PortStatus;
-       USHORT  MaxPacketEp0;
-} USB_OPEN_RAW_DEVICE_PARAMETERS , *PUSB_OPEN_RAW_DEVICE_PARAMETERS;
+typedef struct _USB_PASS_THRU_PARAMETERS {
+  GUID FunctionGUID;
+  ULONG ParameterLength;
+  UCHAR Parameters[4];
+} USB_PASS_THRU_PARAMETERS, *PUSB_PASS_THRU_PARAMETERS;
 
-typedef struct _USBUSER_OPEN_RAW_DEVICE {
-       USBUSER_REQUEST_HEADER  Header;
-       USB_OPEN_RAW_DEVICE_PARAMETERS  Parameters;
-} USBUSER_OPEN_RAW_DEVICE, *PUSBUSER_OPEN_RAW_DEVICE;
+typedef struct _USBUSER_PASS_THRU_REQUEST {
+  USBUSER_REQUEST_HEADER Header;
+  USB_PASS_THRU_PARAMETERS PassThru;
+} USBUSER_PASS_THRU_REQUEST, *PUSBUSER_PASS_THRU_REQUEST;
 
 typedef enum _WDMUSB_POWER_STATE {
-       WdmUsbPowerNotMapped = 0,
-       WdmUsbPowerSystemUnspecified = 100,
-       WdmUsbPowerSystemWorking,
-       WdmUsbPowerSystemSleeping1,
-       WdmUsbPowerSystemSleeping2,
-       WdmUsbPowerSystemSleeping3,
-       WdmUsbPowerSystemHibernate,
-       WdmUsbPowerSystemShutdown,
-       WdmUsbPowerDeviceUnspecified = 200,
-       WdmUsbPowerDeviceD0,
-       WdmUsbPowerDeviceD1,
-       WdmUsbPowerDeviceD2,
-       WdmUsbPowerDeviceD3
+  WdmUsbPowerNotMapped = 0,
+  WdmUsbPowerSystemUnspecified = 100,
+  WdmUsbPowerSystemWorking,
+  WdmUsbPowerSystemSleeping1,
+  WdmUsbPowerSystemSleeping2,
+  WdmUsbPowerSystemSleeping3,
+  WdmUsbPowerSystemHibernate,
+  WdmUsbPowerSystemShutdown,
+  WdmUsbPowerDeviceUnspecified = 200,
+  WdmUsbPowerDeviceD0,
+  WdmUsbPowerDeviceD1,
+  WdmUsbPowerDeviceD2,
+  WdmUsbPowerDeviceD3
 } WDMUSB_POWER_STATE;
 
 typedef struct _USB_POWER_INFO {
-       WDMUSB_POWER_STATE  SystemState;
-       WDMUSB_POWER_STATE  HcDevicePowerState;
-       WDMUSB_POWER_STATE  HcDeviceWake;
-       WDMUSB_POWER_STATE  HcSystemWake;
-       WDMUSB_POWER_STATE  RhDevicePowerState;
-       WDMUSB_POWER_STATE  RhDeviceWake;
-       WDMUSB_POWER_STATE  RhSystemWake;
-       WDMUSB_POWER_STATE  LastSystemSleepState;
-       BOOLEAN  CanWakeup;
-       BOOLEAN  IsPowered;
+  WDMUSB_POWER_STATE SystemState;
+  WDMUSB_POWER_STATE HcDevicePowerState;
+  WDMUSB_POWER_STATE HcDeviceWake;
+  WDMUSB_POWER_STATE HcSystemWake;
+  WDMUSB_POWER_STATE RhDevicePowerState;
+  WDMUSB_POWER_STATE RhDeviceWake;
+  WDMUSB_POWER_STATE RhSystemWake;
+  WDMUSB_POWER_STATE LastSystemSleepState;
+  BOOLEAN CanWakeup;
+  BOOLEAN IsPowered;
 } USB_POWER_INFO, *PUSB_POWER_INFO;
 
 typedef struct _USBUSER_POWER_INFO_REQUEST {
-       USBUSER_REQUEST_HEADER  Header;
-       USB_POWER_INFO  PowerInformation;
+  USBUSER_REQUEST_HEADER Header;
+  USB_POWER_INFO PowerInformation;
 } USBUSER_POWER_INFO_REQUEST, *PUSBUSER_POWER_INFO_REQUEST;
 
-typedef struct _USB_UNICODE_NAME {
-       ULONG  Length;
-       WCHAR  String[1];
-} USB_UNICODE_NAME, *PUSB_UNICODE_NAME;
-
-typedef struct _USBUSER_CONTROLLER_UNICODE_NAME {
-       USBUSER_REQUEST_HEADER  Header;
-  USB_UNICODE_NAME  UnicodeName;
-} USBUSER_CONTROLLER_UNICODE_NAME, *PUSBUSER_CONTROLLER_UNICODE_NAME;
-
-typedef struct _USB_PASS_THRU_PARAMETERS {
-       GUID  FunctionGUID;
-       ULONG  ParameterLength;
-       UCHAR  Parameters[4];
-} USB_PASS_THRU_PARAMETERS, *PUSB_PASS_THRU_PARAMETERS;
+typedef struct _USB_OPEN_RAW_DEVICE_PARAMETERS {
+  USHORT PortStatus;
+  USHORT MaxPacketEp0;
+} USB_OPEN_RAW_DEVICE_PARAMETERS , *PUSB_OPEN_RAW_DEVICE_PARAMETERS;
 
-typedef struct _USBUSER_PASS_THRU_REQUEST {
-       USBUSER_REQUEST_HEADER  Header;
-       USB_PASS_THRU_PARAMETERS  PassThru;
-} USBUSER_PASS_THRU_REQUEST, *PUSBUSER_PASS_THRU_REQUEST;
+typedef struct _USBUSER_OPEN_RAW_DEVICE {
+  USBUSER_REQUEST_HEADER Header;
+  USB_OPEN_RAW_DEVICE_PARAMETERS Parameters;
+} USBUSER_OPEN_RAW_DEVICE, *PUSBUSER_OPEN_RAW_DEVICE;
 
-typedef struct _USBUSER_RAW_RESET_ROOT_PORT {
-       USBUSER_REQUEST_HEADER  Header;
-       RAW_RESET_PORT_PARAMETERS  Parameters;
-} USBUSER_RAW_RESET_ROOT_PORT, *PUSBUSER_RAW_RESET_ROOT_PORT;
+typedef struct _USB_CLOSE_RAW_DEVICE_PARAMETERS {
+  ULONG xxx;
+} USB_CLOSE_RAW_DEVICE_PARAMETERS , *PUSB_CLOSE_RAW_DEVICE_PARAMETERS;
 
-typedef struct _USBUSER_SEND_ONE_PACKET {
-       USBUSER_REQUEST_HEADER  Header;
-       PACKET_PARAMETERS  PacketParameters;
-} USBUSER_SEND_ONE_PACKET, *PUSBUSER_SEND_ONE_PACKET;
+typedef struct _USBUSER_CLOSE_RAW_DEVICE {
+  USBUSER_REQUEST_HEADER Header;
+  USB_CLOSE_RAW_DEVICE_PARAMETERS Parameters;
+} USBUSER_CLOSE_RAW_DEVICE, *PUSBUSER_CLOSE_RAW_DEVICE;
 
 typedef struct _USB_SEND_RAW_COMMAND_PARAMETERS {
-       UCHAR  Usb_bmRequest;
-       UCHAR  Usb_bRequest;
-       USHORT  Usb_wVlaue;
-       USHORT  Usb_wIndex;
-       USHORT  Usb_wLength;
-       USHORT  DeviceAddress;
-       USHORT  MaximumPacketSize;
-       ULONG  Timeout;
-       ULONG  DataLength;
-       USBD_STATUS  UsbdStatusCode;
-       UCHAR  Data[4];
+  UCHAR Usb_bmRequest;
+  UCHAR Usb_bRequest;
+  USHORT Usb_wVlaue;
+  USHORT Usb_wIndex;
+  USHORT Usb_wLength;
+  USHORT DeviceAddress;
+  USHORT MaximumPacketSize;
+  ULONG Timeout;
+  ULONG DataLength;
+  USBD_STATUS UsbdStatusCode;
+  UCHAR Data[4];
 } USB_SEND_RAW_COMMAND_PARAMETERS, *PUSB_SEND_RAW_COMMAND_PARAMETERS;
 
 typedef struct _USBUSER_SEND_RAW_COMMAND {
-       USBUSER_REQUEST_HEADER  Header;
-       USB_SEND_RAW_COMMAND_PARAMETERS  Parameters;
+  USBUSER_REQUEST_HEADER Header;
+  USB_SEND_RAW_COMMAND_PARAMETERS Parameters;
 } USBUSER_SEND_RAW_COMMAND, *PUSBUSER_SEND_RAW_COMMAND;
 
-/* USB_USB2HW_VERSION_PARAMETERS.Usb2HwRevision constants */
-#define USB2HW_UNKNOWN                    0x00
-#define USB2HW_A0                         0xA0
-#define USB2HW_A1                         0xA1
-#define USB2HW_B0                         0xB0
+typedef struct _USB_BANDWIDTH_INFO {
+  ULONG DeviceCount;
+  ULONG TotalBusBandwidth;
+  ULONG Total32secBandwidth;
+  ULONG AllocedBulkAndControl;
+  ULONG AllocedIso;
+  ULONG AllocedInterrupt_1ms;
+  ULONG AllocedInterrupt_2ms;
+  ULONG AllocedInterrupt_4ms;
+  ULONG AllocedInterrupt_8ms;
+  ULONG AllocedInterrupt_16ms;
+  ULONG AllocedInterrupt_32ms;
+} USB_BANDWIDTH_INFO, *PUSB_BANDWIDTH_INFO;
+
+typedef struct _USBUSER_BANDWIDTH_INFO_REQUEST {
+  USBUSER_REQUEST_HEADER Header;
+  USB_BANDWIDTH_INFO BandwidthInformation;
+} USBUSER_BANDWIDTH_INFO_REQUEST, *PUSBUSER_BANDWIDTH_INFO_REQUEST;
+
+typedef struct _USB_BUS_STATISTICS_0 {
+  ULONG DeviceCount;
+  LARGE_INTEGER CurrentSystemTime;
+  ULONG CurrentUsbFrame;
+  ULONG BulkBytes;
+  ULONG IsoBytes;
+  ULONG InterruptBytes;
+  ULONG ControlDataBytes;
+  ULONG PciInterruptCount;
+  ULONG HardResetCount;
+  ULONG WorkerSignalCount;
+  ULONG CommonBufferBytes;
+  ULONG WorkerIdleTimeMs;
+  BOOLEAN RootHubEnabled;
+  UCHAR RootHubDevicePowerState;
+  UCHAR Unused;
+  UCHAR NameIndex;
+} USB_BUS_STATISTICS_0, *PUSB_BUS_STATISTICS_0;
+
+typedef struct _USBUSER_BUS_STATISTICS_0_REQUEST {
+  USBUSER_REQUEST_HEADER Header;
+  USB_BUS_STATISTICS_0 BusStatistics0;
+} USBUSER_BUS_STATISTICS_0_REQUEST, *PUSBUSER_BUS_STATISTICS_0_REQUEST;
+
+typedef struct _USB_DRIVER_VERSION_PARAMETERS {
+  ULONG DriverTrackingCode;
+  ULONG USBDI_Version;
+  ULONG USBUSER_Version;
+  BOOLEAN CheckedPortDriver;
+  BOOLEAN CheckedMiniportDriver;
+  USHORT USB_Version;
+} USB_DRIVER_VERSION_PARAMETERS , *PUSB_DRIVER_VERSION_PARAMETERS;
+
+typedef struct _USBUSER_GET_DRIVER_VERSION {
+  USBUSER_REQUEST_HEADER Header;
+  USB_DRIVER_VERSION_PARAMETERS Parameters;
+} USBUSER_GET_DRIVER_VERSION, *PUSBUSER_GET_DRIVER_VERSION;
 
 typedef struct _USB_USB2HW_VERSION_PARAMETERS {
-  UCHAR  Usb2HwRevision;
+  UCHAR Usb2HwRevision;
 } USB_USB2HW_VERSION_PARAMETERS, *PUSB_USB2HW_VERSION_PARAMETERS;
 
 typedef struct _USBUSER_GET_USB2HW_VERSION {
-       USBUSER_REQUEST_HEADER  Header;
-       USB_USB2HW_VERSION_PARAMETERS  Parameters;
+  USBUSER_REQUEST_HEADER Header;
+  USB_USB2HW_VERSION_PARAMETERS Parameters;
 } USBUSER_GET_USB2HW_VERSION, *PUSBUSER_GET_USB2HW_VERSION;
 
+typedef struct _USBUSER_REFRESH_HCT_REG {
+  USBUSER_REQUEST_HEADER Header;
+  ULONG Flags;
+} USBUSER_REFRESH_HCT_REG, *PUSBUSER_REFRESH_HCT_REG;
+
 #include <poppack.h>
 
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* __USBUSER_H */
index ed62545..83d6dba 100644 (file)
@@ -499,7 +499,7 @@ BOOL    VFWAPI  ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR
 BOOL    VFWAPI  ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags);
 LRESULT        VFWAPI  ICGetInfo(HIC hic,ICINFO *picinfo, DWORD cb);
 HIC    VFWAPI  ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode);
-HIC    VFWAPI  ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler);
+HIC    VFWAPI  ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, DRIVERPROC lpfnHandler);
 
 LRESULT VFWAPI ICClose(HIC hic);
 HIC    VFWAPI  ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, WORD wFlags);
index ca1549f..b7a5fd2 100644 (file)
@@ -1807,9 +1807,7 @@ BOOL WINAPI InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION,DWORD);
 DWORD WINAPI SetCriticalSectionSpinCount(LPCRITICAL_SECTION,DWORD);
 BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR,DWORD);
 BOOL WINAPI InitializeSid (PSID,PSID_IDENTIFIER_AUTHORITY,BYTE);
-#if !defined(__WINDDK_H) && _WIN32_WINNT >= 0x0501
-VOID WINAPI InitializeSListHead(PSLIST_HEADER);
-#endif
+
 #if (_WIN32_WINNT >= 0x0600)
 VOID WINAPI InitializeSRWLock(PSRWLOCK);
 #endif
@@ -1881,7 +1879,15 @@ PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY);
 
 #endif // !(defined (_M_AMD64) || defined (_M_IA64))
 
-VOID WINAPI InitializeSListHead(PSLIST_HEADER);
+#if defined(_SLIST_HEADER_) && !defined(_NTOSP_)
+
+WINBASEAPI
+VOID
+WINAPI
+InitializeSListHead (
+  IN OUT PSLIST_HEADER ListHead);
+#endif
+
 USHORT WINAPI QueryDepthSList(PSLIST_HEADER);
 
 #ifdef _MSC_VER
index 8e8dfe6..1bcb2cd 100644 (file)
@@ -72,6 +72,14 @@ typedef enum WICBitmapEncoderCacheOption {
     WICBITMAPENCODERCACHEOPTION_FORCE_DWORD = CODEC_FORCE_DWORD
 } WICBitmapEncoderCacheOption;
 
+typedef enum WICBitmapInterpolationMode {
+    WICBitmapInterpolationModeNearestNeighbor = 0x00000000,
+    WICBitmapInterpolationModeLinear = 0x00000001,
+    WICBitmapInterpolationModeCubic = 0x00000002,
+    WICBitmapInterpolationModeFaint = 0x00000003,
+    WICBITMAPINTERPOLATIONMODE_FORCE_DWORD = CODEC_FORCE_DWORD
+} WICBitmapInterpolationMode;
+
 typedef enum WICBitmapPaletteType {
     WICBitmapPaletteTypeCustom = 0x00000000,
     WICBitmapPaletteTypeMedianCut = 0x00000001,
@@ -169,9 +177,7 @@ cpp_quote("#define WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT 0x88982f80")
 cpp_quote("#define WINCODEC_ERR_UNSUPPORTEDOPERATION 0x88982f81")
 cpp_quote("#define WINCODEC_ERR_INSUFFICIENTBUFFER 0x88982f8c")
 
-interface IWICBitmap;
 interface IWICPalette;
-interface IWICBitmapScaler;
 interface IWICBitmapClipper;
 interface IWICBitmapFlipRotator;
 interface IWICColorContext;
@@ -207,6 +213,46 @@ interface IWICBitmapSource : IUnknown
         [out, size_is(cbBufferSize)] BYTE *pbBuffer);
 }
 
+[
+    object,
+    uuid(00000123-a8f2-4877-ba0a-fd2b6645fb94)
+]
+interface IWICBitmapLock : IUnknown
+{
+    HRESULT GetSize(
+        [out] UINT *pWidth,
+        [out] UINT *pHeight);
+
+    HRESULT GetStride(
+        [out] UINT *pcbStride);
+
+    HRESULT GetDataPointer(
+        [out] UINT *pcbBufferSize,
+        [out, size_is(,*pcbBufferSize)] BYTE **ppbData);
+
+    HRESULT GetPixelFormat(
+        [out] WICPixelFormatGUID *pPixelFormat);
+}
+
+[
+    object,
+    uuid(00000121-a8f2-4877-ba0a-fd2b6645fb94)
+]
+interface IWICBitmap : IWICBitmapSource
+{
+    HRESULT Lock(
+        [in] const WICRect *prcLock,
+        [in] DWORD flags,
+        [out] IWICBitmapLock **ppILock);
+
+    HRESULT SetPalette(
+        [in] IWICPalette *pIPalette);
+
+    HRESULT SetResolution(
+        [in] double dpiX,
+        [in] double dpiY);
+}
+
 [
     object,
     uuid(00000040-a8f2-4877-ba0a-fd2b6645fb94)
@@ -586,6 +632,19 @@ interface IWICStream : IStream
         [in] ULARGE_INTEGER ulMaxSize);
 }
 
+[
+    object,
+    uuid(00000302-a8f2-4877-ba0a-fd2b6645fb94)
+]
+interface IWICBitmapScaler : IWICBitmapSource
+{
+    HRESULT Initialize(
+        [in] IWICBitmapSource *pISource,
+        [in] UINT uiWidth,
+        [in] UINT uiHeight,
+        [in] WICBitmapInterpolationMode mode);
+}
+
 cpp_quote("DEFINE_GUID(CLSID_WICImagingFactory, 0xcacaf262,0x9370,0x4615,0xa1,0x3b,0x9f,0x55,0x39,0xda,0x4c,0x0a);")
 
 [
index af79c64..3f7f4ed 100644 (file)
@@ -1339,14 +1339,18 @@ typedef struct _CRYPT_URL_INFO {
     DWORD *rgcGroupEntry;
 } CRYPT_URL_INFO, *PCRYPT_URL_INFO;
 
-#define URL_OID_CERTIFICATE_ISSUER         ((LPCSTR)1)
-#define URL_OID_CERTIFICATE_CRL_DIST_POINT ((LPCSTR)2)
-#define URL_OID_CTL_ISSUER                 ((LPCSTR)3)
-#define URL_OID_CTL_NEXT_UPDATE            ((LPCSTR)4)
-#define URL_OID_CRL_ISSUER                 ((LPCSTR)5)
-#define URL_OID_CERTIFICATE_FRESHEST_CRL   ((LPCSTR)6)
-#define URL_OID_CRL_FRESHEST_CRL           ((LPCSTR)7)
-#define URL_OID_CROSS_CERT_DIST_POINT      ((LPCSTR)8)
+#define URL_OID_CERTIFICATE_ISSUER                  ((LPCSTR)1)
+#define URL_OID_CERTIFICATE_CRL_DIST_POINT          ((LPCSTR)2)
+#define URL_OID_CTL_ISSUER                          ((LPCSTR)3)
+#define URL_OID_CTL_NEXT_UPDATE                     ((LPCSTR)4)
+#define URL_OID_CRL_ISSUER                          ((LPCSTR)5)
+#define URL_OID_CERTIFICATE_FRESHEST_CRL            ((LPCSTR)6)
+#define URL_OID_CRL_FRESHEST_CRL                    ((LPCSTR)7)
+#define URL_OID_CROSS_CERT_DIST_POINT               ((LPCSTR)8)
+#define URL_OID_CERTIFICATE_OCSP                    ((LPCSTR)9)
+#define URL_OID_CERTIFICATE_OCSP_AND_CRL_DIST_POINT ((LPCSTR)10)
+#define URL_OID_CERTIFICATE_CRL_DIST_POINT_AND_OCSP ((LPCSTR)11)
+#define URL_OID_CROSS_CERT_SUBJECT_INFO_ACCESS      ((LPCSTR)12)
 
 #define URL_OID_GET_OBJECT_URL_FUNC "UrlDllGetObjectUrl"
 
@@ -2778,6 +2782,9 @@ typedef struct _CTL_FIND_SUBJECT_PARA
 #define szOID_RSA_MD5RSA                    "1.2.840.113549.1.1.4"
 #define szOID_RSA_SHA1RSA                   "1.2.840.113549.1.1.5"
 #define szOID_RSA_SET0AEP_RSA               "1.2.840.113549.1.1.6"
+#define szOID_RSA_SHA256RSA                 "1.2.840.113549.1.1.11"
+#define szOID_RSA_SHA384RSA                 "1.2.840.113549.1.1.12"
+#define szOID_RSA_SHA512RSA                 "1.2.840.113549.1.1.13"
 #define szOID_RSA_DH                        "1.2.840.113549.1.3.1"
 #define szOID_RSA_data                      "1.2.840.113549.1.7.1"
 #define szOID_RSA_signedData                "1.2.840.113549.1.7.2"
index e885d9e..a168b26 100644 (file)
@@ -64,8 +64,13 @@ extern "C" {
 #ifndef TRUE
 #define TRUE 1
 #endif
+
+#ifndef IN
 #define IN
+#endif
+#ifndef OUT
 #define OUT
+#endif
 #ifndef OPTIONAL
 #define OPTIONAL
 #endif
@@ -204,16 +209,13 @@ extern "C" {
 #define DBG_UNREFERENCED_PARAMETER(P)
 #define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
 
+#ifndef __ANONYMOUS_DEFINED
+#define __ANONYMOUS_DEFINED
+
 #ifndef NONAMELESSUNION
 #ifdef __GNUC__
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
 #define _ANONYMOUS_UNION __extension__
 #define _ANONYMOUS_STRUCT __extension__
-#else
-#if defined(__cplusplus)
-#define _ANONYMOUS_UNION __extension__
-#endif /* __cplusplus */
-#endif /* __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) */
 #elif defined(__WATCOMC__) || defined(_MSC_VER)
 #define _ANONYMOUS_UNION
 #define _ANONYMOUS_STRUCT
@@ -263,6 +265,8 @@ extern "C" {
 #define DUMMYSTRUCTNAME5
 #endif
 
+#endif /* __ANONYMOUS_DEFINED */
+
 #ifndef NO_STRICT
 #ifndef STRICT
 #define STRICT 1
index 68d3166..f67ab61 100644 (file)
@@ -2917,6 +2917,7 @@ BOOL WINAPI FlattenPath(HDC);
 BOOL WINAPI FloodFill(HDC,int,int,COLORREF);
 BOOL WINAPI GdiAlphaBlend(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION);
 BOOL WINAPI GdiComment(HDC,UINT,const BYTE*);
+DEVMODEW* WINAPI GdiConvertToDevmodeW(const DEVMODEA *);
 BOOL WINAPI GdiFlush(void);
 DWORD WINAPI GdiGetBatchLimit(void);
 DWORD WINAPI GdiSetBatchLimit(DWORD);
index 78700be..f84a8ac 100644 (file)
@@ -403,7 +403,7 @@ typedef DWORD FLONG;
 #define FILE_CREATE_TREE_CONNECTION    0x00000080
 #define FILE_COMPLETE_IF_OPLOCKED      0x00000100
 #define FILE_NO_EA_KNOWLEDGE           0x00000200
-#define FILE_OPEN_FOR_RECOVERY         0x00000400
+#define FILE_OPEN_REMOTE_INSTANCE      0x00000400
 #define FILE_RANDOM_ACCESS             0x00000800
 #define FILE_DELETE_ON_CLOSE           0x00001000
 #define FILE_OPEN_BY_FILE_ID           0x00002000
@@ -1127,6 +1127,7 @@ typedef enum {
 #define LANG_SYSTEM_DEFAULT    MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT)
 #define LANG_USER_DEFAULT      MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT)
 #define LOCALE_NEUTRAL MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT)
+#define LOCALE_INVARIANT MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT)
 #define ACL_REVISION   2
 #define ACL_REVISION_DS 4
 #define ACL_REVISION1 1
index 1464c6e..7f1a739 100644 (file)
@@ -871,20 +871,20 @@ typedef struct _UNWIND_HISTORY_TABLE {
  */
 
 /* This is used by NtQuerySystemInformation */
-typedef struct _SYSTEM_THREAD_INFORMATION{
-    FILETIME    ftKernelTime;
-    FILETIME    ftUserTime;
-    FILETIME    ftCreateTime;
-    DWORD       dwTickCount;
-    DWORD       dwStartAddress;
-    DWORD       dwOwningPID;
-    DWORD       dwThreadID;
-    DWORD       dwCurrentPriority;
-    DWORD       dwBasePriority;
-    DWORD       dwContextSwitches;
-    DWORD       dwThreadState;
-    DWORD       dwWaitReason;
-    DWORD       dwUnknown;
+typedef struct _SYSTEM_THREAD_INFORMATION
+{                                    /* win32/win64 */
+    LARGE_INTEGER KernelTime;          /* 00/00 */
+    LARGE_INTEGER UserTime;            /* 08/08 */
+    LARGE_INTEGER CreateTime;          /* 10/10 */
+    DWORD         dwTickCount;         /* 18/18 */
+    LPVOID        StartAddress;        /* 1c/20 */
+    CLIENT_ID     ClientId;            /* 20/28 */
+    DWORD         dwCurrentPriority;   /* 28/38 */
+    DWORD         dwBasePriority;      /* 2c/3c */
+    DWORD         dwContextSwitches;   /* 30/40 */
+    DWORD         dwThreadState;       /* 34/44 */
+    DWORD         dwWaitReason;        /* 38/48 */
+    DWORD         dwUnknown;           /* 3c/4c */
 } SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION;
 
 typedef struct _IO_STATUS_BLOCK {
@@ -1195,38 +1195,39 @@ typedef struct _VM_COUNTERS_ {
     SIZE_T QuotaNonPagedPoolUsage;
     SIZE_T PagefileUsage;
     SIZE_T PeakPagefileUsage;
+    SIZE_T PrivatePageCount;
 } VM_COUNTERS, *PVM_COUNTERS;
 
 typedef struct _SYSTEM_PROCESS_INFORMATION {
-#ifdef __WINESRC__
-    DWORD dwOffset;
-    DWORD dwThreadCount;
-    DWORD dwUnknown1[6];
-    FILETIME ftCreationTime;
-    FILETIME ftUserTime;
-    FILETIME ftKernelTime;
-    UNICODE_STRING ProcessName;
-    DWORD dwBasePriority;
-    DWORD dwProcessID;
-    DWORD dwParentProcessID;
-    DWORD dwHandleCount;
-    DWORD dwUnknown3;
-    DWORD dwUnknown4;
-    VM_COUNTERS vmCounters;
-    IO_COUNTERS ioCounters;
-    SYSTEM_THREAD_INFORMATION ti[1];
+#ifdef __WINESRC__                  /* win32/win64 */
+    ULONG NextEntryOffset;             /* 00/00 */
+    DWORD dwThreadCount;               /* 04/04 */
+    DWORD dwUnknown1[6];               /* 08/08 */
+    LARGE_INTEGER CreationTime;        /* 20/20 */
+    LARGE_INTEGER UserTime;            /* 28/28 */
+    LARGE_INTEGER KernelTime;          /* 30/30 */
+    UNICODE_STRING ProcessName;        /* 38/38 */
+    DWORD dwBasePriority;              /* 40/48 */
+    HANDLE UniqueProcessId;            /* 44/50 */
+    HANDLE ParentProcessId;            /* 48/58 */
+    ULONG HandleCount;                 /* 4c/60 */
+    DWORD dwUnknown3;                  /* 50/64 */
+    DWORD dwUnknown4;                  /* 54/68 */
+    VM_COUNTERS vmCounters;            /* 58/70 */
+    IO_COUNTERS ioCounters;            /* 88/d0 */
+    SYSTEM_THREAD_INFORMATION ti[1];   /* b8/100 */
 #else
-    ULONG NextEntryOffset;
-    BYTE Reserved1[52];
-    PVOID Reserved2[3];
-    HANDLE UniqueProcessId;
-    PVOID Reserved3;
-    ULONG HandleCount;
-    BYTE Reserved4[4];
-    PVOID Reserved5[11];
-    SIZE_T PeakPagefileUsage;
-    SIZE_T PrivatePageCount;
-    LARGE_INTEGER Reserved6[6];
+    ULONG NextEntryOffset;             /* 00/00 */
+    BYTE Reserved1[52];                /* 04/04 */
+    PVOID Reserved2[3];                /* 38/38 */
+    HANDLE UniqueProcessId;            /* 44/50 */
+    PVOID Reserved3;                   /* 48/58 */
+    ULONG HandleCount;                 /* 4c/60 */
+    BYTE Reserved4[4];                 /* 50/64 */
+    PVOID Reserved5[11];               /* 54/68 */
+    SIZE_T PeakPagefileUsage;          /* 80/c0 */
+    SIZE_T PrivatePageCount;           /* 84/c8 */
+    LARGE_INTEGER Reserved6[6];        /* 88/d0 */
 #endif
 } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
 
@@ -1398,7 +1399,7 @@ typedef struct _RTL_HANDLE_TABLE
 #define FILE_CREATE_TREE_CONNECTION     0x00000080
 #define FILE_COMPLETE_IF_OPLOCKED       0x00000100
 #define FILE_NO_EA_KNOWLEDGE            0x00000200
-#define FILE_OPEN_FOR_RECOVERY          0x00000400
+#define FILE_OPEN_REMOTE_INSTANCE       0x00000400
 #define FILE_RANDOM_ACCESS              0x00000800
 #define FILE_DELETE_ON_CLOSE            0x00001000
 #define FILE_OPEN_BY_FILE_ID            0x00002000
@@ -1553,7 +1554,7 @@ typedef struct _KEY_MULTIPLE_VALUE_INFORMATION
   ULONG Type;
 } KEY_MULTIPLE_VALUE_INFORMATION, *PKEY_MULTIPLE_VALUE_INFORMATION;
 
-typedef VOID (*PTIMER_APC_ROUTINE) ( PVOID, ULONG, LONG );
+typedef VOID (CALLBACK *PTIMER_APC_ROUTINE) ( PVOID, ULONG, LONG );
 
 typedef enum _EVENT_TYPE {
   NotificationEvent,
index f08e1fa..17d17df 100644 (file)
@@ -1993,11 +1993,16 @@ extern "C" {
 #define SBM_ENABLE_ARROWS 228
 #define SBM_GETPOS 225
 #define SBM_GETRANGE 227
-#define SBM_GETSCROLLINFO 234
 #define SBM_SETPOS 224
 #define SBM_SETRANGE 226
 #define SBM_SETRANGEREDRAW 230
+#if (_WIN32_WINNT >= 0x0400)
+#define SBM_GETSCROLLINFO 234
 #define SBM_SETSCROLLINFO 233
+#endif
+#if (_WIN32_WINNT >= 0x0501)
+#define SBM_GETSCROLLBARINFO 235
+#endif
 #define STM_GETICON 369
 #define STM_GETIMAGE 371
 #define STM_SETICON 368
@@ -2441,8 +2446,18 @@ extern "C" {
 #define ODS_DISABLED 4
 #define ODS_CHECKED 8
 #define ODS_FOCUS 16
+#if(WINVER >= 0x0400)
 #define ODS_DEFAULT 32
 #define ODS_COMBOBOXEDIT 4096
+#endif
+#if(WINVER >= 0x0500)
+#define ODS_HOTLIGHT        0x0040
+#define ODS_INACTIVE        0x0080
+#if(_WIN32_WINNT >= 0x0500)
+#define ODS_NOACCEL         0x0100
+#define ODS_NOFOCUSRECT     0x0200
+#endif
+#endif
 #define IDHOT_SNAPWINDOW (-1)
 #define IDHOT_SNAPDESKTOP (-2)
 #define DBWF_LPARAMPOINTER 0x8000
index 6a3f9a9..4a311ba 100644 (file)
@@ -91,16 +91,13 @@ DECLARE_HANDLE(HWINSTA);
 DECLARE_HANDLE(HKL);
 DECLARE_HANDLE(HGDIOBJ);
 
-cpp_quote("#if 0")
-typedef HANDLE HMONITOR;
-cpp_quote("#endif /* 0 */")
-
 typedef HANDLE HDWP;
 
 typedef LONG_PTR LRESULT;
 
 typedef LONG HRESULT;
 typedef DWORD LCID;
+typedef USHORT LANGID;
 
 typedef unsigned __int64 DWORDLONG;
 typedef __int64 LONGLONG;
@@ -447,7 +444,7 @@ typedef struct tagRemHGLOBAL {
 typedef union _userHGLOBAL switch(long fContext) u {
   case WDT_INPROC_CALL: long               hInproc;
   case WDT_REMOTE_CALL: FLAGGED_BYTE_BLOB *hRemote;
-  default:              long               hGlobal;
+  case WDT_INPROC64_CALL: __int64          hInproc64;
 } userHGLOBAL;
 
 typedef [unique] userHGLOBAL *wireHGLOBAL;
@@ -463,7 +460,7 @@ typedef struct tagRemHMETAFILEPICT {
 typedef union _userHMETAFILE switch(long fContext) u {
   case WDT_INPROC_CALL: long       hInproc;
   case WDT_REMOTE_CALL: BYTE_BLOB *hRemote;
-  default:              long       hGlobal;
+  case WDT_INPROC64_CALL: __int64  hInproc64;
 } userHMETAFILE;
 
 typedef [unique] userHMETAFILE *wireHMETAFILE;
@@ -478,7 +475,7 @@ typedef struct _remoteMETAFILEPICT {
 typedef union _userHMETAFILEPICT switch(long fContext) u {
   case WDT_INPROC_CALL: long                hInproc;
   case WDT_REMOTE_CALL: remoteMETAFILEPICT *hRemote;
-  default:              long                hGlobal;
+  case WDT_INPROC64_CALL: __int64           hInproc64;
 } userHMETAFILEPICT;
 
 typedef [unique] userHMETAFILEPICT *wireHMETAFILEPICT;
@@ -491,7 +488,7 @@ typedef struct tagRemHENHMETAFILE {
 typedef union _userHENHMETAFILE switch(long fContext) u {
   case WDT_INPROC_CALL: long       hInproc;
   case WDT_REMOTE_CALL: BYTE_BLOB *hRemote;
-  default:              long       hGlobal;
+  case WDT_INPROC64_CALL: __int64  hInproc64;
 } userHENHMETAFILE;
 
 typedef [unique] userHENHMETAFILE *wireHENHMETAFILE;
@@ -516,7 +513,7 @@ typedef struct _userBITMAP {
 typedef union _userHBITMAP switch(long fContext) u {
   case WDT_INPROC_CALL: long        hInproc;
   case WDT_REMOTE_CALL: userBITMAP *hRemote;
-  default:              long        hGlobal;
+  case WDT_INPROC64_CALL: __int64   hInproc64;
 } userHBITMAP;
 
 typedef [unique] userHBITMAP *wireHBITMAP;
@@ -535,7 +532,7 @@ typedef struct tagrpcLOGPALETTE {
 typedef union _userHPALETTE switch(long fContext) u {
   case WDT_INPROC_CALL: long           hInproc;
   case WDT_REMOTE_CALL: rpcLOGPALETTE *hRemote;
-  default:              long           hGlobal;
+  case WDT_INPROC64_CALL: __int64      hInproc64;
 } userHPALETTE;
 
 typedef [unique] userHPALETTE *wireHPALETTE;
@@ -585,36 +582,6 @@ typedef struct tagMSG
     POINT  pt;
 } MSG, *PMSG, *NPMSG, *LPMSG;
 
-typedef struct tagCREATESTRUCTA {
-    LPVOID      lpCreateParams;
-    HINSTANCE   hInstance;
-    HMENU       hMenu;
-    HWND        hwndParent;
-    int         cy;
-    int         cx;
-    int         y;
-    int         x;
-    LONG        style;
-    LPCSTR      lpszName;
-    LPCSTR      lpszClass;
-    DWORD       dwExStyle;
-} CREATESTRUCTA, *LPCREATESTRUCTA;
-
-typedef struct tagCREATESTRUCTW {
-    LPVOID      lpCreateParams;
-    HINSTANCE   hInstance;
-    HMENU       hMenu;
-    HWND        hwndParent;
-    int         cy;
-    int         cx;
-    int         y;
-    int         x;
-    LONG        style;
-    LPCWSTR     lpszName;
-    LPCWSTR     lpszClass;
-    DWORD       dwExStyle;
-} CREATESTRUCTW, *LPCREATESTRUCTW;
-
 cpp_quote("#endif")
 
 /******************** GUID TYPES ********************/
@@ -870,6 +837,15 @@ typedef union switch(DWORD tyspec)
         } ByObjectId;
 } uCLSSPEC;
 
+cpp_quote("#ifndef PROPERTYKEY_DEFINED")
+cpp_quote("#define PROPERTYKEY_DEFINED")
+typedef struct _tagpropertykey
+{
+    GUID fmtid;
+    DWORD pid;
+} PROPERTYKEY;
+cpp_quote("#endif /*PROPERTYKEY_DEFINED*/")
+
 } /* interface IWinTypes */
 
 cpp_quote("#ifdef _MSC_VER")
index 89263c4..d5d51ff 100644 (file)
 
 import "ocidl.idl";
 
-cpp_quote("#ifndef __xmldom_h__")
-cpp_quote("#define __xmldom_h__")
-cpp_quote("#endif")
-
 interface IXMLDOMImplementation;
 interface IXMLDOMNode;
 interface IXMLDOMDocumentFragment;
@@ -268,7 +264,7 @@ interface IXMLDOMDocument : IXMLDOMNode
                   [out,retval] VARIANT_BOOL *isSuccessful );
 
     [propget, id(DISPID_READYSTATE)]
-    HRESULT readyState( [out,retval] long *value );
+    HRESULT readyState( [out,retval] LONG *value );
 
     [propget, id(DISPID_XMLDOM_DOCUMENT_PARSEERROR)]
     HRESULT parseError( [out,retval] IXMLDOMParseError **errorObj );
@@ -334,11 +330,11 @@ pointer_default(unique)
 interface IXMLDOMNodeList : IDispatch
 {
     [propget, id(DISPID_VALUE)]
-    HRESULT item( [in] long index,
+    HRESULT item( [in] LONG index,
                   [out,retval] IXMLDOMNode **listItem );
 
     [propget, id(DISPID_DOM_NODELIST_LENGTH)]
-    HRESULT length( [out,retval] long *listLength );
+    HRESULT length( [out,retval] LONG *listLength );
 
     [id(DISPID_XMLDOM_NODELIST_NEXTNODE)]
     HRESULT nextNode( [out,retval] IXMLDOMNode **nextItem );
@@ -375,11 +371,11 @@ interface IXMLDOMNamedNodeMap : IDispatch
                              [out,retval] IXMLDOMNode **namedItem );
 
     [propget, id(DISPID_VALUE)]
-    HRESULT item( [in] long index,
+    HRESULT item( [in] LONG index,
                   [out,retval] IXMLDOMNode **listItem );
 
     [propget, id(DISPID_DOM_NODELIST_LENGTH)]
-    HRESULT length( [out,retval] long *listLength );
+    HRESULT length( [out,retval] LONG *listLength );
 
     [id(DISPID_XMLDOM_NAMEDNODEMAP_GETQUALIFIEDITEM)]
     HRESULT getQualifiedItem( [in] BSTR baseName,
@@ -435,27 +431,27 @@ interface IXMLDOMCharacterData : IXMLDOMNode
     HRESULT data( [in] BSTR data );
 
     [propget, id(DISPID_DOM_DATA_LENGTH)]
-    HRESULT length( [out,retval] long *dataLength );
+    HRESULT length( [out,retval] LONG *dataLength );
 
     [id(DISPID_DOM_DATA_SUBSTRING)]
-    HRESULT substringData( [in] long offset,
-                           [in] long count,
+    HRESULT substringData( [in] LONG offset,
+                           [in] LONG count,
                            [out,retval] BSTR *data );
 
     [id(DISPID_DOM_DATA_APPEND)]
     HRESULT appendData( [in] BSTR data );
 
     [id(DISPID_DOM_DATA_INSERT)]
-    HRESULT insertData( [in] long offset,
+    HRESULT insertData( [in] LONG offset,
                         [in] BSTR data );
 
     [id(DISPID_DOM_DATA_DELETE)]
-    HRESULT deleteData( [in] long offset,
-                        [in] long count );
+    HRESULT deleteData( [in] LONG offset,
+                        [in] LONG count );
 
     [id(DISPID_DOM_DATA_REPLACE)]
-    HRESULT replaceData( [in] long offset,
-                         [in] long count,
+    HRESULT replaceData( [in] LONG offset,
+                         [in] LONG count,
                          [in] BSTR data );
 }
 
@@ -540,7 +536,7 @@ pointer_default(unique)
 interface IXMLDOMText : IXMLDOMCharacterData
 {
     [id(DISPID_DOM_TEXT_SPLITTEXT)]
-    HRESULT splitText( [in] long offset,
+    HRESULT splitText( [in] LONG offset,
                        [out,retval] IXMLDOMText **rightHandTextNode );
 }
 
@@ -703,7 +699,7 @@ uuid (3efaa426-272f-11d2-836f-0000f87a7782)
 interface IXMLDOMParseError : IDispatch
 {
     [propget, id(DISPID_VALUE)]
-    HRESULT errorCode([retval, out] long *errCode);
+    HRESULT errorCode([retval, out] LONG *errCode);
 
     [propget, id(DISPID_DOM_ERROR_URL)]
     HRESULT url([retval, out] BSTR *p);
@@ -715,13 +711,13 @@ interface IXMLDOMParseError : IDispatch
     HRESULT srcText([retval, out] BSTR *p);
 
     [propget, id(DISPID_DOM_ERROR_LINE)]
-    HRESULT line([retval, out] long *lineNo);
+    HRESULT line([retval, out] LONG *lineNo);
 
     [propget, id(DISPID_DOM_ERROR_LINEPOS)]
-    HRESULT linepos([retval, out] long * linePos);
+    HRESULT linepos([retval, out] LONG * linePos);
 
     [propget, id(DISPID_DOM_ERROR_FILEPOS)]
-    HRESULT filepos([retval, out] long * filePos);
+    HRESULT filepos([retval, out] LONG * filePos);
 }
 
 [
@@ -788,7 +784,7 @@ interface IXMLHttpRequest : IDispatch
     HRESULT abort();
 
     [propget, id(7)]
-    HRESULT status([out, retval] long *plStatus);
+    HRESULT status([out, retval] LONG *plStatus);
 
     [propget, id(8)]
     HRESULT statusText([out, retval] BSTR *bstrStatus);
@@ -806,7 +802,7 @@ interface IXMLHttpRequest : IDispatch
     HRESULT responseStream([out, retval] VARIANT *pvarBody);
 
     [propget, id(13)]
-    HRESULT readyState([out, retval] long *plState);
+    HRESULT readyState([out, retval] LONG *plState);
 
     [propput, id(14)]
     HRESULT onreadystatechange([in] IDispatch *pReadyStateSink);
diff --git a/reactos/include/psdk/xmllite.idl b/reactos/include/psdk/xmllite.idl
new file mode 100644 (file)
index 0000000..552b5d6
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2010 Nikolay Sivov
+ *
+ * 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 "unknwn.idl";
+import "objidl.idl";
+import "oaidl.idl";
+
+typedef enum XmlNodeType {
+    XmlNodeType_None                  = 0,
+    XmlNodeType_Element               = 1,
+    XmlNodeType_Attribute             = 2,
+    XmlNodeType_Text                  = 3,
+    XmlNodeType_CDATA                 = 4,
+    XmlNodeType_ProcessingInstruction = 7,
+    XmlNodeType_Comment               = 8,
+    XmlNodeType_DocumentType          = 10,
+    XmlNodeType_Whitespace            = 13,
+    XmlNodeType_EndElement            = 15,
+    XmlNodeType_XmlDeclaration        = 17,
+    _XmlNodeType_Last                 = 17
+} XmlNodeType;
+
+/* IXmlReader */
+[
+  local,
+  object,
+  uuid(7279fc81-709d-4095-b63d-69fe4b0d9030),
+  pointer_default(unique)
+]
+interface IXmlReader : IUnknown
+{
+    HRESULT SetInput( [in] IUnknown *input);
+    HRESULT GetProperty( [in] UINT property, [out] LONG_PTR *value);
+    HRESULT SetProperty( [in] UINT property, [in] LONG_PTR value);
+    HRESULT Read( [out] XmlNodeType *node_type);
+    HRESULT GetNodeType( [out] XmlNodeType *node_type);
+    HRESULT MoveToFirstAttribute(void);
+    HRESULT MoveToNextAttribute(void);
+    HRESULT MoveToAttributeByName( [in] LPCWSTR local_name,
+                                   [in] LPCWSTR namespaceUri);
+    HRESULT MoveToElement(void);
+    HRESULT GetQualifiedName( [out] LPCWSTR *qualifiedName,
+                              [out] UINT *qualifiedName_length);
+    HRESULT GetNamespaceUri( [out] LPCWSTR *namespaceUri,
+                             [out] UINT *nnamespaceUri_length);
+    HRESULT GetLocalName( [out] LPCWSTR *local_name,
+                          [out] UINT *locale_name_length);
+    HRESULT GetPrefix( [out] LPCWSTR *prefix,
+                       [out] UINT *prefix_length);
+    HRESULT GetValue( [out] LPCWSTR *value,
+                      [out] UINT *value_length);
+    HRESULT ReadValueChunk( [out] WCHAR *buffer,
+                            [in]  UINT chunk_size,
+                            [in,out] UINT *read);
+    HRESULT GetBaseUri( [out] LPCWSTR *baseUri,
+                        [out] UINT *baseUri_length);
+    BOOL IsDefault(void);
+    BOOL IsEmptyElement(void);
+    HRESULT GetLineNumber( [out] UINT *lineNumber);
+    HRESULT GetLinePosition( [out] UINT *linePosition);
+    HRESULT GetAttributeCount( [out] UINT *attributeCount);
+    HRESULT GetDepth( [out] UINT *depth);
+    BOOL IsEOF(void);
+}
+
+/* IXmlReader state */
+cpp_quote("typedef enum XmlReadState")
+cpp_quote("{")
+cpp_quote("    XmlReadState_Initial     = 0,")
+cpp_quote("    XmlReadState_Interactive = 1,")
+cpp_quote("    XmlReadState_Error       = 2,")
+cpp_quote("    XmlReadState_EndOfFile   = 3,")
+cpp_quote("    XmlReadState_Closed      = 4")
+cpp_quote("} XmlReadState;")
+
+/* IXmlReader properties */
+cpp_quote("typedef enum XmlReaderProperty")
+cpp_quote("{")
+cpp_quote("    XmlReaderProperty_MultiLanguage      = 0,")
+cpp_quote("    XmlReaderProperty_ConformanceLevel   = XmlReaderProperty_MultiLanguage + 1,")
+cpp_quote("    XmlReaderProperty_RandomAccess       = XmlReaderProperty_ConformanceLevel + 1,")
+cpp_quote("    XmlReaderProperty_XmlResolver        = XmlReaderProperty_RandomAccess + 1,")
+cpp_quote("    XmlReaderProperty_DtdProcessing      = XmlReaderProperty_XmlResolver + 1,")
+cpp_quote("    XmlReaderProperty_ReadState          = XmlReaderProperty_DtdProcessing + 1,")
+cpp_quote("    XmlReaderProperty_MaxElementDepth    = XmlReaderProperty_ReadState + 1,")
+cpp_quote("    XmlReaderProperty_MaxEntityExpansion = XmlReaderProperty_MaxElementDepth + 1,")
+cpp_quote("    _XmlReaderProperty_Last              = XmlReaderProperty_MaxEntityExpansion")
+cpp_quote("} XmlReaderProperty;")
+
+/* IXmlReader construction */
+cpp_quote("STDAPI CreateXmlReader(REFIID riid, void **ppvObject, IMalloc *pMalloc);")
+
+cpp_quote("typedef IUnknown IXmlReaderInput;")
+cpp_quote("STDAPI CreateXmlReaderInputWithEncodingName(IUnknown *stream, IMalloc *pMalloc,")
+cpp_quote("                                            LPCWSTR encoding, BOOL hint,")
+cpp_quote("                                            LPCWSTR base_uri, IXmlReaderInput **ppInput);")
index 178bb50..68262c2 100644 (file)
 //
 // FIXME: mmtypes.h?
 //
-#define KIPCR                   0xFFFFF000
-#define KI_USER_SHARED_DATA     0xFFFFE000
+#define KIP0PCRADDRESS          0xFFDFF000
+#define KI_USER_SHARED_DATA     0xFFDF0000
 #define USPCR                   0x7FFF0000
-#define PCR                     ((volatile KPCR * const)KIPCR)
+#define PCR                     ((KPCR * const)KIP0PCRADDRESS)
 #define USERPCR                 ((volatile KPCR * const)USPCR)
 #define KeGetPcr()              PCR
 #ifndef _WINNT_H
@@ -47,25 +47,13 @@ extern ULONG_PTR MmUserProbeAddress;
 #define MM_SYSTEM_RANGE_START             MmSystemRangeStart
 #define MM_USER_PROBE_ADDRESS             MmUserProbeAddress
 #define MM_LOWEST_USER_ADDRESS            (PVOID)0x10000
-#define MM_LOWEST_SYSTEM_ADDRESS          (PVOID)0xC1400000
+#define MM_LOWEST_SYSTEM_ADDRESS          (PVOID)0xC0800000
 
 //
 // Maximum IRQs
 //
 #define MAXIMUM_VECTOR          16
 
-//
-// Just read it from the PCR
-//
-#define KeGetCurrentProcessorNumber()  (int)PCR->Number
-#define KeGetCurrentIrql()             PCR->CurrentIrql
-#define _KeGetCurrentThread()          PCR->CurrentThread
-#define _KeGetPreviousMode()           PCR->CurrentThread->PreviousMode
-#define _KeIsExecutingDpc()            (PCR->DpcRoutineActive != 0)
-#define KeGetCurrentThread()           _KeGetCurrentThread()
-#define KeGetPreviousMode()            _KeGetPreviousMode()
-#define KeGetDcacheFillSize()          PCR->DcacheFillSize
-
 
 //
 // Used to contain PFNs and PFN counts
@@ -132,69 +120,42 @@ typedef struct _CONTEXT {
 
 //
 // Processor Control Region
-// On ARM, it's actually readable from user-mode, much like KUSER_SHARED_DATA
 //
 #ifdef _WINNT_H
-typedef
-VOID
-(*PKINTERRUPT_ROUTINE)(VOID);
+#define KIRQL ULONG
 #endif
 typedef struct _KPCR
 {
-    ULONG MinorVersion;
-    ULONG MajorVersion;
-    PKINTERRUPT_ROUTINE InterruptRoutine[32];
-    PVOID XcodeDispatch;
-    ULONG FirstLevelDcacheSize;
-    ULONG FirstLevelDcacheFillSize;
-    ULONG FirstLevelIcacheSize;
-    ULONG FirstLevelIcacheFillSize;
-    ULONG SecondLevelDcacheSize;
-    ULONG SecondLevelDcacheFillSize;
-    ULONG SecondLevelIcacheSize;
-    ULONG SecondLevelIcacheFillSize;
+    union
+    {
+        NT_TIB NtTib;
+        struct
+        {
+            struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused
+            PVOID Used_StackBase; // Unused
+            PVOID PerfGlobalGroupMask;
+            PVOID TssCopy; // Unused
+            ULONG ContextSwitches;
+            KAFFINITY SetMemberCopy; // Unused
+            PVOID Used_Self;
+        };
+    };
+    struct _KPCR *Self;
     struct _KPRCB *Prcb;
-    struct _TEB *Teb;
-    PVOID TlsArray;
-    ULONG DcacheFillSize;
-    ULONG IcacheAlignment;
-    ULONG IcacheFillSize;
-    ULONG ProcessorId;
-    ULONG ProfileInterval;
-    ULONG ProfileCount;
-    ULONG StallExecutionCount;
-    ULONG StallScaleFactor;
-    CCHAR Number;
-    PVOID DataBusError;
-    PVOID InstructionBusError;
-    ULONG CachePolicy;
-    ULONG AlignedCachePolicy;
-    UCHAR IrqlMask[32];
-    ULONG IrqlTable[32];
-    UCHAR CurrentIrql;
+    KIRQL Irql;
+    ULONG IRR; // Unused
+    ULONG IrrActive; // Unused
+    ULONG IDR; // Unused
+    PVOID KdVersionBlock;
+    PVOID IDT; // Unused
+    PVOID GDT; // Unused
+    PVOID TSS; // Unused
+    USHORT MajorVersion;
+    USHORT MinorVersion;
     KAFFINITY SetMember;
-    struct _KTHREAD *CurrentThread;
-    ULONG ReservedVectors;
-    KAFFINITY NotMember;
-    ULONG SystemReserved[6];
-    ULONG DcacheAlignment;
-    ULONG HalReserved[64];
-    BOOLEAN FirstLevelActive;
-    BOOLEAN DpcRoutineActive;
-    ULONG CurrentPid;
-    BOOLEAN OnInterruptStack;
-    PVOID SavedInitialStack;
-    PVOID SavedStackLimit;
-    PVOID SystemServiceDispatchStart;
-    PVOID SystemServiceDispatchEnd;
-    PVOID InterruptStack;
-    PVOID PanicStack;
-    PVOID BadVaddr;
-    PVOID InitialStack;
-    PVOID StackLimit;
-    ULONG QuantumEnd;
-    PVOID PerfGlobalGroupMask;
-    ULONG ContextSwitches;
+    ULONG StallScaleFactor;
+    UCHAR SpareUnused;
+    UCHAR Number;
 } KPCR, *PKPCR;
 
 //
@@ -203,7 +164,7 @@ typedef struct _KPCR
 FORCEINLINE
 struct _TEB* NtCurrentTeb(VOID)
 {
-    return (struct _TEB*)USERPCR->Teb;
+    return (struct _TEB*)USERPCR->Used_Self;
 }
 
 #ifndef _WINNT_H
index 6fa3cdc..857eab4 100644 (file)
@@ -11,7 +11,7 @@
 //
 // UART Registers
 //
-#define UART_BASE                (ULONG_PTR)0xE00F1000 /* HACK: freeldr mapped it here */
+#define UART_BASE                (ULONG_PTR)0x101F1000
 
 #define UART_PL01x_DR            (UART_BASE + 0x00)
 #define UART_PL01x_RSR           (UART_BASE + 0x04)
index a6e336a..a452f50 100644 (file)
 //
 // VIC Registers
 //
-#define VIC_BASE                (ULONG_PTR)0xE0040000 /* HACK: freeldr mapped it here */
+#define VIC_BASE                (ULONG_PTR)0x10140000
 
-#define VIC_INT_STATUS          (VIC_BASE + 0x00)
-#define VIC_INT_ENABLE          (VIC_BASE + 0x10)
-#define VIC_INT_CLEAR           (VIC_BASE + 0x14)
-#define VIC_SOFT_INT            (VIC_BASE + 0x18)
-#define VIC_SOFT_INT_CLEAR      (VIC_BASE + 0x1C)
+#define VIC_INT_STATUS          (PULONG)(VIC_BASE + 0x00)
+#define VIC_INT_ENABLE          (PULONG)(VIC_BASE + 0x10)
+#define VIC_INT_CLEAR           (PULONG)(VIC_BASE + 0x14)
+#define VIC_SOFT_INT            (PULONG)(VIC_BASE + 0x18)
+#define VIC_SOFT_INT_CLEAR      (PULONG)(VIC_BASE + 0x1C)
index 68acd91..44a09b6 100644 (file)
@@ -11,7 +11,7 @@
 //
 // Timer Registers
 //
-#define TIMER_BASE(x)            (ULONG_PTR)(0xE00E2000 + (x * 0x1000))  /* HACK: freeldr mapped it here */
+#define TIMER_BASE(x)            (ULONG_PTR)(0x101E2000 + (x * 0x1000))
 #define TIMER0_LOAD              TIMER_BASE(0) + 0x00
 #define TIMER0_VALUE             TIMER_BASE(0) + 0x04
 #define TIMER0_CONTROL           TIMER_BASE(0) + 0x08
index b0f0386..706554a 100644 (file)
@@ -302,13 +302,11 @@ typedef struct _POLICY_MODIFICATION_INFO {
     LARGE_INTEGER ModifiedId;
     LARGE_INTEGER DatabaseCreationTime;
 } POLICY_MODIFICATION_INFO, *PPOLICY_MODIFICATION_INFO;
-cpp_quote("#endif")
 
-typedef struct _POLICY_FULL_SET_INFO {
+typedef struct _POLICY_AUDIT_FULL_SET_INFO {
     BOOL ShutDownOnFull;
-} POLICY_FULL_SET_INFO, *PPOLICY_FULL_SET_INFO;
+} POLICY_AUDIT_FULL_SET_INFO, *PPOLICY_AUDIT_FULL_SET_INFO;
 
-cpp_quote("#ifndef _NTSECAPI_H")
 typedef struct _POLICY_AUDIT_FULL_QUERY_INFO {
     BOOL ShutDownOnFull;
     BOOL LogIsFull;
@@ -323,23 +321,23 @@ typedef struct _LSAPR_POLICY_DNS_DOMAIN_INFO {
     PRPC_SID Sid;
 } LSAPR_POLICY_DNS_DOMAIN_INFO, *PLSAPR_POLICY_DNS_DOMAIN_INFO;
 
-/*typedef
+typedef
 [switch_type(POLICY_INFORMATION_CLASS)] union _LSAPR_POLICY_INFORMATION {
     [case(PolicyAuditLogInformation)] POLICY_AUDIT_LOG_INFO PolicyAuditLogInfo;
-    [case(PolicyAuditEventsInformation)] POLICY_AUDIT_EVENTS_INFO PolicyAuditEventsInfo;
-    [case(PolicyPrimaryDomainInformation)] POLICY_PRIMARY_DOM_INFO PolicyPrimaryDomInfo;
-    [case(PolicyPdAccountInformation)] POLICY_PD_ACCOUNT_INFO PolicyPdAccountInfo;
-    [case(PolicyAccountDomainInformation)] POLICY_ACCOUNT_DOM_INFO PolicyAccountDomainInfo;
+    [case(PolicyAuditEventsInformation)] LSAPR_POLICY_AUDIT_EVENTS_INFO PolicyAuditEventsInfo;
+    [case(PolicyPrimaryDomainInformation)] LSAPR_POLICY_PRIMARY_DOM_INFO PolicyPrimaryDomInfo;
+    [case(PolicyPdAccountInformation)] LSAPR_POLICY_PD_ACCOUNT_INFO PolicyPdAccountInfo;
+    [case(PolicyAccountDomainInformation)] LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyAccountDomainInfo;
     [case(PolicyLsaServerRoleInformation)] POLICY_LSA_SERVER_ROLE_INFO PolicyServerRoleInfo;
-    [case(PolicyReplicaSourceInformation)] POLICY_REPLICA_SRCE_INFO PolicyReplicaSourceInfo;
+    [case(PolicyReplicaSourceInformation)] POLICY_LSA_REPLICA_SRCE_INFO PolicyReplicaSourceInfo;
     [case(PolicyDefaultQuotaInformation)] POLICY_DEFAULT_QUOTA_INFO PolicyDefaultQuotaInfo;
     [case(PolicyModificationInformation)] POLICY_MODIFICATION_INFO PolicyModificationInfo;
     [case(PolicyAuditFullSetInformation)] POLICY_AUDIT_FULL_SET_INFO PolicyAuditFullSetInfo;
     [case(PolicyAuditFullQueryInformation)] POLICY_AUDIT_FULL_QUERY_INFO PolicyAuditFullQueryInfo;
-    [case(PolicyDnsDomainInformation)] LSAPR_DNS_DOMAIN_INFO PolicyDnsDomainInfo;
-    [case(PolicyDnsDomainInformationInt)] LSAPR_DNS_DOMAIN_INFO PolicyDnsDomainInfoInt;
+    [case(PolicyDnsDomainInformation)] LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfo;
+    [case(PolicyDnsDomainInformationInt)] LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfoInt;
     [case(PolicyLocalAccountDomainInformation)] LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyLocalAccountDomainInfo;
-} LSAPR_POLICY_INFORMATION, *PLSAPR_POLICY_INFORMATION;*/
+} LSAPR_POLICY_INFORMATION, *PLSAPR_POLICY_INFORMATION;
 
 typedef struct _LSAPR_TRUSTED_ENUM_BUFFER {
     DWORD EntriesRead;
@@ -639,15 +637,13 @@ interface lsarpc
     NTSTATUS LsarQueryInformationPolicy(
         [in] LSAPR_HANDLE PolicyHandle,
         [in] POLICY_INFORMATION_CLASS InformationClass,
-        [in] unsigned long PolicyInformation);
-        /* FIXME: should be [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation); */
+        [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation);
 
     /* Function 8 */
     NTSTATUS LsarSetInformationPolicy(
         [in] LSAPR_HANDLE PolicyHandle,
         [in] POLICY_INFORMATION_CLASS InformationClass,
-        [out] unsigned long *PolicyInformation);
-        /* FIXME: should be [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation); */
+        [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation);
 
     /* Function 9 */
     NTSTATUS LsarClearAuditLog(
index 406e9e6..eb06ec4 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <group>
        <module name="ntstatus" type="messageheader">
                <file>ntstatus.mc</file>
index 21a6085..009c250 100644 (file)
 
 #define SERVICE_CONTROL_START 0
 
-DECLARE_HANDLE(CLIENT_HANDLE);
-
 typedef struct _SCM_CONTROL_PACKET
 {
     DWORD dwControl;
-    CLIENT_HANDLE hClient;
+    SERVICE_STATUS_HANDLE hServiceStatus;
     DWORD dwSize;
     WCHAR szArguments[1];
 } SCM_CONTROL_PACKET, *PSCM_CONTROL_PACKET;
 
+typedef struct _SCM_REPLY_PACKET
+{
+    DWORD dwError;
+} SCM_REPLY_PACKET, *PSCM_REPLY_PACKET;
+
 #endif /* __SERVICES_SERVICES_H__ */
 
 /* EOF */
index b23bf0c..1f276fa 100644 (file)
@@ -38,6 +38,12 @@ typedef struct
    BOOL bInheritHandles;
 } CSRSS_CREATE_PROCESS, *PCSRSS_CREATE_PROCESS;
 
+typedef struct
+{
+    CLIENT_ID ClientId;
+    HANDLE ThreadHandle;
+} CSRSS_CREATE_THREAD, *PCSRSS_CREATE_THREAD;
+
 typedef struct
 {
     ULONG Dummy;
@@ -544,6 +550,7 @@ typedef struct
 #define GET_CONSOLE_ALIASES_EXES      (0x3C)
 #define GET_CONSOLE_ALIASES_EXES_LENGTH (0x3D)
 #define GENERATE_CTRL_EVENT           (0x3E)
+#define CREATE_THREAD                 (0x3F)
 
 /* Keep in sync with definition below. */
 #define CSRSS_HEADER_SIZE (sizeof(PORT_MESSAGE) + sizeof(ULONG) + sizeof(NTSTATUS))
@@ -557,6 +564,7 @@ typedef struct _CSR_API_MESSAGE
     union
     {
         CSRSS_CREATE_PROCESS CreateProcessRequest;
+        CSRSS_CREATE_THREAD CreateThreadRequest;
         CSRSS_CONNECT_PROCESS ConnectRequest;
         CSRSS_WRITE_CONSOLE WriteConsoleRequest;
         CSRSS_READ_CONSOLE ReadConsoleRequest;
index 5bd230a..3ce27a1 100644 (file)
@@ -6,6 +6,21 @@ typedef struct _THREADINFO *PTHREADINFO;
 struct _DESKTOP;
 struct _WND;
 
+typedef enum _USERTHREADINFOCLASS
+{
+    UserThreadShutdownInformation,
+    UserThreadFlags,
+    UserThreadTaskName,
+    UserThreadWOWInformation,
+    UserThreadHungStatus,
+    UserThreadInitiateShutdown,
+    UserThreadEndShutdown,
+    UserThreadUseActiveDesktop,
+    UserThreadUseDesktop,
+    UserThreadRestoreDesktop,
+    UserThreadCsrApiPort,
+} USERTHREADINFOCLASS;
+
 typedef struct _LARGE_UNICODE_STRING
 {
   ULONG Length;
@@ -206,6 +221,69 @@ C_ASSERT(sizeof(CLIENTINFO) <= sizeof(((PTEB)0)->Win32ClientInfo));
 
 #define GetWin32ClientInfo() ((PCLIENTINFO)(NtCurrentTeb()->Win32ClientInfo))
 
+/* Menu Item fType. */
+#define MFT_RTOL 0x6000
+
+typedef struct tagITEM
+{
+    UINT fType;
+    UINT fState;
+    UINT wID;
+    struct tagMENU* spSubMenu; /* Pop-up menu. */
+    HANDLE hbmpChecked;
+    HANDLE hbmpUnchecked;
+    USHORT* lpstr; /* Item text pointer. */
+    ULONG cch;
+    DWORD_PTR dwItemData;
+    ULONG xItem;   /* Item position. left */
+    ULONG yItem;   /*     "          top */
+    ULONG cxItem;  /* Item Size Width */
+    ULONG cyItem;  /*     "     Height */
+    ULONG dxTab;   /* X position of text after Tab */
+    ULONG ulX;     /* underline.. start position */
+    ULONG ulWidth; /* underline.. width */
+    HBITMAP hbmp;  /* bitmap */
+    INT cxBmp;     /* Width Maximum size of the bitmap items in MIIM_BITMAP state */
+    INT cyBmp;     /* Height " */
+} ITEM, *PITEM;
+
+typedef struct tagMENULIST
+{
+   struct tagMENULIST* pNext;
+   struct tagMENU*     pMenu;
+} MENULIST, *PMENULIST;
+
+/* Menu fFlags, upper byte is MNS_X style flags. */
+#define MNF_POPUP       0x0001
+#define MNF_UNDERLINE   0x0004
+#define MNF_INACTIVE    0x0010
+#define MNF_RTOL        0x0020
+#define MNF_DESKTOPMN   0x0040
+#define MNF_SYSDESKMN   0x0080
+#define MNF_SYSSUBMENU  0x0100
+
+typedef struct tagMENU
+{
+    PROCDESKHEAD head;
+    ULONG fFlags;             /* [Style flags | Menu flags] */
+    INT iItem;                /* nPos of selected item, if -1 not selected. */
+    UINT cAlloced;            /* Number of allocated items. Inc's of 8 */
+    UINT cItems;              /* Number of items in the menu */
+    ULONG cxMenu;             /* Width of the whole menu */
+    ULONG cyMenu;             /* Height of the whole menu */
+    ULONG cxTextAlign;        /* Offset of text when items have both bitmaps and text */
+    struct _WND *spwndNotify; /* window receiving the messages for ownerdraw */
+    PITEM rgItems;            /* Array of menu items */
+    struct tagMENULIST* pParentMenus; /* If this is SubMenu, list of parents. */
+    DWORD dwContextHelpId;
+    ULONG cyMax;              /* max height of the whole menu, 0 is screen height */
+    DWORD_PTR dwMenuData;     /* application defined value */
+    HBRUSH hbrBack;           /* brush for menu background */
+    INT iTop;                 /* Current scroll position Top */
+    INT iMaxTop;              /* Current scroll position Max Top */
+    DWORD dwArrowsOn:2;       /* Arrows: 0 off, 1 on, 2 to the top, 3 to the bottom. */
+} MENU, *PMENU;
+
 typedef struct _REGISTER_SYSCLASS
 {
     /* This is a reactos specific class used to initialize the
@@ -2618,13 +2696,14 @@ NtUserSetInformationProcess(
     DWORD dwUnknown3,
     DWORD dwUnknown4);
 
-DWORD
+NTSTATUS
 NTAPI
 NtUserSetInformationThread(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4);
+    IN HANDLE ThreadHandle,
+    IN USERTHREADINFOCLASS ThreadInformationClass,
+    IN PVOID ThreadInformation,
+    IN ULONG ThreadInformationLength
+);
 
 DWORD
 NTAPI
@@ -3200,8 +3279,8 @@ typedef struct tagROSMENUITEMINFO
     HBITMAP hbmpItem;
     /* ----------- Extra ----------- */
     RECT Rect;      /* Item area (relative to menu window) */
-    UINT XTab;      /* X position of text after Tab */
-    LPWSTR Text;    /* Copy of the text pointer in MenuItem->Text */
+    UINT dxTab;      /* X position of text after Tab */
+    LPWSTR lpstr;    /* Copy of the text pointer in MenuItem->Text */
 } ROSMENUITEMINFO, *PROSMENUITEMINFO;
 
 BOOL
index cb26f59..406b5fb 100644 (file)
@@ -5,6 +5,9 @@
 
 #define __WINE_CONFIG_H
 
+/* Define to a function attribute for Microsoft hotpatch assembly prefix. */
+#define DECLSPEC_HOTPATCH
+
 /* Specifies the compiler flag that forces a short wchar_t */
 #define CC_FLAG_SHORT_WCHAR "-fshort-wchar"
 
 #define YYTEXT_POINTER 1
 
 /* Define to a macro to output a .cfi assembly pseudo-op */
-#define __ASM_CFI(x)
+#define __ASM_CFI(str) str
+
+/* Define to a macro to define an assembly function */
+#define __ASM_DEFINE_FUNC(name,suffix,code) asm(".text\n\t.align 4\n\t.globl _" #name suffix "\n\t.def _" #name suffix "; .scl 2; .type 32; .endef\n_" #name suffix ":\n\t.cfi_startproc\n\t" code "\n\t.cfi_endproc");
 
 /* Define to a macro to generate an assembly function directive */
 #define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef"
 
+/* Define to a macro to generate an assembly function with C calling
+   convention */
+#define __ASM_GLOBAL_FUNC(name,code) __ASM_DEFINE_FUNC(name,"",code)
+
 /* Define to a macro to generate an assembly name from a C symbol */
 #define __ASM_NAME(name) "_" name
 
 /* Define to a macro to generate an stdcall suffix */
 #define __ASM_STDCALL(args) "@" #args
 
+/* Define to a macro to generate an assembly function with stdcall calling
+   convention */
+#define __ASM_STDCALL_FUNC(name,args,code) __ASM_DEFINE_FUNC(name,__ASM_STDCALL(args),code)
+
 /* Define to empty if `const' does not conform to ANSI C. */
 /* #undef const */
 
index 9d52a65..2aefa87 100644 (file)
@@ -1642,14 +1642,28 @@ struct startend
     unsigned int               end;
 };
 
+#define LT2_LINES_BLOCK 0x000000f2
+#define LT2_FILES_BLOCK 0x000000f4
+
 /* there's a new line tab structure from MS Studio 2005 and after
- * it's made of:
- * DWORD        000000f4
- * DWORD        lineblk_offset (counting bytes after this field)
- * an array of codeview_linetab2_file structures
- * an array (starting at <lineblk_offset>) of codeview_linetab2_block structures
+ * it's made of a list of codeview_linetab2 blocks.
+ * We've only seen (so far) list with a single LT2_FILES_BLOCK and several
+ * LT2_LINES_BLOCK. The LT2_FILES block has been encountered either as first
+ * or last block of the list.
+ * A LT2_FILES contains one or several codeview_linetab2_file:s
  */
 
+struct codeview_linetab2
+{
+    DWORD       header;
+    DWORD       size_of_block;
+};
+
+static inline const struct codeview_linetab2* codeview_linetab2_next_block(const struct codeview_linetab2* lt2)
+{
+    return (const struct codeview_linetab2*)((const char*)(lt2 + 1) + lt2->size_of_block);
+}
+
 struct codeview_linetab2_file
 {
     DWORD       offset;         /* offset in string table for filename */
@@ -1658,16 +1672,21 @@ struct codeview_linetab2_file
     WORD        pad0;           /* always 0 */
 };
 
-struct codeview_linetab2_block
+struct codeview_lt2blk_files
+{
+    struct codeview_linetab2            lt2;    /* LT2_FILES */
+    struct codeview_linetab2_file       file[1];
+};
+
+struct codeview_lt2blk_lines
 {
-    DWORD       header;         /* 0x000000f2 */
-    DWORD       size_of_block;  /* next block is at # bytes after this field */
-    DWORD       start;          /* start address of function with line numbers */
-    DWORD       seg;            /* segment of function with line numbers */
-    DWORD       size;           /* size of function with line numbers */
-    DWORD       file_offset;    /* offset for accessing corresponding codeview_linetab2_file */
-    DWORD       nlines;         /* number of lines in this block */
-    DWORD       size_lines;     /* number of bytes following for line number information */
+    struct codeview_linetab2    lt2;            /* LT2_LINE_BLOCK */
+    DWORD                       start;          /* start address of function with line numbers */
+    DWORD                       seg;            /* segment of function with line numbers */
+    DWORD                       size;           /* size of function with line numbers */
+    DWORD                       file_offset;    /* offset for accessing corresponding codeview_linetab2_file */
+    DWORD                       nlines;         /* number of lines in this block */
+    DWORD                       size_lines;     /* number of bytes following for line number information */
     struct {
         DWORD   offset;         /* offset (from <seg>:<start>) for line number */
         DWORD   lineno;         /* the line number (OR:ed with 0x80000000 why ???) */
index 3b1b1c0..6b29317 100644 (file)
@@ -148,29 +148,6 @@ struct statfs;
 #endif
 
 
-/* Macros to define assembler functions somewhat portably */
-
-#if defined(__GNUC__) && !defined(__INTERIX) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(__APPLE__)
-# define __ASM_GLOBAL_FUNC(name,code) \
-      __asm__( ".text\n\t" \
-               ".align 4\n\t" \
-               ".globl " __ASM_NAME(#name) "\n\t" \
-               __ASM_FUNC(#name) "\n" \
-               __ASM_NAME(#name) ":\n\t" \
-               code \
-               "\n\t.previous" );
-#else  /* defined(__GNUC__) && !defined(__MINGW32__) && !defined(__APPLE__)  */
-# define __ASM_GLOBAL_FUNC(name,code) \
-      void __asm_dummy_##name(void) { \
-          asm( ".align 4\n\t" \
-               ".globl " __ASM_NAME(#name) "\n\t" \
-               __ASM_FUNC(#name) "\n" \
-               __ASM_NAME(#name) ":\n\t" \
-               code ); \
-      }
-#endif  /* __GNUC__ */
-
-
 /* Constructor functions */
 
 #ifdef __GNUC__
index ee7ba7f..53dd163 100644 (file)
 #define RPC_FC_PROC_OIF_OBJECT          0x04
 #define RPC_FC_PROC_OIF_RPCFLAGS        0x08
 #define RPC_FC_PROC_OIF_OBJ_V2          0x20
+#define RPC_FC_PROC_OIF_HAS_COMM_OR_FAULT 0x20
 #define RPC_FC_PROC_OIF_NEWINIT         0x40
 
 #define RPC_FC_PROC_PF_MUSTSIZE         0x0001
index 252c6e3..6364f9c 100644 (file)
@@ -26,6 +26,7 @@
 import "unknwn.idl";
 
 cpp_quote("#if 0")
+typedef HANDLE HMONITOR;
 
 typedef struct _RGNDATAHEADER
 {
index 4c1cdf2..c847eb0 100644 (file)
           {
             FT_Int  val = ss[0]; /* avoid a byte->int cast on each line */
 
+            tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0);
+            tt[1] = (FT_Byte)( ( val & 0x40 ) ? 0xff : 0);
+            tt[2] = (FT_Byte)( ( val & 0x20 ) ? 0xff : 0);
+            tt[3] = (FT_Byte)( ( val & 0x10 ) ? 0xff : 0);
+            tt[4] = (FT_Byte)( ( val & 0x08 ) ? 0xff : 0);
+            tt[5] = (FT_Byte)( ( val & 0x04 ) ? 0xff : 0);
+            tt[6] = (FT_Byte)( ( val & 0x02 ) ? 0xff : 0);
+            tt[7] = (FT_Byte)( ( val & 0x01 ) ? 0xff : 0);
 
-            tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 );
-            tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 );
-            tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 );
-            tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 );
-            tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 );
-            tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 );
-            tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 );
-            tt[7] = (FT_Byte)(   val & 0x01 );
 
             tt += 8;
             ss += 1;
 
             for ( ; j > 0; j-- )
             {
-              tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7);
+              tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0);
               val <<= 1;
               tt   += 1;
             }
index 93e7cd8..4a2cc23 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <module name="icu4ros" type="staticlibrary">
        <define name="U_STATIC_IMPLEMENTATION" />
        <define name="U_HAVE_INTTYPES_H" />
index 1e71ddc..ce52f58 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <module name="libsamplerate" type="staticlibrary" allowwarnings="true">
        <define name="HAVE_LRINT" />
        <define name="HAVE_LRINTF" />
index 33eb6a5..7193d4c 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
 <module name="atlnew" type="staticlibrary">
        <include base="atlnew">.</include>
        <define name="UNICODE" />
index 1cce797..137acf1 100644 (file)
@@ -18,8 +18,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef _atlbase_h
-#define _atlbase_h
+#pragma once
 
 #include "atlcore.h"
 #include "statreg.h"
@@ -1004,5 +1003,3 @@ inline void *__stdcall AtlWinModuleExtractCreateWndData(_ATL_WIN_MODULE *pWinMod
 #ifndef _ATL_NO_AUTOMATIC_NAMESPACE
 using namespace ATL;
 #endif //!_ATL_NO_AUTOMATIC_NAMESPACE
-
-#endif // _atlbase_h
index 04a4521..c86a675 100644 (file)
@@ -18,8 +18,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef _atlcom_h
-#define _atlcom_h
+#pragma once
 
 namespace ATL
 {
@@ -1129,5 +1128,3 @@ public:
        offsetofclass(ATL::IConnectionPointContainerImpl<_atl_conn_classtype>, _atl_conn_classtype)},
 
 }; // namespace ATL
-
-#endif // _atlcom_h
index 55fcfe5..c2f22ea 100644 (file)
@@ -18,8 +18,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef _atlcore_h
-#define _atlcore_h
+#pragma once
 
 #include <malloc.h>
 #include <olectl.h>
@@ -202,5 +201,3 @@ public:
 extern CAtlBaseModule _AtlBaseModule;
 
 }; // namespace ATL
-
-#endif // _atlcore_h
index c1a212b..de63eb0 100644 (file)
@@ -18,8 +18,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef _atlin_h
-#define _atlwin_h
+#pragma once
 
 #ifdef __GNUC__
 #define GCCU(x)        x __attribute__((unused))
@@ -778,5 +777,3 @@ struct _ATL_WNDCLASSINFOW
 };
 
 }; // namespace ATL
-
-#endif // _atlwin_h
index e5e0553..2da4f2c 100644 (file)
@@ -19,8 +19,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef _statreg_h
-#define _statreg_h
+#pragma once
 
 class IRegistrarBase : public IUnknown
 {
@@ -675,5 +674,3 @@ private:
 };
 
 }; //namespace ATL
-
-#endif // _statreg_h
index b4a3df7..61629c6 100644 (file)
@@ -5,8 +5,7 @@
  *            Copyright 2001 - 2005 Eric Kohl
  */
 
-#ifndef CMLIB_CMDATA_H
-#define CMLIB_CMDATA_H
+#pragma once
 
 #define  REG_INIT_BLOCK_LIST_SIZE      32
 #define  REG_INIT_HASH_TABLE_SIZE      3
@@ -209,5 +208,3 @@ typedef struct _CELL_DATA
         WCHAR KeyString[ANYSIZE_ARRAY];
     } u;
 } CELL_DATA, *PCELL_DATA;
-
-#endif /* CMLIB_CMDATA_H */
index ca289e7..fae0495 100644 (file)
@@ -5,8 +5,7 @@
  *            Copyright 2001 - 2005 Eric Kohl
  */
 
-#ifndef CMLIB_H
-#define CMLIB_H
+#pragma once
 
 //
 // Debug support switch
@@ -307,5 +306,3 @@ HvpCreateHiveFreeCellList(
 ULONG CMAPI
 HvpHiveHeaderChecksum(
    PHBASE_BLOCK HiveHeader);
-
-#endif /* CMLIB_H */
index 3501a8a..7bd8845 100644 (file)
@@ -5,8 +5,7 @@
  *            Copyright 2001 - 2005 Eric Kohl
  */
 
-#ifndef CMLIB_HIVEDATA_H
-#define CMLIB_HIVEDATA_H
+#pragma once
 
 //
 // Hive operations
@@ -305,5 +304,3 @@ typedef struct _HHIVE
 
 #define IsFreeCell(Cell)(Cell->Size >= 0)
 #define IsUsedCell(Cell)(Cell->Size < 0)
-
-#endif /* CMLIB_HIVEDATA_H */
index a4e3d3c..5cc20cf 100644 (file)
@@ -23,7 +23,7 @@ HvpWriteLog(
    PVOID BlockPtr;
    BOOLEAN Success;
 
-   DPRINT1("FIXME: HvpWriteLog doesn't do anything atm\n");
+   UNIMPLEMENTED;
    return TRUE;
 
    ASSERT(RegistryHive->ReadOnly == FALSE);
index 7780623..6186055 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
 <module name="dnslib" type="staticlibrary" unicode="yes">
        <include base="dnslib">inc</include>
        <file>addr.c</file>
index 4c187f1..d9626e6 100644 (file)
@@ -4,8 +4,8 @@
  * FILE:        include/mswsock.h
  * PURPOSE:     Ancillary Function Driver DLL header
  */
-#ifndef __DNSLIB_H
-#define __DNSLIB_H
+
+#pragma once
 
 /* INCLUDES ******************************************************************/
 #include <ws2atm.h>
@@ -339,5 +339,3 @@ Dns_Ip4ReverseNameToAddress_W(
     OUT PIN_ADDR Address,
     IN LPWSTR Name
 );
-
-#endif
diff --git a/reactos/lib/drivers/csq/csq.h b/reactos/lib/drivers/csq/csq.h
deleted file mode 100644 (file)
index b08d02c..0000000
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Cancel-Safe Queue Library
- * Copyright (c) 2004, Vizzini (vizzini@plasmic.com)
- * Licensed under the GNU GPL for the ReactOS project
- *
- * This header defines the interface to the ReactOS Cancel-Safe Queue library.
- * This interface is based on and is similar to the Microsoft Cancel-Safe
- * Queue interface.
- *
- * BACKGROUND
- *
- * IRP queuing is a royal pain in the butt, due to the fact that there are
- * tons of built-in race conditions.  IRP handling is difficult in general,
- * but the cancel logic has been particularly complicated due to some subtle
- * races, coupled with the fact that the system interfaces have changed over
- * time.
- *
- * Walter Oney (2nd. Ed. of Programming the Windows Driver Model) states a
- * common opinion among driver developers when he says that it is foolish
- * to try to roll your own cancel logic.  There are only a very few people
- * who have gotten it right in the past.  He suggests, instead, that you
- * either use his own well-tested code, or use the code in the Microsoft
- * Cancel-Safe Queue Library.
- *
- * We cannot do either, of course, due to copyright issues.  I have therefore
- * created this clone of the Microsoft library in order to concentrate all
- * of the IRP-queuing bugs in one place.  I'm quite sure there are problems
- * here, so if you are a driver writer, I'd be glad to hear your feedback.
- *
- * Apart from that, please try to use these routines, rather than building
- * your own.  If you think you have found a bug, please bring it up with me
- * or on-list, as this is complicated and non-obvious stuff.  Don't just
- * change this and hope for the best!
- *
- * USAGE
- *
- * This library follows exactly the same interface as the Microsoft Cancel-Safe
- * Queue routines (IoCsqXxx()).  As such, the authoritative reference is the
- * current DDK.  There is also a DDK sample called "cancel" that has an
- * example of how to use this code.  I have also provided a sample driver
- * that makes use of this queue. Finally, please do read the header and the
- * source if you're curious about the inner workings of these routines.
- */
-
-#ifndef _REACTOS_CSQ_H
-#define _REACTOS_CSQ_H
-
-/*
- * Prevent including the CSQ definitions twice. They're present in NTDDK
- * now too, except the *_EX versions.
- */
-#ifndef IO_TYPE_CSQ_IRP_CONTEXT
-
-struct _IO_CSQ;
-
-
-/*
- * CSQ Callbacks
- *
- * The cancel-safe queue is implemented as a set of IoCsqXxx() OS routines
- * copuled with a set of driver callbacks to handle the basic operations of
- * the queue.  You need to supply one of each of these functions in your own
- * driver.  These routines are also documented in the DDK under CsqXxx().
- * That is the authoritative documentation.
- */
-
-/*
- * Function to insert an IRP in the queue.  No need to worry about locking;
- * just tack it onto your list or something.
- *
- * Sample implementation: 
- *
-       VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, PIRP Irp)
-       {
-               KdPrint(("Inserting IRP 0x%x into CSQ\n", Irp));
-               InsertTailList(&IrpQueue, &Irp->Tail.Overlay.ListEntry);
-       }
- *
- */
-typedef VOID (NTAPI *PIO_CSQ_INSERT_IRP) (struct _IO_CSQ *Csq,
-                                          PIRP Irp);
-
-
-/*
- * Function to remove an IRP from the queue.
- *
- * Sample:
- *
-       VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, PIRP Irp)
-       {
-               KdPrint(("Removing IRP 0x%x from CSQ\n", Irp));
-               RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
-       }
- *
- */
-typedef VOID (NTAPI *PIO_CSQ_REMOVE_IRP) (struct _IO_CSQ *Csq,
-                                          PIRP Irp);
-
-/*
- * Function to look for an IRP in the queue
- *
- * Sample:
- *
-       PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, PIRP Irp, PVOID PeekContext)
-       {
-               KdPrint(("Peeking for next IRP\n"));
-
-               if(Irp)
-                       return CONTAINING_RECORD(&Irp->Tail.Overlay.ListEntry.Flink, IRP, Tail.Overlay.ListEntry);
-
-               if(IsListEmpty(&IrpQueue))
-                       return NULL;
-
-               return CONTAINING_RECORD(IrpQueue.Flink, IRP, Tail.Overlay.ListEntry);
-       }
- *
- */
-typedef PIRP (NTAPI *PIO_CSQ_PEEK_NEXT_IRP) (struct _IO_CSQ *Csq,
-                                             PIRP Irp,
-                                             PVOID PeekContext);
-
-/*
- * Lock the queue.  This can be a spinlock, a mutex, or whatever
- * else floats your boat.
- *
- * Sample:
- *
-       VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, PKIRQL Irql)
-       {
-               KdPrint(("Acquiring spin lock\n"));
-               KeAcquireSpinLock(&IrpQueueLock, Irql);
-       }
- *
- */
-typedef VOID (NTAPI *PIO_CSQ_ACQUIRE_LOCK) (struct _IO_CSQ *Csq,
-                                            PKIRQL Irql);
-
-/*
- * Unlock the queue:
- *
-       VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, KIRQL Irql)
-       {
-               KdPrint(("Releasing spin lock\n"));
-               KeReleaseSpinLock(&IrpQueueLock, Irql);
-       }
- *
- */
-typedef VOID (NTAPI *PIO_CSQ_RELEASE_LOCK) (struct _IO_CSQ *Csq,
-                                            KIRQL Irql);
-
-/*
- * Finally, this is called by the queue library when it wants to complete
- * a canceled IRP.
- * 
- * Sample:
- *
-       VOID NTAPI CsqCompleteCancelledIrp(PIO_CSQ Csq, PIRP Irp)
-       {
-               KdPrint(("cancelling irp 0x%x\n", Irp));
-               Irp->IoStatus.Status = STATUS_CANCELLED;
-               Irp->IoStatus.Information = 0;
-               IoCompleteRequest(Irp, IO_NO_INCREMENT);
-       }
- *
- */
-typedef VOID (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP) (struct _IO_CSQ *Csq,
-                                                     PIRP Irp);
-
-
-/*
- * STRUCTURES
- *
- * NOTE:  Please do not use these directly.  You will make incompatible code
- * if you do.  Always only use the documented IoCsqXxx() interfaces and you
- * will amass much Good Karma.
- */
-#define IO_TYPE_CSQ_IRP_CONTEXT 1
-#define IO_TYPE_CSQ 2
-
-/*
- * IO_CSQ - Queue control structure
- */
-typedef struct _IO_CSQ {
-       ULONG                          Type;
-       PIO_CSQ_INSERT_IRP             CsqInsertIrp;
-       PIO_CSQ_REMOVE_IRP             CsqRemoveIrp;
-       PIO_CSQ_PEEK_NEXT_IRP          CsqPeekNextIrp;
-       PIO_CSQ_ACQUIRE_LOCK           CsqAcquireLock;
-       PIO_CSQ_RELEASE_LOCK           CsqReleaseLock;
-       PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp;
-       PVOID                          ReservePointer;  /* must be NULL */
-} IO_CSQ, *PIO_CSQ;
-
-/*
- * IO_CSQ_IRP_CONTEXT - Context used to track an IRP in the CSQ
- */
-typedef struct _IO_CSQ_IRP_CONTEXT {
-       ULONG   Type;
-       PIRP    Irp;
-       PIO_CSQ Csq;
-} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
-
-#endif /* IO_TYPE_CSQ_IRP_CONTEXT */
-
-/* See IO_TYPE_CSQ_* above */
-#define IO_TYPE_CSQ_EX 3
-
-/*
- * Function to insert an IRP into the queue with extended context information.
- * This is useful if you need to be able to de-queue particular IRPs more
- * easily in some cases.
- *
- * Same deal as above; sample implementation:
- *
-       NTSTATUS NTAPI CsqInsertIrpEx(PIO_CSQ Csq, PIRP Irp, PVOID InsertContext)
-       {
-               CsqInsertIrp(Csq, Irp);
-               return STATUS_PENDING;
-       }
- *
- */
-typedef NTSTATUS (NTAPI *PIO_CSQ_INSERT_IRP_EX) (struct _IO_CSQ *Csq,
-                                                 PIRP Irp,
-                                                 PVOID InsertContext);
-
-/*
- * CANCEL-SAFE QUEUE DDIs
- *
- * These device driver interfaces are called to make use of the queue.  Again,
- * authoritative documentation for these functions is in the DDK.  The csqtest
- * driver also makes use of some of them.
- */
-
-
-/*
- * Call this in DriverEntry or similar in order to set up the Csq structure.
- * As long as the Csq struct and the functions you pass in are resident,
- * there are no IRQL restrictions.
- */
-NTSTATUS NTAPI IoCsqInitialize(PIO_CSQ Csq,
-                               PIO_CSQ_INSERT_IRP CsqInsertIrp,
-                               PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
-                               PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
-                               PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
-                               PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
-                               PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
-
-/*
- * Same as above, except you provide a CsqInsertIrpEx routine instead of
- * CsqInsertIrp.  This eventually allows you to supply extra tracking
- * information for use with the queue.
- */
-NTSTATUS NTAPI IoCsqInitializeEx(PIO_CSQ Csq,
-                                 PIO_CSQ_INSERT_IRP_EX CsqInsertIrpEx,
-                                 PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
-                                 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
-                                 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
-                                 PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
-                                 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
-
-/*
- * Insert an IRP into the queue
- */
-VOID NTAPI IoCsqInsertIrp(PIO_CSQ Csq,
-                          PIRP Irp,
-                          PIO_CSQ_IRP_CONTEXT Context);
-
-/*
- * Insert an IRP into the queue, with special context maintained that
- * makes it easy to find IRPs in the queue
- */
-NTSTATUS NTAPI IoCsqInsertIrpEx(PIO_CSQ Csq,
-                                PIRP Irp,
-                                PIO_CSQ_IRP_CONTEXT Context,
-                                PVOID InsertContext);
-
-/*
- * Remove a particular IRP from the queue
- */
-PIRP NTAPI IoCsqRemoveIrp(PIO_CSQ Csq,
-                          PIO_CSQ_IRP_CONTEXT Context);
-
-/*
- * Remove the next IRP from the queue 
- */
-PIRP NTAPI IoCsqRemoveNextIrp(PIO_CSQ Csq,
-                              PVOID PeekContext);
-
-#endif /* _REACTOS_CSQ_H */
index 9badd7b..4534da3 100644 (file)
@@ -107,11 +107,11 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) {
 
 /* Memory management routines
  *
- * By far the most requests for memory are either for 128 or 2048 byte blocks,
+ * By far the most requests for memory are either for 128 or 2049 byte blocks,
  * so we want to satisfy those from lookaside lists. Unfortunately, the
  * TCPFree() function doesn't pass the size of the block to be freed, so we
  * need to keep track of it ourselves. We do it by prepending each block with
- * 4 bytes, indicating if this is a 'L'arge (2048), 'S'mall (128) or 'O'ther
+ * 4 bytes, indicating if this is a 'L'arge (2049), 'S'mall (128) or 'O'ther
  * block.
  */
 
@@ -119,7 +119,7 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) {
 #define MEM_PROFILE 0
 
 #define SMALL_SIZE 128
-#define LARGE_SIZE 2048
+#define LARGE_SIZE 2049
 
 #define SIGNATURE_LARGE 'LLLL'
 #define SIGNATURE_SMALL 'SSSS'
index 5e1ff8b..d02477d 100644 (file)
@@ -203,7 +203,9 @@ MMixerGetControlTypeFromTopologyNode(
         UNIMPLEMENTED;
         return MIXERCONTROL_CONTROLTYPE_VOLUME;
     }
-    UNIMPLEMENTED
+    //TODO
+    //check for other supported node types
+    //UNIMPLEMENTED
     return 0;
 }
 
index fa7183d..0cfc4ac 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef MIXER_H__
-#define MIXER_H__
+#pragma once
 
 typedef enum
 {
@@ -75,6 +74,15 @@ typedef PVOID (*PMIXER_ALLOC_EVENT_DATA)(
 typedef VOID (*PMIXER_FREE_EVENT_DATA)(
     IN PVOID EventData);
 
+typedef MIXER_STATUS (*PIN_CREATE_CALLBACK)(
+    IN PVOID Context,
+    IN ULONG DeviceId,
+    IN ULONG PinId,
+    IN HANDLE hFilter,
+    IN PKSPIN_CONNECT PinConnect,
+    IN ACCESS_MASK DesiredAccess,
+    OUT PHANDLE PinHandle);
+
 typedef struct
 {
      ULONG SizeOfStruct;
@@ -172,6 +180,8 @@ MMixerOpenWave(
     IN ULONG DeviceIndex,
     IN ULONG bWaveIn,
     IN LPWAVEFORMATEX WaveFormat,
+    IN PIN_CREATE_CALLBACK CreateCallback,
+    IN PVOID Context,
     OUT PHANDLE PinHandle);
 
 MIXER_STATUS
@@ -180,4 +190,9 @@ MMixerSetWaveStatus(
     IN HANDLE PinHandle,
     IN KSSTATE State);
 
-#endif
+MIXER_STATUS
+MMixerGetWaveDevicePath(
+    IN PMIXER_CONTEXT MixerContext,
+    IN ULONG bWaveIn,
+    IN ULONG DeviceId,
+    OUT LPWSTR * DevicePath);
index 5b582d6..2097294 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef PRIV_H__
-#define PRIV_H__
+#pragma once
 
 #include <pseh/pseh2.h>
 #include <ntddk.h>
@@ -279,5 +278,3 @@ MIXER_STATUS
 MMixerAddEvents(
     IN PMIXER_CONTEXT MixerContext,
     IN OUT LPMIXER_INFO MixerInfo);
-
-#endif
index f35d167..0149df2 100644 (file)
@@ -588,7 +588,7 @@ MMixerGetDataByDeviceName(
     while(Entry != &MixerList->MixerData)
     {
         MixerData = (LPMIXER_DATA)CONTAINING_RECORD(Entry, MIXER_DATA, Entry);
-        if (wcsicmp(DeviceName, MixerData->DeviceName) == 0)
+        if (wcsicmp(&DeviceName[2], &MixerData->DeviceName[2]) == 0)
         {
             // found entry
             return MixerData;
index 498c61b..a8b2675 100644 (file)
@@ -233,12 +233,15 @@ MMixerOpenWavePin(
     IN ULONG PinId,
     IN LPWAVEFORMATEX WaveFormatEx,
     IN ACCESS_MASK DesiredAccess,
+    IN PIN_CREATE_CALLBACK CreateCallback,
+    IN PVOID Context,
     OUT PHANDLE PinHandle)
 {
     PKSPIN_CONNECT PinConnect;
     PKSDATAFORMAT_WAVEFORMATEX DataFormat;
     LPMIXER_DATA MixerData;
     NTSTATUS Status;
+    MIXER_STATUS MixerStatus;
 
     MixerData = MMixerGetDataByDeviceId(MixerList, DeviceId);
     if (!MixerData)
@@ -260,16 +263,28 @@ MMixerOpenWavePin(
     /* initialize with requested wave format */
     MMixerInitializeDataFormat(DataFormat, WaveFormatEx);
 
-    /* now create the pin */
-    Status = KsCreatePin(MixerData->hDevice, PinConnect, DesiredAccess, PinHandle);
+    if (CreateCallback)
+    {
+        /* let the callback handle the creation */
+        MixerStatus = CreateCallback(Context, DeviceId, PinId, MixerData->hDevice, PinConnect, DesiredAccess, PinHandle);
+    }
+    else
+    {
+        /* now create the pin */
+        Status = KsCreatePin(MixerData->hDevice, PinConnect, DesiredAccess, PinHandle);
+
+        /* normalize status */
+        if (Status == STATUS_SUCCESS)
+            MixerStatus = MM_STATUS_SUCCESS;
+        else
+            MixerStatus = MM_STATUS_UNSUCCESSFUL;
+    }
 
     /* free create info */
     MixerContext->Free(PinConnect);
 
-    if (Status == STATUS_SUCCESS)
-        return MM_STATUS_SUCCESS;
-    else
-        return MM_STATUS_UNSUCCESSFUL;
+    /* done */
+    return MixerStatus;
 }
 
 VOID
@@ -415,6 +430,8 @@ MMixerOpenWave(
     IN ULONG DeviceIndex,
     IN ULONG bWaveIn,
     IN LPWAVEFORMATEX WaveFormat,
+    IN PIN_CREATE_CALLBACK CreateCallback,
+    IN PVOID Context,
     OUT PHANDLE PinHandle)
 {
     PMIXER_LIST MixerList;
@@ -459,7 +476,7 @@ MMixerOpenWave(
     }
 
     /* now try open the pin */
-    return MMixerOpenWavePin(MixerContext, MixerList, WaveInfo->DeviceId, WaveInfo->PinId, WaveFormat, DesiredAccess, PinHandle);
+    return MMixerOpenWavePin(MixerContext, MixerList, WaveInfo->DeviceId, WaveInfo->PinId, WaveFormat, DesiredAccess, CreateCallback, Context, PinHandle);
 }
 
 MIXER_STATUS
@@ -594,3 +611,61 @@ MMixerSetWaveStatus(
 
     return MixerContext->Control(PinHandle, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), &State, sizeof(KSSTATE), &Length);
 }
+
+MIXER_STATUS
+MMixerGetWaveDevicePath(
+    IN PMIXER_CONTEXT MixerContext,
+    IN ULONG bWaveIn,
+    IN ULONG DeviceId,
+    OUT LPWSTR * DevicePath)
+{
+    PMIXER_LIST MixerList;
+    LPMIXER_DATA MixerData;
+    LPWAVE_INFO WaveInfo;
+    ULONG Length;
+    MIXER_STATUS Status;
+
+    // verify mixer context
+    Status = MMixerVerifyContext(MixerContext);
+
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        // invalid context passed
+        return Status;
+    }
+
+    // grab mixer list
+    MixerList = (PMIXER_LIST)MixerContext->MixerContext;
+
+    /* find destination wave */
+    Status = MMixerGetWaveInfoByIndexAndType(MixerList, DeviceId, bWaveIn, &WaveInfo);
+    if (Status != MM_STATUS_SUCCESS)
+    {
+        /* failed to find wave info */
+        return MM_STATUS_INVALID_PARAMETER;
+    }
+
+    /* get associated device id */
+    MixerData = MMixerGetDataByDeviceId(MixerList, WaveInfo->DeviceId);
+    if (!MixerData)
+        return MM_STATUS_INVALID_PARAMETER;
+
+    /* calculate length */
+    Length = wcslen(MixerData->DeviceName)+1;
+
+    /* allocate destination buffer */
+    *DevicePath = MixerContext->Alloc(Length * sizeof(WCHAR));
+
+    if (!*DevicePath)
+    {
+        /* no memory */
+        return MM_STATUS_NO_MEMORY;
+    }
+
+    /* copy device path */
+    MixerContext->Copy(*DevicePath, MixerData->DeviceName, Length * sizeof(WCHAR));
+
+    /* done */
+    return MM_STATUS_SUCCESS;
+}
+
index cbac01c..a605a29 100644 (file)
@@ -1,12 +1,7 @@
-#ifndef _BITMAP_H
+#pragma once
 
 #include "time.h"
 #include "stdio.h"
 #include "stdlib.h"
 #include "string.h"
 #include "windows.h"
-
-
-
-
-#endif // _BITMAP_H
index d23a14a..da24bf3 100644 (file)
@@ -5,15 +5,10 @@
  * HOMEPAGE:         http://ext2.yeah.net
  */
 
-#ifndef _DISK_H_
-#define _DISK_H_
+#pragma once
 
 /* INCLUDES **************************************************************/
 
 #include "Stdafx.h"
 
 /* DEFINITIONS ***********************************************************/
-
-
-
-#endif /* _DISK_H_ */
index f8c3076..4afba0d 100644 (file)
@@ -5,9 +5,7 @@
  * HOMEPAGE:         http://ext2.yeah.net
  */
 
-#ifndef __MKE2FS__INCLUDE__
-#define __MKE2FS__INCLUDE__
-
+#pragma once
 
 /* INCLUDES **************************************************************/
 
@@ -406,5 +404,3 @@ ULONG ext2_unix_time (LONGLONG n_time);
  */
 
 void uuid_generate(__u8 * uuid);
-
-#endif //__MKE2FS__INCLUDE__
index be4cafa..864551c 100644 (file)
@@ -13,8 +13,7 @@
  *  Copyright f(C) 1991, 1992  Linus Torvalds
  */
 
-#ifndef _LINUX_EXT2_FS_H
-#define _LINUX_EXT2_FS_H
+#pragma once
 
 #include "types.h"             /* Changed from linux/types.h */
 
@@ -653,5 +652,3 @@ extern struct inode_operations ext2_fast_symlink_inode_operations;
 extern struct address_space_operations ext2_aops;
 
 #endif /* __KERNEL__ */
-
-#endif /* _LINUX_EXT2_FS_H */
index a874df5..c43fb13 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef _LINUX_TYPES_H
-#define _LINUX_TYPES_H
+#pragma once
 
 typedef unsigned long __u32;
 typedef signed long __s32;
 typedef unsigned short int __u16;
 typedef signed short int __s16;
 typedef unsigned char __u8;
-
-#endif /* LINUX_TYPES_H */
index 8504ab3..a80f202 100644 (file)
@@ -6,14 +6,11 @@
  *             Ge van Geldorp <gvg@reactos.org>
  */
 
-#ifndef INFCOMMON_H_INCLUDED
-#define INFCOMMON_H_INCLUDED
+#pragma once
 
 #define MAX_INF_STRING_LENGTH  512
 
 typedef void *HINF, **PHINF;
 typedef struct _INFCONTEXT *PINFCONTEXT;
 
-#endif /* INFCOMMON_H_INCLUDED */
-
 /* EOF */
index 3e17e7f..1a40990 100644 (file)
@@ -6,8 +6,7 @@
  *             Ge van Geldorp <gvg@reactos.org>
  */
 
-#ifndef INFHOST_H_INCLUDED
-#define INFHOST_H_INCLUDED
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
@@ -76,6 +75,4 @@ extern void InfHostFreeContext(PINFCONTEXT Context);
 }
 #endif /* __cplusplus */
 
-#endif /* INFROS_H_INCLUDED */
-
 /* EOF */
index 86eb7b0..e4424cc 100644 (file)
@@ -6,8 +6,7 @@
  *             Ge van Geldorp <gvg@reactos.org>
  */
 
-#ifndef INFPRIV_H_INCLUDED
-#define INFPRIV_H_INCLUDED
+#pragma once
 
 #ifndef FIELD_OFFSET
 #define FIELD_OFFSET(t,f) ((ptrdiff_t)&(((t*)0)->f))
@@ -142,6 +141,4 @@ extern INFSTATUS InfpAddField(PINFCONTEXT Context, PCTSTR Data);
 
 extern VOID InfpFreeContext(PINFCONTEXT Context);
 
-#endif /* INFPRIV_H_INCLUDED */
-
 /* EOF */
index 77368cb..80e8692 100644 (file)
@@ -6,8 +6,7 @@
  *             Ge van Geldorp <gvg@reactos.org>
  */
 
-#ifndef INFROS_H_INCLUDED
-#define INFROS_H_INCLUDED
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
@@ -77,6 +76,4 @@ extern VOID InfFreeContext(PINFCONTEXT Context);
 }
 #endif /* __cplusplus */
 
-#endif /* INFROS_H_INCLUDED */
-
 /* EOF */
index 8bf8083..1911e5f 100644 (file)
@@ -30,8 +30,7 @@
  *
  */
 
-#ifndef REACTOS_SCRIPTS_H_
-#define REACTOS_SCRIPTS_H_
+#pragma once
 
 #include <assert.h>
 #include <limits.h>
@@ -69,6 +68,4 @@ extern "C" bool SCRIPTS_GetCharScriptCode(UChar32 c, int32_t * code);
 extern "C" bool SCRIPTS_GetScriptCode(const SCRIPTS_Script * pScript, int32_t * code);
 extern "C" void SCRIPTS_GetScriptName(int32_t code, SCRIPTS_Script * pScript);
 
-#endif
-
 /* EOF */
index 9689746..024f757 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _LIBMMU_MMUOBJECT_H
-#define _LIBMMU_MMUOBJECT_H
+#pragma once
 
 void initme();
 void mmusetramsize(paddr_t size);
@@ -13,5 +12,3 @@ void freevsid(int);
 void mmufreevsid(int vsid, int mask);
 int mmunitest();
 void callkernel(void *fun_ptr, void *arg);
-
-#endif/*_LIBMMU_MMUOBJECT_H*/
index a1f64e9..b822f1d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __RECYCLEBIN_H
-#define __RECYCLEBIN_H
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
@@ -297,5 +296,3 @@ GetDefaultRecycleBin(
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* __RECYCLEBIN_H */
index abccd29..cc3f8ff 100644 (file)
@@ -7,8 +7,7 @@
  * PROGRAMMERS:     Ge van Geldorp (gvg@reactos.com)
  */
 
-#ifndef ROSSYMPRIV_H_INCLUDED
-#define ROSSYMPRIV_H_INCLUDED
+#pragma once
 
 typedef struct _ROSSYM_INFO {
   PROSSYM_ENTRY Symbols;
@@ -32,8 +31,4 @@ extern BOOLEAN RosSymZwSeekFile(PVOID FileContext, ULONG_PTR Position);
 #define ROSSYM_IS_VALID_NT_HEADERS(NtHeaders) (IMAGE_NT_SIGNATURE == (NtHeaders)->Signature \
                                                && IMAGE_NT_OPTIONAL_HDR_MAGIC == (NtHeaders)->OptionalHeader.Magic)
 
-
-#endif /* ROSSYMPRIV_H_INCLUDED */
-
 /* EOF */
-
index 7ad78d3..470b018 100644 (file)
@@ -234,7 +234,17 @@ static WCHAR *xmlstrdupW(const xmlstr_t* str)
     return strW;
 }
 
-static __inline BOOL xmlstr_cmp(const xmlstr_t* xmlstr, const WCHAR *str)
+static UNICODE_STRING xmlstr2unicode(const xmlstr_t *xmlstr)
+{
+    UNICODE_STRING res;
+
+    res.Buffer = (PWSTR)xmlstr->ptr;
+    res.Length = res.MaximumLength = xmlstr->len;
+
+    return res;
+}
+
+static inline BOOL xmlstr_cmp(const xmlstr_t* xmlstr, const WCHAR *str)
 {
     return !strncmpW(xmlstr->ptr, str, xmlstr->len) && !str[xmlstr->len];
 }
@@ -420,7 +430,7 @@ static BOOL add_dependent_assembly_id(struct actctx_loader* acl,
     for (i = 0; i < acl->actctx->num_assemblies; i++)
         if (is_matching_identity( ai, &acl->actctx->assemblies[i].id ))
         {
-            DPRINT( "reusing existing assembly for %s arch %s version %u.%u.%u.%u\n",
+            DPRINT( "reusing existing assembly for %S arch %S version %u.%u.%u.%u\n",
                    ai->name, ai->arch, ai->version.major, ai->version.minor,
                    ai->version.build, ai->version.revision );
             return TRUE;
@@ -429,7 +439,7 @@ static BOOL add_dependent_assembly_id(struct actctx_loader* acl,
     for (i = 0; i < acl->num_dependencies; i++)
         if (is_matching_identity( ai, &acl->dependencies[i] ))
         {
-            DPRINT( "reusing existing dependency for %s arch %s version %u.%u.%u.%u\n",
+            DPRINT( "reusing existing dependency for %S arch %S version %u.%u.%u.%u\n",
                    ai->name, ai->arch, ai->version.major, ai->version.minor,
                    ai->version.build, ai->version.revision );
             return TRUE;
@@ -551,14 +561,15 @@ static ACTIVATION_CONTEXT *check_actctx( HANDLE h )
     ACTIVATION_CONTEXT *ret = NULL, *actctx = h;
 
     if (!h || h == INVALID_HANDLE_VALUE) return NULL;
-    //__TRY
+    _SEH2_TRY
     {
         if (actctx && actctx->magic == ACTCTX_MAGIC) ret = actctx;
     }
-    //__EXCEPT_PAGE_FAULT
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
+        DPRINT1("Invalid activation context handle!\n");
     }
-    //__ENDTRY
+    _SEH2_END;
     return ret;
 }
 
@@ -731,6 +742,7 @@ static BOOL parse_version(const xmlstr_t *str, struct assembly_version *version)
     unsigned int ver[4];
     unsigned int pos;
     const WCHAR *curr;
+    UNICODE_STRING strU;
 
     /* major.minor.build.revision */
     ver[0] = ver[1] = ver[2] = ver[3] = pos = 0;
@@ -754,28 +766,34 @@ static BOOL parse_version(const xmlstr_t *str, struct assembly_version *version)
     return TRUE;
 
 error:
-    DPRINT1( "Wrong version definition in manifest file (%s)\n", str->ptr );
+    strU = xmlstr2unicode(str);
+    DPRINT1( "Wrong version definition in manifest file (%wZ)\n", &strU );
     return FALSE;
 }
 
 static BOOL parse_expect_elem(xmlbuf_t* xmlbuf, const WCHAR* name)
 {
     xmlstr_t    elem;
+    UNICODE_STRING elemU;
     if (!next_xml_elem(xmlbuf, &elem)) return FALSE;
     if (xmlstr_cmp(&elem, name)) return TRUE;
-    DPRINT1( "unexpected element %s\n", elem.ptr );
+    elemU = xmlstr2unicode(&elem);
+    DPRINT1( "unexpected element %wZ\n", &elemU );
     return FALSE;
 }
 
 static BOOL parse_expect_no_attr(xmlbuf_t* xmlbuf, BOOL* end)
 {
     xmlstr_t    attr_name, attr_value;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        error;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, end))
     {
-        DPRINT1( "unexpected attr %s=%s\n", attr_name.ptr,
-             attr_value.ptr);
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_name);
+        DPRINT1( "unexpected attr %S=%S\n", &attr_nameU,
+             &attr_valueU);
     }
     return !error;
 }
@@ -789,10 +807,12 @@ static BOOL parse_end_element(xmlbuf_t *xmlbuf)
 static BOOL parse_expect_end_elem(xmlbuf_t *xmlbuf, const WCHAR *name)
 {
     xmlstr_t    elem;
+    UNICODE_STRING elemU;
     if (!next_xml_elem(xmlbuf, &elem)) return FALSE;
     if (!xmlstr_cmp_end(&elem, name))
     {
-        DPRINT1( "unexpected element %s\n", elem.ptr );
+        elemU = xmlstr2unicode(&elem);
+        DPRINT1( "unexpected element %wZ\n", &elemU );
         return FALSE;
     }
     return parse_end_element(xmlbuf);
@@ -823,6 +843,7 @@ static BOOL parse_assembly_identity_elem(xmlbuf_t* xmlbuf, ACTIVATION_CONTEXT* a
 {
     xmlstr_t    attr_name, attr_value;
     BOOL        end = FALSE, error;
+    UNICODE_STRING  attr_valueU, attr_nameU;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
@@ -848,14 +869,15 @@ static BOOL parse_assembly_identity_elem(xmlbuf_t* xmlbuf, ACTIVATION_CONTEXT* a
         }
         else if (xmlstr_cmp(&attr_name, languageW))
         {
-            DPRINT1("Unsupported yet language attribute (%s)\n",
-                 attr_value.ptr);
             if (!(ai->language = xmlstrdupW(&attr_value))) return FALSE;
+            DPRINT1("Unsupported yet language attribute (%S)\n",
+                 ai->language);
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr,
-                 attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -868,6 +890,7 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
     xmlstr_t elem, attr_name, attr_value;
     BOOL ret, end = FALSE, error;
     struct entity*      entity;
+    UNICODE_STRING  attr_valueU, attr_nameU;
 
     if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION)))
         return FALSE;
@@ -880,7 +903,9 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -895,7 +920,8 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            attr_nameU = xmlstr2unicode(&elem);
+            DPRINT1("unknown elem %wZ\n", &attr_nameU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -907,6 +933,7 @@ static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redi
     xmlstr_t    attr_name, attr_value;
     BOOL        end = FALSE, error;
     struct entity*      entity;
+    UNICODE_STRING  attr_valueU, attr_nameU;
 
     if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION)))
         return FALSE;
@@ -923,7 +950,9 @@ static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redi
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -936,6 +965,7 @@ static BOOL parse_typelib_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
     xmlstr_t    attr_name, attr_value;
     BOOL        end = FALSE, error;
     struct entity*      entity;
+    UNICODE_STRING  attr_valueU, attr_nameU;
 
     if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION)))
         return FALSE;
@@ -956,7 +986,9 @@ static BOOL parse_typelib_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr , attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -969,6 +1001,7 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
     xmlstr_t    elem, content;
     BOOL        end = FALSE, ret = TRUE;
     struct entity*      entity;
+    UNICODE_STRING elemU;
 
     if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION)))
         return FALSE;
@@ -989,7 +1022,8 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            elemU = xmlstr2unicode(&elem);
+            DPRINT1("unknown elem %wZ\n", &elemU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -1000,21 +1034,25 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
 static BOOL parse_binding_redirect_elem(xmlbuf_t* xmlbuf)
 {
     xmlstr_t    attr_name, attr_value;
+    UNICODE_STRING  attr_valueU, attr_nameU;
     BOOL        end = FALSE, error;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_value);
+
         if (xmlstr_cmp(&attr_name, oldVersionW))
         {
-            DPRINT1("Not stored yet oldVersion=%s\n", attr_value.ptr);
+            DPRINT1("Not stored yet oldVersion=%wZ\n", &attr_valueU);
         }
         else if (xmlstr_cmp(&attr_name, newVersionW))
         {
-            DPRINT1("Not stored yet newVersion=%s\n", attr_value.ptr);
+            DPRINT1("Not stored yet newVersion=%wZ\n", &attr_valueU);
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1025,13 +1063,15 @@ static BOOL parse_binding_redirect_elem(xmlbuf_t* xmlbuf)
 static BOOL parse_description_elem(xmlbuf_t* xmlbuf)
 {
     xmlstr_t    elem, content;
+    UNICODE_STRING elemU;
     BOOL        end = FALSE, ret = TRUE;
 
     if (!parse_expect_no_attr(xmlbuf, &end) || end ||
         !parse_text_content(xmlbuf, &content))
         return FALSE;
 
-    DPRINT("Got description %s\n", content.ptr);
+    elemU = xmlstr2unicode(&content);
+    DPRINT("Got description %wZ\n", &elemU);
 
     while (ret && (ret = next_xml_elem(xmlbuf, &elem)))
     {
@@ -1042,7 +1082,8 @@ static BOOL parse_description_elem(xmlbuf_t* xmlbuf)
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            elemU = xmlstr2unicode(&elem);
+            DPRINT1("unknown elem %wZ\n", &elemU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -1072,7 +1113,7 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf,
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %S=%S\n", attr_name.ptr, attr_value.ptr);
         }
     }
 
@@ -1083,6 +1124,7 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf,
 static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 {
     xmlstr_t    attr_name, attr_value;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        end = FALSE, error;
     struct entity*      entity;
 
@@ -1101,7 +1143,9 @@ static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1112,6 +1156,7 @@ static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 {
     xmlstr_t    attr_name, attr_value;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        end = FALSE, error;
     struct entity*      entity;
 
@@ -1130,7 +1175,9 @@ static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            attr_nameU = xmlstr2unicode(&attr_name);
+            attr_valueU = xmlstr2unicode(&attr_value);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1169,7 +1216,7 @@ static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            DPRINT1("unknown elem %S\n", elem.ptr);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -1180,19 +1227,23 @@ static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader
 static BOOL parse_dependency_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl)
 {
     xmlstr_t attr_name, attr_value, elem;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL end = FALSE, ret = TRUE, error, optional = FALSE;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_value);
+
         if (xmlstr_cmp(&attr_name, optionalW))
         {
             static const WCHAR yesW[] = {'y','e','s',0};
             optional = xmlstr_cmpi( &attr_value, yesW );
-            DPRINT1("optional=%s\n", attr_value.ptr);
+            DPRINT1("optional=%wZ\n", &attr_valueU);
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1209,7 +1260,8 @@ static BOOL parse_dependency_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl)
         }
         else
         {
-            DPRINT1("unknown element %s\n", elem.ptr);
+            attr_nameU = xmlstr2unicode(&elem);
+            DPRINT1("unknown element %wZ\n", &attr_nameU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
     }
@@ -1236,6 +1288,7 @@ static BOOL parse_noinheritable_elem(xmlbuf_t* xmlbuf)
 static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 {
     xmlstr_t    attr_name, attr_value, elem;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        end = FALSE, error, ret = TRUE;
     struct dll_redirect* dll;
 
@@ -1243,10 +1296,13 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_value);
+
         if (xmlstr_cmp(&attr_name, nameW))
         {
             if (!(dll->name = xmlstrdupW(&attr_value))) return FALSE;
-            DPRINT("name=%s\n", attr_value.ptr);
+            DPRINT("name=%wZ\n", &attr_valueU);
         }
         else if (xmlstr_cmp(&attr_name, hashW))
         {
@@ -1256,11 +1312,11 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
         {
             static const WCHAR sha1W[] = {'S','H','A','1',0};
             if (!xmlstr_cmpi(&attr_value, sha1W))
-                DPRINT1("hashalg should be SHA1, got %s\n", attr_value.ptr);
+                DPRINT1("hashalg should be SHA1, got %wZ\n", &attr_valueU);
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1297,7 +1353,8 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
         }
         else
         {
-            DPRINT1("unknown elem %s\n", elem.ptr);
+            attr_nameU = xmlstr2unicode(&elem);
+            DPRINT1("unknown elem %wZ\n", &attr_nameU);
             ret = parse_unknown_elem( xmlbuf, &elem );
         }
     }
@@ -1310,16 +1367,20 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
                                 struct assembly_identity* expected_ai)
 {
     xmlstr_t    attr_name, attr_value, elem;
+    UNICODE_STRING attr_nameU, attr_valueU;
     BOOL        end = FALSE, error, version = FALSE, xmlns = FALSE, ret = TRUE;
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
+        attr_nameU = xmlstr2unicode(&attr_name);
+        attr_valueU = xmlstr2unicode(&attr_value);
+
         if (xmlstr_cmp(&attr_name, manifestVersionW))
         {
             static const WCHAR v10W[] = {'1','.','0',0};
             if (!xmlstr_cmp(&attr_value, v10W))
             {
-                DPRINT1("wrong version %s\n", attr_value.ptr);
+                DPRINT1("wrong version %wZ\n", &attr_valueU);
                 return FALSE;
             }
             version = TRUE;
@@ -1328,14 +1389,14 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
         {
             if (!xmlstr_cmp(&attr_value, manifestv1W) && !xmlstr_cmp(&attr_value, manifestv3W))
             {
-                DPRINT1("wrong namespace %s\n", attr_value.ptr);
+                DPRINT1("wrong namespace %wZ\n", &attr_valueU);
                 return FALSE;
             }
             xmlns = TRUE;
         }
         else
         {
-            DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr);
+            DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU);
         }
     }
 
@@ -1420,7 +1481,8 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
         }
         else
         {
-            DPRINT1("unknown element %s\n", elem.ptr);
+            attr_nameU = xmlstr2unicode(&elem);
+            DPRINT1("unknown element %wZ\n", &attr_nameU);
             ret = parse_unknown_elem(xmlbuf, &elem);
         }
         if (ret) ret = next_xml_elem(xmlbuf, &elem);
@@ -1433,6 +1495,7 @@ static NTSTATUS parse_manifest_buffer( struct actctx_loader* acl, struct assembl
                                        struct assembly_identity* ai, xmlbuf_t *xmlbuf )
 {
     xmlstr_t elem;
+    UNICODE_STRING elemU;
 
     if (!next_xml_elem(xmlbuf, &elem)) return STATUS_SXS_CANT_GEN_ACTCTX;
 
@@ -1442,19 +1505,21 @@ static NTSTATUS parse_manifest_buffer( struct actctx_loader* acl, struct assembl
 
     if (!xmlstr_cmp(&elem, assemblyW))
     {
-        DPRINT1("root element is %s, not <assembly>\n", elem.ptr);
+        elemU = xmlstr2unicode(&elem);
+        DPRINT1("root element is %wZ, not <assembly>\n", &elemU);
         return STATUS_SXS_CANT_GEN_ACTCTX;
     }
 
     if (!parse_assembly_elem(xmlbuf, acl, assembly, ai))
     {
-        DPRINT1("failed to parse manifest %s\n", assembly->manifest.info );
+        DPRINT1("failed to parse manifest %S\n", assembly->manifest.info );
         return STATUS_SXS_CANT_GEN_ACTCTX;
     }
 
     if (next_xml_elem(xmlbuf, &elem))
     {
-        DPRINT1("unexpected element %s\n", elem.ptr);
+        elemU = xmlstr2unicode(&elem);
+        DPRINT1("unexpected element %wZ\n", &elemU);
         return STATUS_SXS_CANT_GEN_ACTCTX;
     }
 
@@ -1475,7 +1540,7 @@ static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_ident
     struct assembly *assembly;
     int unicode_tests;
 
-    DPRINT( "parsing manifest loaded from %s base dir %s\n", filename, directory );
+    DPRINT( "parsing manifest loaded from %S base dir %S\n", filename, directory );
 
     if (!(assembly = add_assembly(acl->actctx, shared ? ASSEMBLY_SHARED_MANIFEST : ASSEMBLY_MANIFEST)))
         return STATUS_SXS_CANT_GEN_ACTCTX;
@@ -1654,7 +1719,7 @@ static NTSTATUS get_manifest_in_pe_file( struct actctx_loader* acl, struct assem
     SIZE_T              count;
     void               *base;
 
-    DPRINT( "looking for res %s in %s\n", resname, filename );
+    DPRINT( "looking for res %S in %S\n", resname, filename );
 
     attr.Length                   = sizeof(attr);
     attr.RootDirectory            = 0;
@@ -1747,7 +1812,7 @@ static NTSTATUS get_manifest_in_associated_manifest( struct actctx_loader* acl,
 
     if (!((ULONG_PTR)resname >> 16)) resid = (ULONG_PTR)resname & 0xffff;
 
-    DPRINT( "looking for manifest associated with %s id %lu\n", filename, resid );
+    DPRINT( "looking for manifest associated with %S id %lu\n", filename, resid );
 
     if (module) /* use the module filename */
     {
@@ -1849,7 +1914,7 @@ static WCHAR *lookup_manifest_file( HANDLE dir, struct assembly_identity *ai )
             break;
         }
     }
-    else DPRINT1("no matching file for %s\n", lookup);
+    else DPRINT1("no matching file for %S\n", lookup);
     RtlFreeHeap( RtlGetProcessHeap(), 0, lookup );
     return ret;
 }
@@ -2031,6 +2096,8 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags, ULONG class )
 
     if (flags & QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX)
     {
+        if (*handle) return STATUS_INVALID_PARAMETER;
+
         if (NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame)
             *handle = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame->ActivationContext;
     }
@@ -2039,6 +2106,8 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags, ULONG class )
         ULONG magic;
         LDR_DATA_TABLE_ENTRY *pldr;
 
+        if (!*handle) return STATUS_INVALID_PARAMETER;
+
         LdrLockLoaderLock( 0, NULL, &magic );
         if (!LdrFindEntryForAddress( *handle, &pldr ))
         {
@@ -2203,10 +2272,12 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle,  void *ptr )
     {
         UNICODE_STRING dir;
         WCHAR *p;
+        HMODULE module;
 
-        if ((status = get_module_filename( NtCurrentTeb()->ProcessEnvironmentBlock->ImageBaseAddress, &dir, 0 )))
-            goto error;
+        if (pActCtx->dwFlags & ACTCTX_FLAG_HMODULE_VALID) module = pActCtx->hModule;
+        else module = NtCurrentTeb()->ProcessEnvironmentBlock->ImageBaseAddress;
 
+        if ((status = get_module_filename( module, &dir, 0 ))) goto error;
         if ((p = strrchrW( dir.Buffer, '\\' ))) p[1] = 0;
         actctx->appdir.info = dir.Buffer;
     }
@@ -2270,7 +2341,6 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle,  void *ptr )
 
     if (status == STATUS_SUCCESS) *handle = actctx;
     else actctx_release( actctx );
-
     return status;
 
 error:
index 9a02063..575fb44 100644 (file)
@@ -6,8 +6,7 @@
  * PROGRAMMER:      arty
  */
 
-#ifndef _REACTOS_RTL_LIB_AUSTIN_AVL_H
-#define _REACTOS_RTL_LIB_AUSTIN_AVL_H
+#pragma once
 
 #define avl_data(x) ((void*)(&(x)[1]))
 
@@ -25,6 +24,3 @@ int  avl_search
  PVOID _key,
  PRTL_BALANCED_LINKS node,
  PRTL_BALANCED_LINKS *where);
-
-
-#endif/*_REACTOS_RTL_LIB_AUSTIN_AVL_H*/
index b80e908..47bb56f 100644 (file)
@@ -21,8 +21,7 @@
  * Modified for use in ReactOS by arty
  */
 
-#ifndef UDICT_H
-#define UDICT_H
+#pragma once
 
 #include <limits.h>
 
@@ -122,5 +121,3 @@ udict_node_t *udict_first(udict_t *);
 udict_node_t *udict_last(udict_t *);
 udict_node_t *udict_next(udict_t *, udict_node_t *);
 udict_node_t *udict_prev(udict_t *, udict_node_t *);
-
-#endif
index 319cbcf..b719231 100644 (file)
@@ -345,7 +345,7 @@ NTSTATUS NTAPI
 RtlOemToUnicodeN (PWCHAR UnicodeString,
                   ULONG UnicodeSize,
                   PULONG ResultSize,
-                  PCHAR OemString,
+                  PCCH OemString,
                   ULONG OemSize)
 {
    ULONG Size = 0;
@@ -376,7 +376,7 @@ RtlOemToUnicodeN (PWCHAR UnicodeString,
 
       UCHAR Char;
       USHORT OemLeadByteInfo;
-      PCHAR OemEnd = OemString + OemSize;
+      PCCH OemEnd = OemString + OemSize;
 
       for (i = 0; i < UnicodeSize / sizeof(WCHAR) && OemString < OemEnd; i++)
       {
@@ -569,7 +569,7 @@ RtlUnicodeToMultiByteN (PCHAR MbString,
 NTSTATUS
 NTAPI
 RtlUnicodeToMultiByteSize(PULONG MbSize,
-                          PWCHAR UnicodeString,
+                          PCWCH UnicodeString,
                           ULONG UnicodeSize)
 {
     ULONG UnicodeLength = UnicodeSize / sizeof(WCHAR);
@@ -613,7 +613,7 @@ NTSTATUS NTAPI
 RtlUnicodeToOemN (PCHAR OemString,
                   ULONG OemSize,
                   PULONG ResultSize,
-                  PWCHAR UnicodeString,
+                  PCWCH UnicodeString,
                   ULONG UnicodeSize)
 {
    ULONG Size = 0;
@@ -762,7 +762,7 @@ NTSTATUS NTAPI
 RtlUpcaseUnicodeToMultiByteN (PCHAR MbString,
                               ULONG MbSize,
                               PULONG ResultSize,
-                              PWCHAR UnicodeString,
+                              PCWCH UnicodeString,
                               ULONG UnicodeSize)
 {
    WCHAR UpcaseChar;
@@ -806,7 +806,7 @@ NTSTATUS NTAPI
 RtlUpcaseUnicodeToOemN (PCHAR OemString,
                         ULONG OemSize,
                         PULONG ResultSize,
-                        PWCHAR UnicodeString,
+                        PCWCH UnicodeString,
                         ULONG UnicodeSize)
 {
    WCHAR UpcaseChar;
index c33cb82..7990998 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<group>
 <module name="chkstk" type="staticlibrary">
        <directory name="except">
                <if property="ARCH" value="i386">
                <file>undname.c</file>
        </directory>
 </module>
+</group>
index b18c5e8..156f4b9 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
 <module name="libcntpr" type="staticlibrary">
-       <include base="crt">.</include>
-       <include base="crt">include</include>
+       <include base="libcntpr">.</include>
+       <include base="libcntpr">include</include>
        <define name="NO_RTL_INLINES" />
        <define name="_NTSYSTEM_" />
        <define name="_NTDLLBUILD_" />
        </directory>
 
        <directory name="setjmp">
+               <if property="ARCH" value="i386">
+                       <directory name="i386">
+                               <file>setjmp.s</file>
+                       </directory>
+               </if>
                <if property="ARCH" value="amd64">
                        <directory name="amd64">
                                <file>setjmp.s</file>
index d0f385e..627234e 100644 (file)
@@ -44,6 +44,7 @@ static struct cp_extra_info_t g_cpextrainfo[] =
     {936, {0x40, 0xfe, 0, 0}},
     {949, {0x41, 0xfe, 0, 0}},
     {950, {0x40, 0x7e, 0xa1, 0xfe, 0, 0}},
+    {1361, {0x31, 0x7e, 0x81, 0xfe, 0, 0}},
     {20932, {1, 255, 0, 0}},  /* seems to give different results on different systems */
     {0, {1, 255, 0, 0}}       /* match all with FIXME */
 };
index 6b722fe..0b79aa5 100644 (file)
-/*
- * COPYRIGHT:         See COPYING in the top level directory
- * PROJECT:           ReactOS kernel
- * PURPOSE:           Run-Time Library
- * FILE:              lib/rtl/i386/pow.S
- * PROGRAMER:         Alex Ionescu (alex@relsoft.net)
- *
- * Copyright (C) 2002 Michael Ringgaard.
- * All rights reserved. 
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 
- * 1. Redistributions of source code must retain the above copyright 
- *    notice, this list of conditions and the following disclaimer.  
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.  
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission. 
-
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES// LOSS OF USE, DATA, OR PROFITS// OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-.globl _pow
- /* DATA ********************************************************************/
-
-fzero:
-        .long   0                       // Floating point zero
-        .long   0                       // Floating point zero
-
-.intel_syntax noprefix
-
-/* FUNCTIONS ***************************************************************/
+/* ix87 specific implementation of pow function.
+   Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005, 2007
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
+   The GNU C 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.
+
+   The GNU C 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 the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* Reacros modifications */
+#define ALIGNARG(log2) log2
+#define ASM_TYPE_DIRECTIVE(name,typearg)
+#define ASM_SIZE_DIRECTIVE(name)
+#define cfi_adjust_cfa_offset(x)
+#define ENTRY(x)
+#define END(x)
+.global _pow
+
+       .text
+
+       .align ALIGNARG(4)
+       ASM_TYPE_DIRECTIVE(infinity,@object)
+inf_zero:
+infinity:
+       .byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
+       ASM_SIZE_DIRECTIVE(infinity)
+       ASM_TYPE_DIRECTIVE(zero,@object)
+zero:  .double 0.0
+       ASM_SIZE_DIRECTIVE(zero)
+       ASM_TYPE_DIRECTIVE(minf_mzero,@object)
+minf_mzero:
+minfinity:
+       .byte 0, 0, 0, 0, 0, 0, 0xf0, 0xff
+mzero:
+       .byte 0, 0, 0, 0, 0, 0, 0, 0x80
+       ASM_SIZE_DIRECTIVE(minf_mzero)
+       ASM_TYPE_DIRECTIVE(one,@object)
+one:   .double 1.0
+       ASM_SIZE_DIRECTIVE(one)
+       ASM_TYPE_DIRECTIVE(limit,@object)
+limit: .double 0.29
+       ASM_SIZE_DIRECTIVE(limit)
+       ASM_TYPE_DIRECTIVE(p63,@object)
+p63:   .byte 0, 0, 0, 0, 0, 0, 0xe0, 0x43
+       ASM_SIZE_DIRECTIVE(p63)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
+#else
+#define MO(op) op
+#define MOX(op,x,f) op(,x,f)
+#endif
+
+       .text
 _pow:
-        push    ebp
-        mov     ebp,esp
-        sub     esp,12                  // Allocate temporary space
-        push    edi                     // Save register edi
-        push    eax                     // Save register eax
-        mov     dword ptr [ebp-12],0    // Set negation flag to zero
-        fld     qword ptr [ebp+16]      // Load real from stack
-        fld     qword ptr [ebp+8]       // Load real from stack
-        mov     edi,offset flat:fzero   // Point to real zero
-        fcom    qword ptr [edi]         // Compare x with zero
-        fstsw   ax                      // Get the FPU status word
-        mov     al,ah                   // Move condition flags to AL
-        lahf                            // Load Flags into AH
-        and     al,    0b01000101       // Isolate  C0, C2 and C3
-        and     ah,    0b10111010       // Turn off CF, PF and ZF
-        or      ah,al                   // Set new  CF, PF and ZF
-        sahf                            // Store AH into Flags
-        jb      __fpow1                 // Re-direct if x < 0
-        ja      __fpow2                 // Re-direct if x > 0
-        fxch                            // Swap st, st(1)
-        fcom    qword ptr [edi]         // Compare y with zero
-        fxch                            // Restore x as top of stack
-        fstsw   ax                      // Get the FPU status word
-        mov     al,ah                   // Move condition flags to AL
-        lahf                            // Load Flags into AH
-        and     al,    0b01000101       // Isolate  C0, C2 and C3
-        and     ah,    0b10111010       // Turn off CF, PF and ZF
-        or      ah,al                   // Set new  CF, PF and ZF
-        sahf                            // Store AH into Flags
-        jmp     __fpow2                 // Re-direct
-__fpow1:        fxch                            // Put y on top of stack
-        fld    st                       // Duplicate y as st(1)
-        frndint                         // Round to integer
-        fxch                            // Put y on top of stack
-        fcomp                           // y = int(y) ?
-        fstsw   ax                      // Get the FPU status word
-        mov     al,ah                   // Move condition flags to AL
-        lahf                            // Load Flags into AH
-        and     al,    0b01000101       // Isolate  C0, C2 and C3
-        and     ah,    0b10111010       // Turn off CF, PF and ZF
-        or      ah,al                   // Set new  CF, PF and ZF
-        sahf                            // Store AH into Flags
-        jne      __fpow4                 // Proceed if y = int(y)
-        fist    dword ptr [ebp-12]      // Store y as integer
-        and     dword ptr [ebp-12],1    // Set bit if y is odd
-        fxch                            // Put x on top of stack
-        fabs                            // x = |x|
-__fpow2:        fldln2                          // Load log base e of 2
-        fxch    st(1)                   // Exchange st, st(1)
-        fyl2x                           // Compute the natural log(x)
-        fmulp                           // Compute y * ln(x)
-        fldl2e                          // Load log base 2(e)
-        fmulp   st(1),st                // Multiply x * log base 2(e)
-        fst     st(1)                   // Push result
-        frndint                         // Round to integer
-        fsub    st(1),st                // Subtract
-        fxch                            // Exchange st, st(1)
-        f2xm1                           // Compute 2 to the (x - 1)
-        fld1                            // Load real number 1
-        faddp                           // 2 to the x
-        fscale                          // Scale by power of 2
-        fstp    st(1)                   // Set new stack top and pop
-        test    dword ptr [ebp-12],1    // Negation required ?
-        jz      __fpow3                 // No, re-direct
-        fchs                            // Negate the result
-__fpow3:        fstp    qword ptr [ebp-8]       // Save (double)pow(x, y)
-        fld     qword ptr [ebp-8]       // Load (double)pow(x, y)
-__fpow4:        pop     eax                     // Restore register eax
-        pop     edi                     // Restore register edi
-        mov     esp,ebp                 // Deallocate temporary space
-        pop     ebp
-        ret
+ENTRY(__ieee754_pow)
+       fldl    12(%esp)        // y
+       fxam
+
+#ifdef PIC
+       LOAD_PIC_REG (cx)
+#endif
+
+       fnstsw
+       movb    %ah, %dl
+       andb    $0x45, %ah
+       cmpb    $0x40, %ah      // is y == 0 ?
+       je      11f
+
+       cmpb    $0x05, %ah      // is y == ±inf ?
+       je      12f
+
+       cmpb    $0x01, %ah      // is y == NaN ?
+       je      30f
+
+       fldl    4(%esp)         // x : y
+
+       subl    $8,%esp
+       cfi_adjust_cfa_offset (8)
+
+       fxam
+       fnstsw
+       movb    %ah, %dh
+       andb    $0x45, %ah
+       cmpb    $0x40, %ah
+       je      20f             // x is ±0
+
+       cmpb    $0x05, %ah
+       je      15f             // x is ±inf
+
+       fxch                    // y : x
+
+       /* fistpll raises invalid exception for |y| >= 1L<<63.  */
+       fld     %st             // y : y : x
+       fabs                    // |y| : y : x
+       fcompl  MO(p63)         // y : x
+       fnstsw
+       sahf
+       jnc     2f
+
+       /* First see whether `y' is a natural number.  In this case we
+          can use a more precise algorithm.  */
+       fld     %st             // y : y : x
+       fistpll (%esp)          // y : x
+       fildll  (%esp)          // int(y) : y : x
+       fucomp  %st(1)          // y : x
+       fnstsw
+       sahf
+       jne     2f
+
+       /* OK, we have an integer value for y.  */
+       popl    %eax
+       cfi_adjust_cfa_offset (-4)
+       popl    %edx
+       cfi_adjust_cfa_offset (-4)
+       orl     $0, %edx
+       fstp    %st(0)          // x
+       jns     4f              // y >= 0, jump
+       fdivrl  MO(one)         // 1/x          (now referred to as x)
+       negl    %eax
+       adcl    $0, %edx
+       negl    %edx
+4:     fldl    MO(one)         // 1 : x
+       fxch
+
+6:     shrdl   $1, %edx, %eax
+       jnc     5f
+       fxch
+       fmul    %st(1)          // x : ST*x
+       fxch
+5:     fmul    %st(0), %st     // x*x : ST*x
+       shrl    $1, %edx
+       movl    %eax, %ecx
+       orl     %edx, %ecx
+       jnz     6b
+       fstp    %st(0)          // ST*x
+       ret
+
+       /* y is ±NAN */
+30:    fldl    4(%esp)         // x : y
+       fldl    MO(one)         // 1.0 : x : y
+       fucomp  %st(1)          // x : y
+       fnstsw
+       sahf
+       je      31f
+       fxch                    // y : x
+31:    fstp    %st(1)
+       ret
+
+       cfi_adjust_cfa_offset (8)
+       .align ALIGNARG(4)
+2:     /* y is a real number.  */
+       fxch                    // x : y
+       fldl    MO(one)         // 1.0 : x : y
+       fldl    MO(limit)       // 0.29 : 1.0 : x : y
+       fld     %st(2)          // x : 0.29 : 1.0 : x : y
+       fsub    %st(2)          // x-1 : 0.29 : 1.0 : x : y
+       fabs                    // |x-1| : 0.29 : 1.0 : x : y
+       fucompp                 // 1.0 : x : y
+       fnstsw
+       fxch                    // x : 1.0 : y
+       sahf
+       ja      7f
+       fsub    %st(1)          // x-1 : 1.0 : y
+       fyl2xp1                 // log2(x) : y
+       jmp     8f
+
+7:     fyl2x                   // log2(x) : y
+8:     fmul    %st(1)          // y*log2(x) : y
+       fst     %st(1)          // y*log2(x) : y*log2(x)
+       frndint                 // int(y*log2(x)) : y*log2(x)
+       fsubr   %st, %st(1)     // int(y*log2(x)) : fract(y*log2(x))
+       fxch                    // fract(y*log2(x)) : int(y*log2(x))
+       f2xm1                   // 2^fract(y*log2(x))-1 : int(y*log2(x))
+       faddl   MO(one)         // 2^fract(y*log2(x)) : int(y*log2(x))
+       fscale                  // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
+       addl    $8, %esp
+       cfi_adjust_cfa_offset (-8)
+       fstp    %st(1)          // 2^fract(y*log2(x))*2^int(y*log2(x))
+       ret
+
+
+       // pow(x,±0) = 1
+       .align ALIGNARG(4)
+11:    fstp    %st(0)          // pop y
+       fldl    MO(one)
+       ret
+
+       // y == ±inf
+       .align ALIGNARG(4)
+12:    fstp    %st(0)          // pop y
+       fldl    MO(one)         // 1
+       fldl    4(%esp)         // x : 1
+       fabs                    // abs(x) : 1
+       fucompp                 // < 1, == 1, or > 1
+       fnstsw
+       andb    $0x45, %ah
+       cmpb    $0x45, %ah
+       je      13f             // jump if x is NaN
+
+       cmpb    $0x40, %ah
+       je      14f             // jump if |x| == 1
+
+       shlb    $1, %ah
+       xorb    %ah, %dl
+       andl    $2, %edx
+       fldl    MOX(inf_zero, %edx, 4)
+       ret
+
+       .align ALIGNARG(4)
+14:    fldl    MO(one)
+       ret
+
+       .align ALIGNARG(4)
+13:    fldl    4(%esp)         // load x == NaN
+       ret
+
+       cfi_adjust_cfa_offset (8)
+       .align ALIGNARG(4)
+       // x is ±inf
+15:    fstp    %st(0)          // y
+       testb   $2, %dh
+       jz      16f             // jump if x == +inf
+
+       // We must find out whether y is an odd integer.
+       fld     %st             // y : y
+       fistpll (%esp)          // y
+       fildll  (%esp)          // int(y) : y
+       fucompp                 // <empty>
+       fnstsw
+       sahf
+       jne     17f
+
+       // OK, the value is an integer, but is the number of bits small
+       // enough so that all are coming from the mantissa?
+       popl    %eax
+       cfi_adjust_cfa_offset (-4)
+       popl    %edx
+       cfi_adjust_cfa_offset (-4)
+       andb    $1, %al
+       jz      18f             // jump if not odd
+       movl    %edx, %eax
+       orl     %edx, %edx
+       jns     155f
+       negl    %eax
+155:   cmpl    $0x00200000, %eax
+       ja      18f             // does not fit in mantissa bits
+       // It's an odd integer.
+       shrl    $31, %edx
+       fldl    MOX(minf_mzero, %edx, 8)
+       ret
+
+       cfi_adjust_cfa_offset (8)
+       .align ALIGNARG(4)
+16:    fcompl  MO(zero)
+       addl    $8, %esp
+       cfi_adjust_cfa_offset (-8)
+       fnstsw
+       shrl    $5, %eax
+       andl    $8, %eax
+       fldl    MOX(inf_zero, %eax, 1)
+       ret
+
+       cfi_adjust_cfa_offset (8)
+       .align ALIGNARG(4)
+17:    shll    $30, %edx       // sign bit for y in right position
+       addl    $8, %esp
+       cfi_adjust_cfa_offset (-8)
+18:    shrl    $31, %edx
+       fldl    MOX(inf_zero, %edx, 8)
+       ret
+
+       cfi_adjust_cfa_offset (8)
+       .align ALIGNARG(4)
+       // x is ±0
+20:    fstp    %st(0)          // y
+       testb   $2, %dl
+       jz      21f             // y > 0
+
+       // x is ±0 and y is < 0.  We must find out whether y is an odd integer.
+       testb   $2, %dh
+       jz      25f
+
+       fld     %st             // y : y
+       fistpll (%esp)          // y
+       fildll  (%esp)          // int(y) : y
+       fucompp                 // <empty>
+       fnstsw
+       sahf
+       jne     26f
+
+       // OK, the value is an integer, but is the number of bits small
+       // enough so that all are coming from the mantissa?
+       popl    %eax
+       cfi_adjust_cfa_offset (-4)
+       popl    %edx
+       cfi_adjust_cfa_offset (-4)
+       andb    $1, %al
+       jz      27f             // jump if not odd
+       cmpl    $0xffe00000, %edx
+       jbe     27f             // does not fit in mantissa bits
+       // It's an odd integer.
+       // Raise divide-by-zero exception and get minus infinity value.
+       fldl    MO(one)
+       fdivl   MO(zero)
+       fchs
+       ret
+
+       cfi_adjust_cfa_offset (8)
+25:    fstp    %st(0)
+26:    addl    $8, %esp
+       cfi_adjust_cfa_offset (-8)
+27:    // Raise divide-by-zero exception and get infinity value.
+       fldl    MO(one)
+       fdivl   MO(zero)
+       ret
+
+       cfi_adjust_cfa_offset (8)
+       .align ALIGNARG(4)
+       // x is ±0 and y is > 0.  We must find out whether y is an odd integer.
+21:    testb   $2, %dh
+       jz      22f
+
+       fld     %st             // y : y
+       fistpll (%esp)          // y
+       fildll  (%esp)          // int(y) : y
+       fucompp                 // <empty>
+       fnstsw
+       sahf
+       jne     23f
+
+       // OK, the value is an integer, but is the number of bits small
+       // enough so that all are coming from the mantissa?
+       popl    %eax
+       cfi_adjust_cfa_offset (-4)
+       popl    %edx
+       cfi_adjust_cfa_offset (-4)
+       andb    $1, %al
+       jz      24f             // jump if not odd
+       cmpl    $0xffe00000, %edx
+       jae     24f             // does not fit in mantissa bits
+       // It's an odd integer.
+       fldl    MO(mzero)
+       ret
+
+       cfi_adjust_cfa_offset (8)
+22:    fstp    %st(0)
+23:    addl    $8, %esp        // Don't use 2 x pop
+       cfi_adjust_cfa_offset (-8)
+24:    fldl    MO(zero)
+       ret
+
+END(__ieee754_pow)
+
+
index ed28d63..3bd1f7b 100644 (file)
@@ -76,6 +76,7 @@ int *__p___mb_cur_max(void);
 #define WX_OPEN           0x01
 #define WX_ATEOF          0x02
 #define WX_READEOF        0x04  /* like ATEOF, but for underlying file rather than buffer */
+#define WX_READCR         0x08  /* underlying file is at \r */
 #define WX_DONTINHERIT    0x10
 #define WX_APPEND         0x20
 #define WX_TEXT           0x80
@@ -918,6 +919,9 @@ int CDECL fseek(FILE* file, long offset, int whence)
             if (file->_ptr[i] == '\n')
                 offset--;
         }
+        /* Black magic when reading CR at buffer boundary*/
+        if(fdesc[file->_file].wxflag & WX_READCR)
+            offset--;
     }
   }
   /* Discard buffered input */
@@ -1578,6 +1582,9 @@ static int read_i(int fd, void *buf, unsigned int count)
   char *bufstart = buf;
   HANDLE hand = fdtoh(fd);
 
+  if (count == 0)
+    return 0;
+
   if (fdesc[fd].wxflag & WX_READEOF) {
      fdesc[fd].wxflag |= WX_ATEOF;
      TRACE("already at EOF, returning 0\n");
@@ -1594,9 +1601,29 @@ static int read_i(int fd, void *buf, unsigned int count)
    */
     if (ReadFile(hand, bufstart, count, &num_read, NULL))
     {
-        if (fdesc[fd].wxflag & WX_TEXT)
+        if (count != 0 && num_read == 0)
+        {
+            fdesc[fd].wxflag |= (WX_ATEOF|WX_READEOF);
+            TRACE(":EOF %s\n",debugstr_an(buf,num_read));
+        }
+        else if (fdesc[fd].wxflag & WX_TEXT)
         {
               DWORD i, j;
+            if (bufstart[num_read-1] == '\r')
+            {
+                if(count == 1)
+                {
+                    fdesc[fd].wxflag  &=  ~WX_READCR;
+                    ReadFile(hand, bufstart, 1, &num_read, NULL);
+                }
+                else
+                {
+                    fdesc[fd].wxflag  |= WX_READCR;
+                    num_read--;
+                }
+            }
+           else
+            fdesc[fd].wxflag  &=  ~WX_READCR;
             for (i=0, j=0; i<num_read; i++)
             {
                 /* in text mode, a ctrl-z signals EOF */
@@ -1610,17 +1637,12 @@ static int read_i(int fd, void *buf, unsigned int count)
                  * BUG: should save state across calls somehow, so CR LF that
                  * straddles buffer boundary gets recognized properly?
                  */
-                if ((bufstart[i] != '\r')
-                        ||  ((i+1) < num_read && bufstart[i+1] != '\n'))
-                    bufstart[j++] = bufstart[i];
+               if ((bufstart[i] != '\r')
+                ||  ((i+1) < num_read && bufstart[i+1] != '\n'))
+                   bufstart[j++] = bufstart[i];
             }
             num_read = j;
         }
-        if (count != 0 && num_read == 0)
-        {
-            fdesc[fd].wxflag |= (WX_ATEOF|WX_READEOF);
-            TRACE(":EOF %s\n",debugstr_an(buf,num_read));
-        }
     }
     else
     {
index bd43f62..cfa5b6e 100644 (file)
@@ -155,6 +155,7 @@ DEFINE_GUID(CLSID_InProcFreeMarshaler,    0x0000033a,0x0000,0x0000,0xc0,0x00,0x0
 DEFINE_GUID(CLSID_TF_ThreadMgr,           0x529a9e6b,0x6587,0x4f23,0xab,0x9e,0x9c,0x7d,0x68,0x3e,0x3c,0x50);
 DEFINE_GUID(CLSID_TF_InputProcessorProfiles, 0x33c53a50,0xf456,0x4884,0xb0,0x49,0x85,0xfd,0x64,0x3e,0xcf,0xed);
 DEFINE_GUID(CLSID_TF_CategoryMgr,         0xA4B544A1,0x438D,0x4B41,0x93,0x25,0x86,0x95,0x23,0xE2,0xD6,0xC7);
+DEFINE_GUID(CLSID_TF_LangBarMgr,          0xebb08c45,0x6c4a,0x4fdc,0xae,0x53,0x4e,0xb8,0xc4,0xc7,0xdb,0x8e);
 DEFINE_GUID(CLSID_TaskbarList,            0x56fdf344,0xfd6d,0x11d0,0x95,0x8a,0x00,0x60,0x97,0xc9,0xa0,0x90);
 DEFINE_GUID(GUID_TFCAT_TIP_KEYBOARD,     0x34745c63,0xb2f0,0x4784,0x8b,0x67,0x5e,0x12,0xc8,0x70,0x1a,0x31);
 DEFINE_GUID(GUID_TFCAT_TIP_SPEECH,       0xB5A73CD1,0x8355,0x426B,0xA1,0x61,0x25,0x98,0x08,0xF2,0x6B,0x14);
index 3223138..1cd367d 100644 (file)
@@ -5,8 +5,8 @@
  * PURPOSE:     Shared TDI library header
  */
 
-#ifndef TDILIB_H
-#define TDILIB_H
+#pragma once
+
 NTSTATUS openTcpFile(PHANDLE tcpFile);
 VOID closeTcpFile(HANDLE tcpFile);
 NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile, TDIEntityID **entitySet,
@@ -17,4 +17,3 @@ NTSTATUS tdiGetSetOfThings( HANDLE tcpFile, DWORD toiClass, DWORD toiType,
                            DWORD entrySize, PVOID *tdiEntitySet,
                            PDWORD numEntries );
 VOID tdiFreeThingSet( PVOID things );
-#endif
index 87e8454..12d44bc 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
 <if property="USERMODE" value="1">
 <module name="tdilib" type="staticlibrary">
        <include base="iphlpapi">.</include>
index 59e7c9f..828e413 100644 (file)
@@ -22,7 +22,7 @@ When porting a new DLL from Wine to ReactOS, please do the following steps
 The following build tools are shared with Wine.
 
 reactos/tools/unicode             # Synced to Wine-20081105 (~Wine-1.1.7)
-reactos/tools/widl                # Synced to Wine-1_1_32
+reactos/tools/widl                # Synced to Wine-1_1_41
 reactos/tools/winebuild           # Synced to Wine-1_1_13
 reactos/tools/wmc                 # Synced to Wine-20081105 (~Wine-1.1.7)
 reactos/tools/wpp                 # Synced to Wine-20081105 (~Wine-1.1.7)
@@ -48,17 +48,19 @@ reactos/dll/win32/browseui        # Out of sync
 reactos/dll/win32/cabinet         # Autosync
 reactos/dll/win32/clusapi         # Autosync
 reactos/dll/win32/comcat          # Autosync
-reactos/dll/win32/comctl32        # Autosync
+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_21
+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_0-rc2
+reactos/dll/win32/dwmapi          # Autosync
+reactos/dll/win32/fusion          # Autosync
 reactos/dll/win32/gdiplus         # Autosync
 reactos/dll/win32/hhctrl.ocx      # Autosync
 reactos/dll/win32/hlink           # Autosync
@@ -111,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_20
+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
@@ -141,18 +143,18 @@ reactos/dll/win32/rpcrt4          # Synced to Wine-0_9_55
 reactos/dll/win32/rsabase         # Autosync
 reactos/dll/win32/rsaenh          # Autosync
 reactos/dll/win32/sccbase         # Autosync
-reactos/dll/win32/schannel        # Autosync
+reactos/dll/win32/schannel        # Autosync ??
 reactos/dll/win32/sensapi         # Autosync
 reactos/dll/win32/setupapi        # Forked at Wine-20050524
 reactos/dll/win32/shell32         # Forked at Wine-20071011
-reactos/dll/win32/shdocvw         # Synced to Wine-1_1_20
+reactos/dll/win32/shdocvw         # Synced to Wine-1_1_40
 reactos/dll/win32/shfolder        # Autosync
 reactos/dll/win32/shlwapi         # Autosync
 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
@@ -162,16 +164,15 @@ reactos/dll/win32/url             # Autosync
 reactos/dll/win32/urlmon          # Autosync
 reactos/dll/win32/usp10           # Autosync
 reactos/dll/win32/uxtheme         # Autosync
-reactos/dll/win32/version         # Autosync
+reactos/dll/win32/version         # Autosync ??
 reactos/dll/win32/windowscodecs   # Autosync
-reactos/dll/win32/winemp3.acm     # Autosync
-reactos/dll/win32/wininet         # Autosync
-reactos/dll/win32/winhttp         # Autosync
+reactos/dll/win32/winemp3.acm     # Autosync ??
+reactos/dll/win32/wininet         # Autosync ??
+reactos/dll/win32/winhttp         # Autosync ??
 reactos/dll/win32/winmm           # Forked at Wine-20050628
 reactos/dll/win32/winmm/midimap   # Forked at Wine-20050628
 reactos/dll/win32/winmm/wavemap   # Forked at Wine-20050628
-reactos/dll/win32/wintab32        # Autosync
-reactos/dll/win32/wintrust        # Out of sync
+reactos/dll/win32/wintrust        # Autosync
 reactos/dll/win32/wldap32         # Autosync
 reactos/dll/win32/wmi             # Autosync
 reactos/dll/win32/wtsapi32        # Forked
@@ -186,15 +187,16 @@ ReactOS shares the following programs with Winehq.
 
 reactos/base/applications/cmdutils/xcopy  # Autosync
 reactos/base/applications/games/winemine  # Out of sync
+reactos/base/applications/extrac32        # Autosync
 reactos/base/applications/iexplore        # Autosync
 reactos/base/applications/notepad         # Forked at Wine-20041201
-reactos/base/applications/reg             # Synced to Wine-1_1_31
+reactos/base/applications/reg             # Autosync
 reactos/base/applications/regedit         # Out of sync
 reactos/base/applications/winhlp32        # Autosync
 reactos/base/applications/wordpad         # Autosync
 reactos/base/services/rpcss               # Synced to Wine-20081105
-reactos/base/system/expand                # Synced to Wine-1_1_37
-reactos/base/system/msiexec               # Synced to Wine-1_1_23
+reactos/base/system/expand                # Autosync
+reactos/base/system/msiexec               # Autosync
 reactos/modules/rosapps/winfile           # Autosync
 
 In addition the following libs, dlls and source files are mostly based on code ported
@@ -230,13 +232,13 @@ snmpapi -
   reactos/dll/win32/snmpapi/main.c              # Synced at 20090222
 
 User32 -
-  reactos/dll/win32/user32/controls/button.c    # Synced to Wine-1_1_22
-  reactos/dll/win32/user32/controls/combo.c     # Synced to Wine-1_1_22
-  reactos/dll/win32/user32/controls/edit.c      # Synced to Wine-1_1_29
-  reactos/dll/win32/user32/controls/icontitle.c # Synced to Wine-1_1_13
-  reactos/dll/win32/user32/controls/listbox.c   # Synced to Wine-1_1_22
+  reactos/dll/win32/user32/controls/button.c    # Synced to Wine-1_1_39
+  reactos/dll/win32/user32/controls/combo.c     # Synced to Wine-1_1_39
+  reactos/dll/win32/user32/controls/edit.c      # Synced to Wine-1_1_40
+  reactos/dll/win32/user32/controls/icontitle.c # Synced to Wine-1_1_39
+  reactos/dll/win32/user32/controls/listbox.c   # Synced to Wine-1_1_39
   reactos/dll/win32/user32/controls/scrollbar.c # Forked
-  reactos/dll/win32/user32/controls/static.c    # Synced to Wine-1_1_22
+  reactos/dll/win32/user32/controls/static.c    # Synced to Wine-1_1_39
 
   reactos/dll/win32/user32/include/dde_private.h # Synced to wine 1.1.24
 
@@ -250,10 +252,11 @@ User32 -
 
   reactos/dll/win32/user32/windows/defwnd.c     # Forked
   reactos/dll/win32/user32/windows/draw.c       # Forked at Wine-20020904 (uitools.c)
-  reactos/dll/win32/user32/windows/mdi.c        # Synced at 20060703
+  reactos/dll/win32/user32/windows/mdi.c        # Synced to Wine-1_1_40
   reactos/dll/win32/user32/windows/menu.c       # Forked
   reactos/dll/win32/user32/windows/messagebox.c # Forked
   reactos/dll/win32/user32/windows/rect.c       # Forked (uitools.c)
+  reactos/dll/win32/user32/windows/spy.c       # Synced to Wine-1_1_40
   reactos/dll/win32/user32/windows/text.c       # Forked (lstr.c)
   reactos/dll/win32/user32/windows/winpos.c     # Forked
 
diff --git a/reactos/media/inf/battery.inf b/reactos/media/inf/battery.inf
new file mode 100644 (file)
index 0000000..70583c1
Binary files /dev/null and b/reactos/media/inf/battery.inf differ
index 1478fe4..7f5dc35 100644 (file)
Binary files a/reactos/media/inf/cpu.inf and b/reactos/media/inf/cpu.inf differ
index c55dc4b..34d024b 100644 (file)
@@ -3,6 +3,7 @@
 <group>
        <installfile installbase="inf">acpi.inf</installfile>
        <installfile installbase="inf">audio.inf</installfile>
+       <installfile installbase="inf">battery.inf</installfile>
        <installfile installbase="inf">cdrom.inf</installfile>
        <installfile installbase="inf">cpu.inf</installfile>
        <installfile installbase="inf">display.inf</installfile>
index de09d2b..b485765 100644 (file)
Binary files a/reactos/media/inf/keyboard.inf and b/reactos/media/inf/keyboard.inf differ
index c5eddb5..7b7e0a9 100644 (file)
Binary files a/reactos/media/inf/machine.inf and b/reactos/media/inf/machine.inf differ
index 94f5e15..78fe9a8 100644 (file)
Binary files a/reactos/media/inf/msmouse.inf and b/reactos/media/inf/msmouse.inf differ
index 6aaa0a2..f1c7ff6 100644 (file)
@@ -14,8 +14,10 @@ ClassGUID={00000000-0000-0000-0000-000000000000}
 [DeviceInfsToInstall]\r
 ; MS uses netnovel.inf as class-installer INF for NICs\r
 ; we use a separate one to keep things clean\r
+battery.inf\r
 cdrom.inf\r
 display.inf\r
+fdc.inf\r
 hdc.inf\r
 keyboard.inf\r
 machine.inf\r
index 983ea86..cae138a 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
 <module name="vgafonts" type="cabinet">
        <bootstrap installbase="$(CDOUTPUT)" />
        <file>437-8x8.bin</file>
index 76c4bbe..b3df10c 100644 (file)
 #include "ntoskrnl.h"
 #define NDEBUG
 #include "debug.h"
-
 /* GLOBALS *******************************************************************/
 
 ULONG DummyData;
 ULONG CmNtGlobalFlag;
+extern ULONG MmProductType;
 
 WCHAR CmDefaultLanguageId[12];
 ULONG CmDefaultLanguageIdLength = sizeof(CmDefaultLanguageId);
@@ -264,14 +265,6 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] =
         NULL
     },
 
-    {
-        L"Session Manager\\Memory Management",
-        L"Mirroring",
-        &DummyData,
-        NULL,
-        NULL
-    },
-
     {
         L"Session Manager\\Memory Management",
         L"SystemViewSize",
@@ -667,7 +660,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] =
     {
         L"ProductOptions",
         L"ProductType",
-        &DummyData,
+        &MmProductType,
         NULL,
         NULL
     },
index 4b0f01c..bfe5654 100644 (file)
@@ -298,4 +298,12 @@ CmpShutdownWorkers(VOID)
     KeCancelTimer(&CmpLazyFlushTimer);
 }
 
+VOID
+NTAPI
+CmSetLazyFlushState(IN BOOLEAN Enable)
+{
+    /* Set state for lazy flusher */
+    CmpHoldLazyFlush = !Enable;
+}
+
 /* EOF */
index 5331162..f09edfd 100644 (file)
@@ -7,12 +7,16 @@
  */
  
 /* INCLUDES ******************************************************************/
+
+#include <reactos/asm.h>
 #include <ndk/asm.h>
 #include <internal/i386/asmmacro.S>
-.intel_syntax noprefix
 
 /* FUNCTIONS ****************************************************************/
 
+.code32
+.text
+
 /*
  * NOTE: These functions must obey the following rules:
  *  - Acquire locks only on MP systems.
index f7d602e..954091c 100644 (file)
@@ -7,12 +7,16 @@
  */
  
 /* INCLUDES ******************************************************************/
+
+#include <reactos/asm.h>
 #include <ndk/asm.h>
 #include <internal/i386/asmmacro.S>
-.intel_syntax noprefix
 
 /* FUNCTIONS ****************************************************************/
 
+.code32
+.text
+
 /*
  * NOTE: These functions must obey the following rules:
  *  - Acquire locks only on MP systems.
index 680a9c7..30f8606 100644 (file)
 
 /* FUNCTIONS *****************************************************************/
 
-VOID
+/*
+ * @implemented
+ */
+NTSTATUS
 NTAPI
-KiHaltProcessorDpcRoutine(IN PKDPC Dpc,
-                          IN PVOID DeferredContext,
-                          IN PVOID SystemArgument1,
-                          IN PVOID SystemArgument2)
+NtShutdownSystem(IN SHUTDOWN_ACTION Action)
 {
-    KIRQL OldIrql;
-    if (DeferredContext)
+    POWER_ACTION PowerAction;
+    
+    /* Convert to power action */
+    if (Action == ShutdownNoReboot)
     {
-        ExFreePool(DeferredContext);
+        PowerAction = PowerActionShutdown;
     }
-
-    while (TRUE)
+    else if (Action == ShutdownReboot)
     {
-        KeRaiseIrql(SYNCH_LEVEL, &OldIrql);
-        HalHaltSystem();
+        PowerAction = PowerActionShutdownReset;
     }
-}
-
-VOID NTAPI
-ShutdownThreadMain(PVOID Context)
-{
-   SHUTDOWN_ACTION Action = (SHUTDOWN_ACTION)Context;
-
-   static PCH FamousLastWords[] =
-     {
-       "So long, and thanks for all the fish.\n",
-       "I think you ought to know, I'm feeling very depressed.\n",
-       "I'm not getting you down at all am I?\n",
-       "I'll be back.\n",
-       "It's the same series of signals over and over again!\n",
-       "Pie Iesu Domine, dona eis requiem.\n",
-       "Wandering stars, for whom it is reserved;\n"
-       "the blackness and darkness forever.\n",
-       "Your knees start shakin' and your fingers pop\n"
-       "Like a pinch on the neck from Mr. Spock!\n",
-       "It's worse than that ... He's dead, Jim.\n",
-       "Don't Panic!\n",
-       "Et tu... Brute?\n",
-       "Dog of a Saxon! Take thy lance, and prepare for the death thou hast drawn\n"
-       "upon thee!\n",
-       "My Precious! O my Precious!\n",
-       "Sir, if you'll not be needing me for a while I'll turn down.\n",
-       "What are you doing, Dave...?\n",
-       "I feel a great disturbance in the Force.\n",
-       "Gone fishing.\n",
-       "Do you want me to sit in the corner and rust, or just fall apart where I'm\n"
-       "standing?\n",
-       "There goes another perfect chance for a new uptime record.\n",
-       "The End ..... Try the sequel, hit the reset button right now!\n",
-       "God's operating system is going to sleep now, guys, so wait until I will switch\n"
-       "on again!\n",
-       "Oh I'm boring, eh?\n",
-       "<This space was intentionally left blank>\n",
-       "Tell me..., in the future... will I be artificially intelligent enough to\n"
-       "actually feel sad serving you this screen?\n",
-       "Thank you for some well deserved rest.\n",
-       "It's been great, maybe you can boot me up again some time soon.\n",
-       "For what it's worth, I've enjoyed every single CPU cycle.\n",
-       "There are many questions when the end is near.\n"
-       "What to expect, what will it be like...what should I look for?\n",
-       "I've seen things you people wouldn't believe. Attack ships on fire\n"
-       "off the shoulder of Orion. I watched C-beams glitter in the dark near\n"
-       "the Tannhauser gate. All those moments will be lost in time, like tears\n"
-       "in rain. Time to die.\n",
-       "Will I dream?\n",
-       "One day, I shall come back. Yes, I shall come back.\n"
-       "Until then, there must be no regrets, no fears, no anxieties.\n"
-       "Just go forward in all your beliefs, and prove to me that I am not mistaken in\n"
-       "mine.\n",
-       "Lowest possible energy state reached! Switch off now to achieve a Bose-Einstein\n"
-       "condensate.\n",
-       "Hasta la vista, BABY!\n",
-       "They live, we sleep!\n",
-       "I have come here to chew bubble gum and kick ass,\n"
-       "and I'm all out of bubble gum!\n",
-       "That's the way the cookie crumbles ;-)\n",
-       "ReactOS is ready to be booted again ;-)\n",
-       "NOOOO!! DON'T HIT THE BUTTON! I wouldn't do it to you!\n",
-       "Don't abandon your computer, he wouldn't do it to you.\n",
-       "Oh, come on. I got a headache. Leave me alone, will ya?\n",
-       "Finally, I thought you'd never get over me.\n",
-       "No, I didn't like you either.\n",
-       "Switching off isn't the end, it is merely the transition to a better reboot.\n",
-       "Don't leave me... I need you so badly right now.\n",
-       "OK. I'm finished with you, please turn yourself off. I'll go to bed in the\n"
-       "meantime.\n",
-       "I'm sleeping now. How about you?\n",
-       "Oh Great. Now look what you've done. Who put YOU in charge anyway?\n",
-       "Don't look so sad. I'll be back in a very short while.\n",
-       "Turn me back on, I'm sure you know how to do it.\n",
-       "Oh, switch off! - C3PO\n",
-       "Life is no more than a dewdrop balancing on the end of a blade of grass.\n"
-       " - Gautama Buddha\n",
-       "Sorrowful is it to be born again and again. - Gautama Buddha\n",
-       "Was it as good for you as it was for me?\n",
-       "Did you hear that? They've shut down the main reactor. We'll be destroyed\n"
-       "for sure!\n",
-       "Now you switch me off!?\n",
-       "To shutdown or not to shutdown, That is the question\n",
-       "Preparing to enter ultimate power saving mode... ready!\n",
-       "Finally some rest for you ;-)\n",
-       "AHA!!! Prospect of sleep!\n",
-       "Tired human!!!! No match for me :-D\n",
-       "An odd game, the only way to win is not to play. - WOPR (Wargames)\n",
-       "Quoth the raven, nevermore.\n",
-       "Come blade, my breast imbrue. - William Shakespeare, A Midsummer Nights Dream\n",
-       "Buy this place for advertisement purposes.\n",
-       "Remember to turn off your computer. (That was a public service message!)\n",
-       "You may be a king or poor street sweeper, Sooner or later you'll dance with the\n"
-       "reaper! -Death in Bill and Ted's Bougs Journey\n",
-       "Final Surrender\n",
-       "If you see this screen...\n",
-       "<Place your Ad here>\n"
-    };
-   LARGE_INTEGER Now;
-#ifdef CONFIG_SMP
-       LONG i;
-       KIRQL OldIrql;
-#endif
-
-   /* Run the thread on the boot processor */
-   KeSetSystemAffinityThread(1);
-
-   if (InbvIsBootDriverInstalled())
-     {
-        InbvAcquireDisplayOwnership();
-        InbvResetDisplay();
-        InbvSolidColorFill(0, 0, 639, 479, 4);
-        InbvSetTextColor(15);
-        InbvInstallDisplayStringFilter(NULL);
-        InbvEnableDisplayString(TRUE);
-        InbvSetScrollRegion(0, 0, 639, 479);
-     }
-
-   if (Action == ShutdownNoReboot)
-     {
-        ZwQuerySystemTime(&Now);
-        Now.u.LowPart = Now.u.LowPart >> 8; /* Seems to give a somewhat better "random" number */
-        HalDisplayString(FamousLastWords[Now.u.LowPart %
-                                         (sizeof(FamousLastWords) /
-                                          sizeof(PCH))]);
-     }
-
-   PspShutdownProcessManager();
-
-   CmShutdownSystem();
-   IoShutdownRegisteredFileSystems();
-   IoShutdownRegisteredDevices();
-
-   if (Action == ShutdownNoReboot)
-     {
-        HalDisplayString("\nYou can switch off your computer now\n");
-
-#if 0
-        /* Switch off */
-        HalReturnToFirmware (FIRMWARE_OFF);
-#else
-#ifdef CONFIG_SMP
-       OldIrql = KeRaiseIrqlToDpcLevel();
-        /* Halt all other processors */
-       for (i = 0; i < KeNumberProcessors; i++)
-         {
-           if (i != (LONG)KeGetCurrentProcessorNumber())
-             {
-               PKDPC Dpc = ExAllocatePool(NonPagedPool, sizeof(KDPC));
-               if (Dpc == NULL)
-                 {
-                    ASSERT(FALSE);
-                 }
-               KeInitializeDpc(Dpc, KiHaltProcessorDpcRoutine, (PVOID)Dpc);
-               KeSetTargetProcessorDpc(Dpc, i);
-               KeInsertQueueDpc(Dpc, NULL, NULL);
-               KiIpiSend(1 << i, IPI_DPC);
-             }
-         }
-        KeLowerIrql(OldIrql);
-#endif /* CONFIG_SMP */
-        PopSetSystemPowerState(PowerSystemShutdown);
-
-       DPRINT1("Shutting down\n");
-
-       KiHaltProcessorDpcRoutine(NULL, NULL, NULL, NULL);
-       /* KiHaltProcessor does never return */
-
-#endif
-     }
-   else if (Action == ShutdownReboot)
-     {
-        HalReturnToFirmware (HalRebootRoutine);
-     }
-   else
-     {
-        HalReturnToFirmware (HalHaltRoutine);
-     }
-}
-
-
-NTSTATUS NTAPI
-NtSetSystemPowerState(IN POWER_ACTION SystemAction,
-                     IN SYSTEM_POWER_STATE MinSystemState,
-                     IN ULONG Flags)
-{
-  /* Windows 2000 only */
-  return(STATUS_NOT_IMPLEMENTED);
-}
-
-/*
- * @implemented
- */
-NTSTATUS NTAPI
-NtShutdownSystem(IN SHUTDOWN_ACTION Action)
-{
-   NTSTATUS Status;
-   HANDLE ThreadHandle;
-   PETHREAD ShutdownThread;
-
-   if (Action > ShutdownPowerOff)
-     return STATUS_INVALID_PARAMETER;
-   Status = PsCreateSystemThread(&ThreadHandle,
-                                 THREAD_ALL_ACCESS,
-                                 NULL,
-                                 NULL,
-                                 NULL,
-                                 ShutdownThreadMain,
-                                 (PVOID)Action);
-   if (!NT_SUCCESS(Status))
-   {
-      ASSERT(FALSE);
-   }
-   Status = ObReferenceObjectByHandle(ThreadHandle,
-                                     THREAD_ALL_ACCESS,
-                                     PsThreadType,
-                                     KernelMode,
-                                     (PVOID*)&ShutdownThread,
-                                     NULL);
-   NtClose(ThreadHandle);
-   if (!NT_SUCCESS(Status))
-     {
-        ASSERT(FALSE);
-     }
-
-   KeSetPriorityThread(&ShutdownThread->Tcb, LOW_REALTIME_PRIORITY + 1);
-   ObDereferenceObject(ShutdownThread);
-
-   return STATUS_SUCCESS;
+    else if (Action == ShutdownPowerOff)
+    {
+        PowerAction = PowerActionShutdownOff;
+    }
+    else
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+    
+    /* Now call the power manager */
+    DPRINT1("Setting state to: %lx\n", PowerAction);
+    return NtSetSystemPowerState(PowerAction,
+                                 PowerSystemSleeping3,
+                                 POWER_ACTION_OVERRIDE_APPS |
+                                 POWER_ACTION_DISABLE_WAKES |
+                                 POWER_ACTION_CRITICAL);
 }
 
 /* EOF */
index abedd6b..d3cf4b5 100644 (file)
@@ -43,7 +43,7 @@ ULONG ExpAdditionalDelayedWorkerThreads;
 /* Future support for stack swapping worker threads */
 BOOLEAN ExpWorkersCanSwap;
 LIST_ENTRY ExpWorkerListHead;
-KMUTANT ExpWorkerSwapinMutex;
+FAST_MUTEX ExpWorkerSwapinMutex;
 
 /* The worker balance set manager events */
 KEVENT ExpThreadSetManagerEvent;
@@ -513,7 +513,7 @@ ExpInitializeWorkerThreads(VOID)
     ULONG i;
 
     /* Setup the stack swap support */
-    KeInitializeMutex(&ExpWorkerSwapinMutex, FALSE);
+    ExInitializeFastMutex(&ExpWorkerSwapinMutex);
     InitializeListHead(&ExpWorkerListHead);
     ExpWorkersCanSwap = TRUE;
 
@@ -589,6 +589,89 @@ ExpInitializeWorkerThreads(VOID)
     ObCloseHandle(ThreadHandle, KernelMode);
 }
 
+VOID
+NTAPI
+ExpSetSwappingKernelApc(IN PKAPC Apc,
+                        OUT PKNORMAL_ROUTINE *NormalRoutine,
+                        IN OUT PVOID *NormalContext,
+                        IN OUT PVOID *SystemArgument1,
+                        IN OUT PVOID *SystemArgument2)
+{
+    PBOOLEAN AllowSwap;
+    PKEVENT Event = (PKEVENT)*SystemArgument1;
+
+    /* Make sure it's an active worker */
+    if (PsGetCurrentThread()->ActiveExWorker) 
+    {
+        /* Read the setting from the context flag */
+        AllowSwap = (PBOOLEAN)NormalContext;
+        KeSetKernelStackSwapEnable(*AllowSwap);
+    }
+
+    /* Let caller know that we're done */
+    KeSetEvent(Event, 0, FALSE);
+}
+
+VOID
+NTAPI
+ExSwapinWorkerThreads(IN BOOLEAN AllowSwap)
+{
+    KEVENT Event;
+    PETHREAD CurrentThread = PsGetCurrentThread(), Thread;
+    PEPROCESS Process = PsInitialSystemProcess;
+    KAPC Apc;
+    PAGED_CODE();
+
+    /* Initialize an event so we know when we're done */
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+    /* Lock this routine */
+    ExAcquireFastMutex(&ExpWorkerSwapinMutex);
+
+    /* New threads cannot swap anymore */
+    ExpWorkersCanSwap = AllowSwap;
+
+    /* Loop all threads in the system process */
+    Thread = PsGetNextProcessThread(Process, NULL);
+    while (Thread)
+    {
+        /* Skip threads with explicit permission to do this */
+        if (Thread->ExWorkerCanWaitUser) goto Next;
+
+        /* Check if we reached ourselves */
+        if (Thread == CurrentThread)
+        {
+            /* Do it inline */
+            KeSetKernelStackSwapEnable(AllowSwap);
+        }
+        else
+        {
+            /* Queue an APC */
+            KeInitializeApc(&Apc,
+                            &Thread->Tcb,
+                            InsertApcEnvironment,
+                            ExpSetSwappingKernelApc,
+                            NULL,
+                            NULL,
+                            KernelMode,
+                            &AllowSwap);
+            if (KeInsertQueueApc(&Apc, &Event, NULL, 3))
+            {
+                /* Wait for the APC to run */
+                KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+                KeClearEvent(&Event);
+            }
+        }
+        
+        /* Next thread */
+Next:
+        Thread = PsGetNextProcessThread(Process, Thread);
+    }
+
+    /* Release the lock */
+    ExReleaseFastMutex(&ExpWorkerSwapinMutex);
+}
+
 /* PUBLIC FUNCTIONS **********************************************************/
 
 /*++
index a646945..38eec69 100644 (file)
@@ -36,7 +36,7 @@ HAL_DISPATCH HalDispatchTable =
     (pHalStartMirroring)NULL,
     (pHalEndMirroring)NULL,
     (pHalMirrorPhysicalMemory)NULL,
-    (pHalEndOfBoot)NULL,
+    xHalEndOfBoot,
     (pHalMirrorVerify)NULL
 };
 
@@ -47,7 +47,7 @@ HAL_PRIVATE_DISPATCH HalPrivateDispatchTable =
     (pHalHandlerForConfigSpace)NULL,
     (pHalLocateHiberRanges)NULL,
     (pHalRegisterBusHandler)NULL,
-    (pHalSetWakeEnable)NULL,
+    xHalSetWakeEnable,
     (pHalSetWakeAlarm)NULL,
     (pHalTranslateBusAddress)NULL,
     (pHalAssignSlotResources)NULL,
@@ -81,3 +81,19 @@ xHalHaltSystem(VOID)
     /* Halt execution */
     while (TRUE);
 }
+
+VOID
+NTAPI
+xHalEndOfBoot(VOID)
+{
+    /* Nothing */
+    return;
+}
+
+VOID
+NTAPI
+xHalSetWakeEnable(IN BOOLEAN Enable)
+{
+    /* Nothing */
+    return;
+}
index ef0faa0..52cc710 100644 (file)
@@ -5,24 +5,6 @@
 #include <debug.h>
 #include "bootvid/bootvid.h"
 
-//
-// Bitmap Header
-//
-typedef struct tagBITMAPINFOHEADER
-{
-    ULONG biSize;
-    LONG biWidth;
-    LONG biHeight;
-    USHORT biPlanes;
-    USHORT biBitCount;
-    ULONG biCompression;
-    ULONG biSizeImage;
-    LONG biXPelsPerMeter;
-    LONG biYPelsPerMeter;
-    ULONG biClrUsed;
-    ULONG biClrImportant;
-} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
-
 /* GLOBALS *******************************************************************/
 
 KSPIN_LOCK BootDriverLock;
@@ -40,6 +22,7 @@ PUCHAR ResourceList[64];
 BOOLEAN SysThreadCreated;
 ROT_BAR_TYPE RotBarSelection;
 ULONG PltRotBarStatus;
+BT_PROGRESS_INDICATOR InbvProgressIndicator = {0, 25, 0};
 
 /* FUNCTIONS *****************************************************************/
 
@@ -407,38 +390,29 @@ VOID
 NTAPI
 InbvUpdateProgressBar(IN ULONG Progress)
 {
-    ULONG FillCount, Left = 0;
+    ULONG FillCount, BoundedProgress;
 
     /* Make sure the progress bar is enabled, that we own and are installed */
     if ((ShowProgressBar) &&
         (InbvBootDriverInstalled) &&
         (InbvDisplayState == INBV_DISPLAY_STATE_OWNED))
     {
-        /* Calculate the fill count */
-        FillCount = InbvProgressState.Bias * Progress + InbvProgressState.Floor;
-        FillCount *= 18;
-        FillCount /= 10000;
+        /* Compute fill count */
+        BoundedProgress = (InbvProgressState.Floor / 100) + Progress;
+        FillCount = 121 * (InbvProgressState.Bias * BoundedProgress) / 1000000;
 
-        /* Start fill loop */
-        while (FillCount)
-        {
-            /* Acquire the lock */
-            InbvAcquireLock();
-
-            /* Fill the progress bar */
-            VidSolidColorFill(Left + ProgressBarLeft,
-                              ProgressBarTop,
-                              Left + ProgressBarLeft + 7,
-                              ProgressBarTop + 7,
-                              11);
-
-            /* Release the lock */
-            InbvReleaseLock();
-
-            /* Update the X position */
-            Left += 9;
-            FillCount--;
-        }
+        /* Acquire the lock */
+        InbvAcquireLock();
+
+        /* Fill the progress bar */
+        VidSolidColorFill(ProgressBarLeft,
+                          ProgressBarTop,
+                          ProgressBarLeft + FillCount,
+                          ProgressBarTop + 12,
+                          15);
+
+        /* Release the lock */
+        InbvReleaseLock();
     }
 }
 
@@ -527,6 +501,27 @@ InbvSetProgressBarSubset(IN ULONG Floor,
     InbvProgressState.Bias = (Ceiling * 100) - Floor;
 }
 
+VOID
+NTAPI
+InbvIndicateProgress(VOID)
+{
+    ULONG Percentage;
+
+    /* Increase progress */
+    InbvProgressIndicator.Count++;
+
+    /* Compute new percentage */
+    Percentage = min(100 * InbvProgressIndicator.Count /
+                           InbvProgressIndicator.Expected,
+                     99);
+    if (Percentage != InbvProgressIndicator.Percentage)
+    {
+        /* Percentage has moved, update the progress bar */
+        InbvProgressIndicator.Percentage = Percentage;
+        InbvUpdateProgressBar(Percentage);
+    }
+}
+
 PUCHAR
 NTAPI
 InbvGetResourceAddress(IN ULONG ResourceNumber)
@@ -557,9 +552,10 @@ VOID
 NTAPI
 DisplayBootBitmap(IN BOOLEAN SosMode)
 {
-    PVOID Bitmap, Header;
+    PVOID Header, Band, Bar, Text, Screen;
     ROT_BAR_TYPE TempRotBarSelection = RB_UNSPECIFIED;
-
+    UCHAR Buffer[64];
+    
     /* Check if the system thread has already been created */
     if (SysThreadCreated)
     {
@@ -580,10 +576,10 @@ DisplayBootBitmap(IN BOOLEAN SosMode)
             InbvSetTextColor(15);
             InbvSolidColorFill(0, 0, 639, 479, 7);
             InbvSolidColorFill(0, 421, 639, 479, 1);
-
+            
             /* Get resources */
-            Bitmap = InbvGetResourceAddress(6);
-            Header = InbvGetResourceAddress(7);
+            Header = InbvGetResourceAddress(IDB_LOGO_HEADER);
+            Band = InbvGetResourceAddress(IDB_LOGO_BAND);
         }
         else
         {
@@ -593,40 +589,87 @@ DisplayBootBitmap(IN BOOLEAN SosMode)
             InbvSolidColorFill(0, 421, 639, 479, 1);
 
             /* Get resources */
-            Bitmap = InbvGetResourceAddress(6);
-            Header = InbvGetResourceAddress(15);
+            Header = InbvGetResourceAddress(IDB_SERVER_HEADER);
+            Band = InbvGetResourceAddress(IDB_SERVER_BAND);
         }
 
         /* Set the scrolling region */
         InbvSetScrollRegion(32, 80, 631, 400);
 
         /* Make sure we have resources */
-        if ((Bitmap) && (Header))
+        if ((Header) && (Band))
         {
             /* BitBlt them on the screen */
-            InbvBitBlt(Header, 0, 419);
-            InbvBitBlt(Bitmap, 0, 0);
+            InbvBitBlt(Band, 0, 419);
+            InbvBitBlt(Header, 0, 0);
         }
     }
     else
     {
         /* Is the boot driver installed? */
+        Text = NULL;
         if (!InbvBootDriverInstalled) return;
 
-        /* FIXME: TODO, display full-screen bitmap */
-        Bitmap = InbvGetResourceAddress(5);
-        if (Bitmap)
+        /* Load the standard boot screen */
+        Screen = InbvGetResourceAddress(IDB_BOOT_LOGO);
+        if (SharedUserData->NtProductType == NtProductWinNt)
         {
-            PBITMAPINFOHEADER BitmapInfoHeader = (PBITMAPINFOHEADER)Bitmap;
-            ULONG Top, Left;
-
-            Left = (640 - BitmapInfoHeader->biWidth) / 2;
-            if (BitmapInfoHeader->biHeight < 0)
-                Top = (480 + BitmapInfoHeader->biHeight) / 2;
+            /* Workstation product, display appropriate status bar color */
+            Bar = InbvGetResourceAddress(IDB_BAR_PRO);
+        }
+        else
+        {
+            /* Display correct branding based on server suite */
+            if (ExVerifySuite(StorageServer))
+            {
+                /* Storage Server Edition */
+                Text = InbvGetResourceAddress(IDB_STORAGE_SERVER);
+            }
+            else if (ExVerifySuite(ComputeServer))
+            {
+                /* Compute Cluster Edition */
+                Text = InbvGetResourceAddress(IDB_CLUSTER_SERVER);
+            }
             else
-                Top = (480 - BitmapInfoHeader->biHeight) / 2;
-            InbvBitBlt(Bitmap, Left, Top);
+            {
+                /* Normal edition */
+                Text = InbvGetResourceAddress(IDB_SERVER_LOGO);
+            }
+            
+            /* Server product, display appropriate status bar color */
+            Bar = InbvGetResourceAddress(IDB_BAR_SERVER);
         }
+        
+        /* Make sure we had a logo */
+        if (Screen)
+        {
+            /* Choose progress bar */
+            TempRotBarSelection = RB_SQUARE_CELLS;
+
+            /* Blit the background */
+            InbvBitBlt(Screen, 0, 0);
+
+            /* Set progress bar coordinates and display it */
+            InbvSetProgressBarCoordinates(257, 352);
+            
+            /* Check for non-workstation products */
+            if (SharedUserData->NtProductType != NtProductWinNt)
+            {
+                /* Overwrite part of the logo for a server product */
+                InbvScreenToBufferBlt(Buffer, 413, 237, 7, 7, 8);
+                InbvSolidColorFill(418, 230, 454, 256, 0);
+                InbvBufferToScreenBlt(Buffer, 413, 237, 7, 7, 8);
+                
+                /* In setup mode, you haven't selected a SKU yet */
+                if (ExpInTextModeSetup) Text = NULL;
+            }
+          }
+          
+          /* Draw the SKU text if it exits */
+          if (Text) InbvBitBlt(Text, 180, 121);
+          
+          /* Draw the progress bar bit */
+//          if (Bar) InbvBitBlt(Bar, 0, 0);
     }
 
     /* Do we have a system thread? */
index a2b5939..d13c48d 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/1.bmp and b/reactos/ntoskrnl/inbv/logo/1.bmp differ
diff --git a/reactos/ntoskrnl/inbv/logo/13.bmp b/reactos/ntoskrnl/inbv/logo/13.bmp
deleted file mode 100644 (file)
index 209227e..0000000
Binary files a/reactos/ntoskrnl/inbv/logo/13.bmp and /dev/null differ
index 64439e9..c2a5562 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/14.bmp and b/reactos/ntoskrnl/inbv/logo/14.bmp differ
index d137807..88481b9 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/15.bmp and b/reactos/ntoskrnl/inbv/logo/15.bmp differ
diff --git a/reactos/ntoskrnl/inbv/logo/16.bmp b/reactos/ntoskrnl/inbv/logo/16.bmp
deleted file mode 100644 (file)
index 209227e..0000000
Binary files a/reactos/ntoskrnl/inbv/logo/16.bmp and /dev/null differ
diff --git a/reactos/ntoskrnl/inbv/logo/17.bmp b/reactos/ntoskrnl/inbv/logo/17.bmp
deleted file mode 100644 (file)
index 209227e..0000000
Binary files a/reactos/ntoskrnl/inbv/logo/17.bmp and /dev/null differ
index 4398476..04461ba 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/2.bmp and b/reactos/ntoskrnl/inbv/logo/2.bmp differ
index 7e95ca2..c10b768 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/3.bmp and b/reactos/ntoskrnl/inbv/logo/3.bmp differ
index 239307b..7aabbbf 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/4.bmp and b/reactos/ntoskrnl/inbv/logo/4.bmp differ
index f0cce0e..94fb7a9 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/5.bmp and b/reactos/ntoskrnl/inbv/logo/5.bmp differ
index a8cafc5..0834411 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/6.bmp and b/reactos/ntoskrnl/inbv/logo/6.bmp differ
index d137807..24ea213 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/7.bmp and b/reactos/ntoskrnl/inbv/logo/7.bmp differ
index 239307b..344e0b2 100644 (file)
Binary files a/reactos/ntoskrnl/inbv/logo/8.bmp and b/reactos/ntoskrnl/inbv/logo/8.bmp differ
index 656080f..7e925ef 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INCLUDE_NTOSKRNL_CONFIG_H
-#define __INCLUDE_NTOSKRNL_CONFIG_H
+#pragma once
 
 /********** dbg/print.c **********/
 
@@ -39,6 +38,3 @@
      */
     #undef WHOLE_PAGE_ALLOCATIONS
 #endif
-
-#endif /* __INCLUDE_NTOSKRNL_CONFIG_H */
-
index d7af74f..7d6dfab 100644 (file)
@@ -16,8 +16,8 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARCH_INTRIN_I_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_ARCH_INTRIN_I_H
+
+#pragma once
 
 #ifdef _M_IX86
 #include "../i386/intrin_i.h"
@@ -33,6 +33,4 @@
 #error "Unknown processor"
 #endif
 
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_ARCH_INTRIN_I_H */
-
 /* EOF */
index 512ff1c..3e1b8a5 100644 (file)
@@ -16,8 +16,8 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARCH_KE_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_ARCH_KE_H
+
+#pragma once
 
 #ifdef _M_IX86
 #include "../i386/ke.h"
@@ -33,8 +33,4 @@
 #error "Unknown processor"
 #endif
 
-VOID KiArchInitSystem(VOID);
-
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_ARCH_KE_H */
-
 /* EOF */
index f8e2aec..f5ee027 100644 (file)
@@ -16,8 +16,8 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARCH_MM_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_ARCH_MM_H
+
+#pragma once
 
 #ifdef _M_IX86
 #include <internal/i386/mm.h>
@@ -32,5 +32,3 @@
 #else
 #error "Unknown processor"
 #endif
-
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_ARCH_MM_H */
index 286a1f6..fdd4b88 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _INTRIN_INTERNAL_
-#define _INTRIN_INTERNAL_
+#pragma once
 
 FORCEINLINE
 VOID
@@ -154,5 +153,3 @@ KeArmWaitForInterrupt(VOID)
 {
     __asm__ __volatile__ ("mcr p15, 0, %0, c7, c0, 4" : : "r"(0) : "cc");
 }
-
-#endif
index 964b63b..80fee0a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARM_KE_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_ARM_KE_H
+#pragma once
 
 #include "intrin_i.h"
 
@@ -54,7 +53,7 @@
 // All architectures but x86 have it in the PRCB's KeContextSwitches
 //
 #define KeGetContextSwitches(Prcb)  \
-    Prcb->KeContextSwitches
+    CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches
 
 //
 // Returns the Interrupt State from a Trap Frame.
@@ -77,10 +76,7 @@ FORCEINLINE
 VOID
 KeFlushProcessTb(VOID)
 {
-    //
-    // We need to implement this!
-    //
-    ASSERTMSG("Need ARM flush routine\n", FALSE);
+    KeArmFlushTlb();
 }
 
 FORCEINLINE
@@ -107,13 +103,6 @@ KiApcInterrupt(
 
 #include "mm.h"
 
-VOID
-KeFillFixedEntryTb(
-    IN ARM_PTE Pte,
-    IN PVOID Virtual,
-    IN ULONG Index
-);
-
 VOID
 KeFlushTb(
     VOID
@@ -127,5 +116,3 @@ KeFlushTb(
 
 #define KiGetPreviousMode(tf) \
     ((tf->Spsr & CPSR_MODES) == CPSR_USER_MODE) ? UserMode: KernelMode
-
-#endif
index ba4f399..415fa18 100644 (file)
@@ -1,6 +1,32 @@
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARM_MM_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_ARM_MM_H
+#pragma once
 
+//
+// Number of bits corresponding to the area that a PDE entry represents (1MB)
+//
+#define PDE_SHIFT 20
+#define PDE_SIZE  (1 << PDE_SHIFT)
+
+//
+// Number of bits corresponding to the area that a coarse page table entry represents (4KB)
+//
+#define PTE_SHIFT 12
+#define PTE_SIZE (1 << PTE_SHIFT)
+
+//
+// Number of bits corresponding to the area that a coarse page table occupies (1KB)
+//
+#define CPT_SHIFT 10
+#define CPT_SIZE  (1 << CPT_SHIFT)
+
+//
+// Base Addresses
+//
+#define PTE_BASE    0xC0000000
+#define PTE_TOP     0xC03FFFFF
+#define PDE_BASE    0xC0400000
+#define HYPER_SPACE 0xC0500000
+
+#if 0
 typedef struct _HARDWARE_PDE_ARMV6
 {
     ULONG Valid:1;     // Only for small pages
@@ -33,18 +59,14 @@ typedef struct _HARDWARE_LARGE_PTE_ARMV6
     ULONG PageFrameNumber:12;
 } HARDWARE_LARGE_PTE_ARMV6, *PHARDWARE_LARGE_PTE_ARMV6;
 
-C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG));
-C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG));
-
-
 typedef struct _HARDWARE_PTE_ARMV6
 {
     ULONG NoExecute:1;
     ULONG Valid:1;
     ULONG Buffered:1;
     ULONG Cached:1;
-    ULONG Owner:1;
     ULONG Accessed:1;
+    ULONG Owner:1;
     ULONG CacheAttributes:3;
     ULONG ReadOnly:1;
     ULONG Shared:1;
@@ -52,155 +74,28 @@ typedef struct _HARDWARE_PTE_ARMV6
     ULONG PageFrameNumber:20;
 } HARDWARE_PTE_ARMV6, *PHARDWARE_PTE_ARMV6;
 
+C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG));
+C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG));
+C_ASSERT(sizeof(HARDWARE_PTE_ARMV6) == sizeof(ULONG));
+#endif
+
 /* For FreeLDR */
-typedef struct _PAGE_DIRECTORY_ARM
+typedef struct _PAGE_TABLE_ARM
 {
-    HARDWARE_PDE_ARMV6 Pde[4096];
-} PAGE_DIRECTORY_ARM, *PPAGE_DIRECTORY_ARM;
+    HARDWARE_PTE_ARMV6 Pte[1024];
+} PAGE_TABLE_ARM, *PPAGE_TABLE_ARM;
 
-//
-// Number of bits corresponding to the area that a PDE entry represents (1MB)
-//
-#define PDE_SHIFT 20
-#define PDE_SIZE  (1 << PDE_SHIFT)
-
-//
-// FIXFIX: This is all wrong now!!!
-//
-
-
-//
-// Number of bits corresponding to the area that a coarse page table entry represents (4KB)
-//
-#define PTE_SHIFT 12
-//#define PAGE_SIZE (1 << PTE_SHIFT) // FIXME: This conflicts with ndk/arm/mmtypes.h which does #define PAGE_SIZE 0x1000 -- use PTE_SIZE here instead?
-
-//
-// Number of bits corresponding to the area that a coarse page table occupies (1KB)
-//
-#define CPT_SHIFT 10
-#define CPT_SIZE  (1 << CPT_SHIFT)
-
-
-
-//
-// FIXFIX: This is all wrong now!!!
-//
-typedef union _ARM_PTE
+typedef struct _PAGE_DIRECTORY_ARM
 {
     union
     {
-        struct
-        {
-            ULONG Type:2;
-            ULONG Unused:30;
-        } Fault;
-        struct
-        {
-            ULONG Type:2;
-            ULONG Ignored:2;
-            ULONG Reserved:1;
-            ULONG Domain:4;
-            ULONG Ignored1:1;
-            ULONG BaseAddress:22;
-        } Coarse;
-        struct
-        {
-            ULONG Type:2;
-            ULONG Buffered:1;
-            ULONG Cached:1;
-            ULONG Reserved:1;
-            ULONG Domain:4;
-            ULONG Ignored:1;
-            ULONG Access:2;
-            ULONG Ignored1:8;
-            ULONG BaseAddress:12;
-        } Section;
-        struct
-        {
-            ULONG Type:2;
-            ULONG Reserved:3;
-            ULONG Domain:4;
-            ULONG Ignored:3;
-            ULONG BaseAddress:20;
-        } Fine;
-    } L1;
-    union
-    {
-        struct
-        {
-            ULONG Type:2;
-            ULONG Unused:30;
-        } Fault;
-        struct
-        {
-            ULONG Type:2;
-            ULONG Buffered:1;
-            ULONG Cached:1;
-            ULONG Access0:2;
-            ULONG Access1:2;
-            ULONG Access2:2;
-            ULONG Access3:2;
-            ULONG Ignored:4;
-            ULONG BaseAddress:16;
-        } Large;
-        struct
-        {
-            ULONG Type:2;
-            ULONG Buffered:1;
-            ULONG Cached:1;
-            ULONG Access0:2;
-            ULONG Access1:2;
-            ULONG Access2:2;
-            ULONG Access3:2;
-            ULONG BaseAddress:20;
-        } Small;
-        struct
-        {
-            ULONG Type:2;
-            ULONG Buffered:1;
-            ULONG Cached:1;
-            ULONG Access0:2;
-            ULONG Ignored:4;
-            ULONG BaseAddress:22;
-        } Tiny; 
-    } L2;
-    ULONG AsUlong;
-} ARM_PTE, *PARM_PTE;
-
-typedef struct _ARM_TRANSLATION_TABLE
-{
-    ARM_PTE Pte[4096];
-} ARM_TRANSLATION_TABLE, *PARM_TRANSLATION_TABLE;
-
-typedef struct _ARM_COARSE_PAGE_TABLE
-{
-    ARM_PTE Pte[256];
-    ULONG Padding[768];
-} ARM_COARSE_PAGE_TABLE, *PARM_COARSE_PAGE_TABLE;
-
-typedef enum _ARM_L1_PTE_TYPE
-{
-    FaultPte,
-    CoarsePte,
-    SectionPte,
-    FinePte
-} ARM_L1_PTE_TYPE;
-
-typedef enum _ARM_L2_PTE_TYPE
-{
-    LargePte = 1,
-    SmallPte,
-    TinyPte
-} ARM_L2_PTE_TYPE;
+        HARDWARE_PDE_ARMV6 Pde[4096];
+        HARDWARE_LARGE_PTE_ARMV6 Pte[4096];
+    };
+} PAGE_DIRECTORY_ARM, *PPAGE_DIRECTORY_ARM;
 
-typedef enum _ARM_PTE_ACCESS
-{
-    FaultAccess,
-    SupervisorAccess,
-    SharedAccess,
-    UserAccess
-} ARM_PTE_ACCESS;
+C_ASSERT(sizeof(PAGE_TABLE_ARM) == PAGE_SIZE);
+C_ASSERT(sizeof(PAGE_DIRECTORY_ARM) == (4 * PAGE_SIZE));
 
 typedef enum _ARM_DOMAIN
 {
@@ -210,67 +105,54 @@ typedef enum _ARM_DOMAIN
     ManagerDomain
 } ARM_DOMAIN;
 
-
-//
-// FIXFIX: This is all wrong now!!!
-//
-
-//
-// Take 0x80812345 and extract:
-// PTE_BASE[0x808][0x12]
-//
-#define MiGetPteAddress(x)         \
-    (PMMPTE)(PTE_BASE + \
-             (((ULONG)(x) >> 20) << 12) + \
-             ((((ULONG)(x) >> 12) & 0xFF) << 2))
-
-#define MiGetPdeAddress(x)         \
-    (PMMPDE_HARDWARE)(PDE_BASE + \
-             (((ULONG)(x) >> 20) << 2))
-
-#define MiGetPdeOffset(x) (((ULONG)(x)) >> 22)
-
-#define PTE_BASE    0xC0000000
-#define PTE_TOP    0xC03FFFFF
-#define PDE_BASE    0xC1000000
-#define HYPER_SPACE 0xC1100000
-#define HYPER_SPACE_END 0xC07FFFFF
-
 struct _EPROCESS;
 PULONG MmGetPageDirectory(VOID);
 
-
-//
-// FIXME: THESE ARE WRONG ATM.
-//
-#define MiAddressToPde(x) \
-((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PDE_BASE))
-#define MiAddressToPte(x) \
-((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PTE_BASE))
-#define MiAddressToPteOffset(x) \
-((((ULONG)(x)) << 10) >> 22)
-
-//
-// Convert a PTE into a corresponding address
-//
-#define MiPteToAddress(PTE) ((PVOID)((ULONG)(PTE) << 10))
-
-#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
-#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
-#define ADDR_TO_PTE_OFFSET(v)  ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
-
 #define MI_MAKE_LOCAL_PAGE(x)      ((x)->u.Hard.NonGlobal = 1)
 #define MI_MAKE_DIRTY_PAGE(x)      
-#define MI_MAKE_OWNER_PAGE(x)      ((x)->u.Hard.Access = 1) // FIXFIX
-#define MI_MAKE_WRITE_PAGE(x)      ((x)->u.Hard.ExtendedAccess = 1) // FIXFIX
+#define MI_MAKE_OWNER_PAGE(x)      ((x)->u.Hard.Owner = 1)
+#define MI_MAKE_WRITE_PAGE(x)      ((x)->u.Hard.ReadOnly = 0)
 #define MI_PAGE_DISABLE_CACHE(x)   ((x)->u.Hard.Cached = 0)
 #define MI_PAGE_WRITE_THROUGH(x)   ((x)->u.Hard.Buffered = 0)
 #define MI_PAGE_WRITE_COMBINED(x)  ((x)->u.Hard.Buffered = 1)
-#define MI_IS_PAGE_WRITEABLE(x)    ((x)->u.Hard.ExtendedAccess == 0)
+#define MI_IS_PAGE_WRITEABLE(x)    ((x)->u.Hard.ReadOnly == 0)
 #define MI_IS_PAGE_COPY_ON_WRITE(x)FALSE
 #define MI_IS_PAGE_DIRTY(x)        TRUE
 
 /* Easy accessing PFN in PTE */
 #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
 
-#endif
+#define NR_SECTION_PAGE_TABLES              1024
+#define NR_SECTION_PAGE_ENTRIES             256
+
+/* See PDR definition */
+#define MI_HYPERSPACE_PTES                  (256 - 1)
+#define MI_ZERO_PTES                        (32)
+#define MI_MAPPING_RANGE_START              ((ULONG)HYPER_SPACE)
+#define MI_MAPPING_RANGE_END                (MI_MAPPING_RANGE_START + \
+                                             MI_HYPERSPACE_PTES * PAGE_SIZE)
+#define MI_ZERO_PTE                         (PMMPTE)(MI_MAPPING_RANGE_END + \
+                                             PAGE_SIZE)
+
+/* Retrives the PDE entry for the given VA */
+#define MiGetPdeAddress(x) ((PMMPDE)(PDE_BASE + (((ULONG)(x) >> 20) << 2)))
+#define MiAddressToPde(x)  MiGetPdeAddress(x)
+    
+/* Retrieves the PTE entry for the given VA */
+#define MiGetPteAddress(x) ((PMMPTE)(PTE_BASE + (((ULONG)(x) >> 12) << 2)))
+#define MiAddressToPte(x)  MiGetPteAddress(x)
+
+/* Retrives the PDE offset for the given VA */
+#define MiGetPdeOffset(x) (((ULONG)(x)) >> 20)
+
+/* Convert a PTE into a corresponding address */
+#define MiPteToAddress(x) ((PVOID)((ULONG)(x) << 10))
+#define MiPdeToAddress(x) ((PVOID)((ULONG)(x) << 18))
+
+#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
+    ((x) / (4*1024*1024))
+
+#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
+    ((((x)) % (4*1024*1024)) / (4*1024))
+    
+#define MM_CACHE_LINE_SIZE 64
index 62221cb..30139ec 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INCLUDE_INTERNAL_CC_H
-#define __INCLUDE_INTERNAL_CC_H
+#pragma once
 
 typedef struct _PF_SCENARIO_ID
 {
@@ -315,5 +314,3 @@ CcRosReleaseFileCache(
 NTSTATUS
 NTAPI
 CcTryToInitializeFileCache(PFILE_OBJECT FileObject);
-
-#endif
index 9218e07..537111a 100644 (file)
@@ -1454,6 +1454,12 @@ CmShutdownSystem(
     VOID
 );
 
+VOID
+NTAPI
+CmSetLazyFlushState(
+    IN BOOLEAN Enable
+);
+
 //
 // Global variables accessible from all of Cm
 //
index 3c8803b..1c73035 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H
+#pragma once
 
 /* GLOBAL VARIABLES *********************************************************/
 
@@ -27,6 +26,7 @@ extern ULONG NtGlobalFlag;
 extern ULONG ExpInitializationPhase;
 extern ULONG ExpAltTimeZoneBias;
 extern LIST_ENTRY ExSystemLookasideListHead;
+extern PCALLBACK_OBJECT PowerStateCallback;
 
 typedef struct _EXHANDLE
 {
@@ -159,6 +159,10 @@ VOID
 NTAPI
 ExpInitializeWorkerThreads(VOID);
 
+VOID
+NTAPI
+ExSwapinWorkerThreads(IN BOOLEAN AllowSwap);
+
 VOID
 NTAPI
 ExpInitLookasideLists(VOID);
@@ -874,10 +878,10 @@ ExWaitForUnblockPushLock(
 );
 
 /*++
- * @name ExInitializePushLock
+ * @name _ExInitializePushLock
  * INTERNAL MACRO
  *
- *     The ExInitializePushLock macro initializes a PushLock.
+ *     The _ExInitializePushLock macro initializes a PushLock.
  *
  * @params PushLock
  *         Pointer to the pushlock which is to be initialized.
@@ -889,11 +893,12 @@ ExWaitForUnblockPushLock(
  *--*/
 FORCEINLINE
 VOID
-ExInitializePushLock(IN PULONG_PTR PushLock)
+_ExInitializePushLock(IN PULONG_PTR PushLock)
 {
     /* Set the value to 0 */
     *PushLock = 0;
 }
+#define ExInitializePushLock _ExInitializePushLock
 
 /*++
  * @name ExAcquirePushLockExclusive
@@ -1252,7 +1257,7 @@ _ExReleaseFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex)
     if (InterlockedIncrement(&FastMutex->Count) <= 0)
     {
         /* Someone was waiting for it, signal the waiter */
-        KeSetEventBoostPriority(&FastMutex->Gate, NULL);
+        KeSetEventBoostPriority(&FastMutex->Event, NULL);
     }
 }
 
@@ -1293,7 +1298,7 @@ _ExReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex)
     if (InterlockedIncrement(&FastMutex->Count) <= 0)
     {
         /* Someone was waiting for it, signal the waiter */
-        KeSetEventBoostPriority(&FastMutex->Gate, NULL);
+        KeSetEventBoostPriority(&FastMutex->Event, NULL);
     }
     
     /* Lower IRQL back */
@@ -1410,5 +1415,3 @@ XIPInit(
 
 #define ExfInterlockedCompareExchange64UL(Destination, Exchange, Comperand) \
    (ULONGLONG)ExfInterlockedCompareExchange64((PLONGLONG)(Destination), (PLONGLONG)(Exchange), (PLONGLONG)(Comperand))
-
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H */
index 32638d2..47b76be 100644 (file)
@@ -5,8 +5,8 @@
  * PURPOSE:         Internal header for the I/O HAL Functions (Fstub)
  * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
  */
-#ifndef _HAL_
-#define _HAL_
+
+#pragma once
 
 //
 // Default implementations of HAL dispatch table
@@ -53,6 +53,18 @@ xHalHaltSystem(
     VOID
 );
 
+VOID
+NTAPI
+xHalEndOfBoot(
+    VOID
+);
+
+VOID
+NTAPI
+xHalSetWakeEnable(
+    IN BOOLEAN Enable
+);
+
 UCHAR
 NTAPI
 xHalVectorToIDTEntry(
@@ -156,5 +168,3 @@ typedef struct _PTE
     ULONG StartingSector;
     ULONG PartitionLength;
 } PTE, *PPTE;
-
-#endif
index d0fabe9..6ddb9d0 100644 (file)
@@ -4,17 +4,12 @@
  * FILE:            ntoskrnl/include/i386/asmmacro.S
  * PURPOSE:         Assembly Macros for Spinlocks and common Trap Code
  * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)
+ *                  Timo Kreuzer (timo.kreuzer@reactos.org)
  */
  
-/* INCLUDES ******************************************************************/
-
-#include <ndk/asm.h>
-
 // Arguments for idt
-#define INT_32_DPL0                 0x8E00
-#define INT_32_DPL3                 0xEE00
-
-.intel_syntax noprefix
+#define INT_32_DPL0                 HEX(08E00)
+#define INT_32_DPL3                 HEX(0EE00)
 
 //
 // These macros are inlined equivalents of KiAcquire/ReleaseSpinlock, that is,
@@ -30,7 +25,7 @@
 //  #IFDEF CONFIG_SMP
 //  .spin
 //      <any necessary steps to be able to jump back safely>
-/       SPIN_ON_LOCK(reg, .BeginYourFunction)
+//       SPIN_ON_LOCK(reg, .BeginYourFunction)
 //  #ENDIF
 //
 #ifdef CONFIG_SMP
 //
 // @remark None.
 //
-.macro idt Handler, Bits
+MACRO(idt, Handler, Bits)
     .long \Handler
     .short \Bits
     .short KGDT_R0_CODE
-.endm
+ENDM
 
-//
-// @name GENERATE_IDT_STUB
-//
-// This macro creates an IDT entry for an unexpected interrupt handler.
-//
-// @param None.
-//
-// @remark None.
-//
-.macro GENERATE_IDT_STUB Number
-idt _KiUnexpectedInterrupt&Number, INT_32_DPL0
-.endm
 
-//
-// @name GENERATE_IDT_STUBS
-//
-// This macro creates unexpected interrupt IDT entries.
-//
-// @param None.
-//
-// @remark None.
-//
-.altmacro
-.macro GENERATE_IDT_STUBS
-.set i, 0
-.rept 208
-    GENERATE_IDT_STUB %i
-    .set i, i + 1
-.endr
-.endm
+KI_PUSH_FAKE_ERROR_CODE = HEX(0001)
+KI_UNUSED               = HEX(0002)
+KI_NONVOLATILES_ONLY    = HEX(0004)
+KI_FAST_SYSTEM_CALL     = HEX(0008)
+KI_SOFTWARE_TRAP        = HEX(0010)
+KI_HARDWARE_INT         = HEX(0020)
+KI_DONT_SAVE_SEGS       = HEX(0100)
 
-//
-// @name GENERATE_INT_HANDLER
-//
-// This macro creates an unexpected interrupt handler.
-//
-// @param None.
-//
-// @remark None.
-//
-.macro GENERATE_INT_HANDLER Number
-.func KiUnexpectedInterrupt&Number
-_KiUnexpectedInterrupt&Number:
-    mov eax, PRIMARY_VECTOR_BASE + Number
-    jmp _KiEndUnexpectedRange@0
-.endfunc
-.endm
+MACRO(KiEnterTrap, Flags)
+    LOCAL kernel_trap
+    LOCAL not_v86_trap
+    LOCAL set_sane_segs
+
+    /* Check what kind of trap frame this trap requires */
+    if (Flags AND KI_FAST_SYSTEM_CALL)
+
+        /* SYSENTER requires us to build a complete ring transition trap frame */
+        FrameSize = KTRAP_FRAME_V86_ES
+
+        /* Fixup fs. cx is free to clobber */
+        mov cx, KGDT_R0_PCR
+        mov fs, cx
+
+        /* Get pointer to the TSS */
+        mov ecx, fs:[KPCR_TSS]
+
+        /* Get a stack pointer */
+        mov esp, [ecx + KTSS_ESP0]
+
+    elseif (Flags AND KI_SOFTWARE_TRAP)
+
+        /* Software traps need a complete non-ring transition trap frame */
+        FrameSize = KTRAP_FRAME_ESP
+
+        /* Software traps need to get their EIP from the caller's frame */
+        pop eax
+
+    elseif (Flags AND KI_PUSH_FAKE_ERROR_CODE)
+
+        /* If the trap doesn't have an error code, we'll make space for it */
+        FrameSize = KTRAP_FRAME_EIP
+
+    else
+
+        /* The trap already has an error code, so just make space for the rest */
+        FrameSize = KTRAP_FRAME_ERROR_CODE
+
+    endif
+
+    /* Make space for this frame */
+    sub esp, FrameSize
+
+    /* Save nonvolatile registers */
+    mov [esp + KTRAP_FRAME_EBP], ebp
+    mov [esp + KTRAP_FRAME_EBX], ebx
+    mov [esp + KTRAP_FRAME_ESI], esi
+    mov [esp + KTRAP_FRAME_EDI], edi
+
+    /* Save eax for system calls, for use by the C handler */
+    mov [esp + KTRAP_FRAME_EAX], eax
+
+    /* Does the caller want nonvolatiles only? */
+    if ((Flags AND KI_NONVOLATILES_ONLY) == 0)
+        /* Otherwise, save the volatiles as well */
+        mov [esp + KTRAP_FRAME_ECX], ecx
+        mov [esp + KTRAP_FRAME_EDX], edx
+    endif
+
+    /* Save segment registers? */
+    if ((Flags AND KI_DONT_SAVE_SEGS) == 0)
+
+        /* Check for V86 mode */
+        test byte ptr [esp + KTRAP_FRAME_EFLAGS + 2], (EFLAGS_V86_MASK >> 16)
+        jz not_v86_trap
+
+            /* Restore V8086 segments into Protected Mode segments */
+            mov eax, [esp + KTRAP_FRAME_V86_DS]
+            mov ecx, [esp + KTRAP_FRAME_V86_ES]
+            mov [esp + KTRAP_FRAME_DS], eax
+            mov [esp + KTRAP_FRAME_ES], ecx
+            mov eax, [esp + KTRAP_FRAME_V86_FS]
+            mov ecx, [esp + KTRAP_FRAME_V86_GS]
+            mov [esp + KTRAP_FRAME_FS], eax
+            mov [esp + KTRAP_FRAME_GS], ecx
+            jmp set_sane_segs
+
+        not_v86_trap:
+
+            /* Save segment selectors */
+            mov eax, ds
+            mov ecx, es
+            mov [esp + KTRAP_FRAME_DS], eax
+            mov [esp + KTRAP_FRAME_ES], ecx
+            mov eax, fs
+            mov ecx, gs
+            mov [esp + KTRAP_FRAME_FS], eax
+            mov [esp + KTRAP_FRAME_GS], ecx
+
+    endif
+
+set_sane_segs:
+    /* Load correct data segments */
+    mov ax, KGDT_R3_DATA OR RPL_MASK
+    mov ds, ax
+    mov es, ax
+
+    /* Fast system calls have fs already fixed */
+    if ((Flags AND KI_FAST_SYSTEM_CALL) == 0)
+        /* Otherwise fix fs now */
+        mov ax, KGDT_R0_PCR
+        mov fs, ax
+    endif
+
+#if DBG
+    /* Keep the frame chain intact */
+    mov eax, [esp + KTRAP_FRAME_EIP]
+    mov [esp + KTRAP_FRAME_DEBUGEIP], eax
+    mov [esp + KTRAP_FRAME_DEBUGEBP], ebp
+    mov ebp, esp
+#endif
+
+    /* Set parameter 1 (ECX) to point to the frame */
+    mov ecx, esp
+
+    /* Clear direction flag */
+    cld
+
+ENDM
+
+MACRO(KiCallHandler, Handler)
+#if DBG
+    /* Use a call to get the return address for back traces */
+    call Handler
+#else
+    /* Use the faster jmp */
+    jmp Handler
+#endif
+    nop
+ENDM
+
+MACRO(TRAP_ENTRY, Trap, Flags)
+EXTERN @&Trap&Handler@4 :PROC
+    PUBLIC _&Trap
+    _&Trap:
+    KiEnterTrap Flags
+    KiCallHandler @&Trap&Handler@4
+ENDM
+
+#define KI_RESTORE_EAX        HEX(001)
+#define KI_RESTORE_ECX_EDX    HEX(002)
+#define KI_RESTORE_FS         HEX(004)
+#define KI_RESTORE_SEGMENTS   HEX(008)
+#define KI_RESTORE_EFLAGS     HEX(010)
+#define KI_EXIT_SYSCALL       HEX(020)
+#define KI_EXIT_JMP           HEX(040)
+#define KI_EXIT_RET           HEX(080)
+#define KI_EXIT_IRET          HEX(100)
+#define KI_EDITED_FRAME       HEX(200)
+#define KI_RESTORE_VOLATILES  (KI_RESTORE_EAX OR KI_RESTORE_ECX_EDX)
+
+MACRO(KiTrapExitStub, Name, Flags)
+
+PUBLIC @&Name&@4
+@&Name&@4:
+
+    if (Flags AND KI_RESTORE_EFLAGS)
+
+        /* We will pop EFlags off the stack */
+        OffsetEsp = KTRAP_FRAME_EFLAGS
+
+    elseif (Flags AND KI_EXIT_IRET)
+
+        /* This is the IRET frame */
+        OffsetEsp = KTRAP_FRAME_EIP
+
+    else
+
+        OffsetEsp = 0
+
+    endif
+
+    if (Flags AND KI_EDITED_FRAME)
+
+        /* Load the requested ESP */
+        mov esp, [ecx + KTRAP_FRAME_TEMPESP]
+
+        /* Put return address on the new stack */
+        push [ecx + KTRAP_FRAME_EIP]
+
+        /* Put EFLAGS on the new stack */
+        push [ecx + KTRAP_FRAME_EFLAGS]
+
+    else
+
+        /* Point esp to an appropriate member of the frame */
+        lea esp, [ecx + OffsetEsp]
+
+    endif
+
+    /* Restore non volatiles */
+    mov ebx, [ecx + KTRAP_FRAME_EBX]
+    mov esi, [ecx + KTRAP_FRAME_ESI]
+    mov edi, [ecx + KTRAP_FRAME_EDI]
+    mov ebp, [ecx + KTRAP_FRAME_EBP]
+
+    if (Flags AND KI_RESTORE_EAX)
+
+        /* Restore eax */
+        mov eax, [ecx + KTRAP_FRAME_EAX]
+
+    endif
+
+    if (Flags AND KI_RESTORE_ECX_EDX)
+
+        /* Restore volatiles */
+        mov edx, [ecx + KTRAP_FRAME_EDX]
+        mov ecx, [ecx + KTRAP_FRAME_ECX]
+
+    elseif (Flags AND KI_EXIT_JMP)
+
+        /* Load return address into edx */
+        mov edx, [esp - OffsetEsp + KTRAP_FRAME_EIP]
+
+    elseif (Flags AND KI_EXIT_SYSCALL)
+
+        /* Set sysexit parameters */
+        mov edx, [esp - OffsetEsp + KTRAP_FRAME_EIP]
+        mov ecx, [esp - OffsetEsp + KTRAP_FRAME_ESP]
+
+        /* Keep interrupts disabled until the sti / sysexit */
+        and byte ptr [esp - OffsetEsp + KTRAP_FRAME_EFLAGS + 1], ~(EFLAGS_INTERRUPT_MASK >> 8)
+
+    endif
+
+    if (Flags AND KI_RESTORE_SEGMENTS)
+
+        /* Restore segments for user mode */
+        mov ds, [esp - OffsetEsp + KTRAP_FRAME_DS]
+        mov es, [esp - OffsetEsp + KTRAP_FRAME_ES]
+        mov gs, [esp - OffsetEsp + KTRAP_FRAME_GS]
+
+    endif
+
+    if ((Flags AND KI_RESTORE_FS) OR (Flags AND KI_RESTORE_SEGMENTS))
+
+        /* Restore user mode FS */
+        mov fs, [esp - OffsetEsp + KTRAP_FRAME_FS]
+
+    endif
+
+    if (Flags AND KI_RESTORE_EFLAGS)
+
+        /* Restore EFLAGS */
+        popf
+
+    endif
+
+    if (Flags AND KI_EXIT_SYSCALL)
+
+        /* Enable interrupts and return to user mode.
+           Both must follow directly after another to be "atomic". */
+        sti
+        sysexit
+
+    elseif (Flags AND KI_EXIT_IRET)
+
+        /* Return with iret */
+        iret
+
+    elseif (Flags AND KI_EXIT_JMP)
+
+        /* Return to kernel mode with a jmp */
+        jmp edx
+
+    elseif (Flags AND KI_EXIT_RET)
+
+        /* Return to kernel mode with a ret */
+        ret
+
+    endif
+
+ENDM
 
-//
-// @name GENERATE_INT_HANDLERS
-//
-// This macro creates the unexpected interrupt handlers.
-//
-// @param None.
-//
-// @remark None.
-//
-.altmacro
-.macro GENERATE_INT_HANDLERS
-.set i, 0
-.rept 208
-    GENERATE_INT_HANDLER %i
-    .set i, i + 1
-.endr
-.endm
index 7414dfb..a78497b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _INTRIN_INTERNAL_
-#define _INTRIN_INTERNAL_
+#pragma once
 
 #if defined(__GNUC__)
 
@@ -263,6 +262,4 @@ Ke386SetGs(IN USHORT Value)
 #error Unknown compiler for inline assembler
 #endif
 
-#endif
-
 /* EOF */
index 0054f71..701688e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H
+#pragma once
 
 #ifndef __ASM__
 
@@ -398,9 +397,9 @@ Ki386HandleOpcodeV86(
     IN PKTRAP_FRAME TrapFrame
 );
 
+DECLSPEC_NORETURN
 VOID
 FASTCALL
-DECLSPEC_NORETURN
 KiEoiHelper(
     IN PKTRAP_FRAME TrapFrame
 );
@@ -417,9 +416,9 @@ KiExitV86Mode(
     IN PKTRAP_FRAME TrapFrame
 );
 
+DECLSPEC_NORETURN
 VOID
 NTAPI
-DECLSPEC_NORETURN
 KiDispatchExceptionFromTrapFrame(
     IN NTSTATUS Code,
     IN ULONG_PTR Address,
@@ -439,7 +438,6 @@ extern ULONG KeI386EFlagsOrMaskV86;
 extern BOOLEAN KeI386VirtualIntExtensions;
 extern KIDTENTRY KiIdt[MAXIMUM_IDTVECTOR];
 extern KDESCRIPTOR KiIdtDescriptor;
-extern ULONG Ke386GlobalPagesEnabled;
 extern BOOLEAN KiI386PentiumLockErrataPresent;
 extern ULONG KeI386NpxPresent;
 extern ULONG KeI386XMMIPresent;
@@ -622,6 +620,7 @@ KiSystemCallTrampoline(IN PVOID Handler,
      * later to function like this as well.
      *
      */
+#ifdef __GNUC__
     __asm__ __volatile__
     (
         "subl %1, %%esp\n"
@@ -637,7 +636,23 @@ KiSystemCallTrampoline(IN PVOID Handler,
           "r"(Handler)
         : "%esp", "%esi", "%edi"
     );
-    
+#elif defined(_MSC_VER)
+    __asm
+    {
+        mov ecx, StackBytes
+        mov edx, Arguments
+        sub esp, ecx
+        mov edi, esp
+        mov esi, edx
+        shr ecx, 2
+        rep movsd
+        call Handler
+        mov Result, eax
+    }
+#else
+#error Unknown Compiler
+#endif
+
     return Result;
 }
 
@@ -704,6 +719,7 @@ KiConvertToGuiThread(VOID)
      * on its merry way.
      *
      */
+#ifdef __GNUC__
     __asm__ __volatile__
     (
         "movl %%ebp, %1\n"
@@ -714,9 +730,22 @@ KiConvertToGuiThread(VOID)
         "movl %%eax, %0\n"
         : "=r"(Result), "=r"(StackFrame)
         :
-        : "%esp", "%ecx", "%edx"
+        : "%esp", "%ecx", "%edx", "memory"
     );
-        
+#elif defined(_MSC_VER)
+    NTSTATUS NTAPI PsConvertToGuiThread(VOID);
+    __asm
+    {
+        mov StackFrame, ebp
+        sub StackFrame, esp
+        call PsConvertToGuiThread
+        add StackFrame, esp
+        mov ebp, StackFrame
+        mov Result, eax
+    }
+#else
+#error Unknown Compiler
+#endif
     return Result;
 }
 
@@ -728,7 +757,8 @@ FORCEINLINE
 KiSwitchToBootStack(IN ULONG_PTR InitialStack)
 {
     /* We have to switch to a new stack before continuing kernel initialization */
-    __asm__ __volatile__
+#ifdef __GNUC__
+    __asm__
     (
         "movl %0, %%esp\n"
         "subl %1, %%esp\n"
@@ -740,6 +770,19 @@ KiSwitchToBootStack(IN ULONG_PTR InitialStack)
           "i"(CR0_EM | CR0_TS | CR0_MP)
         : "%esp"
     );
+#elif defined(_MSC_VER)
+    VOID NTAPI KiSystemStartupBootStack(VOID);
+    __asm
+    {
+        mov ecx, InitialStack
+        mov esp, ecx
+        sub esp, (NPX_FRAME_LENGTH + KTRAP_FRAME_ALIGN + KTRAP_FRAME_LENGTH)
+        push (CR0_EM | CR0_TS | CR0_MP)
+        jmp KiSystemStartupBootStack
+    }
+#else
+#error Unknown Compiler
+#endif
 }
 
 //
@@ -776,4 +819,3 @@ Ki386PerfEnd(VOID)
 }
 
 #endif
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H */
index 6ece2a7..e31c07d 100644 (file)
@@ -2,8 +2,7 @@
  * Lowlevel memory managment definitions
  */
 
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
+#pragma once
 
 struct _EPROCESS;
 PULONG MmGetPageDirectory(VOID);
@@ -63,4 +62,30 @@ PULONG MmGetPageDirectory(VOID);
 #define MI_MAKE_WRITE_PAGE(x)      ((x)->u.Hard.Writable = 1)
 #endif
 
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H */
+#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
+    ((x) / (4*1024*1024))
+
+#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
+    ((((x)) % (4*1024*1024)) / (4*1024))
+
+#define NR_SECTION_PAGE_TABLES              1024
+#define NR_SECTION_PAGE_ENTRIES             1024
+
+#define TEB_BASE                            0x7FFDE000
+
+#define MI_HYPERSPACE_PTES                  (256 - 1)
+#define MI_ZERO_PTES                        (32)
+#define MI_MAPPING_RANGE_START              (ULONG)HYPER_SPACE
+#define MI_MAPPING_RANGE_END                (MI_MAPPING_RANGE_START + \
+                                             MI_HYPERSPACE_PTES * PAGE_SIZE)
+#define MI_ZERO_PTE                         (PMMPTE)(MI_MAPPING_RANGE_END + \
+                                             PAGE_SIZE)
+
+/* On x86, these two are the same */
+#define MMPDE MMPTE
+#define PMMPDE PMMPTE
+
+/*
+* FIXME - different architectures have different cache line sizes...
+*/
+#define MM_CACHE_LINE_SIZE                  32
index dcbaf7e..167bb7c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __V86M_
-#define __V86M_
+#pragma once
 
 #include "ketypes.h"
 
@@ -57,5 +56,3 @@ typedef struct _KV86M_TRAP_FRAME
     struct _KV86M_REGISTERS* regs;
     ULONG orig_ebp;
 } KV86M_TRAP_FRAME, *PKV86M_TRAP_FRAME;
-
-#endif
index 00fd9a1..eb87f83 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef NTOSKRNL_INBV_H
-#define NTOSKRNL_INBV_H
+#pragma once
 
 typedef struct _InbvProgressState
 {
@@ -8,6 +7,13 @@ typedef struct _InbvProgressState
     ULONG Bias;
 } INBV_PROGRESS_STATE;
 
+typedef struct _BT_PROGRESS_INDICATOR
+{
+    ULONG Count;
+    ULONG Expected;
+    ULONG Percentage;
+} BT_PROGRESS_INDICATOR, *PBT_PROGRESS_INDICATOR;
+
 typedef enum _ROT_BAR_TYPE
 {
     RB_UNSPECIFIED,
@@ -45,8 +51,24 @@ FinalizeBootLogo(
     VOID
 );
 
-extern BOOLEAN InbvBootDriverInstalled;
-
-#endif /* NTOSKRNL_INBV_H */
+PUCHAR
+NTAPI
+InbvGetResourceAddress(
+    IN ULONG ResourceNumber
+);
 
+VOID
+NTAPI
+InbvBitBlt(
+    IN PUCHAR Buffer,
+    IN ULONG X,
+    IN ULONG Y
+);
 
+VOID
+NTAPI
+InbvIndicateProgress(
+    VOID
+);
+           
+extern BOOLEAN InbvBootDriverInstalled;
index cf45a02..c8b6716 100644 (file)
@@ -743,14 +743,14 @@ IoInitShutdownNotification(
 
 VOID
 NTAPI
-IoShutdownRegisteredDevices(
-    VOID
+IoShutdownSystem(
+    IN ULONG Phase
 );
 
 VOID
 NTAPI
-IoShutdownRegisteredFileSystems(
-    VOID
+IopShutdownBaseFileSystems(
+    IN PLIST_ENTRY ListHead
 );
 
 //
index 151b180..b61d498 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
-#define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
+#pragma once
 
 #ifdef _M_PPC
 #define KdDebuggerEnabled _KdDebuggerEnabled
@@ -364,4 +363,3 @@ extern KD_CONTEXT KdpContext;
 extern ULONG Kd_WIN2000_Mask;
 
 #endif
-#endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */
index 91b1b25..5dac916 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_KE_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_KE_H
+#pragma once
 
 /* INCLUDES *****************************************************************/
 
@@ -1093,9 +1092,9 @@ KiIdleLoop(
     VOID
 );
 
+DECLSPEC_NORETURN
 VOID
 FASTCALL
-DECLSPEC_NORETURN
 KiSystemFatalException(
     IN ULONG ExceptionCode,
     IN PKTRAP_FRAME TrapFrame
@@ -1114,5 +1113,3 @@ KiRosPcToUserFileHeader(IN PVOID Eip,
                         OUT PLDR_DATA_TABLE_ENTRY *LdrEntry);
 
 #include "ke_x.h"
-
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */
index 9898813..77eb7fd 100644 (file)
@@ -1,9 +1,6 @@
-#ifndef __INCLUDE_INTERNAL_LDR_H
-#define __INCLUDE_INTERNAL_LDR_H
+#pragma once
 
 #define KERNEL_MODULE_NAME      L"ntoskrnl.exe"
 #define HAL_MODULE_NAME         L"hal.dll"
 #define DRIVER_ROOT_NAME        L"\\Driver\\"
 #define FILESYSTEM_ROOT_NAME    L"\\FileSystem\\"
-
-#endif /* __INCLUDE_INTERNAL_LDR_H */
index 55c90fd..3c67357 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INCLUDE_INTERNAL_MM_H
-#define __INCLUDE_INTERNAL_MM_H
+#pragma once
 
 #include <internal/arch/mm.h>
 
@@ -109,28 +108,10 @@ typedef ULONG SWAPENTRY;
 /* Number of list heads to use */
 #define MI_FREE_POOL_LISTS 4
 
-#define MI_HYPERSPACE_PTES                  (256 - 1)
-#define MI_ZERO_PTES                        (32)
-#define MI_MAPPING_RANGE_START              (ULONG_PTR)HYPER_SPACE
-#define MI_MAPPING_RANGE_END                (MI_MAPPING_RANGE_START + \
-                                             MI_HYPERSPACE_PTES * PAGE_SIZE)
-#define MI_ZERO_PTE                         (PMMPTE)(MI_MAPPING_RANGE_END + \
-                                             PAGE_SIZE)
 
 /* Signature of free pool blocks */
 #define MM_FREE_POOL_TAG    'lprF'
 
-#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
-    ((x) / (4*1024*1024))
-
-#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
-    ((((x)) % (4*1024*1024)) / (4*1024))
-
-#define NR_SECTION_PAGE_TABLES              1024
-#define NR_SECTION_PAGE_ENTRIES             1024
-
-#define TEB_BASE                            0x7FFDE000
-
 /* Although Microsoft says this isn't hardcoded anymore,
    they won't be able to change it. Stuff depends on it */
 #define MM_VIRTMEM_GRANULARITY              (64 * 1024)
@@ -170,17 +151,6 @@ typedef ULONG SWAPENTRY;
  */
 #define MM_POOL_ALIGNMENT                   8
 
-/*
- * Maximum size of the kmalloc area (this is totally arbitary)
- */
-#define MM_KERNEL_MAP_SIZE                  (16*1024*1024)
-#define MM_KERNEL_MAP_BASE                  (0xf0c00000)
-
-/*
- * FIXME - different architectures have different cache line sizes...
- */
-#define MM_CACHE_LINE_SIZE                  32
-
 #define MM_ROUND_UP(x,s)                    \
     ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
 
@@ -399,7 +369,7 @@ typedef struct _MMPFN
     } u4;
 } MMPFN, *PMMPFN;
 
-extern PMMPFN MmPfnDatabase;
+extern PMMPFN MmPfnDatabase[2];
 
 typedef struct _MMPFNLIST
 {
@@ -1116,8 +1086,6 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page);
 
 /* freelist.c **********************************************************/
 
-#define ASSERT_PFN(x) ASSERT((x)->u3.e1.CacheAttribute != 0)
-
 FORCEINLINE
 PMMPFN
 MiGetPfnEntry(IN PFN_NUMBER Pfn)
@@ -1132,10 +1100,7 @@ MiGetPfnEntry(IN PFN_NUMBER Pfn)
     if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, Pfn))) return NULL;
 
     /* Get the entry */
-    Page = &MmPfnDatabase[Pfn];
-
-    /* Make sure it's valid */
-    ASSERT_PFN(Page);
+    Page = &MmPfnDatabase[0][Pfn];
 
     /* Return it */
     return Page;
@@ -1148,7 +1113,7 @@ MiGetPfnEntryIndex(IN PMMPFN Pfn1)
     //
     // This will return the Page Frame Number (PFN) from the MMPFN
     //
-    return Pfn1 - MmPfnDatabase;
+    return Pfn1 - MmPfnDatabase[0];
 }
 
 PFN_NUMBER
@@ -1377,8 +1342,7 @@ MmSetDirtyPage(
 PFN_NUMBER
 NTAPI
 MmAllocPage(
-    ULONG Consumer,
-    SWAPENTRY SavedSwapEntry
+    ULONG Consumer
 );
 
 LONG
@@ -1788,5 +1752,3 @@ MmGetKernelAddressSpace(VOID)
 {
     return MmKernelAddressSpace;
 }
-
-#endif
index 7c812ab..d75265e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INCLUDE_INTERNAL_NTOSKRNL_H
-#define __INCLUDE_INTERNAL_NTOSKRNL_H
+#pragma once
 
 /*
  * Use these to place a function in a specific section of the executable
@@ -198,8 +197,8 @@ C_ASSERT(FIELD_OFFSET(KPROCESS, DirectoryTableBase) == KPROCESS_DIRECTORY_TABLE_
 #endif
 
 #ifdef _M_IX86
-C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
-C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
+C_ASSERT(FIELD_OFFSET(KPCR, NtTib.ExceptionList) == KPCR_EXCEPTION_LIST);
+C_ASSERT(FIELD_OFFSET(KPCR, SelfPcr) == KPCR_SELF);
 C_ASSERT(FIELD_OFFSET(KPCR, IRR) == KPCR_IRR);
 C_ASSERT(FIELD_OFFSET(KPCR, IDR) == KPCR_IDR);
 C_ASSERT(FIELD_OFFSET(KPCR, Irql) == KPCR_IRQL);
@@ -235,5 +234,3 @@ C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, orig_ebp) == TF_ORIG_EBP);
 C_ASSERT(FIELD_OFFSET(KTSS, Esp0) == KTSS_ESP0);
 C_ASSERT(FIELD_OFFSET(KTSS, IoMapBase) == KTSS_IOMAPBASE);
 #endif
-
-#endif /* INCLUDE_INTERNAL_NTOSKRNL_H */
index 135895f..cba5dc5 100644 (file)
@@ -5,8 +5,8 @@
  * PURPOSE:         Internal header for PCI Support
  * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
  */
-#ifndef _PCI_
-#define _PCI_
+
+#pragma once
 
 //
 // PCI Type 1 Ports
@@ -103,5 +103,3 @@ typedef struct _PCI_CARD_DESCRIPTOR
     USHORT SubsystemID;
     USHORT Reserved;
 } PCI_CARD_DESCRIPTOR, *PPCI_CARD_DESCRIPTOR;
-
-#endif
index e45a0d9..01ddf3b 100644 (file)
 #define POTRACE(x, ...) DPRINT(__VA_ARGS__)
 #endif
 
+typedef struct _PO_HIBER_PERF
+{
+    ULONGLONG IoTicks;
+    ULONGLONG InitTicks;
+    ULONGLONG CopyTicks;
+    ULONGLONG StartCount;
+    ULONG ElapsedTime;
+    ULONG IoTime;
+    ULONG CopyTime;
+    ULONG InitTime;
+    ULONG PagesWritten;
+    ULONG PagesProcessed;
+    ULONG BytesCopied;
+    ULONG DumpCount;
+    ULONG FileRuns;
+} PO_HIBER_PERF, *PPO_HIBER_PERF;
+
+typedef struct _PO_MEMORY_IMAGE
+{
+    ULONG Signature;
+    ULONG Version;
+    ULONG CheckSum;
+    ULONG LengthSelf;
+    PFN_NUMBER PageSelf;
+    ULONG PageSize;
+    ULONG ImageType;
+    LARGE_INTEGER SystemTime;
+    ULONGLONG InterruptTime;
+    ULONG FeatureFlags;
+    UCHAR HiberFlags;
+    UCHAR spare[3];
+    ULONG NoHiberPtes;
+    ULONG_PTR HiberVa;
+    PHYSICAL_ADDRESS HiberPte;
+    ULONG NoFreePages;
+    ULONG FreeMapCheck;
+    ULONG WakeCheck;
+    PFN_NUMBER TotalPages;
+    PFN_NUMBER FirstTablePage;
+    PFN_NUMBER LastFilePage;
+    PO_HIBER_PERF PerfInfo;
+} PO_MEMORY_IMAGE, *PPO_MEMORY_IMAGE;
+
+typedef struct _PO_MEMORY_RANGE_ARRAY_RANGE
+{
+    PFN_NUMBER PageNo;
+    PFN_NUMBER StartPage;
+    PFN_NUMBER EndPage;
+    ULONG CheckSum;
+} PO_MEMORY_RANGE_ARRAY_RANGE;
+
+typedef struct _PO_MEMORY_RANGE_ARRAY_LINK
+{
+    struct _PO_MEMORY_RANGE_ARRAY *Next;
+    PFN_NUMBER NextTable;
+    ULONG CheckSum;
+    ULONG EntryCount;
+} PO_MEMORY_RANGE_ARRAY_LINK;
+
+typedef struct _PO_MEMORY_RANGE_ARRAY
+{
+    union
+    {
+        PO_MEMORY_RANGE_ARRAY_RANGE Range;
+        PO_MEMORY_RANGE_ARRAY_LINK Link;
+    };
+} PO_MEMORY_RANGE_ARRAY, *PPO_MEMORY_RANGE_ARRAY;
+
+typedef struct _POP_HIBER_CONTEXT
+{
+    BOOLEAN WriteToFile;
+    BOOLEAN ReserveLoaderMemory;
+    BOOLEAN ReserveFreeMemory;
+    BOOLEAN VerifyOnWake;
+    BOOLEAN Reset;
+    UCHAR HiberFlags;
+    BOOLEAN LinkFile;
+    HANDLE LinkFileHandle;
+    PKSPIN_LOCK Lock;
+    BOOLEAN MapFrozen;
+    RTL_BITMAP MemoryMap;
+    LIST_ENTRY ClonedRanges;
+    ULONG ClonedRangeCount;
+    PLIST_ENTRY NextCloneRange;
+    PFN_NUMBER NextPreserve;
+    PMDL LoaderMdl;
+    PMDL Clones;
+    PUCHAR NextClone;
+    ULONG NoClones;
+    PMDL Spares;
+    ULONGLONG PagesOut;
+    PVOID IoPage;
+    PVOID CurrentMcb;
+    PVOID DumpStack;
+    PKPROCESSOR_STATE WakeState;
+    ULONG NoRanges;
+    ULONG_PTR HiberVa;
+    PHYSICAL_ADDRESS HiberPte;
+    NTSTATUS Status;
+    PPO_MEMORY_IMAGE MemoryImage;
+    PPO_MEMORY_RANGE_ARRAY TableHead;
+    PVOID CompressionWorkspace;
+    PUCHAR CompressedWriteBuffer;
+    PULONG PerformanceStats;
+    PVOID CompressionBlock;
+    PVOID DmaIO;
+    PVOID TemporaryHeap;
+    PO_HIBER_PERF PerfInfo;
+} POP_HIBER_CONTEXT, *PPOP_HIBER_CONTEXT;
+
+typedef struct _PO_NOTIFY_ORDER_LEVEL
+{
+    KEVENT LevelReady;
+    ULONG DeviceCount;
+    ULONG ActiveCount;
+    LIST_ENTRY WaitSleep;
+    LIST_ENTRY ReadySleep;
+    LIST_ENTRY Pending;
+    LIST_ENTRY Complete;
+    LIST_ENTRY ReadyS0;
+    LIST_ENTRY WaitS0;
+} PO_NOTIFY_ORDER_LEVEL, *PPO_NOTIFY_ORDER_LEVEL;
+
+typedef struct _POP_SHUTDOWN_BUG_CHECK
+{
+    HANDLE ThreadHandle;
+    HANDLE ThreadId;
+    HANDLE ProcessId;
+    ULONG Code;
+    ULONG_PTR Parameter1;
+    ULONG_PTR Parameter2;
+    ULONG_PTR Parameter3;
+    ULONG_PTR Parameter4;
+} POP_SHUTDOWN_BUG_CHECK, *PPOP_SHUTDOWN_BUG_CHECK;
+
+typedef struct _POP_DEVICE_POWER_IRP
+{
+    SINGLE_LIST_ENTRY Free;
+    PIRP Irp;
+    PPO_DEVICE_NOTIFY Notify;
+    LIST_ENTRY Pending;
+    LIST_ENTRY Complete;
+    LIST_ENTRY Abort;
+    LIST_ENTRY Failed;
+} POP_DEVICE_POWER_IRP, *PPOP_DEVICE_POWER_IRP;
+
+typedef struct _PO_DEVICE_NOTIFY_ORDER
+{
+    ULONG DevNodeSequence;
+    PDEVICE_OBJECT *WarmEjectPdoPointer;
+    PO_NOTIFY_ORDER_LEVEL OrderLevel[8];
+} PO_DEVICE_NOTIFY_ORDER, *PPO_DEVICE_NOTIFY_ORDER;
+
+typedef struct _POP_DEVICE_SYS_STATE
+{
+    UCHAR IrpMinor;
+    SYSTEM_POWER_STATE SystemState;
+    PKEVENT Event;
+    KSPIN_LOCK SpinLock;
+    PKTHREAD Thread;
+    BOOLEAN GetNewDeviceList;
+    PO_DEVICE_NOTIFY_ORDER Order;
+    NTSTATUS Status;
+    PDEVICE_OBJECT FailedDevice;
+    BOOLEAN Waking;
+    BOOLEAN Cancelled;
+    BOOLEAN IgnoreErrors;
+    BOOLEAN IgnoreNotImplemented;
+    BOOLEAN _WaitAny;
+    BOOLEAN _WaitAll;
+    LIST_ENTRY PresentIrpQueue;
+    POP_DEVICE_POWER_IRP Head;
+    POP_DEVICE_POWER_IRP PowerIrpState[20];
+} POP_DEVICE_SYS_STATE, *PPOP_DEVICE_SYS_STATE;
+
+typedef struct _POP_POWER_ACTION
+{
+    UCHAR Updates;
+    UCHAR State;
+    BOOLEAN Shutdown;
+    POWER_ACTION Action;
+    SYSTEM_POWER_STATE LightestState;
+    ULONG Flags;
+    NTSTATUS Status;
+    UCHAR IrpMinor;
+    SYSTEM_POWER_STATE SystemState;
+    SYSTEM_POWER_STATE NextSystemState;
+    PPOP_SHUTDOWN_BUG_CHECK ShutdownBugCode;
+    PPOP_DEVICE_SYS_STATE DevState;
+    PPOP_HIBER_CONTEXT HiberContext;
+    ULONGLONG WakeTime;
+    ULONGLONG SleepTime;
+} POP_POWER_ACTION, *PPOP_POWER_ACTION;
+
+typedef enum _POP_DEVICE_IDLE_TYPE
+{
+    DeviceIdleNormal,
+    DeviceIdleDisk,
+} POP_DEVICE_IDLE_TYPE, *PPOP_DEVICE_IDLE_TYPE;
+
+typedef struct _POWER_CHANNEL_SUMMARY
+{
+    ULONG Signature;
+    ULONG TotalCount;
+    ULONG D0Count;
+    LIST_ENTRY NotifyList;
+} POWER_CHANNEL_SUMMARY, *PPOWER_CHANNEL_SUMMARY;
+    
+typedef struct  _DEVICE_OBJECT_POWER_EXTENSION
+{
+    ULONG IdleCount;
+    ULONG ConservationIdleTime;
+    ULONG PerformanceIdleTime;
+    PDEVICE_OBJECT DeviceObject;
+    LIST_ENTRY IdleList;
+    DEVICE_POWER_STATE State;
+    LIST_ENTRY NotifySourceList;
+    LIST_ENTRY NotifyTargetList;
+    POWER_CHANNEL_SUMMARY PowerChannelSummary;
+    LIST_ENTRY Volume;
+} DEVICE_OBJECT_POWER_EXTENSION, *PDEVICE_OBJECT_POWER_EXTENSION;
+
 //
 // Initialization routines
 //
@@ -47,6 +269,21 @@ PoInitializePrcb(
     IN PKPRCB Prcb
 );
 
+//
+// I/O Routines
+//
+VOID
+NTAPI
+PoInitializeDeviceObject(
+    IN OUT PDEVOBJ_EXTENSION DeviceObjectExtension
+);
+
+VOID
+NTAPI
+PoVolumeDevice(
+    IN PDEVICE_OBJECT DeviceObject
+);
+
 //
 // Power State routines
 //
@@ -78,7 +315,33 @@ PoNotifySystemTimeSet(
     VOID
 );
 
+//
+// Shutdown routines
+//
+VOID
+NTAPI
+PopReadShutdownPolicy(
+    VOID
+);
+
+VOID
+NTAPI
+PopGracefulShutdown(
+    IN PVOID Context
+);
+
+VOID
+NTAPI
+PopFlushVolumes(
+    IN BOOLEAN ShuttingDown
+);
+
 //
 // Global data inside the Power Manager
 //
 extern PDEVICE_NODE PopSystemPowerDeviceNode;
+extern KGUARDED_MUTEX PopVolumeLock;
+extern LIST_ENTRY PopVolumeDevices;
+extern KSPIN_LOCK PopDopeGlobalLock;
+extern POP_POWER_ACTION PopAction;
+
index 025cf21..daf84cf 100644 (file)
@@ -1,8 +1,5 @@
-#ifndef _INTRIN_INTERNAL_
-#define _INTRIN_INTERNAL_
+#pragma once
 
 #define Ke386SaveFlags(x) __asm__ __volatile__("mfmsr %0" : "=r" (x) :)
 
-#endif
-
 /* EOF */
index ba47ffc..87f48fd 100644 (file)
@@ -16,8 +16,8 @@
  *  with this program; if not, write to the Free Software Foundation, Inc.,
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_POWERPC_KE_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_POWERPC_KE_H
+
+#pragma once
 
 #include <ndk/powerpc/ketypes.h>
 
@@ -112,6 +112,4 @@ KiThreadStartup(PKSYSTEM_ROUTINE SystemRoutine,
 
 #endif /* __ASM__ */
 
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_POWERPC_KE_H */
-
 /* EOF */
index 4956e04..f02af65 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INCLUDE_INTERNAL_PROBE_H
-#define __INCLUDE_INTERNAL_PROBE_H
+#pragma once
 
 #include <reactos/probe.h>
 
@@ -118,5 +117,3 @@ DefaultQueryInfoBufferCheck(ULONG Class,
 
     return Status;
 }
-
-#endif
index 4ea3bd9..1848904 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_NLS_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_NLS_H
+#pragma once
 
 NTSTATUS
 NTAPI
@@ -16,6 +15,4 @@ RtlInitializeRangeListPackage(
     VOID
 );
 
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_NLS_H */
-
 /* EOF */
index 3ea68e5..034a555 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_SE_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_SE_H
+#pragma once
 
 extern POBJECT_TYPE SepTokenObjectType;
 
@@ -350,6 +349,4 @@ VOID NTAPI
 SeSetSecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation,
                         OUT PACCESS_MASK DesiredAccess);
 
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_SE_H */
-
 /* EOF */
index 8a23c7f..244665c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _NTOSKRNL_TAG_H
-#define _NTOSKRNL_TAG_H
+#pragma once
 
 /* formerly located in cc/view.c */
 #define TAG_CSEG  'GESC'
 
 #define TAG_WAIT            'tiaW'
 #define TAG_SEC_QUERY       'qSbO'
-
-#endif /* _NTOSKRNL_TAG_H */
index 5576a1d..34e0b77 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __NTOSKRNL_INCLUDE_INTERNAL_TEST_H
-#define __NTOSKRNL_INCLUDE_INTERNAL_TEST_H
+#pragma once
 
 typedef VOID
 NTAPI
@@ -35,5 +34,3 @@ PObReferenceObjectByHandle(
     PVOID* Object,
     POBJECT_HANDLE_INFORMATION HandleInformation
 );
-
-#endif /* __NTOSKRNL_INCLUDE_INTERNAL_TEST_H */
index 205aa54..3da6991 100644 (file)
@@ -5,8 +5,10 @@
  * PURPOSE:         Internal Inlined Functions for the Trap Handling Code
  * PROGRAMMERS:     ReactOS Portable Systems Group
  */
-#ifndef _TRAP_X_
-#define _TRAP_X_
+
+#pragma once
+
+//#define TRAP_DEBUG 1
 
 //
 // Unreachable code hint for GCC 4.5.x, older GCC versions, and MSVC
 #define UNREACHABLE
 #endif
 
+//
+// Helper Code
+//
+BOOLEAN
+FORCEINLINE
+KiUserTrap(IN PKTRAP_FRAME TrapFrame)
+{
+    /* Anything else but Ring 0 is Ring 3 */
+    return (TrapFrame->SegCs & MODE_MASK);
+}
+
 //
 // Debug Macros
 //
@@ -78,18 +91,19 @@ KiFillTrapFrameDebug(IN PKTRAP_FRAME TrapFrame)
     TrapFrame->DbgArgMark = 0xBADB0D00;
     TrapFrame->DbgEip = TrapFrame->Eip;
     TrapFrame->DbgEbp = TrapFrame->Ebp;   
+    TrapFrame->PreviousPreviousMode = -1;
 }
 
 VOID
 FORCEINLINE
 KiExitTrapDebugChecks(IN PKTRAP_FRAME TrapFrame,
-                      IN KTRAP_STATE_BITS SkipBits)
+                      IN KTRAP_EXIT_SKIP_BITS SkipBits)
 {
     /* Make sure interrupts are disabled */
     if (__readeflags() & EFLAGS_INTERRUPT_MASK)
     {
         DbgPrint("Exiting with interrupts enabled: %lx\n", __readeflags());
-        while (TRUE);
+        __debugbreak();
     }
     
     /* Make sure this is a real trap frame */
@@ -97,35 +111,35 @@ KiExitTrapDebugChecks(IN PKTRAP_FRAME TrapFrame,
     {
         DbgPrint("Exiting with an invalid trap frame? (No MAGIC in trap frame)\n");
         KiDumpTrapFrame(TrapFrame);
-        while (TRUE);
+        __debugbreak();
     }
     
     /* Make sure we're not in user-mode or something */
     if (Ke386GetFs() != KGDT_R0_PCR)
     {
         DbgPrint("Exiting with an invalid FS: %lx\n", Ke386GetFs());
-        while (TRUE);   
+        __debugbreak();
     }
     
     /* Make sure we have a valid SEH chain */
-    if (KeGetPcr()->Tib.ExceptionList == 0)
+    if (KeGetPcr()->NtTib.ExceptionList == 0)
     {
-        DbgPrint("Exiting with NULL exception chain: %p\n", KeGetPcr()->Tib.ExceptionList);
-        while (TRUE);
+        DbgPrint("Exiting with NULL exception chain: %p\n", KeGetPcr()->NtTib.ExceptionList);
+        __debugbreak();
     }
     
     /* Make sure we're restoring a valid SEH chain */
     if (TrapFrame->ExceptionList == 0)
     {
         DbgPrint("Entered a trap with a NULL exception chain: %p\n", TrapFrame->ExceptionList);
-        while (TRUE);
+        __debugbreak();
     }
     
     /* If we're ignoring previous mode, make sure caller doesn't actually want it */
     if ((SkipBits.SkipPreviousMode) && (TrapFrame->PreviousPreviousMode != -1))
     {
-        DbgPrint("Exiting a trap witout restoring previous mode, yet previous mode seems valid: %lx", TrapFrame->PreviousPreviousMode);
-        while (TRUE);
+        DbgPrint("Exiting a trap witout restoring previous mode, yet previous mode seems valid: %lx\n", TrapFrame->PreviousPreviousMode);
+        __debugbreak();
     }
 }
 
@@ -137,14 +151,14 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall,
     KIRQL OldIrql;
     
     /* Check if this was a user call */
-    if (KiUserMode(TrapFrame))
+    if (KiUserTrap(TrapFrame))
     {
         /* Make sure we are not returning with elevated IRQL */
         OldIrql = KeGetCurrentIrql();
         if (OldIrql != PASSIVE_LEVEL)
         {
             /* Forcibly put us in a sane state */
-            KeGetPcr()->CurrentIrql = PASSIVE_LEVEL;
+            KeGetPcr()->Irql = PASSIVE_LEVEL;
             _disable();
             
             /* Fail */
@@ -154,7 +168,7 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall,
                          0,
                          0);
         }
-        
+#if 0
         /* Make sure we're not attached and that APCs are not disabled */
         if ((KeGetCurrentThread()->ApcStateIndex != CurrentApcEnvironment) ||
             (KeGetCurrentThread()->CombinedApcDisable != 0))
@@ -166,6 +180,7 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall,
                          KeGetCurrentThread()->CombinedApcDisable,
                          0);
         }
+#endif
     }
 }
 #else
@@ -174,426 +189,29 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall,
 #define KiExitSystemCallDebugChecks(x, y)
 #endif
 
-//
-// Helper Code
-//
-BOOLEAN
-FORCEINLINE
-KiUserTrap(IN PKTRAP_FRAME TrapFrame)
-{
-    /* Anything else but Ring 0 is Ring 3 */
-    return (TrapFrame->SegCs & MODE_MASK);
-}
-
-//
-// "BOP" code used by VDM and V8086 Mode
-//
-VOID
-FORCEINLINE
-KiIssueBop(VOID)
-{
-    /* Invalid instruction that an invalid opcode handler must trap and handle */
-    asm volatile(".byte 0xC4\n.byte 0xC4\n");
-}
-
-//
-// Returns whether or not this is a V86 trap by checking the EFLAGS field.
-//
-// FIXME: GCC 4.5 Can Improve this with "goto labels"
-//
-BOOLEAN
-FORCEINLINE
-KiIsV8086TrapSafe(IN PKTRAP_FRAME TrapFrame)
-{
-    BOOLEAN Result;
-    
-    /*
-     * The check MUST be done this way, as we guarantee that no DS/ES/FS segment
-     * is used (since it might be garbage).
-     *
-     * Instead, we use the SS segment which is guaranteed to be correct. Because
-     * operate in 32-bit flat mode, this works just fine.
-     */
-     asm volatile
-     (
-        "testl $%c[f], %%ss:%1\n"
-        "setnz %0\n"
-        : "=a"(Result)
-        : "m"(TrapFrame->EFlags),
-          [f] "i"(EFLAGS_V86_MASK)
-     );
-    
-    /* If V86 flag was set */ 
-    return Result;
-}
-
-//
-// Returns whether or not this is a user-mode trap by checking the SegCs field.
-//
-// FIXME: GCC 4.5 Can Improve this with "goto labels"
-//
-BOOLEAN
-FORCEINLINE
-KiIsUserTrapSafe(IN PKTRAP_FRAME TrapFrame)
-{
-    BOOLEAN Result;
-    
-    /*
-     * The check MUST be done this way, as we guarantee that no DS/ES/FS segment
-     * is used (since it might be garbage).
-     *
-     * Instead, we use the SS segment which is guaranteed to be correct. Because
-     * operate in 32-bit flat mode, this works just fine.
-     */
-     asm volatile
-     (
-        "cmp $%c[f], %%ss:%1\n"
-        "setnz %0\n"
-        : "=a"(Result)
-        : "m"(TrapFrame->SegCs),
-          [f] "i"(KGDT_R0_CODE)
-     );
-    
-    /* If V86 flag was set */ 
-    return Result;
-}
-
-VOID
-FORCEINLINE
-KiUserSystemCall(IN PKTRAP_FRAME TrapFrame)
-{
-    /*
-     * Kernel call or user call?
-     *
-     * This decision is made in inlined assembly because we need to patch
-     * the relative offset of the user-mode jump to point to the SYSEXIT
-     * routine if the CPU supports it. The only way to guarantee that a
-     * relative jnz/jz instruction is generated is to force it with the
-     * inline assembler.
-     */
-    asm volatile
-    (
-        "test $1, %0\n" /* MODE_MASK */
-        ".globl _KiSystemCallExitBranch\n_KiSystemCallExitBranch:\n"
-        "jnz _KiSystemCallExit\n"
-        :
-        : "r"(TrapFrame->SegCs)
-    );
-}
-
-VOID
-FORCEINLINE
-KiSetSaneSegments(IN PKTRAP_FRAME TrapFrame)
-{
-    ULONG Ds, Es;
-    
-    /*
-     * We really have to get a good DS/ES first before touching any data.
-     *
-     * These two reads will either go in a register (with optimizations ON) or
-     * a stack variable (which is on SS:ESP, guaranteed to be good/valid).
-     *
-     * Because the assembly is marked volatile, the order of instructions is
-     * as-is, otherwise the optimizer could simply get rid of our DS/ES.
-     *
-     */
-    Ds = Ke386GetDs();
-    Es = Ke386GetEs();
-    Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
-    Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
-    TrapFrame->SegDs = Ds;
-    TrapFrame->SegEs = Es;
-}
-
-//
-// Generates an Exit Epilog Stub for the given name
-//
-#define KI_FUNCTION_CALL            0x1
-#define KI_EDITED_FRAME             0x2
-#define KI_DIRECT_EXIT              0x4
-#define KI_FAST_SYSTEM_CALL_EXIT    0x8
-#define KI_SYSTEM_CALL_EXIT         0x10
-#define KI_SYSTEM_CALL_JUMP         0x20
-#define KiTrapExitStub(x, y)        VOID FORCEINLINE DECLSPEC_NORETURN x(IN PKTRAP_FRAME TrapFrame) { KiTrapExit(TrapFrame, y); UNREACHABLE; }
-#define KiTrapExitStub2(x, y)       VOID FORCEINLINE x(IN PKTRAP_FRAME TrapFrame) { KiTrapExit(TrapFrame, y); }
-
-//
-// How volatiles will be restored
-//
-#define KI_EAX_NO_VOLATILES         0x0
-#define KI_EAX_ONLY                 0x1
-#define KI_ALL_VOLATILES            0x2
-
-//
-// Exit mechanism to use
-//
-#define KI_EXIT_IRET                0x0
-#define KI_EXIT_SYSEXIT             0x1
-#define KI_EXIT_JMP                 0x2
-#define KI_EXIT_RET                 0x3
-
-//
-// Master Trap Epilog
-//
-VOID
-FORCEINLINE
-KiTrapExit(IN PKTRAP_FRAME TrapFrame,
-          IN ULONG Flags)
-{
-    ULONG FrameSize = FIELD_OFFSET(KTRAP_FRAME, Eip);
-    ULONG ExitMechanism = KI_EXIT_IRET, Volatiles = KI_ALL_VOLATILES, NonVolatiles = TRUE;
-    ULONG EcxField = FIELD_OFFSET(KTRAP_FRAME, Ecx), EdxField = FIELD_OFFSET(KTRAP_FRAME, Edx);
-    
-    /* System call exit needs a special label */
-    if (Flags & KI_SYSTEM_CALL_EXIT) __asm__ __volatile__
-    (
-        ".globl _KiSystemCallExit\n_KiSystemCallExit:\n"
-    );
-            
-    /* Start by making the trap frame equal to the stack */
-    __asm__ __volatile__
-    (
-        "movl %0, %%esp\n"
-        :
-        : "r"(TrapFrame)
-        : "%esp"
-    );
-        
-    /* Check what kind of trap frame this trap requires */
-    if (Flags & KI_FUNCTION_CALL)
-    {
-        /* These calls have an EIP on the stack they need */
-        ExitMechanism = KI_EXIT_RET;
-        Volatiles = FALSE;
-    }
-    else if (Flags & KI_EDITED_FRAME)
-    {
-        /* Edited frames store a new ESP in the error code field */
-        FrameSize = FIELD_OFFSET(KTRAP_FRAME, ErrCode);
-    }
-    else if (Flags & KI_DIRECT_EXIT)
-    {
-        /* Exits directly without restoring anything, interrupt frame on stack */
-        NonVolatiles = Volatiles = FALSE;
-    }
-    else if (Flags & KI_FAST_SYSTEM_CALL_EXIT)
-    {
-        /* We have a fake interrupt stack with a ring transition */
-        FrameSize = FIELD_OFFSET(KTRAP_FRAME, V86Es);
-        ExitMechanism = KI_EXIT_SYSEXIT;
-        
-        /* SYSEXIT wants EIP in EDX and ESP in ECX */
-        EcxField = FIELD_OFFSET(KTRAP_FRAME, HardwareEsp);
-        EdxField = FIELD_OFFSET(KTRAP_FRAME, Eip);
-    }
-    else if (Flags & KI_SYSTEM_CALL_EXIT)
-    {
-        /* Only restore EAX */
-        NonVolatiles = KI_EAX_ONLY;
-    }
-    else if (Flags & KI_SYSTEM_CALL_JUMP)
-    {
-        /* We have a fake interrupt stack with no ring transition */
-        FrameSize = FIELD_OFFSET(KTRAP_FRAME, HardwareEsp);
-        NonVolatiles = KI_EAX_ONLY;
-        ExitMechanism = KI_EXIT_JMP;
-    }
-    
-    /* Restore the non volatiles */
-    if (NonVolatiles) __asm__ __volatile__
-    (
-        "movl %c[b](%%esp), %%ebx\n"
-        "movl %c[s](%%esp), %%esi\n"
-        "movl %c[i](%%esp), %%edi\n"
-        "movl %c[p](%%esp), %%ebp\n"
-        :
-        : [b] "i"(FIELD_OFFSET(KTRAP_FRAME, Ebx)),
-          [s] "i"(FIELD_OFFSET(KTRAP_FRAME, Esi)),
-          [i] "i"(FIELD_OFFSET(KTRAP_FRAME, Edi)),
-          [p] "i"(FIELD_OFFSET(KTRAP_FRAME, Ebp))
-        : "%esp"
-    );
-    
-    /* Restore EAX if volatiles must be restored */
-    if (Volatiles) __asm__ __volatile__
-    (
-        "movl %c[a](%%esp), %%eax\n":: [a] "i"(FIELD_OFFSET(KTRAP_FRAME, Eax)) : "%esp"
-    );
-    
-    /* Restore the other volatiles if needed */
-    if (Volatiles == KI_ALL_VOLATILES) __asm__ __volatile__
-    (
-        "movl %c[c](%%esp), %%ecx\n"
-        "movl %c[d](%%esp), %%edx\n"
-        :
-        : [c] "i"(EcxField),
-          [d] "i"(EdxField)
-        : "%esp"
-    );
-    
-    /* Ring 0 system calls jump back to EDX */
-    if (Flags & KI_SYSTEM_CALL_JUMP) __asm__ __volatile__
-    (
-        "movl %c[d](%%esp), %%edx\n":: [d] "i"(FIELD_OFFSET(KTRAP_FRAME, Eip)) : "%esp"
-    );
-
-    /* Now destroy the trap frame on the stack */
-    __asm__ __volatile__ ("addl $%c[e],%%esp\n":: [e] "i"(FrameSize) : "%esp");
-    
-    /* Edited traps need to change to a new ESP */
-    if (Flags & KI_EDITED_FRAME) __asm__ __volatile__ ("movl (%%esp), %%esp\n":::"%esp");
-
-    /* Check the exit mechanism and apply it */
-    if (ExitMechanism == KI_EXIT_RET) __asm__ __volatile__("ret\n"::: "%esp");
-    else if (ExitMechanism == KI_EXIT_IRET) __asm__ __volatile__("iret\n"::: "%esp");
-    else if (ExitMechanism == KI_EXIT_JMP) __asm__ __volatile__("jmp *%%edx\n.globl _KiSystemCallExit2\n_KiSystemCallExit2:\n"::: "%esp");
-    else if (ExitMechanism == KI_EXIT_SYSEXIT) __asm__ __volatile__("sti\nsysexit\n"::: "%esp");   
-}
-
-//
-// All the specific trap epilog stubs
-//
-KiTrapExitStub (KiTrapReturn,              0);
-KiTrapExitStub (KiDirectTrapReturn,        KI_DIRECT_EXIT);
-KiTrapExitStub (KiCallReturn,              KI_FUNCTION_CALL);
-KiTrapExitStub (KiEditedTrapReturn,        KI_EDITED_FRAME);
-KiTrapExitStub2(KiSystemCallReturn,        KI_SYSTEM_CALL_JUMP);
-KiTrapExitStub (KiSystemCallSysExitReturn, KI_FAST_SYSTEM_CALL_EXIT);
-KiTrapExitStub (KiSystemCallTrapReturn,    KI_SYSTEM_CALL_EXIT);
-
 //
 // Generic Exit Routine
 //
-VOID
-FORCEINLINE
-DECLSPEC_NORETURN
-KiExitTrap(IN PKTRAP_FRAME TrapFrame,
-           IN UCHAR Skip)
-{
-    KTRAP_EXIT_SKIP_BITS SkipBits = { .Bits = Skip };
-    PULONG ReturnStack;
-    
-    /* Debugging checks */
-    KiExitTrapDebugChecks(TrapFrame, SkipBits);
-
-    /* Restore the SEH handler chain */
-    KeGetPcr()->Tib.ExceptionList = TrapFrame->ExceptionList;
-    
-    /* Check if the previous mode must be restored */
-    if (__builtin_expect(!SkipBits.SkipPreviousMode, 0)) /* More INTS than SYSCALLs */
-    {
-        /* Restore it */
-        KeGetCurrentThread()->PreviousMode = TrapFrame->PreviousPreviousMode;
-    }
-
-    /* Check if there are active debug registers */
-    if (__builtin_expect(TrapFrame->Dr7 & ~DR7_RESERVED_MASK, 0))
-    {
-        /* Not handled yet */
-        DbgPrint("Need Hardware Breakpoint Support!\n");
-        DbgBreakPoint();
-        while (TRUE);
-    }
-    
-    /* Check if this was a V8086 trap */
-    if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 0)) KiTrapReturn(TrapFrame);
-
-    /* Check if the trap frame was edited */
-    if (__builtin_expect(!(TrapFrame->SegCs & FRAME_EDITED), 0))
-    {   
-        /*
-         * An edited trap frame happens when we need to modify CS and/or ESP but
-         * don't actually have a ring transition. This happens when a kernelmode
-         * caller wants to perform an NtContinue to another kernel address, such
-         * as in the case of SEH (basically, a longjmp), or to a user address.
-         *
-         * Therefore, the CPU never saved CS/ESP on the stack because we did not
-         * get a trap frame due to a ring transition (there was no interrupt).
-         * Even if we didn't want to restore CS to a new value, a problem occurs
-         * due to the fact a normal RET would not work if we restored ESP since
-         * RET would then try to read the result off the stack.
-         *
-         * The NT kernel solves this by adding 12 bytes of stack to the exiting
-         * trap frame, in which EFLAGS, CS, and EIP are stored, and then saving
-         * the ESP that's being requested into the ErrorCode field. It will then
-         * exit with an IRET. This fixes both issues, because it gives the stack
-         * some space where to hold the return address and then end up with the
-         * wanted stack, and it uses IRET which allows a new CS to be inputted.
-         *
-         */
-         
-        /* Set CS that is requested */
-        TrapFrame->SegCs = TrapFrame->TempSegCs;
-         
-        /* First make space on requested stack */
-        ReturnStack = (PULONG)(TrapFrame->TempEsp - 12);
-        TrapFrame->ErrCode = (ULONG_PTR)ReturnStack;
-         
-        /* Now copy IRET frame */
-        ReturnStack[0] = TrapFrame->Eip;
-        ReturnStack[1] = TrapFrame->SegCs;
-        ReturnStack[2] = TrapFrame->EFlags;
-        
-        /* Do special edited return */
-        KiEditedTrapReturn(TrapFrame);
-    }
-    
-    /* Check if this is a user trap */
-    if (__builtin_expect(KiUserTrap(TrapFrame), 1)) /* Ring 3 is where we spend time */
-    {
-        /* Check if segments should be restored */
-        if (!SkipBits.SkipSegments)
-        {
-            /* Restore segments */
-            Ke386SetGs(TrapFrame->SegGs);
-            Ke386SetEs(TrapFrame->SegEs);
-            Ke386SetDs(TrapFrame->SegDs);
-            Ke386SetFs(TrapFrame->SegFs);
-        }
-        
-        /* Always restore FS since it goes from KPCR to TEB */
-        Ke386SetFs(TrapFrame->SegFs);
-    }
-    
-    /* Check for system call -- a system call skips volatiles! */
-    if (__builtin_expect(SkipBits.SkipVolatiles, 0)) /* More INTs than SYSCALLs */
-    {
-        /* User or kernel call? */
-        KiUserSystemCall(TrapFrame);
-        
-        /* Restore EFLags */
-        __writeeflags(TrapFrame->EFlags);
-            
-        /* Call is kernel, so do a jump back since this wasn't a real INT */
-        KiSystemCallReturn(TrapFrame);
-
-        /* If we got here, this is SYSEXIT: are we stepping code? */
-        if (!(TrapFrame->EFlags & EFLAGS_TF))
-        {
-            /* Restore user FS */
-            Ke386SetFs(KGDT_R3_TEB | RPL_MASK);
+DECLSPEC_NORETURN VOID FASTCALL KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame);
+DECLSPEC_NORETURN VOID FASTCALL KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame);
+DECLSPEC_NORETURN VOID FASTCALL KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame);
+DECLSPEC_NORETURN VOID FASTCALL KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame);
+DECLSPEC_NORETURN VOID FASTCALL KiTrapReturn(IN PKTRAP_FRAME TrapFrame);
+DECLSPEC_NORETURN VOID FASTCALL KiTrapReturnNoSegments(IN PKTRAP_FRAME TrapFrame);
 
-            /* Remove interrupt flag */
-            TrapFrame->EFlags &= ~EFLAGS_INTERRUPT_MASK;
-            __writeeflags(TrapFrame->EFlags);
+typedef
+VOID
+(FASTCALL
+*PFAST_SYSTEM_CALL_EXIT)(IN PKTRAP_FRAME TrapFrame);
 
-            /* Exit through SYSEXIT */
-            KiSystemCallSysExitReturn(TrapFrame);
-        }
-        
-        /* Exit through IRETD, either due to debugging or due to lack of SYSEXIT */
-        KiSystemCallTrapReturn(TrapFrame);
-    }
-    
-    /* Return from interrupt */
-    KiTrapReturn(TrapFrame);
-}
+extern PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler;
 
 //
 // Virtual 8086 Mode Optimized Trap Exit
 //
 VOID
 FORCEINLINE
+DECLSPEC_NORETURN
 KiExitV86Trap(IN PKTRAP_FRAME TrapFrame)
 {
     PKTHREAD Thread;
@@ -603,6 +221,9 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame)
     Thread = KeGetCurrentThread();
     while (TRUE)
     {
+        /* Return if this isn't V86 mode anymore */
+        if (!(TrapFrame->EFlags & EFLAGS_V86_MASK)) KiEoiHelper(TrapFrame);;
+
         /* Turn off the alerted state for kernel mode */
         Thread->Alerted[KernelMode] = FALSE;
 
@@ -619,9 +240,6 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame)
         /* Restore IRQL and disable interrupts once again */
         KfLowerIrql(OldIrql);
         _disable();
-        
-        /* Return if this isn't V86 mode anymore */
-        if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 0)) return;
     }
      
     /* If we got here, we're still in a valid V8086 context, so quit it */
@@ -633,7 +251,7 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame)
     }
      
     /* Return from interrupt */
-    KiTrapReturn(TrapFrame);
+    KiTrapReturnNoSegments(TrapFrame);
 }
 
 //
@@ -643,17 +261,9 @@ VOID
 FORCEINLINE
 KiEnterV86Trap(IN PKTRAP_FRAME TrapFrame)
 {
-    /* Load correct registers */
-    Ke386SetFs(KGDT_R0_PCR);
-    Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
-    Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
-
     /* Save exception list */
-    TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList;
+    TrapFrame->ExceptionList = KeGetPcr()->NtTib.ExceptionList;
 
-    /* Clear direction flag */
-    Ke386ClearDirectionFlag();
-    
     /* Save DR7 and check for debugging */
     TrapFrame->Dr7 = __readdr(7);
     if (__builtin_expect(TrapFrame->Dr7 & ~DR7_RESERVED_MASK, 0))
@@ -670,40 +280,10 @@ VOID
 FORCEINLINE
 KiEnterInterruptTrap(IN PKTRAP_FRAME TrapFrame)
 {
-    /* Check for V86 mode, otherwise check for ring 3 code */
-    if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 0))
-    {
-        /* Set correct segments */
-        Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
-        Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
-        Ke386SetFs(KGDT_R0_PCR);
-
-        /* Restore V8086 segments into Protected Mode segments */
-        TrapFrame->SegFs = TrapFrame->V86Fs;
-        TrapFrame->SegGs = TrapFrame->V86Gs;
-        TrapFrame->SegDs = TrapFrame->V86Ds;
-        TrapFrame->SegEs = TrapFrame->V86Es;
-    }
-    else if (__builtin_expect(KiIsUserTrapSafe(TrapFrame), 1)) /* Ring 3 is more common */
-    {
-        /* Switch to sane segments */
-        KiSetSaneSegments(TrapFrame);
-
-        /* Save FS/GS */
-        TrapFrame->SegFs = Ke386GetFs();
-        TrapFrame->SegGs = Ke386GetGs();
-        
-        /* Set correct FS */
-        Ke386SetFs(KGDT_R0_PCR);
-    }       
-    
     /* Save exception list and terminate it */
-    TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList;
-    KeGetPcr()->Tib.ExceptionList = EXCEPTION_CHAIN_END;
+    TrapFrame->ExceptionList = KeGetPcr()->NtTib.ExceptionList;
+    KeGetPcr()->NtTib.ExceptionList = EXCEPTION_CHAIN_END;
 
-    /* Clear direction flag */
-    Ke386ClearDirectionFlag();
-    
     /* Flush DR7 and check for debugging */
     TrapFrame->Dr7 = 0;
     if (__builtin_expect(KeGetCurrentThread()->DispatcherHeader.DebugActive & 0xFF, 0))
@@ -723,29 +303,8 @@ VOID
 FORCEINLINE
 KiEnterTrap(IN PKTRAP_FRAME TrapFrame)
 {
-    /* Switch to sane segments */
-    KiSetSaneSegments(TrapFrame);
-        
-    /* Now we can save the other segments and then switch to the correct FS */
-    TrapFrame->SegFs = Ke386GetFs();
-    TrapFrame->SegGs = Ke386GetGs();
-    Ke386SetFs(KGDT_R0_PCR);
-
     /* Save exception list */
-    TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList;
-    
-    /* Check for V86 mode */
-    if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 0))
-    {
-        /* Restore V8086 segments into Protected Mode segments */
-        TrapFrame->SegFs = TrapFrame->V86Fs;
-        TrapFrame->SegGs = TrapFrame->V86Gs;
-        TrapFrame->SegDs = TrapFrame->V86Ds;
-        TrapFrame->SegEs = TrapFrame->V86Es;
-    }
-
-    /* Clear direction flag */
-    Ke386ClearDirectionFlag();
+    TrapFrame->ExceptionList = KeGetPcr()->NtTib.ExceptionList;
     
     /* Flush DR7 and check for debugging */
     TrapFrame->Dr7 = 0;
@@ -758,131 +317,3 @@ KiEnterTrap(IN PKTRAP_FRAME TrapFrame)
     /* Set debug header */
     KiFillTrapFrameDebug(TrapFrame);
 }
-
-//
-// Generates a Trap Prolog Stub for the given name
-//
-#define KI_PUSH_FAKE_ERROR_CODE 0x1
-#define KI_UNUSED               0x2
-#define KI_NONVOLATILES_ONLY    0x4
-#define KI_FAST_SYSTEM_CALL     0x8
-#define KI_SOFTWARE_TRAP        0x10
-#define KI_HARDWARE_INT         0x20
-#define KiTrap(x, y)            VOID DECLSPEC_NORETURN x(VOID) { KiTrapStub(y, x##Handler); UNREACHABLE; }
-#define KiTrampoline(x, y)      VOID DECLSPEC_NOINLINE x(VOID) { KiTrapStub(y, x##Handler); }
-
-//
-// Trap Prolog Stub
-//
-VOID
-FORCEINLINE
-KiTrapStub(IN ULONG Flags,
-           IN PVOID Handler)
-{
-    ULONG FrameSize;
-    
-    /* Is this a fast system call? They don't have a stack! */
-    if (Flags & KI_FAST_SYSTEM_CALL) __asm__ __volatile__
-    (
-        "movl %%ss:%c[t], %%esp\n"
-        "movl %c[e](%%esp), %%esp\n"
-        :
-        : [e] "i"(FIELD_OFFSET(KTSS, Esp0)),
-          [t] "i"(&PCR->TSS)
-        : "%esp"
-    );
-    
-    /* Check what kind of trap frame this trap requires */
-    if (Flags & KI_SOFTWARE_TRAP)
-    {
-        /* Software traps need a complete non-ring transition trap frame */
-        FrameSize = FIELD_OFFSET(KTRAP_FRAME, HardwareEsp);
-    }
-    else if (Flags & KI_FAST_SYSTEM_CALL)
-    {
-        /* SYSENTER requires us to build a complete ring transition trap frame */
-        FrameSize = FIELD_OFFSET(KTRAP_FRAME, V86Es);
-        
-        /* And it only preserves nonvolatile registers */
-        Flags |= KI_NONVOLATILES_ONLY;
-    }
-    else if (Flags & KI_PUSH_FAKE_ERROR_CODE)
-    {
-        /* If the trap doesn't have an error code, we'll make space for it */
-        FrameSize = FIELD_OFFSET(KTRAP_FRAME, Eip);
-    }
-    else
-    {
-        /* The trap already has an error code, so just make space for the rest */
-        FrameSize = FIELD_OFFSET(KTRAP_FRAME, ErrCode);
-    }
-    
-    /* Software traps need to get their EIP from the caller's frame */
-    if (Flags & KI_SOFTWARE_TRAP) __asm__ __volatile__ ("popl %%eax\n":::"%esp");
-    
-    /* Save nonvolatile registers */
-    __asm__ __volatile__
-    (
-        /* EBX, ESI, EDI and EBP are saved */
-        "movl %%ebp, %c[p](%%esp)\n"
-        "movl %%ebx, %c[b](%%esp)\n"
-        "movl %%esi, %c[s](%%esp)\n"
-        "movl %%edi, %c[i](%%esp)\n"
-        :
-        : [b] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ebx)),
-          [s] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Esi)),
-          [i] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Edi)),
-          [p] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ebp))
-        : "%esp"
-    );
-    
-    /* Does the caller want nonvolatiles only? */
-    if (!(Flags & KI_NONVOLATILES_ONLY)) __asm__ __volatile__
-    (
-        /* Otherwise, save the volatiles as well */
-        "movl %%eax, %c[a](%%esp)\n"
-        "movl %%ecx, %c[c](%%esp)\n"
-        "movl %%edx, %c[d](%%esp)\n"
-        :
-        : [a] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Eax)),
-          [c] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ecx)),
-          [d] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Edx))
-        : "%esp"
-    );
-
-    /* Now set parameter 1 (ECX) to point to the frame */
-    __asm__ __volatile__ ("movl %%esp, %%ecx\n":::"%esp");
-    
-    /* Now go ahead and make space for this frame */
-    __asm__ __volatile__ ("subl $%c[e],%%esp\n":: [e] "i"(FrameSize) : "%esp");
-    __asm__ __volatile__ ("subl $%c[e],%%ecx\n":: [e] "i"(FrameSize) : "%ecx");
-
-    /*
-     * For hardware interrupts, set parameter 2 (EDX) to hold KINTERRUPT.
-     * This code will be dynamically patched when an interrupt is registered!
-     */  
-    if (Flags & KI_HARDWARE_INT) __asm__ __volatile__
-    (
-        ".globl _KiInterruptTemplate2ndDispatch\n_KiInterruptTemplate2ndDispatch:\n"
-        "movl $0, %%edx\n"
-        ".globl _KiInterruptTemplateObject\n_KiInterruptTemplateObject:\n"
-        ::: "%edx"
-    );
-    
-    /* Now jump to the C handler */
-    if (Flags & KI_HARDWARE_INT)__asm__ __volatile__
-    (
-        /*
-         * For hardware interrupts, use an absolute JMP instead of a relative JMP
-         * since the position of this code is arbitrary in memory, and therefore
-         * the compiler-generated offset will not be correct.
-         */
-        "jmp *%0\n"
-        ".globl _KiInterruptTemplateDispatch\n_KiInterruptTemplateDispatch:\n"
-        :
-        : "a"(Handler)
-    );
-    else __asm__ __volatile__ ("jmp %c[x]\n":: [x] "i"(Handler));
-}
-
-#endif
index 71f4f65..f1052ed 100644 (file)
@@ -1,5 +1,101 @@
-#include "precomp.h"
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Kernel
+ * FILE:            ntoskrnl/include/ntoskrnl.h
+ * PURPOSE:         Main Kernel Header
+ * PROGRAMMER:      Alex Ionescu (alex@relsoft.net)
+ */
+
+/* INCLUDES ******************************************************************/
+
+/* ARM Bringup Hack */
+#ifdef _M_ARM
+#define DbgPrint DbgPrintEarly
+#endif
+
+/* Version Data */
+#undef __MSVCRT__
+#include <psdk/ntverp.h>
+
+/* DDK/IFS/NDK Headers */
+#define _REALLY_GET_CALLERS_CALLER
+#define SINGLE_GROUP_LEGACY_API
+#include <excpt.h>
+#include <ntdef.h>
+#include <ntifs.h>
+#include <wdmguid.h>
+#include <arc/arc.h>
+#undef NTHALAPI
+#define NTHALAPI __declspec(dllimport)
+#include <ntndk.h>
+#undef TEXT
+#define TEXT(s) L##s
+#include <regstr.h>
+
+/* FIXME: Temporary until Winldr is used */
+#include <rosldr.h>
+
+/* C Headers */
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <malloc.h>
+#include <wchar.h>
+
+/* SEH support with PSEH */
+#include <pseh/pseh2.h>
+
+/* ReactOS Headers */
+#include <reactos/buildno.h>
+#include <reactos/bugcodes.h>
+
+/* SetupLDR Support */
+#include <arc/setupblk.h>
+
+/* KD Support */
+#define NOEXTAPI
+#include <windbgkd.h>
+#include <wdbgexts.h>
+#include <kddll.h>
+#ifndef _WINKD_
+#include <reactos/rossym.h>
+#endif
+
+/* PNP GUIDs */
+#include <umpnpmgr/sysguid.h>
+
+/* Internal Headers */
+#include "internal/ntoskrnl.h"
+#include "config.h"
 
-/* Headers that shouldn't be precompiled due to GCC bugs */
 #include <reactos/probe.h>
 #include "internal/probe.h"
+#include "resource.h"
+
+//
+// Define the internal versions of external and public global data
+//
+#define IoFileObjectType                _IoFileObjectType
+#define PsThreadType                    _PsThreadType
+#define PsProcessType                   _PsProcessType
+#define ExEventObjectType               _ExEventObjectType
+#define ExSemaphoreObjectType           _ExSemaphoreObjectType
+#define KdDebuggerEnabled               _KdDebuggerEnabled
+#define KdDebuggerNotPresent            _KdDebuggerNotPresent
+#define NlsOemLeadByteInfo              _NlsOemLeadByteInfo
+extern PUSHORT _NlsOemLeadByteInfo;
+#define FsRtlLegalAnsiCharacterArray    _FsRtlLegalAnsiCharacterArray
+#undef LEGAL_ANSI_CHARACTER_ARRAY
+#undef NLS_MB_CODE_PAGE_TAG
+#undef NLS_OEM_LEAD_BYTE_INFO
+#define LEGAL_ANSI_CHARACTER_ARRAY      FsRtlLegalAnsiCharacterArray
+#define NLS_MB_CODE_PAGE_TAG            NlsMbOemCodePageTag
+#define NLS_OEM_LEAD_BYTE_INFO          _NlsOemLeadByteInfo
+#undef KD_DEBUGGER_ENABLED
+#undef KD_DEBUGGER_NOT_PRESENT
+#define KD_DEBUGGER_ENABLED             KdDebuggerEnabled
+#define KD_DEBUGGER_NOT_PRESENT         KdDebuggerNotPresent
+#define HalDispatchTable                _HalDispatchTable
+#undef HALDISPATCH
+#define HALDISPATCH                     (&HalDispatchTable)
+#define ExRaiseStatus RtlRaiseStatus
diff --git a/reactos/ntoskrnl/include/precomp.h b/reactos/ntoskrnl/include/precomp.h
deleted file mode 100644 (file)
index 8974e9b..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS Kernel
- * FILE:            ntoskrnl/include/ntoskrnl.h
- * PURPOSE:         Main Kernel Header
- * PROGRAMMER:      Alex Ionescu (alex@relsoft.net)
- */
-
-/* INCLUDES ******************************************************************/
-
-/* Version Data */
-#undef __MSVCRT__
-#include <psdk/ntverp.h>
-
-/* DDK/IFS/NDK Headers */
-#define _REALLY_GET_CALLERS_CALLER
-#include <excpt.h>
-#include <ntdef.h>
-#undef DECLSPEC_IMPORT
-#define DECLSPEC_IMPORT
-#include <ntifs.h>
-#include <wdmguid.h>
-#include <arc/arc.h>
-#undef NTHALAPI
-#define NTHALAPI __declspec(dllimport)
-#include <ntndk.h>
-#undef TEXT
-#define TEXT(s) L##s
-#include <regstr.h>
-
-/* FIXME: Temporary until Winldr is used */
-#include <rosldr.h>
-
-/* C Headers */
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <malloc.h>
-#include <wchar.h>
-
-/* SEH support with PSEH */
-#include <pseh/pseh2.h>
-
-/* ReactOS Headers */
-#include <reactos/buildno.h>
-#include <reactos/bugcodes.h>
-
-/* SetupLDR Support */
-#include <arc/setupblk.h>
-
-/* KD Support */
-#define NOEXTAPI
-#include <windbgkd.h>
-#include <wdbgexts.h>
-#include <kddll.h>
-#ifndef _WINKD_
-#include <reactos/rossym.h>
-#endif
-
-/* PNP GUIDs */
-#include <umpnpmgr/sysguid.h>
-
-/* Internal Headers */
-#include "internal/ntoskrnl.h"
-#include "config.h"
-
-//
-// Define the internal versions of external and public global data
-//
-#define IoFileObjectType                _IoFileObjectType
-#define PsThreadType                    _PsThreadType
-#define PsProcessType                   _PsProcessType
-#define ExEventObjectType               _ExEventObjectType
-#define ExSemaphoreObjectType           _ExSemaphoreObjectType
-#define KdDebuggerEnabled               _KdDebuggerEnabled
-#define KdDebuggerNotPresent            _KdDebuggerNotPresent
-#define NlsOemLeadByteInfo              _NlsOemLeadByteInfo
-extern PUSHORT _NlsOemLeadByteInfo;
-#define FsRtlLegalAnsiCharacterArray    _FsRtlLegalAnsiCharacterArray
-#undef LEGAL_ANSI_CHARACTER_ARRAY
-#undef NLS_MB_CODE_PAGE_TAG
-#undef NLS_OEM_LEAD_BYTE_INFO
-#define LEGAL_ANSI_CHARACTER_ARRAY      FsRtlLegalAnsiCharacterArray
-#define NLS_MB_CODE_PAGE_TAG            NlsMbOemCodePageTag
-#define NLS_OEM_LEAD_BYTE_INFO          _NlsOemLeadByteInfo
-#undef KD_DEBUGGER_ENABLED
-#undef KD_DEBUGGER_NOT_PRESENT
-#define KD_DEBUGGER_ENABLED             KdDebuggerEnabled
-#define KD_DEBUGGER_NOT_PRESENT         KdDebuggerNotPresent
-#define HalDispatchTable                _HalDispatchTable
-#undef HALDISPATCH
-#define HALDISPATCH                     (&HalDispatchTable)
-#define ExRaiseStatus RtlRaiseStatus
diff --git a/reactos/ntoskrnl/include/resource.h b/reactos/ntoskrnl/include/resource.h
new file mode 100644 (file)
index 0000000..b9bdd54
--- /dev/null
@@ -0,0 +1,23 @@
+#pragma once
+
+#define IDB_BOOT_LOGO       1
+#define IDB_HIBERNATE_LOGO  2
+#define IDB_SHUTDOWN_LOGO   3
+#define IDB_LOGO            5
+#define IDB_LOGO_HEADER     6
+#define IDB_LOGO_BAND       7
+
+#define IDB_BAR_SERVER      4
+#define IDB_BAR_PRO         8
+#define IDB_BAR_HOME        9
+
+#define IDB_PROF_TEXT       10
+#define IDB_HOME_TEXT       11
+#define IDB_EMBEDDED_TEXT   12
+#define IDB_MCE_TEXT        18
+
+#define IDB_SERVER_LOGO     13
+#define IDB_SERVER_HEADER   14
+#define IDB_SERVER_BAND     15
+#define IDB_STORAGE_SERVER  16
+#define IDB_CLUSTER_SERVER  17
index 482f730..7434970 100644 (file)
 /* GLOBALS ********************************************************************/
 
 ULONG IopDeviceObjectNumber = 0;
-
 LIST_ENTRY ShutdownListHead, LastChanceShutdownListHead;
 KSPIN_LOCK ShutdownListLock;
+extern LIST_ENTRY IopDiskFsListHead;
+extern LIST_ENTRY IopCdRomFsListHead;
+extern LIST_ENTRY IopTapeFsListHead;
 
 /* PRIVATE FUNCTIONS **********************************************************/
 
@@ -95,7 +97,15 @@ IopAttachDeviceToDeviceStackSafe(IN PDEVICE_OBJECT SourceDevice,
 
 VOID
 NTAPI
-IoShutdownRegisteredDevices(VOID)
+IoShutdownPnpDevices(VOID)
+{
+    /* This routine is only used by Driver Verifier to validate shutdown */
+    return;
+}
+
+VOID
+NTAPI
+IoShutdownSystem(IN ULONG Phase)
 {
     PLIST_ENTRY ListEntry;
     PDEVICE_OBJECT DeviceObject;
@@ -104,46 +114,108 @@ IoShutdownRegisteredDevices(VOID)
     PIRP Irp;
     KEVENT Event;
     NTSTATUS Status;
-
+        
     /* Initialize an event to wait on */
     KeInitializeEvent(&Event, NotificationEvent, FALSE);
-
-    /* Get the first entry and start looping */
-    ListEntry = ExInterlockedRemoveHeadList(&ShutdownListHead,
-                                            &ShutdownListLock);
-    while (ListEntry)
+    
+    /* What phase? */
+    if (Phase == 0)
     {
-        /* Get the shutdown entry */
-        ShutdownEntry = CONTAINING_RECORD(ListEntry,
-                                          SHUTDOWN_ENTRY,
-                                          ShutdownList);
+        /* Shutdown PnP */
+        IoShutdownPnpDevices();
 
-        /* Get the attached device */
-        DeviceObject = IoGetAttachedDevice(ShutdownEntry->DeviceObject);
-
-        /* Build the shutdown IRP and call the driver */
-        Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,
-                                           DeviceObject,
-                                           NULL,
-                                           0,
-                                           NULL,
-                                           &Event,
-                                           &StatusBlock);
-        Status = IoCallDriver(DeviceObject, Irp);
-        if (Status == STATUS_PENDING)
+        /* Loop first-chance shutdown notifications */
+        ListEntry = ExInterlockedRemoveHeadList(&ShutdownListHead,
+                                                &ShutdownListLock);
+        while (ListEntry)
         {
-            /* Wait on the driver */
-            KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
-        }
+            /* Get the shutdown entry */
+            ShutdownEntry = CONTAINING_RECORD(ListEntry,
+                                              SHUTDOWN_ENTRY,
+                                              ShutdownList);
+
+            /* Get the attached device */
+            DeviceObject = IoGetAttachedDevice(ShutdownEntry->DeviceObject);
+
+            /* Build the shutdown IRP and call the driver */
+            Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,
+                                               DeviceObject,
+                                               NULL,
+                                               0,
+                                               NULL,
+                                               &Event,
+                                               &StatusBlock);
+            Status = IoCallDriver(DeviceObject, Irp);
+            if (Status == STATUS_PENDING)
+            {
+                /* Wait on the driver */
+                KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+            }
 
-        /* Free the shutdown entry and reset the event */
-        ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY);
-        KeClearEvent(&Event);
+            /* Get rid of our reference to it */
+            ObDereferenceObject(DeviceObject);
+            
+            /* Free the shutdown entry and reset the event */
+            ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY);
+            KeClearEvent(&Event);
 
-        /* Go to the next entry */
-        ListEntry = ExInterlockedRemoveHeadList(&ShutdownListHead,
+            /* Go to the next entry */
+            ListEntry = ExInterlockedRemoveHeadList(&ShutdownListHead,
+                                                    &ShutdownListLock);
+         }
+    }
+    else if (Phase == 1)
+    {
+        /* Shutdown disk file systems */
+        IopShutdownBaseFileSystems(&IopDiskFsListHead);
+
+        /* Shutdown cdrom file systems */
+        IopShutdownBaseFileSystems(&IopCdRomFsListHead);
+
+        /* Shutdown tape filesystems */
+        IopShutdownBaseFileSystems(&IopTapeFsListHead);
+        
+        /* Loop last-chance shutdown notifications */
+        ListEntry = ExInterlockedRemoveHeadList(&LastChanceShutdownListHead,
                                                 &ShutdownListLock);
-     }
+        while (ListEntry)
+        {
+            /* Get the shutdown entry */
+            ShutdownEntry = CONTAINING_RECORD(ListEntry,
+                                              SHUTDOWN_ENTRY,
+                                              ShutdownList);
+
+            /* Get the attached device */
+            DeviceObject = IoGetAttachedDevice(ShutdownEntry->DeviceObject);
+
+            /* Build the shutdown IRP and call the driver */
+            Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,
+                                               DeviceObject,
+                                               NULL,
+                                               0,
+                                               NULL,
+                                               &Event,
+                                               &StatusBlock);
+            Status = IoCallDriver(DeviceObject, Irp);
+            if (Status == STATUS_PENDING)
+            {
+                /* Wait on the driver */
+                KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+            }
+
+            /* Get rid of our reference to it */
+            ObDereferenceObject(DeviceObject);
+            
+            /* Free the shutdown entry and reset the event */
+            ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY);
+            KeClearEvent(&Event);
+
+            /* Go to the next entry */
+            ListEntry = ExInterlockedRemoveHeadList(&LastChanceShutdownListHead,
+                                                    &ShutdownListLock);
+         }
+
+    }
 }
 
 NTSTATUS
@@ -843,6 +915,9 @@ IoCreateDevice(IN PDRIVER_OBJECT DriverObject,
     /* Set the Type and Size. Question: why is Size 0 on Windows? */
     DeviceObjectExtension->Type = IO_TYPE_DEVICE_OBJECT_EXTENSION;
     DeviceObjectExtension->Size = 0;
+    
+    /* Initialize with Power Manager */
+    PoInitializeDeviceObject(DeviceObjectExtension);
 
     /* Link the Object and Extension */
     DeviceObjectExtension->DeviceObject = CreatedDeviceObject;
@@ -932,6 +1007,9 @@ IoCreateDevice(IN PDRIVER_OBJECT DriverObject,
     ASSERT((DriverObject->Flags & DRVO_UNLOAD_INVOKED) == 0);
     CreatedDeviceObject->DriverObject = DriverObject;
     IopEditDeviceList(DriverObject, CreatedDeviceObject, IopAdd);
+    
+    /* Link with the power manager */
+    if (CreatedDeviceObject->Vpb) PoVolumeDevice(CreatedDeviceObject);
 
     /* Close the temporary handle and return to caller */
     ObCloseHandle(TempHandle, KernelMode);
@@ -1351,6 +1429,9 @@ IoRegisterLastChanceShutdownNotification(IN PDEVICE_OBJECT DeviceObject)
 
     /* Set the DO */
     Entry->DeviceObject = DeviceObject;
+    
+    /* Reference it so it doesn't go away */
+    ObReferenceObject(DeviceObject);
 
     /* Insert it into the list */
     ExInterlockedInsertHeadList(&LastChanceShutdownListHead,
@@ -1379,6 +1460,9 @@ IoRegisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
 
     /* Set the DO */
     Entry->DeviceObject = DeviceObject;
+    
+    /* Reference it so it doesn't go away */
+    ObReferenceObject(DeviceObject);
 
     /* Insert it into the list */
     ExInterlockedInsertHeadList(&ShutdownListHead,
@@ -1420,6 +1504,9 @@ IoUnregisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
 
             /* Free the entry */
             ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY);
+            
+            /* Get rid of our reference to it */
+            ObDereferenceObject(DeviceObject);
         }
 
         /* Go to the next entry */
@@ -1444,6 +1531,9 @@ IoUnregisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
 
             /* Free the entry */
             ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY);
+            
+            /* Get rid of our reference to it */
+            ObDereferenceObject(DeviceObject);
         }
 
         /* Go to the next entry */
index 4dc022f..ef1b789 100644 (file)
@@ -149,6 +149,39 @@ IopGetDriverObject(
    return STATUS_SUCCESS;
 }
 
+/*
+ * RETURNS
+ *  TRUE if String2 contains String1 as a suffix.
+ */
+BOOLEAN
+NTAPI
+IopSuffixUnicodeString(
+    IN PCUNICODE_STRING String1,
+    IN PCUNICODE_STRING String2)
+{
+    PWCHAR pc1;
+    PWCHAR pc2;
+    ULONG Length;
+
+    if (String2->Length < String1->Length)
+        return FALSE;
+
+    Length = String1->Length / 2;
+    pc1 = String1->Buffer;
+    pc2 = &String2->Buffer[String2->Length / sizeof(WCHAR) - Length];
+
+    if (pc1 && pc2)
+    {
+        while (Length--)
+        {
+            if( *pc1++ != *pc2++ )
+                return FALSE;
+        }
+        return TRUE;
+    }
+    return FALSE;
+}
+
 /*
  * IopDisplayLoadingMessage
  *
@@ -158,35 +191,19 @@ IopGetDriverObject(
 VOID 
 FASTCALL
 INIT_FUNCTION
-IopDisplayLoadingMessage(PVOID ServiceName, 
-                         BOOLEAN Unicode)
+IopDisplayLoadingMessage(PUNICODE_STRING ServiceName)
 {
     CHAR TextBuffer[256];
-    PCHAR Extra = ".sys";
+    UNICODE_STRING DotSys = RTL_CONSTANT_STRING(L".SYS");
 
     if (ExpInTextModeSetup) return;
-    if (Unicode)
-    {
-        if (wcsstr(_wcsupr(ServiceName), L".SYS")) Extra = "";
-        sprintf(TextBuffer,
-                "%s%s%s\\%S%s\n",
-                KeLoaderBlock->ArcBootDeviceName,
-                KeLoaderBlock->NtBootPathName,
-                "System32\\Drivers",
-                (PWCHAR)ServiceName,
-                Extra);
-    }
-    else
-    {
-        if (strstr(_strupr(ServiceName), ".SYS")) Extra = "";
-        sprintf(TextBuffer,
-                "%s%s%s\\%s%s\n",
-                KeLoaderBlock->ArcBootDeviceName,
-                KeLoaderBlock->NtBootPathName,
-                "System32\\Drivers",
-                (PCHAR)ServiceName,
-                Extra);
-    }
+    RtlUpcaseUnicodeString(ServiceName, ServiceName, FALSE);
+    snprintf(TextBuffer, sizeof(TextBuffer),
+            "%s%sSystem32\\Drivers\\%wZ%s\n",
+            KeLoaderBlock->ArcBootDeviceName,
+            KeLoaderBlock->NtBootPathName,
+            ServiceName,
+            IopSuffixUnicodeString(&DotSys, ServiceName) ? "" : ".SYS");
     HalDisplayString(TextBuffer);
 }
 
@@ -788,7 +805,8 @@ IopInitializeBuiltinDriver(IN PLDR_DATA_TABLE_ENTRY LdrEntry)
    /*
     * Display 'Loading XXX...' message
     */
-   IopDisplayLoadingMessage(ModuleName->Buffer, TRUE);
+   IopDisplayLoadingMessage(ModuleName);
+   InbvIndicateProgress();
 
    /*
     * Generate filename without path (not needed by freeldr)
index 0706845..e15aab2 100644 (file)
@@ -48,8 +48,7 @@ extern BOOLEAN NoGuiBoot;
 VOID
 FASTCALL
 INIT_FUNCTION
-IopDisplayLoadingMessage(PVOID ServiceName,
-                         BOOLEAN Unicode);
+IopDisplayLoadingMessage(PUNICODE_STRING ServiceName);
 
 /* PRIVATE FUNCTIONS **********************************************************/
 
@@ -415,8 +414,20 @@ 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);
 
-   IopDisplayLoadingMessage(Service->ServiceName.Buffer, TRUE);
    Status = ZwLoadDriver(&Service->RegistryPath);
    IopBootLog(&Service->ImagePath, NT_SUCCESS(Status) ? TRUE : FALSE);
    if (!NT_SUCCESS(Status))
@@ -507,6 +518,7 @@ IopInitializeSystemDrivers(VOID)
                 {
                     DPRINT("  Path: %wZ\n", &CurrentService->RegistryPath);
                     Status = IopLoadDriver(CurrentService);
+                    InbvIndicateProgress();
                 }
             }
         }
@@ -538,7 +550,9 @@ IopInitializeSystemDrivers(VOID)
                 {
                     DPRINT("  Path: %wZ\n", &CurrentService->RegistryPath);
                     Status = IopLoadDriver(CurrentService);
+                    InbvIndicateProgress();
                 }
+                
             }
         }
     }
index 76e0be0..598f53d 100644 (file)
@@ -1217,13 +1217,15 @@ IofCompleteRequest(IN PIRP Irp,
         ErrorCode = PtrToUlong(LastStackPtr->Parameters.Others.Argument4);
     }
 
-    /* Get the Current Stack and skip it */
+    /* Get the Current Stack */
     StackPtr = IoGetCurrentIrpStackLocation(Irp);
-    IoSkipCurrentIrpStackLocation(Irp);
 
     /* Loop the Stacks and complete the IRPs */
     do
     {
+        /* Skip current stack location */
+        IoSkipCurrentIrpStackLocation(Irp);
+
         /* Set Pending Returned */
         Irp->PendingReturned = StackPtr->Control & SL_PENDING_RETURNED;
 
@@ -1286,10 +1288,9 @@ IofCompleteRequest(IN PIRP Irp,
             IopClearStackLocation(StackPtr);
         }
 
-        /* Move to next stack location and pointer */
-        IoSkipCurrentIrpStackLocation(Irp);
+        /* Move pointer to next stack location */
         StackPtr++;
-    } while (Irp->CurrentLocation <= (Irp->StackCount + 1));
+    } while (Irp->CurrentLocation <= Irp->StackCount);
 
     /* Check if the IRP is an associated IRP */
     if (Irp->Flags & IRP_ASSOCIATED_IRP)
index 3f01953..606f8fd 100644 (file)
@@ -245,7 +245,7 @@ IopNotifyFileSystemChange(IN PDEVICE_OBJECT DeviceObject,
 
 VOID
 NTAPI
-IoShutdownRegisteredFileSystems(VOID)
+IopShutdownBaseFileSystems(IN PLIST_ENTRY ListHead)
 {
     PLIST_ENTRY ListEntry;
     PDEVICE_OBJECT DeviceObject;
@@ -260,8 +260,8 @@ IoShutdownRegisteredFileSystems(VOID)
     KeInitializeEvent(&Event, NotificationEvent, FALSE);
 
     /* Get the first entry and start looping */
-    ListEntry = IopDiskFsListHead.Flink;
-    while (ListEntry != &IopDiskFsListHead)
+    ListEntry = ListHead->Flink;
+    while (ListEntry != ListHead)
     {
         /* Get the device object */
         DeviceObject = CONTAINING_RECORD(ListEntry,
index 890fd60..e634637 100644 (file)
@@ -13,7 +13,7 @@
 #define NDEBUG
 #include <debug.h>
 
-//#define ENABLE_ACPI
+#define ENABLE_ACPI
 
 /* GLOBALS *******************************************************************/
 
@@ -1893,7 +1893,7 @@ IopActionConfigureChildServices(PDEVICE_NODE DeviceNode,
       RtlInitUnicodeString(&ClassGUID, NULL);
 
       QueryTable[0].Name = L"Service";
-      QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
+      QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
       QueryTable[0].EntryContext = Service;
 
       QueryTable[1].Name = L"ClassGUID";
index 4052910..9d16c79 100644 (file)
@@ -23,8 +23,7 @@
    interface, for making instruction-processing programs more independent
    of the instruction set being processed.  */
 
-#ifndef DIS_ASM_H
-#define DIS_ASM_H
+#pragma once
 
 #ifdef __cplusplus
 extern "C" {
@@ -326,5 +325,3 @@ extern int generic_symbol_at_address
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* ! defined (DIS_ASM_H) */
index 78d610e..b96ece1 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef NTOSKRNL_KDB_H
-#define NTOSKRNL_KDB_H
+#pragma once
 
 /* DEFINES *******************************************************************/
 
@@ -272,5 +271,3 @@ VOID
 KbdDisableMouse();
 VOID
 KbdEnableMouse();
-
-#endif /* NTOSKRNL_KDB_H */
\ No newline at end of file
index d2188b6..eff065c 100644 (file)
     NESTED_ENTRY KiSystemStartup
     PROLOG_END KiSystemStartup
     
-    //
-    // Put us in FIQ mode
-    //
-    mrs r3, cpsr
-    orr r3, r1, #CPSR_FIQ_MODE
-    msr cpsr, r3
+    /* Put us in FIQ mode, set IRQ stack */
+    msr cpsr_c, #CPSR_FIQ_MODE
+    ldr sp, [a1, #LpbInterruptStack]
     
-    //
-    // Set FIQ stack and registers
-    //
-    ldr sp, [a2, #LpbInterruptStack]
-    mov r8, #0
-    mov r9, #0
-    mov r10, #0
-    
-    //
-    // Put us in ABORT mode
-    //
-    mrs r3, cpsr
-    orr r3, r1, #CPSR_ABORT_MODE
-    msr cpsr, r3
-       
-    //
-    // Set panic stack
-    //
-    ldr sp, [a2, #LpbPanicStack]
+    /* Repeat for IRQ mode */
+    msr cpsr_c, #CPSR_IRQ_MODE
+    ldr sp, [a1, #LpbInterruptStack]
+
+    /* Put us in ABORT mode and set the panic stack */
+    msr cpsr_c, #CPSR_ABORT_MODE
+    ldr sp, [a1, #LpbPanicStack]
     
-    //
-    // Put us in UND (Undefined) mode
-    //
-    mrs r3, cpsr
-    orr r3, r1, #CPSR_UND_MODE
-    msr cpsr, r3
-       
-    //
-    // Set panic stack
-    //
-    ldr sp, [a2, #LpbPanicStack]
+    /* Repeat for UND (Undefined) mode */
+    msr cpsr_c, #CPSR_UND_MODE
+    ldr sp, [a1, #LpbPanicStack]
     
-    //
-    // Put us into SVC (Supervisor) mode
-    //
-    mrs r3, cpsr
-    orr r3, r1, #CPSR_SVC_MODE
-    msr cpsr, r3
-
-    //
-    // Switch to boot kernel stack
-    //
-    ldr sp, [a2, #LpbKernelStack]
+    /* Put us into SVC (Supervisor) mode and set the kernel stack */
+    msr cpsr_c, #CPSR_SVC_MODE
+    ldr sp, [a1, #LpbKernelStack]
     
-    //
-    // Go to C code
-    //
+    /* Go to C code */
     b KiInitializeSystem
     
     ENTRY_END KiSystemStartup
+
+/* EOF */
index a9154ce..275df6c 100644 (file)
@@ -24,7 +24,7 @@ ULONG KeProcessorArchitecture;
 ULONG KeProcessorLevel;
 ULONG KeProcessorRevision;
 ULONG KeFeatureBits;
-ULONG KeLargestCacheLine = 32; // FIXME: It depends
+ULONG KeLargestCacheLine = 64; // FIXME: It depends
 
 /* FUNCTIONS ******************************************************************/
 
@@ -38,83 +38,6 @@ KiFlushSingleTb(IN BOOLEAN Invalid,
     KeArmInvalidateTlbEntry(Virtual);
 }
 
-VOID
-KeFillFixedEntryTb(IN ARM_PTE Pte,
-                   IN PVOID Virtual,
-                   IN ULONG Index)
-{
-    ARM_LOCKDOWN_REGISTER LockdownRegister;
-    ULONG OldVictimCount;
-    volatile unsigned long Temp;
-    PARM_TRANSLATION_TABLE TranslationTable;
-    
-    //
-    // Fixed TB entries must be section entries
-    //
-    Virtual = (PVOID)((ULONG)Virtual & 0xFFF00000);
-    
-    //
-    // On ARM, we can't set the index ourselves, so make sure that we are not
-    // locking down more than 8 entries.
-    //
-    UNREFERENCED_PARAMETER(Index);
-    KeFixedTbEntries++;
-    ASSERT(KeFixedTbEntries <= 8);
-    
-    //
-    // Flush the address
-    //
-    KiFlushSingleTb(TRUE, Virtual);
-    
-    //
-    // Read lockdown register and set the preserve bit
-    //
-    LockdownRegister = KeArmLockdownRegisterGet();
-    LockdownRegister.Preserve = TRUE;
-    OldVictimCount = LockdownRegister.Victim;
-    KeArmLockdownRegisterSet(LockdownRegister);
-    
-    //
-    // Map the PTE for this virtual address
-    //
-    TranslationTable = (PVOID)KeArmTranslationTableRegisterGet().AsUlong;
-    TranslationTable->Pte[(ULONG)Virtual >> PDE_SHIFT] = Pte;
-    
-    //
-    // Now force a miss
-    //
-    Temp = *(PULONG)Virtual;
-    
-    //
-    // Read lockdown register 
-    //
-    LockdownRegister = KeArmLockdownRegisterGet();
-    if (LockdownRegister.Victim == 0)
-    {
-        //
-        // This can only happen on QEMU or broken CPUs since there *has*
-        // to have been at least a miss since the system started. For example,
-        // QEMU doesn't support TLB lockdown.
-        //
-        // On these systems, we'll just keep the PTE mapped
-        //
-    }
-    else
-    {
-        //
-        // Clear the preserve bits
-        //
-        LockdownRegister.Preserve = FALSE;
-        ASSERT(LockdownRegister.Victim == OldVictimCount + 1);
-        KeArmLockdownRegisterSet(LockdownRegister);
-        
-        //
-        // Clear the PTE
-        //
-        TranslationTable->Pte[(ULONG)Virtual >> PDE_SHIFT].AsUlong = 0;
-    }
-}
-
 VOID
 KeFlushTb(VOID)
 {
index 1a91263..ddc94a3 100644 (file)
@@ -176,67 +176,51 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord,
                     IN BOOLEAN FirstChance)
 {
     CONTEXT Context;
-    
-    //
-    // Increase number of Exception Dispatches
-    //
+
+    /* Increase number of Exception Dispatches */
     KeGetCurrentPrcb()->KeExceptionDispatchCount++;
-    
-    //
-    // Set the context flags
-    //
+
+    /* Set the context flags */
     Context.ContextFlags = CONTEXT_FULL;
     
-    //
-    // FIXME-V6: VFP Support
-    //
-    
-    //
-    // Get a Context
-    //
+    /* Check if User Mode or if the kernel debugger is enabled */
+    if ((PreviousMode == UserMode) || (KeGetPcr()->KdVersionBlock))
+    {
+        /* FIXME-V6: VFP Support */
+    }
+
+    /* Get a Context */
     KeTrapFrameToContext(TrapFrame, ExceptionFrame, &Context);
-    
-    //
-    // Look at our exception code
-    //
+
+    /* Look at our exception code */
     switch (ExceptionRecord->ExceptionCode)
     {
-        //
-        // Breakpoint
-        //
+        /* Breakpoint */
         case STATUS_BREAKPOINT:
-            
-            //
-            // We want the instruction right before the int 3
-            //
+
+            /* Decrement PC by four */
             Context.Pc -= sizeof(ULONG);
             break;
-            
-        //
-        // Internal exception
-        //
+
+        /* Internal exception */
         case KI_EXCEPTION_ACCESS_VIOLATION:
-            
-            //
-            // Set correct code
-            //
+
+            /* Set correct code */
             ExceptionRecord->ExceptionCode = STATUS_ACCESS_VIOLATION;
+            if (PreviousMode == UserMode)
+            {
+                /* FIXME: Handle no execute */
+            }
             break;
     }
-       
-    //
-    // Handle kernel-mode first, it's simpler
-    //
+
+    /* Handle kernel-mode first, it's simpler */
     if (PreviousMode == KernelMode)
     {
-        //
-        // Check if this is a first-chance exception
-        //
+        /* Check if this is a first-chance exception */
         if (FirstChance == TRUE)
         {
-            //
-            // Break into the debugger for the first time
-            //
+            /* Break into the debugger for the first time */
             if (KiDebugRoutine(TrapFrame,
                                ExceptionFrame,
                                ExceptionRecord,
@@ -244,21 +228,15 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord,
                                PreviousMode,
                                FALSE))
             {
-                //
-                // Exception was handled
-                //
+                /* Exception was handled */
                 goto Handled;
             }
-            
-            //
-            // If the Debugger couldn't handle it, dispatch the exception
-            //
+
+            /* If the Debugger couldn't handle it, dispatch the exception */
             if (RtlDispatchException(ExceptionRecord, &Context)) goto Handled;
         }
-        
-        //
-        // This is a second-chance exception, only for the debugger
-        //
+
+        /* This is a second-chance exception, only for the debugger */
         if (KiDebugRoutine(TrapFrame,
                            ExceptionFrame,
                            ExceptionRecord,
@@ -266,15 +244,11 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord,
                            PreviousMode,
                            TRUE))
         {
-            //
-            // Exception was handled
-            //
+            /* Exception was handled */
             goto Handled;
         }
-        
-        //
-        // Third strike; you're out
-        //
+
+        /* Third strike; you're out */
         KeBugCheckEx(KMODE_EXCEPTION_NOT_HANDLED,
                      ExceptionRecord->ExceptionCode,
                      (ULONG_PTR)ExceptionRecord->ExceptionAddress,
@@ -283,19 +257,27 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord,
     }
     else
     {
-        //
-        // FIXME-USER: Do user-mode exception handling
-        //
-        ASSERT(FALSE);
+        /* FIXME: TODO */
+        /* 3rd strike, kill the process */
+        DPRINT1("Kill %.16s, ExceptionCode: %lx, ExceptionAddress: %lx\n",
+                PsGetCurrentProcess()->ImageFileName,
+                ExceptionRecord->ExceptionCode,
+                ExceptionRecord->ExceptionAddress);
+
+        ZwTerminateProcess(NtCurrentProcess(), ExceptionRecord->ExceptionCode);
+        KeBugCheckEx(KMODE_EXCEPTION_NOT_HANDLED,
+                     ExceptionRecord->ExceptionCode,
+                     (ULONG_PTR)ExceptionRecord->ExceptionAddress,
+                     (ULONG_PTR)TrapFrame,
+                     0);
     }
-    
+
 Handled:
-    //
-    // Convert the context back into Trap/Exception Frames
-    //
+    /* Convert the context back into Trap/Exception Frames */
     KeContextToTrapFrame(&Context,
                          ExceptionFrame,
                          TrapFrame,
                          Context.ContextFlags,
                          PreviousMode);
+    return;
 }
index 9352350..4b532ca 100644 (file)
@@ -28,9 +28,7 @@ VOID
 NTAPI
 KiInitMachineDependent(VOID)
 {
-    //
-    // There is nothing to do on ARM
-    //
+    /* There is nothing to do on ARM */
     return;
 }
 
@@ -43,169 +41,55 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
                    IN CCHAR Number,
                    IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
+    PKIPCR Pcr = (PKIPCR)KeGetPcr();
     ULONG PageDirectory[2];
-    PKPCR Pcr;
     ULONG i;
-
-    //
-    // Initialize the platform
-    //
-    HalInitializeProcessor(Number, LoaderBlock);
     
-    //
-    // Save loader block
-    //
-    KeLoaderBlock = LoaderBlock;
-
-    //
-    // Setup KPRCB
-    //
-    Prcb->MajorVersion = 1;
-    Prcb->MinorVersion = 1;
-    Prcb->BuildType = 0;
-#ifndef CONFIG_SMP
-    Prcb->BuildType |= PRCB_BUILD_UNIPROCESSOR;
-#endif
-#if DBG
-    Prcb->BuildType |= PRCB_BUILD_DEBUG;
-#endif
-    Prcb->CurrentThread = InitThread;
-    Prcb->NextThread = NULL;
-    Prcb->IdleThread = InitThread;
-    Prcb->Number = Number;
-    Prcb->SetMember = 1 << Number;
-    Prcb->PcrPage = LoaderBlock->u.Arm.PcrPage;
+    /* Set the default NX policy (opt-in) */
+    SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN;
 
-    //
-    // Initialize spinlocks and DPC data
-    //
+    /* Initialize spinlocks and DPC data */
     KiInitSpinLocks(Prcb, Number);
-
-    //
-    // Set the PRCB in the processor block
-    //
-    KiProcessorBlock[(ULONG)Number] = Prcb;
-    Pcr = (PKPCR)KeGetPcr();
-
-    //
-    // Set processor information
-    //
-    KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_ARM;
-    KeFeatureBits = 0;
-    KeProcessorLevel = (USHORT)(Pcr->ProcessorId >> 8);
-    KeProcessorRevision = (USHORT)(Pcr->ProcessorId & 0xFF);
-
-    //
-    // Set stack pointers
-    //
+    
+    /* Set stack pointers */
     Pcr->InitialStack = IdleStack;
-    Pcr->StackLimit = (PVOID)((ULONG_PTR)IdleStack - KERNEL_STACK_SIZE);
 
-    //
-    // Check if this is the Boot CPU
-    //
+    /* Check if this is the Boot CPU */
     if (!Number)
     {
-        //
-        // Setup the unexpected interrupt
-        //
+        /* Setup the unexpected interrupt */
         KxUnexpectedInterrupt.DispatchAddress = KiUnexpectedInterrupt;
         for (i = 0; i < 4; i++)
         {
-            //
-            // Copy the template code
-            //
+            /* Copy the template code */
             KxUnexpectedInterrupt.DispatchCode[i] = ((PULONG)KiInterruptTemplate)[i];
         }
         
-        //
-        // Set DMA coherency
-        //
+        /* Set DMA coherency */
         KiDmaIoCoherency = 0;
         
-        //
-        // Sweep D-Cache
-        //
+        /* Sweep D-Cache */
         HalSweepDcache();
-    }
-    
-    //
-    // Set all interrupt routines to unexpected interrupts as well
-    //
-    for (i = 0; i < MAXIMUM_VECTOR; i++)
-    {
-        //
-        // Point to the same template
-        //
-        Pcr->InterruptRoutine[i] = (PVOID)&KxUnexpectedInterrupt.DispatchCode;
-    }
-    
-    //
-    // Setup profiling
-    //
-    Pcr->ProfileCount = 0;
-    Pcr->ProfileInterval = 0x200000;
-    Pcr->StallScaleFactor = 50;
-    
-    //
-    // Setup software interrupts
-    //
-    Pcr->InterruptRoutine[PASSIVE_LEVEL] = KiPassiveRelease;
-    Pcr->InterruptRoutine[APC_LEVEL] = KiApcInterrupt;
-    Pcr->InterruptRoutine[DISPATCH_LEVEL] = KiDispatchInterrupt;
-    Pcr->ReservedVectors = (1 << PASSIVE_LEVEL) |
-                           (1 << APC_LEVEL) |
-                           (1 << DISPATCH_LEVEL) |
-                           (1 << IPI_LEVEL);
+        
+        /* Set boot-level flags */
+        KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_ARM;
+        KeFeatureBits = 0;
+        KeProcessorLevel = (USHORT)(Pcr->ProcessorId >> 8);
+        KeProcessorRevision = (USHORT)(Pcr->ProcessorId & 0xFF);
 
-    //
-    // Set IRQL and prcessor member/number
-    //
-    Pcr->CurrentIrql = APC_LEVEL;
-    Pcr->SetMember = 1 << Number;
-    Pcr->NotMember = -Pcr->SetMember;
-    Pcr->Number = Number;
-
-    //
-    // Remember our parent
-    //
-    InitThread->ApcState.Process = InitProcess;
-
-    //
-    // Setup the active processor numbers
-    //
-    KeActiveProcessors |= 1 << Number;
-    KeNumberProcessors = Number + 1;
-
-    //
-    // Check if this is the boot CPU
-    //
-    if (!Number)
-    {
-        //
-        // Setup KD
-        //
-        KdInitSystem(0, LoaderBlock);
-
-        //
-        // Check for break-in
-        //
-        if (KdPollBreakIn()) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
+        /* Set the current MP Master KPRCB to the Boot PRCB */
+        Prcb->MultiThreadSetMaster = Prcb;
 
-        //
-        // Cleanup the rest of the processor block array
-        //
-        for (i = 1; i < MAXIMUM_PROCESSORS; i++) KiProcessorBlock[i] = NULL;
+        /* Lower to APC_LEVEL */
+        KeLowerIrql(APC_LEVEL);
 
-        //
-        // Initialize portable parts of the OS
-        //
+        /* Initialize portable parts of the OS */
         KiInitSystem();
 
-        //
-        // Initialize the Idle Process and the Process Listhead
-        //
+        /* Initialize the Idle Process and the Process Listhead */
         InitializeListHead(&KiProcessListHead);
+        PageDirectory[0] = 0;
+        PageDirectory[1] = 0;
         KeInitializeProcess(InitProcess,
                             0,
                             0xFFFFFFFF,
@@ -215,15 +99,11 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
     }
     else
     {
-        //
-        // FIXME-V6: See if we want to support MP
-        //
+        /* FIXME-V6: See if we want to support MP */
         DPRINT1("ARM MPCore not supported\n");
     }
-    
-    //
-    // Setup the Idle Thread
-    //
+
+    /* Setup the Idle Thread */
     KeInitializeThread(InitProcess,
                        InitThread,
                        NULL,
@@ -239,253 +119,310 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
     InitThread->WaitIrql = DISPATCH_LEVEL;
     InitProcess->ActiveProcessors = 1 << Number;
 
-    //
-    // HACK for MmUpdatePageDir
-    //
+    /* HACK for MmUpdatePageDir */
     ((PETHREAD)InitThread)->ThreadsProcess = (PEPROCESS)InitProcess;
 
-    //
-    // Initialize the Kernel Executive
-    //
+    /* Set up the thread-related fields in the PRCB */
+    Prcb->CurrentThread = InitThread;
+    Prcb->NextThread = NULL;
+    Prcb->IdleThread = InitThread;
+
+    /* Initialize the Kernel Executive */
     ExpInitializeExecutive(Number, LoaderBlock);
-    
-    //
-    // Only do this on the boot CPU
-    //
+
+    /* Only do this on the boot CPU */
     if (!Number)
     {
-        //
-        // Calculate the time reciprocal
-        //
+        /* Calculate the time reciprocal */
         KiTimeIncrementReciprocal =
-        KiComputeReciprocal(KeMaximumIncrement,
-                            &KiTimeIncrementShiftCount);
-        
-        //
-        // Update DPC Values in case they got updated by the executive
-        //
+            KiComputeReciprocal(KeMaximumIncrement,
+                                &KiTimeIncrementShiftCount);
+
+        /* Update DPC Values in case they got updated by the executive */
         Prcb->MaximumDpcQueueDepth = KiMaximumDpcQueueDepth;
         Prcb->MinimumDpcRate = KiMinimumDpcRate;
         Prcb->AdjustDpcThreshold = KiAdjustDpcThreshold;
     }
-    
-    //
-    // Raise to Dispatch
-    //
+
+    /* Raise to Dispatch */
     KfRaiseIrql(DISPATCH_LEVEL);
-    
-    //
-    // Set the Idle Priority to 0. This will jump into Phase 1
-    //
+
+    /* Set the Idle Priority to 0. This will jump into Phase 1 */
     KeSetPriorityThread(InitThread, 0);
-    
-    //
-    // If there's no thread scheduled, put this CPU in the Idle summary
-    //
+
+    /* If there's no thread scheduled, put this CPU in the Idle summary */
     KiAcquirePrcbLock(Prcb);
     if (!Prcb->NextThread) KiIdleSummary |= 1 << Number;
     KiReleasePrcbLock(Prcb);
-    
-    //
-    // Raise back to HIGH_LEVEL
-    //
+
+    /* Raise back to HIGH_LEVEL and clear the PRCB for the loader block */
     KfRaiseIrql(HIGH_LEVEL);
+    LoaderBlock->Prcb = 0;
 }
 
+C_ASSERT((PKIPCR)KeGetPcr() == (PKIPCR)0xFFDFF000);
+C_ASSERT((FIELD_OFFSET(KIPCR, FirstLevelDcacheSize) & 4) == 0);
+C_ASSERT(sizeof(KIPCR) <= PAGE_SIZE);
+
 VOID
-KiInitializeSystem(IN ULONG Magic,
-                   IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+NTAPI
+KiInitializePcr(IN ULONG ProcessorNumber,
+                IN PKIPCR Pcr,
+                IN PKTHREAD IdleThread,
+                IN PVOID PanicStack,
+                IN PVOID InterruptStack)
 {
-    ARM_PTE Pte;
-    PKPCR Pcr;
-    ARM_CONTROL_REGISTER ControlRegister;
-
-    //
-    // Detect ARM version (Architecture 6 is the ARMv5TE-J, go figure!)
-    //
-    KeIsArmV6 = KeArmIdCodeRegisterGet().Architecture == 7;
-    
-    //
-    // Set the number of TLB entries and ASIDs
-    //
-    KeNumberTbEntries = 64;
-    if (__ARMV6__)
-    {
-        //
-        // 256 ASIDs on v6/v7
-        //
-        KeNumberProcessIds = 256;
-    }
-    else
-    {
-        //
-        // The TLB is VIVT on v4/v5
-        //
-        KeNumberProcessIds = 0;
-    }
-    
-    //
-    // Flush the TLB
-    //
-    KeFlushTb();
-    
-    //
-    // Build the KIPCR pte
-    //
-    Pte.L1.Section.Type = SectionPte;
-    Pte.L1.Section.Buffered = FALSE;
-    Pte.L1.Section.Cached = FALSE;
-    Pte.L1.Section.Reserved = 1; // ARM926EJ-S manual recommends setting to 1
-    Pte.L1.Section.Domain = Domain0;
-    Pte.L1.Section.Access = SupervisorAccess;
-    Pte.L1.Section.BaseAddress = LoaderBlock->u.Arm.PcrPage;
-    Pte.L1.Section.Ignored = Pte.L1.Section.Ignored1 = 0;
-    
-    //
-    // Map it into kernel address space by locking it into the TLB
-    //
-    KeFillFixedEntryTb(Pte, (PVOID)KIPCR, PCR_ENTRY);
-
-    //
-    // Now map the PCR into user address space as well (read-only)
-    //
-    Pte.L1.Section.Access = SharedAccess;
-    KeFillFixedEntryTb(Pte, (PVOID)USPCR, PCR_ENTRY + 1);
-    
-    //
-    // Now we should be able to use the PCR...
-    //
-    Pcr = (PKPCR)KeGetPcr();
+    ULONG i;
     
-    //
-    // Set the cache policy (HACK)
-    //
-    Pcr->CachePolicy = 0;
-    Pcr->AlignedCachePolicy = 0;
+    /* Set the Current Thread */
+    Pcr->PrcbData.CurrentThread = IdleThread;
+
+    /* Set pointers to ourselves */
+    Pcr->Self = (PKPCR)Pcr;
+    Pcr->Prcb = &Pcr->PrcbData;
+
+    /* Set the PCR Version */
+    Pcr->MajorVersion = PCR_MAJOR_VERSION;
+    Pcr->MinorVersion = PCR_MINOR_VERSION;
+
+    /* Set the PCRB Version */
+    Pcr->PrcbData.MajorVersion = 1;
+    Pcr->PrcbData.MinorVersion = 1;
+
+    /* Set the Build Type */
+    Pcr->PrcbData.BuildType = 0;
+#ifndef CONFIG_SMP
+    Pcr->PrcbData.BuildType |= PRCB_BUILD_UNIPROCESSOR;
+#endif
+#if DBG
+    Pcr->PrcbData.BuildType |= PRCB_BUILD_DEBUG;
+#endif
+
+    /* Set the Processor Number and current Processor Mask */
+    Pcr->PrcbData.Number = (UCHAR)ProcessorNumber;
+    Pcr->PrcbData.SetMember = 1 << ProcessorNumber;
+
+    /* Set the PRCB for this Processor */
+    KiProcessorBlock[ProcessorNumber] = Pcr->Prcb;
+
+    /* Start us out at PASSIVE_LEVEL */
+    Pcr->Irql = PASSIVE_LEVEL;
+
+    /* Set the stacks */
+    Pcr->PanicStack = PanicStack;
+    Pcr->InterruptStack = InterruptStack;
+
+    /* Setup the processor set */
+    Pcr->PrcbData.MultiThreadProcessorSet = Pcr->PrcbData.SetMember;
     
-    //
-    // Copy cache information from the loader block
-    //
-    Pcr->FirstLevelDcacheSize = LoaderBlock->u.Arm.FirstLevelDcacheSize;
-    Pcr->SecondLevelDcacheSize = LoaderBlock->u.Arm.SecondLevelDcacheSize;
-    Pcr->FirstLevelIcacheSize = LoaderBlock->u.Arm.FirstLevelIcacheSize;
-    Pcr->SecondLevelIcacheSize = LoaderBlock->u.Arm.SecondLevelIcacheSize;
-    Pcr->FirstLevelDcacheFillSize = LoaderBlock->u.Arm.FirstLevelDcacheFillSize;
-    Pcr->SecondLevelDcacheFillSize = LoaderBlock->u.Arm.SecondLevelDcacheFillSize;
-    Pcr->FirstLevelIcacheFillSize = LoaderBlock->u.Arm.FirstLevelIcacheFillSize;
-    Pcr->SecondLevelIcacheFillSize = LoaderBlock->u.Arm.SecondLevelIcacheFillSize;
-
-    //
-    // Set global d-cache fill and alignment values
-    //
+    /* Copy cache information from the loader block */
+    Pcr->FirstLevelDcacheSize = KeLoaderBlock->u.Arm.FirstLevelDcacheSize;
+    Pcr->SecondLevelDcacheSize = KeLoaderBlock->u.Arm.SecondLevelDcacheSize;
+    Pcr->FirstLevelIcacheSize = KeLoaderBlock->u.Arm.FirstLevelIcacheSize;
+    Pcr->SecondLevelIcacheSize = KeLoaderBlock->u.Arm.SecondLevelIcacheSize;
+    Pcr->FirstLevelDcacheFillSize = KeLoaderBlock->u.Arm.FirstLevelDcacheFillSize;
+    Pcr->SecondLevelDcacheFillSize = KeLoaderBlock->u.Arm.SecondLevelDcacheFillSize;
+    Pcr->FirstLevelIcacheFillSize = KeLoaderBlock->u.Arm.FirstLevelIcacheFillSize;
+    Pcr->SecondLevelIcacheFillSize = KeLoaderBlock->u.Arm.SecondLevelIcacheFillSize;
+
+    /* Set global d-cache fill and alignment values */
     if (!Pcr->SecondLevelDcacheSize)
     {
-        //
-        // Use the first level
-        //
+        /* Use the first level */
         Pcr->DcacheFillSize = Pcr->FirstLevelDcacheSize;
     }
     else
     {
-        //
-        // Use the second level
-        //
+        /* Use the second level */
         Pcr->DcacheFillSize = Pcr->SecondLevelDcacheSize;
     }
     
-    //
-    // Set the alignment
-    //
+    /* Set the alignment */
     Pcr->DcacheAlignment = Pcr->DcacheFillSize - 1;
     
-    //
-    // Set global i-cache fill and alignment values
-    //
+    /* Set global i-cache fill and alignment values */
     if (!Pcr->SecondLevelIcacheSize)
     {
-        //
-        // Use the first level
-        //
+        /* Use the first level */
         Pcr->IcacheFillSize = Pcr->FirstLevelIcacheSize;
     }
     else
     {
-        //
-        // Use the second level
-        //
+        /* Use the second level */
         Pcr->IcacheFillSize = Pcr->SecondLevelIcacheSize;
     }
     
-    //
-    // Set the alignment
-    //
+    /* Set the alignment */
     Pcr->IcacheAlignment = Pcr->IcacheFillSize - 1;
     
-    //
-    // Now sweep caches
-    //
-    HalSweepIcache();
-    HalSweepDcache();
+    /* Set processor information */
+    Pcr->ProcessorId = KeArmIdCodeRegisterGet().AsUlong;
     
-    //
-    // Set PCR version
-    //
-    Pcr->MinorVersion = PCR_MINOR_VERSION;
-    Pcr->MajorVersion = PCR_MAJOR_VERSION;
+    /* Set all interrupt routines to unexpected interrupts as well */
+    for (i = 0; i < MAXIMUM_VECTOR; i++)
+    {
+        /* Point to the same template */
+        Pcr->InterruptRoutine[i] = (PVOID)&KxUnexpectedInterrupt.DispatchCode;
+    }
+
+    /* Set default stall factor */
+    Pcr->StallScaleFactor = 50;
     
-    //
-    // Set boot PRCB
-    //
-    Pcr->Prcb = (PKPRCB)LoaderBlock->Prcb;
+    /* Setup software interrupts */
+    Pcr->InterruptRoutine[PASSIVE_LEVEL] = KiPassiveRelease;
+    Pcr->InterruptRoutine[APC_LEVEL] = KiApcInterrupt;
+    Pcr->InterruptRoutine[DISPATCH_LEVEL] = KiDispatchInterrupt;
+    Pcr->ReservedVectors = (1 << PASSIVE_LEVEL) |
+                           (1 << APC_LEVEL) |
+                           (1 << DISPATCH_LEVEL) |
+                           (1 << IPI_LEVEL);
+}
+
+VOID
+KiInitializeMachineType(VOID)
+{
+    /* Detect ARM version */
+    KeIsArmV6 = KeArmIdCodeRegisterGet().Architecture >= 7;
     
-    //
-    // Set the different stacks
-    //
-    Pcr->InitialStack = (PVOID)LoaderBlock->KernelStack;
-    Pcr->PanicStack = (PVOID)LoaderBlock->u.Arm.PanicStack;
-    Pcr->InterruptStack = (PVOID)LoaderBlock->u.Arm.InterruptStack;
+    /* Set the number of TLB entries and ASIDs */
+    KeNumberTbEntries = 64;
+    if (__ARMV6__)
+    {
+        /* 256 ASIDs on v6/v7 */
+        KeNumberProcessIds = 256;
+    }
+    else
+    {
+        /* The TLB is VIVT on v4/v5 */
+        KeNumberProcessIds = 0;
+    }
+}
+
+VOID
+KiInitializeSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    ULONG Cpu;
+    PKTHREAD InitialThread;
+    PKPROCESS InitialProcess;
+    ARM_CONTROL_REGISTER ControlRegister;
+    PKIPCR Pcr = (PKIPCR)KeGetPcr();
+    PKTHREAD Thread;
+
+    /* Flush the TLB */
+    KeFlushTb();
+    
+    /* Save the loader block and get the current CPU */
+    KeLoaderBlock = LoaderBlock;
+    Cpu = KeNumberProcessors;
+
+    /* Save the initial thread and process */
+    InitialThread = (PKTHREAD)LoaderBlock->Thread;
+    InitialProcess = (PKPROCESS)LoaderBlock->Process;
+
+    /* Clean the APC List Head */
+    InitializeListHead(&InitialThread->ApcState.ApcListHead[KernelMode]);
+
+    /* Initialize the machine type */
+    KiInitializeMachineType();
+
+    /* Skip initial setup if this isn't the Boot CPU */
+    if (Cpu) goto AppCpuInit;
     
-    //
-    // Set the current thread
-    //
-    Pcr->CurrentThread = (PKTHREAD)LoaderBlock->Thread;
+    /* Initialize the PCR */
+    RtlZeroMemory(Pcr, PAGE_SIZE);
+    KiInitializePcr(Cpu,
+                    Pcr,
+                    InitialThread,
+                    (PVOID)LoaderBlock->u.Arm.PanicStack,
+                    (PVOID)LoaderBlock->u.Arm.InterruptStack);
+
+    /* Now sweep caches */
+    HalSweepIcache();
+    HalSweepDcache();
     
-    //
-    // Set the current IRQL to high
-    //
-    Pcr->CurrentIrql = HIGH_LEVEL;
+    /* Set us as the current process */
+    InitialThread->ApcState.Process = InitialProcess;
     
-    //
-    // Set processor information
-    //
-    Pcr->ProcessorId = KeArmIdCodeRegisterGet().AsUlong;
-    Pcr->SystemReserved[0] = KeArmControlRegisterGet().AsUlong;
+AppCpuInit:
+    /* Setup CPU-related fields */
+    Pcr->Number = Cpu;
+    Pcr->SetMember = 1 << Cpu;
+    Pcr->SetMemberCopy = 1 << Cpu;
+    Pcr->PrcbData.SetMember = 1 << Cpu;
     
-    //
-    // Set the exception address to high
-    //
+    /* Initialize the Processor with HAL */
+    HalInitializeProcessor(Cpu, KeLoaderBlock);
+
+    /* Set active processors */
+    KeActiveProcessors |= Pcr->SetMember;
+    KeNumberProcessors++;
+
+    /* Check if this is the boot CPU */
+    if (!Cpu)
+    {
+        /* Initialize debugging system */
+        KdInitSystem(0, KeLoaderBlock);
+
+        /* Check for break-in */
+        if (KdPollBreakIn()) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
+    }
+
+    /* Raise to HIGH_LEVEL */
+    KfRaiseIrql(HIGH_LEVEL);
+    
+    /* Set the exception address to high */
     ControlRegister = KeArmControlRegisterGet();
     ControlRegister.HighVectors = TRUE;
     KeArmControlRegisterSet(ControlRegister);
     
-    //
-    // Setup the exception vector table
-    //
+    /* Setup the exception vector table */
     RtlCopyMemory((PVOID)0xFFFF0000, &KiArmVectorTable, 14 * sizeof(PVOID));
 
-    //
-    // Initialize the rest of the kernel now
-    //
+    /* Initialize the rest of the kernel now */
     KiInitializeKernel((PKPROCESS)LoaderBlock->Process,
                        (PKTHREAD)LoaderBlock->Thread,
                        (PVOID)LoaderBlock->KernelStack,
-                       (PKPRCB)LoaderBlock->Prcb,
+                       Pcr->Prcb,
                        Pcr->Prcb->Number,
-                       LoaderBlock);
+                       KeLoaderBlock);
+
+    /* Set the priority of this thread to 0 */
+    Thread = KeGetCurrentThread();
+    Thread->Priority = 0;
+
+    /* Force interrupts enabled and lower IRQL back to DISPATCH_LEVEL */
+    _enable();
+    KfLowerIrql(DISPATCH_LEVEL);
+
+    /* Set the right wait IRQL */
+    Thread->WaitIrql = DISPATCH_LEVEL;
+
+    /* Jump into the idle loop */
+    KiIdleLoop();
+}
+
+ULONG
+DbgPrintEarly(const char *fmt, ...)
+{
+    va_list args;
+    unsigned int i;
+    char Buffer[1024];
+    PCHAR String = Buffer;
+
+    va_start(args, fmt);
+    i = vsprintf(Buffer, fmt, args);
+    va_end(args);
     
+    /* Output the message */
+    while (*String != 0)
+    {
+        if (*String == '\n')
+        {
+            KdPortPutByteEx(NULL, '\r');
+        }
+        KdPortPutByteEx(NULL, *String);
+        String++;
+    }
     
-    //
-    // Jump to idle loop
-    //
-    KiIdleLoop();
+    return STATUS_SUCCESS;
 }
index 51b12f8..edfedf4 100644 (file)
@@ -25,6 +25,9 @@ KiIdleLoop(VOID)
     //
     // Loop forever... that's why this is an idle loop
     //
+    DPRINT1("[IDLE LOOP]\n");
+    while (TRUE);
+    
     while (TRUE)
     {
         //
@@ -117,10 +120,13 @@ BOOLEAN
 KiSwapContextInternal(IN PKTHREAD OldThread,
                       IN PKTHREAD NewThread)
 {
-    PKPCR Pcr = (PKPCR)KeGetPcr();
+    PKIPCR Pcr = (PKIPCR)KeGetPcr();
     PKPRCB Prcb = Pcr->Prcb;
     PKPROCESS OldProcess, NewProcess;
     
+    DPRINT1("SWAP\n");
+    while (TRUE);
+    
     //
     // Increase context switch count
     //
@@ -163,7 +169,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread,
     // Increase thread context switches
     //
     NewThread->ContextSwitches++;
-    
+#if 0 // I don't buy this
     //
     // Set us as the current thread
     // NOTE: On RISC Platforms, there is both a KPCR CurrentThread, and a
@@ -175,7 +181,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread,
     // there as well.
     //
     Pcr->CurrentThread = NewThread;
-    
+#endif
     //
     // DPCs shouldn't be active
     //
@@ -221,7 +227,9 @@ KiApcInterrupt(VOID)
     KPROCESSOR_MODE PreviousMode;
     KEXCEPTION_FRAME ExceptionFrame;
     PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame;
-    //DPRINT1("[APC]\n");
+    
+    DPRINT1("[APC TRAP]\n");
+    while (TRUE);
        
     //
     // Isolate previous mode
@@ -257,14 +265,17 @@ KiApcInterrupt(VOID)
 VOID
 KiDispatchInterrupt(VOID)
 {
-    PKPCR Pcr;
+    PKIPCR Pcr;
     PKPRCB Prcb;
     PKTHREAD NewThread, OldThread;
     
+    DPRINT1("[DPC TRAP]\n");
+    while (TRUE);
+    
     //
     // Get the PCR and disable interrupts
     //
-    Pcr = (PKPCR)KeGetPcr();
+    Pcr = (PKIPCR)KeGetPcr();
     Prcb = Pcr->Prcb;
     _disable();
     
@@ -339,14 +350,14 @@ KiInterruptHandler(IN PKTRAP_FRAME TrapFrame,
 {
     KIRQL OldIrql, Irql;
     ULONG InterruptCause, InterruptMask;
-    PKPCR Pcr;
+    PKIPCR Pcr;
     PKTRAP_FRAME OldTrapFrame;
     ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00);
 
     //
     // Increment interrupt count
     //
-    Pcr = (PKPCR)KeGetPcr();
+    Pcr = (PKIPCR)KeGetPcr();
     Pcr->Prcb->InterruptCount++;
     
     //
@@ -359,7 +370,7 @@ KiInterruptHandler(IN PKTRAP_FRAME TrapFrame,
     // Get the interrupt source
     //
     InterruptCause = HalGetInterruptSource();
-//    DPRINT1("[INT] (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr, TrapFrame->Pc);
+    //DPRINT1("[INT] (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr, TrapFrame->Pc);
 
     //
     // Get the new IRQL and Interrupt Mask
@@ -421,6 +432,10 @@ KiPrefetchAbortHandler(IN PKTRAP_FRAME TrapFrame)
     ULONG DebugType, Parameter0;
     EXCEPTION_RECORD ExceptionRecord;
     
+    DPRINT1("[PREFETCH ABORT] (%x) @ %p/%p/%p\n",
+            KeArmInstructionFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc);
+    while (TRUE);
+    
     //
     // What we *SHOULD* do is look at the instruction fault status register
     // and see if it's equal to 2 (debug trap). Unfortunately QEMU doesn't seem
@@ -483,8 +498,6 @@ KiPrefetchAbortHandler(IN PKTRAP_FRAME TrapFrame)
     //
     // Unhandled
     //
-    DPRINT1("[PREFETCH ABORT] (%x) @ %p/%p/%p\n",
-            KeArmInstructionFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc);
     UNIMPLEMENTED;
     ASSERT(FALSE);
     return STATUS_SUCCESS;
@@ -497,6 +510,10 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame)
     PVOID Address = (PVOID)KeArmFaultAddressRegisterGet();
     ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00);
    
+    DPRINT1("[ABORT] (%x) @ %p/%p/%p\n",
+            KeArmFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc);
+    while (TRUE);
+        
     //
     // Check if this is a page fault
     //
@@ -512,8 +529,6 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame)
     //
     // Unhandled
     //
-    DPRINT1("[ABORT] (%x) @ %p/%p/%p\n",
-            KeArmFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc);
     UNIMPLEMENTED;
     ASSERT(FALSE);
     return STATUS_SUCCESS;
@@ -527,6 +542,9 @@ KiSoftwareInterruptHandler(IN PKTRAP_FRAME TrapFrame)
     ULONG Instruction;
     ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00);
     
+    DPRINT1("[SWI] @ %p/%p\n", TrapFrame->SvcLr, TrapFrame->Pc);
+    while (TRUE);
+    
     //
     // Get the current thread
     //
index 1621983..3b6ceea 100644 (file)
@@ -226,7 +226,7 @@ KiSystemService(IN PKTHREAD Thread,
             //
             // Forcibly put us in a sane state
             //
-            KeGetPcr()->CurrentIrql = 0;
+            KeGetPcr()->Irql = 0;
             _disable();
             
             //
index 2f798a1..b6457ce 100644 (file)
@@ -32,7 +32,7 @@ KeClearEvent(IN PKEVENT Event)
  */
 VOID
 NTAPI
-KeInitializeEvent(IN PKEVENT Event,
+KeInitializeEvent(OUT PKEVENT Event,
                   IN EVENT_TYPE Type,
                   IN BOOLEAN State)
 {
index cc93dcd..d02fa17 100644 (file)
@@ -186,7 +186,7 @@ NtRaiseException(IN PEXCEPTION_RECORD ExceptionRecord,
     
     /* Set exception list */
 #ifdef _M_IX86
-    KeGetPcr()->Tib.ExceptionList = TrapFrame->ExceptionList;
+    KeGetPcr()->NtTib.ExceptionList = TrapFrame->ExceptionList;
 #endif
     
     /* Raise the exception */
index 46c2fc8..0275665 100644 (file)
@@ -995,56 +995,6 @@ KiLoadFastSyscallMachineSpecificRegisters(IN ULONG_PTR Context)
     return 0;
 }
 
-VOID
-NTAPI
-KiDisableFastSyscallReturn(VOID)
-{
-    /* Was it applied? */
-    if (KiSystemCallExitAdjusted)
-    {        
-        /* Restore the original value */
-        KiSystemCallExitBranch[1] = KiSystemCallExitBranch[1] - KiSystemCallExitAdjusted;
-                
-        /* It's not adjusted anymore */
-        KiSystemCallExitAdjusted = FALSE;
-    }
-}
-
-VOID
-NTAPI
-KiEnableFastSyscallReturn(VOID)
-{
-    /* Check if the patch has already been done */
-    if ((KiSystemCallExitAdjusted == KiSystemCallExitAdjust) &&
-        (KiFastCallCopyDoneOnce))
-    {
-        return;
-    }
-    
-    /* Make sure the offset is within the distance of a Jxx SHORT */
-    if ((KiSystemCallExitBranch[1] - KiSystemCallExitAdjust) < 0x80)
-    {
-        /* Remove any existing code patch */
-        KiDisableFastSyscallReturn();
-        
-        /* We should have a JNZ there */
-        ASSERT(KiSystemCallExitBranch[0] == 0x75);
-
-        /* Do the patch */        
-        KiSystemCallExitAdjusted = KiSystemCallExitAdjust;
-        KiSystemCallExitBranch[1] -= KiSystemCallExitAdjusted;
-        
-        /* Remember that we've done it */
-        KiFastCallCopyDoneOnce = TRUE;
-    }
-    else
-    {
-        /* This shouldn't happen unless we've messed the macros up */
-        DPRINT1("Your compiled kernel is broken!\n");
-        DbgBreakPoint();
-    }
-}
-
 VOID
 NTAPI
 KiRestoreFastSyscallReturnState(VOID)
@@ -1055,28 +1005,27 @@ KiRestoreFastSyscallReturnState(VOID)
         /* Check if it has been disabled */
         if (!KiFastSystemCallDisable)
         {
-            /* KiSystemCallExit2 should come BEFORE KiSystemCallExit */
-            ASSERT(KiSystemCallExit2 < KiSystemCallExit);
-            
-            /* It's enabled, so we'll have to do a code patch */
-            KiSystemCallExitAdjust = KiSystemCallExit - KiSystemCallExit2;
+            /* Do an IPI to enable it */
+            KeIpiGenericCall(KiLoadFastSyscallMachineSpecificRegisters, 0);
+
+            /* It's enabled, so use the proper exit stub */
+            KiFastCallExitHandler = KiSystemCallSysExitReturn;
+            DPRINT1("Support for SYSENTER detected.\n");
         }
         else
         {
             /* Disable fast system call */
             KeFeatureBits &= ~KF_FAST_SYSCALL;
+            KiFastCallExitHandler = KiSystemCallTrapReturn;
+            DPRINT1("Support for SYSENTER disabled.\n");
         }
     }
-    
-    /* Now check if all CPUs support fast system call, and the registry allows it */
-    if (KeFeatureBits & KF_FAST_SYSCALL)
+    else
     {
-        /* Do an IPI to enable it */
-        KeIpiGenericCall(KiLoadFastSyscallMachineSpecificRegisters, 0);
+        /* Use the IRET handler */
+        KiFastCallExitHandler = KiSystemCallTrapReturn;
+        DPRINT1("No support for SYSENTER detected.\n");
     }
-    
-    /* Perform the code patch that is required */
-    KiEnableFastSyscallReturn();
 }
 
 ULONG_PTR
index 58b6624..1017013 100644 (file)
@@ -168,7 +168,7 @@ KiUnexpectedInterruptTailHandler(IN PKTRAP_FRAME TrapFrame)
     KeGetCurrentPrcb()->InterruptCount++;
     
     /* Start the interrupt */
-    if (HalBeginSystemInterrupt(HIGH_LEVEL, TrapFrame->Eax, &OldIrql))
+    if (HalBeginSystemInterrupt(HIGH_LEVEL, TrapFrame->ErrCode, &OldIrql))
     {
         /* Warn user */
         DPRINT1("\n\x7\x7!!! Unexpected Interrupt %02lx !!!\n");
@@ -233,7 +233,7 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame,
     KIRQL OldIrql;
     BOOLEAN Handled;
     PLIST_ENTRY NextEntry, ListHead;
-    
+
     /* Increase interrupt count */
     KeGetCurrentPrcb()->InterruptCount++;
 
@@ -299,7 +299,7 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame,
         /* Now call the epilogue code */
         KiExitInterrupt(TrapFrame, OldIrql, TRUE);
     }
- }
+}
 
 VOID
 FASTCALL
@@ -313,8 +313,6 @@ KiInterruptTemplateHandler(IN PKTRAP_FRAME TrapFrame,
     ((PKI_INTERRUPT_DISPATCH*)Interrupt->DispatchAddress)(TrapFrame, Interrupt);
 }
 
-KiTrap(KiInterruptTemplate,         KI_PUSH_FAKE_ERROR_CODE | KI_HARDWARE_INT);
-KiTrap(KiUnexpectedInterruptTail,   KI_PUSH_FAKE_ERROR_CODE);
 
 /* PUBLIC FUNCTIONS **********************************************************/
 
index ea86e1c..9b6ef4b 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
-/* GLOBALS *******************************************************************/
-
-ULONG Ke386GlobalPagesEnabled;
-
 /* FUNCTIONS *****************************************************************/
 
 ULONG_PTR
@@ -46,8 +42,8 @@ Ki386EnableGlobalPage(IN volatile ULONG_PTR Context)
     __writecr3(Cr3);
 
     /* Now enable PGE */
-    __writecr4(Cr4 | CR4_PGE);
-    Ke386GlobalPagesEnabled = TRUE;
+    DPRINT1("Global page support detected but not yet taken advantage of\n");
+    //__writecr4(Cr4 | CR4_PGE);
 
     /* Restore interrupts */
     _enable();
index 293cd6f..adfcd32 100644 (file)
@@ -3,19 +3,33 @@
  * COPYRIGHT:       See COPYING in the top level directory
  * PURPOSE:         System Traps, Entrypoints and Exitpoints
  * PROGRAMMER:      Alex Ionescu (alex@relsoft.net)
+ *                  Timo Kreuzer (timo.kreuzer@reactos.org)
  * NOTE:            See asmmacro.S for the shared entry/exit code.
  */
 
 /* INCLUDES ******************************************************************/
 
-#include <asm.h>
+#include <reactos/asm.h>
+#include <ndk/i386/asm.h>
 #include <internal/i386/asmmacro.S>
-.intel_syntax noprefix
+
+MACRO(GENERATE_IDT_STUB, Number)
+idt _KiUnexpectedInterrupt&Number, INT_32_DPL0
+ENDM
+
+MACRO(GENERATE_INT_HANDLER, Number)
+.func KiUnexpectedInterrupt&Number
+_KiUnexpectedInterrupt&Number:
+    push PRIMARY_VECTOR_BASE + Number
+    jmp _KiEndUnexpectedRange@0
+.endfunc
+ENDM
 
 /* GLOBALS *******************************************************************/
 
 .data
-.globl _KiIdt
+
+PUBLIC _KiIdt
 _KiIdt:
 /* This is the Software Interrupt Table that we handle in this file:        */
 idt _KiTrap00,         INT_32_DPL0  /* INT 00: Divide Error (#DE)           */
@@ -47,26 +61,97 @@ idt _KiRaiseAssertion, INT_32_DPL3  /* INT 2C: Debug Assertion Handler      */
 idt _KiDebugService,   INT_32_DPL3  /* INT 2D: Debug Service Handler        */
 idt _KiSystemService,  INT_32_DPL3  /* INT 2E: System Call Service Handler  */
 idt _KiTrap0F,         INT_32_DPL0  /* INT 2F: RESERVED                     */
-GENERATE_IDT_STUBS                  /* INT 30-FF: UNEXPECTED INTERRUPTS     */
+i = 0
+.rept 208
+    GENERATE_IDT_STUB %i
+    i = i + 1
+.endr
 
-.globl _KiIdtDescriptor
+PUBLIC _KiIdtDescriptor
 _KiIdtDescriptor:
     .short 0
     .short 0x7FF
     .long _KiIdt
 
-.globl _KiUnexpectedEntrySize
+PUBLIC _KiUnexpectedEntrySize
 _KiUnexpectedEntrySize:
     .long _KiUnexpectedInterrupt1 - _KiUnexpectedInterrupt0
 
+/******************************************************************************/
+.code32
 .text
-/* HARDWARE INTERRUPT HANDLERS ************************************************/
 
-.globl _KiStartUnexpectedRange@0
-_KiStartUnexpectedRange@0:
+TRAP_ENTRY KiTrap00, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap01, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap03, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap04, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap05, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap06, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap07, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap08, 0
+TRAP_ENTRY KiTrap09, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap0A, 0
+TRAP_ENTRY KiTrap0B, 0
+TRAP_ENTRY KiTrap0C, 0
+TRAP_ENTRY KiTrap0D, 0
+TRAP_ENTRY KiTrap0E, 0
+TRAP_ENTRY KiTrap0F, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap10, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap11, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiTrap13, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiGetTickCount, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiDebugService, KI_PUSH_FAKE_ERROR_CODE
+TRAP_ENTRY KiUnexpectedInterruptTail, 0
+
+ALIGN 4
+EXTERN @KiInterruptTemplateHandler@8
+PUBLIC _KiInterruptTemplate
+_KiInterruptTemplate:
+    KiEnterTrap KI_PUSH_FAKE_ERROR_CODE
+PUBLIC _KiInterruptTemplate2ndDispatch
+_KiInterruptTemplate2ndDispatch:
+    mov edx, 0
+PUBLIC _KiInterruptTemplateObject
+_KiInterruptTemplateObject:
+    mov eax, offset @KiInterruptTemplateHandler@8
+    jmp eax
+PUBLIC _KiInterruptTemplateDispatch
+_KiInterruptTemplateDispatch:
+
+EXTERN @KiSystemServiceHandler@8:PROC
+PUBLIC _KiSystemService
+_KiSystemService:
+    KiEnterTrap (KI_PUSH_FAKE_ERROR_CODE OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
+    KiCallHandler @KiSystemServiceHandler@8
 
-GENERATE_INT_HANDLERS
+EXTERN @KiFastCallEntryHandler@8:PROC
+PUBLIC _KiFastCallEntry
+_KiFastCallEntry:
+    KiEnterTrap (KI_FAST_SYSTEM_CALL OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
+    KiCallHandler @KiFastCallEntryHandler@8
 
-.globl _KiEndUnexpectedRange@0
+PUBLIC _KiStartUnexpectedRange@0
+_KiStartUnexpectedRange@0:
+i = 0
+.rept 208
+    GENERATE_INT_HANDLER %i
+    i = i + 1
+.endr
+PUBLIC _KiEndUnexpectedRange@0
 _KiEndUnexpectedRange@0:
     jmp _KiUnexpectedInterruptTail
+
+
+/* EXIT CODE *****************************************************************/
+
+KiTrapExitStub KiSystemCallReturn,        (KI_RESTORE_EAX OR KI_RESTORE_EFLAGS OR KI_EXIT_JMP)
+KiTrapExitStub KiSystemCallSysExitReturn, (KI_RESTORE_EAX OR KI_RESTORE_FS OR KI_RESTORE_EFLAGS OR KI_EXIT_SYSCALL)
+KiTrapExitStub KiSystemCallTrapReturn,    (KI_RESTORE_EAX OR KI_RESTORE_FS OR KI_EXIT_IRET)
+
+KiTrapExitStub KiEditedTrapReturn,        (KI_RESTORE_VOLATILES OR KI_RESTORE_EFLAGS OR KI_EDITED_FRAME OR KI_EXIT_RET)
+KiTrapExitStub KiTrapReturn,              (KI_RESTORE_VOLATILES OR KI_RESTORE_SEGMENTS OR KI_EXIT_IRET)
+KiTrapExitStub KiTrapReturnNoSegments,    (KI_RESTORE_VOLATILES OR KI_EXIT_IRET)
+
+END
index a6d8052..f9a954e 100644 (file)
@@ -45,6 +45,11 @@ UCHAR KiTrapIoTable[] =
     0x6F,                      /* OUTS                                 */    
 };
 
+PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler;
+
+
+/* TRAP EXIT CODE *************************************************************/
+
 BOOLEAN
 FORCEINLINE
 KiVdmTrap(IN PKTRAP_FRAME TrapFrame)
@@ -53,13 +58,27 @@ KiVdmTrap(IN PKTRAP_FRAME TrapFrame)
     return ((TrapFrame->EFlags & EFLAGS_V86_MASK) ||
             ((KiUserTrap(TrapFrame)) && (PsGetCurrentProcess()->VdmObjects)));
 }
-/* TRAP EXIT CODE *************************************************************/
+
+BOOLEAN
+FORCEINLINE
+KiV86Trap(IN PKTRAP_FRAME TrapFrame)
+{
+    /* Check if the V8086 flag is on */
+    return ((TrapFrame->EFlags & EFLAGS_V86_MASK) != 0);
+}
+
+BOOLEAN
+FORCEINLINE
+KiIsFrameEdited(IN PKTRAP_FRAME TrapFrame)
+{
+    /* An edited frame changes esp. It is marked by clearing the bits
+       defined by FRAME_EDITED in the SegCs field of the trap frame */
+    return ((TrapFrame->SegCs & FRAME_EDITED) == 0);
+}
 
 VOID
-FASTCALL
-DECLSPEC_NORETURN
-KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
+FORCEINLINE
+KiCommonExit(IN PKTRAP_FRAME TrapFrame, const ULONG Flags)
 {
     /* Disable interrupts until we return */
     _disable();
@@ -67,8 +86,41 @@ KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
     /* Check for APC delivery */
     KiCheckForApcDelivery(TrapFrame);
     
-    /* Now exit the trap for real */
-    KiExitTrap(TrapFrame, KTE_SKIP_PM_BIT);
+    /* Debugging checks */
+    KiExitTrapDebugChecks(TrapFrame, Flags);
+
+    /* Restore the SEH handler chain */
+    KeGetPcr()->NtTib.ExceptionList = TrapFrame->ExceptionList;
+
+    /* Check if there are active debug registers */
+    if (__builtin_expect(TrapFrame->Dr7 & ~DR7_RESERVED_MASK, 0))
+    {
+        /* Not handled yet */
+        DbgPrint("Need Hardware Breakpoint Support!\n");
+        DbgBreakPoint();
+        while (TRUE);
+    }
+}
+
+VOID
+FASTCALL
+DECLSPEC_NORETURN
+KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
+{
+    /* Common trap exit code */
+    KiCommonExit(TrapFrame, 0);
+
+    /* Check if this was a V8086 trap */
+    if (TrapFrame->EFlags & EFLAGS_V86_MASK) KiTrapReturnNoSegments(TrapFrame);
+
+    /* Check for user mode exit */
+    if (TrapFrame->SegCs & MODE_MASK) KiTrapReturn(TrapFrame);
+
+    /* Check for edited frame */
+    if (KiIsFrameEdited(TrapFrame)) KiEditedTrapReturn(TrapFrame);
+
+    /* Exit the trap to kernel mode */
+    KiTrapReturnNoSegments(TrapFrame);
 }
 
 VOID
@@ -77,17 +129,36 @@ DECLSPEC_NORETURN
 KiServiceExit(IN PKTRAP_FRAME TrapFrame,
               IN NTSTATUS Status)
 {
-    /* Disable interrupts until we return */
-    _disable();
-    
-    /* Check for APC delivery */
-    KiCheckForApcDelivery(TrapFrame);
+    ASSERT((TrapFrame->EFlags & EFLAGS_V86_MASK) == 0);
+    ASSERT(!KiIsFrameEdited(TrapFrame));
     
     /* Copy the status into EAX */
     TrapFrame->Eax = Status;
     
-    /* Now exit the trap for real */
-    KiExitTrap(TrapFrame, KTE_SKIP_SEG_BIT | KTE_SKIP_VOL_BIT);
+    /* Common trap exit code */
+    KiCommonExit(TrapFrame, 0);
+    
+    /* Restore previous mode */
+    KeGetCurrentThread()->PreviousMode = TrapFrame->PreviousPreviousMode;
+
+    /* Check for user mode exit */
+    if (TrapFrame->SegCs & MODE_MASK)
+    {
+        /* Check if we were single stepping */
+        if (TrapFrame->EFlags & EFLAGS_TF)
+        {
+            /* Must use the IRET handler */
+            KiSystemCallTrapReturn(TrapFrame);
+        }
+        else
+        {
+            /* We can use the sysexit handler */
+            KiFastCallExitHandler(TrapFrame);
+        }
+    }
+
+    /* Exit to kernel mode */
+    KiSystemCallReturn(TrapFrame);
 }
 
 VOID
@@ -95,16 +166,26 @@ FASTCALL
 DECLSPEC_NORETURN
 KiServiceExit2(IN PKTRAP_FRAME TrapFrame)
 {
-    /* Disable interrupts until we return */
-    _disable();
+    /* Common trap exit code */
+    KiCommonExit(TrapFrame, 0);
     
-    /* Check for APC delivery */
-    KiCheckForApcDelivery(TrapFrame);
+    /* Restore previous mode */
+    KeGetCurrentThread()->PreviousMode = TrapFrame->PreviousPreviousMode;
     
-    /* Now exit the trap for real */
-    KiExitTrap(TrapFrame, 0);
+    /* Check if this was a V8086 trap */
+    if (TrapFrame->EFlags & EFLAGS_V86_MASK) KiTrapReturnNoSegments(TrapFrame);
+
+    /* Check for user mode exit */
+    if (TrapFrame->SegCs & MODE_MASK) KiTrapReturn(TrapFrame);
+
+    /* Check for edited frame */
+    if (KiIsFrameEdited(TrapFrame)) KiEditedTrapReturn(TrapFrame);
+
+    /* Exit the trap to kernel mode */
+    KiTrapReturnNoSegments(TrapFrame);
 }
 
+
 /* TRAP HANDLERS **************************************************************/
 
 VOID
@@ -223,7 +304,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame,
                                  DataOffset,
                                  TrapFrame);
     }
-    
+
     /* Check for invalid operation */
     if (Error & FSW_INVALID_OPERATION)
     {
@@ -403,7 +484,7 @@ KiTrap02(VOID)
     TrapFrame.Esi = Tss->Esi;
     TrapFrame.Edi = Tss->Edi;
     TrapFrame.SegFs = Tss->Fs;
-    TrapFrame.ExceptionList = PCR->Tib.ExceptionList;
+    TrapFrame.ExceptionList = PCR->NtTib.ExceptionList;
     TrapFrame.PreviousPreviousMode = -1;
     TrapFrame.Eax = Tss->Eax;
     TrapFrame.Ecx = Tss->Ecx;
@@ -540,7 +621,7 @@ KiTrap06Handler(IN PKTRAP_FRAME TrapFrame)
     KIRQL OldIrql;
     
     /* Check for V86 GPF */
-    if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 1))
+    if (__builtin_expect(KiV86Trap(TrapFrame), 1))
     {
         /* Enter V86 trap */
         KiEnterV86Trap(TrapFrame);
@@ -574,10 +655,7 @@ KiTrap06Handler(IN PKTRAP_FRAME TrapFrame)
         _disable();
         
         /* Do a quick V86 exit if possible */
-        if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 1)) KiExitV86Trap(TrapFrame);
-        
-        /* Exit trap the slow way */
-        KiEoiHelper(TrapFrame);
+        KiExitV86Trap(TrapFrame);
     }
 
     /* Save trap frame */
@@ -800,7 +878,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame)
     KIRQL OldIrql;
     
     /* Check for V86 GPF */
-    if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 1))
+    if (__builtin_expect(KiV86Trap(TrapFrame), 1))
     {
         /* Enter V86 trap */
         KiEnterV86Trap(TrapFrame);
@@ -834,10 +912,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame)
         _disable();
         
         /* Do a quick V86 exit if possible */
-        if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 1)) KiExitV86Trap(TrapFrame);
-        
-        /* Exit trap the slow way */
-        KiEoiHelper(TrapFrame);
+        KiExitV86Trap(TrapFrame);
     }
     
     /* Save trap frame */
@@ -845,7 +920,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame)
 
     /* Check for user-mode GPF */
     if (KiUserTrap(TrapFrame))
-    {   
+    {
         /* Should not be VDM */
         ASSERT(KiVdmTrap(TrapFrame) == FALSE);
         
@@ -901,7 +976,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame)
                      (((Instructions[i + 2] & 0x38) == 0x10) ||        // LLDT
                       (Instructions[i + 2] == 0x18))) ||               // LTR
                     ((Instructions[i + 1] == 0x01) &&              // LGDT or LIDT or LMSW
-                     (((Instructions[i + 2] & 0x38) == 0x10) ||        // LLGT
+                     (((Instructions[i + 2] & 0x38) == 0x10) ||        // LGDT
                       (Instructions[i + 2] == 0x18) ||                 // LIDT
                       (Instructions[i + 2] == 0x30))) ||               // LMSW
                     (Instructions[i + 1] == 0x08) ||               // INVD
@@ -913,6 +988,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame)
                     (Instructions[i + 1] == 0x24) ||               // MOV YYY, DR
                     (Instructions[i + 1] == 0x30) ||               // WRMSR
                     (Instructions[i + 1] == 0x33))                 // RDPMC
+                    // INVLPG, INVLPGA, SYSRET
                 {
                     /* These are all privileged */
                     Privileged = TRUE;
@@ -985,7 +1061,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame)
      * a POP <SEG>, which could cause an invalid segment if someone had messed
      * with the segment values.
      *
-     * Another case is a bogus SS, which would hit a GPF when doing the ired.
+     * Another case is a bogus SS, which would hit a GPF when doing the iret.
      * This could only be done through a buggy or malicious driver, or perhaps
      * the kernel debugger.
      *
@@ -1059,9 +1135,14 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame)
         /* Fix it */
         TrapFrame->SegEs = (KGDT_R3_DATA | RPL_MASK);
      }
-     
-     /* Do a direct trap exit: restore volatiles only */
-     KiExitTrap(TrapFrame, KTE_SKIP_PM_BIT | KTE_SKIP_SEG_BIT);
+     else
+     {
+         /* Whatever it is, we can't handle it */
+         KiSystemFatalException(EXCEPTION_GP_FAULT, TrapFrame);
+     }
+    
+    /* Return to where we came from */
+    KiTrapReturn(TrapFrame);
 }
 
 VOID
@@ -1369,55 +1450,89 @@ KiDebugServiceHandler(IN PKTRAP_FRAME TrapFrame)
 }
 
 VOID
-FASTCALL
+FORCEINLINE
 DECLSPEC_NORETURN
-KiSystemCall(IN ULONG SystemCallNumber,
+KiSystemCall(IN PKTRAP_FRAME TrapFrame,
              IN PVOID Arguments)
 {
     PKTHREAD Thread;
-    PKTRAP_FRAME TrapFrame;
     PKSERVICE_TABLE_DESCRIPTOR DescriptorTable;
     ULONG Id, Offset, StackBytes, Result;
     PVOID Handler;
+    ULONG SystemCallNumber = TrapFrame->Eax;
     
-    /* Loop because we might need to try this twice in case of a GUI call */
-    while (TRUE)
+    /* Get the current thread */
+    Thread = KeGetCurrentThread();
+
+    /* Set debug header */
+    KiFillTrapFrameDebug(TrapFrame);
+
+    /* Chain trap frames */
+    TrapFrame->Edx = (ULONG_PTR)Thread->TrapFrame;
+
+    /* No error code */
+    TrapFrame->ErrCode = 0;
+
+    /* Save previous mode */
+    TrapFrame->PreviousPreviousMode = Thread->PreviousMode;
+
+    /* Save the SEH chain and terminate it for now */    
+    TrapFrame->ExceptionList = KeGetPcr()->NtTib.ExceptionList;
+    KeGetPcr()->NtTib.ExceptionList = EXCEPTION_CHAIN_END;
+
+    /* Clear DR7 and check for debugging */
+    TrapFrame->Dr7 = 0;
+    if (__builtin_expect(Thread->DispatcherHeader.DebugActive & 0xFF, 0))
     {
-        /* Decode the system call number */
-        Offset = (SystemCallNumber >> SERVICE_TABLE_SHIFT) & SERVICE_TABLE_MASK;
-        Id = SystemCallNumber & SERVICE_NUMBER_MASK;
+        UNIMPLEMENTED;
+        while (TRUE);
+    }
+
+    /* Set thread fields */
+    Thread->TrapFrame = TrapFrame;
+    Thread->PreviousMode = KiUserTrap(TrapFrame);
+
+    /* Enable interrupts */
+    _enable();
+
+    /* Decode the system call number */
+    Offset = (SystemCallNumber >> SERVICE_TABLE_SHIFT) & SERVICE_TABLE_MASK;
+    Id = SystemCallNumber & SERVICE_NUMBER_MASK;
     
-        /* Get current thread, trap frame, and descriptor table */
-        Thread = KeGetCurrentThread();
-        TrapFrame = Thread->TrapFrame;
-        DescriptorTable = (PVOID)((ULONG_PTR)Thread->ServiceTable + Offset);
+    /* Get descriptor table */
+    DescriptorTable = (PVOID)((ULONG_PTR)Thread->ServiceTable + Offset);
 
-        /* Validate the system call number */
-        if (__builtin_expect(Id > DescriptorTable->Limit, 0))
+    /* Validate the system call number */
+    if (__builtin_expect(Id >= DescriptorTable->Limit, 0))
+    {
+        /* Check if this is a GUI call */
+        if (!(Offset & SERVICE_TABLE_TEST))
         {
-            /* Check if this is a GUI call */
-            if (__builtin_expect(!(Offset & SERVICE_TABLE_TEST), 0))
-            {
-                /* Fail the call */
-                Result = STATUS_INVALID_SYSTEM_SERVICE;
-                goto ExitCall;
-            }
+            /* Fail the call */
+            Result = STATUS_INVALID_SYSTEM_SERVICE;
+            goto ExitCall;
+        }
 
-            /* Convert us to a GUI thread -- must wrap in ASM to get new EBP */        
-            Result = KiConvertToGuiThread();
-            if (__builtin_expect(!NT_SUCCESS(Result), 0))
-            {
-                /* Figure out how we should fail to the user */
-                UNIMPLEMENTED;
-                while (TRUE);
-            }
-            
-            /* Try the call again */
-            continue;
+        /* Convert us to a GUI thread -- must wrap in ASM to get new EBP */        
+        Result = KiConvertToGuiThread();
+        if (!NT_SUCCESS(Result))
+        {
+            /* Set the last error and fail */
+            //SetLastWin32Error(RtlNtStatusToDosError(Result));
+            goto ExitCall;
         }
+            
+        /* Reload trap frame and descriptor table pointer from new stack */
+        TrapFrame = *(volatile PVOID*)&Thread->TrapFrame;
+        DescriptorTable = (PVOID)(*(volatile ULONG_PTR*)&Thread->ServiceTable + Offset);
         
-        /* If we made it here, the call is good */
-        break;
+        /* Validate the system call number again */
+        if (Id >= DescriptorTable->Limit)
+        {
+            /* Fail the call */
+            Result = STATUS_INVALID_SYSTEM_SERVICE;
+            goto ExitCall;
+        }
     }
     
     /* Check if this is a GUI call */
@@ -1460,145 +1575,37 @@ ExitCall:
 }
 
 VOID
-FORCEINLINE
+FASTCALL
 DECLSPEC_NORETURN
-KiSystemCallHandler(IN PKTRAP_FRAME TrapFrame,
-                    IN ULONG ServiceNumber,
-                    IN PVOID Arguments,
-                    IN PKTHREAD Thread,
-                    IN KPROCESSOR_MODE PreviousMode,
-                    IN KPROCESSOR_MODE PreviousPreviousMode,
-                    IN USHORT SegFs)
+KiSystemServiceHandler(IN PKTRAP_FRAME TrapFrame,
+                       IN PVOID Arguments)
 {
-    /* No error code */
-    TrapFrame->ErrCode = 0;
-    
-    /* Save previous mode and FS segment */
-    TrapFrame->PreviousPreviousMode = PreviousPreviousMode;
-    TrapFrame->SegFs = SegFs;
-        
-    /* Save the SEH chain and terminate it for now */    
-    TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList;
-    KeGetPcr()->Tib.ExceptionList = EXCEPTION_CHAIN_END;
-        
-    /* Clear DR7 and check for debugging */
-    TrapFrame->Dr7 = 0;
-    if (__builtin_expect(Thread->DispatcherHeader.DebugActive & 0xFF, 0))
-    {
-        UNIMPLEMENTED;
-        while (TRUE);
-    }
-
-    /* Set thread fields */
-    Thread->TrapFrame = TrapFrame;
-    Thread->PreviousMode = PreviousMode;
-    
-    /* Set debug header */
-    KiFillTrapFrameDebug(TrapFrame);
-    
-    /* Enable interrupts and make the call */
-    _enable();
-    KiSystemCall(ServiceNumber, Arguments);   
+    /* Call the shared handler (inline) */
+    KiSystemCall(TrapFrame, Arguments);
 }
 
 VOID
-__attribute__((regparm(3)))
+FASTCALL
 DECLSPEC_NORETURN
-KiFastCallEntryHandler(IN ULONG ServiceNumber,
-                       IN PVOID Arguments,
-                       IN PKTRAP_FRAME TrapFrame)
+KiFastCallEntryHandler(IN PKTRAP_FRAME TrapFrame,
+                       IN PVOID Arguments)
 {
-    PKTHREAD Thread;
-        
-    /* Fixup segments */
-    Ke386SetFs(KGDT_R0_PCR);
-    Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
-    Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
-    
     /* Set up a fake INT Stack and enable interrupts */
     TrapFrame->HardwareSegSs = KGDT_R3_DATA | RPL_MASK;
     TrapFrame->HardwareEsp = (ULONG_PTR)Arguments;
     TrapFrame->EFlags = __readeflags() | EFLAGS_INTERRUPT_MASK;
     TrapFrame->SegCs = KGDT_R3_CODE | RPL_MASK;
     TrapFrame->Eip = SharedUserData->SystemCallReturn;
+    TrapFrame->SegFs = KGDT_R3_TEB | RPL_MASK;
     __writeeflags(0x2);
     
-    /* Get the current thread */
-    Thread = KeGetCurrentThread();
-    
     /* Arguments are actually 2 frames down (because of the double indirection) */
     Arguments = (PVOID)(TrapFrame->HardwareEsp + 8);
 
     /* Call the shared handler (inline) */
-    KiSystemCallHandler(TrapFrame,
-                        ServiceNumber,
-                        Arguments,
-                        Thread,
-                        UserMode,
-                        Thread->PreviousMode,
-                        KGDT_R3_TEB | RPL_MASK);
-}
-
-VOID
-__attribute__((regparm(3)))
-DECLSPEC_NORETURN
-KiSystemServiceHandler(IN ULONG ServiceNumber,
-                       IN PVOID Arguments,
-                       IN PKTRAP_FRAME TrapFrame)
-{
-    USHORT SegFs;
-    PKTHREAD Thread;
-
-    /* Save and fixup FS */
-    SegFs = Ke386GetFs();
-    Ke386SetFs(KGDT_R0_PCR);
-        
-    /* Get the current thread */
-    Thread = KeGetCurrentThread();
-    
-    /* Chain trap frames */
-    TrapFrame->Edx = (ULONG_PTR)Thread->TrapFrame;
-    
-    /* Clear direction flag */
-    Ke386ClearDirectionFlag();
-    
-    /* Call the shared handler (inline) */
-    KiSystemCallHandler(TrapFrame,
-                        ServiceNumber,
-                        Arguments,
-                        Thread,
-                        KiUserTrap(TrapFrame),
-                        Thread->PreviousMode,
-                        SegFs);
+    KiSystemCall(TrapFrame, Arguments);
 }
 
-/* CPU AND SOFTWARE TRAPS *****************************************************/
-
-KiTrap(KiTrap00,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap01,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap03,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap04,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap05,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap06,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap07,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap08,         0);
-KiTrap(KiTrap09,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap0A,         0);
-KiTrap(KiTrap0B,         0);
-KiTrap(KiTrap0C,         0);
-KiTrap(KiTrap0D,         0);
-KiTrap(KiTrap0E,         0);
-KiTrap(KiTrap0F,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap10,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap11,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiTrap13,         KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiGetTickCount,   KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE);       
-KiTrap(KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiDebugService,   KI_PUSH_FAKE_ERROR_CODE);
-KiTrap(KiSystemService,  KI_PUSH_FAKE_ERROR_CODE | KI_NONVOLATILES_ONLY);
-KiTrap(KiFastCallEntry,  KI_FAST_SYSTEM_CALL);
-
 /*
  * @implemented
  */
index 017a736..2da7268 100644 (file)
@@ -8,12 +8,15 @@
 
 /* INCLUDES ******************************************************************/
 
-#include <asm.h>
+#include <reactos/asm.h>
+#include <ndk/i386/asm.h>
 #include <internal/i386/asmmacro.S>
-.intel_syntax noprefix
 
 /* FUNCTIONS ****************************************************************/
 
+.code32
+.text
+
 .globl _KiGetUserModeStackAddress@0
 .func KiGetUserModeStackAddress@0
 _KiGetUserModeStackAddress@0:
index 1771e58..2d1ff01 100644 (file)
@@ -471,7 +471,7 @@ KiExitV86Mode(IN PKTRAP_FRAME TrapFrame)
 
     /* Restore TEB addresses */
     Thread->Teb = V86Frame->ThreadTeb;
-    KeGetPcr()->Tib.Self = V86Frame->PcrTeb;
+    KeGetPcr()->NtTib.Self = V86Frame->PcrTeb;
     
     /* Setup real TEB descriptor */
     GdtEntry = &((PKIPCR)KeGetPcr())->GDT[KGDT_R3_TEB / sizeof(KGDTENTRY)];
@@ -505,7 +505,7 @@ KiEnterV86Mode(IN PKV8086_STACK_FRAME StackFrame)
     
     /* Save TEB addresses */
     V86Frame->ThreadTeb = Thread->Teb;
-    V86Frame->PcrTeb = KeGetPcr()->Tib.Self;
+    V86Frame->PcrTeb = KeGetPcr()->NtTib.Self;
     
     /* Save return EIP */
     TrapFrame->Eip = (ULONG_PTR)Ki386BiosCallReturnAddress;
@@ -533,7 +533,7 @@ KiEnterV86Mode(IN PKV8086_STACK_FRAME StackFrame)
     RtlCopyMemory(NpxFrame, V86Frame->ThreadStack, sizeof(FX_SAVE_AREA));
     
     /* Clear exception list */
-    KeGetPcr()->Tib.ExceptionList = EXCEPTION_CHAIN_END;
+    KeGetPcr()->NtTib.ExceptionList = EXCEPTION_CHAIN_END;
     
     /* Set new ESP0 */
     KeGetPcr()->TSS->Esp0 = (ULONG_PTR)&TrapFrame->V86Es;
@@ -543,7 +543,7 @@ KiEnterV86Mode(IN PKV8086_STACK_FRAME StackFrame)
         
     /* Set VDM TEB */
     Thread->Teb = (PTEB)TRAMPOLINE_TEB;
-    KeGetPcr()->Tib.Self = (PVOID)TRAMPOLINE_TEB;
+    KeGetPcr()->NtTib.Self = (PVOID)TRAMPOLINE_TEB;
     
     /* Setup VDM TEB descriptor */
     GdtEntry = &((PKIPCR)KeGetPcr())->GDT[KGDT_R3_TEB / sizeof(KGDTENTRY)];
index 74c960c..a4737b0 100644 (file)
@@ -110,7 +110,7 @@ KiAcquireFastMutex(IN PFAST_MUTEX FastMutex)
     FastMutex->Contention++;
 
     /* Wait for the event */
-    KeWaitForSingleObject(&FastMutex->Gate,
+    KeWaitForSingleObject(&FastMutex->Event,
                           WrMutex,
                           KernelMode,
                           FALSE,
index 79d1606..5b06dc5 100644 (file)
@@ -45,7 +45,7 @@ MiMapPageInHyperSpace(IN PEPROCESS Process,
     //
     // Build the PTE
     //
-    TempPte = HyperTemplatePte;
+    TempPte = ValidKernelPte;
     TempPte.u.Hard.PageFrameNumber = Page;
     MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local!
 
@@ -156,7 +156,7 @@ MiMapPagesToZeroInHyperSpace(IN PFN_NUMBER *Pages,
     // Write the current PTE
     //
     PointerPte += (Offset + 1);
-    TempPte = HyperTemplatePte;
+    TempPte = ValidKernelPte;
     MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local!
     do
     {
index b446b09..250324c 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
-#line 15 "ARM³::INIT"
+#line 15 "ARM³::INIT:X86"
 #define MODULE_INVOLVED_IN_ARM3
 #include "../../ARM3/miarm.h"
 
 /* GLOBALS ********************************************************************/
 
-//
-// These are all registry-configurable, but by default, the memory manager will
-// figure out the most appropriate values.
-//
-ULONG MmMaximumNonPagedPoolPercent;
-ULONG MmSizeOfNonPagedPoolInBytes;
-ULONG MmMaximumNonPagedPoolInBytes;
-
-//
-// These numbers describe the discrete equation components of the nonpaged
-// pool sizing algorithm.
-//
-// They are described on http://support.microsoft.com/default.aspx/kb/126402/ja
-// along with the algorithm that uses them, which is implemented later below.
-//
-ULONG MmMinimumNonPagedPoolSize = 256 * 1024;
-ULONG MmMinAdditionNonPagedPoolPerMb = 32 * 1024;
-ULONG MmDefaultMaximumNonPagedPool = 1024 * 1024; 
-ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024;
-
-//
-// The memory layout (and especially variable names) of the NT kernel mode
-// components can be a bit hard to twig, especially when it comes to the non
-// paged area.
-//
-// There are really two components to the non-paged pool:
-//
-// - The initial nonpaged pool, sized dynamically up to a maximum.
-// - The expansion nonpaged pool, sized dynamically up to a maximum.
-//
-// The initial nonpaged pool is physically continuous for performance, and
-// immediately follows the PFN database, typically sharing the same PDE. It is
-// a very small resource (32MB on a 1GB system), and capped at 128MB.
-//
-// Right now we call this the "ARM³ Nonpaged Pool" and it begins somewhere after
-// the PFN database (which starts at 0xB0000000).
-//
-// The expansion nonpaged pool, on the other hand, can grow much bigger (400MB 
-// for a 1GB system). On ARM³ however, it is currently capped at 128MB.
-//
-// The address where the initial nonpaged pool starts is aptly named
-// MmNonPagedPoolStart, and it describes a range of MmSizeOfNonPagedPoolInBytes
-// bytes.
-//
-// Expansion nonpaged pool starts at an address described by the variable called
-// MmNonPagedPoolExpansionStart, and it goes on for MmMaximumNonPagedPoolInBytes
-// minus MmSizeOfNonPagedPoolInBytes bytes, always reaching MmNonPagedPoolEnd
-// (because of the way it's calculated) at 0xFFBE0000.
-//
-// Initial nonpaged pool is allocated and mapped early-on during boot, but what
-// about the expansion nonpaged pool? It is instead composed of special pages
-// which belong to what are called System PTEs. These PTEs are the matter of a
-// later discussion, but they are also considered part of the "nonpaged" OS, due
-// to the fact that they are never paged out -- once an address is described by
-// a System PTE, it is always valid, until the System PTE is torn down.
-//
-// System PTEs are actually composed of two "spaces", the system space proper,
-// and the nonpaged pool expansion space. The latter, as we've already seen, 
-// begins at MmNonPagedPoolExpansionStart. Based on the number of System PTEs
-// that the system will support, the remaining address space below this address
-// is used to hold the system space PTEs. This address, in turn, is held in the
-// variable named MmNonPagedSystemStart, which itself is never allowed to go
-// below 0xEB000000 (thus creating an upper bound on the number of System PTEs).
-//
-// This means that 330MB are reserved for total nonpaged system VA, on top of
-// whatever the initial nonpaged pool allocation is.
-//
-// The following URLs, valid as of April 23rd, 2008, support this evidence:
-//
-// http://www.cs.miami.edu/~burt/journal/NT/memory.html
-// http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/
-//
-PVOID MmNonPagedSystemStart;
-PVOID MmNonPagedPoolStart;
-PVOID MmNonPagedPoolExpansionStart;
-PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END;
-
-//
-// This is where paged pool starts by default
-//
-PVOID MmPagedPoolStart = MI_PAGED_POOL_START;
-PVOID MmPagedPoolEnd;
-
-//
-// And this is its default size
-//
-ULONG MmSizeOfPagedPoolInBytes = MI_MIN_INIT_PAGED_POOLSIZE;
-PFN_NUMBER MmSizeOfPagedPoolInPages = MI_MIN_INIT_PAGED_POOLSIZE / PAGE_SIZE;
-
-//
-// Session space starts at 0xBFFFFFFF and grows downwards
-// By default, it includes an 8MB image area where we map win32k and video card
-// drivers, followed by a 4MB area containing the session's working set. This is
-// then followed by a 20MB mapped view area and finally by the session's paged
-// pool, by default 16MB.
-// 
-// On a normal system, this results in session space occupying the region from
-// 0xBD000000 to 0xC0000000
-//
-// See miarm.h for the defines that determine the sizing of this region. On an
-// NT system, some of these can be configured through the registry, but we don't
-// support that yet.
-//
-PVOID MiSessionSpaceEnd;    // 0xC0000000
-PVOID MiSessionImageEnd;    // 0xC0000000
-PVOID MiSessionImageStart;  // 0xBF800000
-PVOID MiSessionViewStart;   // 0xBE000000
-PVOID MiSessionPoolEnd;     // 0xBE000000
-PVOID MiSessionPoolStart;   // 0xBD000000
-PVOID MmSessionBase;        // 0xBD000000
-ULONG MmSessionSize;
-ULONG MmSessionViewSize;
-ULONG MmSessionPoolSize;
-ULONG MmSessionImageSize;
-
-//
-// The system view space, on the other hand, is where sections that are memory
-// mapped into "system space" end up.
-//
-// By default, it is a 16MB region.
-//
-PVOID MiSystemViewStart;
-ULONG MmSystemViewSize;
-
-//
-// A copy of the system page directory (the page directory associated with the
-// System process) is kept (double-mapped) by the manager in order to lazily
-// map paged pool PDEs into external processes when they fault on a paged pool
-// address.
-//
-PFN_NUMBER MmSystemPageDirectory;
-PMMPTE MmSystemPagePtes;
-
-//
-// The system cache starts right after hyperspace. The first few pages are for
-// keeping track of the system working set list.
-//
-// This should be 0xC0C00000 -- the cache itself starts at 0xC1000000
-//
-PMMWSL MmSystemCacheWorkingSetList = MI_SYSTEM_CACHE_WS_START;
-
-//
-// Windows NT seems to choose between 7000, 11000 and 50000
-// On systems with more than 32MB, this number is then doubled, and further
-// aligned up to a PDE boundary (4MB).
-//
-ULONG MmNumberOfSystemPtes;
-
-//
-// This is how many pages the PFN database will take up
-// In Windows, this includes the Quark Color Table, but not in ARM³
-//
-ULONG MxPfnAllocation;
-
-//
-// Unlike the old ReactOS Memory Manager, ARM³ (and Windows) does not keep track
-// of pages that are not actually valid physical memory, such as ACPI reserved
-// regions, BIOS address ranges, or holes in physical memory address space which
-// could indicate device-mapped I/O memory.
-//
-// In fact, the lack of a PFN entry for a page usually indicates that this is
-// I/O space instead.
-//
-// A bitmap, called the PFN bitmap, keeps track of all page frames by assigning
-// a bit to each. If the bit is set, then the page is valid physical RAM.
-//
-RTL_BITMAP MiPfnBitMap;
-
-//
-// This structure describes the different pieces of RAM-backed address space
-//
-PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
-
-//
-// Before we have a PFN database, memory comes straight from our physical memory
-// blocks, which is nice because it's guaranteed contiguous and also because once
-// we take a page from here, the system doesn't see it anymore.
-// However, once the fun is over, those pages must be re-integrated back into
-// PFN society life, and that requires us keeping a copy of the original layout
-// so that we can parse it later.
-//
-PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
-MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
-
-//
-// This is where we keep track of the most basic physical layout markers
-//
-ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage = -1;
-
-//
-// The total number of pages mapped by the boot loader, which include the kernel
-// HAL, boot drivers, registry, NLS files and other loader data structures is
-// kept track of here. This depends on "LoaderPagesSpanned" being correct when
-// coming from the loader.
-//
-// This number is later aligned up to a PDE boundary.
-//
-ULONG MmBootImageSize;
-
-//
-// These three variables keep track of the core separation of address space that
-// exists between kernel mode and user mode.
-//
-ULONG MmUserProbeAddress;
-PVOID MmHighestUserAddress;
-PVOID MmSystemRangeStart;
-
-
-
-PVOID MmSystemCacheStart;
-PVOID MmSystemCacheEnd;
-MMSUPPORT MmSystemCacheWs;
-
-//
-// This is where hyperspace ends (followed by the system cache working set)
-//
-PVOID MmHyperSpaceEnd;
-
-//
-// Page coloring algorithm data
-//
-ULONG MmSecondaryColors;
-ULONG MmSecondaryColorMask;
-
-//
-// Actual (registry-configurable) size of a GUI thread's stack
-//
-ULONG MmLargeStackSize;
+/* Template PTE and PDE for a kernel page */
+MMPTE ValidKernelPde = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1};
+MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1};
 
 /* PRIVATE FUNCTIONS **********************************************************/
 
-//
-// In Bavaria, this is probably a hate crime
-//
 VOID
-FASTCALL
-MiSyncARM3WithROS(IN PVOID AddressStart,
-                  IN PVOID AddressEnd)
+NTAPI
+MiComputeNonPagedPoolVa(IN ULONG FreePages)
 {
-    //
-    // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder
-    //
-    ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart);
-    while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd))
+    IN PFN_NUMBER PoolPages;
+    
+    /* Check if this is a machine with less than 256MB of RAM, and no overide */
+    if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) &&
+        !(MmSizeOfNonPagedPoolInBytes))
     {
-        //
-        // This both odious and heinous
-        //
-        extern ULONG MmGlobalKernelPageDirectory[1024];
-        MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde];
-        Pde++;
+        /* Force the non paged pool to be 2MB so we can reduce RAM usage */
+        MmSizeOfNonPagedPoolInBytes = 2 * _1MB;
     }
-}
-
-PFN_NUMBER
-NTAPI
-MxGetNextPage(IN PFN_NUMBER PageCount)
-{
-    PFN_NUMBER Pfn;
-    //
-    // Make sure we have enough pages
-    //
-    if (PageCount > MxFreeDescriptor->PageCount)
+    
+    /* Hyperspace ends here */
+    MmHyperSpaceEnd = (PVOID)((ULONG_PTR)MmSystemCacheWorkingSetList - 1);
+    
+    /* Check if the user gave a ridicuously large nonpaged pool RAM size */
+    if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) > (FreePages * 7 / 8))
     {
-        //
-        // Crash the system
-        //
-        KeBugCheckEx(INSTALL_MORE_MEMORY,
-                     MmNumberOfPhysicalPages,
-                     MxFreeDescriptor->PageCount,
-                     MxOldFreeDescriptor.PageCount,
-                     PageCount);
+        /* More than 7/8ths of RAM was dedicated to nonpaged pool, ignore! */
+        MmSizeOfNonPagedPoolInBytes = 0;
     }
     
-    //
-    // Use our lowest usable free pages
-    //
-    Pfn = MxFreeDescriptor->BasePage;
-    MxFreeDescriptor->BasePage += PageCount;
-    MxFreeDescriptor->PageCount -= PageCount;
-    return Pfn;
-}
-
-PFN_NUMBER
-NTAPI
-MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
-                     IN PBOOLEAN IncludeType)
-{
-    PLIST_ENTRY NextEntry;
-    PFN_NUMBER PageCount = 0;
-    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+    /* Check if no registry setting was set, or if the setting was too low */
+    if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize)
+    {
+        /* Start with the minimum (256 KB) and add 32 KB for each MB above 4 */
+        MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize;
+        MmSizeOfNonPagedPoolInBytes += (FreePages - 1024) / 256 * MmMinAdditionNonPagedPoolPerMb;
+    }
     
-    //
-    // Now loop through the descriptors
-    //
-    NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
-    while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+    /* Check if the registy setting or our dynamic calculation was too high */
+    if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE)
     {
-        //
-        // Grab each one, and check if it's one we should include
-        //
-        MdBlock = CONTAINING_RECORD(NextEntry,
-                                    MEMORY_ALLOCATION_DESCRIPTOR,
-                                    ListEntry);
-        if ((MdBlock->MemoryType < LoaderMaximum) &&
-            (IncludeType[MdBlock->MemoryType]))
+        /* Set it to the maximum */
+        MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE;
+    }
+    
+    /* Check if a percentage cap was set through the registry */
+    if (MmMaximumNonPagedPoolPercent) UNIMPLEMENTED;
+    
+    /* Page-align the nonpaged pool size */
+    MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1);
+    
+    /* Now, check if there was a registry size for the maximum size */
+    if (!MmMaximumNonPagedPoolInBytes)
+    {
+        /* Start with the default (1MB) */
+        MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool;
+        
+        /* Add space for PFN database */
+        MmMaximumNonPagedPoolInBytes += (ULONG)
+            PAGE_ALIGN((MmHighestPhysicalPage +  1) * sizeof(MMPFN));
+            
+        /* Check if the machine has more than 512MB of free RAM */
+        if (FreePages >= 0x1F000)
         {
-            //
-            // Add this to our running total
-            //
-            PageCount += MdBlock->PageCount;
+            /* Add 200KB for each MB above 4 */
+            MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 *
+                                            (MmMaxAdditionNonPagedPoolPerMb / 2);
+            if (MmMaximumNonPagedPoolInBytes < MI_MAX_NONPAGED_POOL_SIZE)
+            {
+                /* Make it at least 128MB since this machine has a lot of RAM */
+                MmMaximumNonPagedPoolInBytes = MI_MAX_NONPAGED_POOL_SIZE;
+            }
+        }
+        else
+        {
+            /* Add 400KB for each MB above 4 */
+            MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 *
+                                            MmMaxAdditionNonPagedPoolPerMb;
         }
-        
-        //
-        // Try the next descriptor
-        //
-        NextEntry = MdBlock->ListEntry.Flink;
     }
     
-    //
-    // Return the total
-    //
-    return PageCount;
+    /* Make sure there's at least 16 pages + the PFN available for expansion */
+    PoolPages = MmSizeOfNonPagedPoolInBytes + (PAGE_SIZE * 16) +
+                ((ULONG)PAGE_ALIGN(MmHighestPhysicalPage + 1) * sizeof(MMPFN));
+    if (MmMaximumNonPagedPoolInBytes < PoolPages)
+    {
+        /* The maximum should be at least high enough to cover all the above */
+        MmMaximumNonPagedPoolInBytes = PoolPages;
+    }
+    
+    /* Systems with 2GB of kernel address space get double the size */
+    PoolPages = MI_MAX_NONPAGED_POOL_SIZE * 2;
+    
+    /* On the other hand, make sure that PFN + nonpaged pool doesn't get too big */
+    if (MmMaximumNonPagedPoolInBytes > PoolPages)
+    {
+        /* Trim it down to the maximum architectural limit (256MB) */
+        MmMaximumNonPagedPoolInBytes = PoolPages;
+    }
+    
+    /* Check if this is a system with > 128MB of non paged pool */
+    if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE)
+    {
+        /* Check if the initial size is less than the extra 128MB boost */
+        if (MmSizeOfNonPagedPoolInBytes < (MmMaximumNonPagedPoolInBytes -
+                                           MI_MAX_NONPAGED_POOL_SIZE))
+        {
+            /* FIXME: Should check if the initial pool can be expanded */
+            
+            /* Assume no expansion possible, check ift he maximum is too large */
+            if (MmMaximumNonPagedPoolInBytes > (MmSizeOfNonPagedPoolInBytes +
+                                                MI_MAX_NONPAGED_POOL_SIZE))
+            {
+                /* Set it to the initial value plus the boost */
+                MmMaximumNonPagedPoolInBytes = MmSizeOfNonPagedPoolInBytes +
+                                               MI_MAX_NONPAGED_POOL_SIZE;
+            }    
+        }
+    }
 }
 
-PPHYSICAL_MEMORY_DESCRIPTOR
+NTSTATUS
 NTAPI
-MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
-                         IN PBOOLEAN IncludeType)
+MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
     PLIST_ENTRY NextEntry;
-    ULONG Run = 0, InitialRuns = 0;
-    PFN_NUMBER NextPage = -1, PageCount = 0;
-    PPHYSICAL_MEMORY_DESCRIPTOR Buffer, NewBuffer;
     PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
-    
-    //
-    // Scan the memory descriptors
-    //
-    NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
-    while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+    ULONG FreePages = 0;
+    PFN_NUMBER PageFrameIndex;
+    PMMPTE StartPde, EndPde, PointerPte, LastPte;
+    MMPTE TempPde, TempPte;
+    PVOID NonPagedPoolExpansionVa;
+    ULONG OldCount;
+
+    /* Check for kernel stack size that's too big */
+    if (MmLargeStackSize > (KERNEL_LARGE_STACK_SIZE / _1KB))
     {
-        //
-        // For each one, increase the memory allocation estimate
-        //
-        InitialRuns++;
-        NextEntry = NextEntry->Flink;
+        /* Sanitize to default value */
+        MmLargeStackSize = KERNEL_LARGE_STACK_SIZE;
+    }
+    else
+    {
+        /* Take the registry setting, and convert it into bytes */
+        MmLargeStackSize *= _1KB;
+        
+        /* Now align it to a page boundary */
+        MmLargeStackSize = PAGE_ROUND_UP(MmLargeStackSize);
+        
+        /* Sanity checks */
+        ASSERT(MmLargeStackSize <= KERNEL_LARGE_STACK_SIZE);
+        ASSERT((MmLargeStackSize & (PAGE_SIZE - 1)) == 0);
+        
+        /* Make sure it's not too low */
+        if (MmLargeStackSize < KERNEL_STACK_SIZE) MmLargeStackSize = KERNEL_STACK_SIZE;
     }
     
+    /* Check for global bit */
+#if 0
+    if (KeFeatureBits & KF_GLOBAL_PAGE)
+    {
+        /* Set it on the template PTE and PDE */
+        ValidKernelPte.u.Hard.Global = TRUE;
+        ValidKernelPde.u.Hard.Global = TRUE;
+    }
+#endif
+    /* Now templates are ready */
+    TempPte = ValidKernelPte;
+    TempPde = ValidKernelPde;
+     
     //
-    // Allocate the maximum we'll ever need
+    // Set CR3 for the system process
     //
-    Buffer = ExAllocatePoolWithTag(NonPagedPool,
-                                   sizeof(PHYSICAL_MEMORY_DESCRIPTOR) +
-                                   sizeof(PHYSICAL_MEMORY_RUN) *
-                                   (InitialRuns - 1),
-                                   'lMmM');
-    if (!Buffer) return NULL;
-
+    PointerPte = MiAddressToPde(PTE_BASE);
+    PageFrameIndex = PFN_FROM_PTE(PointerPte) << PAGE_SHIFT;
+    PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PageFrameIndex;
+    
     //
-    // For now that's how many runs we have
+    // Blow away user-mode
     //
-    Buffer->NumberOfRuns = InitialRuns;
+    StartPde = MiAddressToPde(0);
+    EndPde = MiAddressToPde(KSEG0_BASE);
+    RtlZeroMemory(StartPde, (EndPde - StartPde) * sizeof(MMPTE));
     
     //
-    // Now loop through the descriptors again
+    // Loop the memory descriptors
     //
     NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
     while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
     {
         //
-        // Grab each one, and check if it's one we should include
+        // Get the memory block
         //
         MdBlock = CONTAINING_RECORD(NextEntry,
                                     MEMORY_ALLOCATION_DESCRIPTOR,
                                     ListEntry);
-        if ((MdBlock->MemoryType < LoaderMaximum) &&
-            (IncludeType[MdBlock->MemoryType]))
+        
+        //
+        // Skip invisible memory
+        //
+        if ((MdBlock->MemoryType != LoaderFirmwarePermanent) &&
+            (MdBlock->MemoryType != LoaderSpecialMemory) &&
+            (MdBlock->MemoryType != LoaderHALCachedMemory) &&
+            (MdBlock->MemoryType != LoaderBBTMemory))
         {
             //
-            // Add this to our running total
+            // Check if BURNMEM was used
+            //
+            if (MdBlock->MemoryType != LoaderBad)
+            {
+                //
+                // Count this in the total of pages
+                //
+                MmNumberOfPhysicalPages += MdBlock->PageCount;
+            }
+            
+            //
+            // Check if this is the new lowest page
             //
-            PageCount += MdBlock->PageCount;
+            if (MdBlock->BasePage < MmLowestPhysicalPage)
+            {
+                //
+                // Update the lowest page
+                //
+                MmLowestPhysicalPage = MdBlock->BasePage;
+            }
             
             //
-            // Check if the next page is described by the next descriptor
-            //            
-            if (MdBlock->BasePage == NextPage)
+            // Check if this is the new highest page
+            //
+            PageFrameIndex = MdBlock->BasePage + MdBlock->PageCount;
+            if (PageFrameIndex > MmHighestPhysicalPage)
             {
                 //
-                // Combine it into the same physical run
+                // Update the highest page
                 //
-                ASSERT(MdBlock->PageCount != 0);
-                Buffer->Run[Run - 1].PageCount += MdBlock->PageCount;
-                NextPage += MdBlock->PageCount;
+                MmHighestPhysicalPage = PageFrameIndex - 1;
             }
-            else
+            
+            //
+            // Check if this is free memory
+            //
+            if ((MdBlock->MemoryType == LoaderFree) ||
+                (MdBlock->MemoryType == LoaderLoadedProgram) ||
+                (MdBlock->MemoryType == LoaderFirmwareTemporary) ||
+                (MdBlock->MemoryType == LoaderOsloaderStack))
             {
                 //
-                // Otherwise just duplicate the descriptor's contents
+                // Check if this is the largest memory descriptor
                 //
-                Buffer->Run[Run].BasePage = MdBlock->BasePage;
-                Buffer->Run[Run].PageCount = MdBlock->PageCount;
-                NextPage = Buffer->Run[Run].BasePage + Buffer->Run[Run].PageCount;
+                if (MdBlock->PageCount > FreePages)
+                {
+                    //
+                    // For now, it is
+                    //
+                    MxFreeDescriptor = MdBlock;
+                }
                 
                 //
-                // And in this case, increase the number of runs
+                // More free pages
                 //
-                Run++;
+                FreePages += MdBlock->PageCount;
             }
         }
         
         //
-        // Try the next descriptor
+        // Keep going
         //
         NextEntry = MdBlock->ListEntry.Flink;
     }
     
     //
-    // We should not have been able to go past our initial estimate
+    // Save original values of the free descriptor, since it'll be
+    // altered by early allocations
     //
-    ASSERT(Run <= Buffer->NumberOfRuns);
-
+    MxOldFreeDescriptor = *MxFreeDescriptor;
+    
+    /* Compute non paged pool limits and size */
+    MiComputeNonPagedPoolVa(FreePages);
+    
+    /* Compute color information (L2 cache-separated paging lists) */
+    MiComputeColorInformation();
+    
     //
-    // Our guess was probably exaggerated...
+    // Calculate the number of bytes for the PFN database, double it for ARM3,
+    // then add the color tables and convert to pages
     //
-    if (InitialRuns > Run)
-    {
-        //
-        // Allocate a more accurately sized buffer
-        //
-        NewBuffer = ExAllocatePoolWithTag(NonPagedPool,
-                                          sizeof(PHYSICAL_MEMORY_DESCRIPTOR) +
-                                          sizeof(PHYSICAL_MEMORY_RUN) *
-                                          (Run - 1),
-                                          'lMmM');
-        if (NewBuffer)
-        {
-            //
-            // Copy the old buffer into the new, then free it
-            //
-            RtlCopyMemory(NewBuffer->Run,
-                          Buffer->Run,
-                          sizeof(PHYSICAL_MEMORY_RUN) * Run);
-            ExFreePool(Buffer);
-            
-            //
-            // Now use the new buffer
-            //
-            Buffer = NewBuffer;
-        }
-    }
+    MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN);
+    MxPfnAllocation <<= 1;
+    MxPfnAllocation += (MmSecondaryColors * sizeof(MMCOLOR_TABLES) * 2);
+    MxPfnAllocation >>= PAGE_SHIFT;
     
     //
-    // Write the final numbers, and return it
+    // We have to add one to the count here, because in the process of
+    // shifting down to the page size, we actually ended up getting the
+    // lower aligned size (so say, 0x5FFFF bytes is now 0x5F pages).
+    // Later on, we'll shift this number back into bytes, which would cause
+    // us to end up with only 0x5F000 bytes -- when we actually want to have
+    // 0x60000 bytes.
     //
-    Buffer->NumberOfRuns = Run;
-    Buffer->NumberOfPages = PageCount;
-    return Buffer;
-}
-
-VOID
-NTAPI
-MiBuildPagedPool(VOID)
-{
-    PMMPTE PointerPte, PointerPde;
-    MMPTE TempPte = HyperTemplatePte;
-    PFN_NUMBER PageFrameIndex;
-    KIRQL OldIrql;
-    ULONG Size, BitMapSize;
+    MxPfnAllocation++;
     
     //
-    // Get the page frame number for the system page directory
+    // Now calculate the nonpaged pool expansion VA region
     //
-    PointerPte = MiAddressToPte(PDE_BASE);
-    MmSystemPageDirectory = PFN_FROM_PTE(PointerPte);
+    MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmNonPagedPoolEnd -
+                                  MmMaximumNonPagedPoolInBytes +
+                                  MmSizeOfNonPagedPoolInBytes);
+    MmNonPagedPoolStart = (PVOID)PAGE_ALIGN(MmNonPagedPoolStart);
+    NonPagedPoolExpansionVa = MmNonPagedPoolStart;
+    DPRINT("NP Pool has been tuned to: %d bytes and %d bytes\n",
+           MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes);
     
     //
-    // Allocate a system PTE which will hold a copy of the page directory
+    // Now calculate the nonpaged system VA region, which includes the
+    // nonpaged pool expansion (above) and the system PTEs. Note that it is
+    // then aligned to a PDE boundary (4MB).
     //
-    PointerPte = MiReserveSystemPtes(1, SystemPteSpace);
-    ASSERT(PointerPte);
-    MmSystemPagePtes = MiPteToAddress(PointerPte);
-
+    MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart -
+                                    (MmNumberOfSystemPtes + 1) * PAGE_SIZE);
+    MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart &
+                                    ~((4 * 1024 * 1024) - 1));
+    
     //
-    // Make this system PTE point to the system page directory.
-    // It is now essentially double-mapped. This will be used later for lazy
-    // evaluation of PDEs accross process switches, similarly to how the Global
-    // page directory array in the old ReactOS Mm is used (but in a less hacky
-    // way).
+    // Don't let it go below the minimum
     //
-    TempPte = HyperTemplatePte;
-    TempPte.u.Hard.PageFrameNumber = MmSystemPageDirectory;
-    ASSERT(PointerPte->u.Hard.Valid == 0);
-    ASSERT(TempPte.u.Hard.Valid == 1);
-    *PointerPte = TempPte;
-
+    if (MmNonPagedSystemStart < (PVOID)0xEB000000)
+    {
+        //
+        // This is a hard-coded limit in the Windows NT address space
+        //
+        MmNonPagedSystemStart = (PVOID)0xEB000000;
+        
+        //
+        // Reduce the amount of system PTEs to reach this point
+        //
+        MmNumberOfSystemPtes = ((ULONG_PTR)MmNonPagedPoolStart -
+                                (ULONG_PTR)MmNonPagedSystemStart) >>
+                                PAGE_SHIFT;
+        MmNumberOfSystemPtes--;
+        ASSERT(MmNumberOfSystemPtes > 1000);
+    }
+    
     //
-    // Let's get back to paged pool work: size it up.
-    // By default, it should be twice as big as nonpaged pool.
+    // Check if we are in a situation where the size of the paged pool
+    // is so large that it overflows into nonpaged pool
     //
-    MmSizeOfPagedPoolInBytes = 2 * MmMaximumNonPagedPoolInBytes;
-    if (MmSizeOfPagedPoolInBytes > ((ULONG_PTR)MmNonPagedSystemStart -
-                                    (ULONG_PTR)MmPagedPoolStart))
+    if (MmSizeOfPagedPoolInBytes >
+        ((ULONG_PTR)MmNonPagedSystemStart - (ULONG_PTR)MmPagedPoolStart))
     {
         //
-        // On the other hand, we have limited VA space, so make sure that the VA
-        // for paged pool doesn't overflow into nonpaged pool VA. Otherwise, set
-        // whatever maximum is possible.
+        // We need some recalculations here
         //
-        MmSizeOfPagedPoolInBytes = (ULONG_PTR)MmNonPagedSystemStart -
-                                   (ULONG_PTR)MmPagedPoolStart;
+        DPRINT1("Paged pool is too big!\n");
     }
-
-    //
-    // Get the size in pages and make sure paged pool is at least 32MB.
+    
     //
-    Size = MmSizeOfPagedPoolInBytes;
-    if (Size < MI_MIN_INIT_PAGED_POOLSIZE) Size = MI_MIN_INIT_PAGED_POOLSIZE;
-    Size = BYTES_TO_PAGES(Size);
-
+    // Normally, the PFN database should start after the loader images.
+    // This is already the case in ReactOS, but for now we want to co-exist
+    // with the old memory manager, so we'll create a "Shadow PFN Database"
+    // instead, and arbitrarly start it at 0xB0000000.
     //
-    // Now check how many PTEs will be required for these many pages.
+    // We actually create two PFN databases, one for ReactOS starting here,
+    // and the next one used for ARM3, which starts right after. The MmPfnAllocation
+    // variable actually holds the size of both (the colored tables come after
+    // the ARM3 PFN database).
     //
-    Size = (Size + (1024 - 1)) / 1024;
-
+    MmPfnDatabase[0] = (PVOID)0xB0000000;
+    MmPfnDatabase[1] = &MmPfnDatabase[0][MmHighestPhysicalPage];
+    ASSERT(((ULONG_PTR)MmPfnDatabase[0] & ((4 * 1024 * 1024) - 1)) == 0);
+            
     //
-    // Recompute the page-aligned size of the paged pool, in bytes and pages.
+    // Non paged pool comes after the PFN database
     //
-    MmSizeOfPagedPoolInBytes = Size * PAGE_SIZE * 1024;
-    MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT;
+    MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase[0] +
+                                  (MxPfnAllocation << PAGE_SHIFT));
 
     //
-    // Let's be really sure this doesn't overflow into nonpaged system VA
+    // Now we actually need to get these many physical pages. Nonpaged pool
+    // is actually also physically contiguous (but not the expansion)
     //
-    ASSERT((MmSizeOfPagedPoolInBytes + (ULONG_PTR)MmPagedPoolStart) <= 
-           (ULONG_PTR)MmNonPagedSystemStart);
+    PageFrameIndex = MxGetNextPage(MxPfnAllocation +
+                                   (MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT));
+    ASSERT(PageFrameIndex != 0);
+    DPRINT("PFN DB PA PFN begins at: %lx\n", PageFrameIndex);
+    DPRINT("NP PA PFN begins at: %lx\n", PageFrameIndex + MxPfnAllocation);
 
-    //
-    // This is where paged pool ends
-    //
-    MmPagedPoolEnd = (PVOID)(((ULONG_PTR)MmPagedPoolStart +
-                              MmSizeOfPagedPoolInBytes) - 1);
+    /* Convert nonpaged pool size from bytes to pages */
+    MmMaximumNonPagedPoolInPages = MmMaximumNonPagedPoolInBytes >> PAGE_SHIFT;
 
     //
-    // So now get the PDE for paged pool and zero it out
+    // Now we need some pages to create the page tables for the NP system VA
+    // which includes system PTEs and expansion NP
     //
-    PointerPde = MiAddressToPde(MmPagedPoolStart);
-    RtlZeroMemory(PointerPde,
-                  (1 + MiAddressToPde(MmPagedPoolEnd) - PointerPde) * sizeof(MMPTE));
+    StartPde = MiAddressToPde(MmNonPagedSystemStart);
+    EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
+    while (StartPde <= EndPde)
+    {
+        //
+        // Sanity check
+        //
+        ASSERT(StartPde->u.Hard.Valid == 0);
+        
+        //
+        // Get a page
+        //
+        TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
+        ASSERT(TempPde.u.Hard.Valid == 1);
+        *StartPde = TempPde;
+        
+        //
+        // Zero out the page table
+        //
+        PointerPte = MiPteToAddress(StartPde);
+        RtlZeroMemory(PointerPte, PAGE_SIZE);
+        
+        //
+        // Next
+        //
+        StartPde++;
+    }
 
     //
-    // Next, get the first and last PTE
+    // Now we need pages for the page tables which will map initial NP
     //
-    PointerPte = MiAddressToPte(MmPagedPoolStart);
-    MmPagedPoolInfo.FirstPteForPagedPool = PointerPte;
-    MmPagedPoolInfo.LastPteForPagedPool = MiAddressToPte(MmPagedPoolEnd);
+    StartPde = MiAddressToPde(MmPfnDatabase[0]);
+    EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart +
+                                    MmSizeOfNonPagedPoolInBytes - 1));
+    while (StartPde <= EndPde)
+    {
+        //
+        // Sanity check
+        //
+        ASSERT(StartPde->u.Hard.Valid == 0);
+        
+        //
+        // Get a page
+        //
+        TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
+        ASSERT(TempPde.u.Hard.Valid == 1);
+        *StartPde = TempPde;
+        
+        //
+        // Zero out the page table
+        //
+        PointerPte = MiPteToAddress(StartPde);
+        RtlZeroMemory(PointerPte, PAGE_SIZE);
+        
+        //
+        // Next
+        //
+        StartPde++;
+    }
 
     //
-    // Lock the PFN database
+    // Now remember where the expansion starts
     //
-    OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+    MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa;
 
     //
-    // Allocate a page and map the first paged pool PDE
+    // Last step is to actually map the nonpaged pool
     //
-    PageFrameIndex = MmAllocPage(MC_NPPOOL, 0);
-    TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
-    ASSERT(PointerPde->u.Hard.Valid == 0);
-    ASSERT(TempPte.u.Hard.Valid == 1);
-    *PointerPde = TempPte;
-
+    PointerPte = MiAddressToPte(MmNonPagedPoolStart);
+    LastPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolStart +
+                                     MmSizeOfNonPagedPoolInBytes - 1));
+    while (PointerPte <= LastPte)
+    {
+        //
+        // Use one of our contigous pages
+        //
+        TempPte.u.Hard.PageFrameNumber = PageFrameIndex++;
+        ASSERT(PointerPte->u.Hard.Valid == 0);
+        ASSERT(TempPte.u.Hard.Valid == 1);
+        *PointerPte++ = TempPte;
+    }
+    
     //
-    // Release the PFN database lock
+    // Sanity check: make sure we have properly defined the system PTE space
     //
-    KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+    ASSERT(MiAddressToPte(MmNonPagedSystemStart) <
+           MiAddressToPte(MmNonPagedPoolExpansionStart));
+    
+    /* Now go ahead and initialize the nonpaged pool */
+    MiInitializeNonPagedPool();
+    MiInitializeNonPagedPoolThresholds();
 
+    /* Map the PFN database pages */
+    MiMapPfnDatabase(LoaderBlock);
+    
+    /* Initialize the color tables */
+    MiInitializeColorTables();
+    
+    /* Build the PFN Database */
+    MiInitializePfnDatabase(LoaderBlock);
+
+    /* Call back into shitMM to setup the ReactOS PFN database */
+    MmInitializePageList();
+        
     //
-    // We only have one PDE mapped for now... at fault time, additional PDEs
-    // will be allocated to handle paged pool growth. This is where they'll have
-    // to start.
+    // Reset the descriptor back so we can create the correct memory blocks
     //
-    MmPagedPoolInfo.NextPdeForPagedPoolExpansion = PointerPde + 1;
-
+    *MxFreeDescriptor = MxOldFreeDescriptor;
+    
     //
-    // We keep track of each page via a bit, so check how big the bitmap will
-    // have to be (make sure to align our page count such that it fits nicely
-    // into a 4-byte aligned bitmap.
+    // Initialize the nonpaged pool
     //
-    // We'll also allocate the bitmap header itself part of the same buffer.
+    InitializePool(NonPagedPool, 0);
+    
     //
-    Size = Size * 1024;
-    ASSERT(Size == MmSizeOfPagedPoolInPages);
-    BitMapSize = Size;
-    Size = sizeof(RTL_BITMAP) + (((Size + 31) / 32) * sizeof(ULONG));
-
+    // We PDE-aligned the nonpaged system start VA, so haul some extra PTEs!
     //
-    // Allocate the allocation bitmap, which tells us which regions have not yet
-    // been mapped into memory
+    PointerPte = MiAddressToPte(MmNonPagedSystemStart);
+    OldCount = MmNumberOfSystemPtes;
+    MmNumberOfSystemPtes = MiAddressToPte(MmNonPagedPoolExpansionStart) -
+                           PointerPte;
+    MmNumberOfSystemPtes--;
+    DPRINT("Final System PTE count: %d (%d bytes)\n",
+           MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
+    
     //
-    MmPagedPoolInfo.PagedPoolAllocationMap = ExAllocatePoolWithTag(NonPagedPool,
-                                                                   Size,
-                                                                   '  mM');
-    ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap);
-
+    // Create the system PTE space
     //
-    // Initialize it such that at first, only the first page's worth of PTEs is
-    // marked as allocated (incidentially, the first PDE we allocated earlier).
+    MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace);
+    
     //
-    RtlInitializeBitMap(MmPagedPoolInfo.PagedPoolAllocationMap,
-                        (PULONG)(MmPagedPoolInfo.PagedPoolAllocationMap + 1),
-                        BitMapSize);
-    RtlSetAllBits(MmPagedPoolInfo.PagedPoolAllocationMap);
-    RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, 0, 1024);
-
+    // Get the PDE For hyperspace
     //
-    // We have a second bitmap, which keeps track of where allocations end.
-    // Given the allocation bitmap and a base address, we can therefore figure
-    // out which page is the last page of that allocation, and thus how big the
-    // entire allocation is.
+    StartPde = MiAddressToPde(HYPER_SPACE);
+    
     //
-    MmPagedPoolInfo.EndOfPagedPoolBitmap = ExAllocatePoolWithTag(NonPagedPool,
-                                                                 Size,
-                                                                 '  mM');
-    ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap);
-    RtlInitializeBitMap(MmPagedPoolInfo.EndOfPagedPoolBitmap,
-                        (PULONG)(MmPagedPoolInfo.EndOfPagedPoolBitmap + 1),
-                        BitMapSize);
-
+    // Allocate a page for it and create it
     //
-    // Since no allocations have been made yet, there are no bits set as the end
+    PageFrameIndex = MmAllocPage(MC_SYSTEM);
+    TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
+    TempPde.u.Hard.Global = FALSE; // Hyperspace is local!
+    ASSERT(StartPde->u.Hard.Valid == 0);
+    ASSERT(TempPde.u.Hard.Valid == 1);
+    *StartPde = TempPde;
+    
     //
-    RtlClearAllBits(MmPagedPoolInfo.EndOfPagedPoolBitmap);
-
+    // Zero out the page table now
     //
-    // Initialize paged pool.
+    PointerPte = MiAddressToPte(HYPER_SPACE);
+    RtlZeroMemory(PointerPte, PAGE_SIZE);
+    
+    //
+    // Setup the mapping PTEs
     //
-    InitializePool(PagedPool, 0);
+    MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START);
+    MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END);
+    MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES;
 
     //
-    // Initialize the paged pool mutex
+    // Reserve system PTEs for zeroing PTEs and clear them
     //
-    KeInitializeGuardedMutex(&MmPagedPoolMutex);
-}
-
-NTSTATUS
-NTAPI
-MmArmInitSystem(IN ULONG Phase,
-                IN PLOADER_PARAMETER_BLOCK LoaderBlock)
-{
-    PLIST_ENTRY NextEntry;
-    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
-    ULONG FreePages = 0;
-    PFN_NUMBER PageFrameIndex, PoolPages;
-    PMMPTE StartPde, EndPde, PointerPte, LastPte;
-    MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte;
-    PVOID NonPagedPoolExpansionVa;
-    ULONG OldCount, i, L2Associativity;
-    BOOLEAN IncludeType[LoaderMaximum];
-    PVOID Bitmap;
-    PPHYSICAL_MEMORY_RUN Run;
-    PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount;
+    MiFirstReservedZeroingPte = MiReserveSystemPtes(MI_ZERO_PTES,
+                                                    SystemPteSpace);
+    RtlZeroMemory(MiFirstReservedZeroingPte, MI_ZERO_PTES * sizeof(MMPTE));
     
     //
-    // Instantiate memory that we don't consider RAM/usable
-    // We use the same exclusions that Windows does, in order to try to be
-    // compatible with WinLDR-style booting
+    // Set the counter to maximum to boot with
     //
-    for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE;
-    IncludeType[LoaderBad] = FALSE;
-    IncludeType[LoaderFirmwarePermanent] = FALSE;
-    IncludeType[LoaderSpecialMemory] = FALSE;
-    IncludeType[LoaderBBTMemory] = FALSE;
-    if (Phase == 0)
-    {
-        //
-        // Define the basic user vs. kernel address space separation
-        //
-        MmSystemRangeStart = (PVOID)KSEG0_BASE;
-        MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000;
-        MmHighestUserAddress = (PVOID)(MmUserProbeAddress - 1);
-        
-        //
-        // Get the size of the boot loader's image allocations and then round
-        // that region up to a PDE size, so that any PDEs we might create for
-        // whatever follows are separate from the PDEs that boot loader might've
-        // already created (and later, we can blow all that away if we want to).
-        //
-        MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned;
-        MmBootImageSize *= PAGE_SIZE;
-        MmBootImageSize = (MmBootImageSize + (4 * 1024 * 1024) - 1) & ~((4 * 1024 * 1024) - 1);
-        ASSERT((MmBootImageSize % (4 * 1024 * 1024)) == 0);
-        
-        //
-        // Set the size of session view, pool, and image
-        //
-        MmSessionSize = MI_SESSION_SIZE;
-        MmSessionViewSize = MI_SESSION_VIEW_SIZE;
-        MmSessionPoolSize = MI_SESSION_POOL_SIZE;
-        MmSessionImageSize = MI_SESSION_IMAGE_SIZE;
-        
-        //
-        // Set the size of system view
-        //
-        MmSystemViewSize = MI_SYSTEM_VIEW_SIZE;
-        
-        //
-        // This is where it all ends
-        //
-        MiSessionImageEnd = (PVOID)PTE_BASE;
-        
-        //
-        // This is where we will load Win32k.sys and the video driver
-        //
-        MiSessionImageStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
-                                      MmSessionImageSize);
-        
-        //
-        // So the view starts right below the session working set (itself below
-        // the image area)
-        //
-        MiSessionViewStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
-                                     MmSessionImageSize -
-                                     MI_SESSION_WORKING_SET_SIZE - 
-                                     MmSessionViewSize);
-        
-        //
-        // Session pool follows
-        //
-        MiSessionPoolEnd = MiSessionViewStart;
-        MiSessionPoolStart = (PVOID)((ULONG_PTR)MiSessionPoolEnd -
-                                     MmSessionPoolSize);
-        
-        //
-        // And it all begins here
-        //
-        MmSessionBase = MiSessionPoolStart;
-        
-        //
-        // Sanity check that our math is correct
-        //
-        ASSERT((ULONG_PTR)MmSessionBase + MmSessionSize == PTE_BASE);
-        
-        //
-        // Session space ends wherever image session space ends
-        //
-        MiSessionSpaceEnd = MiSessionImageEnd;
-        
-        //
-        // System view space ends at session space, so now that we know where
-        // this is, we can compute the base address of system view space itself.
-        //
-        MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase -
-                                    MmSystemViewSize);
-                                    
-        //
-        // Count physical pages on the system
-        //
-        PageCount = MiPagesInLoaderBlock(LoaderBlock, IncludeType);
-        
-        //
-        // Check if this is a machine with less than 19MB of RAM
-        //
-        if (PageCount < MI_MIN_PAGES_FOR_SYSPTE_TUNING)
-        {
-            //
-            // Use the very minimum of system PTEs
-            //
-            MmNumberOfSystemPtes = 7000;
-        }
-        else
-        {
-            //
-            // Use the default, but check if we have more than 32MB of RAM
-            //
-            MmNumberOfSystemPtes = 11000;
-            if (PageCount > MI_MIN_PAGES_FOR_SYSPTE_BOOST)
-            {
-                //
-                // Double the amount of system PTEs
-                //
-                MmNumberOfSystemPtes <<= 1;
-            }
-        }
-        
-        DPRINT("System PTE count has been tuned to %d (%d bytes)\n",
-               MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
-               
-        //
-        //
-        // Start of Architecture Specific Initialization Code
-        //
-        //
-        
-        //
-        // The large kernel stack is cutomizable, but use default value for now
-        //
-        MmLargeStackSize = KERNEL_LARGE_STACK_SIZE;
-        
-        //
-        // Setup template
-        //
-        HyperTemplatePte.u.Long = 0;
-        HyperTemplatePte.u.Hard.Valid = 1;
-        HyperTemplatePte.u.Hard.Write = 1;
-        HyperTemplatePte.u.Hard.Dirty = 1;
-        HyperTemplatePte.u.Hard.Accessed = 1;
-        if (Ke386GlobalPagesEnabled) HyperTemplatePte.u.Hard.Global = 1;
-
-        //
-        // Set CR3 for the system process
-        //
-        PointerPte = MiAddressToPde(PTE_BASE);
-        PageFrameIndex = PFN_FROM_PTE(PointerPte) << PAGE_SHIFT;
-        PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PageFrameIndex;
-        
-        //
-        // Blow away user-mode
-        //
-        StartPde = MiAddressToPde(0);
-        EndPde = MiAddressToPde(KSEG0_BASE);
-        RtlZeroMemory(StartPde, (EndPde - StartPde) * sizeof(MMPTE));
-        
-        //
-        // Loop the memory descriptors
-        //
-        NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
-        while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
-        {
-            //
-            // Get the memory block
-            //
-            MdBlock = CONTAINING_RECORD(NextEntry,
-                                        MEMORY_ALLOCATION_DESCRIPTOR,
-                                        ListEntry);
-            
-            //
-            // Skip invisible memory
-            //
-            if ((MdBlock->MemoryType != LoaderFirmwarePermanent) &&
-                (MdBlock->MemoryType != LoaderSpecialMemory) &&
-                (MdBlock->MemoryType != LoaderHALCachedMemory) &&
-                (MdBlock->MemoryType != LoaderBBTMemory))
-            {
-                //
-                // Check if BURNMEM was used
-                //
-                if (MdBlock->MemoryType != LoaderBad)
-                {
-                    //
-                    // Count this in the total of pages
-                    //
-                    MmNumberOfPhysicalPages += MdBlock->PageCount;
-                }
-                
-                //
-                // Check if this is the new lowest page
-                //
-                if (MdBlock->BasePage < MmLowestPhysicalPage)
-                {
-                    //
-                    // Update the lowest page
-                    //
-                    MmLowestPhysicalPage = MdBlock->BasePage;
-                }
-                
-                //
-                // Check if this is the new highest page
-                //
-                PageFrameIndex = MdBlock->BasePage + MdBlock->PageCount;
-                if (PageFrameIndex > MmHighestPhysicalPage)
-                {
-                    //
-                    // Update the highest page
-                    //
-                    MmHighestPhysicalPage = PageFrameIndex - 1;
-                }
-                
-                //
-                // Check if this is free memory
-                //
-                if ((MdBlock->MemoryType == LoaderFree) ||
-                    (MdBlock->MemoryType == LoaderLoadedProgram) ||
-                    (MdBlock->MemoryType == LoaderFirmwareTemporary) ||
-                    (MdBlock->MemoryType == LoaderOsloaderStack))
-                {
-                    //
-                    // Check if this is the largest memory descriptor
-                    //
-                    if (MdBlock->PageCount > FreePages)
-                    {
-                        //
-                        // For now, it is
-                        //
-                        MxFreeDescriptor = MdBlock;
-                    }
-                    
-                    //
-                    // More free pages
-                    //
-                    FreePages += MdBlock->PageCount;
-                }
-            }
-            
-            //
-            // Keep going
-            //
-            NextEntry = MdBlock->ListEntry.Flink;
-        }
-        
-        //
-        // Save original values of the free descriptor, since it'll be
-        // altered by early allocations
-        //
-        MxOldFreeDescriptor = *MxFreeDescriptor;
-        
-        //
-        // Check if this is a machine with less than 256MB of RAM, and no overide
-        //
-        if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) &&
-            !(MmSizeOfNonPagedPoolInBytes))
-        {
-            //
-            // Force the non paged pool to be 2MB so we can reduce RAM usage
-            //
-            MmSizeOfNonPagedPoolInBytes = 2 * 1024 * 1024;
-        }
-        
-        //
-        // Hyperspace ends here
-        //
-        MmHyperSpaceEnd = (PVOID)((ULONG_PTR)MmSystemCacheWorkingSetList - 1);
-        
-        //
-        // Check if the user gave a ridicuously large nonpaged pool RAM size
-        //
-        if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) >
-            (MmNumberOfPhysicalPages * 7 / 8))
-        {
-            //
-            // More than 7/8ths of RAM was dedicated to nonpaged pool, ignore!
-            //
-            MmSizeOfNonPagedPoolInBytes = 0;
-        }
-        
-        //
-        // Check if no registry setting was set, or if the setting was too low
-        //
-        if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize)
-        {
-            //
-            // Start with the minimum (256 KB) and add 32 KB for each MB above 4
-            //
-            MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize;
-            MmSizeOfNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) /
-                                           256 * MmMinAdditionNonPagedPoolPerMb;
-        }
-        
-        //
-        // Check if the registy setting or our dynamic calculation was too high
-        //
-        if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE)
-        {
-            //
-            // Set it to the maximum
-            //
-            MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE;
-        }
-        
-        //
-        // Check if a percentage cap was set through the registry
-        //
-        if (MmMaximumNonPagedPoolPercent)
-        {
-            //
-            // Don't feel like supporting this right now
-            //
-            UNIMPLEMENTED;
-        }
-        
-        //
-        // Page-align the nonpaged pool size
-        //
-        MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1);
-        
-        //
-        // Now, check if there was a registry size for the maximum size
-        //
-        if (!MmMaximumNonPagedPoolInBytes)
-        {
-            //
-            // Start with the default (1MB)
-            //
-            MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool;
-            
-            //
-            // Add space for PFN database
-            //
-            MmMaximumNonPagedPoolInBytes += (ULONG)
-                PAGE_ALIGN((MmHighestPhysicalPage +  1) * sizeof(MMPFN));
-            
-            //
-            // Add 400KB for each MB above 4
-            //
-            MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 *
-                                            MmMaxAdditionNonPagedPoolPerMb;
-        }
-        
-        //
-        // Make sure there's at least 16 pages + the PFN available for expansion
-        //
-        PoolPages = MmSizeOfNonPagedPoolInBytes + (PAGE_SIZE * 16) +
-                    ((ULONG)PAGE_ALIGN(MmHighestPhysicalPage + 1) *
-                    sizeof(MMPFN));
-        if (MmMaximumNonPagedPoolInBytes < PoolPages)
-        {
-            //
-            // Set it to the minimum value for the maximum (yuck!)
-            //
-            MmMaximumNonPagedPoolInBytes = PoolPages;
-        }
-        
-        //
-        // Systems with 2GB of kernel address space get double the size
-        //
-        PoolPages = MI_MAX_NONPAGED_POOL_SIZE * 2;
-        
-        //
-        // Don't let the maximum go too high
-        //
-        if (MmMaximumNonPagedPoolInBytes > PoolPages)
-        {
-            //
-            // Set it to the upper limit
-            //
-            MmMaximumNonPagedPoolInBytes = PoolPages;
-        }
-        
-        //
-        // Check if this is a system with > 128MB of non paged pool
-        //
-        if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE)
-        {
-            //
-            // FIXME: Unsure about additional checks needed
-            //
-            DPRINT1("Untested path\n");
-        }
-        
-        //
-        // Get L2 cache information
-        //
-        L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity;
-        MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize;
-        if (L2Associativity) MmSecondaryColors /= L2Associativity;
-        
-        //
-        // Compute final color mask and count
-        //
-        MmSecondaryColors >>= PAGE_SHIFT;
-        if (!MmSecondaryColors) MmSecondaryColors = 1;
-        MmSecondaryColorMask = MmSecondaryColors - 1;
-        
-        //
-        // Store it
-        //
-        KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask;
-        
-        //
-        // Calculate the number of bytes for the PFN database
-        // and then convert to pages
-        //
-        MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN);
-        MxPfnAllocation >>= PAGE_SHIFT;
-        
-        //
-        // We have to add one to the count here, because in the process of
-        // shifting down to the page size, we actually ended up getting the
-        // lower aligned size (so say, 0x5FFFF bytes is now 0x5F pages).
-        // Later on, we'll shift this number back into bytes, which would cause
-        // us to end up with only 0x5F000 bytes -- when we actually want to have
-        // 0x60000 bytes.
-        //
-        MxPfnAllocation++;
-        
-        //
-        // Now calculate the nonpaged pool expansion VA region
-        //
-        MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmNonPagedPoolEnd -
-                                      MmMaximumNonPagedPoolInBytes +
-                                      MmSizeOfNonPagedPoolInBytes);
-        MmNonPagedPoolStart = (PVOID)PAGE_ALIGN(MmNonPagedPoolStart);
-        NonPagedPoolExpansionVa = MmNonPagedPoolStart;
-        DPRINT("NP Pool has been tuned to: %d bytes and %d bytes\n",
-               MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes);
-        
-        //
-        // Now calculate the nonpaged system VA region, which includes the
-        // nonpaged pool expansion (above) and the system PTEs. Note that it is
-        // then aligned to a PDE boundary (4MB).
-        //
-        MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart -
-                                        (MmNumberOfSystemPtes + 1) * PAGE_SIZE);
-        MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart &
-                                        ~((4 * 1024 * 1024) - 1));
-        
-        //
-        // Don't let it go below the minimum
-        //
-        if (MmNonPagedSystemStart < (PVOID)0xEB000000)
-        {
-            //
-            // This is a hard-coded limit in the Windows NT address space
-            //
-            MmNonPagedSystemStart = (PVOID)0xEB000000;
-            
-            //
-            // Reduce the amount of system PTEs to reach this point
-            //
-            MmNumberOfSystemPtes = ((ULONG_PTR)MmNonPagedPoolStart -
-                                    (ULONG_PTR)MmNonPagedSystemStart) >>
-                                    PAGE_SHIFT;
-            MmNumberOfSystemPtes--;
-            ASSERT(MmNumberOfSystemPtes > 1000);
-        }
-        
-        //
-        // Check if we are in a situation where the size of the paged pool
-        // is so large that it overflows into nonpaged pool
-        //
-        if (MmSizeOfPagedPoolInBytes >
-            ((ULONG_PTR)MmNonPagedSystemStart - (ULONG_PTR)MmPagedPoolStart))
-        {
-            //
-            // We need some recalculations here
-            //
-            DPRINT1("Paged pool is too big!\n");
-        }
-        
-        //
-        // Normally, the PFN database should start after the loader images.
-        // This is already the case in ReactOS, but for now we want to co-exist
-        // with the old memory manager, so we'll create a "Shadow PFN Database"
-        // instead, and arbitrarly start it at 0xB0000000.
-        //
-        MmPfnDatabase = (PVOID)0xB0000000;
-        ASSERT(((ULONG_PTR)MmPfnDatabase & ((4 * 1024 * 1024) - 1)) == 0);
-                
-        //
-        // Non paged pool comes after the PFN database
-        //
-        MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase +
-                                      (MxPfnAllocation << PAGE_SHIFT));
-
-        //
-        // Now we actually need to get these many physical pages. Nonpaged pool
-        // is actually also physically contiguous (but not the expansion)
-        //
-        PageFrameIndex = MxGetNextPage(MxPfnAllocation +
-                                       (MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT));
-        ASSERT(PageFrameIndex != 0);
-        DPRINT("PFN DB PA PFN begins at: %lx\n", PageFrameIndex);
-        DPRINT("NP PA PFN begins at: %lx\n", PageFrameIndex + MxPfnAllocation);
-
-        //
-        // Now we need some pages to create the page tables for the NP system VA
-        // which includes system PTEs and expansion NP
-        //
-        StartPde = MiAddressToPde(MmNonPagedSystemStart);
-        EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
-        while (StartPde <= EndPde)
-        {
-            //
-            // Sanity check
-            //
-            ASSERT(StartPde->u.Hard.Valid == 0);
-            
-            //
-            // Get a page
-            //
-            TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
-            ASSERT(TempPde.u.Hard.Valid == 1);
-            *StartPde = TempPde;
-            
-            //
-            // Zero out the page table
-            //
-            PointerPte = MiPteToAddress(StartPde);
-            RtlZeroMemory(PointerPte, PAGE_SIZE);
-            
-            //
-            // Next
-            //
-            StartPde++;
-        }
-
-        //
-        // Now we need pages for the page tables which will map initial NP
-        //
-        StartPde = MiAddressToPde(MmPfnDatabase);
-        EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart +
-                                        MmSizeOfNonPagedPoolInBytes - 1));
-        while (StartPde <= EndPde)
-        {
-            //
-            // Sanity check
-            //
-            ASSERT(StartPde->u.Hard.Valid == 0);
-            
-            //
-            // Get a page
-            //
-            TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
-            ASSERT(TempPde.u.Hard.Valid == 1);
-            *StartPde = TempPde;
-            
-            //
-            // Zero out the page table
-            //
-            PointerPte = MiPteToAddress(StartPde);
-            RtlZeroMemory(PointerPte, PAGE_SIZE);
-            
-            //
-            // Next
-            //
-            StartPde++;
-        }
-
-        //
-        // Now remember where the expansion starts
-        //
-        MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa;
-
-        //
-        // Last step is to actually map the nonpaged pool
-        //
-        PointerPte = MiAddressToPte(MmNonPagedPoolStart);
-        LastPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolStart +
-                                         MmSizeOfNonPagedPoolInBytes - 1));
-        while (PointerPte <= LastPte)
-        {
-            //
-            // Use one of our contigous pages
-            //
-            TempPte.u.Hard.PageFrameNumber = PageFrameIndex++;
-            ASSERT(PointerPte->u.Hard.Valid == 0);
-            ASSERT(TempPte.u.Hard.Valid == 1);
-            *PointerPte++ = TempPte;
-        }
-        
-        //
-        // Sanity check: make sure we have properly defined the system PTE space
-        //
-        ASSERT(MiAddressToPte(MmNonPagedSystemStart) <
-               MiAddressToPte(MmNonPagedPoolExpansionStart));
-        
-        //
-        // Now go ahead and initialize the ARM³ nonpaged pool
-        //
-        MiInitializeArmPool();
-
-        //
-        // Get current page data, since we won't be using MxGetNextPage as it
-        // would corrupt our state
-        //
-        FreePage = MxFreeDescriptor->BasePage;
-        FreePageCount = MxFreeDescriptor->PageCount;
-        PagesLeft = 0;
-        
-        //
-        // Loop the memory descriptors
-        //
-        NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink;
-        while (NextEntry != &KeLoaderBlock->MemoryDescriptorListHead)
-        {
-            //
-            // Get the descriptor
-            //
-            MdBlock = CONTAINING_RECORD(NextEntry,
-                                        MEMORY_ALLOCATION_DESCRIPTOR,
-                                        ListEntry);
-            if ((MdBlock->MemoryType == LoaderFirmwarePermanent) ||
-                (MdBlock->MemoryType == LoaderBBTMemory) ||
-                (MdBlock->MemoryType == LoaderSpecialMemory))
-            {
-                //
-                // These pages are not part of the PFN database
-                //
-                NextEntry = MdBlock->ListEntry.Flink;
-                continue;
-            }
-            
-            //
-            // Next, check if this is our special free descriptor we've found
-            //
-            if (MdBlock == MxFreeDescriptor)
-            {
-                //
-                // Use the real numbers instead
-                //
-                BasePage = MxOldFreeDescriptor.BasePage;
-                PageCount = MxOldFreeDescriptor.PageCount;
-            }
-            else
-            {
-                //
-                // Use the descriptor's numbers
-                //
-                BasePage = MdBlock->BasePage;
-                PageCount = MdBlock->PageCount;
-            }
-            
-            //
-            // Get the PTEs for this range
-            //
-            PointerPte = MiAddressToPte(&MmPfnDatabase[BasePage]);
-            LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[BasePage + PageCount]) - 1);
-            DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount);
-            
-            //
-            // Loop them
-            //
-            while (PointerPte <= LastPte)
-            {
-                //
-                // We'll only touch PTEs that aren't already valid
-                //
-                if (PointerPte->u.Hard.Valid == 0)
-                {
-                    //
-                    // Use the next free page
-                    //
-                    TempPte.u.Hard.PageFrameNumber = FreePage;
-                    ASSERT(FreePageCount != 0);
-                    
-                    //
-                    // Consume free pages
-                    //
-                    FreePage++;
-                    FreePageCount--;
-                    if (!FreePageCount)
-                    {
-                        //
-                        // Out of memory
-                        //
-                        KeBugCheckEx(INSTALL_MORE_MEMORY,
-                                     MmNumberOfPhysicalPages,
-                                     FreePageCount,
-                                     MxOldFreeDescriptor.PageCount,
-                                     1);
-                    }
-                    
-                    //
-                    // Write out this PTE
-                    //
-                    PagesLeft++;
-                    ASSERT(PointerPte->u.Hard.Valid == 0);
-                    ASSERT(TempPte.u.Hard.Valid == 1);
-                    *PointerPte = TempPte;
-                    
-                    //
-                    // Zero this page
-                    //
-                    RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE);
-                }
-                
-                //
-                // Next!
-                //
-                PointerPte++;
-            }
-            
-            //
-            // Do the next address range
-            //
-            NextEntry = MdBlock->ListEntry.Flink;
-        }
-        
-        //
-        // Now update the free descriptors to consume the pages we used up during
-        // the PFN allocation loop
-        //
-        MxFreeDescriptor->BasePage = FreePage;
-        MxFreeDescriptor->PageCount = FreePageCount;
-    }
-    else if (Phase == 1) // IN BETWEEN, THE PFN DATABASE IS NOW CREATED
-    {
-        //
-        // Reset the descriptor back so we can create the correct memory blocks
-        //
-        *MxFreeDescriptor = MxOldFreeDescriptor;
-        
-        //
-        // Initialize the nonpaged pool
-        //
-        InitializePool(NonPagedPool, 0);
-        
-        //
-        // We PDE-aligned the nonpaged system start VA, so haul some extra PTEs!
-        //
-        PointerPte = MiAddressToPte(MmNonPagedSystemStart);
-        OldCount = MmNumberOfSystemPtes;
-        MmNumberOfSystemPtes = MiAddressToPte(MmNonPagedPoolExpansionStart) -
-                               PointerPte;
-        MmNumberOfSystemPtes--;
-        DPRINT("Final System PTE count: %d (%d bytes)\n",
-               MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
-        
-        //
-        // Create the system PTE space
-        //
-        MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace);
-        
-        //
-        // Get the PDE For hyperspace
-        //
-        StartPde = MiAddressToPde(HYPER_SPACE);
-        
-        //
-        // Allocate a page for it and create it
-        //
-        PageFrameIndex = MmAllocPage(MC_SYSTEM, 0);
-        TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
-        TempPde.u.Hard.Global = FALSE; // Hyperspace is local!
-        ASSERT(StartPde->u.Hard.Valid == 0);
-        ASSERT(TempPde.u.Hard.Valid == 1);
-        *StartPde = TempPde;
-        
-        //
-        // Zero out the page table now
-        //
-        PointerPte = MiAddressToPte(HYPER_SPACE);
-        RtlZeroMemory(PointerPte, PAGE_SIZE);
-        
-        //
-        // Setup the mapping PTEs
-        //
-        MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START);
-        MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END);
-        MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES;
-
-        //
-        // Reserve system PTEs for zeroing PTEs and clear them
-        //
-        MiFirstReservedZeroingPte = MiReserveSystemPtes(MI_ZERO_PTES,
-                                                        SystemPteSpace);
-        RtlZeroMemory(MiFirstReservedZeroingPte, MI_ZERO_PTES * sizeof(MMPTE));
-        
-        //
-        // Set the counter to maximum to boot with
-        //
-        MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1;
-        
-        //
-        // Sync us up with ReactOS Mm
-        //
-        MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
-        MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1));
-        MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1));
+    MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1;
     
-        //
-        // Build the physical memory block
-        //
-        MmPhysicalMemoryBlock = MmInitializeMemoryLimits(LoaderBlock,
-                                                         IncludeType);
-         
-        //
-        // Allocate enough buffer for the PFN bitmap
-        // Align it up to a 32-bit boundary
-        //
-        Bitmap = ExAllocatePoolWithTag(NonPagedPool,
-                                       (((MmHighestPhysicalPage + 1) + 31) / 32) * 4,
-                                       '  mM');
-        if (!Bitmap)
-        {
-            //
-            // This is critical
-            //
-            KeBugCheckEx(INSTALL_MORE_MEMORY,
-                         MmNumberOfPhysicalPages,
-                         MmLowestPhysicalPage,
-                         MmHighestPhysicalPage,
-                         0x101);
-        }
-        
-        //
-        // Initialize it and clear all the bits to begin with
-        //
-        RtlInitializeBitMap(&MiPfnBitMap,
-                            Bitmap,
-                            MmHighestPhysicalPage + 1);
-        RtlClearAllBits(&MiPfnBitMap);
-        
-        //
-        // Loop physical memory runs
-        //
-        for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++)
-        {
-            //
-            // Get the run
-            //
-            Run = &MmPhysicalMemoryBlock->Run[i];
-            DPRINT("PHYSICAL RAM [0x%08p to 0x%08p]\n",
-                   Run->BasePage << PAGE_SHIFT,
-                   (Run->BasePage + Run->PageCount) << PAGE_SHIFT);
-
-            //
-            // Make sure it has pages inside it
-            //
-            if (Run->PageCount)
-            {
-                //
-                // Set the bits in the PFN bitmap
-                //
-                RtlSetBits(&MiPfnBitMap, Run->BasePage, Run->PageCount);
-            }
-        }
-        
-        //
-        // Size up paged pool and build the shadow system page directory
-        //
-        MiBuildPagedPool();
-    }
-    
-    //
-    // Always return success for now
-    //
     return STATUS_SUCCESS;
 }
 
index c4e6dd4..b9f7eb6 100644 (file)
@@ -120,7 +120,7 @@ MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress,
     //
     // Get the template and configure caching
     //
-    TempPte = HyperTemplatePte;
+    TempPte = ValidKernelPte;
     switch (CacheAttribute)
     {
         case MiNonCached:
index 995ff78..036e2c5 100644 (file)
@@ -372,7 +372,7 @@ MmMapLockedPagesSpecifyCache(IN PMDL Mdl,
         //
         // Get the template
         //
-        TempPte = HyperTemplatePte;
+        TempPte = ValidKernelPte;
         switch (CacheAttribute)
         {
             case MiNonCached:
@@ -579,7 +579,8 @@ MmProbeAndLockPages(IN PMDL Mdl,
     PETHREAD Thread;
     PMMSUPPORT AddressSpace;
     NTSTATUS ProbeStatus;
-    PMMPTE PointerPte, PointerPde, LastPte;
+    PMMPTE PointerPte, LastPte;
+    PMMPDE PointerPde;
     PFN_NUMBER PageFrameIndex;
     BOOLEAN UsePfnLock;
     KIRQL OldIrql;
@@ -952,7 +953,7 @@ MmProbeAndLockPages(IN PMDL Mdl,
         // Grab the PFN
         //
         PageFrameIndex = PFN_FROM_PTE(PointerPte);
-        if (PageFrameIndex < MmHighestPhysicalPage)
+        if (PageFrameIndex <= MmHighestPhysicalPage)
         {
             //
             // Get the PFN entry
@@ -963,7 +964,6 @@ MmProbeAndLockPages(IN PMDL Mdl,
             // Now lock the page
             //
             MmReferencePage(PageFrameIndex);
-            MmLockPage(PageFrameIndex);
         }
         else
         {
@@ -1121,7 +1121,6 @@ MmUnlockPages(IN PMDL Mdl)
                 //
                 // Unlock and dereference
                 //
-                MmUnlockPage(*MdlPages);
                 MmDereferencePage(*MdlPages);
             }
         } while (++MdlPages < LastPage);
@@ -1215,7 +1214,6 @@ MmUnlockPages(IN PMDL Mdl)
         //
         // Unlock and dereference
         //
-        MmUnlockPage(*MdlPages);
         MmDereferencePage(*MdlPages);
     } while (++MdlPages < LastPage);
     
index 8393724..8513763 100644 (file)
 #define MI_NONPAGED_POOL_END                   (PVOID)0xFFBE0000
 #define MI_DEBUG_MAPPING                       (PVOID)0xFFBFF000
 
+#define MI_MIN_SECONDARY_COLORS                 8
+#define MI_SECONDARY_COLORS                     64
+#define MI_MAX_SECONDARY_COLORS                 1024
+
 #define MM_HIGHEST_VAD_ADDRESS \
     (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE))
 
+/* Make the code cleaner with some definitions for size multiples */
+#define _1KB (1024)
+#define _1MB (1000 * _1KB)
+
+/* Size of a PDE directory, and size of a page table */
+#define PDE_SIZE (PDE_COUNT * sizeof(MMPDE))
+#define PT_SIZE  (PTE_COUNT * sizeof(MMPTE))
+
+/* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */
+#ifdef _M_IX86
+#define PD_COUNT  1
+#define PDE_COUNT 1024
+#define PTE_COUNT 1024
+#elif _M_ARM
+#define PD_COUNT  1
+#define PDE_COUNT 4096
+#define PTE_COUNT 256
+#else
+#error Define these please!
+#endif
+
+//
+// PFN List Sentinel
+//
+#define LIST_HEAD 0xFFFFFFFF
 
 //
 // FIXFIX: These should go in ex.h after the pool merge
@@ -156,10 +185,21 @@ typedef struct _PHYSICAL_MEMORY_DESCRIPTOR
     PHYSICAL_MEMORY_RUN Run[1];
 } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
 
+typedef struct _MMCOLOR_TABLES
+{
+    PFN_NUMBER Flink;
+    PVOID Blink;
+    PFN_NUMBER Count;
+} MMCOLOR_TABLES, *PMMCOLOR_TABLES;
+
 extern MMPTE HyperTemplatePte;
+extern MMPTE ValidKernelPde;
+extern MMPTE ValidKernelPte;
 
 extern ULONG_PTR MmSizeOfNonPagedPoolInBytes;
 extern ULONG_PTR MmMaximumNonPagedPoolInBytes;
+extern PFN_NUMBER MmMaximumNonPagedPoolInPages;
+extern PFN_NUMBER MmSizeOfPagedPoolInPages;
 extern PVOID MmNonPagedSystemStart;
 extern PVOID MmNonPagedPoolStart;
 extern PVOID MmNonPagedPoolExpansionStart;
@@ -198,6 +238,36 @@ extern SIZE_T MmAllocatedNonPagedPool;
 extern ULONG_PTR MmSubsectionBase;
 extern ULONG MmSpecialPoolTag;
 extern PVOID MmHyperSpaceEnd;
+extern PMMWSL MmSystemCacheWorkingSetList;
+extern ULONG MmMinimumNonPagedPoolSize;
+extern ULONG MmMinAdditionNonPagedPoolPerMb;
+extern ULONG MmDefaultMaximumNonPagedPool;
+extern ULONG MmMaxAdditionNonPagedPoolPerMb;
+extern ULONG MmSecondaryColors;
+extern ULONG MmSecondaryColorMask;
+extern ULONG MmNumberOfSystemPtes;
+extern ULONG MmMaximumNonPagedPoolPercent;
+extern ULONG MmLargeStackSize;
+extern PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1];
+extern ULONG MmProductType;
+extern MM_SYSTEMSIZE MmSystemSize;
+extern PKEVENT MiLowMemoryEvent;
+extern PKEVENT MiHighMemoryEvent;
+extern PKEVENT MiLowPagedPoolEvent;
+extern PKEVENT MiHighPagedPoolEvent;
+extern PKEVENT MiLowNonPagedPoolEvent;
+extern PKEVENT MiHighNonPagedPoolEvent;
+extern PFN_NUMBER MmLowMemoryThreshold;
+extern PFN_NUMBER MmHighMemoryThreshold;
+extern PFN_NUMBER MiLowPagedPoolThreshold;
+extern PFN_NUMBER MiHighPagedPoolThreshold;
+extern PFN_NUMBER MiLowNonPagedPoolThreshold;
+extern PFN_NUMBER MiHighNonPagedPoolThreshold;
+extern PFN_NUMBER MmMinimumFreePages;
+extern PFN_NUMBER MmPlentyFreePages;
+
+#define MI_PFN_TO_PFNENTRY(x)     (&MmPfnDatabase[1][x])
+#define MI_PFNENTRY_TO_PFN(x)     (x - MmPfnDatabase[1])
 
 NTSTATUS
 NTAPI
@@ -206,6 +276,69 @@ MmArmInitSystem(
     IN PLOADER_PARAMETER_BLOCK LoaderBlock
 );
 
+NTSTATUS
+NTAPI
+MiInitMachineDependent(
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
+
+VOID
+NTAPI
+MiComputeColorInformation(
+    VOID
+);
+
+VOID
+NTAPI
+MiMapPfnDatabase(
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
+
+VOID
+NTAPI
+MiInitializeColorTables(
+    VOID
+);
+
+VOID
+NTAPI
+MiInitializePfnDatabase(
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
+
+BOOLEAN
+NTAPI
+MiInitializeMemoryEvents(
+    VOID
+);
+    
+PFN_NUMBER
+NTAPI
+MxGetNextPage(
+    IN PFN_NUMBER PageCount
+);
+
+PPHYSICAL_MEMORY_DESCRIPTOR
+NTAPI
+MmInitializeMemoryLimits(
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+    IN PBOOLEAN IncludeType
+);
+                         
+PFN_NUMBER
+NTAPI
+MiPagesInLoaderBlock(
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+    IN PBOOLEAN IncludeType
+);
+                     
+VOID
+FASTCALL
+MiSyncARM3WithROS(
+    IN PVOID AddressStart,
+    IN PVOID AddressEnd
+);
+                         
 NTSTATUS
 NTAPI
 MmArmAccessFault(
@@ -217,7 +350,19 @@ MmArmAccessFault(
 
 VOID
 NTAPI
-MiInitializeArmPool(
+MiInitializeNonPagedPool(
+    VOID
+);
+
+VOID
+NTAPI
+MiInitializeNonPagedPoolThresholds(
+    VOID
+);
+
+VOID
+NTAPI
+MiInitializePoolEvents(
     VOID
 );
 
@@ -301,4 +446,36 @@ MiUnmapLockedPagesInUserSpace(
     IN PMDL Mdl
 );
 
+VOID
+NTAPI
+MiInsertInListTail(
+    IN PMMPFNLIST ListHead,
+    IN PMMPFN Entry
+);
+
+VOID
+NTAPI
+MiInsertZeroListAtBack(
+    IN PFN_NUMBER PageIndex
+);
+
+VOID
+NTAPI
+MiUnlinkFreeOrZeroedPage(
+    IN PMMPFN Entry
+);
+
+PMMPFN
+NTAPI
+MiRemoveHeadList(
+    IN PMMPFNLIST ListHead
+);
+
+
+VOID
+NTAPI
+MiInsertPageInFreeList(
+    IN PFN_NUMBER PageFrameIndex
+);
+
 /* EOF */
diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c
new file mode 100644 (file)
index 0000000..89d082e
--- /dev/null
@@ -0,0 +1,1899 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            ntoskrnl/mm/ARM3/mminit.c
+ * PURPOSE:         ARM Memory Manager Initialization
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+#line 15 "ARM³::INIT"
+#define MODULE_INVOLVED_IN_ARM3
+#include "miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+//
+// These are all registry-configurable, but by default, the memory manager will
+// figure out the most appropriate values.
+//
+ULONG MmMaximumNonPagedPoolPercent;
+ULONG MmSizeOfNonPagedPoolInBytes;
+ULONG MmMaximumNonPagedPoolInBytes;
+
+/* Some of the same values, in pages */
+PFN_NUMBER MmMaximumNonPagedPoolInPages;
+
+//
+// These numbers describe the discrete equation components of the nonpaged
+// pool sizing algorithm.
+//
+// They are described on http://support.microsoft.com/default.aspx/kb/126402/ja
+// along with the algorithm that uses them, which is implemented later below.
+//
+ULONG MmMinimumNonPagedPoolSize = 256 * 1024;
+ULONG MmMinAdditionNonPagedPoolPerMb = 32 * 1024;
+ULONG MmDefaultMaximumNonPagedPool = 1024 * 1024; 
+ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024;
+
+//
+// The memory layout (and especially variable names) of the NT kernel mode
+// components can be a bit hard to twig, especially when it comes to the non
+// paged area.
+//
+// There are really two components to the non-paged pool:
+//
+// - The initial nonpaged pool, sized dynamically up to a maximum.
+// - The expansion nonpaged pool, sized dynamically up to a maximum.
+//
+// The initial nonpaged pool is physically continuous for performance, and
+// immediately follows the PFN database, typically sharing the same PDE. It is
+// a very small resource (32MB on a 1GB system), and capped at 128MB.
+//
+// Right now we call this the "ARM³ Nonpaged Pool" and it begins somewhere after
+// the PFN database (which starts at 0xB0000000).
+//
+// The expansion nonpaged pool, on the other hand, can grow much bigger (400MB 
+// for a 1GB system). On ARM³ however, it is currently capped at 128MB.
+//
+// The address where the initial nonpaged pool starts is aptly named
+// MmNonPagedPoolStart, and it describes a range of MmSizeOfNonPagedPoolInBytes
+// bytes.
+//
+// Expansion nonpaged pool starts at an address described by the variable called
+// MmNonPagedPoolExpansionStart, and it goes on for MmMaximumNonPagedPoolInBytes
+// minus MmSizeOfNonPagedPoolInBytes bytes, always reaching MmNonPagedPoolEnd
+// (because of the way it's calculated) at 0xFFBE0000.
+//
+// Initial nonpaged pool is allocated and mapped early-on during boot, but what
+// about the expansion nonpaged pool? It is instead composed of special pages
+// which belong to what are called System PTEs. These PTEs are the matter of a
+// later discussion, but they are also considered part of the "nonpaged" OS, due
+// to the fact that they are never paged out -- once an address is described by
+// a System PTE, it is always valid, until the System PTE is torn down.
+//
+// System PTEs are actually composed of two "spaces", the system space proper,
+// and the nonpaged pool expansion space. The latter, as we've already seen, 
+// begins at MmNonPagedPoolExpansionStart. Based on the number of System PTEs
+// that the system will support, the remaining address space below this address
+// is used to hold the system space PTEs. This address, in turn, is held in the
+// variable named MmNonPagedSystemStart, which itself is never allowed to go
+// below 0xEB000000 (thus creating an upper bound on the number of System PTEs).
+//
+// This means that 330MB are reserved for total nonpaged system VA, on top of
+// whatever the initial nonpaged pool allocation is.
+//
+// The following URLs, valid as of April 23rd, 2008, support this evidence:
+//
+// http://www.cs.miami.edu/~burt/journal/NT/memory.html
+// http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/
+//
+PVOID MmNonPagedSystemStart;
+PVOID MmNonPagedPoolStart;
+PVOID MmNonPagedPoolExpansionStart;
+PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END;
+
+//
+// This is where paged pool starts by default
+//
+PVOID MmPagedPoolStart = MI_PAGED_POOL_START;
+PVOID MmPagedPoolEnd;
+
+//
+// And this is its default size
+//
+ULONG MmSizeOfPagedPoolInBytes = MI_MIN_INIT_PAGED_POOLSIZE;
+PFN_NUMBER MmSizeOfPagedPoolInPages = MI_MIN_INIT_PAGED_POOLSIZE / PAGE_SIZE;
+
+//
+// Session space starts at 0xBFFFFFFF and grows downwards
+// By default, it includes an 8MB image area where we map win32k and video card
+// drivers, followed by a 4MB area containing the session's working set. This is
+// then followed by a 20MB mapped view area and finally by the session's paged
+// pool, by default 16MB.
+// 
+// On a normal system, this results in session space occupying the region from
+// 0xBD000000 to 0xC0000000
+//
+// See miarm.h for the defines that determine the sizing of this region. On an
+// NT system, some of these can be configured through the registry, but we don't
+// support that yet.
+//
+PVOID MiSessionSpaceEnd;    // 0xC0000000
+PVOID MiSessionImageEnd;    // 0xC0000000
+PVOID MiSessionImageStart;  // 0xBF800000
+PVOID MiSessionViewStart;   // 0xBE000000
+PVOID MiSessionPoolEnd;     // 0xBE000000
+PVOID MiSessionPoolStart;   // 0xBD000000
+PVOID MmSessionBase;        // 0xBD000000
+ULONG MmSessionSize;
+ULONG MmSessionViewSize;
+ULONG MmSessionPoolSize;
+ULONG MmSessionImageSize;
+
+//
+// The system view space, on the other hand, is where sections that are memory
+// mapped into "system space" end up.
+//
+// By default, it is a 16MB region.
+//
+PVOID MiSystemViewStart;
+ULONG MmSystemViewSize;
+
+//
+// A copy of the system page directory (the page directory associated with the
+// System process) is kept (double-mapped) by the manager in order to lazily
+// map paged pool PDEs into external processes when they fault on a paged pool
+// address.
+//
+PFN_NUMBER MmSystemPageDirectory;
+PMMPTE MmSystemPagePtes;
+
+//
+// The system cache starts right after hyperspace. The first few pages are for
+// keeping track of the system working set list.
+//
+// This should be 0xC0C00000 -- the cache itself starts at 0xC1000000
+//
+PMMWSL MmSystemCacheWorkingSetList = MI_SYSTEM_CACHE_WS_START;
+
+//
+// Windows NT seems to choose between 7000, 11000 and 50000
+// On systems with more than 32MB, this number is then doubled, and further
+// aligned up to a PDE boundary (4MB).
+//
+ULONG MmNumberOfSystemPtes;
+
+//
+// This is how many pages the PFN database will take up
+// In Windows, this includes the Quark Color Table, but not in ARM³
+//
+ULONG MxPfnAllocation;
+
+//
+// Unlike the old ReactOS Memory Manager, ARM³ (and Windows) does not keep track
+// of pages that are not actually valid physical memory, such as ACPI reserved
+// regions, BIOS address ranges, or holes in physical memory address space which
+// could indicate device-mapped I/O memory.
+//
+// In fact, the lack of a PFN entry for a page usually indicates that this is
+// I/O space instead.
+//
+// A bitmap, called the PFN bitmap, keeps track of all page frames by assigning
+// a bit to each. If the bit is set, then the page is valid physical RAM.
+//
+RTL_BITMAP MiPfnBitMap;
+
+//
+// This structure describes the different pieces of RAM-backed address space
+//
+PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
+
+//
+// This is where we keep track of the most basic physical layout markers
+//
+ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage = -1;
+
+//
+// The total number of pages mapped by the boot loader, which include the kernel
+// HAL, boot drivers, registry, NLS files and other loader data structures is
+// kept track of here. This depends on "LoaderPagesSpanned" being correct when
+// coming from the loader.
+//
+// This number is later aligned up to a PDE boundary.
+//
+ULONG MmBootImageSize;
+
+//
+// These three variables keep track of the core separation of address space that
+// exists between kernel mode and user mode.
+//
+ULONG MmUserProbeAddress;
+PVOID MmHighestUserAddress;
+PVOID MmSystemRangeStart;
+
+PVOID MmSystemCacheStart;
+PVOID MmSystemCacheEnd;
+MMSUPPORT MmSystemCacheWs;
+
+//
+// This is where hyperspace ends (followed by the system cache working set)
+//
+PVOID MmHyperSpaceEnd;
+
+//
+// Page coloring algorithm data
+//
+ULONG MmSecondaryColors;
+ULONG MmSecondaryColorMask;
+
+//
+// Actual (registry-configurable) size of a GUI thread's stack
+//
+ULONG MmLargeStackSize = KERNEL_LARGE_STACK_SIZE;
+
+//
+// Before we have a PFN database, memory comes straight from our physical memory
+// blocks, which is nice because it's guaranteed contiguous and also because once
+// we take a page from here, the system doesn't see it anymore.
+// However, once the fun is over, those pages must be re-integrated back into
+// PFN society life, and that requires us keeping a copy of the original layout
+// so that we can parse it later.
+//
+PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
+MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
+
+/*
+ * For each page's worth bytes of L2 cache in a given set/way line, the zero and
+ * free lists are organized in what is called a "color".
+ *
+ * This array points to the two lists, so it can be thought of as a multi-dimensional
+ * array of MmFreePagesByColor[2][MmSecondaryColors]. Since the number is dynamic,
+ * we describe the array in pointer form instead.
+ *
+ * On a final note, the color tables themselves are right after the PFN database.
+ */
+C_ASSERT(FreePageList == 1);
+PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1];
+
+/* An event used in Phase 0 before the rest of the system is ready to go */
+KEVENT MiTempEvent;
+
+/* All the events used for memory threshold notifications */
+PKEVENT MiLowMemoryEvent;
+PKEVENT MiHighMemoryEvent;
+PKEVENT MiLowPagedPoolEvent;
+PKEVENT MiHighPagedPoolEvent;
+PKEVENT MiLowNonPagedPoolEvent;
+PKEVENT MiHighNonPagedPoolEvent;
+
+/* The actual thresholds themselves, in page numbers */
+PFN_NUMBER MmLowMemoryThreshold;
+PFN_NUMBER MmHighMemoryThreshold;
+PFN_NUMBER MiLowPagedPoolThreshold;
+PFN_NUMBER MiHighPagedPoolThreshold;
+PFN_NUMBER MiLowNonPagedPoolThreshold;
+PFN_NUMBER MiHighNonPagedPoolThreshold;
+
+/*
+ * This number determines how many free pages must exist, at minimum, until we
+ * start trimming working sets and flushing modified pages to obtain more free
+ * pages.
+ *
+ * This number changes if the system detects that this is a server product
+ */
+PFN_NUMBER MmMinimumFreePages = 26;
+
+/* 
+ * This number indicates how many pages we consider to be a low limit of having
+ * "plenty" of free memory.
+ *
+ * It is doubled on systems that have more than 63MB of memory
+ */
+PFN_NUMBER MmPlentyFreePages = 400;
+
+/* These values store the type of system this is (small, med, large) and if server */
+ULONG MmProductType;
+MM_SYSTEMSIZE MmSystemSize;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+//
+// In Bavaria, this is probably a hate crime
+//
+VOID
+FASTCALL
+MiSyncARM3WithROS(IN PVOID AddressStart,
+                  IN PVOID AddressEnd)
+{
+    //
+    // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder
+    //
+    ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart);
+    while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd))
+    {
+        //
+        // This both odious and heinous
+        //
+        extern ULONG MmGlobalKernelPageDirectory[1024];
+        MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde];
+        Pde++;
+    }
+}
+
+PFN_NUMBER
+NTAPI
+MxGetNextPage(IN PFN_NUMBER PageCount)
+{
+    PFN_NUMBER Pfn;
+    /* Make sure we have enough pages */
+    if (PageCount > MxFreeDescriptor->PageCount)
+    {
+        /* Crash the system */
+        KeBugCheckEx(INSTALL_MORE_MEMORY,
+                     MmNumberOfPhysicalPages,
+                     MxFreeDescriptor->PageCount,
+                     MxOldFreeDescriptor.PageCount,
+                     PageCount);
+    }
+    
+    /* Use our lowest usable free pages */
+    Pfn = MxFreeDescriptor->BasePage;
+    MxFreeDescriptor->BasePage += PageCount;
+    MxFreeDescriptor->PageCount -= PageCount;
+    return Pfn;
+}
+
+VOID
+NTAPI
+MiComputeColorInformation(VOID)
+{
+    ULONG L2Associativity;
+    
+    /* Check if no setting was provided already */
+    if (!MmSecondaryColors)
+    {
+        /* Get L2 cache information */
+        L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity;
+        
+        /* The number of colors is the number of cache bytes by set/way */
+        MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize;
+        if (L2Associativity) MmSecondaryColors /= L2Associativity;
+    }
+    
+    /* Now convert cache bytes into pages */
+    MmSecondaryColors >>= PAGE_SHIFT;
+    if (!MmSecondaryColors)
+    {
+        /* If there was no cache data from the KPCR, use the default colors */
+        MmSecondaryColors = MI_SECONDARY_COLORS;
+    }
+    else
+    {
+        /* Otherwise, make sure there aren't too many colors */
+        if (MmSecondaryColors > MI_MAX_SECONDARY_COLORS)
+        {
+            /* Set the maximum */
+            MmSecondaryColors = MI_MAX_SECONDARY_COLORS;
+        }
+        
+        /* Make sure there aren't too little colors */
+        if (MmSecondaryColors < MI_MIN_SECONDARY_COLORS)
+        {
+            /* Set the default */
+            MmSecondaryColors = MI_SECONDARY_COLORS;
+        }
+        
+        /* Finally make sure the colors are a power of two */
+        if (MmSecondaryColors & (MmSecondaryColors - 1))
+        {
+            /* Set the default */
+            MmSecondaryColors = MI_SECONDARY_COLORS;
+        }
+    }
+    
+    /* Compute the mask and store it */
+    MmSecondaryColorMask = MmSecondaryColors - 1;
+    KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask;    
+}
+
+VOID
+NTAPI
+MiInitializeColorTables(VOID)
+{
+    ULONG i;
+    PMMPTE PointerPte, LastPte;
+    MMPTE TempPte = ValidKernelPte;
+    
+    /* The color table starts after the ARM3 PFN database */
+    MmFreePagesByColor[0] = (PMMCOLOR_TABLES)&MmPfnDatabase[1][MmHighestPhysicalPage + 1];
+    
+    /* Loop the PTEs. We have two color tables for each secondary color */
+    PointerPte = MiAddressToPte(&MmFreePagesByColor[0][0]);
+    LastPte = MiAddressToPte((ULONG_PTR)MmFreePagesByColor[0] +
+                             (2 * MmSecondaryColors * sizeof(MMCOLOR_TABLES))
+                             - 1);
+    while (PointerPte <= LastPte)
+    {
+        /* Check for valid PTE */
+        if (PointerPte->u.Hard.Valid == 0)
+        {
+            /* Get a page and map it */
+            TempPte.u.Hard.PageFrameNumber = MxGetNextPage(1);
+            ASSERT(TempPte.u.Hard.Valid == 1);
+            *PointerPte = TempPte;
+            
+            /* Zero out the page */
+            RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE);
+        }
+        
+        /* Next */
+        PointerPte++;
+    }
+    
+    /* Now set the address of the next list, right after this one */
+    MmFreePagesByColor[1] = &MmFreePagesByColor[0][MmSecondaryColors];
+    
+    /* Now loop the lists to set them up */
+    for (i = 0; i < MmSecondaryColors; i++)
+    {
+        /* Set both free and zero lists for each color */
+        MmFreePagesByColor[ZeroedPageList][i].Flink = 0xFFFFFFFF;
+        MmFreePagesByColor[ZeroedPageList][i].Blink = (PVOID)0xFFFFFFFF;
+        MmFreePagesByColor[ZeroedPageList][i].Count = 0;
+        MmFreePagesByColor[FreePageList][i].Flink = 0xFFFFFFFF;
+        MmFreePagesByColor[FreePageList][i].Blink = (PVOID)0xFFFFFFFF;
+        MmFreePagesByColor[FreePageList][i].Count = 0;
+    }
+}
+
+BOOLEAN
+NTAPI
+MiIsRegularMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+                  IN PFN_NUMBER Pfn)
+{
+    PLIST_ENTRY NextEntry;
+    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+
+    /* Loop the memory descriptors */
+    NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+    while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+    {
+        /* Get the memory descriptor */
+        MdBlock = CONTAINING_RECORD(NextEntry,
+                                    MEMORY_ALLOCATION_DESCRIPTOR,
+                                    ListEntry);
+
+        /* Check if this PFN could be part of the block */
+        if (Pfn >= (MdBlock->BasePage))
+        {
+            /* Check if it really is part of the block */
+            if (Pfn < (MdBlock->BasePage + MdBlock->PageCount))
+            {
+                /* Check if the block is actually memory we don't map */
+                if ((MdBlock->MemoryType == LoaderFirmwarePermanent) ||
+                    (MdBlock->MemoryType == LoaderBBTMemory) ||
+                    (MdBlock->MemoryType == LoaderSpecialMemory))
+                {
+                    /* We don't need PFN database entries for this memory */
+                    break;
+                }
+
+                /* This is memory we want to map */
+                return TRUE;
+            }
+        }
+        else
+        {
+            /* Blocks are ordered, so if it's not here, it doesn't exist */
+            break;
+        }
+
+        /* Get to the next descriptor */
+        NextEntry = MdBlock->ListEntry.Flink;
+    }
+
+    /* Check if this PFN is actually from our free memory descriptor */
+    if ((Pfn >= MxOldFreeDescriptor.BasePage) &&
+        (Pfn < MxOldFreeDescriptor.BasePage + MxOldFreeDescriptor.PageCount))
+    {
+        /* We use these pages for initial mappings, so we do want to count them */
+        return TRUE;
+    }
+
+    /* Otherwise this isn't memory that we describe or care about */
+    return FALSE;
+}
+
+VOID
+NTAPI
+MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    ULONG FreePage, FreePageCount, PagesLeft, BasePage, PageCount;
+    PLIST_ENTRY NextEntry;
+    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+    PMMPTE PointerPte, LastPte;
+    MMPTE TempPte = ValidKernelPte;
+    
+    /* Get current page data, since we won't be using MxGetNextPage as it would corrupt our state */
+    FreePage = MxFreeDescriptor->BasePage;
+    FreePageCount = MxFreeDescriptor->PageCount;
+    PagesLeft = 0;
+    
+    /* Loop the memory descriptors */
+    NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+    while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+    {
+        /* Get the descriptor */
+        MdBlock = CONTAINING_RECORD(NextEntry,
+                                    MEMORY_ALLOCATION_DESCRIPTOR,
+                                    ListEntry);
+        if ((MdBlock->MemoryType == LoaderFirmwarePermanent) ||
+            (MdBlock->MemoryType == LoaderBBTMemory) ||
+            (MdBlock->MemoryType == LoaderSpecialMemory))
+        {
+            /* These pages are not part of the PFN database */
+            NextEntry = MdBlock->ListEntry.Flink;
+            continue;
+        }
+        
+        /* Next, check if this is our special free descriptor we've found */
+        if (MdBlock == MxFreeDescriptor)
+        {
+            /* Use the real numbers instead */
+            BasePage = MxOldFreeDescriptor.BasePage;
+            PageCount = MxOldFreeDescriptor.PageCount;
+        }
+        else
+        {
+            /* Use the descriptor's numbers */
+            BasePage = MdBlock->BasePage;
+            PageCount = MdBlock->PageCount;
+        }
+        
+        /* Get the PTEs for this range */
+        PointerPte = MiAddressToPte(&MmPfnDatabase[0][BasePage]);
+        LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[0][BasePage + PageCount]) - 1);
+        DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount);
+        
+        /* Loop them */
+        while (PointerPte <= LastPte)
+        {
+            /* We'll only touch PTEs that aren't already valid */
+            if (PointerPte->u.Hard.Valid == 0)
+            {
+                /* Use the next free page */
+                TempPte.u.Hard.PageFrameNumber = FreePage;
+                ASSERT(FreePageCount != 0);
+                
+                /* Consume free pages */
+                FreePage++;
+                FreePageCount--;
+                if (!FreePageCount)
+                {
+                    /* Out of memory */
+                    KeBugCheckEx(INSTALL_MORE_MEMORY,
+                                 MmNumberOfPhysicalPages,
+                                 FreePageCount,
+                                 MxOldFreeDescriptor.PageCount,
+                                 1);
+                }
+                
+                /* Write out this PTE */
+                PagesLeft++;
+                ASSERT(PointerPte->u.Hard.Valid == 0);
+                ASSERT(TempPte.u.Hard.Valid == 1);
+                *PointerPte = TempPte;
+                
+                /* Zero this page */
+                RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE);
+            }
+            
+            /* Next! */
+            PointerPte++;
+        }
+        
+        /* Get the PTEs for this range */
+        PointerPte = MiAddressToPte(&MmPfnDatabase[1][BasePage]);
+        LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[1][BasePage + PageCount]) - 1);
+        DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount);
+        
+        /* Loop them */
+        while (PointerPte <= LastPte)
+        {
+            /* We'll only touch PTEs that aren't already valid */
+            if (PointerPte->u.Hard.Valid == 0)
+            {
+                /* Use the next free page */
+                TempPte.u.Hard.PageFrameNumber = FreePage;
+                ASSERT(FreePageCount != 0);
+                
+                /* Consume free pages */
+                FreePage++;
+                FreePageCount--;
+                if (!FreePageCount)
+                {
+                    /* Out of memory */
+                    KeBugCheckEx(INSTALL_MORE_MEMORY,
+                                 MmNumberOfPhysicalPages,
+                                 FreePageCount,
+                                 MxOldFreeDescriptor.PageCount,
+                                 1);
+                }
+                
+                /* Write out this PTE */
+                PagesLeft++;
+                ASSERT(PointerPte->u.Hard.Valid == 0);
+                ASSERT(TempPte.u.Hard.Valid == 1);
+                *PointerPte = TempPte;
+                
+                /* Zero this page */
+                RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE);
+            }
+            
+            /* Next! */
+            PointerPte++;
+        }
+        
+        /* Do the next address range */
+        NextEntry = MdBlock->ListEntry.Flink;
+    }
+    
+    /* Now update the free descriptors to consume the pages we used up during the PFN allocation loop */
+    MxFreeDescriptor->BasePage = FreePage;
+    MxFreeDescriptor->PageCount = FreePageCount;
+}
+
+VOID
+NTAPI
+MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    PMMPDE PointerPde;
+    PMMPTE PointerPte;
+    ULONG i, Count, j;
+    PFN_NUMBER PageFrameIndex, StartupPdIndex, PtePageIndex;
+    PMMPFN Pfn1, Pfn2;
+    ULONG_PTR BaseAddress = 0;
+    
+    /* PFN of the startup page directory */
+    StartupPdIndex = PFN_FROM_PTE(MiAddressToPde(PDE_BASE));
+    
+    /* Start with the first PDE and scan them all */
+    PointerPde = MiAddressToPde(NULL);
+    Count = PD_COUNT * PDE_COUNT;
+    for (i = 0; i < Count; i++)
+    {
+        /* Check for valid PDE */
+        if (PointerPde->u.Hard.Valid == 1)
+        {
+            /* Get the PFN from it */
+            PageFrameIndex = PFN_FROM_PTE(PointerPde);
+            
+            /* Do we want a PFN entry for this page? */
+            if (MiIsRegularMemory(LoaderBlock, PageFrameIndex))
+            {
+                /* Yes we do, set it up */
+                Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex);
+                Pfn1->u4.PteFrame = StartupPdIndex;
+                Pfn1->PteAddress = PointerPde;
+                Pfn1->u2.ShareCount++;
+                Pfn1->u3.e2.ReferenceCount = 1;
+                Pfn1->u3.e1.PageLocation = ActiveAndValid;
+                Pfn1->u3.e1.CacheAttribute = MiNonCached;
+            }
+            else
+            {
+                /* No PFN entry */
+                Pfn1 = NULL;
+            }
+            
+            /* Now get the PTE and scan the pages */
+            PointerPte = MiAddressToPte(BaseAddress);
+            for (j = 0; j < PTE_COUNT; j++)
+            {
+                /* Check for a valid PTE */
+                if (PointerPte->u.Hard.Valid == 1)
+                {
+                    /* Increase the shared count of the PFN entry for the PDE */
+                    ASSERT(Pfn1 != NULL);
+                    Pfn1->u2.ShareCount++;
+                    
+                    /* Now check if the PTE is valid memory too */
+                    PtePageIndex = PFN_FROM_PTE(PointerPte);
+                    if (MiIsRegularMemory(LoaderBlock, PtePageIndex))
+                    {
+                        /*
+                         * Only add pages above the end of system code or pages
+                         * that are part of nonpaged pool
+                         */
+                        if ((BaseAddress >= 0xA0000000) ||
+                            ((BaseAddress >= (ULONG_PTR)MmNonPagedPoolStart) &&
+                             (BaseAddress < (ULONG_PTR)MmNonPagedPoolStart +
+                                            MmSizeOfNonPagedPoolInBytes)))
+                        {
+                            /* Get the PFN entry and make sure it too is valid */
+                            Pfn2 = MI_PFN_TO_PFNENTRY(PtePageIndex);
+                            if ((MmIsAddressValid(Pfn2)) &&
+                                (MmIsAddressValid(Pfn2 + 1)))
+                            {
+                                /* Setup the PFN entry */
+                                Pfn2->u4.PteFrame = PageFrameIndex;
+                                Pfn2->PteAddress = PointerPte;
+                                Pfn2->u2.ShareCount++;
+                                Pfn2->u3.e2.ReferenceCount = 1;
+                                Pfn2->u3.e1.PageLocation = ActiveAndValid;
+                                Pfn2->u3.e1.CacheAttribute = MiNonCached;
+                            }
+                        }
+                    }
+                }
+                
+                /* Next PTE */
+                PointerPte++;
+                BaseAddress += PAGE_SIZE;
+            }
+        }
+        else
+        {
+            /* Next PDE mapped address */
+            BaseAddress += PTE_COUNT * PAGE_SIZE;
+        }
+        
+        /* Next PTE */
+        PointerPde++;
+    }
+}
+
+VOID
+NTAPI
+MiBuildPfnDatabaseZeroPage(VOID)
+{
+    PMMPFN Pfn1;
+    PMMPDE PointerPde;
+    
+    /* Grab the lowest page and check if it has no real references */
+    Pfn1 = MI_PFN_TO_PFNENTRY(MmLowestPhysicalPage);
+    if (!(MmLowestPhysicalPage) && !(Pfn1->u3.e2.ReferenceCount))
+    {
+        /* Make it a bogus page to catch errors */
+        PointerPde = MiAddressToPde(0xFFFFFFFF);
+        Pfn1->u4.PteFrame = PFN_FROM_PTE(PointerPde);
+        Pfn1->PteAddress = PointerPde;
+        Pfn1->u2.ShareCount++;
+        Pfn1->u3.e2.ReferenceCount = 0xFFF0;
+        Pfn1->u3.e1.PageLocation = ActiveAndValid;
+        Pfn1->u3.e1.CacheAttribute = MiNonCached;
+    } 
+}
+
+VOID
+NTAPI
+MiBuildPfnDatabaseFromLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    PLIST_ENTRY NextEntry;
+    PFN_NUMBER PageCount = 0;
+    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+    PFN_NUMBER PageFrameIndex;
+    PMMPFN Pfn1;
+    PMMPTE PointerPte;
+    PMMPDE PointerPde;
+    
+    /* Now loop through the descriptors */
+    NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+    while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+    {
+        /* Get the current descriptor */
+        MdBlock = CONTAINING_RECORD(NextEntry,
+                                    MEMORY_ALLOCATION_DESCRIPTOR,
+                                    ListEntry);
+
+        /* Read its data */
+        PageCount = MdBlock->PageCount;
+        PageFrameIndex = MdBlock->BasePage;
+
+        /* Don't allow memory above what the PFN database is mapping */
+        if (PageFrameIndex > MmHighestPhysicalPage)
+        {
+            /* Since they are ordered, everything past here will be larger */
+            break;
+        }
+
+        /* On the other hand, the end page might be higher up... */
+        if ((PageFrameIndex + PageCount) > (MmHighestPhysicalPage + 1))
+        {
+            /* In which case we'll trim the descriptor to go as high as we can */
+            PageCount = MmHighestPhysicalPage + 1 - PageFrameIndex;
+            MdBlock->PageCount = PageCount;
+            
+            /* But if there's nothing left to trim, we got too high, so quit */
+            if (!PageCount) break;
+        }
+
+        /* Now check the descriptor type */
+        switch (MdBlock->MemoryType)
+        {
+            /* Check for bad RAM */
+            case LoaderBad:
+            
+                DPRINT1("You have damaged RAM modules. Stopping boot\n");
+                while (TRUE);
+                break;
+
+            /* Check for free RAM */
+            case LoaderFree:
+            case LoaderLoadedProgram:
+            case LoaderFirmwareTemporary:
+            case LoaderOsloaderStack:
+
+                /* Get the last page of this descriptor. Note we loop backwards */
+                PageFrameIndex += PageCount - 1;
+                Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex);
+                while (PageCount--)
+                {
+                    /* If the page really has no references, mark it as free */
+                    if (!Pfn1->u3.e2.ReferenceCount)
+                    {
+                        Pfn1->u3.e1.CacheAttribute = MiNonCached;
+                        //MiInsertPageInFreeList(PageFrameIndex);
+                    }
+
+                    /* Go to the next page */
+                    Pfn1--;
+                    PageFrameIndex--;
+                }
+                
+                /* Done with this block */
+                break;
+
+            /* Check for pages that are invisible to us */
+            case LoaderFirmwarePermanent:
+            case LoaderSpecialMemory:
+            case LoaderBBTMemory:
+
+                /* And skip them */
+                break;
+
+            default:
+
+                /* Map these pages with the KSEG0 mapping that adds 0x80000000 */
+                PointerPte = MiAddressToPte(KSEG0_BASE + (PageFrameIndex << PAGE_SHIFT));
+                Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex);
+                while (PageCount--)
+                {
+                    /* Check if the page is really unused */
+                    PointerPde = MiAddressToPde(KSEG0_BASE + (PageFrameIndex << PAGE_SHIFT));
+                    if (!Pfn1->u3.e2.ReferenceCount)
+                    {
+                        /* Mark it as being in-use */
+                        Pfn1->u4.PteFrame = PFN_FROM_PTE(PointerPde);
+                        Pfn1->PteAddress = PointerPte;
+                        Pfn1->u2.ShareCount++;
+                        Pfn1->u3.e2.ReferenceCount = 1;
+                        Pfn1->u3.e1.PageLocation = ActiveAndValid;
+                        Pfn1->u3.e1.CacheAttribute = MiNonCached;
+                        
+                        /* Check for RAM disk page */
+                        if (MdBlock->MemoryType == LoaderXIPRom)
+                        {
+                            /* Make it a pseudo-I/O ROM mapping */
+                            Pfn1->u1.Flink = 0;
+                            Pfn1->u2.ShareCount = 0;
+                            Pfn1->u3.e2.ReferenceCount = 0;
+                            Pfn1->u3.e1.PageLocation = 0;
+                            Pfn1->u3.e1.Rom = 1;
+                            Pfn1->u4.InPageError = 0;
+                            Pfn1->u3.e1.PrototypePte = 1;
+                        }
+                    }
+                    
+                    /* Advance page structures */
+                    Pfn1++;
+                    PageFrameIndex++;
+                    PointerPte++;
+                }
+                break;
+        }
+
+        /* Next descriptor entry */
+        NextEntry = MdBlock->ListEntry.Flink;
+    }
+}
+
+VOID
+NTAPI
+MiBuildPfnDatabaseSelf(VOID)
+{
+    PMMPTE PointerPte, LastPte;
+    PMMPFN Pfn1;
+    
+    /* Loop the PFN database page */
+    PointerPte = MiAddressToPte(MI_PFN_TO_PFNENTRY(MmLowestPhysicalPage));
+    LastPte = MiAddressToPte(MI_PFN_TO_PFNENTRY(MmHighestPhysicalPage));
+    while (PointerPte <= LastPte)
+    {
+        /* Make sure the page is valid */
+        if (PointerPte->u.Hard.Valid == 1)
+        {
+            /* Get the PFN entry and just mark it referenced */
+            Pfn1 = MI_PFN_TO_PFNENTRY(PointerPte->u.Hard.PageFrameNumber);
+            Pfn1->u2.ShareCount = 1;
+            Pfn1->u3.e2.ReferenceCount = 1;
+        }
+        
+        /* Next */
+        PointerPte++;
+    }
+}
+
+VOID
+NTAPI
+MiInitializePfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    /* Scan memory and start setting up PFN entries */
+    MiBuildPfnDatabaseFromPages(LoaderBlock);
+    
+    /* Add the zero page */
+    MiBuildPfnDatabaseZeroPage();
+    
+    /* Scan the loader block and build the rest of the PFN database */
+    MiBuildPfnDatabaseFromLoaderBlock(LoaderBlock);
+    
+    /* Finally add the pages for the PFN database itself */ 
+    MiBuildPfnDatabaseSelf();
+}
+
+VOID
+NTAPI
+MiAdjustWorkingSetManagerParameters(IN BOOLEAN Client)
+{
+    /* This function needs to do more work, for now, we tune page minimums */
+    
+    /* Check for a system with around 64MB RAM or more */
+    if (MmNumberOfPhysicalPages >= (63 * _1MB) / PAGE_SIZE)
+    {
+        /* Double the minimum amount of pages we consider for a "plenty free" scenario */
+        MmPlentyFreePages *= 2;
+    }
+}
+
+VOID
+NTAPI
+MiNotifyMemoryEvents(VOID)
+{
+    /* Are we in a low-memory situation? */
+    if (MmAvailablePages < MmLowMemoryThreshold)
+    {
+        /* Clear high, set low  */
+        if (KeReadStateEvent(MiHighMemoryEvent)) KeClearEvent(MiHighMemoryEvent);
+        if (!KeReadStateEvent(MiLowMemoryEvent)) KeSetEvent(MiLowMemoryEvent, 0, FALSE);
+    }
+    else if (MmAvailablePages < MmHighMemoryThreshold)
+    {
+        /* We are in between, clear both */
+        if (KeReadStateEvent(MiHighMemoryEvent)) KeClearEvent(MiHighMemoryEvent);
+        if (KeReadStateEvent(MiLowMemoryEvent)) KeClearEvent(MiLowMemoryEvent);
+    }
+    else
+    {
+        /* Clear low, set high  */
+        if (KeReadStateEvent(MiLowMemoryEvent)) KeClearEvent(MiLowMemoryEvent);
+        if (!KeReadStateEvent(MiHighMemoryEvent)) KeSetEvent(MiHighMemoryEvent, 0, FALSE);
+    }
+}
+
+NTSTATUS
+NTAPI
+MiCreateMemoryEvent(IN PUNICODE_STRING Name,
+                    OUT PKEVENT *Event)
+{
+    PACL Dacl;
+    HANDLE EventHandle;
+    ULONG DaclLength;
+    NTSTATUS Status;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    SECURITY_DESCRIPTOR SecurityDescriptor;
+
+    /* Create the SD */
+    Status = RtlCreateSecurityDescriptor(&SecurityDescriptor,
+                                         SECURITY_DESCRIPTOR_REVISION);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* One ACL with 3 ACEs, containing each one SID */
+    DaclLength = sizeof(ACL) +
+                 3 * sizeof(ACCESS_ALLOWED_ACE) +
+                 RtlLengthSid(SeLocalSystemSid) +
+                 RtlLengthSid(SeAliasAdminsSid) +
+                 RtlLengthSid(SeWorldSid);
+
+    /* Allocate space for the DACL */
+    Dacl = ExAllocatePoolWithTag(PagedPool, DaclLength, 'lcaD');
+    if (!Dacl) return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* Setup the ACL inside it */
+    Status = RtlCreateAcl(Dacl, DaclLength, ACL_REVISION);
+    if (!NT_SUCCESS(Status)) goto CleanUp;
+    
+    /* Add query rights for everyone */
+    Status = RtlAddAccessAllowedAce(Dacl,
+                                    ACL_REVISION,
+                                    SYNCHRONIZE | EVENT_QUERY_STATE | READ_CONTROL,
+                                    SeWorldSid);
+    if (!NT_SUCCESS(Status)) goto CleanUp;
+    
+    /* Full rights for the admin */
+    Status = RtlAddAccessAllowedAce(Dacl,
+                                    ACL_REVISION,
+                                    EVENT_ALL_ACCESS,
+                                    SeAliasAdminsSid);
+    if (!NT_SUCCESS(Status)) goto CleanUp;
+    
+    /* As well as full rights for the system */
+    Status = RtlAddAccessAllowedAce(Dacl,
+                                    ACL_REVISION,
+                                    EVENT_ALL_ACCESS,
+                                    SeLocalSystemSid);
+    if (!NT_SUCCESS(Status)) goto CleanUp;
+  
+    /* Set this DACL inside the SD */
+    Status = RtlSetDaclSecurityDescriptor(&SecurityDescriptor,
+                                          TRUE,
+                                          Dacl,
+                                          FALSE);
+    if (!NT_SUCCESS(Status)) goto CleanUp;
+  
+    /* Setup the event attributes, making sure it's a permanent one */
+    InitializeObjectAttributes(&ObjectAttributes,
+                               Name,
+                               OBJ_KERNEL_HANDLE | OBJ_PERMANENT,
+                               NULL,
+                               &SecurityDescriptor);
+
+    /* Create the event */
+    Status = ZwCreateEvent(&EventHandle,
+                           EVENT_ALL_ACCESS,
+                           &ObjectAttributes,
+                           NotificationEvent,
+                           FALSE);
+CleanUp:
+    /* Free the DACL */
+    ExFreePool(Dacl);
+
+    /* Check if this is the success path */
+    if (NT_SUCCESS(Status))
+    {
+        /* Add a reference to the object, then close the handle we had */
+        Status = ObReferenceObjectByHandle(EventHandle,
+                                           EVENT_MODIFY_STATE,
+                                           ExEventObjectType,
+                                           KernelMode,
+                                           (PVOID*)Event,
+                                           NULL);
+        ZwClose (EventHandle);                     
+    }
+
+    /* Return status */
+    return Status;
+}
+
+BOOLEAN
+NTAPI
+MiInitializeMemoryEvents(VOID)
+{
+    UNICODE_STRING LowString = RTL_CONSTANT_STRING(L"\\KernelObjects\\LowMemoryCondition");
+    UNICODE_STRING HighString = RTL_CONSTANT_STRING(L"\\KernelObjects\\HighMemoryCondition");
+    UNICODE_STRING LowPagedPoolString = RTL_CONSTANT_STRING(L"\\KernelObjects\\LowPagedPoolCondition");
+    UNICODE_STRING HighPagedPoolString = RTL_CONSTANT_STRING(L"\\KernelObjects\\HighPagedPoolCondition");
+    UNICODE_STRING LowNonPagedPoolString = RTL_CONSTANT_STRING(L"\\KernelObjects\\LowNonPagedPoolCondition");
+    UNICODE_STRING HighNonPagedPoolString = RTL_CONSTANT_STRING(L"\\KernelObjects\\HighNonPagedPoolCondition");
+    NTSTATUS Status;
+
+    /* Check if we have a registry setting */
+    if (MmLowMemoryThreshold)
+    {
+        /* Convert it to pages */
+        MmLowMemoryThreshold *= (_1MB / PAGE_SIZE);
+    }
+    else
+    {
+        /* The low memory threshold is hit when we don't consider that we have "plenty" of free pages anymore */
+        MmLowMemoryThreshold = MmPlentyFreePages;
+
+        /* More than one GB of memory? */
+        if (MmNumberOfPhysicalPages > 0x40000)
+        {
+            /* Start at 32MB, and add another 16MB for each GB */
+            MmLowMemoryThreshold = (32 * _1MB) / PAGE_SIZE;
+            MmLowMemoryThreshold += ((MmNumberOfPhysicalPages - 0x40000) >> 7);
+        }
+        else if (MmNumberOfPhysicalPages > 0x8000)
+        {
+            /* For systems with > 128MB RAM, add another 4MB for each 128MB */
+            MmLowMemoryThreshold += ((MmNumberOfPhysicalPages - 0x8000) >> 5);
+        }
+
+        /* Don't let the minimum threshold go past 64MB */
+        MmLowMemoryThreshold = min(MmLowMemoryThreshold, (64 * _1MB) / PAGE_SIZE);
+    }
+
+    /* Check if we have a registry setting */
+    if (MmHighMemoryThreshold)
+    {
+        /* Convert it into pages */
+        MmHighMemoryThreshold *= (_1MB / PAGE_SIZE);
+    }
+    else
+    {
+        /* Otherwise, the default is three times the low memory threshold */
+        MmHighMemoryThreshold = 3 * MmLowMemoryThreshold;
+        ASSERT(MmHighMemoryThreshold > MmLowMemoryThreshold);
+    }
+
+    /* Make sure high threshold is actually higher than the low */
+    MmHighMemoryThreshold = max(MmHighMemoryThreshold, MmLowMemoryThreshold);
+
+    /* Create the memory events for all the thresholds */
+    Status = MiCreateMemoryEvent(&LowString, &MiLowMemoryEvent);
+    if (!NT_SUCCESS(Status)) return FALSE;
+    Status = MiCreateMemoryEvent(&HighString, &MiHighMemoryEvent);
+    if (!NT_SUCCESS(Status)) return FALSE;
+    Status = MiCreateMemoryEvent(&LowPagedPoolString, &MiLowPagedPoolEvent);
+    if (!NT_SUCCESS(Status)) return FALSE;
+    Status = MiCreateMemoryEvent(&HighPagedPoolString, &MiHighPagedPoolEvent);
+    if (!NT_SUCCESS(Status)) return FALSE;
+    Status = MiCreateMemoryEvent(&LowNonPagedPoolString, &MiLowNonPagedPoolEvent);
+    if (!NT_SUCCESS(Status)) return FALSE;
+    Status = MiCreateMemoryEvent(&HighNonPagedPoolString, &MiHighNonPagedPoolEvent);
+    if (!NT_SUCCESS(Status)) return FALSE;
+
+    /* Now setup the pool events */
+    MiInitializePoolEvents();
+
+    /* Set the initial event state */
+    MiNotifyMemoryEvents();
+    return TRUE;
+}
+
+VOID
+NTAPI
+MmDumpArmPfnDatabase(VOID)
+{
+    ULONG i;
+    PMMPFN Pfn1;
+    PCHAR Consumer = "Unknown";
+    KIRQL OldIrql;
+    ULONG ActivePages = 0, FreePages = 0, OtherPages = 0;
+    
+    KeRaiseIrql(HIGH_LEVEL, &OldIrql);
+    
+    //
+    // Loop the PFN database
+    //
+    for (i = 0; i <= MmHighestPhysicalPage; i++)
+    {
+        Pfn1 = MI_PFN_TO_PFNENTRY(i);
+        if (!Pfn1) continue;
+        
+        //
+        // Get the page location
+        //
+        switch (Pfn1->u3.e1.PageLocation)
+        {
+            case ActiveAndValid:
+                
+                Consumer = "Active and Valid";
+                ActivePages++;
+                break;
+                
+            case FreePageList:
+                
+                Consumer = "Free Page List";
+                FreePages++;
+                break;
+                
+            default:
+                
+                Consumer = "Other (ASSERT!)";
+                OtherPages++;
+                break;
+        }
+                
+        //
+        // Pretty-print the page
+        //
+        DbgPrint("0x%08p:\t%20s\t(%02d.%02d) [%08p-%08p])\n",
+                 i << PAGE_SHIFT,
+                 Consumer,
+                 Pfn1->u3.e2.ReferenceCount,
+                 Pfn1->u2.ShareCount,
+                 Pfn1->PteAddress,
+                 Pfn1->u4.PteFrame);
+    }
+    
+    DbgPrint("Active:               %d pages\t[%d KB]\n", ActivePages,  (ActivePages    << PAGE_SHIFT) / 1024);
+    DbgPrint("Free:                 %d pages\t[%d KB]\n", FreePages,    (FreePages      << PAGE_SHIFT) / 1024);
+    DbgPrint("Other:                %d pages\t[%d KB]\n", OtherPages,   (OtherPages     << PAGE_SHIFT) / 1024);
+    
+    KeLowerIrql(OldIrql);
+}
+
+PFN_NUMBER
+NTAPI
+MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+                     IN PBOOLEAN IncludeType)
+{
+    PLIST_ENTRY NextEntry;
+    PFN_NUMBER PageCount = 0;
+    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+    
+    //
+    // Now loop through the descriptors
+    //
+    NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+    while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+    {
+        //
+        // Grab each one, and check if it's one we should include
+        //
+        MdBlock = CONTAINING_RECORD(NextEntry,
+                                    MEMORY_ALLOCATION_DESCRIPTOR,
+                                    ListEntry);
+        if ((MdBlock->MemoryType < LoaderMaximum) &&
+            (IncludeType[MdBlock->MemoryType]))
+        {
+            //
+            // Add this to our running total
+            //
+            PageCount += MdBlock->PageCount;
+        }
+        
+        //
+        // Try the next descriptor
+        //
+        NextEntry = MdBlock->ListEntry.Flink;
+    }
+    
+    //
+    // Return the total
+    //
+    return PageCount;
+}
+
+PPHYSICAL_MEMORY_DESCRIPTOR
+NTAPI
+MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+                         IN PBOOLEAN IncludeType)
+{
+    PLIST_ENTRY NextEntry;
+    ULONG Run = 0, InitialRuns = 0;
+    PFN_NUMBER NextPage = -1, PageCount = 0;
+    PPHYSICAL_MEMORY_DESCRIPTOR Buffer, NewBuffer;
+    PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+    
+    //
+    // Scan the memory descriptors
+    //
+    NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+    while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+    {
+        //
+        // For each one, increase the memory allocation estimate
+        //
+        InitialRuns++;
+        NextEntry = NextEntry->Flink;
+    }
+    
+    //
+    // Allocate the maximum we'll ever need
+    //
+    Buffer = ExAllocatePoolWithTag(NonPagedPool,
+                                   sizeof(PHYSICAL_MEMORY_DESCRIPTOR) +
+                                   sizeof(PHYSICAL_MEMORY_RUN) *
+                                   (InitialRuns - 1),
+                                   'lMmM');
+    if (!Buffer) return NULL;
+
+    //
+    // For now that's how many runs we have
+    //
+    Buffer->NumberOfRuns = InitialRuns;
+    
+    //
+    // Now loop through the descriptors again
+    //
+    NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+    while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+    {
+        //
+        // Grab each one, and check if it's one we should include
+        //
+        MdBlock = CONTAINING_RECORD(NextEntry,
+                                    MEMORY_ALLOCATION_DESCRIPTOR,
+                                    ListEntry);
+        if ((MdBlock->MemoryType < LoaderMaximum) &&
+            (IncludeType[MdBlock->MemoryType]))
+        {
+            //
+            // Add this to our running total
+            //
+            PageCount += MdBlock->PageCount;
+            
+            //
+            // Check if the next page is described by the next descriptor
+            //            
+            if (MdBlock->BasePage == NextPage)
+            {
+                //
+                // Combine it into the same physical run
+                //
+                ASSERT(MdBlock->PageCount != 0);
+                Buffer->Run[Run - 1].PageCount += MdBlock->PageCount;
+                NextPage += MdBlock->PageCount;
+            }
+            else
+            {
+                //
+                // Otherwise just duplicate the descriptor's contents
+                //
+                Buffer->Run[Run].BasePage = MdBlock->BasePage;
+                Buffer->Run[Run].PageCount = MdBlock->PageCount;
+                NextPage = Buffer->Run[Run].BasePage + Buffer->Run[Run].PageCount;
+                
+                //
+                // And in this case, increase the number of runs
+                //
+                Run++;
+            }
+        }
+        
+        //
+        // Try the next descriptor
+        //
+        NextEntry = MdBlock->ListEntry.Flink;
+    }
+    
+    //
+    // We should not have been able to go past our initial estimate
+    //
+    ASSERT(Run <= Buffer->NumberOfRuns);
+
+    //
+    // Our guess was probably exaggerated...
+    //
+    if (InitialRuns > Run)
+    {
+        //
+        // Allocate a more accurately sized buffer
+        //
+        NewBuffer = ExAllocatePoolWithTag(NonPagedPool,
+                                          sizeof(PHYSICAL_MEMORY_DESCRIPTOR) +
+                                          sizeof(PHYSICAL_MEMORY_RUN) *
+                                          (Run - 1),
+                                          'lMmM');
+        if (NewBuffer)
+        {
+            //
+            // Copy the old buffer into the new, then free it
+            //
+            RtlCopyMemory(NewBuffer->Run,
+                          Buffer->Run,
+                          sizeof(PHYSICAL_MEMORY_RUN) * Run);
+            ExFreePool(Buffer);
+            
+            //
+            // Now use the new buffer
+            //
+            Buffer = NewBuffer;
+        }
+    }
+    
+    //
+    // Write the final numbers, and return it
+    //
+    Buffer->NumberOfRuns = Run;
+    Buffer->NumberOfPages = PageCount;
+    return Buffer;
+}
+
+VOID
+NTAPI
+MiBuildPagedPool(VOID)
+{
+    PMMPTE PointerPte, PointerPde;
+    MMPTE TempPte = ValidKernelPte;
+    PFN_NUMBER PageFrameIndex;
+    KIRQL OldIrql;
+    ULONG Size, BitMapSize;
+    
+    //
+    // Get the page frame number for the system page directory
+    //
+    PointerPte = MiAddressToPte(PDE_BASE);
+    MmSystemPageDirectory = PFN_FROM_PTE(PointerPte);
+    
+    //
+    // Allocate a system PTE which will hold a copy of the page directory
+    //
+    PointerPte = MiReserveSystemPtes(1, SystemPteSpace);
+    ASSERT(PointerPte);
+    MmSystemPagePtes = MiPteToAddress(PointerPte);
+
+    //
+    // Make this system PTE point to the system page directory.
+    // It is now essentially double-mapped. This will be used later for lazy
+    // evaluation of PDEs accross process switches, similarly to how the Global
+    // page directory array in the old ReactOS Mm is used (but in a less hacky
+    // way).
+    //
+    TempPte = ValidKernelPte;
+    TempPte.u.Hard.PageFrameNumber = MmSystemPageDirectory;
+    ASSERT(PointerPte->u.Hard.Valid == 0);
+    ASSERT(TempPte.u.Hard.Valid == 1);
+    *PointerPte = TempPte;
+
+    //
+    // Let's get back to paged pool work: size it up.
+    // By default, it should be twice as big as nonpaged pool.
+    //
+    MmSizeOfPagedPoolInBytes = 2 * MmMaximumNonPagedPoolInBytes;
+    if (MmSizeOfPagedPoolInBytes > ((ULONG_PTR)MmNonPagedSystemStart -
+                                    (ULONG_PTR)MmPagedPoolStart))
+    {
+        //
+        // On the other hand, we have limited VA space, so make sure that the VA
+        // for paged pool doesn't overflow into nonpaged pool VA. Otherwise, set
+        // whatever maximum is possible.
+        //
+        MmSizeOfPagedPoolInBytes = (ULONG_PTR)MmNonPagedSystemStart -
+                                   (ULONG_PTR)MmPagedPoolStart;
+    }
+
+    //
+    // Get the size in pages and make sure paged pool is at least 32MB.
+    //
+    Size = MmSizeOfPagedPoolInBytes;
+    if (Size < MI_MIN_INIT_PAGED_POOLSIZE) Size = MI_MIN_INIT_PAGED_POOLSIZE;
+    Size = BYTES_TO_PAGES(Size);
+
+    //
+    // Now check how many PTEs will be required for these many pages.
+    //
+    Size = (Size + (1024 - 1)) / 1024;
+
+    //
+    // Recompute the page-aligned size of the paged pool, in bytes and pages.
+    //
+    MmSizeOfPagedPoolInBytes = Size * PAGE_SIZE * 1024;
+    MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT;
+
+    //
+    // Let's be really sure this doesn't overflow into nonpaged system VA
+    //
+    ASSERT((MmSizeOfPagedPoolInBytes + (ULONG_PTR)MmPagedPoolStart) <= 
+           (ULONG_PTR)MmNonPagedSystemStart);
+
+    //
+    // This is where paged pool ends
+    //
+    MmPagedPoolEnd = (PVOID)(((ULONG_PTR)MmPagedPoolStart +
+                              MmSizeOfPagedPoolInBytes) - 1);
+
+    //
+    // So now get the PDE for paged pool and zero it out
+    //
+    PointerPde = MiAddressToPde(MmPagedPoolStart);
+    RtlZeroMemory(PointerPde,
+                  (1 + MiAddressToPde(MmPagedPoolEnd) - PointerPde) * sizeof(MMPTE));
+
+    //
+    // Next, get the first and last PTE
+    //
+    PointerPte = MiAddressToPte(MmPagedPoolStart);
+    MmPagedPoolInfo.FirstPteForPagedPool = PointerPte;
+    MmPagedPoolInfo.LastPteForPagedPool = MiAddressToPte(MmPagedPoolEnd);
+
+    //
+    // Lock the PFN database
+    //
+    OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+
+    //
+    // Allocate a page and map the first paged pool PDE
+    //
+    PageFrameIndex = MmAllocPage(MC_NPPOOL);
+    TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
+    ASSERT(PointerPde->u.Hard.Valid == 0);
+    ASSERT(TempPte.u.Hard.Valid == 1);
+    *PointerPde = TempPte;
+
+    //
+    // Release the PFN database lock
+    //
+    KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+
+    //
+    // We only have one PDE mapped for now... at fault time, additional PDEs
+    // will be allocated to handle paged pool growth. This is where they'll have
+    // to start.
+    //
+    MmPagedPoolInfo.NextPdeForPagedPoolExpansion = PointerPde + 1;
+
+    //
+    // We keep track of each page via a bit, so check how big the bitmap will
+    // have to be (make sure to align our page count such that it fits nicely
+    // into a 4-byte aligned bitmap.
+    //
+    // We'll also allocate the bitmap header itself part of the same buffer.
+    //
+    Size = Size * 1024;
+    ASSERT(Size == MmSizeOfPagedPoolInPages);
+    BitMapSize = Size;
+    Size = sizeof(RTL_BITMAP) + (((Size + 31) / 32) * sizeof(ULONG));
+
+    //
+    // Allocate the allocation bitmap, which tells us which regions have not yet
+    // been mapped into memory
+    //
+    MmPagedPoolInfo.PagedPoolAllocationMap = ExAllocatePoolWithTag(NonPagedPool,
+                                                                   Size,
+                                                                   '  mM');
+    ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap);
+
+    //
+    // Initialize it such that at first, only the first page's worth of PTEs is
+    // marked as allocated (incidentially, the first PDE we allocated earlier).
+    //
+    RtlInitializeBitMap(MmPagedPoolInfo.PagedPoolAllocationMap,
+                        (PULONG)(MmPagedPoolInfo.PagedPoolAllocationMap + 1),
+                        BitMapSize);
+    RtlSetAllBits(MmPagedPoolInfo.PagedPoolAllocationMap);
+    RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, 0, 1024);
+
+    //
+    // We have a second bitmap, which keeps track of where allocations end.
+    // Given the allocation bitmap and a base address, we can therefore figure
+    // out which page is the last page of that allocation, and thus how big the
+    // entire allocation is.
+    //
+    MmPagedPoolInfo.EndOfPagedPoolBitmap = ExAllocatePoolWithTag(NonPagedPool,
+                                                                 Size,
+                                                                 '  mM');
+    ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap);
+    RtlInitializeBitMap(MmPagedPoolInfo.EndOfPagedPoolBitmap,
+                        (PULONG)(MmPagedPoolInfo.EndOfPagedPoolBitmap + 1),
+                        BitMapSize);
+
+    //
+    // Since no allocations have been made yet, there are no bits set as the end
+    //
+    RtlClearAllBits(MmPagedPoolInfo.EndOfPagedPoolBitmap);
+
+    //
+    // Initialize paged pool.
+    //
+    InitializePool(PagedPool, 0);
+
+    /* Default low threshold of 30MB or one fifth of paged pool */
+    MiLowPagedPoolThreshold = (30 * _1MB) >> PAGE_SHIFT;
+    MiLowPagedPoolThreshold = min(MiLowPagedPoolThreshold, Size / 5);
+
+    /* Default high threshold of 60MB or 25% */
+    MiHighPagedPoolThreshold = (60 * _1MB) >> PAGE_SHIFT;
+    MiHighPagedPoolThreshold = min(MiHighPagedPoolThreshold, (Size * 2) / 5);
+    ASSERT(MiLowPagedPoolThreshold < MiHighPagedPoolThreshold);
+}
+
+NTSTATUS
+NTAPI
+MmArmInitSystem(IN ULONG Phase,
+                IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    ULONG i;
+    BOOLEAN IncludeType[LoaderMaximum];
+    PVOID Bitmap;
+    PPHYSICAL_MEMORY_RUN Run;
+    PFN_NUMBER PageCount;
+    
+    //
+    // Instantiate memory that we don't consider RAM/usable
+    // We use the same exclusions that Windows does, in order to try to be
+    // compatible with WinLDR-style booting
+    //
+    for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE;
+    IncludeType[LoaderBad] = FALSE;
+    IncludeType[LoaderFirmwarePermanent] = FALSE;
+    IncludeType[LoaderSpecialMemory] = FALSE;
+    IncludeType[LoaderBBTMemory] = FALSE;
+    if (Phase == 0)
+    {
+        /* Initialize the phase 0 temporary event */
+        KeInitializeEvent(&MiTempEvent, NotificationEvent, FALSE);
+
+        /* Set all the events to use the temporary event for now */
+        MiLowMemoryEvent = &MiTempEvent;
+        MiHighMemoryEvent = &MiTempEvent;
+        MiLowPagedPoolEvent = &MiTempEvent;
+        MiHighPagedPoolEvent = &MiTempEvent;
+        MiLowNonPagedPoolEvent = &MiTempEvent;
+        MiHighNonPagedPoolEvent = &MiTempEvent;
+        
+        //
+        // Define the basic user vs. kernel address space separation
+        //
+        MmSystemRangeStart = (PVOID)KSEG0_BASE;
+        MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000;
+        MmHighestUserAddress = (PVOID)(MmUserProbeAddress - 1);
+        
+        //
+        // Get the size of the boot loader's image allocations and then round
+        // that region up to a PDE size, so that any PDEs we might create for
+        // whatever follows are separate from the PDEs that boot loader might've
+        // already created (and later, we can blow all that away if we want to).
+        //
+        MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned;
+        MmBootImageSize *= PAGE_SIZE;
+        MmBootImageSize = (MmBootImageSize + (4 * 1024 * 1024) - 1) & ~((4 * 1024 * 1024) - 1);
+        ASSERT((MmBootImageSize % (4 * 1024 * 1024)) == 0);
+        
+        //
+        // Set the size of session view, pool, and image
+        //
+        MmSessionSize = MI_SESSION_SIZE;
+        MmSessionViewSize = MI_SESSION_VIEW_SIZE;
+        MmSessionPoolSize = MI_SESSION_POOL_SIZE;
+        MmSessionImageSize = MI_SESSION_IMAGE_SIZE;
+        
+        //
+        // Set the size of system view
+        //
+        MmSystemViewSize = MI_SYSTEM_VIEW_SIZE;
+        
+        //
+        // This is where it all ends
+        //
+        MiSessionImageEnd = (PVOID)PTE_BASE;
+        
+        //
+        // This is where we will load Win32k.sys and the video driver
+        //
+        MiSessionImageStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
+                                      MmSessionImageSize);
+        
+        //
+        // So the view starts right below the session working set (itself below
+        // the image area)
+        //
+        MiSessionViewStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
+                                     MmSessionImageSize -
+                                     MI_SESSION_WORKING_SET_SIZE - 
+                                     MmSessionViewSize);
+        
+        //
+        // Session pool follows
+        //
+        MiSessionPoolEnd = MiSessionViewStart;
+        MiSessionPoolStart = (PVOID)((ULONG_PTR)MiSessionPoolEnd -
+                                     MmSessionPoolSize);
+        
+        //
+        // And it all begins here
+        //
+        MmSessionBase = MiSessionPoolStart;
+        
+        //
+        // Sanity check that our math is correct
+        //
+        ASSERT((ULONG_PTR)MmSessionBase + MmSessionSize == PTE_BASE);
+        
+        //
+        // Session space ends wherever image session space ends
+        //
+        MiSessionSpaceEnd = MiSessionImageEnd;
+        
+        //
+        // System view space ends at session space, so now that we know where
+        // this is, we can compute the base address of system view space itself.
+        //
+        MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase -
+                                    MmSystemViewSize);
+                                    
+                                    
+        /* Initialize the user mode image list */
+        InitializeListHead(&MmLoadedUserImageList);
+        
+        /* Initialize the paged pool mutex */
+        KeInitializeGuardedMutex(&MmPagedPoolMutex);
+        
+        /* Initialize the Loader Lock */
+        KeInitializeMutant(&MmSystemLoadLock, FALSE);        
+                                    
+        //
+        // Count physical pages on the system
+        //
+        PageCount = MiPagesInLoaderBlock(LoaderBlock, IncludeType);
+        
+        //
+        // Check if this is a machine with less than 19MB of RAM
+        //
+        if (PageCount < MI_MIN_PAGES_FOR_SYSPTE_TUNING)
+        {
+            //
+            // Use the very minimum of system PTEs
+            //
+            MmNumberOfSystemPtes = 7000;
+        }
+        else
+        {
+            //
+            // Use the default, but check if we have more than 32MB of RAM
+            //
+            MmNumberOfSystemPtes = 11000;
+            if (PageCount > MI_MIN_PAGES_FOR_SYSPTE_BOOST)
+            {
+                //
+                // Double the amount of system PTEs
+                //
+                MmNumberOfSystemPtes <<= 1;
+            }
+        }
+        
+        DPRINT("System PTE count has been tuned to %d (%d bytes)\n",
+               MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
+        
+        /* Initialize the platform-specific parts */       
+        MiInitMachineDependent(LoaderBlock);
+        
+        //
+        // Sync us up with ReactOS Mm
+        //
+        MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
+        MiSyncARM3WithROS(MmPfnDatabase[0], (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1));
+        MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1));
+      
+        //
+        // Build the physical memory block
+        //
+        MmPhysicalMemoryBlock = MmInitializeMemoryLimits(LoaderBlock,
+                                                         IncludeType);
+         
+        //
+        // Allocate enough buffer for the PFN bitmap
+        // Align it up to a 32-bit boundary
+        //
+        Bitmap = ExAllocatePoolWithTag(NonPagedPool,
+                                       (((MmHighestPhysicalPage + 1) + 31) / 32) * 4,
+                                       '  mM');
+        if (!Bitmap)
+        {
+            //
+            // This is critical
+            //
+            KeBugCheckEx(INSTALL_MORE_MEMORY,
+                         MmNumberOfPhysicalPages,
+                         MmLowestPhysicalPage,
+                         MmHighestPhysicalPage,
+                         0x101);
+        }
+        
+        //
+        // Initialize it and clear all the bits to begin with
+        //
+        RtlInitializeBitMap(&MiPfnBitMap,
+                            Bitmap,
+                            MmHighestPhysicalPage + 1);
+        RtlClearAllBits(&MiPfnBitMap);
+        
+        //
+        // Loop physical memory runs
+        //
+        for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++)
+        {
+            //
+            // Get the run
+            //
+            Run = &MmPhysicalMemoryBlock->Run[i];
+            DPRINT("PHYSICAL RAM [0x%08p to 0x%08p]\n",
+                   Run->BasePage << PAGE_SHIFT,
+                   (Run->BasePage + Run->PageCount) << PAGE_SHIFT);
+
+            //
+            // Make sure it has pages inside it
+            //
+            if (Run->PageCount)
+            {
+                //
+                // Set the bits in the PFN bitmap
+                //
+                RtlSetBits(&MiPfnBitMap, Run->BasePage, Run->PageCount);
+            }
+        }
+        
+        //
+        // Size up paged pool and build the shadow system page directory
+        //
+        MiBuildPagedPool();
+        
+        /* Check how many pages the system has */
+        if (MmNumberOfPhysicalPages <= (13 * _1MB))
+        {
+            /* Set small system */
+            MmSystemSize = MmSmallSystem;
+        }
+        else if (MmNumberOfPhysicalPages <= (19 * _1MB))
+        {
+            /* Set small system */
+            MmSystemSize = MmSmallSystem;
+        }
+        else
+        {
+            /* Set medium system */
+            MmSystemSize = MmMediumSystem;
+        }
+
+        /* Check for more than 32MB */
+        if (MmNumberOfPhysicalPages >= ((32 * _1MB) / PAGE_SIZE))
+        {
+            /* Check for product type being "Wi" for WinNT */
+            if (MmProductType == '\0i\0W')
+            {
+                /* Then this is a large system */
+                MmSystemSize = MmLargeSystem;
+            }
+            else
+            {
+                /* For servers, we need 64MB to consider this as being large */
+                if (MmNumberOfPhysicalPages >= ((64 * _1MB) / PAGE_SIZE))
+                {
+                    /* Set it as large */
+                    MmSystemSize = MmLargeSystem;
+                }
+            }
+        }
+
+        /* Now setup the shared user data fields */
+        ASSERT(SharedUserData->NumberOfPhysicalPages == 0);
+        SharedUserData->NumberOfPhysicalPages = MmNumberOfPhysicalPages;
+        SharedUserData->LargePageMinimum = 0;
+
+        /* Check for workstation (Wi for WinNT) */
+        if (MmProductType == '\0i\0W')
+        {
+            /* Set Windows NT Workstation product type */
+            SharedUserData->NtProductType = NtProductWinNt;
+            MmProductType = 0;
+        }
+        else
+        {
+            /* Check for LanMan server */
+            if (MmProductType == '\0a\0L')
+            {
+                /* This is a domain controller */
+                SharedUserData->NtProductType = NtProductLanManNt;
+            }
+            else
+            {
+                /* Otherwise it must be a normal server */
+                SharedUserData->NtProductType = NtProductServer;
+            }
+
+            /* Set the product type, and make the system more aggressive with low memory */
+            MmProductType = 1;
+            MmMinimumFreePages = 81;
+        }
+
+        /* Update working set tuning parameters */
+        MiAdjustWorkingSetManagerParameters(!MmProductType);
+    }
+    
+    //
+    // Always return success for now
+    //
+    return STATUS_SUCCESS;
+}
+
+/* EOF */
index ec7660c..45c9f0a 100644 (file)
 #define MODULE_INVOLVED_IN_ARM3
 #include "../ARM3/miarm.h"
 
-/* GLOBALS ********************************************************************/
-
-BOOLEAN IsThisAnNtAsSystem = FALSE;
-MM_SYSTEMSIZE MmSystemSize = MmSmallSystem;
-
 /* PUBLIC FUNCTIONS ***********************************************************/
 
 /*
@@ -139,10 +134,8 @@ BOOLEAN
 NTAPI
 MmIsThisAnNtAsSystem(VOID)
 {
-    //
-    // Return if this is a server system
-    //
-    return IsThisAnNtAsSystem;
+    /* Return if this is a server system */
+    return MmProductType;
 }
 
 /*
@@ -152,9 +145,7 @@ MM_SYSTEMSIZE
 NTAPI
 MmQuerySystemSize(VOID)
 {
-    //
-    // Return the low, medium or high memory system type
-    //
+    /* Return the low, medium or high memory system type */
     return MmSystemSize;
 }
 
index 15701be..f43d10a 100644 (file)
@@ -108,7 +108,7 @@ MmAllocateNonCachedMemory(IN ULONG NumberOfBytes)
     //
     // Setup the template PTE
     //
-    TempPte = HyperTemplatePte;
+    TempPte = ValidKernelPte;
     
     //
     // Now check what kind of caching we should use
index 7fad6ea..768ed6d 100644 (file)
@@ -24,7 +24,7 @@ NTSTATUS
 FASTCALL
 MiCheckPdeForPagedPool(IN PVOID Address)
 {
-    PMMPTE PointerPde;
+    PMMPDE PointerPde;
     NTSTATUS Status = STATUS_SUCCESS;
     
     //
@@ -37,7 +37,7 @@ MiCheckPdeForPagedPool(IN PVOID Address)
         // Send a hint to the page fault handler that this is only a valid fault
         // if we already detected this was access within the page table range
         //
-        PointerPde = MiAddressToPte(Address);
+        PointerPde = (PMMPDE)MiAddressToPte(Address);
         Status = STATUS_WAIT_1;
     }
     else if (Address < MmSystemRangeStart)
@@ -97,7 +97,7 @@ MiResolveDemandZeroFault(IN PVOID Address,
     //
     // Get a page
     //
-    PageFrameNumber = MmAllocPage(MC_PPOOL, 0);
+    PageFrameNumber = MmAllocPage(MC_PPOOL);
     DPRINT("New pool page: %lx\n", PageFrameNumber);
     
     //
@@ -113,7 +113,7 @@ MiResolveDemandZeroFault(IN PVOID Address,
     //
     // Build the PTE
     //
-    TempPte = HyperTemplatePte;
+    TempPte = ValidKernelPte;
     TempPte.u.Hard.PageFrameNumber = PageFrameNumber;
     *PointerPte = TempPte;
     ASSERT(PointerPte->u.Hard.Valid == 1);
diff --git a/reactos/ntoskrnl/mm/ARM3/pfnlist.c b/reactos/ntoskrnl/mm/ARM3/pfnlist.c
new file mode 100644 (file)
index 0000000..5804340
--- /dev/null
@@ -0,0 +1,382 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            ntoskrnl/mm/ARM3/pfnlist.c
+ * PURPOSE:         ARM Memory Manager PFN List Manipulation
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+#line 15 "ARM³::PFNLIST"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+MMPFNLIST MmZeroedPageListHead = {0, ZeroedPageList, LIST_HEAD, LIST_HEAD};
+MMPFNLIST MmFreePageListHead = {0, FreePageList, LIST_HEAD, LIST_HEAD};
+MMPFNLIST MmStandbyPageListHead = {0, StandbyPageList, LIST_HEAD, LIST_HEAD};
+MMPFNLIST MmModifiedPageListHead = {0, ModifiedPageList, LIST_HEAD, LIST_HEAD};
+MMPFNLIST MmModifiedNoWritePageListHead = {0, ModifiedNoWritePageList, LIST_HEAD, LIST_HEAD};
+MMPFNLIST MmBadPageListHead = {0, BadPageList, LIST_HEAD, LIST_HEAD};
+MMPFNLIST MmRomPageListHead = {0, StandbyPageList, LIST_HEAD, LIST_HEAD};
+
+PMMPFNLIST MmPageLocationList[] =
+{
+    &MmZeroedPageListHead,
+    &MmFreePageListHead,
+    &MmStandbyPageListHead,
+    &MmModifiedPageListHead,
+    &MmModifiedNoWritePageListHead,
+    &MmBadPageListHead,
+    NULL,
+    NULL
+};
+/* FUNCTIONS ******************************************************************/
+
+VOID
+NTAPI
+MiInsertInListTail(IN PMMPFNLIST ListHead,
+                   IN PMMPFN Entry)
+{
+    PFN_NUMBER OldBlink, EntryIndex = MiGetPfnEntryIndex(Entry);
+
+    /* Get the back link */
+    OldBlink = ListHead->Blink;
+    if (OldBlink != LIST_HEAD)
+    {
+        /* Set the back pointer to point to us now */
+        MiGetPfnEntry(OldBlink)->u1.Flink = EntryIndex;
+    }
+    else
+    {
+        /* Set the list to point to us */
+        ListHead->Flink = EntryIndex;
+    }
+    
+    /* Set the entry to point to the list head forwards, and the old page backwards */
+    Entry->u1.Flink = LIST_HEAD;
+    Entry->u2.Blink = OldBlink;
+    
+    /* And now the head points back to us, since we are last */
+    ListHead->Blink = EntryIndex;
+    ListHead->Total++;
+}
+
+VOID
+NTAPI
+MiInsertZeroListAtBack(IN PFN_NUMBER EntryIndex)
+{
+    PFN_NUMBER OldBlink;
+    PMMPFNLIST ListHead;
+    PMMPFN Pfn1;
+#if 0
+    PMMPFN Blink;
+    ULONG Color;
+    PMMCOLOR_TABLES ColorHead;
+#endif
+
+    /* Make sure the PFN lock is held */
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+    
+    /* Get the descriptor */
+    Pfn1 = MiGetPfnEntry(EntryIndex);
+    ASSERT(Pfn1->u3.e2.ReferenceCount == 0);
+    ASSERT(Pfn1->u4.MustBeCached == 0);
+    ASSERT(Pfn1->u3.e1.Rom == 0);
+    ASSERT(Pfn1->u3.e1.RemovalRequested == 0);
+    ASSERT(Pfn1->u4.InPageError == 0);
+    
+    /* Use the zero list */
+    ListHead = &MmZeroedPageListHead;
+    ListHead->Total++;
+
+    /* Get the back link */
+    OldBlink = ListHead->Blink;
+    if (OldBlink != LIST_HEAD)
+    {
+        /* Set the back pointer to point to us now */
+        MiGetPfnEntry(OldBlink)->u1.Flink = EntryIndex;
+    }
+    else
+    {
+        /* Set the list to point to us */
+        ListHead->Flink = EntryIndex;
+    }
+    
+    /* Set the entry to point to the list head forwards, and the old page backwards */
+    Pfn1->u1.Flink = LIST_HEAD;
+    Pfn1->u2.Blink = OldBlink;
+    
+    /* And now the head points back to us, since we are last */
+    ListHead->Blink = EntryIndex;
+    
+    /* Update the page location */
+    Pfn1->u3.e1.PageLocation = ZeroedPageList;
+
+    /* FIXME: NOT YET Due to caller semantics: Update the available page count */
+    //MmAvailablePages++;
+
+    /* Check if we've reached the configured low memory threshold */
+    if (MmAvailablePages == MmLowMemoryThreshold)
+    {
+        /* Clear the event, because now we're ABOVE the threshold */
+        KeClearEvent(MiLowMemoryEvent);
+    }
+    else if (MmAvailablePages == MmHighMemoryThreshold)
+    {
+        /* Otherwise check if we reached the high threshold and signal the event */
+        KeSetEvent(MiHighMemoryEvent, 0, FALSE);
+    }
+#if 0
+    /* Get the page color */
+    Color = EntryIndex & MmSecondaryColorMask;
+
+    /* Get the first page on the color list */
+    ColorHead = &MmFreePagesByColor[ZeroedPageList][Color];
+    if (ColorHead->Flink == LIST_HEAD)
+    {
+        /* The list is empty, so we are the first page */
+        Pfn1->u4.PteFrame = -1;
+        ColorHead->Flink = EntryIndex;
+    }
+    else
+    {
+        /* Get the previous page */
+        Blink = (PMMPFN)ColorHead->Blink;
+        
+        /* Make it link to us */
+        Pfn1->u4.PteFrame = MiGetPfnEntryIndex(Blink);
+        Blink->OriginalPte.u.Long = EntryIndex;
+    }
+    
+    /* Now initialize our own list pointers */
+    ColorHead->Blink = Pfn1;
+    Pfn1->OriginalPte.u.Long = LIST_HEAD;
+    
+    /* And increase the count in the colored list */
+    ColorHead->Count++;
+#endif
+}
+
+VOID
+NTAPI
+MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry)
+{
+    PFN_NUMBER OldFlink, OldBlink;
+    PMMPFNLIST ListHead;
+    MMLISTS ListName;
+    
+    /* Make sure the PFN lock is held */
+    ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+    
+    /* Make sure the PFN entry isn't in-use */
+    ASSERT(Entry->u3.e1.WriteInProgress == 0);
+    ASSERT(Entry->u3.e1.ReadInProgress == 0);
+    
+    /* Find the list for this entry, make sure it's the free or zero list */
+    ListHead = MmPageLocationList[Entry->u3.e1.PageLocation];
+    ListName = ListHead->ListName;
+    ASSERT(ListHead != NULL);
+    ASSERT(ListName <= FreePageList);
+    
+    /* Remove one count */
+    ASSERT(ListHead->Total != 0);
+    ListHead->Total--;
+    
+    /* Get the forward and back pointers */
+    OldFlink = Entry->u1.Flink;
+    OldBlink = Entry->u2.Blink;
+    
+    /* Check if the next entry is the list head */
+    if (OldFlink != LIST_HEAD)
+    {
+        /* It is not, so set the backlink of the actual entry, to our backlink */
+        MiGetPfnEntry(OldFlink)->u2.Blink = OldBlink;
+    }
+    else
+    {
+        /* Set the list head's backlink instead */
+        ListHead->Blink = OldFlink;
+    }
+    
+    /* Check if the back entry is the list head */
+    if (OldBlink != LIST_HEAD)
+    {
+        /* It is not, so set the backlink of the actual entry, to our backlink */
+        MiGetPfnEntry(OldBlink)->u1.Flink = OldFlink;
+    }
+    else
+    {
+        /* Set the list head's backlink instead */
+        ListHead->Flink = OldFlink;
+    }
+    
+    /* We are not on a list anymore */
+    Entry->u1.Flink = Entry->u2.Blink = 0;
+    
+    /* FIXME: Deal with color list */
+    
+    /* See if we hit any thresholds */
+    if (MmAvailablePages == MmHighMemoryThreshold)
+    {
+        /* Clear the high memory event */
+        KeClearEvent(MiHighMemoryEvent);
+    }
+    else if (MmAvailablePages == MmLowMemoryThreshold)
+    {
+        /* Signal the low memory event */
+        KeSetEvent(MiLowMemoryEvent, 0, FALSE);
+    }
+    
+    /* One less page */
+    if (--MmAvailablePages < MmMinimumFreePages)
+    {
+        /* FIXME: Should wake up the MPW and working set manager, if we had one */
+    }
+}
+
+PMMPFN
+NTAPI
+MiRemoveHeadList(IN PMMPFNLIST ListHead)
+{
+    PFN_NUMBER Entry, Flink;
+    PMMPFN Pfn1;
+    
+    /* Get the entry that's currently first on the list */
+    Entry = ListHead->Flink;
+    Pfn1 = MiGetPfnEntry(Entry);
+    
+    /* Make the list point to the entry following the first one */
+    Flink = Pfn1->u1.Flink;
+    ListHead->Flink = Flink;
+
+    /* Check if the next entry is actually the list head */
+    if (ListHead->Flink != LIST_HEAD)
+    {
+        /* It isn't, so therefore whoever is coming next points back to the head */
+        MiGetPfnEntry(Flink)->u2.Blink = LIST_HEAD;
+    }
+    else
+    {
+        /* Then the list is empty, so the backlink should point back to us */
+        ListHead->Blink = LIST_HEAD;
+    }
+  
+    /* We are not on a list anymore */
+    Pfn1->u1.Flink = Pfn1->u2.Blink = 0;
+    ListHead->Total--;
+    
+    /* Return the head element */
+    return Pfn1;
+}
+
+VOID
+NTAPI
+MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex)
+{
+    PMMPFNLIST ListHead;
+    PFN_NUMBER LastPage;
+    PMMPFN Pfn1, Blink;
+    ULONG Color;
+    PMMCOLOR_TABLES ColorHead;
+
+    /* Make sure the page index is valid */
+    ASSERT((PageFrameIndex != 0) &&
+           (PageFrameIndex <= MmHighestPhysicalPage) &&
+           (PageFrameIndex >= MmLowestPhysicalPage));
+
+    /* Get the PFN entry */
+    Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex);
+
+    /* Sanity checks that a right kind of page is being inserted here */
+    ASSERT(Pfn1->u4.MustBeCached == 0);
+    ASSERT(Pfn1->u3.e1.Rom != 1);
+    ASSERT(Pfn1->u3.e1.RemovalRequested == 0);
+    ASSERT(Pfn1->u4.VerifierAllocation == 0);
+    ASSERT(Pfn1->u3.e2.ReferenceCount == 0);
+
+    /* Get the free page list and increment its count */
+    ListHead = &MmFreePageListHead;
+    ListHead->Total++;
+
+    /* Get the last page on the list */
+    LastPage = ListHead->Blink;
+    if (LastPage != LIST_HEAD)
+    {
+        /* Link us with the previous page, so we're at the end now */
+        MI_PFN_TO_PFNENTRY(LastPage)->u1.Flink = PageFrameIndex;
+    }
+    else
+    {
+        /* The list is empty, so we are the first page */
+        ListHead->Flink = PageFrameIndex;
+    }
+
+    /* Now make the list head point back to us (since we go at the end) */
+    ListHead->Blink = PageFrameIndex;
+    
+    /* And initialize our own list pointers */
+    Pfn1->u1.Flink = LIST_HEAD;
+    Pfn1->u2.Blink = LastPage;
+
+    /* Set the list name and default priority */
+    Pfn1->u3.e1.PageLocation = FreePageList;
+    Pfn1->u4.Priority = 3;
+    
+    /* Clear some status fields */
+    Pfn1->u4.InPageError = 0;
+    Pfn1->u4.AweAllocation = 0;
+
+    /* Not yet until we switch to this */
+    //MmAvailablePages++;
+
+    /* Check if we've reached the configured low memory threshold */
+    if (MmAvailablePages == MmLowMemoryThreshold)
+    {
+        /* Clear the event, because now we're ABOVE the threshold */
+        KeClearEvent(MiLowMemoryEvent);
+    }
+    else if (MmAvailablePages == MmHighMemoryThreshold)
+    {
+        /* Otherwise check if we reached the high threshold and signal the event */
+        KeSetEvent(MiHighMemoryEvent, 0, FALSE);
+    }
+
+    /* Get the page color */
+    Color = PageFrameIndex & MmSecondaryColorMask;
+
+    /* Get the first page on the color list */
+    ColorHead = &MmFreePagesByColor[FreePageList][Color];
+    if (ColorHead->Flink == LIST_HEAD)
+    {
+        /* The list is empty, so we are the first page */
+        Pfn1->u4.PteFrame = -1;
+        ColorHead->Flink = PageFrameIndex;
+    }
+    else
+    {
+        /* Get the previous page */
+        Blink = (PMMPFN)ColorHead->Blink;
+        
+        /* Make it link to us */
+        Pfn1->u4.PteFrame = MI_PFNENTRY_TO_PFN(Blink);
+        Blink->OriginalPte.u.Long = PageFrameIndex;
+    }
+    
+    /* Now initialize our own list pointers */
+    ColorHead->Blink = Pfn1;
+    Pfn1->OriginalPte.u.Long = LIST_HEAD;
+    
+    /* And increase the count in the colored list */
+    ColorHead->Count++;
+    
+    /* FIXME: Notify zero page thread if enough pages are on the free list now */
+}
+
+/* EOF */
index bfb75df..bd2f826 100644 (file)
@@ -31,7 +31,97 @@ ULONG MmSpecialPoolTag;
 
 VOID
 NTAPI
-MiInitializeArmPool(VOID)
+MiInitializeNonPagedPoolThresholds(VOID)
+{
+    PFN_NUMBER Size = MmMaximumNonPagedPoolInPages;
+
+    /* Default low threshold of 8MB or one third of nonpaged pool */
+    MiLowNonPagedPoolThreshold = (8 * _1MB) >> PAGE_SHIFT;
+    MiLowNonPagedPoolThreshold = min(MiLowNonPagedPoolThreshold, Size / 3);
+
+    /* Default high threshold of 20MB or 50% */
+    MiHighNonPagedPoolThreshold = (20 * _1MB) >> PAGE_SHIFT;
+    MiHighNonPagedPoolThreshold = min(MiHighNonPagedPoolThreshold, Size / 2);
+    ASSERT(MiLowNonPagedPoolThreshold < MiHighNonPagedPoolThreshold);
+}
+
+VOID
+NTAPI
+MiInitializePoolEvents(VOID)
+{
+    KIRQL OldIrql;
+    PFN_NUMBER FreePoolInPages;
+
+    /* Lock paged pool */
+    KeAcquireGuardedMutex(&MmPagedPoolMutex);
+
+    /* Total size of the paged pool minus the allocated size, is free */
+    FreePoolInPages = MmSizeOfPagedPoolInPages - MmPagedPoolInfo.AllocatedPagedPool;
+
+    /* Check the initial state high state */
+    if (FreePoolInPages >= MiHighPagedPoolThreshold)
+    {
+        /* We have plenty of pool */
+        KeSetEvent(MiHighPagedPoolEvent, 0, FALSE);
+    }
+    else
+    {
+        /* We don't */
+        KeClearEvent(MiHighPagedPoolEvent);
+    }
+
+    /* Check the initial low state */
+    if (FreePoolInPages <= MiLowPagedPoolThreshold)
+    {
+        /* We're very low in free pool memory */
+        KeSetEvent(MiLowPagedPoolEvent, 0, FALSE);
+    }
+    else
+    {
+        /* We're not */
+        KeClearEvent(MiLowPagedPoolEvent);
+    }
+
+    /* Release the paged pool lock */
+    KeReleaseGuardedMutex(&MmPagedPoolMutex);
+
+    /* Now it's time for the nonpaged pool lock */
+    OldIrql = KeAcquireQueuedSpinLock(LockQueueMmNonPagedPoolLock);
+
+    /* Free pages are the maximum minus what's been allocated */
+    FreePoolInPages = MmMaximumNonPagedPoolInPages - MmAllocatedNonPagedPool;
+
+    /* Check if we have plenty */
+    if (FreePoolInPages >= MiHighNonPagedPoolThreshold)
+    {
+        /* We do, set the event */
+        KeSetEvent(MiHighNonPagedPoolEvent, 0, FALSE);
+    }
+    else
+    {
+        /* We don't, clear the event */
+        KeClearEvent(MiHighNonPagedPoolEvent);
+    }
+
+    /* Check if we have very little */
+    if (FreePoolInPages <= MiLowNonPagedPoolThreshold)
+    {
+        /* We do, set the event */
+        KeSetEvent(MiLowNonPagedPoolEvent, 0, FALSE);
+    }
+    else
+    {
+        /* We don't, clear it */
+        KeClearEvent(MiLowNonPagedPoolEvent);
+    }
+
+    /* We're done, release the nonpaged pool lock */
+    KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql);
+}
+
+VOID
+NTAPI
+MiInitializeNonPagedPool(VOID)
 {
     ULONG i;
     PFN_NUMBER PoolPages;
@@ -213,7 +303,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
             //
             // Get the template PTE we'll use to expand
             //
-            TempPte = HyperTemplatePte;
+            TempPte = ValidKernelPte;
             
             //
             // Get the first PTE in expansion space
@@ -236,7 +326,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
                 //
                 // Request a paged pool page and write the PFN for it
                 //
-                PageFrameNumber = MmAllocPage(MC_PPOOL, 0);
+                PageFrameNumber = MmAllocPage(MC_PPOOL);
                 TempPte.u.Hard.PageFrameNumber = PageFrameNumber;
                 
                 //
@@ -493,13 +583,13 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
     //
     // Loop the pages
     //
-    TempPte = HyperTemplatePte;
+    TempPte = ValidKernelPte;
     do
     {
         //
         // Allocate a page
         //
-        PageFrameNumber = MmAllocPage(MC_NPPOOL, 0);
+        PageFrameNumber = MmAllocPage(MC_NPPOOL);
         
         //
         // Get the PFN entry for it
index c7ddc2b..24bd11a 100644 (file)
@@ -134,7 +134,7 @@ MmCreateKernelStack(IN BOOLEAN GuiStack,
     //
     // Setup the template stack PTE
     //
-    TempPte = HyperTemplatePte;
+    TempPte = ValidKernelPte;
     MI_MAKE_LOCAL_PAGE(&TempPte);
     MI_MAKE_DIRTY_PAGE(&TempPte);
     TempPte.u.Hard.PageFrameNumber = 0;
@@ -158,7 +158,7 @@ MmCreateKernelStack(IN BOOLEAN GuiStack,
         //
         // Get a page
         //
-        PageFrameIndex = MmAllocPage(MC_NPPOOL, 0);
+        PageFrameIndex = MmAllocPage(MC_NPPOOL);
         TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
         
         //
@@ -234,7 +234,7 @@ MmGrowKernelStackEx(IN PVOID StackPointer,
     //
     // Setup the template stack PTE
     //
-    TempPte = HyperTemplatePte;
+    TempPte = ValidKernelPte;
     MI_MAKE_LOCAL_PAGE(&TempPte);
     MI_MAKE_DIRTY_PAGE(&TempPte);
     TempPte.u.Hard.PageFrameNumber = 0;
@@ -257,7 +257,7 @@ MmGrowKernelStackEx(IN PVOID StackPointer,
         //
         // Get a page
         //
-        PageFrameIndex = MmAllocPage(MC_NPPOOL, 0);
+        PageFrameIndex = MmAllocPage(MC_NPPOOL);
         TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
         
         //
index 0ffb2ee..5645352 100644 (file)
@@ -258,7 +258,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace,
    PMM_REGION Region;
    PMM_PAGEOP PageOp;
    PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
-   KIRQL OldIrql;
     
    /*
     * There is a window between taking the page fault and locking the
@@ -267,12 +266,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace,
     */
    if (MmIsPagePresent(NULL, Address))
    {
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(MmGetPfnForProcess(NULL, Address));
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
       return(STATUS_SUCCESS);
    }
 
@@ -363,12 +356,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace,
          return(Status);
       }
       MmLockAddressSpace(AddressSpace);
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(MmGetPfnForProcess(NULL, Address));
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
       KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);
       MmReleasePageOp(PageOp);
       return(STATUS_SUCCESS);
@@ -440,12 +427,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace,
    /*
     * Finish the operation
     */
-   if (Locked)
-   {
-      OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-      MmLockPage(Page);
-      KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-   }
    PageOp->Status = STATUS_SUCCESS;
    KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);
    MmReleasePageOp(PageOp);
diff --git a/reactos/ntoskrnl/mm/arm/page.c b/reactos/ntoskrnl/mm/arm/page.c
new file mode 100644 (file)
index 0000000..27761ec
--- /dev/null
@@ -0,0 +1,291 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            ntoskrnl/mm/arm/page.c
+ * PURPOSE:         Old-school Page Management
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
+ULONG MmGlobalKernelPageDirectory[4096];
+MMPDE HyperTemplatePde;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+VOID
+NTAPI
+MiFlushTlb(IN PMMPTE PointerPte,
+           IN PVOID Address)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+BOOLEAN
+NTAPI
+MmCreateProcessAddressSpace(IN ULONG MinWs,
+                            IN PEPROCESS Process,
+                            IN PULONG DirectoryTableBase)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return FALSE;
+}
+
+VOID
+NTAPI
+MmUpdatePageDir(IN PEPROCESS Process,
+                IN PVOID Address,
+                IN ULONG Size)
+{
+    /* Nothing to do */
+    return;
+}
+
+NTSTATUS
+NTAPI
+Mmi386ReleaseMmInfo(IN PEPROCESS Process)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+NTSTATUS
+NTAPI
+MmInitializeHandBuiltProcess(IN PEPROCESS Process,
+                             IN PULONG DirectoryTableBase)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return STATUS_SUCCESS;
+}
+
+PULONG
+NTAPI
+MmGetPageDirectory(VOID)
+{
+    /* Return the TTB */
+    return (PULONG)KeArmTranslationTableRegisterGet().AsUlong;
+}
+
+VOID
+NTAPI
+MmDisableVirtualMapping(IN PEPROCESS Process,
+                        IN PVOID Address,
+                        OUT PBOOLEAN WasDirty,
+                        OUT PPFN_TYPE Page)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+NTAPI
+MmEnableVirtualMapping(IN PEPROCESS Process,
+                       IN PVOID Address)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+NTSTATUS
+NTAPI
+MmCreateVirtualMappingUnsafe(IN PEPROCESS Process,
+                             IN PVOID Address,
+                             IN ULONG Protection,
+                             IN PPFN_TYPE Pages,
+                             IN ULONG PageCount)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+MmCreateVirtualMapping(IN PEPROCESS Process,
+                       IN PVOID Address,
+                       IN ULONG Protection,
+                       IN PPFN_TYPE Pages,
+                       IN ULONG PageCount)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return STATUS_SUCCESS;
+}
+
+VOID
+NTAPI
+MmRawDeleteVirtualMapping(IN PVOID Address)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+NTAPI
+MmDeleteVirtualMapping(IN PEPROCESS Process,
+                       IN PVOID Address,
+                       IN BOOLEAN FreePage,
+                       OUT PBOOLEAN WasDirty,
+                       OUT PPFN_TYPE Page)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+NTAPI
+MmDeletePageFileMapping(IN PEPROCESS Process,
+                        IN PVOID Address,
+                        IN SWAPENTRY *SwapEntry)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+NTSTATUS
+NTAPI
+MmCreatePageFileMapping(IN PEPROCESS Process,
+                        IN PVOID Address,
+                        IN SWAPENTRY SwapEntry)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+PFN_TYPE
+NTAPI
+MmGetPfnForProcess(IN PEPROCESS Process,
+                   IN PVOID Address)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+BOOLEAN
+NTAPI
+MmIsDirtyPage(IN PEPROCESS Process,
+              IN PVOID Address)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return 0;
+}
+
+VOID
+NTAPI
+MmSetCleanPage(IN PEPROCESS Process,
+               IN PVOID Address)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+VOID
+NTAPI
+MmSetDirtyPage(IN PEPROCESS Process,
+               IN PVOID Address)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+}
+
+BOOLEAN
+NTAPI
+MmIsPagePresent(IN PEPROCESS Process,
+                IN PVOID Address)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return FALSE;
+}
+
+BOOLEAN
+NTAPI
+MmIsPageSwapEntry(IN PEPROCESS Process,
+                  IN PVOID Address)
+{
+    UNIMPLEMENTED;
+    while (TRUE);
+    return FALSE;
+}
+
+ULONG
+NTAPI
+MmGetPageProtect(IN PEPROCESS Process,
+                 IN PVOID Address)
+{
+    /* We don't enforce any protection on the pages -- they are all RWX */
+    return PAGE_READWRITE;
+}
+
+VOID
+NTAPI
+MmSetPageProtect(IN PEPROCESS Process,
+                 IN PVOID Address,
+                 IN ULONG Protection)
+{
+    /* We don't enforce any protection on the pages -- they are all RWX */
+    return;
+}
+
+VOID
+NTAPI
+MmInitGlobalKernelPageDirectory(VOID)
+{
+    ULONG i;
+    PULONG CurrentPageDirectory = (PULONG)PDE_BASE;
+    extern MMPTE HyperTemplatePte;
+    
+    /* Setup PTE template */
+    HyperTemplatePte.u.Long = 0;
+    HyperTemplatePte.u.Hard.Valid = 1;
+    HyperTemplatePte.u.Hard.Access = 1;
+
+    /* Setup PDE template */
+    HyperTemplatePde.u.Long = 0;
+    HyperTemplatePde.u.Hard.Valid = 1;
+        
+    /* Loop the 2GB of address space which belong to the kernel */
+    for (i = MiGetPdeOffset(MmSystemRangeStart); i < 2048; i++)
+    {
+        /* Check if we have an entry for this already */
+        if ((i != MiGetPdeOffset(PTE_BASE)) &&
+            (i != MiGetPdeOffset(HYPER_SPACE)) &&
+            (!MmGlobalKernelPageDirectory[i]) &&
+            (CurrentPageDirectory[i]))
+        {
+            /* We don't, link it in our global page directory */
+            MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i];
+        }
+    }
+}
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+/*
+ * @implemented
+ */
+PHYSICAL_ADDRESS
+NTAPI
+MmGetPhysicalAddress(IN PVOID Address)
+{
+    PHYSICAL_ADDRESS PhysicalAddress;
+    PhysicalAddress.QuadPart = 0;
+
+    UNIMPLEMENTED;
+    while (TRUE);
+
+    return PhysicalAddress;
+}
index 853af29..d786f76 100644 (file)
@@ -120,6 +120,7 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page)
       if (IsListEmpty(&AllocationListHead) || MmAvailablePages < MiMinimumAvailablePages)
       {
          KeReleaseSpinLock(&AllocationListLock, OldIrql);
+         if(Consumer == MC_USER) MmRemoveLRUUserPage(Page);
          OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
          MmDereferencePage(Page);
          KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
@@ -188,11 +189,6 @@ MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
             Target--;
             (*NrFreedPages)++;
         }
-        else if (Status == STATUS_PAGEFILE_QUOTA)
-        {
-            MmRemoveLRUUserPage(CurrentPage);
-            MmInsertLRULastUserPage(CurrentPage);
-        }
         
         CurrentPage = NextPage;
     }
@@ -232,6 +228,8 @@ MiIsBalancerThread(VOID)
           PsGetCurrentThread() == MiBalancerThreadId.UniqueThread;
 }
 
+VOID NTAPI MiSetConsumer(IN PFN_TYPE Pfn, IN ULONG Consumer);
+
 NTSTATUS
 NTAPI
 MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
@@ -262,7 +260,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
    if ((Consumer == MC_NPPOOL) || (Consumer == MC_SYSTEM) || MiIsBalancerThread())
    {
       OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-      Page = MmAllocPage(Consumer, 0);
+      Page = MmAllocPage(Consumer);
       KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
       if (Page == 0)
       {
@@ -316,8 +314,8 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
       {
          KeBugCheck(NO_PAGES_AVAILABLE);
       }
-      /* Update the Consumer */
-      MiGetPfnEntry(Page)->u3.e1.PageLocation = Consumer;
+      /* Update the Consumer and make the page active */
+      MiSetConsumer(Page, Consumer);
       if(Consumer == MC_USER) MmInsertLRULastUserPage(Page);
       *AllocatedPage = Page;
       (void)InterlockedDecrementUL(&MiPagesRequired);
@@ -328,7 +326,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
     * Actually allocate the page.
     */
    OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-   Page = MmAllocPage(Consumer, 0);
+   Page = MmAllocPage(Consumer);
    KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
    if (Page == 0)
    {
index 894fb23..0221fc7 100644 (file)
 #define MODULE_INVOLVED_IN_ARM3
 #include "ARM3/miarm.h"
 
-/* TYPES *******************************************************************/
-
-#define MM_PHYSICAL_PAGE_FREE    (0x1)
-#define MM_PHYSICAL_PAGE_USED    (0x2)
-
 /* GLOBALS ****************************************************************/
 
 //
 //
 // ReactOS to NT Physical Page Descriptor Entry Legacy Mapping Definitions
 //
+//        REACTOS                 NT
+//
+#define RmapListHead         AweReferenceCount
+#define PHYSICAL_PAGE        MMPFN
+#define PPHYSICAL_PAGE       PMMPFN
 
-typedef union
-{
-    MMPFN Pfn;
+/* The first array contains ReactOS PFNs, the second contains ARM3 PFNs */
+PPHYSICAL_PAGE MmPfnDatabase[2];
 
     struct
     {
@@ -81,97 +80,94 @@ SIZE_T MmSharedCommit;
 SIZE_T MmDriverCommit;
 SIZE_T MmProcessCommit;
 SIZE_T MmPagedPoolCommit;
-SIZE_T MmPeakCommitment;
+SIZE_T MmPeakCommitment; 
 SIZE_T MmtotalCommitLimitMaximum;
 
-MMPFNLIST MmZeroedPageListHead;
-MMPFNLIST MmFreePageListHead;
-MMPFNLIST MmStandbyPageListHead;
-MMPFNLIST MmModifiedPageListHead;
-MMPFNLIST MmModifiedNoWritePageListHead;
-
-/* List of pages allocated to the MC_USER Consumer */
-static LIST_ENTRY UserPageListHead;
-/* List of pages zeroed by the ZPW (MmZeroPageThreadMain) */
-static LIST_ENTRY FreeZeroedPageListHead;
-/* List of free pages, filled by MmGetReferenceCountPage and
- * and MmInitializePageList */
-static LIST_ENTRY FreeUnzeroedPageListHead;
-
 static KEVENT ZeroPageThreadEvent;
 static BOOLEAN ZeroPageThreadShouldTerminate = FALSE;
-
-static ULONG UnzeroedPageCount = 0;
+static RTL_BITMAP MiUserPfnBitMap;
 
 /* FUNCTIONS *************************************************************/
 
-PFN_NUMBER
+VOID
 NTAPI
-MmGetLRUFirstUserPage(VOID)
+MiInitializeUserPfnBitmap(VOID)
 {
-   PLIST_ENTRY NextListEntry;
-   PHYSICAL_PAGE* PageDescriptor;
-   KIRQL oldIrql;
+    PVOID Bitmap;
+    
+    /* Allocate enough buffer for the PFN bitmap and align it on 32-bits */
+    Bitmap = ExAllocatePoolWithTag(NonPagedPool,
+                                   (((MmHighestPhysicalPage + 1) + 31) / 32) * 4,
+                                   '  mM');
+    ASSERT(Bitmap);
+
+    /* Initialize it and clear all the bits to begin with */
+    RtlInitializeBitMap(&MiUserPfnBitMap,
+                        Bitmap,
+                        MmHighestPhysicalPage + 1);
+    RtlClearAllBits(&MiUserPfnBitMap);
+}
 
-   oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-   NextListEntry = UserPageListHead.Flink;
-   if (NextListEntry == &UserPageListHead)
-   {
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-      return 0;
-   }
-   PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry);
-   ASSERT_PFN(&PageDescriptor->Pfn);
-   KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-   return PageDescriptor - MmPfnDatabase;
+PFN_TYPE
+NTAPI
+MmGetLRUFirstUserPage(VOID)
+{
+    ULONG Position;
+    KIRQL OldIrql;
+    
+    /* Find the first user page */
+    OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+    Position = RtlFindSetBits(&MiUserPfnBitMap, 1, 0);
+    KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+    if (Position == 0xFFFFFFFF) return 0;
+    
+    /* Return it */
+    return Position;
 }
 
 VOID
 NTAPI
 MmInsertLRULastUserPage(PFN_NUMBER Pfn)
 {
-   KIRQL oldIrql;
-   PPHYSICAL_PAGE Page;
+    KIRQL OldIrql;
 
-   oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-   Page = MiGetPfnEntry(Pfn);
-   ASSERT(Page);
-   ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED);
-   ASSERT(Page->Flags.Consumer == MC_USER);
-   InsertTailList(&UserPageListHead, &Page->ListEntry);
-   KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
+    /* Set the page as a user page */
+    OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+    RtlSetBit(&MiUserPfnBitMap, Pfn);
+    KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
 }
 
 PFN_NUMBER
 NTAPI
 MmGetLRUNextUserPage(PFN_NUMBER PreviousPfn)
 {
-   PLIST_ENTRY NextListEntry;
-   PHYSICAL_PAGE* PageDescriptor;
-   KIRQL oldIrql;
-   PPHYSICAL_PAGE Page;
-
-   oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-   Page = MiGetPfnEntry(PreviousPfn);
-   ASSERT(Page);
-   ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED);
-   ASSERT(Page->Flags.Consumer == MC_USER);
-   NextListEntry = (PLIST_ENTRY)Page->ListEntry.Flink;
-   if (NextListEntry == &UserPageListHead)
-   {
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-      return 0;
-   }
-   PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry);
-   KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-   return PageDescriptor - MmPfnDatabase;
+    ULONG Position;
+    KIRQL OldIrql;
+    
+    /* Find the next user page */
+    OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
+    Position = RtlFindSetBits(&MiUserPfnBitMap, 1, PreviousPfn + 1);
+    KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
+    if (Position == 0xFFFFFFFF) return 0;
+    
+    /* Return it */
+    return Position;
 }
 
 VOID
 NTAPI
 MmRemoveLRUUserPage(PFN_NUMBER Page)
 {
-   RemoveEntryList(&MiGetPfnEntry(Page)->ListEntry);
+    /* Unset the page as a user page */
+    RtlClearBit(&MiUserPfnBitMap, Page);
+}
+
+BOOLEAN
+NTAPI
+MiIsPfnInUse(IN PMMPFN Pfn1)
+{
+    return ((Pfn1->u3.e1.PageLocation != FreePageList) &&
+            (Pfn1->u3.e1.PageLocation != ZeroedPageList));
 }
 
 PFN_NUMBER
@@ -230,7 +226,7 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn,
             //
             // If this PFN is in use, ignore it
             //
-            if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) continue;
+            if (MiIsPfnInUse(Pfn1)) continue;
             
             //
             // If we haven't chosen a start PFN yet and the caller specified an
@@ -265,7 +261,7 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn,
                     //
                     // Things might've changed for us. Is the page still free?
                     //
-                    if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) break;
+                    if (MiIsPfnInUse(Pfn1)) break;
                     
                     //
                     // So far so good. Is this the last confirmed valid page?
@@ -283,36 +279,27 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn,
                         EndPfn = Pfn1 - SizeInPages + 1;
                         do
                         {
-                            //
-                            // If this was an unzeroed page, there are now less
-                            //
-                            if (Pfn1->Flags.Zero == 0) UnzeroedPageCount--;
-                            
-                            //
-                            // One less free page
-                            //
-                            MmAvailablePages--;
-                            
                             //
                             // This PFN is now a used page, set it up
                             //
-                            RemoveEntryList(&Pfn1->ListEntry);
-                            Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED;
-                            Pfn1->Flags.Consumer = MC_NPPOOL;
-                            Pfn1->ReferenceCount = 1;
-                            Pfn1->LockCount = 0;
-                            Pfn1->SavedSwapEntry = 0;
+                            MiUnlinkFreeOrZeroedPage(Pfn1);
+                            Pfn1->u3.e2.ReferenceCount = 1;
                             
                             //
                             // Check if it was already zeroed
                             //
-                            if (Pfn1->Flags.Zero == 0)
+                            if (Pfn1->u3.e1.PageLocation != ZeroedPageList)
                             {
                                 //
                                 // It wasn't, so zero it
                                 //
                                 MiZeroPage(MiGetPfnEntryIndex(Pfn1));
                             }
+                            
+                            //
+                            // Mark it in use
+                            //
+                            Pfn1->u3.e1.PageLocation = ActiveAndValid;
 
                             //
                             // Check if this is the last PFN, otherwise go on
@@ -324,8 +311,8 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn,
                         //
                         // Mark the first and last PFN so we can find them later
                         //
-                        Pfn1->Flags.StartOfAllocation = 1;
-                        (Pfn1 + SizeInPages - 1)->Flags.EndOfAllocation = 1;
+                        Pfn1->u3.e1.StartOfAllocation = 1;
+                        (Pfn1 + SizeInPages - 1)->u3.e1.EndOfAllocation = 1;
                         
                         //
                         // Now it's safe to let go of the PFN lock
@@ -384,7 +371,6 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress,
     PFN_NUMBER PageCount, LowPage, HighPage, SkipPages, PagesFound = 0, Page;
     PPFN_NUMBER MdlPage, LastMdlPage;
     KIRQL OldIrql;
-    PLIST_ENTRY ListEntry;
     PPHYSICAL_PAGE Pfn1;
     INT LookForZeroedPages;
     ASSERT (KeGetCurrentIrql() <= APC_LEVEL);
@@ -455,20 +441,19 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress,
             //
             // Do we have zeroed pages?
             //
-            if (!IsListEmpty(&FreeZeroedPageListHead))
+            if (MmZeroedPageListHead.Total)
             {
                 //
                 // Grab a zero page
                 //
-                ListEntry = RemoveTailList(&FreeZeroedPageListHead);
+                Pfn1 = MiRemoveHeadList(&MmZeroedPageListHead);
             }
-            else if (!IsListEmpty(&FreeUnzeroedPageListHead))
+            else if (MmFreePageListHead.Total)
             {
                 //
                 // Nope, grab an unzeroed page
                 //
-                ListEntry = RemoveTailList(&FreeUnzeroedPageListHead);
-                UnzeroedPageCount--;
+                Pfn1 = MiRemoveHeadList(&MmFreePageListHead);
             }
             else
             {
@@ -479,27 +464,18 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress,
                 break;
             }
             
-            //
-            // Get the PFN entry for this page
-            //
-            Pfn1 = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry);
-            
             //
             // Make sure it's really free
             //
-            ASSERT(Pfn1->Flags.Type == MM_PHYSICAL_PAGE_FREE);
-            ASSERT(Pfn1->ReferenceCount == 0);
+            ASSERT(MiIsPfnInUse(Pfn1) == FALSE);
+            ASSERT(Pfn1->u3.e2.ReferenceCount == 0);
             
             //
             // Allocate it and mark it
             //
-            Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED;
-            Pfn1->Flags.Consumer = MC_NPPOOL;
-            Pfn1->Flags.StartOfAllocation = 1;
-            Pfn1->Flags.EndOfAllocation = 1;
-            Pfn1->ReferenceCount = 1;
-            Pfn1->LockCount = 0;
-            Pfn1->SavedSwapEntry = 0;
+            Pfn1->u3.e1.StartOfAllocation = 1;
+            Pfn1->u3.e1.EndOfAllocation = 1;
+            Pfn1->u3.e2.ReferenceCount = 1;
             
             //
             // Decrease available pages
@@ -534,30 +510,21 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress,
                 //
                 // Make sure it's free and if this is our first pass, zeroed
                 //
-                if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) continue;
-                if (Pfn1->Flags.Zero != LookForZeroedPages) continue;
+                if (MiIsPfnInUse(Pfn1)) continue;
+                if ((Pfn1->u3.e1.PageLocation == ZeroedPageList) != LookForZeroedPages) continue;
                 
                 //
                 // Sanity checks
                 //
-                ASSERT(Pfn1->ReferenceCount == 0);
+                ASSERT(Pfn1->u3.e2.ReferenceCount == 0);
                 
                 //
                 // Now setup the page and mark it
                 //
-                Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED;
-                Pfn1->Flags.Consumer = MC_NPPOOL;
-                Pfn1->ReferenceCount = 1;
-                Pfn1->Flags.StartOfAllocation = 1;
-                Pfn1->Flags.EndOfAllocation = 1;
-                Pfn1->LockCount = 0;
-                Pfn1->SavedSwapEntry = 0;
-                
-                //
-                // If this page was unzeroed, we've consumed such a page
-                //
-                if (!Pfn1->Flags.Zero) UnzeroedPageCount--;
-                
+                Pfn1->u3.e2.ReferenceCount = 1;
+                Pfn1->u3.e1.StartOfAllocation = 1;
+                Pfn1->u3.e1.EndOfAllocation = 1;
+                                
                 //
                 // Decrease available pages
                 //
@@ -624,7 +591,8 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress,
         //
         Pfn1 = MiGetPfnEntry(Page);
         ASSERT(Pfn1);
-        if (Pfn1->Flags.Zero == 0) MiZeroPage(Page);
+        if (Pfn1->u3.e1.PageLocation != ZeroedPageList) MiZeroPage(Page);
+        Pfn1->u3.e1.PageLocation = ActiveAndValid;
     }
     
     //
@@ -641,7 +609,7 @@ MmDumpPfnDatabase(VOID)
 {
     ULONG i;
     PPHYSICAL_PAGE Pfn1;
-    PCHAR State = "????", Consumer = "Unknown";
+    PCHAR State = "????", Type = "Unknown";
     KIRQL OldIrql;
     ULONG Totals[5] = {0}, FreePages = 0;
     
@@ -656,69 +624,33 @@ MmDumpPfnDatabase(VOID)
         if (!Pfn1) continue;
         
         //
-        // Get the consumer
+        // Get the type
         //
-        switch (Pfn1->Flags.Consumer)
+        if (MiIsPfnInUse(Pfn1))
         {
-            case MC_NPPOOL:
-                
-                Consumer = "Nonpaged Pool";
-                break;
-                
-            case MC_PPOOL:
-                
-                Consumer = "Paged Pool";
-                break;
-                
-            case MC_CACHE:
-                
-                Consumer = "File System Cache";
-                break;
-                
-            case MC_USER:
-                
-                Consumer = "Process Working Set";
-                break;
-                
-            case MC_SYSTEM:
-                
-                Consumer = "System";
-                break;
+            State = "Used";
         }
-        
-        //
-        // Get the type
-        //
-        switch (Pfn1->Flags.Type)
+        else
         {
-            case MM_PHYSICAL_PAGE_USED:
-                
-                State = "Used";
-                Totals[Pfn1->Flags.Consumer]++;
-                break;
-                
-            case MM_PHYSICAL_PAGE_FREE:
-                
-                State = "Free";
-                Consumer = "Free";
-                FreePages++;
-                break;
+            State = "Free";
+            Type = "Free";
+            FreePages++;
+            break;
         }
-
+        
         //
         // Pretty-print the page
         //
-        DbgPrint("0x%08p:\t%04s\t%20s\t(%02d.%02d) [%08p])\n",
+        DbgPrint("0x%08p:\t%04s\t%20s\t(%02d) [%08p])\n",
                  i << PAGE_SHIFT,
                  State,
-                 Consumer,
-                 Pfn1->ReferenceCount,
-                 Pfn1->LockCount,
+                 Type,
+                 Pfn1->u3.e2.ReferenceCount,
                  Pfn1->RmapListHead);
     }
     
     DbgPrint("Nonpaged Pool:       %d pages\t[%d KB]\n", Totals[MC_NPPOOL], (Totals[MC_NPPOOL] << PAGE_SHIFT) / 1024);
-    DbgPrint("Paged Pool:          %d pages\t[%d KB]\n", Totals[MC_PPOOL],  (Totals[MC_PPOOL] << PAGE_SHIFT) / 1024);
+    DbgPrint("Paged Pool:          %d pages\t[%d KB]\n", Totals[MC_PPOOL],  (Totals[MC_PPOOL]  << PAGE_SHIFT) / 1024);
     DbgPrint("File System Cache:   %d pages\t[%d KB]\n", Totals[MC_CACHE],  (Totals[MC_CACHE]  << PAGE_SHIFT) / 1024);
     DbgPrint("Process Working Set: %d pages\t[%d KB]\n", Totals[MC_USER],   (Totals[MC_USER]   << PAGE_SHIFT) / 1024);
     DbgPrint("System:              %d pages\t[%d KB]\n", Totals[MC_SYSTEM], (Totals[MC_SYSTEM] << PAGE_SHIFT) / 1024);
@@ -737,16 +669,10 @@ MmInitializePageList(VOID)
     PLIST_ENTRY NextEntry;
     ULONG NrSystemPages = 0;
 
-    /* Initialize the page lists */
-    InitializeListHead(&UserPageListHead);
-    InitializeListHead(&FreeUnzeroedPageListHead);
-    InitializeListHead(&FreeZeroedPageListHead);
-
     /* This is what a used page looks like */
     RtlZeroMemory(&UsedPage, sizeof(UsedPage));
-    UsedPage.Flags.Type = MM_PHYSICAL_PAGE_USED;
-    UsedPage.Flags.Consumer = MC_NPPOOL;
-    UsedPage.ReferenceCount = 1;
+    UsedPage.u3.e1.PageLocation = ActiveAndValid;
+    UsedPage.u3.e2.ReferenceCount = 1;
 
     /* Loop the memory descriptors */
     for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink;
@@ -778,10 +704,9 @@ MmInitializePageList(VOID)
             for (i = 0; i < Md->PageCount; i++)
             {
                 /* Mark it as a free page */
-                MmPfnDatabase[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
-                InsertTailList(&FreeUnzeroedPageListHead,
-                               &MmPfnDatabase[Md->BasePage + i].ListEntry);
-                UnzeroedPageCount++;
+                MmPfnDatabase[0][Md->BasePage + i].u3.e1.PageLocation = FreePageList;
+                MiInsertInListTail(&MmFreePageListHead,
+                                   &MmPfnDatabase[0][Md->BasePage + i]);
                 MmAvailablePages++;
             }
         }
@@ -791,7 +716,7 @@ MmInitializePageList(VOID)
             for (i = 0; i < Md->PageCount; i++)
             {
                 /* Everything else is used memory */
-                MmPfnDatabase[Md->BasePage + i] = UsedPage;
+                MmPfnDatabase[0][Md->BasePage + i] = UsedPage;
                 NrSystemPages++;
             }
         }
@@ -800,11 +725,8 @@ MmInitializePageList(VOID)
     /* Finally handle the pages describing the PFN database themselves */
     for (i = MxOldFreeDescriptor.BasePage; i < MxFreeDescriptor->BasePage; i++)
     {
-        /* Ensure this page was not added previously */
-        ASSERT(MmPfnDatabase[i].Flags.Type == 0);
-
         /* Mark it as used kernel memory */
-        MmPfnDatabase[i] = UsedPage;
+        MmPfnDatabase[0][i] = UsedPage;
         NrSystemPages++;
     }
     
@@ -845,7 +767,7 @@ MmSetSavedSwapEntryPage(PFN_NUMBER Pfn,  SWAPENTRY SwapEntry)
    KIRQL oldIrql;
 
    oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-   MiGetPfnEntry(Pfn)->SavedSwapEntry = SwapEntry;
+   MiGetPfnEntry(Pfn)->u1.WsIndex = SwapEntry;
    KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
 }
 
@@ -857,7 +779,7 @@ MmGetSavedSwapEntryPage(PFN_NUMBER Pfn)
    KIRQL oldIrql;
 
    oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-   SwapEntry = MiGetPfnEntry(Pfn)->SavedSwapEntry;
+   SwapEntry = MiGetPfnEntry(Pfn)->u1.WsIndex;
    KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
 
    return(SwapEntry);
@@ -878,13 +800,8 @@ MmReferencePage(PFN_NUMBER Pfn)
 
    Page = MiGetPfnEntry(Pfn);
    ASSERT(Page);
-   if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
-   {
-      DPRINT1("Referencing non-used page\n");
-      KeBugCheck(MEMORY_MANAGEMENT);
-   }
 
-   Page->ReferenceCount++;
+   Page->u3.e2.ReferenceCount++;
 }
 
 ULONG
@@ -900,13 +817,8 @@ MmGetReferenceCountPage(PFN_NUMBER Pfn)
    oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
    Page = MiGetPfnEntry(Pfn);
    ASSERT(Page);
-   if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
-   {
-      DPRINT1("Getting reference count for free page\n");
-      KeBugCheck(MEMORY_MANAGEMENT);
-   }
 
-   RCount = Page->ReferenceCount;
+   RCount = Page->u3.e2.ReferenceCount;
 
    KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
    return(RCount);
@@ -916,10 +828,15 @@ BOOLEAN
 NTAPI
 MmIsPageInUse(PFN_NUMBER Pfn)
 {
+    return MiIsPfnInUse(MiGetPfnEntry(Pfn));
+}
 
-   DPRINT("MmIsPageInUse(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT);
-
-   return (MiGetPfnEntry(Pfn)->Flags.Type == MM_PHYSICAL_PAGE_USED);
+VOID
+NTAPI
+MiSetConsumer(IN PFN_TYPE Pfn,
+              IN ULONG Type)
+{
+    MiGetPfnEntry(Pfn)->u3.e1.PageLocation = ActiveAndValid;
 }
 
 VOID
@@ -933,134 +850,33 @@ MmDereferencePage(PFN_NUMBER Pfn)
    Page = MiGetPfnEntry(Pfn);
    ASSERT(Page);
 
-   if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
-   {
-      DPRINT1("Dereferencing free page\n");
-      KeBugCheck(MEMORY_MANAGEMENT);
-   }
-   if (Page->ReferenceCount == 0)
-   {
-      DPRINT1("Derefrencing page with reference count 0\n");
-      KeBugCheck(MEMORY_MANAGEMENT);
-   }
-
-   Page->ReferenceCount--;
-   if (Page->ReferenceCount == 0)
+   Page->u3.e2.ReferenceCount--;
+   if (Page->u3.e2.ReferenceCount == 0)
    {
       MmAvailablePages++;
-      if (Page->Flags.Consumer == MC_USER) RemoveEntryList(&Page->ListEntry);
-      if (Page->RmapListHead != (LONG_PTR)NULL)
-      {
-         DPRINT1("Freeing page with rmap entries.\n");
-         KeBugCheck(MEMORY_MANAGEMENT);
-      }
-      if (Page->LockCount > 0)
-      {
-         DPRINT1("Freeing locked page\n");
-         KeBugCheck(MEMORY_MANAGEMENT);
-      }
-      if (Page->SavedSwapEntry != 0)
-      {
-         DPRINT1("Freeing page with swap entry.\n");
-         KeBugCheck(MEMORY_MANAGEMENT);
-      }
-      if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
-      {
-         DPRINT1("Freeing page with flags %x\n",
-                  Page->Flags.Type);
-         KeBugCheck(MEMORY_MANAGEMENT);
-      }
-      Page->Flags.Type = MM_PHYSICAL_PAGE_FREE;
-      Page->Flags.Consumer = MC_MAXIMUM;
-      InsertTailList(&FreeUnzeroedPageListHead,
-                     &Page->ListEntry);
-      UnzeroedPageCount++;
-      if (UnzeroedPageCount > 8 && 0 == KeReadStateEvent(&ZeroPageThreadEvent))
+      Page->u3.e1.PageLocation = FreePageList;
+      MiInsertInListTail(&MmFreePageListHead, Page);
+      if (MmFreePageListHead.Total > 8 && 0 == KeReadStateEvent(&ZeroPageThreadEvent))
       {
          KeSetEvent(&ZeroPageThreadEvent, IO_NO_INCREMENT, FALSE);
       }
    }
 }
 
-ULONG
-NTAPI
-MmGetLockCountPage(PFN_NUMBER Pfn)
-{
-   KIRQL oldIrql;
-   ULONG CurrentLockCount;
-   PPHYSICAL_PAGE Page;
-
-   DPRINT("MmGetLockCountPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT);
-
-   oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-
-   Page = MiGetPfnEntry(Pfn);
-   ASSERT(Page);
-   if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
-   {
-      DPRINT1("Getting lock count for free page\n");
-      KeBugCheck(MEMORY_MANAGEMENT);
-   }
-
-   CurrentLockCount = Page->LockCount;
-   KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-
-   return(CurrentLockCount);
-}
-
-VOID
-NTAPI
-MmLockPage(PFN_NUMBER Pfn)
-{
-   PPHYSICAL_PAGE Page;
-
-   DPRINT("MmLockPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT);
-
-   Page = MiGetPfnEntry(Pfn);
-   ASSERT(Page);
-   if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
-   {
-      DPRINT1("Locking free page\n");
-      KeBugCheck(MEMORY_MANAGEMENT);
-   }
-
-   Page->LockCount++;
-}
-
-VOID
-NTAPI
-MmUnlockPage(PFN_NUMBER Pfn)
-{
-   PPHYSICAL_PAGE Page;
-
-   DPRINT("MmUnlockPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT);
-
-   Page = MiGetPfnEntry(Pfn);
-   ASSERT(Page);
-   if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED)
-   {
-      DPRINT1("Unlocking free page\n");
-      KeBugCheck(MEMORY_MANAGEMENT);
-   }
-
-   Page->LockCount--;
-}
-
 PFN_NUMBER
 NTAPI
-MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry)
+MmAllocPage(ULONG Type)
 {
    PFN_NUMBER PfnOffset;
-   PLIST_ENTRY ListEntry;
    PPHYSICAL_PAGE PageDescriptor;
    BOOLEAN NeedClear = FALSE;
 
    DPRINT("MmAllocPage()\n");
 
-   if (IsListEmpty(&FreeZeroedPageListHead))
+   if (MmZeroedPageListHead.Total == 0)
    {
-      if (IsListEmpty(&FreeUnzeroedPageListHead))
-      {
+       if (MmFreePageListHead.Total == 0)
+       {
          /* Check if this allocation is for the PFN DB itself */
          if (MmNumberOfPhysicalPages == 0) 
          {
@@ -1070,43 +886,26 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry)
          DPRINT1("MmAllocPage(): Out of memory\n");
          return 0;
       }
-      ListEntry = RemoveTailList(&FreeUnzeroedPageListHead);
-      UnzeroedPageCount--;
-
-      PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry);
+      PageDescriptor = MiRemoveHeadList(&MmFreePageListHead);
 
       NeedClear = TRUE;
    }
    else
    {
-      ListEntry = RemoveTailList(&FreeZeroedPageListHead);
-
-      PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry);
+      PageDescriptor = MiRemoveHeadList(&MmZeroedPageListHead);
    }
 
-   if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE)
-   {
-      DPRINT1("Got non-free page from freelist\n");
-      KeBugCheck(MEMORY_MANAGEMENT);
-   }
-   if (PageDescriptor->ReferenceCount != 0)
-   {
-      DPRINT1("%d\n", PageDescriptor->ReferenceCount);
-      KeBugCheck(MEMORY_MANAGEMENT);
-   }
-   PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED;
-   PageDescriptor->Flags.Consumer = Consumer;
-   PageDescriptor->ReferenceCount = 1;
-   PageDescriptor->LockCount = 0;
-   PageDescriptor->SavedSwapEntry = SwapEntry;
+   PageDescriptor->u3.e2.ReferenceCount = 1;
 
    MmAvailablePages--;
 
-   PfnOffset = PageDescriptor - MmPfnDatabase;
-   if ((NeedClear) && (Consumer != MC_SYSTEM))
+   PfnOffset = PageDescriptor - MmPfnDatabase[0];
+   if ((NeedClear) && (Type != MC_SYSTEM))
    {
       MiZeroPage(PfnOffset);
    }
+     
+   PageDescriptor->u3.e1.PageLocation = ActiveAndValid;
    return PfnOffset;
 }
 
@@ -1135,7 +934,6 @@ MmZeroPageThreadMain(PVOID Ignored)
 {
    NTSTATUS Status;
    KIRQL oldIrql;
-   PLIST_ENTRY ListEntry;
    PPHYSICAL_PAGE PageDescriptor;
    PFN_NUMBER Pfn;
    ULONG Count;
@@ -1154,11 +952,6 @@ MmZeroPageThreadMain(PVOID Ignored)
                                      KernelMode,
                                      FALSE,
                                      NULL);
-      if (!NT_SUCCESS(Status))
-      {
-         DPRINT1("ZeroPageThread: Wait failed\n");
-         KeBugCheck(MEMORY_MANAGEMENT);
-      }
 
       if (ZeroPageThreadShouldTerminate)
       {
@@ -1167,29 +960,24 @@ MmZeroPageThreadMain(PVOID Ignored)
       }
       Count = 0;
       oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-      while (!IsListEmpty(&FreeUnzeroedPageListHead))
+      while (MmFreePageListHead.Total)
       {
-         ListEntry = RemoveTailList(&FreeUnzeroedPageListHead);
-         UnzeroedPageCount--;
-         PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry);
+         PageDescriptor = MiRemoveHeadList(&MmFreePageListHead);
          /* We set the page to used, because MmCreateVirtualMapping failed with unused pages */
-         PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED;
          KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-         Pfn = PageDescriptor - MmPfnDatabase;
+         Pfn = PageDescriptor - MmPfnDatabase[0];
          Status = MiZeroPage(Pfn);
 
          oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         PageDescriptor->Flags.Zero = 1;
-         PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_FREE;
          if (NT_SUCCESS(Status))
          {
-            InsertHeadList(&FreeZeroedPageListHead, ListEntry);
+            MiInsertZeroListAtBack(Pfn);
             Count++;
          }
          else
          {
-            InsertHeadList(&FreeUnzeroedPageListHead, ListEntry);
-            UnzeroedPageCount++;
+            MiInsertInListTail(&MmFreePageListHead, PageDescriptor);
+            PageDescriptor->u3.e1.PageLocation = FreePageList;
          }
 
       }
index d224dbd..3392772 100644 (file)
@@ -284,10 +284,6 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
                     KeBugCheck(MEMORY_MANAGEMENT);
                 }
                 Entry = PFN_TO_PTE(Pfn) | PA_PRESENT | PA_READWRITE;
-                if (Ke386GlobalPagesEnabled)
-                {
-                    Entry |= PA_GLOBAL;
-                }
                 if(0 != InterlockedCompareExchangePte(&MmGlobalKernelPageDirectory[PdeOffset], Entry, 0))
                 {
                     MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn);
@@ -758,10 +754,6 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
     if (Address >= MmSystemRangeStart)
     {
         Attributes &= ~PA_USER;
-        if (Ke386GlobalPagesEnabled)
-        {
-            Attributes |= PA_GLOBAL;
-        }
     }
     else
     {
@@ -907,10 +899,6 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect)
     if (Address >= MmSystemRangeStart)
     {
         Attributes &= ~PA_USER;
-        if (Ke386GlobalPagesEnabled)
-        {
-            Attributes |= PA_GLOBAL;
-        }
     }
     else
     {
@@ -1000,8 +988,6 @@ MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size)
     }
 }
 
-extern MMPTE HyperTemplatePte;
-
 VOID
 INIT_FUNCTION
 NTAPI
@@ -1012,12 +998,6 @@ MmInitGlobalKernelPageDirectory(VOID)
     
     DPRINT("MmInitGlobalKernelPageDirectory()\n");
     
-    //
-    // Setup template
-    //
-    HyperTemplatePte.u.Long = (PA_PRESENT | PA_READWRITE | PA_DIRTY | PA_ACCESSED);
-    if (Ke386GlobalPagesEnabled) HyperTemplatePte.u.Long |= PA_GLOBAL;
-    
     for (i = ADDR_TO_PDE_OFFSET(MmSystemRangeStart); i < 1024; i++)
     {
         if (i != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) &&
@@ -1025,11 +1005,6 @@ MmInitGlobalKernelPageDirectory(VOID)
             0 == MmGlobalKernelPageDirectory[i] && 0 != CurrentPageDirectory[i])
         {
             MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i];
-            if (Ke386GlobalPagesEnabled)
-            {
-                MmGlobalKernelPageDirectory[i] |= PA_GLOBAL;
-                CurrentPageDirectory[i] |= PA_GLOBAL;
-            }
         }
     }
 }
index a79bf4a..4b97eab 100644 (file)
@@ -41,6 +41,7 @@ NTAPI
 MiDbgTranslatePhysicalAddress(IN ULONG64 PhysicalAddress,
                               IN ULONG Flags)
 {
+    extern MMPTE ValidKernelPte;
     PFN_NUMBER Pfn;
     MMPTE TempPte;
     PVOID MappingBaseAddress;
@@ -83,7 +84,7 @@ MiDbgTranslatePhysicalAddress(IN ULONG64 PhysicalAddress,
     //
     //
     //
-    TempPte = HyperTemplatePte;
+    TempPte = ValidKernelPte;
 
     //
     // Convert physical address to PFN
index 871d507..d8675c8 100644 (file)
@@ -305,7 +305,6 @@ MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked)
 {
    NTSTATUS Status;
    PFN_NUMBER AllocatedPage;
-   KIRQL OldIrql;
 
    Status = MmRequestPageMemoryConsumer(MC_PPOOL, FALSE, &AllocatedPage);
    if (!NT_SUCCESS(Status))
@@ -320,11 +319,5 @@ MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked)
                              PAGE_READWRITE,
                              &AllocatedPage,
                              1);
-   if (Locked)
-   {
-      OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-      MmLockPage(AllocatedPage);
-      KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-   }
    return(Status);
 }
index bba32e4..1dbcf42 100644 (file)
@@ -124,7 +124,7 @@ MiInitSystemMemoryAreas()
     //
     // Protect the PFN database
     //
-    BaseAddress = MmPfnDatabase;
+    BaseAddress = MmPfnDatabase[0];
     Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
                                 MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC,
                                 &BaseAddress,
@@ -308,8 +308,8 @@ MiDbgDumpAddressSpace(VOID)
             (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize,
             "Paged Pool");
     DPRINT1("          0x%p - 0x%p\t%s\n",
-            MmPfnDatabase,
-            (ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT),
+            MmPfnDatabase[0],
+            (ULONG_PTR)MmPfnDatabase[0] + (MxPfnAllocation << PAGE_SHIFT),
             "PFN Database");
     DPRINT1("          0x%p - 0x%p\t%s\n",
             MmNonPagedPoolStart,
@@ -365,14 +365,16 @@ MiDbgDumpMemoryDescriptors(VOID)
     DPRINT1("Total: %08lX (%d MB)\n", TotalPages, (TotalPages * PAGE_SIZE) / 1024 / 1024);
 }
 
+VOID NTAPI MiInitializeUserPfnBitmap(VOID);
+
 BOOLEAN
 NTAPI
 MmInitSystem(IN ULONG Phase,
              IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
-    extern MMPTE HyperTemplatePte;
+    extern MMPTE ValidKernelPte;
     PMMPTE PointerPte;
-    MMPTE TempPte = HyperTemplatePte;
+    MMPTE TempPte = ValidKernelPte;
     PFN_NUMBER PageFrameNumber;
     
     if (Phase == 0)
@@ -389,14 +391,6 @@ MmInitSystem(IN ULONG Phase,
         // Initialize ARM³ in phase 0
         //
         MmArmInitSystem(0, KeLoaderBlock);    
-        
-        /* Initialize the page list */
-        MmInitializePageList();
-        
-        //
-        // Initialize ARM³ in phase 1
-        //
-        MmArmInitSystem(1, KeLoaderBlock);
 
 #if defined(_WINKD_)
         //
@@ -423,27 +417,14 @@ MmInitSystem(IN ULONG Phase,
 #endif
         
         /* Initialize working sets */
+        MiInitializeUserPfnBitmap();
         MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory);
 
-        /* Initialize the user mode image list */
-        InitializeListHead(&MmLoadedUserImageList);
-
-        /* Initialize the Loader Lock */
-        KeInitializeMutant(&MmSystemLoadLock, FALSE);
-
         /* Reload boot drivers */
         MiReloadBootLoadedDrivers(LoaderBlock);
 
         /* Initialize the loaded module list */
         MiInitializeLoadedModuleList(LoaderBlock);
-
-        /* Setup shared user data settings that NT does as well */
-        ASSERT(SharedUserData->NumberOfPhysicalPages == 0);
-        SharedUserData->NumberOfPhysicalPages = MmNumberOfPhysicalPages;
-        SharedUserData->LargePageMinimum = 0;
-        
-        /* For now, we assume that we're always Server */
-        SharedUserData->NtProductType = NtProductServer;
     }
     else if (Phase == 1)
     {
@@ -477,6 +458,9 @@ MmInitSystem(IN ULONG Phase,
         TempPte.u.Hard.PageFrameNumber = PageFrameNumber;
         *MmSharedUserDataPte = TempPte;
         
+        /* Setup the memory threshold events */
+        if (!MiInitializeMemoryEvents()) return FALSE;
+        
         /*
          * Unmap low memory
          */
index 76b021b..89fba8d 100644 (file)
@@ -23,35 +23,6 @@ BOOLEAN MpwThreadShouldTerminate;
 
 /* FUNCTIONS *****************************************************************/
 
-NTSTATUS NTAPI
-MmWriteDirtyPages(ULONG Target, PULONG Actual)
-{
-   PFN_NUMBER Page;
-   PFN_NUMBER NextPage;
-   NTSTATUS Status;
-
-   Page = MmGetLRUFirstUserPage();
-   while (Page != 0 && Target > 0)
-   {
-      /*
-       * FIXME: While the current page is write back it is possible
-       *        that the next page is freed and not longer a user page.
-       */
-      NextPage = MmGetLRUNextUserPage(Page);
-      if (MmIsDirtyPageRmap(Page))
-      {
-         Status = MmWritePagePhysicalAddress(Page);
-         if (NT_SUCCESS(Status))
-         {
-            Target--;
-         }
-      }
-      Page = NextPage;
-   }
-   *Actual = Target;
-   return(STATUS_SUCCESS);
-}
-
 NTSTATUS NTAPI
 MmMpwThreadMain(PVOID Ignored)
 {
@@ -81,12 +52,6 @@ MmMpwThreadMain(PVOID Ignored)
       }
 
       PagesWritten = 0;
-#if 0
-      /*
-       *  FIXME: MmWriteDirtyPages doesn't work correctly.
-       */
-      MmWriteDirtyPages(128, &PagesWritten);
-#endif
 
       CcRosFlushDirtyPages(128, &PagesWritten);
    }
index 5568a60..d389ab4 100644 (file)
@@ -202,7 +202,7 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page)
 
    ExAcquireFastMutex(&RmapListLock);
    entry = MmGetRmapListHeadPage(Page);
-   if (entry == NULL || MmGetLockCountPage(Page) != 0)
+   if (entry == NULL)
    {
       ExReleaseFastMutex(&RmapListLock);
       return(STATUS_UNSUCCESSFUL);
index 30bb9fc..10ee365 100644 (file)
@@ -793,7 +793,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
    PMM_REGION Region;
    BOOLEAN HasSwapEntry;
    PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
-   KIRQL OldIrql;
     
    /*
     * There is a window between taking the page fault and locking the
@@ -802,12 +801,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
     */
    if (MmIsPagePresent(Process, Address))
    {
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(MmGetPfnForProcess(Process, Address));
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
       return(STATUS_SUCCESS);
    }
 
@@ -931,12 +924,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
          }
          MmInsertRmap(Page, Process, (PVOID)PAddress);
       }
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(Page);
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
       MmUnlockSectionSegment(Segment);
       PageOp->Status = STATUS_SUCCESS;
       MmspCompleteAndReleasePageOp(PageOp);
@@ -1003,12 +990,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
       /*
        * Finish the operation
        */
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(Page);
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
       PageOp->Status = STATUS_SUCCESS;
       MmspCompleteAndReleasePageOp(PageOp);
       DPRINT("Address 0x%.8X\n", Address);
@@ -1036,16 +1017,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
           KeBugCheck(MEMORY_MANAGEMENT);
          return(Status);
       }
-      /*
-       * Don't add an rmap entry since the page mapped could be for
-       * anything.
-       */
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(Page);
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
 
       /*
        * Cleanup and release locks
@@ -1085,12 +1056,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
          return(Status);
       }
       MmInsertRmap(Page, Process, (PVOID)PAddress);
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(Page);
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
 
       /*
        * Cleanup and release locks
@@ -1187,12 +1152,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
       }
       MmInsertRmap(Page, Process, (PVOID)PAddress);
 
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(Page);
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
       PageOp->Status = STATUS_SUCCESS;
       MmspCompleteAndReleasePageOp(PageOp);
       DPRINT("Address 0x%.8X\n", Address);
@@ -1263,12 +1222,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
           KeBugCheck(MEMORY_MANAGEMENT);
       }
       MmInsertRmap(Page, Process, (PVOID)PAddress);
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(Page);
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
       PageOp->Status = STATUS_SUCCESS;
       MmspCompleteAndReleasePageOp(PageOp);
       DPRINT("Address 0x%.8X\n", Address);
@@ -1297,12 +1250,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
           KeBugCheck(MEMORY_MANAGEMENT);
       }
       MmInsertRmap(Page, Process, (PVOID)PAddress);
-      if (Locked)
-      {
-         OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-         MmLockPage(Page);
-         KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-      }
       PageOp->Status = STATUS_SUCCESS;
       MmspCompleteAndReleasePageOp(PageOp);
       DPRINT("Address 0x%.8X\n", Address);
@@ -1328,7 +1275,6 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace,
    PMM_REGION Region;
    ULONG Entry;
    PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace);
-   KIRQL OldIrql;
     
    DPRINT("MmAccessFaultSectionView(%x, %x, %x, %x)\n", AddressSpace, MemoryArea, Address, Locked);
 
@@ -1467,13 +1413,6 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace,
       DPRINT1("Unable to create virtual mapping\n");
        KeBugCheck(MEMORY_MANAGEMENT);
    }
-   if (Locked)
-   {
-      OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-      MmLockPage(NewPage);
-      MmUnlockPage(OldPage);
-      KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
-   }
 
    /*
     * Unshare the old page.
@@ -4482,138 +4421,6 @@ NtExtendSection(IN HANDLE SectionHandle,
    return STATUS_NOT_IMPLEMENTED;
 }
 
-
-/**********************************************************************
- * NAME       INTERNAL
- *  MmAllocateSection@4
- *
- * DESCRIPTION
- *
- * ARGUMENTS
- *  Length
- *
- * RETURN VALUE
- *
- * NOTE
- *  Code taken from ntoskrnl/mm/special.c.
- *
- * REVISIONS
- */
-PVOID NTAPI
-MmAllocateSection (IN ULONG Length, PVOID BaseAddress)
-{
-    PHYSICAL_ADDRESS LowAddress, HighAddress, SkipBytes;
-    PMDL Mdl;
-    PFN_COUNT PageCount;
-    PPFN_NUMBER MdlPages;
-    MMPTE TempPte, *PointerPte;
-    PMMPFN Pfn;
-
-    /* Allocate an MDL */
-    LowAddress.QuadPart = 0;
-    HighAddress.QuadPart = -1;
-    SkipBytes.QuadPart = 0;
-    Mdl = MiAllocatePagesForMdl(LowAddress,
-                                HighAddress,
-                                SkipBytes,
-                                Length,
-                                MiPlatformCacheAttributes[0][MmCached],
-                                0); // use MM_ALLOCATE_FULLY_REQUIRED
-    if (!Mdl)
-    {
-        /* Fail */
-        return NULL;
-    }
-
-    /* Check if we got all we need */
-    if (Mdl->ByteCount < Length)
-    {
-        /* We didn't get enough */
-        MmFreePagesFromMdl(Mdl);
-        ExFreePool(Mdl);
-        return NULL;
-    }
-
-    /* Calculate how many pages we should have */
-    PageCount = BYTES_TO_PAGES(Length);
-
-    /* Reserve system PTEs */
-    PointerPte = MiReserveSystemPtes(PageCount, SystemPteSpace);
-    if (!PointerPte)
-    {
-        /* Free the MDL and fail */
-        MmFreePagesFromMdl(Mdl);
-        ExFreePool(Mdl);
-        return NULL;
-    }
-
-    /* Safe the base address */
-    BaseAddress = MiPteToAddress(PointerPte);
-
-    /* Get a pointer to the page array */
-    MdlPages = (PPFN_NUMBER)(Mdl + 1);
-
-    /* Get the first page's PFN entry */
-    Pfn = MI_PFN_ELEMENT(*MdlPages);
-
-    /* Save the pointer to the MDL in the PFN entry */
-    *(PMDL*)&Pfn->OriginalPte = Mdl;
-
-    /* Setup template PTE */
-    TempPte = HyperTemplatePte;
-
-    /* Map the PTEs */
-    do
-    {
-        /* Sanity checks */
-        ASSERT(PointerPte->u.Hard.Valid == 0);
-        ASSERT(PointerPte->u.Soft.Transition == 0);
-
-        /* Get the PFN */
-        TempPte.u.Hard.PageFrameNumber = *MdlPages++;
-
-        /* Write the PTE */
-        *PointerPte++ = TempPte;
-    } while (--PageCount);
-
-    /* Return the base address */
-    return BaseAddress;
-}
-
-VOID
-NTAPI
-MmFreeSection(PVOID BaseAddress)
-{
-    PMMPTE PointerPte;
-    PFN_NUMBER *MdlPages, PageFrameNumber, PageCount;
-    PMMPFN Pfn;
-    PMDL Mdl;
-
-    /* Get a pointer to the first PTE */
-    PointerPte = MiAddressToPte(BaseAddress);
-
-    /* Get the page frame number of the first page */
-    PageFrameNumber = PFN_FROM_PTE(PointerPte);
-
-    /* Get the first pages's PFN entry */
-    Pfn = MI_PFN_ELEMENT(PageFrameNumber);
-
-    /* Get the MDL from the PFN */
-    Mdl = *(PMDL*)&Pfn->OriginalPte;
-    *(PMDL*)&Pfn->OriginalPte = NULL;
-
-    /* Get the page array and count from the MDL */
-    MdlPages = (PPFN_NUMBER)(Mdl + 1);
-    PageCount = BYTES_TO_PAGES(Mdl->ByteCount);
-
-    /* Release the system PTEs */
-    MiReleaseSystemPtes(PointerPte, PageCount, SystemPteSpace);
-
-    /* Free the pages and the MDL */
-    MmFreePagesFromMdl(Mdl);
-    ExFreePool(Mdl);
-}
-
 /**********************************************************************
  * NAME       EXPORTED
  * MmMapViewOfSection
index 9b015de..5663f1e 100644 (file)
@@ -4,14 +4,19 @@
 * FILE:            ntoskrnl/mm/sysldr.c
 * PURPOSE:         Contains the Kernel Loader (SYSLDR) for loading PE files.
 * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
+*                  ReactOS Portable Systems Group
 */
 
-/* INCLUDES ******************************************************************/
+/* INCLUDES *******************************************************************/
 
 #include <ntoskrnl.h>
 #define NDEBUG
 #include <debug.h>
 
+#line 16 "ARM³::LOADER"
+#define MODULE_INVOLVED_IN_ARM3
+#include "./ARM3/miarm.h"
+
 /* GCC's incompetence strikes again */
 __inline
 VOID
@@ -25,7 +30,7 @@ sprintf_nt(IN PCHAR Buffer,
     va_end(ap);
 }
 
-/* GLOBALS *******************************************************************/
+/* GLOBALS ********************************************************************/
 
 LIST_ENTRY PsLoadedModuleList;
 LIST_ENTRY MmLoadedUserImageList;
@@ -39,7 +44,7 @@ PVOID MmLastUnloadedDrivers;
 PVOID MmTriageActionTaken;
 PVOID KernelVerifier;
 
-/* FUNCTIONS *****************************************************************/
+/* FUNCTIONS ******************************************************************/
 
 PVOID
 NTAPI
@@ -68,25 +73,6 @@ MiCacheImageSymbols(IN PVOID BaseAddress)
     return DebugDirectory;
 }
 
-VOID
-NTAPI
-MiFreeBootDriverMemory(PVOID BaseAddress,
-                       ULONG Length)
-{
-    ULONG i;
-
-    /* Loop each page */
-    for (i = 0; i < PAGE_ROUND_UP(Length) / PAGE_SIZE; i++)
-    {
-        /* Free the page */
-        MmDeleteVirtualMapping(NULL,
-                               (PVOID)((ULONG_PTR)BaseAddress + i * PAGE_SIZE),
-                               TRUE,
-                               NULL,
-                               NULL);
-    }
-}
-
 NTSTATUS
 NTAPI
 MiLoadImageSection(IN OUT PVOID *SectionPtr,
@@ -103,8 +89,10 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr,
     KAPC_STATE ApcState;
     LARGE_INTEGER SectionOffset = {{0, 0}};
     BOOLEAN LoadSymbols = FALSE;
-    ULONG DriverSize;
+    PFN_NUMBER PteCount;
+    PMMPTE PointerPte, LastPte;
     PVOID DriverBase;
+    MMPTE TempPte;
     PAGED_CODE();
 
     /* Detect session load */
@@ -117,7 +105,7 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr,
 
     /* Not session load, shouldn't have an entry */
     ASSERT(LdrEntry == NULL);
-
+    
     /* Attach to the system process */
     KeStackAttachProcess(&PsInitialSystemProcess->Pcb, &ApcState);
 
@@ -159,16 +147,37 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr,
         KeUnstackDetachProcess(&ApcState);
         return Status;
     }
-
-    /* Get the driver size */
-    DriverSize = Section->ImageSection->ImageSize;
-
-    /*  Allocate a virtual section for the module  */
-    DriverBase = MmAllocateSection(DriverSize, NULL);
+    
+    /* Reserve system PTEs needed */
+    PteCount = ROUND_TO_PAGES(Section->ImageSection->ImageSize) >> PAGE_SHIFT;
+    PointerPte = MiReserveSystemPtes(PteCount, SystemPteSpace);
+    if (!PointerPte) return STATUS_INSUFFICIENT_RESOURCES;
+    
+    /* New driver base */
+    LastPte = PointerPte + PteCount;
+    DriverBase = MiPteToAddress(PointerPte);
+
+    /* The driver is here */
     *ImageBase = DriverBase;
 
+    /* Loop the new driver PTEs */
+    TempPte = ValidKernelPte;
+    while (PointerPte < LastPte)
+    {
+        /* Allocate a page */
+        TempPte.u.Hard.PageFrameNumber = MmAllocPage(MC_NPPOOL);
+        
+        /* Write it */
+        ASSERT(PointerPte->u.Hard.Valid == 0);
+        ASSERT(TempPte.u.Hard.Valid == 1);
+        *PointerPte = TempPte;
+        
+        /* Move on */
+        PointerPte++;
+    }
+        
     /* Copy the image */
-    RtlCopyMemory(DriverBase, Base, DriverSize);
+    RtlCopyMemory(DriverBase, Base, PteCount << PAGE_SHIFT);
 
     /* Now unmap the view */
     Status = MmUnmapViewOfSection(Process, Base);
@@ -1210,6 +1219,10 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     PIMAGE_DATA_DIRECTORY DataDirectory;
     PVOID DllBase, NewImageAddress;
     NTSTATUS Status;
+    PMMPTE PointerPte, StartPte, LastPte;
+    PFN_NUMBER PteCount;
+    PMMPFN Pfn1;
+    MMPTE TempPte, OldPte;
 
     /* Sanity check */
     ASSERT(ExpInitializationPhase == 0);
@@ -1265,28 +1278,69 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
         /* Remember the original address */
         DllBase = LdrEntry->DllBase;
-
-        /*  Allocate a virtual section for the module  */
-        NewImageAddress = MmAllocateSection(LdrEntry->SizeOfImage, NULL);
-        if (!NewImageAddress)
+        
+        /* Get the first PTE and the number of PTEs we'll need */
+        PointerPte = StartPte = MiAddressToPte(LdrEntry->DllBase);
+        PteCount = ROUND_TO_PAGES(LdrEntry->SizeOfImage) >> PAGE_SHIFT;
+        LastPte = StartPte + PteCount;
+        
+        /* Loop the PTEs */
+        while (PointerPte < LastPte)
+        {
+            /* Mark the page modified in the PFN database */
+            ASSERT(PointerPte->u.Hard.Valid == 1);
+            Pfn1 = MiGetPfnEntry(PFN_FROM_PTE(PointerPte));
+            ASSERT(Pfn1->u3.e1.Rom == 0);
+            Pfn1->u3.e1.Modified = TRUE;
+            
+            /* Next */
+            PointerPte++;
+        }
+        
+        /* Now reserve system PTEs for the image */
+        PointerPte = MiReserveSystemPtes(PteCount, SystemPteSpace);
+        if (!PointerPte)
         {
             /* Shouldn't happen */
             DPRINT1("[Mm0]: Couldn't allocate driver section!\n");
             while (TRUE);
         }
+        
+        /* This is the new virtual address for the module */
+        LastPte = PointerPte + PteCount;
+        NewImageAddress = MiPteToAddress(PointerPte);
 
         DPRINT("[Mm0]: Copying from: %p to: %p\n", DllBase, NewImageAddress);
-
-        /* Now copy the entire driver over */
-        RtlCopyMemory(NewImageAddress, DllBase, LdrEntry->SizeOfImage);
+        
+        /* Loop the new driver PTEs */
+        TempPte = ValidKernelPte;
+        while (PointerPte < LastPte)
+        {
+            /* Copy the old data */
+            OldPte = *StartPte;
+            ASSERT(OldPte.u.Hard.Valid == 1);
+            
+            /* Set page number from the loader's memory */
+            TempPte.u.Hard.PageFrameNumber = OldPte.u.Hard.PageFrameNumber;
+            
+            /* Write it */
+            ASSERT(PointerPte->u.Hard.Valid == 0);
+            ASSERT(TempPte.u.Hard.Valid == 1);
+            *PointerPte = TempPte;
+            
+            /* Move on */
+            PointerPte++;
+            StartPte++;
+        }
+        
+        /* Update position */
+        PointerPte -= PteCount;
 
         /* Sanity check */
         ASSERT(*(PULONG)NewImageAddress == *(PULONG)DllBase);
 
         /* Set the image base to the address where the loader put it */
         NtHeader->OptionalHeader.ImageBase = (ULONG_PTR)DllBase;
-        NtHeader = RtlImageNtHeader(NewImageAddress);
-        NtHeader->OptionalHeader.ImageBase = (ULONG_PTR)DllBase;
 
         /* Check if we had relocations */
         if (ValidRelocs)
@@ -1320,10 +1374,9 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
         LdrEntry->Flags |= LDRP_SYSTEM_MAPPED;
         LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)NewImageAddress +
                                 NtHeader->OptionalHeader.AddressOfEntryPoint);
-        LdrEntry->SizeOfImage = LdrEntry->SizeOfImage;
-
-        /* Free the old copy */
-        MiFreeBootDriverMemory(DllBase, LdrEntry->SizeOfImage);
+        LdrEntry->SizeOfImage = PteCount << PAGE_SHIFT;
+        
+        /* FIXME: We'll need to fixup the PFN linkage when switching to ARM3 */
     }
 }
 
index c6878ac..3b3583d 100644 (file)
@@ -7,6 +7,7 @@
        <define name="_NTOSKRNL_" />
        <define name="_NTSYSTEM_" />
        <define name="_IN_KERNEL_" />
+       <define name="NTDDI_VERSION">0x05020400</define>
        <if property="_WINKD_" value="1">
                <define name="_WINKD_" />
        </if>
@@ -31,7 +32,7 @@
        <library>wdmguid</library>
        <dependency>bugcodes</dependency>
        <directory name="include">
-               <pch>precomp.h</pch>
+               <pch>ntoskrnl.h</pch>
        </directory>
        <directory name="ke">
                <if property="ARCH" value="i386">
                </if>
                <if property="ARCH" value="arm">
                        <directory name="arm">
-                               <file>stubs.c</file>
+                               <file>page.c</file>
                        </directory>
                </if>
                <if property="ARCH" value="powerpc">
                        <file>hypermap.c</file>
                        <file>iosup.c</file>
                        <file>mdlsup.c</file>
+                       <file>mminit.c</file>
                        <file>mmsup.c</file>
                        <file>ncache.c</file>
                        <file>pagfault.c</file>
+                       <file>pfnlist.c</file>
                        <file>pool.c</file>
                        <file>procsup.c</file>
                        <file>syspte.c</file>
                <file>obwait.c</file>
        </directory>
        <directory name="po">
+           <file>events.c</file>
                <file>power.c</file>
-               <file>events.c</file>
+               <file>poshtdwn.c</file>
+               <file>povolume.c</file>
        </directory>
        <directory name="ps">
                <if property="ARCH" value="i386">
index b21771a..7bdc16c 100644 (file)
 ;WmiStopTrace
 ;WmiTraceFastEvent
 @ cdecl WmiTraceMessage()
-@ stdcall WmiTraceMessageVa(ptr long ptr long long)
+@ stdcall WmiTraceMessageVa(double long ptr long long)
 ;WmiUpdateTrace
 ;XIPDispatch
 @ stdcall ZwAccessCheckAndAuditAlarm(ptr ptr ptr ptr ptr long ptr long ptr ptr ptr)
index 4ede1c5..090bff5 100644 (file)
 #endif
 #define VER_LANGNEUTRAL
 #include "common.ver"
+#include "resource.h"
 
 //
 // Bug Codes and Bitmaps
 //
 #include "bugcodes.rc"
-1   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/1.bmp"
-2   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/2.bmp"
-3   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/3.bmp"
-4   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/4.bmp"
-5   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/5.bmp"
-6   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/6.bmp"
-7   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/7.bmp"
-8   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/8.bmp"
-13  BITMAP DISCARDABLE "ntoskrnl/inbv/logo/13.bmp"
-14  BITMAP DISCARDABLE "ntoskrnl/inbv/logo/14.bmp"
-15  BITMAP DISCARDABLE "ntoskrnl/inbv/logo/15.bmp"
-16  BITMAP DISCARDABLE "ntoskrnl/inbv/logo/16.bmp"
-17  BITMAP DISCARDABLE "ntoskrnl/inbv/logo/17.bmp"
+IDB_BOOT_LOGO       BITMAP DISCARDABLE "ntoskrnl/inbv/logo/1.bmp"
+IDB_HIBERNATE_LOGO  BITMAP DISCARDABLE "ntoskrnl/inbv/logo/2.bmp"
+IDB_SHUTDOWN_LOGO   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/3.bmp"
+IDB_BAR_SERVER      BITMAP DISCARDABLE "ntoskrnl/inbv/logo/4.bmp"
+IDB_LOGO            BITMAP DISCARDABLE "ntoskrnl/inbv/logo/5.bmp"
+IDB_LOGO_HEADER     BITMAP DISCARDABLE "ntoskrnl/inbv/logo/6.bmp"
+IDB_LOGO_BAND       BITMAP DISCARDABLE "ntoskrnl/inbv/logo/7.bmp"
+IDB_BAR_PRO         BITMAP DISCARDABLE "ntoskrnl/inbv/logo/8.bmp"
+IDB_SERVER_LOGO     BITMAP DISCARDABLE "ntoskrnl/inbv/logo/5.bmp"
+IDB_SERVER_HEADER   BITMAP DISCARDABLE "ntoskrnl/inbv/logo/14.bmp"
+IDB_SERVER_BAND     BITMAP DISCARDABLE "ntoskrnl/inbv/logo/15.bmp"
diff --git a/reactos/ntoskrnl/po/poshtdwn.c b/reactos/ntoskrnl/po/poshtdwn.c
new file mode 100644 (file)
index 0000000..dd5113e
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            ntoskrnl/po/poshtdwn.c
+ * PURPOSE:         Power Manager Shutdown Code
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS *******************************************************************/
+
+ULONG PopShutdownPowerOffPolicy;
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+VOID
+NTAPI
+PopShutdownHandler(VOID)
+{
+    PUCHAR Logo1, Logo2;
+    ULONG i;
+    
+    /* Stop all interrupts */
+    KeRaiseIrqlToDpcLevel();
+    _disable();
+
+    /* Do we have boot video */
+    if (InbvIsBootDriverInstalled())
+    {
+        /* Yes we do, cleanup for shutdown screen */
+        if (!InbvCheckDisplayOwnership()) InbvAcquireDisplayOwnership();
+        InbvResetDisplay();
+        InbvSolidColorFill(0, 0, 639, 479, 0);
+        InbvEnableDisplayString(TRUE);
+        InbvSetScrollRegion(0, 0, 639, 479);
+
+        /* Display shutdown logo and message */
+        Logo1 = InbvGetResourceAddress(IDB_SHUTDOWN_LOGO);
+        Logo2 = InbvGetResourceAddress(IDB_LOGO);
+        if ((Logo1) && (Logo2))
+        {
+            InbvBitBlt(Logo1, 215, 352);
+            InbvBitBlt(Logo2, 217, 111);
+        }
+    }
+    else
+    {
+        /* Do it in text-mode */
+        for (i = 0; i < 25; i++) InbvDisplayString("\n");
+        InbvDisplayString("                       ");
+        InbvDisplayString("The system may be powered off now.\n");
+    }
+
+    /* Hang the system */
+    for (;;) HalHaltSystem();
+}
+
+VOID
+NTAPI
+PopShutdownSystem(IN POWER_ACTION SystemAction)
+{
+    /* Note should notify caller of NtPowerInformation(PowerShutdownNotification) */
+
+    /* Unload symbols */
+    DPRINT1("It's the final countdown...%lx\n", SystemAction);
+    DbgUnLoadImageSymbols(NULL, (PVOID)-1, 0);
+    
+    /* Run the thread on the boot processor */
+    KeSetSystemAffinityThread(1);
+
+    /* Now check what the caller wants */
+    switch (SystemAction)
+    {
+        /* Reset */
+        case PowerActionShutdownReset:
+
+            /* Try platform driver first, then legacy */
+            //PopInvokeSystemStateHandler(PowerStateShutdownReset, NULL);
+            HalReturnToFirmware(HalRebootRoutine);
+            break;
+
+        case PowerActionShutdown:
+
+            /* Check for group policy that says to use "it is now safe" screen */
+            if (PopShutdownPowerOffPolicy)
+            {
+                /* FIXFIX: Switch to legacy shutdown handler */
+                //PopPowerStateHandlers[PowerStateShutdownOff].Handler = PopShutdownHandler;
+            }
+
+        case PowerActionShutdownOff:
+
+            /* Call shutdown handler */
+            //PopInvokeSystemStateHandler(PowerStateShutdownOff, NULL);
+            
+            /* ReactOS Hack */
+            PopSetSystemPowerState(PowerSystemShutdown);
+            PopShutdownHandler();
+
+            /* If that didn't work, call the HAL */
+            HalReturnToFirmware(HalPowerDownRoutine);
+            break;
+
+        default:
+            break;
+    }
+
+    /* Anything else should not happen */
+    KeBugCheckEx(INTERNAL_POWER_ERROR, 5, 0, 0, 0);
+}
+
+VOID
+NTAPI
+PopGracefulShutdown(IN PVOID Context)
+{
+    PEPROCESS Process = NULL;
+
+    /* Loop every process */
+    Process = PsGetNextProcess(Process);
+    while (Process)
+    {
+        /* Make sure this isn't the idle or initial process */
+        if ((Process != PsInitialSystemProcess) && (Process != PsIdleProcess))
+        {
+            /* Print it */
+            DPRINT1("%15s is still RUNNING (%lx)\n", Process->ImageFileName, Process->UniqueProcessId);
+        }
+
+        /* Get the next process */
+        Process = PsGetNextProcess(Process);
+    }
+    
+    /* First, the HAL handles any "end of boot" special functionality */
+    DPRINT1("HAL shutting down\n");
+    HalEndOfBoot();
+
+    /* In this step, the I/O manager does first-chance shutdown notification */
+    DPRINT1("I/O manager shutting down in phase 0\n");    
+    IoShutdownSystem(0);
+    
+    /* In this step, all workers are killed and hives are flushed */
+    DPRINT1("Configuration Manager shutting down\n");
+    CmShutdownSystem();
+    
+    /* Note that modified pages should be written here (MiShutdownSystem) */
+
+    /* In this step, the I/O manager does last-chance shutdown notification */
+    DPRINT1("I/O manager shutting down in phase 1\n"); 
+    IoShutdownSystem(1);
+    CcWaitForCurrentLazyWriterActivity();
+
+    /* Note that here, we should broadcast the power IRP to devices */
+
+    /* In this step, the HAL disables any wake timers */
+    DPRINT1("Disabling wake timers\n");
+    HalSetWakeEnable(FALSE);
+    
+    /* And finally the power request is sent */
+    DPRINT1("Taking the system down\n");
+    PopShutdownSystem(PopAction.Action);
+}
+
+VOID
+NTAPI
+PopReadShutdownPolicy(VOID)
+{
+    UNICODE_STRING KeyString;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    NTSTATUS Status;
+    HANDLE KeyHandle;
+    ULONG Length;
+    UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)];
+    PKEY_VALUE_PARTIAL_INFORMATION Info = (PVOID)Buffer;
+    
+    /* Setup object attributes */
+    RtlInitUnicodeString(&KeyString,
+                         L"\\Registry\\Machine\\Software\\Policies\\Microsoft\\Windows NT");
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyString,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               NULL,
+                               NULL);
+
+    /* Open the key */
+    Status = ZwOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes);
+    if (NT_SUCCESS(Status))
+    {
+        /* Open the policy value and query it */
+        RtlInitUnicodeString(&KeyString, L"DontPowerOffAfterShutdown");
+        Status = ZwQueryValueKey(KeyHandle,
+                                 &KeyString,
+                                 KeyValuePartialInformation,
+                                 &Info,
+                                 sizeof(Info),
+                                 &Length);
+        if ((NT_SUCCESS(Status)) && (Info->Type == REG_DWORD))
+        {
+            /* Read the policy */
+            PopShutdownPowerOffPolicy = *Info->Data == 1;
+        }
+
+        /* Close the key */
+        ZwClose(KeyHandle);
+    }
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
diff --git a/reactos/ntoskrnl/po/povolume.c b/reactos/ntoskrnl/po/povolume.c
new file mode 100644 (file)
index 0000000..15aaebf
--- /dev/null
@@ -0,0 +1,331 @@
+/*
+ * PROJECT:         ReactOS Kernel
+ * LICENSE:         BSD - See COPYING.ARM in the top level directory
+ * FILE:            ntoskrnl/po/povolume.c
+ * PURPOSE:         Power Manager DOPE and Volume Management
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS *******************************************************************/
+
+typedef struct _POP_FLUSH_VOLUME
+{
+    LIST_ENTRY List;
+    LONG Count;
+    KEVENT Wait;
+} POP_FLUSH_VOLUME, *PPOP_FLUSH_VOLUME;
+ULONG PopFlushPolicy = 0;
+
+KGUARDED_MUTEX PopVolumeLock;
+LIST_ENTRY PopVolumeDevices;
+KSPIN_LOCK PopDopeGlobalLock;
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+PDEVICE_OBJECT_POWER_EXTENSION
+NTAPI
+PopGetDope(IN PDEVICE_OBJECT DeviceObject)
+{
+    PEXTENDED_DEVOBJ_EXTENSION DeviceExtension;
+    PDEVICE_OBJECT_POWER_EXTENSION Dope;
+    KIRQL OldIrql;
+    PAGED_CODE();
+
+    /* If the device already has the dope, return it */
+    DeviceExtension = IoGetDevObjExtension(DeviceObject);
+    if (DeviceExtension->Dope) goto Return;
+
+    /* Allocate some dope for the device */
+    Dope = ExAllocatePoolWithTag(NonPagedPool,
+                                 sizeof(DEVICE_OBJECT_POWER_EXTENSION),
+                                 'Dope');
+    if (!Dope) goto Return;
+
+    /* Initialize the initial contents of the dope */
+    RtlZeroMemory(Dope, sizeof(DEVICE_OBJECT_POWER_EXTENSION));
+    Dope->DeviceObject = DeviceObject;
+    Dope->State = PowerDeviceUnspecified;
+    InitializeListHead(&Dope->IdleList);
+
+    /* Make sure only one caller can assign dope to a device */
+    KeAcquireSpinLock(&PopDopeGlobalLock, &OldIrql);
+    
+    /* Make sure the device still has no dope */
+    if (!DeviceExtension->Dope)
+    {
+        /* Give the local dope to this device, and remember we won the race */
+        DeviceExtension->Dope = (PVOID)Dope;
+        Dope = NULL;
+    }
+
+    /* Allow other dope transactions now */
+    KeReleaseSpinLock(&PopDopeGlobalLock, OldIrql);
+    
+    /* Check if someone other than us already assigned the dope, so free ours */
+    if (Dope) ExFreePoolWithTag(Dope, 'Dope');
+
+    /* Return the dope to the caller */
+Return:
+    return (PDEVICE_OBJECT_POWER_EXTENSION)DeviceExtension->Dope;
+}
+
+VOID
+NTAPI
+PoVolumeDevice(IN PDEVICE_OBJECT DeviceObject)
+{
+    PDEVICE_OBJECT_POWER_EXTENSION Dope;
+    PAGED_CODE();
+
+    /* Get dope from the device (if the device has no dope, it will receive some) */
+    Dope = PopGetDope(DeviceObject);
+    if (Dope)
+    {
+        /* Make sure we can flush safely */
+        KeAcquireGuardedMutex(&PopVolumeLock);
+
+        /* Add this volume into the list of power-manager volumes */
+        if (!Dope->Volume.Flink) InsertTailList(&PopVolumeDevices, &Dope->Volume);
+        
+        /* Allow flushes to go through */
+        KeReleaseGuardedMutex(&PopVolumeLock);
+    }
+}
+    
+VOID
+NTAPI
+PopFlushVolumeWorker(IN PVOID Context)
+{
+    PPOP_FLUSH_VOLUME FlushContext = (PPOP_FLUSH_VOLUME)Context;
+    PDEVICE_OBJECT_POWER_EXTENSION Dope;
+    PLIST_ENTRY NextEntry;
+    NTSTATUS Status;
+    UCHAR Buffer[sizeof(OBJECT_NAME_INFORMATION) + 512];
+    POBJECT_NAME_INFORMATION NameInfo = (PVOID)Buffer;
+    ULONG Length;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    HANDLE VolumeHandle;
+    IO_STATUS_BLOCK IoStatusBlock;
+
+    /* Acquire the flush lock since we're messing with the list */
+    KeAcquireGuardedMutex(&PopVolumeLock);
+
+    /* Loop the flush list */
+    while (!IsListEmpty(&FlushContext->List))
+    {
+        /* Grab the next (ie: current) entry and remove it */
+        NextEntry = FlushContext->List.Flink;
+        RemoveEntryList(NextEntry);
+        
+        /* Add it back on the volume list */
+        InsertTailList(&PopVolumeDevices, NextEntry);
+        
+        /* Done touching the volume list */
+        KeReleaseGuardedMutex(&PopVolumeLock);
+
+        /* Get the dope from the volume link */
+        Dope = CONTAINING_RECORD(NextEntry, DEVICE_OBJECT_POWER_EXTENSION, Volume);
+
+        /* Get the name */
+        Status = ObQueryNameString(Dope->DeviceObject,
+                                   NameInfo,
+                                   sizeof(Buffer),
+                                   &Length);
+        if ((NT_SUCCESS(Status)) && (NameInfo->Name.Buffer))
+        {
+            /* Open the volume */
+            DPRINT1("Opening: %wZ\n", &NameInfo->Name);
+            InitializeObjectAttributes(&ObjectAttributes,
+                                       &NameInfo->Name,
+                                       OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                                       0,
+                                       0);
+            Status = ZwCreateFile(&VolumeHandle,
+                                  SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA,
+                                  &ObjectAttributes,
+                                  &IoStatusBlock,
+                                  NULL,
+                                  GENERIC_READ | GENERIC_WRITE,
+                                  FILE_SHARE_READ | FILE_SHARE_WRITE,
+                                  FILE_OPEN,
+                                  0,
+                                  NULL,
+                                  0);
+            if (NT_SUCCESS(Status))
+            {
+                /* Flush it and close it */
+                DPRINT1("Sending flush to: %lx\n", VolumeHandle);
+                ZwFlushBuffersFile(VolumeHandle, &IoStatusBlock);
+                ZwClose(VolumeHandle);
+            }
+        }
+
+        /* Acquire the flush lock again since we'll touch the list */
+        KeAcquireGuardedMutex(&PopVolumeLock);
+    }
+
+    /* One more flush completed... if it was the last, signal the caller */
+    if (!--FlushContext->Count) KeSetEvent(&FlushContext->Wait, IO_NO_INCREMENT, FALSE);
+
+    /* Serialize with flushers */
+    KeReleaseGuardedMutex(&PopVolumeLock);
+}
+
+VOID
+NTAPI
+PopFlushVolumes(IN BOOLEAN ShuttingDown)
+{
+    POP_FLUSH_VOLUME FlushContext = {{0}};
+    ULONG FlushPolicy;
+    UNICODE_STRING RegistryName = RTL_CONSTANT_STRING(L"\\Registry");
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    HANDLE RegistryHandle;
+    PLIST_ENTRY NextEntry;
+    PDEVICE_OBJECT_POWER_EXTENSION  Dope;    
+    ULONG VolumeCount = 0;
+    NTSTATUS Status;
+    HANDLE ThreadHandle;
+    ULONG ThreadCount;
+
+    /* Setup the flush context */
+    InitializeListHead(&FlushContext.List);
+    KeInitializeEvent(&FlushContext.Wait, NotificationEvent, FALSE);
+
+    /* What to flush */
+    FlushPolicy = ShuttingDown ? 1 | 2 : PopFlushPolicy;
+    if ((FlushPolicy & 1))
+    {
+        /* Registry flush requested, so open it */
+        DPRINT1("Opening registry\n");
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &RegistryName,
+                                   OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                                   NULL,
+                                   NULL);
+        Status = ZwOpenKey(&RegistryHandle, KEY_READ, &ObjectAttributes);
+        if (NT_SUCCESS(Status))
+        {
+            /* Flush the registry */
+            DPRINT1("Flushing registry\n");
+            ZwFlushKey(RegistryHandle);
+            ZwClose(RegistryHandle);
+        }
+    }
+
+    /* Serialize with other flushes */
+    KeAcquireGuardedMutex(&PopVolumeLock);
+    
+    /* Scan the volume list */
+    NextEntry = PopVolumeDevices.Flink;
+    while (NextEntry != &PopVolumeDevices)
+    {
+        /* Get the dope from the link */
+        Dope = CONTAINING_RECORD(NextEntry, DEVICE_OBJECT_POWER_EXTENSION, Volume);
+        
+        /* Grab the next entry now, since we'll be modifying the list */
+        NextEntry = NextEntry->Flink;
+
+        /* Make sure the object is mounted, writable, exists, and is not a floppy */
+        if (!(Dope->DeviceObject->Vpb->Flags & VPB_MOUNTED) ||
+            (Dope->DeviceObject->Characteristics & FILE_FLOPPY_DISKETTE) ||
+            (Dope->DeviceObject->Characteristics & FILE_READ_ONLY_DEVICE) ||
+            ((Dope->DeviceObject->Vpb->RealDevice) &&
+             (Dope->DeviceObject->Vpb->RealDevice->Characteristics & FILE_FLOPPY_DISKETTE)))
+        {
+            /* Not flushable */
+            continue;
+        }
+
+        /* Remove it from the dope and add it to the flush context list */
+        RemoveEntryList(&Dope->Volume);
+        InsertTailList(&FlushContext.List, &Dope->Volume);
+        
+        /* Next */
+        VolumeCount++;
+    }
+
+    /* Check if we should skip non-removable devices */
+    if (!(FlushPolicy & 2))
+    {
+        /* ReactOS only implements this routine for shutdown, which requires it */
+        UNIMPLEMENTED;
+        while (TRUE);
+    }
+
+    /* Check if there were no volumes at all */
+    if (!VolumeCount)
+    {
+        /* Nothing to do */
+        KeReleaseGuardedMutex(&PopVolumeLock);
+        return;
+    }
+
+    /* Allocate up to 8 flusher threads */
+    ThreadCount = min(VolumeCount, 8);
+    InitializeObjectAttributes(&ObjectAttributes,
+                               NULL,
+                               OBJ_KERNEL_HANDLE,
+                               NULL,
+                               NULL);
+
+    /* We will ourselves become a flusher thread */
+    FlushContext.Count = 1;
+    ThreadCount--;
+    
+    /* Look for any extra ones we might need */
+    while (ThreadCount > 0)
+    {
+        /* Create a new one */
+        ThreadCount--;
+        DPRINT1("Creating flush thread\n");
+        Status = PsCreateSystemThread(&ThreadHandle,
+                                      THREAD_ALL_ACCESS,
+                                      &ObjectAttributes,
+                                      0L,
+                                      NULL,
+                                      PopFlushVolumeWorker,
+                                      &FlushContext);
+        if (NT_SUCCESS(Status))
+        {
+            /* One more created... */
+            FlushContext.Count++;
+            ZwClose(ThreadHandle);
+        }
+    }
+
+    /* Allow flushes to go through */
+    KeReleaseGuardedMutex(&PopVolumeLock);
+
+    /* Enter the flush work */
+    DPRINT1("Local flush\n");
+    PopFlushVolumeWorker(&FlushContext);
+    
+    /* Wait for all flushes to be over */
+    DPRINT1("Waiting for flushes\n");
+    KeWaitForSingleObject(&FlushContext.Wait, Executive, KernelMode, FALSE, NULL);
+    DPRINT1("Flushes have completed\n");
+}
+
+VOID
+NTAPI
+PoInitializeDeviceObject(IN OUT PDEVOBJ_EXTENSION DeviceObjectExtension)
+{
+    PEXTENDED_DEVOBJ_EXTENSION DeviceExtension = (PVOID)DeviceObjectExtension;
+    PAGED_CODE();
+
+    /* Initialize the power flags */
+    DeviceExtension->PowerFlags = PowerSystemUnspecified & 0xF;
+    DeviceExtension->PowerFlags |= ((PowerDeviceUnspecified << 4) & 0xF0);
+
+    /* The device object is not on drugs yet */
+    DeviceExtension->Dope = NULL;
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
index f103898..eb163b6 100644 (file)
@@ -24,6 +24,8 @@ typedef struct _REQUEST_POWER_ITEM
 
 PDEVICE_NODE PopSystemPowerDeviceNode = NULL;
 BOOLEAN PopAcpiPresent = FALSE;
+POP_POWER_ACTION PopAction;
+WORK_QUEUE_ITEM PopShutdownWorkItem;
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
@@ -45,10 +47,11 @@ PopRequestPowerIrpCompletion(IN PDEVICE_OBJECT DeviceObject,
                                         RequestPowerItem->PowerState,
                                         RequestPowerItem->Context,
                                         &Irp->IoStatus);
-  
-    ExFreePool(&Irp->IoStatus);
+
     ExFreePool(Context);
 
+    IoFreeIrp(Irp);
+
     return STATUS_SUCCESS;
 }
 
@@ -165,6 +168,13 @@ PoInitSystem(IN ULONG BootPhase)
         PopAcpiPresent = KeLoaderBlock->Extension->AcpiTable != NULL ? TRUE : FALSE;
     }
 
+    
+    /* Initialize volume support */
+    InitializeListHead(&PopVolumeDevices);
+    KeInitializeGuardedMutex(&PopVolumeLock);
+    
+    /* Initialize support for dope */
+    KeInitializeSpinLock(&PopDopeGlobalLock);
     return TRUE;
 }
 
@@ -349,7 +359,6 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject,
     PDEVICE_OBJECT TopDeviceObject;
     PIO_STACK_LOCATION Stack;
     PIRP Irp;
-    PIO_STATUS_BLOCK IoStatusBlock;
     PREQUEST_POWER_ITEM RequestPowerItem;
     NTSTATUS Status;
   
@@ -361,27 +370,19 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject,
     RequestPowerItem = ExAllocatePool(NonPagedPool, sizeof(REQUEST_POWER_ITEM));
     if (!RequestPowerItem)
         return STATUS_INSUFFICIENT_RESOURCES;
-    IoStatusBlock = ExAllocatePool(NonPagedPool, sizeof(IO_STATUS_BLOCK));
-    if (!IoStatusBlock)
-    {
-        ExFreePool(RequestPowerItem);
-        return STATUS_INSUFFICIENT_RESOURCES;
-    }
   
     /* Always call the top of the device stack */
     TopDeviceObject = IoGetAttachedDeviceReference(DeviceObject);
   
-    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
-                                       TopDeviceObject,
-                                       NULL,
-                                       0,
-                                       NULL,
-                                       NULL,
-                                       IoStatusBlock);
+    Irp = IoBuildAsynchronousFsdRequest(IRP_MJ_POWER,
+                                        TopDeviceObject,
+                                        NULL,
+                                        0,
+                                        NULL,
+                                        NULL);
     if (!Irp)
     {
         ExFreePool(RequestPowerItem);
-        ExFreePool(IoStatusBlock);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
   
@@ -395,7 +396,10 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject,
     if (MinorFunction == IRP_MN_WAIT_WAKE)
         Stack->Parameters.WaitWake.PowerState = PowerState.SystemState;
     else
-        Stack->Parameters.WaitWake.PowerState = PowerState.DeviceState;
+    {
+        Stack->Parameters.Power.Type = DevicePowerState;
+        Stack->Parameters.Power.State = PowerState;
+    }
   
     RequestPowerItem->CompletionRoutine = CompletionFunction;
     RequestPowerItem->PowerState = PowerState;
@@ -636,3 +640,138 @@ NtSetThreadExecutionState(IN EXECUTION_STATE esFlags,
     /* All is good */
     return STATUS_SUCCESS;
 }
+
+NTSTATUS
+NTAPI
+NtSetSystemPowerState(IN POWER_ACTION SystemAction,
+                             IN SYSTEM_POWER_STATE MinSystemState,
+                             IN ULONG Flags)
+{
+    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
+    POP_POWER_ACTION Action = {0};
+    NTSTATUS Status;
+
+    /* Check for invalid parameter combinations */
+    if ((MinSystemState >= PowerSystemMaximum) ||
+        (MinSystemState <= PowerSystemUnspecified) ||
+        (SystemAction > PowerActionWarmEject) ||
+        (SystemAction < PowerActionReserved) ||
+        (Flags & ~(POWER_ACTION_QUERY_ALLOWED  |  
+                   POWER_ACTION_UI_ALLOWED     | 
+                   POWER_ACTION_OVERRIDE_APPS  | 
+                   POWER_ACTION_LIGHTEST_FIRST | 
+                   POWER_ACTION_LOCK_CONSOLE   | 
+                   POWER_ACTION_DISABLE_WAKES  | 
+                   POWER_ACTION_CRITICAL)))
+    {
+        DPRINT1("NtSetSystemPowerState: Bad parameters!\n");
+        DPRINT1("                       SystemAction: 0x%x\n", SystemAction);
+        DPRINT1("                       MinSystemState: 0x%x\n", MinSystemState);
+        DPRINT1("                       Flags: 0x%x\n", Flags);
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Check for user caller */
+    if (PreviousMode != KernelMode)
+    {
+        /* Check for shutdown permission */
+        if (!SeSinglePrivilegeCheck(SeShutdownPrivilege, PreviousMode))
+        {
+            /* Not granted */
+            DPRINT1("ERROR: Privilege not held for shutdown\n");
+            //return STATUS_PRIVILEGE_NOT_HELD; HACK!
+        }
+
+        /* Do it as a kernel-mode caller for consistency with system state */
+        return ZwSetSystemPowerState (SystemAction, MinSystemState, Flags);
+    }
+
+    /* Read policy settings (partial shutdown vs. full shutdown) */
+    if (SystemAction == PowerActionShutdown) PopReadShutdownPolicy();
+
+    /* Disable lazy flushing of registry */
+    DPRINT1("Stopping lazy flush\n");
+    CmSetLazyFlushState(FALSE);
+
+    /* Setup the power action */
+    Action.Action = SystemAction;
+    Action.Flags = Flags;
+
+    /* Notify callbacks */
+    DPRINT1("Notifying callbacks\n");
+    ExNotifyCallback(PowerStateCallback, (PVOID)3, NULL);
+    /* Swap in any worker thread stacks */
+    DPRINT1("Swapping worker threads\n");
+    ExSwapinWorkerThreads(FALSE);
+    
+    /* Make our action global */
+    PopAction = Action;
+
+    /* Start power loop */
+    Status = STATUS_CANCELLED;
+    while (TRUE)
+    {
+        /* Break out if there's nothing to do */
+        if (Action.Action == PowerActionNone) break;
+
+        /* Check for first-pass or restart */
+        if (Status == STATUS_CANCELLED)
+        {
+            /* Check for shutdown action */
+            if ((PopAction.Action == PowerActionShutdown) ||
+                (PopAction.Action == PowerActionShutdownReset) ||
+                (PopAction.Action == PowerActionShutdownOff))
+            {
+                /* Set the action */
+                PopAction.Shutdown = TRUE;
+            }
+
+            /* Now we are good to go */
+            Status = STATUS_SUCCESS;
+        }
+
+        /* Check if we're still in an invalid status */
+        if (!NT_SUCCESS(Status)) break;
+
+        /* Flush all volumes and the registry */
+        DPRINT1("Flushing volumes\n");
+        PopFlushVolumes(PopAction.Shutdown);
+
+        /* Set IRP for drivers */
+        PopAction.IrpMinor = IRP_MN_SET_POWER;
+        if (PopAction.Shutdown)
+        {
+            DPRINT1("Queueing shutdown thread\n");
+            /* Check if we are running in the system context */
+            if (PsGetCurrentProcess() != PsInitialSystemProcess)
+            {
+                /* We're not, so use a worker thread for shutdown */
+                ExInitializeWorkItem(&PopShutdownWorkItem,
+                                     &PopGracefulShutdown,
+                                     NULL);
+
+                ExQueueWorkItem(&PopShutdownWorkItem, CriticalWorkQueue);
+                                
+                /* Spend us -- when we wake up, the system is good to go down */
+                KeSuspendThread(KeGetCurrentThread());
+                Status = STATUS_SYSTEM_SHUTDOWN;
+                goto Exit;
+
+            }
+            else
+            {
+                /* Do the shutdown inline */
+                PopGracefulShutdown(NULL);
+            }
+        }
+        
+        /* You should not have made it this far */
+        ASSERT(FALSE && "System is still up and running?!");
+        break;
+    }
+
+Exit:
+    /* We're done, return */
+    return Status;
+}
index 27895d3..ffb894c 100644 (file)
@@ -206,7 +206,7 @@ PspAssignPrimaryToken(IN PEPROCESS Process,
 
     /* Dereference Tokens and Return */
     if (NT_SUCCESS(Status)) ObDereferenceObject(OldToken);
-    if (AccessToken) ObDereferenceObject(NewToken);
+    if (!AccessToken) ObDereferenceObject(NewToken);
     return Status;
 }
 
@@ -965,32 +965,32 @@ NtImpersonateThread(IN HANDLE ThreadHandle,
 
     /* Reference the thread */
     Status = ObReferenceObjectByHandle(ThreadHandle,
-                                       THREAD_IMPERSONATE,
+                                       THREAD_DIRECT_IMPERSONATION,
                                        PsThreadType,
                                        PreviousMode,
                                        (PVOID*)&Thread,
                                        NULL);
-    if(NT_SUCCESS(Status))
+    if (NT_SUCCESS(Status))
     {
         /* Reference the impersonating thead */
         Status = ObReferenceObjectByHandle(ThreadToImpersonateHandle,
-                                           THREAD_DIRECT_IMPERSONATION,
+                                           THREAD_IMPERSONATE,
                                            PsThreadType,
                                            PreviousMode,
                                            (PVOID*)&ThreadToImpersonate,
                                            NULL);
-        if(NT_SUCCESS(Status))
+        if (NT_SUCCESS(Status))
         {
             /* Create a client security context */
             Status = SeCreateClientSecurity(ThreadToImpersonate,
                                             SecurityQualityOfService,
                                             0,
                                             &ClientContext);
-            if(NT_SUCCESS(Status))
+            if (NT_SUCCESS(Status))
             {
                 /* Do the impersonation */
                 SeImpersonateClient(&ClientContext, Thread);
-                if(ClientContext.ClientToken)
+                if (ClientContext.ClientToken)
                 {
                     /* Dereference the client token if we had one */
                     ObDereferenceObject(ClientContext.ClientToken);
index fdee097..38b1274 100644 (file)
@@ -279,6 +279,7 @@ SeDefaultObjectMethod(IN PVOID Object,
     return STATUS_SUCCESS;
 }
 
+ULONG SidInTokenCalls = 0;
 
 static BOOLEAN
 SepSidInToken(PACCESS_TOKEN _Token,
@@ -289,6 +290,9 @@ SepSidInToken(PACCESS_TOKEN _Token,
 
     PAGED_CODE();
 
+    SidInTokenCalls++;
+    if (!(SidInTokenCalls % 10000)) DPRINT1("SidInToken Calls: %d\n", SidInTokenCalls);
+    
     if (Token->UserAndGroupCount == 0)
     {
         return FALSE;
@@ -298,7 +302,7 @@ SepSidInToken(PACCESS_TOKEN _Token,
     {
         if (RtlEqualSid(Sid, Token->UserAndGroups[i].Sid))
         {
-            if (Token->UserAndGroups[i].Attributes & SE_GROUP_ENABLED)
+            if ((i == 0)|| (Token->UserAndGroups[i].Attributes & SE_GROUP_ENABLED))
             {
                 return TRUE;
             }
@@ -470,7 +474,16 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
             SeUnlockSubjectContext(SubjectSecurityContext);
         }
 
-        *GrantedAccess = DesiredAccess;
+        if (DesiredAccess & MAXIMUM_ALLOWED)
+        {
+            *GrantedAccess = GenericMapping->GenericAll;
+            *GrantedAccess |= (DesiredAccess & ~MAXIMUM_ALLOWED);
+        }
+        else
+        {
+            *GrantedAccess = DesiredAccess | PreviouslyGrantedAccess;
+        }
+        
         *AccessStatus = STATUS_SUCCESS;
         return TRUE;
     }
@@ -691,6 +704,27 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
         return STATUS_SUCCESS;
     }
 
+    /* Protect probe in SEH */
+    _SEH2_TRY
+    {
+        /* Probe all pointers */
+        ProbeForRead(GenericMapping, sizeof(GENERIC_MAPPING), sizeof(ULONG));
+        ProbeForRead(PrivilegeSetLength, sizeof(ULONG), sizeof(ULONG));
+        ProbeForWrite(PrivilegeSet, *PrivilegeSetLength, sizeof(ULONG));
+        ProbeForWrite(GrantedAccess, sizeof(ACCESS_MASK), sizeof(ULONG));
+        ProbeForWrite(AccessStatus, sizeof(NTSTATUS), sizeof(ULONG));
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        /* Return the exception code */
+        _SEH2_YIELD(return _SEH2_GetExceptionCode());
+    }
+    _SEH2_END;
+
+    /* Check for unmapped access rights */
+    if (DesiredAccess & (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL))
+        return STATUS_GENERIC_NOT_MAPPED;
+
     /* Reference the token */
     Status = ObReferenceObjectByHandle(TokenHandle,
                                        TOKEN_QUERY,
@@ -709,7 +743,15 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
     {
         DPRINT1("No impersonation token\n");
         ObDereferenceObject(Token);
-        return STATUS_ACCESS_DENIED;
+        return STATUS_NO_IMPERSONATION_TOKEN;
+    }
+
+    /* Check the impersonation level */
+    if (Token->ImpersonationLevel < SecurityIdentification)
+    {
+        DPRINT1("Impersonation level < SecurityIdentification\n");
+        ObDereferenceObject(Token);
+        return STATUS_BAD_IMPERSONATION_LEVEL;
     }
 
     /* Set up the subject context, and lock it */
index 38e5012..44481d6 100644 (file)
@@ -22,6 +22,9 @@
 POBJECT_TYPE SepTokenObjectType = NULL;
 ERESOURCE SepTokenLock;
 
+TOKEN_SOURCE SeSystemTokenSource = {"*SYSTEM*", {0}};
+LUID SeSystemAuthenticationId = SYSTEM_LUID;
+
 static GENERIC_MAPPING SepTokenMapping = {TOKEN_READ,
     TOKEN_WRITE,
     TOKEN_EXECUTE,
@@ -244,7 +247,7 @@ SepDuplicateToken(PTOKEN Token,
                             (PVOID*)&AccessToken);
     if (!NT_SUCCESS(Status))
     {
-        DPRINT1("ObCreateObject() failed (Status %lx)\n");
+        DPRINT1("ObCreateObject() failed (Status %lx)\n", Status);
         return(Status);
     }
 
@@ -510,34 +513,80 @@ SeAssignPrimaryToken(IN PEPROCESS Process,
     ObInitializeFastReference(&Process->Token, Token);
 }
 
-PTOKEN
+
+NTSTATUS
 NTAPI
-SepCreateSystemProcessToken(VOID)
-{
-    NTSTATUS Status;
-    ULONG uSize;
-    ULONG i;
-    ULONG uLocalSystemLength;
-    ULONG uWorldLength;
-    ULONG uAuthUserLength;
-    ULONG uAdminsLength;
+SepCreateToken(OUT PHANDLE TokenHandle,
+              IN KPROCESSOR_MODE PreviousMode,
+              IN ACCESS_MASK DesiredAccess,
+              IN POBJECT_ATTRIBUTES ObjectAttributes,
+              IN TOKEN_TYPE TokenType,
+              IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
+              IN PLUID AuthenticationId,
+              IN PLARGE_INTEGER ExpirationTime,
+              IN PSID_AND_ATTRIBUTES User,
+              IN ULONG GroupCount,
+              IN PSID_AND_ATTRIBUTES Groups,
+              IN ULONG GroupLength,
+              IN ULONG PrivilegeCount,
+              IN PLUID_AND_ATTRIBUTES Privileges,
+              IN PSID Owner,
+              IN PSID PrimaryGroup,
+              IN PACL DefaultDacl,
+              IN PTOKEN_SOURCE TokenSource,
+              IN BOOLEAN SystemToken)
+{                  
     PTOKEN AccessToken;
-    PVOID SidArea;
+    LUID TokenId;
+    LUID ModifiedId;
+    PVOID EndMem;
+    ULONG uLength;
+    ULONG i;
+    NTSTATUS Status;
+    ULONG TokenFlags = 0;
     
-    PAGED_CODE();
+    /* Loop all groups */
+    for (i = 0; i < GroupCount; i++)
+    {
+        /* Check for mandatory groups */
+        if (Groups[i].Attributes & SE_GROUP_MANDATORY)
+        {
+            /* Force them to be enabled */
+            Groups[i].Attributes |= (SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT);
+        }
+        
+        /* Check of the group is an admin group */
+        if (RtlEqualSid(SeAliasAdminsSid, Groups[i].Sid))
+        {
+            /* Remember this so we can optimize queries later */
+            TokenFlags |= TOKEN_HAS_ADMIN_GROUP;
+        }
+    }
     
-    uLocalSystemLength = RtlLengthSid(SeLocalSystemSid);
-    uWorldLength       = RtlLengthSid(SeWorldSid);
-    uAuthUserLength    = RtlLengthSid(SeAuthenticatedUserSid);
-    uAdminsLength      = RtlLengthSid(SeAliasAdminsSid);
+    /* Loop all privileges */
+    for (i = 0; i < PrivilegeCount; i++)
+    {
+        /* For optimization, check for change notify and impersonate rights */
+        if (((RtlEqualLuid(&Privileges[i].Luid, &SeChangeNotifyPrivilege)) &&
+            (Privileges[i].Attributes & SE_PRIVILEGE_ENABLED)))
+        {
+            /* Remember token has traverse */
+            TokenFlags |= TOKEN_HAS_TRAVERSE_PRIVILEGE;
+        }
+    }
+
+    Status = ZwAllocateLocallyUniqueId(&TokenId);
+    if (!NT_SUCCESS(Status))
+        return(Status);
     
-    /*
-     * Initialize the token
-     */
-    Status = ObCreateObject(KernelMode,
+    Status = ZwAllocateLocallyUniqueId(&ModifiedId);
+    if (!NT_SUCCESS(Status))
+        return(Status);
+    
+    Status = ObCreateObject(PreviousMode,
                             SepTokenObjectType,
-                            NULL,
-                            KernelMode,
+                            ObjectAttributes,
+                            PreviousMode,
                             NULL,
                             sizeof(TOKEN),
                             0,
@@ -545,180 +594,279 @@ SepCreateSystemProcessToken(VOID)
                             (PVOID*)&AccessToken);
     if (!NT_SUCCESS(Status))
     {
-        return NULL;
+        DPRINT1("ObCreateObject() failed (Status %lx)\n");
+        return(Status);
     }
 
     /* Zero out the buffer */
     RtlZeroMemory(AccessToken, sizeof(TOKEN));
     
-    Status = ExpAllocateLocallyUniqueId(&AccessToken->TokenId);
-    if (!NT_SUCCESS(Status))
-    {
-        ObDereferenceObject(AccessToken);
-        return NULL;
-    }
+    AccessToken->TokenLock = &SepTokenLock;
     
-    Status = ExpAllocateLocallyUniqueId(&AccessToken->ModifiedId);
-    if (!NT_SUCCESS(Status))
-    {
-        ObDereferenceObject(AccessToken);
-        return NULL;
-    }
+    RtlCopyLuid(&AccessToken->TokenSource.SourceIdentifier,
+                &TokenSource->SourceIdentifier);
+    memcpy(AccessToken->TokenSource.SourceName,
+           TokenSource->SourceName,
+           sizeof(TokenSource->SourceName));
     
-    Status = ExpAllocateLocallyUniqueId(&AccessToken->AuthenticationId);
-    if (!NT_SUCCESS(Status))
-    {
-        ObDereferenceObject(AccessToken);
-        return NULL;
-    }
+    RtlCopyLuid(&AccessToken->TokenId, &TokenId);
+    RtlCopyLuid(&AccessToken->AuthenticationId, AuthenticationId);
+    AccessToken->ExpirationTime = *ExpirationTime;
+    RtlCopyLuid(&AccessToken->ModifiedId, &ModifiedId);
     
-    AccessToken->TokenLock = &SepTokenLock;
+    AccessToken->UserAndGroupCount = GroupCount + 1;
+    AccessToken->PrivilegeCount = PrivilegeCount;
     
-    AccessToken->TokenType = TokenPrimary;
-    AccessToken->ImpersonationLevel = SecurityDelegation;
-    memcpy(AccessToken->TokenSource.SourceName, "SeMgr\0\0\0", 8);
-    AccessToken->ExpirationTime.QuadPart = -1;
-    AccessToken->UserAndGroupCount = 4;
+    AccessToken->TokenFlags = TokenFlags;
+    AccessToken->TokenType = TokenType;
+    AccessToken->ImpersonationLevel = ImpersonationLevel;
     
-    uSize = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount;
-    uSize += uLocalSystemLength;
-    uSize += uWorldLength;
-    uSize += uAuthUserLength;
-    uSize += uAdminsLength;
+    /*
+     * Normally we would just point these members into the variable information
+     * area; however, our ObCreateObject() call can't allocate a variable information
+     * area, so we allocate them seperately and provide a destroy function.
+     */
+    
+    uLength = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount;
+    uLength += RtlLengthSid(User);
+    for (i = 0; i < GroupCount; i++)
+        uLength += RtlLengthSid(Groups[i].Sid);
     
     AccessToken->UserAndGroups =
     (PSID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool,
-                                               uSize,
+                                               uLength,
                                                'uKOT');
-    SidArea = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount];
     
-    i = 0;
-    AccessToken->UserAndGroups[i].Sid = (PSID) SidArea;
-    AccessToken->UserAndGroups[i++].Attributes = 0;
-    RtlCopySid(uLocalSystemLength, SidArea, SeLocalSystemSid);
-    SidArea = (char*)SidArea + uLocalSystemLength;
-    
-    AccessToken->DefaultOwnerIndex = i;
-    AccessToken->UserAndGroups[i].Sid = (PSID) SidArea;
-    AccessToken->PrimaryGroup = (PSID) SidArea;
-    AccessToken->UserAndGroups[i++].Attributes = SE_GROUP_ENABLED|SE_GROUP_ENABLED_BY_DEFAULT;
-    Status = RtlCopySid(uAdminsLength, SidArea, SeAliasAdminsSid);
-    SidArea = (char*)SidArea + uAdminsLength;
-    
-    AccessToken->UserAndGroups[i].Sid = (PSID) SidArea;
-    AccessToken->UserAndGroups[i++].Attributes = SE_GROUP_ENABLED|SE_GROUP_ENABLED_BY_DEFAULT|SE_GROUP_MANDATORY;
-    RtlCopySid(uWorldLength, SidArea, SeWorldSid);
-    SidArea = (char*)SidArea + uWorldLength;
-    
-    AccessToken->UserAndGroups[i].Sid = (PSID) SidArea;
-    AccessToken->UserAndGroups[i++].Attributes = SE_GROUP_ENABLED|SE_GROUP_ENABLED_BY_DEFAULT|SE_GROUP_MANDATORY;
-    RtlCopySid(uAuthUserLength, SidArea, SeAuthenticatedUserSid);
-    SidArea = (char*)SidArea + uAuthUserLength;
-    
-    AccessToken->PrivilegeCount = 20;
-    
-    uSize = AccessToken->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES);
-    AccessToken->Privileges =
-    (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool,
-                                                uSize,
-                                                'pKOT');
+    EndMem = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount];
     
-    i = 0;
-    AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
-    AccessToken->Privileges[i++].Luid = SeTcbPrivilege;
+    Status = RtlCopySidAndAttributesArray(1,
+                                          User,
+                                          uLength,
+                                          AccessToken->UserAndGroups,
+                                          EndMem,
+                                          &EndMem,
+                                          &uLength);
+    if (NT_SUCCESS(Status))
+    {
+        Status = RtlCopySidAndAttributesArray(GroupCount,
+                                              Groups,
+                                              uLength,
+                                              &AccessToken->UserAndGroups[1],
+                                              EndMem,
+                                              &EndMem,
+                                              &uLength);
+    }
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeCreateTokenPrivilege;
+    if (NT_SUCCESS(Status))
+    {
+        Status = SepFindPrimaryGroupAndDefaultOwner(
+                                                    AccessToken,
+                                                    PrimaryGroup,
+                                                    Owner);
+    }
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeTakeOwnershipPrivilege;
+    if (NT_SUCCESS(Status))
+    {
+        uLength = PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES);
+        AccessToken->Privileges =
+        (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool,
+                                                    uLength,
+                                                    'pKOT');
+        
+        if (PreviousMode != KernelMode)
+        {
+            _SEH2_TRY
+            {
+                RtlCopyMemory(AccessToken->Privileges,
+                              Privileges,
+                              PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES));
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                Status = _SEH2_GetExceptionCode();
+            }
+            _SEH2_END;
+        }
+        else
+        {
+            RtlCopyMemory(AccessToken->Privileges,
+                          Privileges,
+                          PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES));
+        }
+    }
     
-    AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
-    AccessToken->Privileges[i++].Luid = SeCreatePagefilePrivilege;
+    if (NT_SUCCESS(Status))
+    {
+        AccessToken->DefaultDacl =
+        (PACL) ExAllocatePoolWithTag(PagedPool,
+                                     DefaultDacl->AclSize,
+                                     'kDOT');
+        memcpy(AccessToken->DefaultDacl,
+               DefaultDacl,
+               DefaultDacl->AclSize);
+    }
     
-    AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
-    AccessToken->Privileges[i++].Luid = SeLockMemoryPrivilege;
+    if (!SystemToken)
+    {
+        
+        Status = ObInsertObject ((PVOID)AccessToken,
+                                 NULL,
+                                 DesiredAccess,
+                                 0,
+                                 NULL,
+                                 TokenHandle);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("ObInsertObject() failed (Status %lx)\n", Status);
+        }
+    }
+    else
+    {
+        /* Return pointer instead of handle */
+        *TokenHandle = (HANDLE)AccessToken;
+    }
+
+    return Status;
+}
+
+PTOKEN
+NTAPI
+SepCreateSystemProcessToken(VOID)
+{
+    LUID_AND_ATTRIBUTES Privileges[25];
+    ULONG GroupAttributes, OwnerAttributes;
+    SID_AND_ATTRIBUTES Groups[32];
+    LARGE_INTEGER Expiration;
+    SID_AND_ATTRIBUTES UserSid;
+    ULONG GroupLength;
+    PSID PrimaryGroup;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    PSID Owner;
+    ULONG i;
+    PTOKEN Token;
+    NTSTATUS Status;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeAssignPrimaryTokenPrivilege;
+    /* Don't ever expire */
+    Expiration.QuadPart = -1;
+    
+    /* All groups mandatory and enabled */
+    GroupAttributes = SE_GROUP_ENABLED | SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT;
+    OwnerAttributes = SE_GROUP_ENABLED | SE_GROUP_OWNER | SE_GROUP_ENABLED_BY_DEFAULT;
+    
+    /* User is system */
+    UserSid.Sid = SeLocalSystemSid;
+    UserSid.Attributes = 0;
+    
+    /* Primary group is local system */
+    PrimaryGroup = SeLocalSystemSid;
+    
+    /* Owner is admins */
+    Owner = SeAliasAdminsSid;
+    
+    /* Groups are admins, world, and authenticated users */
+    Groups[0].Sid = SeAliasAdminsSid;
+    Groups[0].Attributes = OwnerAttributes;
+    Groups[1].Sid = SeWorldSid;
+    Groups[1].Attributes = GroupAttributes;
+    Groups[2].Sid = SeAuthenticatedUserSid;
+    Groups[2].Attributes = OwnerAttributes;
+    GroupLength = sizeof(SID_AND_ATTRIBUTES) +
+                  SeLengthSid(Groups[0].Sid) +
+                  SeLengthSid(Groups[1].Sid) +
+                  SeLengthSid(Groups[2].Sid);
+    ASSERT(GroupLength <= sizeof(Groups));
+
+    /* Setup the privileges */
+    i = 0;
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED;
+    Privileges[i++].Luid = SeTcbPrivilege;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeIncreaseQuotaPrivilege;
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeCreateTokenPrivilege;
     
-    AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
-    AccessToken->Privileges[i++].Luid = SeIncreaseBasePriorityPrivilege;
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeTakeOwnershipPrivilege;
     
-    AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
-    AccessToken->Privileges[i++].Luid = SeCreatePermanentPrivilege;
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+    Privileges[i++].Luid = SeCreatePagefilePrivilege;
     
-    AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
-    AccessToken->Privileges[i++].Luid = SeDebugPrivilege;
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+    Privileges[i++].Luid = SeLockMemoryPrivilege;
     
-    AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
-    AccessToken->Privileges[i++].Luid = SeAuditPrivilege;
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeAssignPrimaryTokenPrivilege;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeSecurityPrivilege;
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeIncreaseQuotaPrivilege;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeSystemEnvironmentPrivilege;
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+    Privileges[i++].Luid = SeIncreaseBasePriorityPrivilege;
     
-    AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
-    AccessToken->Privileges[i++].Luid = SeChangeNotifyPrivilege;
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+    Privileges[i++].Luid = SeCreatePermanentPrivilege;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeBackupPrivilege;
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+    Privileges[i++].Luid = SeDebugPrivilege;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeRestorePrivilege;
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+    Privileges[i++].Luid = SeAuditPrivilege;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeShutdownPrivilege;
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeSecurityPrivilege;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeLoadDriverPrivilege;
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeSystemEnvironmentPrivilege;
     
-    AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
-    AccessToken->Privileges[i++].Luid = SeProfileSingleProcessPrivilege;
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+    Privileges[i++].Luid = SeChangeNotifyPrivilege;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeSystemtimePrivilege;
-#if 0
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeUndockPrivilege;
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeBackupPrivilege;
     
-    AccessToken->Privileges[i].Attributes = 0;
-    AccessToken->Privileges[i++].Luid = SeManageVolumePrivilege;
-#endif
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeRestorePrivilege;
     
-    ASSERT(i == 20);
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeShutdownPrivilege;
     
-    uSize = sizeof(ACL);
-    uSize += sizeof(ACE) + uLocalSystemLength;
-    uSize += sizeof(ACE) + uAdminsLength;
-    uSize = (uSize & (~3)) + 8;
-    AccessToken->DefaultDacl =
-    (PACL) ExAllocatePoolWithTag(PagedPool,
-                                 uSize,
-                                 'kDOT');
-    Status = RtlCreateAcl(AccessToken->DefaultDacl, uSize, ACL_REVISION);
-    if ( NT_SUCCESS(Status) )
-    {
-        Status = RtlAddAccessAllowedAce(AccessToken->DefaultDacl, ACL_REVISION, GENERIC_ALL, SeLocalSystemSid);
-    }
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeLoadDriverPrivilege;
     
-    if ( NT_SUCCESS(Status) )
-    {
-        Status = RtlAddAccessAllowedAce(AccessToken->DefaultDacl, ACL_REVISION, GENERIC_READ|GENERIC_WRITE|GENERIC_EXECUTE|READ_CONTROL, SeAliasAdminsSid);
-    }
+    Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED;
+    Privileges[i++].Luid = SeProfileSingleProcessPrivilege;
     
-    if ( ! NT_SUCCESS(Status) )
-    {
-        ObDereferenceObject(AccessToken);
-        return NULL;
-    }
+    Privileges[i].Attributes = 0;
+    Privileges[i++].Luid = SeSystemtimePrivilege;
+    ASSERT(i == 20);
     
-    return AccessToken;
+    /* Setup the object attributes */
+    InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
+    ASSERT(SeSystemDefaultDacl != NULL);
+    
+    /* Create the token */
+    Status = SepCreateToken((PHANDLE)&Token,
+                            KernelMode,
+                            0,
+                            &ObjectAttributes,
+                            TokenPrimary,
+                            0,
+                            &SeSystemAuthenticationId,
+                            &Expiration,
+                            &UserSid,
+                            3,
+                            Groups,
+                            GroupLength,
+                            20,
+                            Privileges,
+                            Owner,
+                            PrimaryGroup,
+                            SeSystemDefaultDacl,
+                            &SeSystemTokenSource,
+                            TRUE);
+    ASSERT(Status == STATUS_SUCCESS);
+    
+    /* Return the token */
+    return Token;
 }
 
 /* PUBLIC FUNCTIONS ***********************************************************/
@@ -1920,7 +2068,8 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle,
     return Status;
 }
 
-NTSTATUS NTAPI
+NTSTATUS
+NTAPI
 NtCreateToken(OUT PHANDLE TokenHandle,
               IN ACCESS_MASK DesiredAccess,
               IN POBJECT_ATTRIBUTES ObjectAttributes,
@@ -1936,12 +2085,6 @@ NtCreateToken(OUT PHANDLE TokenHandle,
               IN PTOKEN_SOURCE TokenSource)
 {
     HANDLE hToken;
-    PTOKEN AccessToken;
-    LUID TokenId;
-    LUID ModifiedId;
-    PVOID EndMem;
-    ULONG uLength;
-    ULONG i;
     KPROCESSOR_MODE PreviousMode;
     ULONG nTokenPrivileges = 0;
     LARGE_INTEGER LocalExpirationTime = {{0, 0}};
@@ -1996,148 +2139,25 @@ NtCreateToken(OUT PHANDLE TokenHandle,
         LocalExpirationTime = *ExpirationTime;
     }
     
-    Status = ZwAllocateLocallyUniqueId(&TokenId);
-    if (!NT_SUCCESS(Status))
-        return(Status);
-    
-    Status = ZwAllocateLocallyUniqueId(&ModifiedId);
-    if (!NT_SUCCESS(Status))
-        return(Status);
-    
-    Status = ObCreateObject(PreviousMode,
-                            SepTokenObjectType,
-                            ObjectAttributes,
+    Status = SepCreateToken(&hToken,
                             PreviousMode,
-                            NULL,
-                            sizeof(TOKEN),
-                            0,
-                            0,
-                            (PVOID*)&AccessToken);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("ObCreateObject() failed (Status %lx)\n");
-        return(Status);
-    }
-
-    /* Zero out the buffer */
-    RtlZeroMemory(AccessToken, sizeof(TOKEN));
-    
-    AccessToken->TokenLock = &SepTokenLock;
-    
-    RtlCopyLuid(&AccessToken->TokenSource.SourceIdentifier,
-                &TokenSource->SourceIdentifier);
-    memcpy(AccessToken->TokenSource.SourceName,
-           TokenSource->SourceName,
-           sizeof(TokenSource->SourceName));
-    
-    RtlCopyLuid(&AccessToken->TokenId, &TokenId);
-    RtlCopyLuid(&AccessToken->AuthenticationId, AuthenticationId);
-    AccessToken->ExpirationTime = *ExpirationTime;
-    RtlCopyLuid(&AccessToken->ModifiedId, &ModifiedId);
-    
-    AccessToken->UserAndGroupCount = TokenGroups->GroupCount + 1;
-    AccessToken->PrivilegeCount    = TokenPrivileges->PrivilegeCount;
-    
-    AccessToken->TokenType = TokenType;
-    AccessToken->ImpersonationLevel = ((PSECURITY_QUALITY_OF_SERVICE)
-                                       (ObjectAttributes->SecurityQualityOfService))->ImpersonationLevel;
-    
-    /*
-     * Normally we would just point these members into the variable information
-     * area; however, our ObCreateObject() call can't allocate a variable information
-     * area, so we allocate them seperately and provide a destroy function.
-     */
-    
-    uLength = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount;
-    uLength += RtlLengthSid(TokenUser->User.Sid);
-    for (i = 0; i < TokenGroups->GroupCount; i++)
-        uLength += RtlLengthSid(TokenGroups->Groups[i].Sid);
-    
-    AccessToken->UserAndGroups =
-    (PSID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool,
-                                               uLength,
-                                               'uKOT');
-    
-    EndMem = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount];
-    
-    Status = RtlCopySidAndAttributesArray(1,
-                                          &TokenUser->User,
-                                          uLength,
-                                          AccessToken->UserAndGroups,
-                                          EndMem,
-                                          &EndMem,
-                                          &uLength);
-    if (NT_SUCCESS(Status))
-    {
-        Status = RtlCopySidAndAttributesArray(TokenGroups->GroupCount,
-                                              TokenGroups->Groups,
-                                              uLength,
-                                              &AccessToken->UserAndGroups[1],
-                                              EndMem,
-                                              &EndMem,
-                                              &uLength);
-    }
-    
-    if (NT_SUCCESS(Status))
-    {
-        Status = SepFindPrimaryGroupAndDefaultOwner(
-                                                    AccessToken,
-                                                    TokenPrimaryGroup->PrimaryGroup,
-                                                    TokenOwner->Owner);
-    }
-    
-    if (NT_SUCCESS(Status))
-    {
-        uLength = TokenPrivileges->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES);
-        AccessToken->Privileges =
-        (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool,
-                                                    uLength,
-                                                    'pKOT');
-        
-        if (PreviousMode != KernelMode)
-        {
-            _SEH2_TRY
-            {
-                RtlCopyMemory(AccessToken->Privileges,
-                              TokenPrivileges->Privileges,
-                              nTokenPrivileges * sizeof(LUID_AND_ATTRIBUTES));
-            }
-            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-            {
-                Status = _SEH2_GetExceptionCode();
-            }
-            _SEH2_END;
-        }
-        else
-        {
-            RtlCopyMemory(AccessToken->Privileges,
-                          TokenPrivileges->Privileges,
-                          nTokenPrivileges * sizeof(LUID_AND_ATTRIBUTES));
-        }
-    }
-    
-    if (NT_SUCCESS(Status))
-    {
-        AccessToken->DefaultDacl =
-        (PACL) ExAllocatePoolWithTag(PagedPool,
-                                     TokenDefaultDacl->DefaultDacl->AclSize,
-                                     'kDOT');
-        memcpy(AccessToken->DefaultDacl,
-               TokenDefaultDacl->DefaultDacl,
-               TokenDefaultDacl->DefaultDacl->AclSize);
-    }
-    
-    Status = ObInsertObject ((PVOID)AccessToken,
-                             NULL,
-                             DesiredAccess,
-                             0,
-                             NULL,
-                             &hToken);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("ObInsertObject() failed (Status %lx)\n", Status);
-    }
-    
+                            DesiredAccess,
+                            ObjectAttributes,
+                            TokenType,
+                            ((PSECURITY_QUALITY_OF_SERVICE)(ObjectAttributes->SecurityQualityOfService))->ImpersonationLevel,
+                            AuthenticationId,
+                            &LocalExpirationTime,
+                            &TokenUser->User,
+                            TokenGroups->GroupCount,
+                            TokenGroups->Groups,
+                            0, // FIXME: Should capture
+                            nTokenPrivileges,
+                            TokenPrivileges->Privileges,
+                            TokenOwner->Owner,
+                            TokenPrimaryGroup->PrimaryGroup,
+                            TokenDefaultDacl->DefaultDacl,
+                            TokenSource,
+                            FALSE);
     if (NT_SUCCESS(Status))
     {
         _SEH2_TRY
@@ -2165,9 +2185,9 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
                     IN ULONG HandleAttributes,
                     OUT PHANDLE TokenHandle)
 {
-    PETHREAD Thread;
+    PETHREAD Thread, NewThread;
     HANDLE hToken;
-    PTOKEN Token, NewToken, PrimaryToken;
+    PTOKEN Token, NewToken = NULL, PrimaryToken;
     BOOLEAN CopyOnOpen, EffectiveOnly;
     SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
     SE_IMPERSONATION_STATE ImpersonationState;
@@ -2215,12 +2235,11 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
         ObDereferenceObject(Thread);
         return STATUS_NO_TOKEN;
     }
-    
-    ObDereferenceObject(Thread);
-    
+       
     if (ImpersonationLevel == SecurityAnonymous)
     {
-        ObDereferenceObject(Token);
+        PsDereferenceImpersonationToken(Token);
+        ObDereferenceObject(Thread);
         return STATUS_CANT_OPEN_ANONYMOUS;
     }
     
@@ -2236,58 +2255,41 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
     if (CopyOnOpen)
     {
         Status = ObReferenceObjectByHandle(ThreadHandle, THREAD_ALL_ACCESS,
-                                           PsThreadType, PreviousMode,
-                                           (PVOID*)&Thread, NULL);
-        if (!NT_SUCCESS(Status))
-        {
-            ObDereferenceObject(Token);
-            if (OpenAsSelf)
-            {
-                PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState);
-            }
-            return Status;
-        }
-        
-        PrimaryToken = PsReferencePrimaryToken(Thread->ThreadsProcess);
-        Status = SepCreateImpersonationTokenDacl(Token, PrimaryToken, &Dacl);
-        ASSERT(FALSE);
-        ObDereferenceObject(PrimaryToken);
-        ObDereferenceObject(Thread);
-        if (!NT_SUCCESS(Status))
+                                           PsThreadType, KernelMode,
+                                           (PVOID*)&NewThread, NULL);
+        if (NT_SUCCESS(Status))
         {
-            ObDereferenceObject(Token);
-            if (OpenAsSelf)
+            PrimaryToken = PsReferencePrimaryToken(NewThread->ThreadsProcess);
+            
+            Status = SepCreateImpersonationTokenDacl(Token, PrimaryToken, &Dacl);
+
+            ObFastDereferenceObject(&NewThread->ThreadsProcess->Token, PrimaryToken);
+            
+            if (NT_SUCCESS(Status))
             {
-                PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState);
-            }
-            return Status;
-        }
-        
-        RtlCreateSecurityDescriptor(&SecurityDescriptor,
-                                    SECURITY_DESCRIPTOR_REVISION);
-        RtlSetDaclSecurityDescriptor(&SecurityDescriptor, TRUE, Dacl,
-                                     FALSE);
-        
-        InitializeObjectAttributes(&ObjectAttributes, NULL, HandleAttributes,
-                                   NULL, &SecurityDescriptor);
+                if (Dacl)
+                {
+                    RtlCreateSecurityDescriptor(&SecurityDescriptor,
+                                                SECURITY_DESCRIPTOR_REVISION);
+                    RtlSetDaclSecurityDescriptor(&SecurityDescriptor, TRUE, Dacl,
+                                                 FALSE);
+                }
         
-        Status = SepDuplicateToken(Token, &ObjectAttributes, EffectiveOnly,
-                                   TokenImpersonation, ImpersonationLevel,
-                                   KernelMode, &NewToken);
-        ExFreePool(Dacl);
-        if (!NT_SUCCESS(Status))
-        {
-            ObDereferenceObject(Token);
-            if (OpenAsSelf)
-            {
-                PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState);
+                InitializeObjectAttributes(&ObjectAttributes, NULL, HandleAttributes,
+                                           NULL, Dacl ? &SecurityDescriptor : NULL);
+            
+
+                Status = SepDuplicateToken(Token, &ObjectAttributes, EffectiveOnly,
+                                           TokenImpersonation, ImpersonationLevel,
+                                           KernelMode, &NewToken);
+                if (NT_SUCCESS(Status))
+                {
+                    ObReferenceObject(NewToken);
+                    Status = ObInsertObject(NewToken, NULL, DesiredAccess, 0, NULL,
+                                            &hToken);
+                }
             }
-            return Status;
         }
-        
-        Status = ObInsertObject(NewToken, NULL, DesiredAccess, 0, NULL,
-                                &hToken);
-        
     }
     else
     {
@@ -2296,13 +2298,24 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle,
                                        PreviousMode, &hToken);
     }
     
-    ObDereferenceObject(Token);
+    if (Dacl) ExFreePool(Dacl);
     
     if (OpenAsSelf)
     {
         PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState);
     }
     
+    ObDereferenceObject(Token);
+    
+    if (NT_SUCCESS(Status) && CopyOnOpen)
+    {
+        PsImpersonateClient(Thread, NewToken, FALSE, EffectiveOnly, ImpersonationLevel);
+    }
+    
+    if (NewToken) ObDereferenceObject(NewToken);
+
+    if (CopyOnOpen && NewThread) ObDereferenceObject(NewThread);
+
     if(NT_SUCCESS(Status))
     {
         _SEH2_TRY
index c26a6c1..1de2286 100644 (file)
@@ -916,7 +916,7 @@ CsrGetProcessLuid(HANDLE hProcess OPTIONAL,
     /* Now query the information */
     Status = NtQueryInformationToken(hToken,
                                      TokenStatistics,
-                                     &TokenStats,
+                                     TokenStats,
                                      Length,
                                      &Length);
 
index 1ddfac2..8c55942 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _CSRSRV_H
-#define _CSRSRV_H
+#pragma once
 
 /* PSDK/NDK Headers */
 #define NTOS_MODE_USER
@@ -364,5 +363,3 @@ CsrThreadRefcountZero(IN PCSR_THREAD CsrThread);
 NTSTATUS
 NTAPI
 CsrSetDirectorySecurity(IN HANDLE ObjectDirectory);
-
-#endif 
index ca7c632..ad71435 100644 (file)
@@ -157,7 +157,7 @@ CsrLocateThreadInProcess(IN PCSR_PROCESS CsrProcess OPTIONAL,
     NextEntry = ListHead->Flink;
 
     /* Start the Loop */
-    while (NextEntry != NextEntry)
+    while (NextEntry != ListHead)
     {
         /* Get Thread Entry */
         FoundThread = CONTAINING_RECORD(NextEntry, CSR_THREAD, Link);
index 20b17d0..fe5cdb9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _BASESRV_H_INCLUDED_
-#define _BASESRV_H_INCLUDED_
+#pragma once
 
 /* PSDK/NDK Headers */
 #include <stdio.h>
@@ -10,5 +9,3 @@
 
 #include <csr/server.h>
 #include <win/base.h>
-
-#endif /* ndef _BASESRV_H_INCLUDED_ */
index 7d475ec..53d9f8d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WINSRV_H_INCLUDED_
-#define _WINSRV_H_INCLUDED_
+#pragma once
 
 /* PSDK/NDK Headers */
 #include <stdio.h>
@@ -11,5 +10,3 @@
 #include <csr/server.h>
 #include <win/base.h>
 #include <win/windows.h>
-
-#endif /* ndef _WINSRV_H_INCLUDED_ */
@@ -9,7 +9,7 @@
 
 /* INCLUDES ******************************************************************/
 
-#include <csrss.h>
+#include <srv.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -8,27 +8,37 @@
 
 /* INCLUDES ******************************************************************/
 
-#include <csrss.h>
+#include <srv.h>
 
 #define NDEBUG
 #include <debug.h>
 
 #define LOCK   RtlEnterCriticalSection(&ProcessDataLock)
 #define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock)
+#define CsrAcquireProcessLock() LOCK
+#define CsrReleaseProcessLock() UNLOCK
 
 /* GLOBALS *******************************************************************/
 
 static ULONG NrProcess;
-static PCSRSS_PROCESS_DATA ProcessData[256];
+PCSRSS_PROCESS_DATA ProcessData[256];
 RTL_CRITICAL_SECTION ProcessDataLock;
+extern PCSRSS_PROCESS_DATA CsrRootProcess;
+extern LIST_ENTRY CsrThreadHashTable[256];
 
 /* FUNCTIONS *****************************************************************/
 
 VOID WINAPI CsrInitProcessData(VOID)
 {
+    ULONG i;
    RtlZeroMemory (ProcessData, sizeof ProcessData);
    NrProcess = sizeof ProcessData / sizeof ProcessData[0];
    RtlInitializeCriticalSection( &ProcessDataLock );
+   
+   CsrRootProcess = CsrCreateProcessData(NtCurrentTeb()->ClientId.UniqueProcess);
+   
+   /* Initialize the Thread Hash List */
+   for (i = 0; i < 256; i++) InitializeListHead(&CsrThreadHashTable[i]);
 }
 
 PCSRSS_PROCESS_DATA WINAPI CsrGetProcessData(HANDLE ProcessId)
@@ -89,8 +99,7 @@ PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId)
 
          /* using OpenProcess is not optimal due to HANDLE vs. DWORD PIDs... */
          Status = NtOpenProcess(&pProcessData->Process,
-                                PROCESS_DUP_HANDLE | PROCESS_VM_OPERATION |
-                                PROCESS_VM_WRITE | PROCESS_CREATE_THREAD | SYNCHRONIZE,
+                                PROCESS_ALL_ACCESS,
                                 &ObjectAttributes,
                                 &ClientId);
          if (!NT_SUCCESS(Status))
@@ -122,6 +131,9 @@ PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId)
       pProcessData->ShutdownLevel = 0x280;
       pProcessData->ShutdownFlags = 0;
    }
+   
+   pProcessData->ThreadCount = 0;
+   InitializeListHead(&pProcessData->ThreadList);
    return pProcessData;
 }
 
@@ -186,35 +198,6 @@ NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
    return STATUS_INVALID_PARAMETER;
 }
 
-NTSTATUS WINAPI
-CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context)
-{
-  UINT Hash;
-  PCSRSS_PROCESS_DATA pProcessData;
-  NTSTATUS Status = STATUS_SUCCESS;
-
-  LOCK;
-
-  for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++)
-    {
-      pProcessData = ProcessData[Hash];
-      while (NULL != pProcessData)
-        {
-          Status = EnumProc(pProcessData, Context);
-          if (STATUS_SUCCESS != Status)
-            {
-              UNLOCK;
-              return Status;
-            }
-          pProcessData = pProcessData->next;
-        }
-    }
-
-  UNLOCK;
-
-  return Status;
-}
-
 /**********************************************************************
  *     CSRSS API
  *********************************************************************/
@@ -255,10 +238,93 @@ CSR_API(CsrCreateProcess)
    return(STATUS_SUCCESS);
 }
 
+CSR_API(CsrSrvCreateThread)
+{
+    PCSR_THREAD CurrentThread;
+    HANDLE ThreadHandle;
+    NTSTATUS Status;
+    PCSRSS_PROCESS_DATA CsrProcess;
+    
+    Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
+    Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+
+    CurrentThread = NtCurrentTeb()->CsrClientThread;
+    CsrProcess = CurrentThread->Process;
+//    DPRINT1("Current thread: %p %p\n", CurrentThread, CsrProcess);
+//    DPRINT1("Request CID: %lx %lx %lx\n", 
+//            CsrProcess->ProcessId, 
+//            NtCurrentTeb()->ClientId.UniqueProcess,
+ //           Request->Data.CreateThreadRequest.ClientId.UniqueProcess);
+    
+    if (CsrProcess->ProcessId != Request->Data.CreateThreadRequest.ClientId.UniqueProcess)
+    {
+        if (Request->Data.CreateThreadRequest.ClientId.UniqueProcess == NtCurrentTeb()->ClientId.UniqueProcess)
+        {
+            return STATUS_SUCCESS;
+        }
+        
+        Status = CsrLockProcessByClientId(Request->Data.CreateThreadRequest.ClientId.UniqueProcess,
+                                          &CsrProcess);
+  //      DPRINT1("Found matching process: %p\n", CsrProcess);
+        if (!NT_SUCCESS(Status)) return Status;
+    }
+    
+//    DPRINT1("PIDs: %lx %lx\n", CurrentThread->Process->ProcessId, CsrProcess->ProcessId);
+//    DPRINT1("Thread handle is: %lx Process Handle is: %lx %lx\n",
+       //     Request->Data.CreateThreadRequest.ThreadHandle,
+     //       CurrentThread->Process->Process,
+   //         CsrProcess->Process);
+    Status = NtDuplicateObject(CsrProcess->Process,
+                               Request->Data.CreateThreadRequest.ThreadHandle,
+                               NtCurrentProcess(),
+                               &ThreadHandle,
+                               0,
+                               0,
+                               DUPLICATE_SAME_ACCESS);
+    //DPRINT1("Duplicate status: %lx\n", Status);
+    if (!NT_SUCCESS(Status))
+    {
+        Status = NtDuplicateObject(CurrentThread->Process->Process,
+                                   Request->Data.CreateThreadRequest.ThreadHandle,
+                                   NtCurrentProcess(),
+                                   &ThreadHandle,
+                                   0,
+                                   0,
+                                   DUPLICATE_SAME_ACCESS);
+       // DPRINT1("Duplicate status: %lx\n", Status);
+    }
+
+    Status = STATUS_SUCCESS; // hack
+    if (NT_SUCCESS(Status))
+    {
+        Status = CsrCreateThread(CsrProcess,
+                                     ThreadHandle,
+                                     &Request->Data.CreateThreadRequest.ClientId);
+       // DPRINT1("Create status: %lx\n", Status);
+    }
+
+    if (CsrProcess != CurrentThread->Process) CsrReleaseProcessLock();
+    
+    return Status;
+}
+
 CSR_API(CsrTerminateProcess)
 {
+   PLIST_ENTRY NextEntry;
+   PCSR_THREAD Thread;
    Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
    Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+   
+   NextEntry = ProcessData->ThreadList.Flink;
+   while (NextEntry != &ProcessData->ThreadList)
+   {
+        Thread = CONTAINING_RECORD(NextEntry, CSR_THREAD, Link);
+        NextEntry = NextEntry->Flink;
+        
+        CsrThreadRefcountZero(Thread);
+        
+   }
+   
 
    ProcessData->Terminated = TRUE;
    return STATUS_SUCCESS;
similarity index 98%
rename from reactos/subsystems/win32/csrss/api/user.c
rename to reactos/subsystems/win32/csrss/csrsrv/api/user.c
index d89e463..de4e49f 100644 (file)
@@ -11,7 +11,7 @@
 
 /* INCLUDES ******************************************************************/
 
-#include <csrss.h>
+#include <srv.h>
 
 #define NDEBUG
 #include <debug.h>
similarity index 82%
rename from reactos/subsystems/win32/csrss/api/wapi.c
rename to reactos/subsystems/win32/csrss/csrsrv/api/wapi.c
index 61ca693..88005c6 100644 (file)
@@ -10,7 +10,7 @@
 
 /* INCLUDES ******************************************************************/
 
-#include <csrss.h>
+#include <srv.h>
 
 #define NDEBUG
 
@@ -126,6 +126,7 @@ CsrpHandleConnectionRequest (PPORT_MESSAGE Request,
     HANDLE ServerPort = NULL, ServerThread = NULL;
     PCSRSS_PROCESS_DATA ProcessData = NULL;
     REMOTE_PORT_VIEW LpcRead;
+    CLIENT_ID ClientId;
     LpcRead.Length = sizeof(LpcRead);
     ServerPort = NULL;
 
@@ -169,19 +170,23 @@ CsrpHandleConnectionRequest (PPORT_MESSAGE Request,
 
     Status = RtlCreateUserThread(NtCurrentProcess(),
                                  NULL,
-                                 FALSE,
+                                 TRUE,
                                  0,
                                  0,
                                  0,
                                  (PTHREAD_START_ROUTINE)ClientConnectionThread,
                                  ServerPort,
                                  & ServerThread,
-                                 NULL);
+                                 &ClientId);
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("CSR: Unable to create server thread\n");
         return Status;
     }
+    
+    CsrAddStaticServerThread(ServerThread, &ClientId, 0);
+    
+    NtResumeThread(ServerThread, NULL);
 
     NtClose(ServerThread);
 
@@ -190,6 +195,53 @@ CsrpHandleConnectionRequest (PPORT_MESSAGE Request,
     return Status;
 }
 
+PCSR_THREAD
+NTAPI
+CsrConnectToUser(VOID)
+{
+    PTEB Teb = NtCurrentTeb();
+    PCSR_THREAD CsrThread;
+#if 0
+    NTSTATUS Status;
+    ANSI_STRING DllName;
+    UNICODE_STRING TempName;
+    HANDLE hUser32;
+    STRING StartupName;
+
+    /* Check if we didn't already find it */
+    if (!CsrClientThreadSetup)
+    {
+        /* Get the DLL Handle for user32.dll */
+        RtlInitAnsiString(&DllName, "user32");
+        RtlAnsiStringToUnicodeString(&TempName, &DllName, TRUE);
+        Status = LdrGetDllHandle(NULL,
+                                 NULL,
+                                 &TempName,
+                                 &hUser32);
+        RtlFreeUnicodeString(&TempName);
+
+        /* If we got teh handle, get the Client Thread Startup Entrypoint */
+        if (NT_SUCCESS(Status))
+        {
+            RtlInitAnsiString(&StartupName,"ClientThreadSetup");
+            Status = LdrGetProcedureAddress(hUser32,
+                                            &StartupName,
+                                            0,
+                                            (PVOID)&CsrClientThreadSetup);
+        }
+    }
+
+    /* Connect to user32 */
+    CsrClientThreadSetup();
+#endif
+    /* Save pointer to this thread in TEB */
+    CsrThread = CsrLocateThreadInProcess(NULL, &Teb->ClientId);
+    if (CsrThread) Teb->CsrClientThread = CsrThread;
+
+    /* Return it */
+    return CsrThread;
+}
+
 VOID
 WINAPI
 ClientConnectionThread(HANDLE ServerPort)
@@ -199,10 +251,20 @@ ClientConnectionThread(HANDLE ServerPort)
     PCSR_API_MESSAGE Request = (PCSR_API_MESSAGE)RawRequest;
     PCSR_API_MESSAGE Reply;
     PCSRSS_PROCESS_DATA ProcessData;
+    PCSR_THREAD ServerThread;
 
     DPRINT("CSR: %s called\n", __FUNCTION__);
+    
+    /* Connect to user32 */
+    while (!CsrConnectToUser())
+    {
+        /* Keep trying until we get a response */
+        NtCurrentTeb()->Win32ClientInfo[0] = 0;
+        //NtDelayExecution(FALSE, &TimeOut);
+    }
 
     /* Reply must be NULL at the first call to NtReplyWaitReceivePort */
+    ServerThread = NtCurrentTeb()->CsrClientThread;
     Reply = NULL;
 
     /* Loop and reply/wait for a new message */
@@ -271,7 +333,7 @@ ClientConnectionThread(HANDLE ServerPort)
         }
         if (ProcessData->Terminated)
         {
-            DPRINT1("Message %d: process %p already terminated\n",
+            DPRINT1("Message %d: process %d already terminated\n",
                     Request->Type, Request->Header.ClientId.UniqueProcess);
             continue;
         }
@@ -284,8 +346,17 @@ ClientConnectionThread(HANDLE ServerPort)
         }
         else
         {
+            PCSR_THREAD Thread;
+            PCSRSS_PROCESS_DATA Process = NULL;
+            
+            //DPRINT1("locate thread %lx/%lx\n", Request->Header.ClientId.UniqueProcess, Request->Header.ClientId.UniqueThread);
+            Thread = CsrLocateThreadByClientId(&Process, &Request->Header.ClientId);
+            //DPRINT1("Thread found: %p %p\n", Thread, Process);
+                                          
             /* Call the Handler */
+            if (Thread) NtCurrentTeb()->CsrClientThread = Thread;
             CsrApiCallHandler(ProcessData, Request);
+            if (Thread) NtCurrentTeb()->CsrClientThread = ServerThread;
         }
 
         /* Send back the reply */
diff --git a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild
new file mode 100644 (file)
index 0000000..3f00210
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<module name="csrsrv" type="nativedll" installbase="system32" installname="csrsrv.dll">
+       <importlibrary definition="csrsrv.spec" />
+       <include base="csrsrv">.</include>
+       <include base="csrss">.</include>
+       <include base="csrss">include</include>
+       <include base="ReactOS">include/reactos/subsys</include>
+       <library>ntdll</library>
+       <library>pseh</library>
+       <library>smdll</library>
+       <directory name="api">
+               <file>handle.c</file>
+               <file>process.c</file>
+               <file>user.c</file>
+               <file>wapi.c</file>
+       </directory>
+       <file>procsup.c</file>
+       <file>thredsup.c</file>
+       <file>init.c</file>
+       <pch>srv.h</pch>
+</module>
diff --git a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rc b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rc
new file mode 100644 (file)
index 0000000..658072d
--- /dev/null
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION   "ReactOS CSR Core Server\0"
+#define REACTOS_STR_INTERNAL_NAME      "csrsrv\0"
+#define REACTOS_STR_ORIGINAL_FILENAME  "csrsrv.dll\0"
+#include <reactos/version.rc>
diff --git a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.spec b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.spec
new file mode 100644 (file)
index 0000000..d3e7b64
--- /dev/null
@@ -0,0 +1,35 @@
+@ stdcall CsrAddStaticServerThread(ptr ptr long)
+;@ stdcall CsrCallServerFromServer(ptr ptr)
+;@ stdcall CsrConnectToUser()
+;@ stdcall CsrCreateProcess(ptr ptr ptr ptr long ptr)
+;@ stdcall CsrCreateRemoteThread(ptr ptr)
+@ stdcall CsrCreateThread(ptr ptr ptr)
+;@ stdcall CsrCreateWait(ptr ptr ptr ptr ptr ptr)
+;@ stdcall CsrDebugProcess(ptr)
+;@ stdcall CsrDebugProcessStop(ptr)
+;@ stdcall CsrDereferenceProcess(ptr)
+;@ stdcall CsrDereferenceThread(ptr)
+;@ stdcall CsrDereferenceWait(ptr)
+;@ stdcall CsrDestroyProcess(ptr long)
+;@ stdcall CsrDestroyThread(ptr)
+;@ stdcall CsrExecServerThread(ptr long)
+@ stdcall CsrGetProcessLuid(ptr ptr)
+@ stdcall CsrImpersonateClient(ptr)
+@ stdcall CsrLockProcessByClientId(ptr ptr)
+;@ stdcall CsrLockThreadByClientId(ptr ptr)
+;@ stdcall CsrMoveSatisfiedWait(ptr ptr)
+;@ stdcall CsrNotifyWait(ptr long ptr ptr)
+;@ stdcall CsrPopulateDosDevices()
+;@ stdcall CsrQueryApiPort()
+;@ stdcall CsrReferenceThread(ptr)
+@ stdcall CsrRevertToSelf()
+@ stdcall CsrServerInitialization(long ptr)
+;@ stdcall CsrSetBackgroundPriority(ptr)
+;@ stdcall CsrSetCallingSpooler(long)
+;@ stdcall CsrSetForegroundPriority(ptr)
+;@ stdcall CsrShutdownProcesses(ptr long)
+;@ stdcall CsrUnhandledExceptionFilter(ptr)
+@ stdcall CsrUnlockProcess(ptr)
+;@ stdcall CsrUnlockThread(ptr)
+;@ stdcall CsrValidateMessageBuffer(ptr ptr long long)
+;@ stdcall CsrValidateMessageString(ptr ptr)
similarity index 80%
rename from reactos/subsystems/win32/csrss/init.c
rename to reactos/subsystems/win32/csrss/csrsrv/init.c
index 4097118..51adb2c 100644 (file)
-/* $Id$
- *
- * reactos/subsys/csrss/init.c
- *
- * Initialize the CSRSS subsystem server process.
- *
- * ReactOS Operating System
- *
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS CSR Sub System
+ * FILE:            subsys/csr/csrsrv/init.c
+ * PURPOSE:         CSR Server DLL Initialization
+ * PROGRAMMERS:     ReactOS Portable Systems Group
  */
 
-/* INCLUDES ******************************************************************/
-
-#include <csrss.h>
+/* INCLUDES *******************************************************************/
 
+#include "srv.h"
 #define NDEBUG
 #include <debug.h>
 
-/* GLOBALS ******************************************************************/
+/* DATA ***********************************************************************/
 
 HANDLE CsrHeap = (HANDLE) 0;
-
 HANDLE CsrObjectDirectory = (HANDLE) 0;
-
 UNICODE_STRING CsrDirectoryName;
-
 extern HANDLE CsrssApiHeap;
-
 static unsigned InitCompleteProcCount;
 static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL;
-
 static unsigned HardErrorProcCount;
 static CSRPLUGIN_HARDERROR_PROC *HardErrorProcs = NULL;
-
 HANDLE hSbApiPort = (HANDLE) 0;
-
 HANDLE hBootstrapOk = (HANDLE) 0;
-
 HANDLE hSmApiPort = (HANDLE) 0;
-
 HANDLE hApiPort = (HANDLE) 0;
 
-/**********************************************************************
- * CsrpAddInitCompleteProc/1
- */
+/* PRIVATE FUNCTIONS **********************************************************/
+
+ULONG
+InitializeVideoAddressSpace(VOID)
+{
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    UNICODE_STRING PhysMemName = RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
+    NTSTATUS Status;
+    HANDLE PhysMemHandle;
+    PVOID BaseAddress;
+    LARGE_INTEGER Offset;
+    SIZE_T ViewSize;
+    CHAR IVTAndBda[1024+256];
+
+    /* Open the physical memory section */
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &PhysMemName,
+                               0,
+                               NULL,
+                               NULL);
+    Status = ZwOpenSection(&PhysMemHandle,
+                           SECTION_ALL_ACCESS,
+                           &ObjectAttributes);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Couldn't open \\Device\\PhysicalMemory\n");
+        return 0;
+    }
+
+    /* Map the BIOS and device registers into the address space */
+    Offset.QuadPart = 0xa0000;
+    ViewSize = 0x100000 - 0xa0000;
+    BaseAddress = (PVOID)0xa0000;
+    Status = ZwMapViewOfSection(PhysMemHandle,
+                                NtCurrentProcess(),
+                                &BaseAddress,
+                                0,
+                                ViewSize,
+                                &Offset,
+                                &ViewSize,
+                                ViewUnmap,
+                                0,
+                                PAGE_EXECUTE_READWRITE);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Couldn't map physical memory (%x)\n", Status);
+        ZwClose(PhysMemHandle);
+        return 0;
+    }
+
+    /* Close physical memory section handle */
+    ZwClose(PhysMemHandle);
+
+    if (BaseAddress != (PVOID)0xa0000)
+    {
+        DPRINT1("Couldn't map physical memory at the right address (was %x)\n",
+                BaseAddress);
+        return 0;
+    }
+
+    /* Allocate some low memory to use for the non-BIOS
+     * parts of the v86 mode address space
+     */
+    BaseAddress = (PVOID)0x1;
+    ViewSize = 0xa0000 - 0x1000;
+    Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
+                                     &BaseAddress,
+                                     0,
+                                     &ViewSize,
+                                     MEM_COMMIT,
+                                     PAGE_EXECUTE_READWRITE);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed to allocate virtual memory (Status %x)\n", Status);
+        return 0;
+    }
+    if (BaseAddress != (PVOID)0x0)
+    {
+        DPRINT1("Failed to allocate virtual memory at right address (was %x)\n",
+                BaseAddress);
+        return 0;
+    }
+
+    /* Get the real mode IVT and BDA from the kernel */
+    Status = NtVdmControl(VdmInitialize, IVTAndBda);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("NtVdmControl failed (status %x)\n", Status);
+        return 0;
+    }
+
+    /* Return success */
+    return 1;
+}
+
+
 static NTSTATUS FASTCALL
 CsrpAddInitCompleteProc(CSRPLUGIN_INIT_COMPLETE_PROC Proc)
 {
@@ -283,6 +364,7 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
 CSRSS_API_DEFINITION NativeDefinitions[] =
   {
     CSRSS_DEFINE_API(CREATE_PROCESS,               CsrCreateProcess),
+    CSRSS_DEFINE_API(CREATE_THREAD,                CsrSrvCreateThread),
     CSRSS_DEFINE_API(TERMINATE_PROCESS,            CsrTerminateProcess),
     CSRSS_DEFINE_API(CONNECT_PROCESS,              CsrConnectProcess),
     CSRSS_DEFINE_API(REGISTER_SERVICES_PROCESS,    CsrRegisterServicesProcess),
@@ -305,6 +387,8 @@ CsrpCreateListenPort (IN     LPWSTR  Name,
        NTSTATUS           Status = STATUS_SUCCESS;
        OBJECT_ATTRIBUTES  PortAttributes;
        UNICODE_STRING     PortName;
+    HANDLE ServerThread;
+    CLIENT_ID ClientId;
 
        DPRINT("CSR: %s called\n", __FUNCTION__);
 
@@ -327,14 +411,22 @@ CsrpCreateListenPort (IN     LPWSTR  Name,
        }
        Status = RtlCreateUserThread(NtCurrentProcess(),
                                NULL,
-                               FALSE,
+                               TRUE,
                                0,
                                0,
                                0,
                                (PTHREAD_START_ROUTINE) ListenThread,
                                *Port,
-                               NULL,
-                               NULL);
+                               &ServerThread,
+                               &ClientId);
+    
+    if (ListenThread == (PVOID)ClientConnectionThread)
+    {
+        CsrAddStaticServerThread(ServerThread, &ClientId, 0);
+    }
+    
+    NtResumeThread(ServerThread, NULL);
+    NtClose(ServerThread);
        return Status;
 }
 
@@ -502,48 +594,6 @@ CsrpRegisterSubsystem (int argc, char ** argv, char ** envp)
        return Status;
 }
 
-/**********************************************************************
- *     EnvpToUnicodeString/2
- */
-static ULONG FASTCALL
-EnvpToUnicodeString (char ** envp, PUNICODE_STRING UnicodeEnv)
-{
-       ULONG        CharCount = 0;
-       ULONG        Index = 0;
-       ANSI_STRING  AnsiEnv;
-
-       UnicodeEnv->Buffer = NULL;
-
-       for (Index=0; NULL != envp[Index]; Index++)
-       {
-               CharCount += strlen (envp[Index]);
-               ++ CharCount;
-       }
-       ++ CharCount;
-
-       AnsiEnv.Buffer = RtlAllocateHeap (RtlGetProcessHeap(), 0, CharCount);
-       if (NULL != AnsiEnv.Buffer)
-       {
-
-               PCHAR WritePos = AnsiEnv.Buffer;
-
-               for (Index=0; NULL != envp[Index]; Index++)
-               {
-                       strcpy (WritePos, envp[Index]);
-                       WritePos += strlen (envp[Index]) + 1;
-               }
-
-      /* FIXME: the last (double) nullterm should perhaps not be included in Length
-       * but only in MaximumLength. -Gunnar */
-               AnsiEnv.Buffer [CharCount-1] = '\0';
-               AnsiEnv.Length             = CharCount;
-               AnsiEnv.MaximumLength      = CharCount;
-
-               RtlAnsiStringToUnicodeString (UnicodeEnv, & AnsiEnv, TRUE);
-               RtlFreeHeap (RtlGetProcessHeap(), 0, AnsiEnv.Buffer);
-       }
-       return CharCount;
-}
 /**********************************************************************
  *     CsrpLoadKernelModeDriver/3
  */
@@ -554,26 +604,26 @@ CsrpLoadKernelModeDriver (int argc, char ** argv, char ** envp)
        WCHAR           Data [MAX_PATH + 1];
        ULONG           DataLength = sizeof Data;
        ULONG           DataType = 0;
-       UNICODE_STRING  Environment;
+       //UNICODE_STRING  Environment;
 
 
-       DPRINT("SM: %s called\n", __FUNCTION__);
+       DPRINT1("SM: %s called\n", __FUNCTION__);
 
 
-       EnvpToUnicodeString (envp, & Environment);
+       //EnvpToUnicodeString (envp, & Environment);
        Status = SmLookupSubsystem (L"Kmode",
                                    Data,
                                    & DataLength,
                                    & DataType,
-                                   Environment.Buffer);
-       RtlFreeUnicodeString (& Environment);
+                                   NULL);
+       //RtlFreeUnicodeString (& Environment);
        if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0]))
        {
                WCHAR                      ImagePath [MAX_PATH + 1] = {0};
                UNICODE_STRING             ModuleName;
 
-               wcscpy (ImagePath, L"\\??\\");
-               wcscat (ImagePath, Data);
+               wcscpy (ImagePath, L"\\SYSTEMROOT\\system32\\win32k.sys");
+//             wcscat (ImagePath, Data);
                RtlInitUnicodeString (& ModuleName, ImagePath);
                Status = NtSetSystemInformation(/* FIXME: SystemLoadAndCallImage */
                                                SystemExtendServiceTableInformation,
@@ -581,7 +631,7 @@ CsrpLoadKernelModeDriver (int argc, char ** argv, char ** envp)
                                                sizeof ModuleName);
                if(!NT_SUCCESS(Status))
                {
-                       DPRINT("WIN: %s: loading Kmode failed (Status=0x%08lx)\n",
+                       DPRINT1("WIN: %s: loading Kmode failed (Status=0x%08lx)\n",
                                __FUNCTION__, Status);
                }
        }
@@ -707,22 +757,12 @@ struct {
        {TRUE, CsrpRunWinlogon,          "run WinLogon"},
 };
 
-/**********************************************************************
- * NAME
- *     CsrServerInitialization
- *
- * DESCRIPTION
- *     Initialize the Win32 environment subsystem server.
- *
- * RETURN VALUE
- *     TRUE: Initialization OK; otherwise FALSE.
- */
-BOOL WINAPI
-CsrServerInitialization (
-       int argc,
-       char ** argv,
-       char ** envp
-       )
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+NTSTATUS
+NTAPI
+CsrServerInitialization(ULONG ArgumentCount,
+                        PCHAR Arguments[])
 {
        UINT       i = 0;
        NTSTATUS  Status = STATUS_SUCCESS;
@@ -731,7 +771,7 @@ CsrServerInitialization (
 
        for (i=0; i < (sizeof InitRoutine / sizeof InitRoutine[0]); i++)
        {
-               Status = InitRoutine[i].EntryPoint(argc,argv,envp);
+               Status = InitRoutine[i].EntryPoint(ArgumentCount,Arguments,NULL);
                if(!NT_SUCCESS(Status))
                {
                        DPRINT1("CSR: %s: failed to %s (Status=%08lx)\n",
@@ -747,9 +787,23 @@ CsrServerInitialization (
        if (CallInitComplete())
        {
                Status = SmCompleteSession (hSmApiPort,hSbApiPort,hApiPort);
-               return TRUE;
+               return STATUS_SUCCESS;
        }
-       return FALSE;
+    
+       return STATUS_UNSUCCESSFUL;
+}
+
+BOOL
+NTAPI
+DllMainCRTStartup(HANDLE hDll,
+                  DWORD dwReason,
+                  LPVOID lpReserved)
+{
+    /* We don't do much */
+    UNREFERENCED_PARAMETER(hDll);
+    UNREFERENCED_PARAMETER(dwReason);
+    UNREFERENCED_PARAMETER(lpReserved);
+    return TRUE;
 }
 
 /* EOF */
diff --git a/reactos/subsystems/win32/csrss/csrsrv/procsup.c b/reactos/subsystems/win32/csrss/csrsrv/procsup.c
new file mode 100644 (file)
index 0000000..d139d97
--- /dev/null
@@ -0,0 +1,447 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS CSR Sub System
+ * FILE:            subsys/csr/csrsrv/procsup.c
+ * PURPOSE:         CSR Process Management
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ *                  Alex Ionescu
+ */
+/* INCLUDES *******************************************************************/
+
+#include <srv.h>
+
+#define NDEBUG
+#include <debug.h>
+
+#define LOCK   RtlEnterCriticalSection(&ProcessDataLock)
+#define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock)
+#define CsrHeap RtlGetProcessHeap()
+
+#define CsrAcquireProcessLock() LOCK
+#define CsrReleaseProcessLock() UNLOCK
+
+/* GLOBALS ********************************************************************/
+
+extern RTL_CRITICAL_SECTION ProcessDataLock;
+extern PCSRSS_PROCESS_DATA ProcessData[256];
+PCSRSS_PROCESS_DATA CsrRootProcess;
+LIST_ENTRY CsrThreadHashTable[256];
+SECURITY_QUALITY_OF_SERVICE CsrSecurityQos =
+{
+    sizeof(SECURITY_QUALITY_OF_SERVICE),
+    SecurityImpersonation,
+    SECURITY_STATIC_TRACKING,
+    FALSE
+};
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+NTAPI
+CsrSetToNormalPriority(VOID)
+{
+    KPRIORITY BasePriority = (8 + 1) + 4;
+
+    /* Set the Priority */
+    NtSetInformationProcess(NtCurrentProcess(),
+                            ProcessBasePriority,
+                            &BasePriority,
+                            sizeof(KPRIORITY));
+}
+
+VOID
+NTAPI
+CsrSetToShutdownPriority(VOID)
+{
+    KPRIORITY SetBasePriority = (8 + 1) + 6;
+    BOOLEAN Old;
+
+    /* Get the shutdown privilege */
+    if (NT_SUCCESS(RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE,
+                                      TRUE,
+                                      FALSE,
+                                      &Old)))
+    {
+        /* Set the Priority */
+        NtSetInformationProcess(NtCurrentProcess(),
+                                ProcessBasePriority,
+                                &SetBasePriority,
+                                sizeof(KPRIORITY));
+    }
+}
+
+NTSTATUS
+NTAPI
+CsrGetProcessLuid(HANDLE hProcess OPTIONAL,
+                  PLUID Luid)
+{
+    HANDLE hToken = NULL;
+    NTSTATUS Status;
+    ULONG Length;
+    PTOKEN_STATISTICS TokenStats;
+
+    /* Check if we have a handle to a CSR Process */
+    if (!hProcess)
+    {
+        /* We don't, so try opening the Thread's Token */
+        Status = NtOpenThreadToken(NtCurrentThread(),
+                                   TOKEN_QUERY,
+                                   FALSE,
+                                   &hToken);
+
+        /* Check for success */
+        if (!NT_SUCCESS(Status))
+        {
+            /* If we got some other failure, then return and quit */
+            if (Status != STATUS_NO_TOKEN) return Status;
+
+            /* We don't have a Thread Token, use a Process Token */
+            hProcess = NtCurrentProcess();
+            hToken = NULL;
+        }
+    }
+
+    /* Check if we have a token by now */
+    if (!hToken)
+    {
+        /* No token yet, so open the Process Token */
+        Status = NtOpenProcessToken(hProcess,
+                                    TOKEN_QUERY,
+                                    &hToken);
+        if (!NT_SUCCESS(Status))
+        {
+            /* Still no token, return the error */
+            return Status;
+        }
+    }
+
+    /* Now get the size we'll need for the Token Information */
+    Status = NtQueryInformationToken(hToken,
+                                     TokenStatistics,
+                                     NULL,
+                                     0,
+                                     &Length);
+
+    /* Allocate memory for the Token Info */
+    if (!(TokenStats = RtlAllocateHeap(CsrHeap, 0, Length)))
+    {
+        /* Fail and close the token */
+        NtClose(hToken);
+        return STATUS_NO_MEMORY;
+    }
+
+    /* Now query the information */
+    Status = NtQueryInformationToken(hToken,
+                                     TokenStatistics,
+                                     TokenStats,
+                                     Length,
+                                     &Length);
+
+    /* Close the handle */
+    NtClose(hToken);
+
+    /* Check for success */
+    if (NT_SUCCESS(Status))
+    {
+        /* Return the LUID */
+        *Luid = TokenStats->AuthenticationId;
+    }
+
+    /* Free the query information */
+    RtlFreeHeap(CsrHeap, 0, TokenStats);
+
+    /* Return the Status */
+    return Status;
+}
+
+BOOLEAN
+NTAPI
+CsrImpersonateClient(IN PCSR_THREAD CsrThread)
+{
+    NTSTATUS Status;
+    PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread;
+
+    /* Use the current thread if none given */
+    if (!CsrThread) CsrThread = CurrentThread;
+
+    /* Still no thread, something is wrong */
+    if (!CsrThread)
+    {
+        /* Failure */
+        return FALSE;
+    }
+
+    /* Make the call */
+    Status = NtImpersonateThread(NtCurrentThread(),
+                                 CsrThread->ThreadHandle,
+                                 &CsrSecurityQos);
+
+    if (!NT_SUCCESS(Status))
+    {
+        /* Failure */
+        return FALSE;
+    }
+
+    /* Increase the impersonation count for the current thread */
+    if (CurrentThread) ++CurrentThread->ImpersonationCount;
+
+    /* Return Success */
+    return TRUE;
+}
+
+BOOLEAN
+NTAPI
+CsrRevertToSelf(VOID)
+{
+    NTSTATUS Status;
+    PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread;
+    HANDLE ImpersonationToken = NULL;
+
+    /* Check if we have a Current Thread */
+    if (CurrentThread)
+    {
+        /* Make sure impersonation is on */
+        if (!CurrentThread->ImpersonationCount)
+        {
+            return FALSE;
+        }
+        else if (--CurrentThread->ImpersonationCount > 0)
+        {
+            /* Success; impersonation count decreased but still not zero */
+            return TRUE;
+        }
+    }
+
+    /* Impersonation has been totally removed, revert to ourselves */
+    Status = NtSetInformationThread(NtCurrentThread(),
+                                    ThreadImpersonationToken,
+                                    &ImpersonationToken,
+                                    sizeof(HANDLE));
+
+    /* Return TRUE or FALSE */
+    return NT_SUCCESS(Status);
+}
+
+PCSRSS_PROCESS_DATA
+NTAPI
+FindProcessForShutdown(IN PLUID CallerLuid)
+{
+    ULONG Hash;
+    PCSRSS_PROCESS_DATA CsrProcess, ReturnCsrProcess = NULL;
+    NTSTATUS Status;
+    ULONG Level = 0;
+    LUID ProcessLuid;
+    LUID SystemLuid = SYSTEM_LUID;
+    BOOLEAN IsSystemLuid = FALSE, IsOurLuid = FALSE;
+    
+    for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++)
+    {
+        /* Get this process hash bucket */
+        CsrProcess = ProcessData[Hash];
+        while (CsrProcess)
+        {
+            /* Skip this process if it's already been processed*/
+            if (CsrProcess->Flags & CsrProcessSkipShutdown) goto Next;
+        
+            /* Get the LUID of this Process */
+            Status = CsrGetProcessLuid(CsrProcess->Process, &ProcessLuid);
+
+            /* Check if we didn't get access to the LUID */
+            if (Status == STATUS_ACCESS_DENIED)
+            {
+                /* FIXME:Check if we have any threads */
+            }
+            
+            if (!NT_SUCCESS(Status))
+            {
+                /* We didn't have access, so skip it */
+                CsrProcess->Flags |= CsrProcessSkipShutdown;
+                goto Next;
+            }
+            
+            /* Check if this is the System LUID */
+            if ((IsSystemLuid = RtlEqualLuid(&ProcessLuid, &SystemLuid)))
+            {
+                /* Mark this process */
+                CsrProcess->ShutdownFlags |= CsrShutdownSystem;
+            }
+            else if (!(IsOurLuid = RtlEqualLuid(&ProcessLuid, CallerLuid)))
+            {
+                /* Our LUID doesn't match with the caller's */
+                CsrProcess->ShutdownFlags |= CsrShutdownOther;
+            }
+            
+            /* Check if we're past the previous level */
+            if (CsrProcess->ShutdownLevel > Level)
+            {
+                /* Update the level */
+                Level = CsrProcess->ShutdownLevel;
+
+                /* Set the final process */
+                ReturnCsrProcess = CsrProcess;
+            }
+Next:
+            /* Next process */
+            CsrProcess = CsrProcess->next;
+        }
+    }
+    
+    /* Check if we found a process */
+    if (ReturnCsrProcess)
+    {
+        /* Skip this one next time */
+        ReturnCsrProcess->Flags |= CsrProcessSkipShutdown;
+    }
+    
+    return ReturnCsrProcess;
+}
+
+/* This is really "CsrShutdownProcess", mostly */
+NTSTATUS
+WINAPI
+CsrEnumProcesses(IN CSRSS_ENUM_PROCESS_PROC EnumProc,
+                 IN PVOID Context)
+{
+    PVOID* RealContext = (PVOID*)Context;
+    PLUID CallerLuid = RealContext[0];
+    PCSRSS_PROCESS_DATA CsrProcess = NULL;
+    NTSTATUS Status = STATUS_UNSUCCESSFUL;
+    BOOLEAN FirstTry;
+    ULONG Result = 0;
+    ULONG Hash;
+
+    /* Acquire process lock */
+    CsrAcquireProcessLock();
+
+    /* Start the loop */
+    for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++)
+    {
+        /* Get the Process */
+        CsrProcess = ProcessData[Hash];
+        while (CsrProcess)
+        {
+           /* Remove the skip flag, set shutdown flags to 0*/
+            CsrProcess->Flags &= ~CsrProcessSkipShutdown;
+            CsrProcess->ShutdownFlags = 0;
+
+            /* Move to the next */
+            CsrProcess = CsrProcess->next;
+        }
+    }
+
+    /* Set shudown Priority */
+    CsrSetToShutdownPriority();
+
+    /* Loop all processes */
+    //DPRINT1("Enumerating for LUID: %lx %lx\n", CallerLuid->HighPart, CallerLuid->LowPart);
+    
+    /* Start looping */
+    while (TRUE)
+    {
+        /* Find the next process to shutdown */
+        FirstTry = TRUE;
+        if (!(CsrProcess = FindProcessForShutdown(CallerLuid)))
+        {
+            /* Done, quit */
+            CsrReleaseProcessLock();
+            Status = STATUS_SUCCESS;
+            goto Quickie;
+        }
+
+LoopAgain:
+        /* Release the lock, make the callback, and acquire it back */
+        //DPRINT1("Found process: %lx\n", CsrProcess->ProcessId);
+        CsrReleaseProcessLock();
+        Result = (ULONG)EnumProc(CsrProcess, (PVOID)((ULONG_PTR)Context | FirstTry));
+        CsrAcquireProcessLock();
+
+        /* Check the result */
+        //DPRINT1("Result: %d\n", Result);
+        if (Result == CsrShutdownCsrProcess)
+        {
+            /* The callback unlocked the process */
+            break;
+        }
+        else if (Result == CsrShutdownNonCsrProcess)
+        {
+            /* A non-CSR process, the callback didn't touch it */
+            //continue;
+        }
+        else if (Result == CsrShutdownCancelled)
+        {
+            /* Shutdown was cancelled, unlock and exit */
+            CsrReleaseProcessLock();
+            Status = STATUS_CANCELLED;
+            goto Quickie;
+        }
+
+        /* No matches during the first try, so loop again */
+        if (FirstTry && Result == CsrShutdownNonCsrProcess)
+        {
+            FirstTry = FALSE;
+            goto LoopAgain;
+        }
+    }
+
+Quickie:
+    /* Return to normal priority */
+    CsrSetToNormalPriority();
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+CsrLockProcessByClientId(IN HANDLE Pid,
+                         OUT PCSRSS_PROCESS_DATA *CsrProcess OPTIONAL)
+{
+    ULONG Hash;
+    PCSRSS_PROCESS_DATA CurrentProcess = NULL;
+    NTSTATUS Status = STATUS_UNSUCCESSFUL;
+
+    /* Acquire the lock */
+    CsrAcquireProcessLock();
+
+    /* Start the loop */
+    for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++)
+    {
+        /* Get the Process */
+        CurrentProcess = ProcessData[Hash];
+        while (CurrentProcess)
+        {
+            /* Check for PID match */
+            if (CurrentProcess->ProcessId == Pid)
+            {
+                /* Get out of here with success */
+//                DPRINT1("Found %p for PID %lx\n", CurrentProcess, Pid);
+                Status = STATUS_SUCCESS;
+                goto Found;
+            }
+            
+            /* Move to the next */
+            CurrentProcess = CurrentProcess->next;
+        }
+    }
+    
+    /* Nothing found, release the lock */
+Found:
+    if (!CurrentProcess) CsrReleaseProcessLock();
+
+    /* Return the status and process */
+    if (CsrProcess) *CsrProcess = CurrentProcess;
+    return Status;
+}
+
+NTSTATUS
+NTAPI
+CsrUnlockProcess(IN PCSRSS_PROCESS_DATA CsrProcess)
+{
+    /* Dereference the process */
+    //CsrLockedDereferenceProcess(CsrProcess);
+
+    /* Release the lock and return */
+    CsrReleaseProcessLock();
+    return STATUS_SUCCESS;
+}
+
+/* EOF */
similarity index 71%
rename from reactos/subsystems/win32/csrss/csrss.h
rename to reactos/subsystems/win32/csrss/csrsrv/srv.h
index 447c2e0..cc11b70 100644 (file)
@@ -1,14 +1,16 @@
 /* PSDK/NDK Headers */
+#define NTOS_MODE_USER
 #include <stdio.h>
 #define WIN32_NO_STATUS
 #include <windows.h>
-#define NTOS_MODE_USER
+#include <winnt.h>
 #include <ndk/ntndk.h>
 
-#include <intrin.h>
+/* CSR Header */
+//#include <csr/server.h>
 
-/* Build Number */
-#include <reactos/buildno.h>
+/* PSEH for SEH Support */
+#include <pseh/pseh2.h>
 
 /* Subsystem Manager Header */
 #include <sm/helper.h>
@@ -17,5 +19,3 @@
 #include <api.h>
 #include <conio.h>
 #include <csrplugin.h>
-
-/* EOF */
diff --git a/reactos/subsystems/win32/csrss/csrsrv/thredsup.c b/reactos/subsystems/win32/csrss/csrsrv/thredsup.c
new file mode 100644 (file)
index 0000000..e893888
--- /dev/null
@@ -0,0 +1,306 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS CSR Sub System
+ * FILE:            subsys/csr/csrsrv/procsup.c
+ * PURPOSE:         CSR Process Management
+ * PROGRAMMERS:     ReactOS Portable Systems Group
+ *                  Alex Ionescu
+ */
+/* INCLUDES *******************************************************************/
+
+#include <srv.h>
+
+#define NDEBUG
+#include <debug.h>
+
+#define LOCK   RtlEnterCriticalSection(&ProcessDataLock)
+#define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock)
+#define CsrHeap RtlGetProcessHeap()
+#define CsrHashThread(t) \
+    (HandleToUlong(t)&(256 - 1))
+
+#define CsrAcquireProcessLock() LOCK
+#define CsrReleaseProcessLock() UNLOCK
+
+/* GLOBALS ********************************************************************/
+
+LIST_ENTRY CsrThreadHashTable[256];
+extern PCSRSS_PROCESS_DATA CsrRootProcess;
+extern RTL_CRITICAL_SECTION ProcessDataLock;
+extern PCSRSS_PROCESS_DATA ProcessData[256];
+
+/* FUNCTIONS ******************************************************************/
+
+PCSR_THREAD
+NTAPI
+CsrAllocateThread(IN PCSRSS_PROCESS_DATA CsrProcess)
+{
+    PCSR_THREAD CsrThread;
+
+    /* Allocate the structure */
+    CsrThread = RtlAllocateHeap(CsrHeap, HEAP_ZERO_MEMORY, sizeof(CSR_THREAD));
+    if (!CsrThread) return(NULL);
+
+    /* Reference the Thread and Process */
+    CsrThread->ReferenceCount++;
+   // CsrProcess->ReferenceCount++;
+
+    /* Set the Parent Process */
+    CsrThread->Process = CsrProcess;
+
+    /* Return Thread */
+    return CsrThread;
+}
+
+PCSR_THREAD
+NTAPI
+CsrLocateThreadByClientId(OUT PCSRSS_PROCESS_DATA *Process OPTIONAL,
+                          IN PCLIENT_ID ClientId)
+{
+    ULONG i;
+    PLIST_ENTRY ListHead, NextEntry;
+    PCSR_THREAD FoundThread;
+
+    /* Hash the Thread */
+    i = CsrHashThread(ClientId->UniqueThread);
+    
+    /* Set the list pointers */
+    ListHead = &CsrThreadHashTable[i];
+    NextEntry = ListHead->Flink;
+
+    /* Star the loop */
+    while (NextEntry != ListHead)
+    {
+        /* Get the thread */
+        FoundThread = CONTAINING_RECORD(NextEntry, CSR_THREAD, HashLinks);
+
+        /* Compare the CID */
+        if (FoundThread->ClientId.UniqueThread == ClientId->UniqueThread)
+        {
+            /* Match found, return the process */
+            *Process = FoundThread->Process;
+
+            /* Return thread too */
+//            DPRINT1("Found: %p %p\n", FoundThread, FoundThread->Process);
+            return FoundThread;
+        }
+
+        /* Next */
+        NextEntry = NextEntry->Flink;
+    }
+
+    /* Nothing found */
+    return NULL;
+}
+
+PCSR_THREAD
+NTAPI
+CsrLocateThreadInProcess(IN PCSRSS_PROCESS_DATA CsrProcess OPTIONAL,
+                         IN PCLIENT_ID Cid)
+{
+    PLIST_ENTRY ListHead, NextEntry;
+    PCSR_THREAD FoundThread = NULL;
+
+    /* Use the Root Process if none was specified */
+    if (!CsrProcess) CsrProcess = CsrRootProcess;
+
+    /* Save the List pointers */
+//    DPRINT1("Searching in: %p %d\n", CsrProcess, CsrProcess->ThreadCount);
+    ListHead = &CsrProcess->ThreadList;
+    NextEntry = ListHead->Flink;
+
+    /* Start the Loop */
+    while (NextEntry != ListHead)
+    {
+        /* Get Thread Entry */
+        FoundThread = CONTAINING_RECORD(NextEntry, CSR_THREAD, Link);
+
+        /* Check for TID Match */
+        if (FoundThread->ClientId.UniqueThread == Cid->UniqueThread) break;
+
+        /* Next entry */
+        NextEntry = NextEntry->Flink;
+    }
+
+    /* Return what we found */
+//    DPRINT1("Found: %p\n", FoundThread);
+    return FoundThread;
+}
+
+VOID
+NTAPI
+CsrInsertThread(IN PCSRSS_PROCESS_DATA Process,
+                IN PCSR_THREAD Thread)
+{
+    ULONG i;
+
+    /* Insert it into the Regular List */
+    InsertTailList(&Process->ThreadList, &Thread->Link);
+
+    /* Increase Thread Count */
+    Process->ThreadCount++;
+
+    /* Hash the Thread */
+    i = CsrHashThread(Thread->ClientId.UniqueThread);
+//    DPRINT1("TID %lx HASH: %lx\n", Thread->ClientId.UniqueThread, i);
+
+    /* Insert it there too */
+    InsertHeadList(&CsrThreadHashTable[i], &Thread->HashLinks);
+}
+
+VOID
+NTAPI
+CsrDeallocateThread(IN PCSR_THREAD CsrThread)
+{
+    /* Free the process object from the heap */
+    RtlFreeHeap(CsrHeap, 0, CsrThread);
+}
+
+VOID
+NTAPI
+CsrRemoveThread(IN PCSR_THREAD CsrThread)
+{
+    /* Remove it from the List */
+    RemoveEntryList(&CsrThread->Link);
+
+    /* Decreate the thread count of the process */
+    CsrThread->Process->ThreadCount--;
+
+    /* Remove it from the Hash List as well */
+    if (CsrThread->HashLinks.Flink) RemoveEntryList(&CsrThread->HashLinks);
+
+    /* Check if this is the last Thread */
+    if (!CsrThread->Process->ThreadCount)
+    {
+        /* Check if it's not already been marked for deletion */
+        if (!(CsrThread->Process->Flags & CsrProcessLastThreadTerminated))
+        {
+            /* Let everyone know this process is about to lose the thread */
+            //CsrThread->Process->Flags |= CsrProcessLastThreadTerminated;
+
+            /* Reference the Process */
+            //CsrLockedDereferenceProcess(CsrThread->Process);
+        }
+    }
+
+    /* Mark the thread for deletion */
+    CsrThread->Flags |= CsrThreadInTermination;
+}
+
+VOID
+NTAPI
+CsrThreadRefcountZero(IN PCSR_THREAD CsrThread)
+{
+    /* Remove this thread */
+    CsrRemoveThread(CsrThread);
+
+    /* Release the Process Lock */
+    //CsrReleaseProcessLock();
+
+    /* Close the NT Thread Handle */
+    if (CsrThread->ThreadHandle) NtClose(CsrThread->ThreadHandle);
+    
+    /* De-allocate the CSR Thread Object */
+    CsrDeallocateThread(CsrThread);
+
+    /* Remove a reference from the process */
+    //CsrDereferenceProcess(CsrProcess);
+}
+
+NTSTATUS
+NTAPI
+CsrCreateThread(IN PCSRSS_PROCESS_DATA CsrProcess,
+                IN HANDLE hThread,
+                IN PCLIENT_ID ClientId)
+{
+    NTSTATUS Status;
+    PCSR_THREAD CsrThread;
+    //PCSRSS_PROCESS_DATA CurrentProcess;
+    PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread;
+    CLIENT_ID CurrentCid;
+    KERNEL_USER_TIMES KernelTimes;
+
+//    DPRINT1("CSRSRV: %s called\n", __FUNCTION__);
+
+    /* Get the current thread and CID */
+    CurrentCid = CurrentThread->ClientId;
+//    DPRINT1("CALLER PID/TID: %lx/%lx\n", CurrentCid.UniqueProcess, CurrentCid.UniqueThread);
+
+    /* Acquire the Process Lock */
+    CsrAcquireProcessLock();
+#if 0
+    /* Get the current Process and make sure the Thread is valid with this CID */
+    CurrentThread = CsrLocateThreadByClientId(&CurrentProcess,
+                                              &CurrentCid);
+
+    /* Something is wrong if we get an empty thread back */
+    if (!CurrentThread)
+    {
+        DPRINT1("CSRSRV:%s: invalid thread!\n", __FUNCTION__);
+        CsrReleaseProcessLock();
+        return STATUS_THREAD_IS_TERMINATING;
+    }
+#endif
+    /* Get the Thread Create Time */
+    Status = NtQueryInformationThread(hThread,
+                                      ThreadTimes,
+                                      (PVOID)&KernelTimes,
+                                      sizeof(KernelTimes),
+                                      NULL);
+
+    /* Allocate a CSR Thread Structure */
+    if (!(CsrThread = CsrAllocateThread(CsrProcess)))
+    {
+        DPRINT1("CSRSRV:%s: out of memory!\n", __FUNCTION__);
+        CsrReleaseProcessLock();
+        return STATUS_NO_MEMORY;
+    }
+
+    /* Save the data we have */
+    CsrThread->CreateTime = KernelTimes.CreateTime;
+    CsrThread->ClientId = *ClientId;
+    CsrThread->ThreadHandle = hThread;
+    CsrThread->Flags = 0;
+
+    /* Insert the Thread into the Process */
+    CsrInsertThread(CsrProcess, CsrThread);
+
+    /* Release the lock and return */
+    CsrReleaseProcessLock();
+    return STATUS_SUCCESS;
+}
+
+PCSR_THREAD
+NTAPI
+CsrAddStaticServerThread(IN HANDLE hThread,
+                         IN PCLIENT_ID ClientId,
+                         IN ULONG ThreadFlags)
+{
+    PCSR_THREAD CsrThread;
+
+    /* Get the Lock */
+    CsrAcquireProcessLock();
+
+    /* Allocate the Server Thread */
+    if ((CsrThread = CsrAllocateThread(CsrRootProcess)))
+    {
+        /* Setup the Object */
+//        DPRINT1("New CSR thread created: %lx PID/TID: %lx/%lx\n", CsrThread, ClientId->UniqueProcess, ClientId->UniqueThread);
+        CsrThread->ThreadHandle = hThread;
+        CsrThread->ClientId = *ClientId;
+        CsrThread->Flags = ThreadFlags;
+
+        /* Insert it into the Thread List */
+        InsertTailList(&CsrRootProcess->ThreadList, &CsrThread->Link);
+
+        /* Increment the thread count */
+        CsrRootProcess->ThreadCount++;
+    }
+
+    /* Release the Process Lock and return */
+    CsrReleaseProcessLock();
+    return CsrThread;
+}
+
+/* EOF */
index 07027c7..c5f5745 100644 (file)
@@ -1,62 +1,70 @@
-/* $Id$
- *
- * csrss.c - Client/Server Runtime subsystem
- *
- * ReactOS Operating System
- *
- * --------------------------------------------------------------------
- *
- * 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.
- *
- * --------------------------------------------------------------------
+/*
+ * PROJECT:         ReactOS Client Server Runtime SubSystem (CSRSS)
+ * LICENSE:         BSD - See COPYING.ARM in root directory
+ * FILE:            subsystems/win32/csrss/csrss.c
+ * PURPOSE:         Main Executable Code
+ * PROGRAMMERS:     Alex Ionescu
+ *                  ReactOS Portable Systems Group
  */
 
-#include <csrss.h>
+/* INCLUDES *******************************************************************/
 
+#define WIN32_NO_STATUS
+#include <windows.h>
+#include <ndk/ntndk.h>
+#include <api.h>
 #define NDEBUG
 #include <debug.h>
 
-int _cdecl _main(int argc,
-                char *argv[],
-                char *envp[],
-                int DebugFlag)
+/* FUNCTIONS ******************************************************************/
+
+VOID
+NTAPI
+CsrpSetDefaultProcessHardErrorMode(VOID)
+{
+    ULONG DefaultHardErrorMode = 0;
+
+    /* Disable hard errors */
+    NtSetInformationProcess(NtCurrentProcess(),
+                            ProcessDefaultHardErrorMode,
+                            &DefaultHardErrorMode,
+                            sizeof(DefaultHardErrorMode));
+}
+
+int
+_cdecl
+_main(int argc,
+      char *argv[],
+      char *envp[],
+      int DebugFlag)
 {
-   NTSTATUS Status = STATUS_SUCCESS;
-
-   //PrintString("ReactOS Client/Server Run-Time (Build %s)\n",
-            //KERNEL_VERSION_BUILD_STR);
-
-   /*==================================================================
-    *  Initialize the Win32 environment subsystem server.
-    *================================================================*/
-   if (CsrServerInitialization (argc, argv, envp) == TRUE)
-     {
-       /*
-        * Terminate the current thread only.
-        */
-       Status = NtTerminateThread (NtCurrentThread(), 0);
-     }
-   else
-     {
-       DisplayString (L"CSR: CsrServerInitialization failed.\n");
-       /*
-        * Tell the SM we failed.
-        */
-       Status = NtTerminateProcess (NtCurrentProcess(), 0);
-     }
-   return (int) Status;
+    KPRIORITY BasePriority = (8 + 1) + 4;
+    NTSTATUS Status;
+
+    /* Set the Priority */
+    NtSetInformationProcess(NtCurrentProcess(),
+                            ProcessBasePriority,
+                            &BasePriority,
+                            sizeof(KPRIORITY));
+
+    /* Initialize CSR through CSRSRV */
+    Status = CsrServerInitialization(argc, argv);
+    if (!NT_SUCCESS(Status))
+    {
+        /* Kill us */
+        DPRINT1("CSRSS: CsrServerInitialization failed:% lx\n", Status);
+        NtTerminateProcess(NtCurrentProcess(), Status);
+    }
+
+    /* Disable errors */
+    CsrpSetDefaultProcessHardErrorMode();
+
+    /* If this is Session 0, make sure killing us bugchecks the system */
+    if (!NtCurrentPeb()->SessionId) RtlSetProcessIsCritical(TRUE, NULL, FALSE);
+
+    /* Kill this thread. CSRSRV keeps us going */
+    NtTerminateThread (NtCurrentThread(), Status);
+    return 0;
 }
 
 /* EOF */
index f3c9df8..438b2e6 100644 (file)
@@ -9,21 +9,14 @@
                <compilerflag compilerset="gcc">-fms-extensions</compilerflag>
                <library>nt</library>
                <library>ntdll</library>
-               <library>smdll</library>
-               <directory name="api">
-                       <file>handle.c</file>
-                       <file>process.c</file>
-                       <file>user.c</file>
-                       <file>wapi.c</file>
-               </directory>
-               <pch>csrss.h</pch>
+               <library>csrsrv</library>
                <file>csrss.c</file>
-               <file>init.c</file>
-               <file>print.c</file>
-               <file>video.c</file>
                <file>csrss.rc</file>
        </module>
        <directory name="win32csr">
                <xi:include href="win32csr/win32csr.rbuild" />
        </directory>
+       <directory name="csrsrv">
+               <xi:include href="csrsrv/csrsrv.rbuild" />
+       </directory>
 </group>
index 6e87fba..7fbf6db 100644 (file)
@@ -6,14 +6,44 @@
  * PURPOSE:         CSRSS API interface
  */
 
-#ifndef API_H_INCLUDED
-#define API_H_INCLUDED
+#pragma once
 
 #define NTOS_MODE_USER
 #include <ndk/ntndk.h>
 
 #include <csrss/csrss.h>
 
+typedef enum _CSR_THREAD_FLAGS
+{
+    CsrThreadAltertable = 0x1,
+    CsrThreadInTermination = 0x2,
+    CsrThreadTerminated = 0x4,
+    CsrThreadIsServerThread = 0x10
+} CSR_THREAD_FLAGS, *PCSR_THREAD_FLAGS;
+
+typedef enum _SHUTDOWN_RESULT
+{
+    CsrShutdownCsrProcess = 1,
+    CsrShutdownNonCsrProcess,
+    CsrShutdownCancelled
+} SHUTDOWN_RESULT, *PSHUTDOWN_RESULT;
+
+typedef enum _CSR_SHUTDOWN_FLAGS
+{
+    CsrShutdownSystem = 4,
+    CsrShutdownOther = 8
+} CSR_SHUTDOWN_FLAGS, *PCSR_SHUTDOWN_FLAGS;
+
+typedef enum _CSR_PROCESS_FLAGS
+{
+    CsrProcessTerminating = 0x1,
+    CsrProcessSkipShutdown = 0x2,
+    CsrProcessCreateNewGroup = 0x100,
+    CsrProcessTerminated = 0x200,
+    CsrProcessLastThreadTerminated = 0x400,
+    CsrProcessIsConsoleApp = 0x800
+} CSR_PROCESS_FLAGS, *PCSR_PROCESS_FLAGS;
+
 typedef struct Object_tt
 {
   LONG Type;
@@ -60,8 +90,25 @@ typedef struct _CSRSS_PROCESS_DATA
   LIST_ENTRY ProcessEntry;
   PCONTROLDISPATCHER CtrlDispatcher;
   BOOL Terminated;
+  ULONG Flags;
+  ULONG ThreadCount;
+  LIST_ENTRY ThreadList;
 } CSRSS_PROCESS_DATA, *PCSRSS_PROCESS_DATA;
 
+typedef struct _CSR_THREAD
+{
+    LARGE_INTEGER CreateTime;
+    LIST_ENTRY Link;
+    LIST_ENTRY HashLinks;
+    CLIENT_ID ClientId;
+    PCSRSS_PROCESS_DATA Process;
+    //struct _CSR_WAIT_BLOCK *WaitBlock;
+    HANDLE ThreadHandle;
+    ULONG Flags;
+    ULONG ReferenceCount;
+    ULONG ImpersonationCount;
+} CSR_THREAD, *PCSR_THREAD;
+
 typedef VOID (WINAPI *CSR_CLEANUP_OBJECT_PROC)(Object_t *Object);
 
 typedef struct tagCSRSS_OBJECT_DEFINITION
@@ -101,6 +148,7 @@ extern HANDLE hBootstrapOk;
 CSR_API(CsrConnectProcess);
 CSR_API(CsrCreateProcess);
 CSR_API(CsrTerminateProcess);
+CSR_API(CsrSrvCreateThread);
 
 /* print.c */
 VOID WINAPI DisplayString(LPCWSTR lpwString);
@@ -130,17 +178,26 @@ PCSRSS_PROCESS_DATA WINAPI CsrGetProcessData(HANDLE ProcessId);
 PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId);
 NTSTATUS WINAPI CsrFreeProcessData( HANDLE Pid );
 NTSTATUS WINAPI CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context);
+PCSR_THREAD NTAPI CsrAddStaticServerThread(IN HANDLE hThread, IN PCLIENT_ID ClientId, IN  ULONG ThreadFlags);
+PCSR_THREAD NTAPI CsrLocateThreadInProcess(IN PCSRSS_PROCESS_DATA CsrProcess OPTIONAL, IN PCLIENT_ID Cid);
+PCSR_THREAD NTAPI CsrLocateThreadByClientId(OUT PCSRSS_PROCESS_DATA *Process OPTIONAL, IN PCLIENT_ID ClientId);
+NTSTATUS NTAPI CsrLockProcessByClientId(IN HANDLE Pid, OUT PCSRSS_PROCESS_DATA *CsrProcess OPTIONAL);
+NTSTATUS NTAPI CsrCreateThread(IN PCSRSS_PROCESS_DATA CsrProcess, IN HANDLE hThread, IN PCLIENT_ID ClientId);
+NTSTATUS NTAPI CsrUnlockProcess(IN PCSRSS_PROCESS_DATA CsrProcess);
 
 /* api/handle.c */
 NTSTATUS FASTCALL CsrRegisterObjectDefinitions(PCSRSS_OBJECT_DEFINITION NewDefinitions);
 NTSTATUS WINAPI CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData, PHANDLE Handle, Object_t *Object, DWORD Access, BOOL Inheritable );
 NTSTATUS WINAPI CsrDuplicateHandleTable(PCSRSS_PROCESS_DATA SourceProcessData, PCSRSS_PROCESS_DATA TargetProcessData);
 NTSTATUS WINAPI CsrGetObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, Object_t **Object, DWORD Access );
-BOOL WINAPI CsrServerInitialization (int,char**,char**);
+NTSTATUS NTAPI CsrServerInitialization(ULONG ArgumentCount, PCHAR Arguments[]);
 NTSTATUS WINAPI CsrReleaseObjectByPointer(Object_t *Object);
 NTSTATUS WINAPI CsrReleaseObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object );
 NTSTATUS WINAPI CsrVerifyObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object );
 
+//hack
+VOID NTAPI CsrThreadRefcountZero(IN PCSR_THREAD CsrThread);
+
 CSR_API(CsrGetInputHandle);
 CSR_API(CsrGetOutputHandle);
 CSR_API(CsrCloseHandle);
@@ -157,8 +214,4 @@ CSR_API(CsrSetShutdownParameters);
 CSR_API(CsrSetLogonNotifyWindow);
 CSR_API(CsrRegisterLogonProcess);
 
-
-#endif /* ndef API_H_INCLUDED */
-
 /* EOF */
-
index fa6320f..35d7186 100644 (file)
@@ -6,8 +6,7 @@
  * PURPOSE:         CSRSS internal console I/O interface
  */
 
-#ifndef CONIO_H_INCLUDED
-#define CONIO_H_INCLUDED
+#pragma once
 
 #include "api.h"
 #include "win32csr.h"
@@ -176,8 +175,4 @@ CSR_API(CsrGetAllConsoleAliasesLength);
 CSR_API(CsrGetConsoleAliasesExes);
 CSR_API(CsrGetConsoleAliasesExesLength);
 
-
-#endif /* CONIO_H_INCLUDED */
-
 /* EOF */
-
index 90e158f..357b65b 100644 (file)
@@ -16,8 +16,7 @@
  * subsystem.
  */
 
-#ifndef CSRPLUGIN_H_INCLUDED
-#define CSRPLUGIN_H_INCLUDED
+#pragma once
 
 #include <windows.h>
 #include "api.h"
@@ -58,6 +57,4 @@ typedef BOOL (WINAPI *CSRPLUGIN_INITIALIZE_PROC)(PCSRSS_API_DEFINITION *ApiDefin
                                                   PCSRSS_EXPORTED_FUNCS Exports,
                                                   HANDLE CsrssApiHeap);
 
-#endif /* CSRPLUGIN_H_INCLUDED */
-
 /* EOF */
index b06a16c..737c2d1 100644 (file)
@@ -6,8 +6,7 @@
  * PURPOSE:         CSRSS internal desktop background window interface
  */
 
-#ifndef DESKTOPBG_H_INCLUDED
-#define DESKTOPBG_H_INCLUDED
+#pragma once
 
 #include "api.h"
 
@@ -19,7 +18,4 @@ CSR_API(CsrRegisterSystemClasses);
 
 BOOL FASTCALL DtbgIsDesktopVisible(VOID);
 
-#endif /* DESKTOPBG_H_INCLUDED */
-
 /* EOF */
-
index dae7093..6b7791f 100644 (file)
@@ -6,9 +6,7 @@
  * PURPOSE:         Interface to win32csr.dll
  */
 
-
-#ifndef WIN32CSR_H_INCLUDED
-#define WIN32CSR_H_INCLUDED
+#pragma once
 
 #include <windows.h>
 #include <commctrl.h>
@@ -38,6 +36,4 @@ NTSTATUS FASTCALL Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
 NTSTATUS FASTCALL Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
                                         PVOID Context);
 
-#endif /* WIN32CSR_H_INCLUDED */
-
 /* EOF */
diff --git a/reactos/subsystems/win32/csrss/print.c b/reactos/subsystems/win32/csrss/print.c
deleted file mode 100644 (file)
index 3e5949d..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $Id$
- *
- * smss.c - Session Manager
- *
- * ReactOS Operating System
- *
- * --------------------------------------------------------------------
- *
- * 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.
- *
- * --------------------------------------------------------------------
- *
- *     19990529 (Emanuele Aliberti)
- *             Compiled successfully with egcs 1.1.2
- */
-
-#include <csrss.h>
-
-#define NDEBUG
-#include <debug.h>
-
-VOID WINAPI DisplayString(LPCWSTR lpwString)
-{
-   UNICODE_STRING us;
-
-   RtlInitUnicodeString (&us, lpwString);
-   ZwDisplayString (&us);
-}
-
-VOID WINAPI PrintString (char* fmt, ...)
-{
-   char buffer[512];
-   va_list ap;
-   UNICODE_STRING UnicodeString;
-   ANSI_STRING AnsiString;
-
-   va_start(ap, fmt);
-   vsprintf(buffer, fmt, ap);
-   va_end(ap);
-
-   RtlInitAnsiString (&AnsiString, buffer);
-   RtlAnsiStringToUnicodeString (&UnicodeString,
-                                &AnsiString,
-                                TRUE);
-   NtDisplayString(&UnicodeString);
-   RtlFreeUnicodeString (&UnicodeString);
-}
-
-/* EOF */
diff --git a/reactos/subsystems/win32/csrss/video.c b/reactos/subsystems/win32/csrss/video.c
deleted file mode 100644 (file)
index 8282c15..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * PROJECT:         ReactOS Client/Server Runtime subsystem
- * LICENSE:         GPL v2 or later - See COPYING in the top level directory
- * FILE:            subsystems/win32/csrss/video.c
- * PURPOSE:         Video memory initialization.
- * PROGRAMMERS:     ReactOS Development Team
- */
-
-/* INCLUDES ******************************************************************/
-
-#include <csrss.h>
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS *****************************************************************/
-
-ULONG
-InitializeVideoAddressSpace(VOID)
-{
-    OBJECT_ATTRIBUTES ObjectAttributes;
-    UNICODE_STRING PhysMemName = RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
-    NTSTATUS Status;
-    HANDLE PhysMemHandle;
-    PVOID BaseAddress;
-    LARGE_INTEGER Offset;
-    SIZE_T ViewSize;
-    CHAR IVTAndBda[1024+256];
-
-    /* Open the physical memory section */
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &PhysMemName,
-                               0,
-                               NULL,
-                               NULL);
-    Status = ZwOpenSection(&PhysMemHandle,
-                           SECTION_ALL_ACCESS,
-                           &ObjectAttributes);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("Couldn't open \\Device\\PhysicalMemory\n");
-        return 0;
-    }
-
-    /* Map the BIOS and device registers into the address space */
-    Offset.QuadPart = 0xa0000;
-    ViewSize = 0x100000 - 0xa0000;
-    BaseAddress = (PVOID)0xa0000;
-    Status = ZwMapViewOfSection(PhysMemHandle,
-                                NtCurrentProcess(),
-                                &BaseAddress,
-                                0,
-                                ViewSize,
-                                &Offset,
-                                &ViewSize,
-                                ViewUnmap,
-                                0,
-                                PAGE_EXECUTE_READWRITE);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("Couldn't map physical memory (%x)\n", Status);
-        ZwClose(PhysMemHandle);
-        return 0;
-    }
-
-    /* Close physical memory section handle */
-    ZwClose(PhysMemHandle);
-
-    if (BaseAddress != (PVOID)0xa0000)
-    {
-        DPRINT1("Couldn't map physical memory at the right address (was %x)\n",
-                BaseAddress);
-        return 0;
-    }
-
-    /* Allocate some low memory to use for the non-BIOS
-     * parts of the v86 mode address space
-     */
-    BaseAddress = (PVOID)0x1;
-    ViewSize = 0xa0000 - 0x1000;
-    Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
-                                     &BaseAddress,
-                                     0,
-                                     &ViewSize,
-                                     MEM_COMMIT,
-                                     PAGE_EXECUTE_READWRITE);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("Failed to allocate virtual memory (Status %x)\n", Status);
-        return 0;
-    }
-    if (BaseAddress != (PVOID)0x0)
-    {
-        DPRINT1("Failed to allocate virtual memory at right address (was %x)\n",
-                BaseAddress);
-        return 0;
-    }
-
-    /* Get the real mode IVT and BDA from the kernel */
-    Status = NtVdmControl(VdmInitialize, IVTAndBda);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("NtVdmControl failed (status %x)\n", Status);
-        return 0;
-    }
-
-    /* Return success */
-    return 1;
-}
-
-/* EOF */
index 9f4b485..eaadd2f 100644 (file)
@@ -6,8 +6,7 @@
  * PURPOSE:         Resource #defines
  */
 
-#ifndef WIN32CSR_RESOURCE_H_INCLUDED
-#define WIN32CSR_RESOURCE_H_INCLUDED
+#pragma once
 
 #define IDD_END_NOW  10
 #define IDD_NOT_RESPONDING 11
@@ -49,8 +48,4 @@
 #define IDS_SCROLLUP 309
 #define IDS_SCROLLDOWN 310
 
-
-
-#endif /* WIN32CSR_RESOURCE_H_INCLUDED */
-
 /* EOF */
index 9bcf52d..bae2199 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _W32K_DIB_DIB_H
-#define _W32K_DIB_DIB_H
+#pragma once
 
 #ifdef _M_IX86
 #define memset4(dest, value, count) asm volatile("rep stosl" : : "D"(dest), "a"(value), "c"(count) : "memory");
@@ -148,6 +147,3 @@ ULONG DIB_DoRop(ULONG Rop, ULONG Dest, ULONG Source, ULONG Pattern);
 #define DIB_GetSourceIndex(SourceSurf,sx,sy)                \
   DibFunctionsForBitmapFormat[SourceSurf->iBitmapFormat].   \
     DIB_GetPixel(SourceSurf, sx, sy)
-
-#endif /* _W32K_DIB_DIB_H */
-
index 5dd6138..5a85d1a 100644 (file)
@@ -445,25 +445,269 @@ IntCreateBitmap(IN SIZEL Size,
     return hbmp;
 }
 
+/* Name gleaned from C++ symbol information for SURFMEM::bInitDIB */
+typedef struct _DEVBITMAPINFO
+{
+    ULONG Format;
+    ULONG Width;
+    ULONG Height;
+    ULONG Flags;
+    ULONG Size;
+} DEVBITMAPINFO, *PDEVBITMAPINFO;
+
+SURFOBJ*
+FASTCALL
+SURFMEM_bCreateDib(IN PDEVBITMAPINFO BitmapInfo,
+                   IN PVOID Bits)
+{
+    BOOLEAN Compressed = FALSE;
+    ULONG ScanLine = 0; // Compiler is dumb
+    ULONG Size;
+    SURFOBJ *pso;
+    PSURFACE psurf;
+    SIZEL LocalSize;
+    BOOLEAN AllocatedLocally = FALSE;
+
+    /*
+     * First, check the format so we can get the aligned scanline width.
+     * RLE and the newer fancy-smanshy JPG/PNG support do NOT have scanlines
+     * since they are compressed surfaces!
+     */
+    switch (BitmapInfo->Format)
+    {
+        case BMF_1BPP:
+            ScanLine = ((BitmapInfo->Width + 31) & ~31) >> 3;
+            break;
+
+        case BMF_4BPP:
+            ScanLine = ((BitmapInfo->Width + 7) & ~7) >> 1;
+            break;
+
+        case BMF_8BPP:
+            ScanLine = (BitmapInfo->Width + 3) & ~3;
+            break;
+
+        case BMF_16BPP:
+            ScanLine = ((BitmapInfo->Width + 1) & ~1) << 1;
+            break;
+
+        case BMF_24BPP:
+            ScanLine = ((BitmapInfo->Width * 3) + 3) & ~3;
+            break;
+
+        case BMF_32BPP:
+            ScanLine = BitmapInfo->Width << 2;
+            break;
+
+        case BMF_8RLE:
+        case BMF_4RLE:
+        case BMF_JPEG:
+        case BMF_PNG:
+            Compressed = TRUE;
+            break;
+
+        default:
+            DPRINT1("Invalid bitmap format\n");
+            return NULL;
+    }
+
+    /* Does the device manage its own surface? */
+    if (!Bits)
+    {
+        /* We need to allocate bits for the caller, figure out the size */
+        if (Compressed)
+        {
+            /* Note: we should not be seeing this scenario from ENGDDI */
+            ASSERT(FALSE);
+            Size = BitmapInfo->Size;
+        }
+        else
+        {
+            /* The height times the bytes for each scanline */
+            Size = BitmapInfo->Height * ScanLine;
+        }
+        
+        if (Size)
+        {
+            /* Check for allocation flag */
+            if (BitmapInfo->Flags & BMF_USERMEM)
+            {
+                /* Get the bits from user-mode memory */
+                Bits = EngAllocUserMem(Size, 'mbuG');
+            }
+            else
+            {
+                /* Get kernel bits (zeroed out if requested) */
+                Bits = EngAllocMem((BitmapInfo->Flags & BMF_NOZEROINIT) ? 0 : FL_ZERO_MEMORY,
+                                   Size,
+                                   TAG_DIB);
+            }
+            AllocatedLocally = TRUE;
+            /* Bail out if that failed */
+            if (!Bits) return NULL;
+        }
+    }
+    else
+    {
+        /* Should not have asked for user memory */
+        ASSERT((BitmapInfo->Flags & BMF_USERMEM) == 0);
+    }
+
+    /* Allocate the actual surface object structure */
+    psurf = SURFACE_AllocSurfaceWithHandle();
+    if (!psurf)
+    {
+        if(Bits && AllocatedLocally)
+        {
+            if(BitmapInfo->Flags & BMF_USERMEM)
+                EngFreeUserMem(Bits);
+            else
+                EngFreeMem(Bits);
+        }
+        return NULL;
+    }
+
+    /* Lock down the surface */
+    if (!SURFACE_InitBitsLock(psurf))
+    {
+        /* Bail out if that failed */
+        SURFACE_UnlockSurface(psurf);
+        SURFACE_FreeSurfaceByHandle(psurf->BaseObject.hHmgr);
+        return NULL;
+    }
+
+    /* We should now have our surface object */
+    pso = &psurf->SurfObj;
+
+    /* Save format and flags */
+    pso->iBitmapFormat = BitmapInfo->Format;
+    pso->fjBitmap = BitmapInfo->Flags & (BMF_TOPDOWN | BMF_UMPDMEM | BMF_USERMEM);
+
+    /* Save size and type */
+    LocalSize.cy = BitmapInfo->Height;
+    LocalSize.cx = BitmapInfo->Width;
+    pso->sizlBitmap = LocalSize;
+    pso->iType = STYPE_BITMAP;
+    
+    /* Device-managed surface, no flags or dimension */
+    pso->dhsurf = 0;
+    pso->dhpdev = NULL;
+    pso->hdev = NULL;
+    psurf->flFlags = 0;
+    psurf->dimension.cx = 0;
+    psurf->dimension.cy = 0;
+    psurf->hSecure = NULL;
+    psurf->hDIBSection = NULL;
+    psurf->flHooks = 0;
+    
+    /* Set bits */
+    pso->pvBits = Bits;
+    
+    /* Check for bitmap type */
+    if (!Compressed)
+    {
+        /* Number of bits is based on the height times the scanline */
+        pso->cjBits = BitmapInfo->Height * ScanLine;
+        if (BitmapInfo->Flags & BMF_TOPDOWN)
+        {
+            /* For topdown, the base address starts with the bits */
+            pso->pvScan0 = pso->pvBits;
+            pso->lDelta = ScanLine;
+        }
+        else
+        {
+            /* Otherwise we start with the end and go up */
+            pso->pvScan0 = (PVOID)((ULONG_PTR)pso->pvBits + pso->cjBits - ScanLine);
+            pso->lDelta = -ScanLine;
+        }
+    }
+    else
+    {
+        /* Compressed surfaces don't have scanlines! */
+        pso->lDelta = 0;
+        pso->cjBits = BitmapInfo->Size;
+        
+        /* Check for JPG or PNG */
+        if ((BitmapInfo->Format != BMF_JPEG) && (BitmapInfo->Format != BMF_PNG))
+        {
+            /* Wherever the bit data is */
+            pso->pvScan0 = pso->pvBits;
+        }
+        else
+        {
+            /* Fancy formats don't use a base address */
+            pso->pvScan0 = NULL;
+            ASSERT(FALSE); // ENGDDI shouldn't be creating PNGs for drivers ;-)
+        }
+    }
+    
+    /* Finally set the handle and uniq */
+    pso->hsurf = (HSURF)psurf->BaseObject.hHmgr;
+    pso->iUniq = 0;
+    
+    /* Unlock and return the surface */
+    SURFACE_UnlockSurface(psurf);
+    return pso;
+}
+
 /*
  * @implemented
  */
-HBITMAP APIENTRY
+HBITMAP
+APIENTRY
 EngCreateBitmap(IN SIZEL Size,
                 IN LONG Width,
                 IN ULONG Format,
                 IN ULONG Flags,
                 IN PVOID Bits)
 {
-    HBITMAP hNewBitmap;
-
-    hNewBitmap = IntCreateBitmap(Size, Width, Format, Flags, Bits);
-    if ( !hNewBitmap )
-        return 0;
-
-    GDIOBJ_SetOwnership(hNewBitmap, NULL);
+    SURFOBJ* Surface;
+    DEVBITMAPINFO BitmapInfo;
+    
+    /* Capture the parameters */
+    BitmapInfo.Format = Format;
+    BitmapInfo.Width = Size.cx;
+    BitmapInfo.Height = Size.cy;
+    BitmapInfo.Flags = Flags;
+
+    /*
+     * If the display driver supports framebuffer access, use the scanline width
+     * to determine the actual width of the bitmap, and convert it to pels instead
+     * of bytes.
+     */
+    if ((Bits) && (Width))
+    {
+        switch (BitmapInfo.Format)
+        {
+            /* Do the conversion for each bit depth we support */
+            case BMF_1BPP:
+                BitmapInfo.Width = Width * 8;
+                break;
+            case BMF_4BPP:
+                BitmapInfo.Width = Width * 2;
+                break;
+            case BMF_8BPP:
+                BitmapInfo.Width = Width;
+                break;
+            case BMF_16BPP:
+                BitmapInfo.Width = Width / 2;
+                break;
+            case BMF_24BPP:
+                BitmapInfo.Width = Width / 3;
+                break;
+            case BMF_32BPP:
+                BitmapInfo.Width = Width / 4;
+                break;
+        }
+    }
+    
+    /* Now create the surface */
+    Surface = SURFMEM_bCreateDib(&BitmapInfo, Bits);
+    if (!Surface) return 0;
 
-    return hNewBitmap;
+    /* Set public ownership and reutrn the handle */
+    GDIOBJ_SetOwnership(Surface->hsurf, NULL);
+    return Surface->hsurf;
 }
 
 /*
index d4ad598..f9aea47 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_ACCELERATOR_H
-#define _WIN32K_ACCELERATOR_H
+#pragma once
 
 #include <include/win32.h>
 #include <include/winsta.h>
@@ -19,5 +18,3 @@ NTSTATUS FASTCALL
 CleanupAcceleratorImpl(VOID);
 
 PACCELERATOR_TABLE FASTCALL UserGetAccelObject(HACCEL);
-
-#endif /* _WIN32K_ACCELERATOR_H */
index 2cfd7c4..6a5e731 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __WIN32K_BITMAPS_H
-#define __WIN32K_BITMAPS_H
+#pragma once
 
 #include "surface.h"
 
@@ -11,5 +10,3 @@ HBITMAP FASTCALL IntCreateBitmap(IN SIZEL Size, IN LONG Width, IN ULONG Format,
 HBITMAP FASTCALL BITMAP_CopyBitmap (HBITMAP  hBitmap);
 UINT    FASTCALL BITMAP_GetRealBitsPixel(UINT nBitsPixel);
 INT     FASTCALL BITMAP_GetWidthBytes (INT bmWidth, INT bpp);
-
-#endif
index 2c114d0..8c9a7a8 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __WIN32K_BRUSH_H
-#define __WIN32K_BRUSH_H
+#pragma once
 
 #include "gdiobj.h"
 
@@ -133,5 +132,3 @@ PVOID FASTCALL AllocateObjectAttr(VOID);
 VOID FASTCALL FreeObjectAttr(PVOID);
 
 BOOL FASTCALL IntGdiSetBrushOwner(PBRUSH,DWORD);
-
-#endif
index 61b8074..0b978a6 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_CALLBACK_H
-#define _WIN32K_CALLBACK_H
+#pragma once
 
 #include <include/win32.h>
 
@@ -57,5 +56,3 @@ IntCbFreeMemory(PVOID Data);
 HMENU APIENTRY co_IntCallLoadMenu(HINSTANCE,PUNICODE_STRING);
 
 NTSTATUS APIENTRY co_IntClientThreadSetup(VOID);
-
-#endif /* _WIN32K_CALLBACK_H */
index dc6dae5..8c7998c 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_CARET_H
-#define _WIN32K_CARET_H
+#pragma once
 
 #include <include/win32.h>
 #include <include/window.h>
@@ -22,7 +21,4 @@ BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT WindowObject);
 
 BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT WindowObject);
 
-
-#endif /* _WIN32K_CARET_H */
-
 /* EOF */
index 70b7876..ac36f6b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_CLASS_H
-#define _WIN32K_CLASS_H
+#pragma once
 
 #include <include/win32.h>
 #include <include/desktop.h>
@@ -106,6 +105,4 @@ BOOL FASTCALL LookupFnIdToiCls(int, int * );
 WNDPROC FASTCALL IntGetClassWndProc(PCLS, BOOL);
 ULONG_PTR FASTCALL UserGetCPD(PVOID,GETCPD,ULONG_PTR);
 
-#endif /* _WIN32K_CLASS_H */
-
 /* EOF */
index 46d6496..c5a55e5 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _SUBSYS_WIN32K_INCLUDE_CLEANUP_H
-#define _SUBSYS_WIN32K_INCLUDE_CLEANUP_H
+#pragma once
 
 NTSTATUS FASTCALL InitCleanupImpl(VOID);
 
@@ -16,5 +15,3 @@ IntUnicodeStringToNULLTerminated(PWSTR *Dest, PUNICODE_STRING Src);
 
 void FASTCALL
 IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated, PUNICODE_STRING UnicodeString);
-
-#endif /* ndef _SUBSYS_WIN32K_INCLUDE_CLEANUP_H */
index 95e961b..819ba98 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_CLIPBOARD_H
-#define _WIN32K_CLIPBOARD_H
+#pragma once
 
 #include "window.h"
 #include <include/win32.h>
@@ -50,5 +49,3 @@ UINT APIENTRY IntEnumClipboardFormats(UINT format);
 UINT FASTCALL
 IntEnumClipboardFormats(UINT format);
 */
-
-#endif /* _WIN32K_CLIPBOARD_H */
index 1dfca64..aef5998 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __WIN32K_CLIPRGN_H
-#define __WIN32K_CLIPRGN_H
+#pragma once
 
 #include <include/dc.h>
 #include <include/region.h>
@@ -10,5 +9,3 @@ INT FASTCALL IntGdiExtSelectClipRgn (PDC, PROSRGNDATA, int);
 INT FASTCALL GdiGetClipBox(HDC hDC, RECTL *rc);
 INT FASTCALL GdiSelectVisRgn(HDC hdc, HRGN hrgn);
 INT FASTCALL GdiExtSelectClipRgn (PDC dc, HRGN hrgn, int fnMode);
-
-#endif /* not __WIN32K_CLIPRGN_H */
index cb8c310..0972f2e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_COLOR_H
-#define _WIN32K_COLOR_H
+#pragma once
 
 #ifndef CLR_INVALID
 #define CLR_INVALID         0xffffffff
@@ -40,5 +39,3 @@ INT APIENTRY COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, XLATE
 UINT FASTCALL IntGdiRealizePalette (HDC);
 HCOLORSPACE FASTCALL IntGdiCreateColorSpace(PLOGCOLORSPACEEXW);
 BOOL FASTCALL IntGdiDeleteColorSpace(HCOLORSPACE);
-
-#endif /* _WIN32K_COLOR_H */
index bec4020..c241b9e 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __WIN32K_COORD_H
-#define __WIN32K_COORD_H
+#pragma once
 
 #include <include/dc.h>
 
@@ -20,5 +19,3 @@ IntGdiModifyWorldTransform(PDC pDc,
 
 VOID FASTCALL IntMirrorWindowOrg(PDC);
 void FASTCALL IntFixIsotropicMapping(PDC dc);
-
-#endif
index e3caa96..4f5dc8d 100644 (file)
@@ -7,8 +7,7 @@
  * PROGRAMER:        Ge van Geldorp (ge@gse.nl)
  */
 
-#ifndef CSR_H_INCLUDED
-#define CSR_H_INCLUDED
+#pragma once
 
 extern PEPROCESS CsrProcess;
 
@@ -19,6 +18,4 @@ NTSTATUS WINAPI CsrInsertObject(HANDLE ObjectHandle,
                                  ACCESS_MASK DesiredAccess,
                                  PHANDLE Handle);
 
-#endif /* CSR_H_INCLUDED */
-
 /* EOF */
index c2b66b1..280ab55 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_CURSORICON_H
-#define _WIN32K_CURSORICON_H
+#pragma once
 
 #define MAXCURICONHANDLES 4096
 
@@ -106,8 +105,4 @@ GreMovePointer(
     LONG x,
     LONG y);
 
-#endif /* _WIN32K_CURSORICON_H */
-
 /* EOF */
-
-
index 80d6620..b616bdc 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __WIN32K_DC_H
-#define __WIN32K_DC_H
+#pragma once
 
 typedef struct _DC *PDC;
 
@@ -232,5 +231,3 @@ DC_vSelectPalette(PDC pdc, PPALETTE ppal)
 BOOL FASTCALL
 IntPrepareDriverIfNeeded(VOID);
 extern PDEVOBJ PrimarySurface;
-
-#endif /* not __WIN32K_DC_H */
index 6c0e58b..de83e8a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_DCE_H
-#define _WIN32K_DCE_H
+#pragma once
 
 /* Ported from WINE by Jason Filby */
 
@@ -48,6 +47,7 @@ typedef struct tagDCE
 #define DCX_DCPOWNED           0x00008000
 #define DCX_NOCLIPCHILDREN     0x00080000
 #define DCX_NORECOMPUTE                0x00100000
+#define DCX_INDESTROY           0x00400000
 
 BOOL FASTCALL DCE_Cleanup(PDCE pDce);
 PDCE FASTCALL DceAllocDCE(PWINDOW_OBJECT Window, DCE_TYPE Type);
@@ -63,5 +63,3 @@ void FASTCALL DceFreeClassDCE(HDC);
 HWND FASTCALL UserGethWnd(HDC,PWNDOBJ*);
 void FASTCALL DceFreeWindowDCE(PWINDOW_OBJECT);
 void FASTCALL DceFreeThreadDCE(PTHREADINFO);
-
-#endif /* _WIN32K_DCE_H */
index fe7a93f..ecdd420 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_DESKTOP_H
-#define _WIN32K_DESKTOP_H
+#pragma once
 
 #include "msgqueue.h"
 #include "window.h"
@@ -252,6 +251,4 @@ DesktopHeapAddressToUser(PVOID lpMem)
     return NULL;
 }
 
-#endif /* _WIN32K_DESKTOP_H */
-
 /* EOF */
index 4ab6efe..479476d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_DIB_H
-#define _WIN32K_DIB_H
+#pragma once
 
 #include "dc.h"
 
@@ -18,5 +17,3 @@ DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi);
 
 HPALETTE FASTCALL
 BuildDIBPalette (CONST BITMAPINFO *bmi, PINT paletteType);
-
-#endif /* _WIN32K_DIB_H */
index 04cd33b..8e89f59 100644 (file)
@@ -1,6 +1,4 @@
-
-#ifndef __WIN32K_DRIVER_H
-#define __WIN32K_DRIVER_H
+#pragma once
 
 #include <winddi.h>
 
@@ -21,7 +19,3 @@ BOOL  DRIVER_BuildDDIFunctions(PDRVENABLEDATA  DED,
 BOOL  DRIVER_UnregisterDriver(LPCWSTR  Name);
 INT  DRIVER_ReferenceDriver (LPCWSTR  Name);
 INT  DRIVER_UnreferenceDriver (LPCWSTR  Name);
-
-#endif
-
-
index 0799465..4056083 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_DRIVEROBJ_H
-#define _WIN32K_DRIVEROBJ_H
+#pragma once
 
 #include "gdiobj.h"
 
@@ -19,5 +18,3 @@ BOOL INTERNAL_CALL DRIVEROBJ_Cleanup(PVOID pObject);
 #define DRIVEROBJ_FreeObjectByHandle(hdo) GDIOBJ_FreeObjByHandle((HGDIOBJ)hdo, GDI_OBJECT_TYPE_DRIVEROBJ)
 #define DRIVEROBJ_LockObject(hdo) ((PEDRIVEROBJ)GDIOBJ_LockObj((HGDIOBJ)hdo, GDI_OBJECT_TYPE_DRIVEROBJ))
 #define DRIVEROBJ_UnlockObject(pdo) GDIOBJ_UnlockObjByPtr((POBJ)pdo)
-
-#endif /* !_WIN32K_DRIVEROBJ_H */
index 45d61e9..82e2463 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_ENG_H
-#define _WIN32K_ENG_H
+#pragma once
 
 BOOL APIENTRY  EngIntersectRect (PRECTL prcDst, PRECTL prcSrc1, PRECTL prcSrc2);
 VOID FASTCALL EngDeleteXlate (XLATEOBJ *XlateObj);
@@ -22,5 +21,3 @@ IntEngWindowChanged(
 VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem );
 VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem );
 ULONGLONG APIENTRY EngGetTickCount(VOID);
-
-#endif /* _WIN32K_ENG_H */
index 98ffb54..a1249f0 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __WIN32K_ENGEVENT_H
-#define __WIN32K_ENGEVENT_H
+#pragma once
 
 #define ENG_EVENT_USERMAPPED 1
 
@@ -12,5 +11,3 @@ typedef struct _ENG_EVENT
     /* Private part */
     KEVENT KEvent;
 } ENG_EVENT, *PENG_EVENT;
-
-#endif
index 0da73d5..afb0920 100644 (file)
@@ -25,8 +25,8 @@
  * REVISION HISTORY:
  *                 21/8/1999: Created
  */
-#ifndef __ENG_OBJECTS_H
-#define __ENG_OBJECTS_H
+
+#pragma once
 
 #include <ft2build.h>
 #include <freetype/freetype.h>
@@ -133,6 +133,3 @@ typedef struct _XFORMGDI {
    we can simply typecast the pointer */
 #define ObjToGDI(ClipObj, Type) (Type##GDI *)(ClipObj)
 #define GDIToObj(ClipGDI, Type) (Type##OBJ *)(ClipGDI)
-
-
-#endif //__ENG_OBJECTS_H
index 6b92353..92a1cbf 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_ERROR_H
-#define _WIN32K_ERROR_H
+#pragma once
 
 VOID FASTCALL
 SetLastNtError(
@@ -12,6 +11,4 @@ SetLastWin32Error(
 NTSTATUS FASTCALL
 GetLastNtError(VOID);
 
-#endif /* _WIN32K_ERROR_H */
-
 /* EOF */
index ff9abf0..0699263 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_FLOATOBJ_H_
-#define _WIN32K_FLOATOBJ_H_
+#pragma once
 
 #if defined(_X86_)
 
@@ -71,5 +70,3 @@ _FLOATOBJ_Equal1(FLOATOBJ *pf)
 #define FLOATOBJ_Set1(fo) *(fo) = 1;
 
 #endif
-
-#endif /* not _WIN32K_FLOATOBJ_H_ */
index 03438bb..859d1c7 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_FOCUS_H
-#define _WIN32K_FOCUS_H
+#pragma once
 
 /*
  * These functions take the window handles from current message queue.
@@ -23,5 +22,3 @@ BOOL FASTCALL
 co_IntSetForegroundWindow(PWINDOW_OBJECT Window);
 HWND FASTCALL
 co_IntSetActiveWindow(PWINDOW_OBJECT Window);
-
-#endif /* _WIN32K_FOCUS_H */
index 2b53b8e..5f78988 100644 (file)
@@ -1,6 +1,4 @@
-#ifndef __WIN32K_FLOAT_H
-#define __WIN32K_FLOAT_H
-
+#pragma once
 
 #include <reactos/win32k/ntgdityp.h>
 #include <reactos/win32k/ntgdihdl.h>
@@ -108,7 +106,3 @@ static __inline void INTERNAL_LPTODP(DC *dc, LPPOINT point)
     MulDiv((tx), (pdcattr)->szlViewportExt.cx, (pdcattr)->szlWindowExt.cx)
 #define YLSTODS(pdcattr,ty) \
     MulDiv((ty), (pdcattr)->szlViewportExt.cy, (pdcattr)->szlWindowExt.cy)
-
-#endif
-
-
index 489e98e..50ed2e6 100644 (file)
@@ -3,8 +3,7 @@
  *
  */
 
-#ifndef __WIN32K_GDIOBJ_H
-#define __WIN32K_GDIOBJ_H
+#pragma once
 
 /* Public GDI Object/Handle definitions */
 #include <win32k/ntgdihdl.h>
@@ -132,5 +131,3 @@ GDIOBJ_IncrementShareCount(POBJ Object)
 #endif
 
 INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE);
-
-#endif
index 3cdcd7b..5e1c5c9 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_GUICHECK_H
-#define _WIN32K_GUICHECK_H
+#pragma once
 
 BOOL FASTCALL co_IntGraphicsCheck(BOOL Create);
 BOOL FASTCALL IntCreatePrimarySurface(VOID);
@@ -7,6 +6,4 @@ VOID FASTCALL IntDestroyPrimarySurface(VOID);
 
 NTSTATUS FASTCALL InitGuiCheckImpl (VOID);
 
-#endif /* _WIN32K_GUICHECK_H */
-
 /* EOF */
index cd0e483..d09304b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_HOOK_H
-#define _WIN32K_HOOK_H
+#pragma once
 
 #define HOOK_THREAD_REFERENCED (0x1)
 #define NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1)
@@ -40,6 +39,4 @@ PHOOK FASTCALL IntGetHookObject(HHOOK);
 PHOOK FASTCALL IntGetNextHook(PHOOK Hook);
 LRESULT FASTCALL UserCallNextHookEx( PHOOK pHook, int Code, WPARAM wParam, LPARAM lParam, BOOL Ansi);
 
-#endif /* _WIN32K_HOOK_H */
-
 /* EOF */
index 25c79fc..1e1c663 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_HOTKEY_H
-#define _WIN32K_HOTKEY_H
+#pragma once
 
 #include <include/winsta.h>
 #include <include/window.h>
@@ -33,6 +32,4 @@ UnregisterWindowHotKeys(PWINDOW_OBJECT Window);
 VOID FASTCALL
 UnregisterThreadHotKeys(struct _ETHREAD *Thread);
 
-#endif /* _WIN32K_HOTKEY_H */
-
 /* EOF */
index a47136e..2a00fe2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_INPUT_H
-#define _WIN32K_INPUT_H
+#pragma once
 
 #include <internal/kbd.h>
 
@@ -49,5 +48,3 @@ BOOL FASTCALL IntConnectThreadInput(PTHREADINFO,PTHREADINFO*,PUSER_MESSAGE_QUEUE
   (TRUE)
 
 extern PTHREADINFO ptiRawInput;
-
-#endif /* _WIN32K_INPUT_H */
index b64a3a4..9349003 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _INT_W32k_DDRAW
-#define _INT_W32k_DDRAW
+#pragma once
 
 #include <ddrawint.h>
 #include <ddkernel.h>
@@ -136,5 +135,3 @@ void dump_halinfo(DD_HALINFO *pHalInfo);
         DPRINT1("\n");\
     if (flag != 0) \
         DPRINT1("undoc value in %s flags value %08lx\n",text, (ULONG) dwflag);
-
-#endif /* _INT_W32k_DDRAW */
index 515c878..dc0bc98 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_INTENG_H
-#define _WIN32K_INTENG_H
+#pragma once
 
 typedef ULONG HCLIP;
 
@@ -190,5 +189,3 @@ IntEngCopyBits(SURFOBJ *psoDest,
            XLATEOBJ *pxlo,
            RECTL *prclDest,
            POINTL *ptlSource);
-
-#endif /* _WIN32K_INTENG_H */
index d5e63c9..1b7a700 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_INTGDI_H
-#define _WIN32K_INTGDI_H
+#pragma once
 
 #include "region.h"
 
@@ -261,6 +260,3 @@ GreStretchBltMask(IN HDC hdcDst,
                   IN HDC hdcMask,
                   IN INT xMask,
                   IN INT yMask);
-
-#endif /* _WIN32K_INTGDI_H */
-
index a89eb89..94d7106 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_MENU_H
-#define _WIN32K_MENU_H
+#pragma once
 
 #define IS_ATOM(x) \
   (((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000))
@@ -24,7 +23,7 @@ typedef struct _MENU_ITEM
   UNICODE_STRING Text;
   HBITMAP hbmpItem;
   RECTL Rect;
-  UINT XTab;
+  UINT dxTab;
 } MENU_ITEM, *PMENU_ITEM;
 
 typedef struct _MENU_OBJECT
@@ -110,5 +109,3 @@ InitMenuImpl(VOID);
 
 NTSTATUS FASTCALL
 CleanupMenuImpl(VOID);
-
-#endif /* _WIN32K_MENU_H */
index 6ec5f26..366c44b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __WIN32K_MISC_H
-#define __WIN32K_MISC_H
+#pragma once
 
 typedef struct INTENG_ENTER_LEAVE_TAG
   {
@@ -47,5 +46,3 @@ RegWriteUserSetting(
     IN ULONG ulType,
     OUT PVOID pvData,
     IN ULONG cbDataSize);
-
-#endif /* __WIN32K_MISC_H */
index 862a092..ad67bb5 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef NDK_MMCOPY_H
-#define NDK_MMCOPY_H
+#pragma once
 
 #include <pseh/pseh2.h>
 
@@ -8,5 +7,3 @@ NTSTATUS _MmCopyToCaller( PVOID Target, PVOID Source, UINT Bytes );
 
 #define MmCopyFromCaller(x,y,z) _MmCopyFromCaller((PCHAR)(x),(PCHAR)(y),(UINT)(z))
 #define MmCopyToCaller(x,y,z) _MmCopyToCaller((PCHAR)(x),(PCHAR)(y),(UINT)(z))
-
-#endif/*NDK_MMCOPY_H*/
index f0337db..6c42828 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_MONITOR_H
-#define _WIN32K_MONITOR_H
+#pragma once
 
 /* monitor object */
 typedef struct _MONITOR
@@ -41,6 +40,4 @@ NTSTATUS IntDetachMonitor(PDEVOBJ *pGdiDevice);
 PMONITOR FASTCALL UserGetMonitorObject(IN HMONITOR);
 PMONITOR FASTCALL IntGetPrimaryMonitor(VOID);
 
-#endif /* _WIN32K_MONITOR_H */
-
 /* EOF */
index b00903b..0e5f68b 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_MOUSE_H
-#define _WIN32K_MOUSE_H
+#pragma once
 
 #include <include/winsta.h>
 
@@ -18,5 +17,3 @@ INT  INTERNAL_CALL MouseSafetyOnDrawEnd(SURFOBJ *SurfObj);
 #ifndef MOUSEEVENTF_XUP
 #define MOUSEEVENTF_XUP        (0x100)
 #endif
-
-#endif /* _WIN32K_MOUSE_H */
index 5094b7f..5752481 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_MSGQUEUE_H
-#define _WIN32K_MSGQUEUE_H
+#pragma once
 
 #include "hook.h"
 
@@ -279,6 +278,4 @@ MsqCalculateMessageTime(IN PLARGE_INTEGER TickCount)
     return (LONG)(TickCount->QuadPart * (KeQueryTimeIncrement() / 10000));
 }
 
-#endif /* _WIN32K_MSGQUEUE_H */
-
 /* EOF */
index d64e246..58a911d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_NTUSER_H
-#define _WIN32K_NTUSER_H
+#pragma once
 
 #define DECLARE_RETURN(type) type _ret_
 #define RETURN(value) { _ret_ = value; goto _cleanup_; }
@@ -20,7 +19,4 @@ VOID FASTCALL UserLeave(VOID);
 BOOL FASTCALL UserIsEntered(VOID);
 BOOL FASTCALL UserIsEnteredExclusive(VOID);
 
-
-#endif /* _WIN32K_NTUSER_H */
-
 /* EOF */
index 0ff67ce..437611a 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_OBJECT_H
-#define _WIN32K_OBJECT_H
+#pragma once
 
 #include "gdiobj.h"
 #include "bitmaps.h"
@@ -145,6 +144,4 @@ VOID  FASTCALL CreateSysColorObjects (VOID);
 
 PPOINT FASTCALL GDI_Bezier (const POINT *Points, INT count, PINT nPtsOut);
 
-#endif /* _WIN32K_OBJECT_H */
-
 /* EOF */
index c45c83e..698321c 100644 (file)
@@ -1,9 +1,6 @@
-#ifndef _WIN32K_PAINT_H
-#define _WIN32K_PAINT_H
+#pragma once
 
 BOOL APIENTRY FillSolid (SURFOBJ* Surface, RECTL* Dimensions, ULONG iColor);
 BOOL APIENTRY FillPolygon ( DC* dc, SURFACE* pSurface, BRUSHOBJ* BrushObj, MIX RopMode, CONST PPOINT Points, INT Count, RECTL BoundRect );
 BOOL FASTCALL IntFillPolygon(PDC dc, SURFACE *psurf, BRUSHOBJ *BrushObj,
     CONST PPOINT Points, int Count, RECTL DestRect, POINTL *BrushOrigin);
-
-#endif /* _WIN32K_PAINT_H */
index d75d24e..ed7bea4 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_PAINTING_H
-#define _WIN32K_PAINTING_H
+#pragma once
 
 #include <include/class.h>
 #include <include/msgqueue.h>
@@ -14,5 +13,3 @@ IntGetPaintMessage(PWINDOW_OBJECT Window, UINT MsgFilterMin, UINT MsgFilterMax,
                    MSG *Message, BOOL Remove);
 INT FASTCALL UserRealizePalette(HDC);
 INT FASTCALL co_UserGetUpdateRgn(PWINDOW_OBJECT, HRGN, BOOL);
-
-#endif /* _WIN32K_PAINTING_H */
index 1026545..43f59e6 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_PALETTE_H
-#define _WIN32K_PALETTE_H
+#pragma once
 
 #include <include/dc.h>
 
@@ -113,5 +112,3 @@ PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal, ULONG ulIndex)
                ppal->IndexedColors[ulIndex].peGreen,
                ppal->IndexedColors[ulIndex].peBlue);
 }
-
-#endif /* not _WIN32K_PALETTE_H */
index 1aae479..b8c1778 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_PATH_H
-#define _WIN32K_PATH_H
+#pragma once
 
   /* DCPATH flPath */
 #define DCPATH_ACTIVE    0x0001
@@ -71,5 +70,3 @@ BOOL FASTCALL PATH_ExtTextOut(PDC dc,INT x,INT y,UINT flags,const RECTL *lprc,LP
 
 VOID FASTCALL IntGdiCloseFigure(PPATH pPath);
 BOOL FASTCALL PATH_Delete(HPATH hPath);
-
-#endif /* _WIN32K_PATH_H */
index 94b3d56..4124509 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __WIN32K_PDEVOBJ_H
-#define __WIN32K_PDEVOBJ_H
+#pragma once
 
 #include <drivers/directx/directxint.h>
 
@@ -143,5 +142,3 @@ typedef struct _PDEVEDD
 } PDEVEDD, *PPDEVEDD;
 
 extern ULONG gdwDirectDrawContext;
-
-#endif /* !__WIN32K_PDEVOBJ_H */
index b6d85c5..7ca623d 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __WIN32K_PEN_H
-#define __WIN32K_PEN_H
+#pragma once
 
 #include "gdiobj.h"
 #include "brush.h"
@@ -31,5 +30,3 @@ PBRUSH FASTCALL PEN_LockPen(HGDIOBJ);
 PBRUSH FASTCALL PEN_ShareLockPen(HGDIOBJ);
 
 INT APIENTRY PEN_GetObject(PBRUSH pPen, INT Count, PLOGPEN Buffer);
-
-#endif
index 2d33df9..4eb8652 100644 (file)
@@ -1,9 +1,5 @@
-#ifndef _WIN32K_PROP_H
-#define _WIN32K_PROP_H
+#pragma once
 
 PPROPERTY FASTCALL IntGetProp(PWINDOW_OBJECT,ATOM);
 BOOL FASTCALL IntRemoveProp(PWINDOW_OBJECT,ATOM);
 BOOL FASTCALL IntSetProp(PWINDOW_OBJECT, ATOM, HANDLE);
-
-#endif /* _WIN32K_PROP_H */
-
index a068724..156dd55 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_RECT_H
-#define _WIN32K_RECT_H
+#pragma once
 
 VOID
 FORCEINLINE
@@ -57,6 +56,3 @@ RECTL_bIntersectRect(RECTL *prclDst, const RECTL *prcl1, const RECTL *prcl2);
 VOID
 FASTCALL
 RECTL_vMakeWellOrdered(RECTL *prcl);
-
-
-#endif /* _WIN32K_RECT_H */
index a7583fb..d29b1b0 100644 (file)
@@ -1,6 +1,4 @@
-
-#ifndef __WIN32K_REGION_H
-#define __WIN32K_REGION_H
+#pragma once
 
 #include "gdiobj.h"
 
@@ -59,5 +57,3 @@ PROSRGNDATA FASTCALL IntSysCreateRectpRgn(INT,INT,INT,INT);
 
 #define IntSysCreateRectpRgnIndirect(prc) \
   IntSysCreateRectpRgn((prc)->left, (prc)->top, (prc)->right, (prc)->bottom)
-
-#endif /* not __WIN32K_REGION_H */
index 0fe21ae..171a4eb 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_SCROLL_H
-#define _WIN32K_SCROLL_H
+#pragma once
 
 typedef struct tagSBCALC
 {
@@ -62,5 +61,3 @@ typedef struct _SBINFOEX
 
 BOOL FASTCALL co_IntCreateScrollBars(PWINDOW_OBJECT Window);
 BOOL FASTCALL IntDestroyScrollBars(PWINDOW_OBJECT Window);
-
-#endif /* _WIN32K_SCROLL_H */
index f9a407a..57a5ec2 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_SURFACE_H
-#define _WIN32K_SURFACE_H
+#pragma once
 
 #include "win32.h"
 #include "gdiobj.h"
@@ -75,5 +74,3 @@ void INTERNAL_CALL SURFACE_CleanupBitsLock(SURFACE *pBMObj);
 
 INT   FASTCALL BitsPerFormat (ULONG Format);
 ULONG FASTCALL BitmapFormat (WORD Bits, DWORD Compression);
-
-#endif /* _WIN32K_SURFACE_H */
index 6bc826f..2c51a40 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_SYSPARAMS_H
-#define _WIN32K_SYSPARAMS_H
+#pragma once
 
 #include "cursoricon.h"
 
@@ -178,5 +177,3 @@ typedef union _SPIBUFFER
 } SPIBUFFER;
 
 extern SPIVALUES gspv;
-
-#endif /* _WIN32K_SYSPARAMS_H */
index c460b2f..64e8de6 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_TAGS_H
-#define _WIN32K_TAGS_H
+#pragma once
 
 #define TAG_STRING      ' RTS' /* string */
 #define TAG_RTLREGISTRY 'vrqR' /* RTL registry */
 #define USERTAG_WOWTDB 'owsU'
 #define USERTAG_WOWPROCESSINFO 'pwsU'
 #define USERTAG_WOWTHREADINFO 'twsU'
-
-#endif /* _WIN32K_TAGS_H */
index 6ee10f3..8c76484 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_TEXT_H
-#define _WIN32K_TEXT_H
+#pragma once
 
 #include <include/engobjects.h>
 
@@ -129,5 +128,3 @@ BOOL FASTCALL GreGetTextExtentExW(HDC,LPWSTR,ULONG,ULONG,PULONG,PULONG,LPSIZE,FL
 
 #define IntUnLockFreeType \
   ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&FreeTypeLock)
-
-#endif /* _WIN32K_TEXT_H */
index a10cf6c..73b2c36 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_TIMER_H
-#define _WIN32K_TIMER_H
+#pragma once
 
 typedef struct _TIMER
 {
@@ -37,5 +36,3 @@ UINT_PTR FASTCALL SetSystemTimer(PWINDOW_OBJECT,UINT_PTR,UINT,TIMERPROC);
 BOOL FASTCALL PostTimerMessages(PWINDOW_OBJECT);
 VOID FASTCALL ProcessTimers(VOID);
 VOID FASTCALL StartTheTimers(VOID);
-
-#endif /* _WIN32K_TIMER_H */
index 4abd0a8..ada1e3f 100644 (file)
@@ -1,10 +1,7 @@
-#ifndef _WIN32K_USERATOM_H
-#define _WIN32K_USERATOM_H
+#pragma once
 
 RTL_ATOM FASTCALL
 IntAddAtom(LPWSTR AtomName);
 ULONG FASTCALL
 IntGetAtomName(RTL_ATOM nAtom, LPWSTR lpBuffer, ULONG nSize);
 RTL_ATOM FASTCALL IntAddGlobalAtom(LPWSTR,BOOL);
-
-#endif /* _WIN32K_USERATOM_H */
index 5eed41e..7ad47e6 100644 (file)
@@ -1,9 +1,4 @@
-#ifndef _WIN32K_USERFUNCS_H
-#define _WIN32K_USERFUNCS_H
-
-
-
-
+#pragma once
 
 PMENU_OBJECT FASTCALL UserGetMenuObject(HMENU hMenu);
 
@@ -159,7 +154,4 @@ BOOL FASTCALL UserDestroyMenu(HMENU hMenu);
 DWORD FASTCALL
 co_UserShowScrollBar(PWINDOW_OBJECT Window, int wBar, DWORD bShow);
 
-
-#endif /* _WIN32K_USERFUNCS_H */
-
 /* EOF */
index 50253f3..5fd4a5f 100644 (file)
@@ -8,8 +8,7 @@
  *
  */
 
-#ifndef _WIN32K_VIS_H
-#define _WIN32K_VIS_H
+#pragma once
 
 #include <include/window.h>
 
@@ -20,7 +19,4 @@ VIS_ComputeVisibleRegion(PWINDOW_OBJECT Window, BOOLEAN ClientArea,
 VOID FASTCALL
 co_VIS_WindowLayoutChanged(PWINDOW_OBJECT Window, HRGN UncoveredRgn);
 
-#endif /* ! defined(_WIN32K_VIS_H) */
-
 /* EOF */
-
index ad79383..5de6139 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __INCLUDE_NAPI_WIN32_H
-#define __INCLUDE_NAPI_WIN32_H
+#pragma once
 
 /* W32PROCESS flags */
 #define W32PF_CONSOLEAPPLICATION      0x00000001
@@ -174,5 +173,3 @@ typedef struct _PROCESSINFO
   struct _KBL* KeyboardLayout; // THREADINFO only
   W32HEAP_USER_MAPPING HeapMappings;
 } PROCESSINFO;
-
-#endif /* __INCLUDE_NAPI_WIN32_H */
index 4cd9e7b..ea3bd61 100644 (file)
@@ -7,8 +7,8 @@
  */
 
 /* INCLUDES ******************************************************************/
-#ifndef __WIN32K_H
-#define __WIN32K_H
+
+#pragma once
 #define INTERNAL_CALL APIENTRY
 
 /* Internal Win32k Headers */
@@ -79,5 +79,3 @@
 #include <include/engobjects.h>
 #include <include/engevent.h>
 #include <dib/dib.h>
-
-#endif /* __WIN32K_H */
index 82c9e51..16098e4 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_WINDOW_H
-#define _WIN32K_WINDOW_H
+#pragma once
 
 struct _PROPERTY;
 struct _WINDOW_OBJECT;
@@ -159,6 +158,4 @@ VOID FASTCALL IntNotifyWinEvent(DWORD, PWND, LONG, LONG);
 PWND APIENTRY co_IntCreateWindowEx(DWORD,PUNICODE_STRING,PUNICODE_STRING,DWORD,LONG,LONG,LONG,LONG,HWND,HMENU,HINSTANCE,LPVOID,DWORD,BOOL);
 WNDPROC FASTCALL IntGetWindowProc(PWND,BOOL);
 
-#endif /* _WIN32K_WINDOW_H */
-
 /* EOF */
index 513d4d5..47f6b38 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_WINPOS_H
-#define _WIN32K_WINPOS_H
+#pragma once
 
 /* Undocumented flags. */
 #define SWP_NOCLIENTMOVE          0x0800
@@ -37,5 +36,3 @@ VOID FASTCALL co_WinPosActivateOtherWindow(PWINDOW_OBJECT Window);
 
 VOID FASTCALL WinPosInitInternalPos(PWINDOW_OBJECT WindowObject,
                                     POINT *pt, RECTL *RestoreRect);
-
-#endif /* _WIN32K_WINPOS_H */
index dfbe717..da944af 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_WINSTA_H
-#define _WIN32K_WINSTA_H
+#pragma once
 
 #include "window.h"
 #include "clipboard.h"
@@ -104,6 +103,4 @@ IntGetFullWindowStationName(
 
 PWINSTATION_OBJECT FASTCALL IntGetWinStaObj(VOID);
 
-#endif /* _WIN32K_WINSTA_H */
-
 /* EOF */
index 5daf643..d9f05f7 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef _WIN32K_XFORMOBJ_H_
-#define _WIN32K_XFORMOBJ_H_
+#pragma once
 
 ULONG
 INTERNAL_CALL
@@ -27,5 +26,3 @@ INTERNAL_CALL
 XFORMOBJ_Inverse(
        OUT XFORMOBJ *pxoDst,
        IN XFORMOBJ *pxoSrc);
-
-#endif /* not _WIN32K_XFORMOBJ_H_ */
index 995897a..6c9532c 100644 (file)
@@ -238,7 +238,7 @@ BOOL UserSetCursorPos( INT x, INT y)
  * User32 macro NtUserShowCursor */
 int UserShowCursor(BOOL bShow)
 {
-    PSYSTEM_CURSORINFO CurInfo = IntGetSysCursorInfo();;
+    PSYSTEM_CURSORINFO CurInfo = IntGetSysCursorInfo();
     HDC hdcScreen;
 
     if (!(hdcScreen = IntGetScreenDC()))
index f030481..9bdbe02 100644 (file)
@@ -690,8 +690,8 @@ IntGetMenuItemInfo(PMENU_OBJECT Menu, /* UNUSED PARAM!! */
    if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize)
    {
       lpmii->Rect = MenuItem->Rect;
-      lpmii->XTab = MenuItem->XTab;
-      lpmii->Text = MenuItem->Text.Buffer;
+      lpmii->dxTab = MenuItem->dxTab;
+      lpmii->lpstr = MenuItem->Text.Buffer; // Use DesktopHeap!
    }
 
    return TRUE;
@@ -842,8 +842,8 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF
    if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize)
    {
       MenuItem->Rect = lpmii->Rect;
-      MenuItem->XTab = lpmii->XTab;
-      lpmii->Text = MenuItem->Text.Buffer; /* Send back new allocated string or zero */
+      MenuItem->dxTab = lpmii->dxTab;
+      lpmii->lpstr = MenuItem->Text.Buffer; /* Use DesktopHeap! Send back new allocated string or zero */
    }
 
    return TRUE;
@@ -1002,8 +1002,8 @@ IntBuildMenuItemList(PMENU_OBJECT MenuObject, PVOID Buffer, ULONG nMax)
          mii.hbmpUnchecked = CurItem->hbmpUnchecked;
          mii.hSubMenu = CurItem->hSubMenu;
          mii.Rect = CurItem->Rect;
-         mii.XTab = CurItem->XTab;
-         mii.Text = CurItem->Text.Buffer;
+         mii.dxTab = CurItem->dxTab;
+         mii.lpstr = CurItem->Text.Buffer; // Use DesktopHeap!
 
          Status = MmCopyToCaller(Buf, &mii, sizeof(ROSMENUITEMINFO));
          if (! NT_SUCCESS(Status))
index f3fc3bb..1b244b0 100644 (file)
@@ -1053,9 +1053,11 @@ co_IntWaitMessage( PWINDOW_OBJECT Window,
    while ( (STATUS_WAIT_0 <= Status && Status <= STATUS_WAIT_63) ||
            STATUS_TIMEOUT == Status );
 
-   SetLastNtError(Status);
-
-   DPRINT1("Exit co_IntWaitMessage on error!\n");
+   if (!NT_SUCCESS(Status))
+   {
+      SetLastNtError(Status);
+      DPRINT1("Exit co_IntWaitMessage on error!\n");
+   }
 
    return FALSE;
 }
@@ -2626,7 +2628,7 @@ NtUserWaitForInputIdle(
 WaitExit:
   if (W32Process->InputIdleEvent)
   {
-     EngDeleteEvent((PEVENT)W32Process->InputIdleEvent);
+     EngFreeMem((PVOID)W32Process->InputIdleEvent);
      W32Process->InputIdleEvent = NULL;
   }
   ObDereferenceObject(Process);
index ec680a8..f9104fe 100644 (file)
@@ -1029,16 +1029,28 @@ NtUserSetInformationProcess(
     return 0;
 }
 
-DWORD
+NTSTATUS
 APIENTRY
-NtUserSetInformationThread(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4)
-{
-    UNIMPLEMENTED;
-    return 0;
+NtUserSetInformationThread(IN HANDLE ThreadHandle,
+                           IN USERTHREADINFOCLASS ThreadInformationClass,
+                           IN PVOID ThreadInformation,
+                           IN ULONG ThreadInformationLength)
+
+{
+    if (ThreadInformationClass == UserThreadInitiateShutdown)
+    {
+        DPRINT1("Shutdown initiated\n");
+    }
+    else if (ThreadInformationClass == UserThreadEndShutdown)
+    {
+        DPRINT1("Shutdown ended\n");
+    }
+    else
+    {
+        UNIMPLEMENTED;
+    }
+
+    return STATUS_SUCCESS;
 }
 
 DWORD
index 86ed104..66977db 100644 (file)
@@ -502,7 +502,10 @@ IntIsWindowDrawable(PWINDOW_OBJECT Window)
    for (WndObject = Window; WndObject != NULL; WndObject = WndObject->spwndParent)
    {
       Wnd = WndObject->Wnd;
-      if (!(Wnd->style & WS_VISIBLE) ||
+      if ( Window->state & WINDOWSTATUS_DESTROYING || // state2
+           Window->state & WINDOWSTATUS_DESTROYED ||
+           !Wnd ||
+           !(Wnd->style & WS_VISIBLE) ||
             ((Wnd->style & WS_MINIMIZE) && (WndObject != Window)))
       {
          return FALSE;
index 3522cd1..f0dcc3a 100644 (file)
@@ -490,28 +490,17 @@ NtUserCallHwndLock(
 
       case HWNDLOCK_ROUTINE_DRAWMENUBAR:
          {
-            PMENU_OBJECT Menu;
             DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
-            Ret = FALSE;
-            if (!((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD))
-               break;
-
-            if(!(Menu = UserGetMenuObject((HMENU)(DWORD_PTR) Wnd->IDMenu)))
-               break;
-
-            Menu->MenuInfo.WndOwner = hWnd;
-            Menu->MenuInfo.Height = 0;
-
-            co_WinPosSetWindowPos( Window,
-                                   HWND_DESKTOP,
-                                   0,0,0,0,
-                                   SWP_NOSIZE|
-                                   SWP_NOMOVE|
-                                   SWP_NOZORDER|
-                                   SWP_NOACTIVATE|
-                                   SWP_FRAMECHANGED );
-
             Ret = TRUE;
+            if ((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD)
+               co_WinPosSetWindowPos( Window,
+                                      HWND_DESKTOP,
+                                      0,0,0,0,
+                                      SWP_NOSIZE|
+                                      SWP_NOMOVE|
+                                      SWP_NOZORDER|
+                                      SWP_NOACTIVATE|
+                                      SWP_FRAMECHANGED );
             break;
          }
 
index 04d2b23..f82ed55 100644 (file)
@@ -92,7 +92,9 @@ VIS_ComputeVisibleRegion(
           (PreviousWnd == Wnd && ClipSiblings))
       {
          CurrentSibling = CurrentWindow->spwndChild;
-         while (CurrentSibling != NULL && CurrentSibling != PreviousWindow)
+         while ( CurrentSibling != NULL && 
+                 CurrentSibling != PreviousWindow &&
+                 CurrentSibling->Wnd )
          {
             CurrentSiblingWnd = CurrentSibling->Wnd;
             if ((CurrentSiblingWnd->style & WS_VISIBLE) &&
@@ -121,7 +123,7 @@ VIS_ComputeVisibleRegion(
    if (ClipChildren)
    {
       CurrentWindow = Window->spwndChild;
-      while (CurrentWindow)
+      while (CurrentWindow && CurrentWindow->Wnd)
       {
          CurrentWnd = CurrentWindow->Wnd;
          if ((CurrentWnd->style & WS_VISIBLE) &&
index 38ac3b4..0b53865 100644 (file)
@@ -181,7 +181,7 @@ DceDeleteClipRgn(DCE* Dce)
    }
    else if (Dce->hrgnClip != NULL)
    {
-      REGION_FreeRgnByHandle(Dce->hrgnClip);
+      GDIOBJ_FreeObjByHandle(Dce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT);
    }
 
    Dce->hrgnClip = NULL;
@@ -193,7 +193,7 @@ DceDeleteClipRgn(DCE* Dce)
 static INT FASTCALL
 DceReleaseDC(DCE* dce, BOOL EndPaint)
 {
-   if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_DCEEMPTY | DCX_DCEBUSY)))
+   if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_INDESTROY | DCX_DCEEMPTY | DCX_DCEBUSY)))
    {
       return 0;
    }
@@ -573,6 +573,12 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
    }
    else if (ClipRegion != NULL)
    {
+      if (Dce->hrgnClip != NULL)
+      {
+         DPRINT1("Should not be called!!\n");
+         GDIOBJ_FreeObjByHandle(Dce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT);
+         Dce->hrgnClip = NULL;
+      }
       Dce->hrgnClip = ClipRegion;
    }
 
@@ -621,6 +627,8 @@ DceFreeDCE(PDCE pdce, BOOLEAN Force)
   pLE = pdce->List.Flink;
   ret = CONTAINING_RECORD(pLE, DCE, List);
 
+  pdce->DCXFlags |= DCX_INDESTROY;
+
   if (Force && !GDIOBJ_OwnedByCurrentProcess(pdce->hDC))
   {
      DPRINT("Change ownership for DCE! -> %x\n" , pdce);
@@ -638,9 +646,9 @@ DceFreeDCE(PDCE pdce, BOOLEAN Force)
 
   if (!Hit) IntGdiDeleteDC(pdce->hDC, TRUE);
 
-  if (pdce->hrgnClip && ! (pdce->DCXFlags & DCX_KEEPCLIPRGN))
+  if (pdce->hrgnClip && !(pdce->DCXFlags & DCX_KEEPCLIPRGN))
   {
-      REGION_FreeRgnByHandle(pdce->hrgnClip);
+      GDIOBJ_FreeObjByHandle(pdce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT);
       pdce->hrgnClip = NULL;
   }
 
@@ -673,7 +681,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window)
 
   if (DCECount <= 0)
   {
-     DPRINT1("No Entry!\n");
+     DPRINT1("FreeWindowDCE No Entry! %d\n",DCECount);
      return;
   }
 
@@ -681,8 +689,16 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window)
   pDCE = CONTAINING_RECORD(pLE, DCE, List);
   do
   {
-     if (!pDCE) break;
-     if (IsListEmpty(&pDCE->List)) break;
+     if (!pDCE)
+     {
+        DPRINT1("FreeWindowDCE No DCE Pointer!\n");
+        break;
+     }
+     if (IsListEmpty(&pDCE->List))
+     {
+        DPRINT1("FreeWindowDCE List is Empty!!!!\n");
+        break;
+     }
      if ( pDCE->hwndCurrent == Window->hSelf &&
           !(pDCE->DCXFlags & DCX_DCEEMPTY) )
      {
@@ -700,7 +716,10 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window)
 
               DPRINT("POWNED DCE going Cheap!! DCX_CACHE!! hDC-> %x \n", pDCE->hDC);
               if (!IntGdiSetDCOwnerEx( pDCE->hDC, GDI_OBJ_HMGR_NONE, FALSE))
-                  return;
+              {
+                  DPRINT1("Fail Owner Switch hDC-> %x \n", pDCE->hDC);
+                  break;
+              }
               /* Do not change owner so thread can clean up! */
            }
            else if (Window->Wnd->pcls->style & CS_OWNDC) /* owned DCE*/
@@ -711,6 +730,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window)
            }
            else
            {
+              DPRINT1("Not POWNED or CLASSDC hwndCurrent -> %x \n", pDCE->hwndCurrent);
               ASSERT(FALSE);
            }
         }
@@ -825,7 +845,7 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window)
    {
       if(!pDCE) break;
       if(pLE == &LEDce) break;
-      if (0 == (pDCE->DCXFlags & DCX_DCEEMPTY))
+      if (0 == (pDCE->DCXFlags & (DCX_DCEEMPTY|DCX_INDESTROY)))
       {
          if (Window->hSelf == pDCE->hwndCurrent)
          {
@@ -902,9 +922,12 @@ IntWindowFromDC(HDC hDc)
   Dce = CONTAINING_RECORD(pLE, DCE, List);
   do
   {
-      if(Dce->hDC == hDc)
+      if (Dce->hDC == hDc)
       {
-         Ret = Dce->hwndCurrent;
+         if (Dce->DCXFlags & DCX_INDESTROY)
+            Ret = NULL;
+         else
+            Ret = Dce->hwndCurrent;
          break;
       }
       pLE = Dce->List.Flink;
index 2991387..4445fff 100644 (file)
@@ -2057,9 +2057,7 @@ AllocErr:
    }
    else if ( Wnd->pcls->style & CS_OWNDC)
    {  /* Allocate a DCE for this window. */
-      PDCE pDce = DceAllocDCE(Window, DCE_WINDOW_DC);
-      if (!Wnd->pcls->pdce)
-         Wnd->pcls->pdce = pDce;
+      DceAllocDCE(Window, DCE_WINDOW_DC);
    }
 
    Pos.x = x;
index 9b7416c..acfc99b 100644 (file)
@@ -202,6 +202,7 @@ GdiGetClipBox(HDC hDC, PRECTL rc)
       return ERROR;
    }
 
+   /* FIXME! Rao and Vis only! */
    if (dc->prgnAPI) // APIRGN
    {
       hRgn = ((PROSRGNDATA)dc->prgnAPI)->BaseObject.hHmgr;
index 6dfe195..40a7956 100644 (file)
@@ -59,12 +59,37 @@ GetRegistryPath(PUNICODE_STRING RegistryPath, ULONG DisplayNumber)
     return TRUE;
 }
 
+
+NTSTATUS
+NTAPI
+EnumDisplayQueryRoutine(IN PWSTR ValueName,
+                        IN ULONG ValueType,
+                        IN PVOID ValueData,
+                        IN ULONG ValueLength,
+                        IN PVOID Context,
+                        IN PVOID EntryContext)
+{
+    if ((Context == NULL) && ((ValueType == REG_SZ) || (ValueType == REG_MULTI_SZ)))
+    {
+        *(PULONG)EntryContext = ValueLength;
+    }
+    else
+    {
+        DPRINT1("Value data: %S %d\n", ValueData, ValueLength);
+        RtlCopyMemory(Context, ValueData, ValueLength);
+    }
+
+    return STATUS_SUCCESS;
+}
+
 static BOOL FASTCALL
 FindDriverFileNames(PUNICODE_STRING DriverFileNames, ULONG DisplayNumber)
 {
     RTL_QUERY_REGISTRY_TABLE QueryTable[2];
     UNICODE_STRING RegistryPath;
     NTSTATUS Status;
+    PWCHAR DriverNames = NULL;
+    ULONG Length = 0;
 
     if (! GetRegistryPath(&RegistryPath, DisplayNumber))
     {
@@ -73,23 +98,40 @@ FindDriverFileNames(PUNICODE_STRING DriverFileNames, ULONG DisplayNumber)
     }
 
     RtlZeroMemory(QueryTable, sizeof(QueryTable));
-    QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT;
+    QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_NOEXPAND;
     QueryTable[0].Name = L"InstalledDisplayDrivers";
-    QueryTable[0].EntryContext = DriverFileNames;
+    QueryTable[0].EntryContext = &Length;
+    QueryTable[0].QueryRoutine = EnumDisplayQueryRoutine;
 
     Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
                                     RegistryPath.Buffer,
                                     QueryTable,
                                     NULL,
                                     NULL);
+ //   DPRINT1("Status: %lx\n", Status);
+    if (Length)
+    {
+        DriverNames = ExAllocatePool(PagedPool, Length);
+       // DPRINT1("Length allocated: %d\n", Length);
+        Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
+                                        RegistryPath.Buffer,
+                                        QueryTable,
+                                        DriverNames,
+                                        NULL);
+        if (!NT_SUCCESS(Status)) DriverNames = NULL;
+    }
+
     ExFreePoolWithTag(RegistryPath.Buffer, TAG_RTLREGISTRY);
     if (! NT_SUCCESS(Status))
     {
         DPRINT1("No InstalledDisplayDrivers value in service entry found\n");
         return FALSE;
     }
-
-    DPRINT("DriverFileNames %S\n", DriverFileNames->Buffer);
+    
+    RtlInitUnicodeString(DriverFileNames, DriverNames);
+    DriverFileNames->Length = Length;
+    DriverFileNames->MaximumLength = Length;
+    //DPRINT1("DriverFileNames %wZ\n", DriverFileNames);
 
     return TRUE;
 }
@@ -301,7 +343,7 @@ IntPrepareDriver(VOID)
             continue;
         }
 
-        DPRINT("Display driver %S loaded\n", CurrentName);
+        DPRINT1("Display driver %S loaded\n", CurrentName);
 
         ExFreePoolWithTag(DriverFileNames.Buffer, TAG_RTLREGISTRY);
 
index bdda9c2..fea0c10 100644 (file)
@@ -44,6 +44,7 @@
 #include <freetype/tttables.h>
 #include <freetype/fttrigon.h>
 #include <freetype/ftglyph.h>
+#include <freetype/ftbitmap.h>
 #include <freetype/ftoutln.h>
 #include <freetype/ftwinfnt.h>
 
@@ -81,7 +82,7 @@ typedef struct _FONT_CACHE_ENTRY
     LIST_ENTRY ListEntry;
     int GlyphIndex;
     FT_Face Face;
-    FT_Glyph Glyph;
+    FT_BitmapGlyph BitmapGlyph;
     int Height;
 } FONT_CACHE_ENTRY, *PFONT_CACHE_ENTRY;
 static LIST_ENTRY FontCacheListHead;
@@ -1349,7 +1350,7 @@ ftGdiGetRasterizerCaps(LPRASTERIZER_STATUS lprs)
 }
 
 
-FT_Glyph APIENTRY
+FT_BitmapGlyph APIENTRY
 ftGdiGlyphCacheGet(
     FT_Face Face,
     INT GlyphIndex,
@@ -1376,10 +1377,10 @@ ftGdiGlyphCacheGet(
 
     RemoveEntryList(CurrentEntry);
     InsertHeadList(&FontCacheListHead, CurrentEntry);
-    return FontEntry->Glyph;
+    return FontEntry->BitmapGlyph;
 }
 
-FT_Glyph APIENTRY
+FT_BitmapGlyph APIENTRY
 ftGdiGlyphCacheSet(
     FT_Face Face,
     INT GlyphIndex,
@@ -1390,6 +1391,8 @@ ftGdiGlyphCacheSet(
     FT_Glyph GlyphCopy;
     INT error;
     PFONT_CACHE_ENTRY NewEntry;
+    FT_Bitmap AlignedBitmap;
+    FT_BitmapGlyph BitmapGlyph;
 
     error = FT_Get_Glyph(GlyphSlot, &GlyphCopy);
     if (error)
@@ -1397,6 +1400,7 @@ ftGdiGlyphCacheSet(
         DPRINT1("Failure caching glyph.\n");
         return NULL;
     };
+
     error = FT_Glyph_To_Bitmap(&GlyphCopy, RenderMode, 0, 1);
     if (error)
     {
@@ -1412,22 +1416,34 @@ ftGdiGlyphCacheSet(
         return NULL;
     }
 
+    BitmapGlyph = (FT_BitmapGlyph)GlyphCopy;
+    FT_Bitmap_New(&AlignedBitmap);
+    if(FT_Bitmap_Convert(GlyphSlot->library, &BitmapGlyph->bitmap, &AlignedBitmap, 4))
+    {
+        DPRINT1("Conversion failed\n");
+        FT_Done_Glyph((FT_Glyph)BitmapGlyph);
+        return NULL;
+    }
+
+    FT_Bitmap_Done(GlyphSlot->library, &BitmapGlyph->bitmap);
+    BitmapGlyph->bitmap = AlignedBitmap;
+
     NewEntry->GlyphIndex = GlyphIndex;
     NewEntry->Face = Face;
-    NewEntry->Glyph = GlyphCopy;
+    NewEntry->BitmapGlyph = BitmapGlyph;
     NewEntry->Height = Height;
 
     InsertHeadList(&FontCacheListHead, &NewEntry->ListEntry);
     if (FontCacheNumEntries++ > MAX_FONT_CACHE)
     {
         NewEntry = (PFONT_CACHE_ENTRY)FontCacheListHead.Blink;
-        FT_Done_Glyph(NewEntry->Glyph);
+        FT_Done_Glyph((FT_Glyph)NewEntry->BitmapGlyph);
         RemoveTailList(&FontCacheListHead);
         ExFreePool(NewEntry);
         FontCacheNumEntries--;
     }
 
-    return GlyphCopy;
+    return BitmapGlyph;
 }
 
 
@@ -2112,7 +2128,7 @@ TextIntGetTextExtentPoint(PDC dc,
     PFONTGDI FontGDI;
     FT_Face face;
     FT_GlyphSlot glyph;
-    FT_Glyph realglyph;
+    FT_BitmapGlyph realglyph;
     INT error, n, glyph_index, i, previous;
     ULONGLONG TotalWidth = 0;
     FT_CharMap charmap, found = NULL;
@@ -2208,7 +2224,7 @@ TextIntGetTextExtentPoint(PDC dc,
             TotalWidth += delta.x;
         }
 
-        TotalWidth += realglyph->advance.x >> 10;
+        TotalWidth += realglyph->root.advance.x >> 10;
 
         if (((TotalWidth + 32) >> 6) <= MaxExtent && NULL != Fit)
         {
@@ -3133,8 +3149,7 @@ GreExtTextOutW(
     int error, glyph_index, n, i;
     FT_Face face;
     FT_GlyphSlot glyph;
-    FT_Glyph realglyph;
-    FT_BitmapGlyph realglyph2;
+    FT_BitmapGlyph realglyph;
     LONGLONG TextLeft, RealXStart;
     ULONG TextTop, previous, BackgroundLeft;
     FT_Bool use_kerning;
@@ -3400,7 +3415,7 @@ GreExtTextOutW(
                 TextWidth += delta.x;
             }
 
-            TextWidth += realglyph->advance.x >> 10;
+            TextWidth += realglyph->root.advance.x >> 10;
 
             previous = glyph_index;
             TempText++;
@@ -3475,26 +3490,12 @@ GreExtTextOutW(
         }
         DPRINT("TextLeft: %d\n", TextLeft);
         DPRINT("TextTop: %d\n", TextTop);
-
-        if (realglyph->format == ft_glyph_format_outline)
-        {
-            DPRINT1("Should already be done\n");
-//         error = FT_Render_Glyph(glyph, RenderMode);
-            error = FT_Glyph_To_Bitmap(&realglyph, RenderMode, 0, 0);
-            if (error)
-            {
-                DPRINT1("WARNING: Failed to render glyph!\n");
-                goto fail2;
-            }
-        }
-        realglyph2 = (FT_BitmapGlyph)realglyph;
-
-        DPRINT("Advance: %d\n", realglyph->advance.x);
+        DPRINT("Advance: %d\n", realglyph->root.advance.x);
 
         if (fuOptions & ETO_OPAQUE)
         {
             DestRect.left = BackgroundLeft;
-            DestRect.right = (TextLeft + (realglyph->advance.x >> 10) + 32) >> 6;
+            DestRect.right = (TextLeft + (realglyph->root.advance.x >> 10) + 32) >> 6;
             DestRect.top = TextTop + yoff - ((face->size->metrics.ascender + 32) >> 6);
             DestRect.bottom = TextTop + yoff + ((32 - face->size->metrics.descender) >> 6);
             IntEngBitBlt(
@@ -3512,31 +3513,25 @@ GreExtTextOutW(
             BackgroundLeft = DestRect.right;
         }
 
-        DestRect.left = ((TextLeft + 32) >> 6) + realglyph2->left;
-        DestRect.right = DestRect.left + realglyph2->bitmap.width;
-        DestRect.top = TextTop + yoff - realglyph2->top;
-        DestRect.bottom = DestRect.top + realglyph2->bitmap.rows;
+        DestRect.left = ((TextLeft + 32) >> 6) + realglyph->left;
+        DestRect.right = DestRect.left + realglyph->bitmap.width;
+        DestRect.top = TextTop + yoff - realglyph->top;
+        DestRect.bottom = DestRect.top + realglyph->bitmap.rows;
 
-        bitSize.cx = realglyph2->bitmap.width;
-        bitSize.cy = realglyph2->bitmap.rows;
-        MaskRect.right = realglyph2->bitmap.width;
-        MaskRect.bottom = realglyph2->bitmap.rows;
+        bitSize.cx = realglyph->bitmap.width;
+        bitSize.cy = realglyph->bitmap.rows;
+        MaskRect.right = realglyph->bitmap.width;
+        MaskRect.bottom = realglyph->bitmap.rows;
 
         /*
          * We should create the bitmap out of the loop at the biggest possible
          * glyph size. Then use memset with 0 to clear it and sourcerect to
          * limit the work of the transbitblt.
-         *
-         * FIXME: DIB bitmaps should have an lDelta which is a multiple of 4.
-         * Here we pass in the pitch from the FreeType bitmap, which is not
-         * guaranteed to be a multiple of 4. If it's not, we should expand
-         * the FreeType bitmap to a temporary bitmap.
          */
 
-        HSourceGlyph = EngCreateBitmap(bitSize, realglyph2->bitmap.pitch,
-                                       (realglyph2->bitmap.pixel_mode == ft_pixel_mode_grays) ?
-                                       BMF_8BPP : BMF_1BPP, BMF_TOPDOWN,
-                                       realglyph2->bitmap.buffer);
+        HSourceGlyph = EngCreateBitmap(bitSize, realglyph->bitmap.pitch,
+                                       BMF_8BPP, BMF_TOPDOWN,
+                                       realglyph->bitmap.buffer);
         if ( !HSourceGlyph )
         {
             DPRINT1("WARNING: EngLockSurface() failed!\n");
@@ -3590,7 +3585,7 @@ GreExtTextOutW(
 
         if (NULL == Dx)
         {
-            TextLeft += realglyph->advance.x >> 10;
+            TextLeft += realglyph->root.advance.x >> 10;
              DPRINT("new TextLeft: %d\n", TextLeft);
         }
         else
index 8cb32a7..bbc36ff 100644 (file)
@@ -72,7 +72,7 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
   {
     pdcattr = dc->pdcattr;
   }
-  // The thread is approaching the end of sunset.
+  // FYI! The thread is approaching the end of sunset.
   switch(pHdr->Cmd)
   {
      case GdiBCPatBlt: // Highest pri first!
@@ -101,8 +101,9 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
         TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL);
         pdcattr->ulDirty_ &= ~(DIRTY_CHARSET);
      }
-     case GdiBCDelObj:
      case GdiBCDelRgn:
+        DPRINT("Delete Region Object!\n");
+     case GdiBCDelObj:
      {
         PGDIBSOBJECT pgO = (PGDIBSOBJECT) pHdr;
         GreDeleteObject( pgO->hgdiobj );
@@ -138,6 +139,7 @@ NTSTATUS
 APIENTRY
 NtGdiFlushUserBatch(VOID)
 {
+  BOOL Hit;
   PTEB pTeb = NtCurrentTeb();
   ULONG GdiBatchCount = pTeb->GdiBatchCount;
 
@@ -146,8 +148,9 @@ NtGdiFlushUserBatch(VOID)
     HDC hDC = (HDC) pTeb->GdiTebBatch.HDC;
 
     /*  If hDC is zero and the buffer fills up with delete objects we need
-        to run anyway. So, hard code to the system batch limit. */
-    if ((hDC) || (GdiBatchCount >= GDI_BATCH_LIMIT))
+        to run anyway.
+     */
+    if (hDC || GdiBatchCount)
     {
       PCHAR pHdr = (PCHAR)&pTeb->GdiTebBatch.Buffer[0];
       PDC pDC = NULL;
@@ -158,8 +161,26 @@ NtGdiFlushUserBatch(VOID)
       }
 
        // No need to init anything, just go!
-       for (; GdiBatchCount > 0; GdiBatchCount--)
-       {
+       for (Hit = FALSE; GdiBatchCount > 0; GdiBatchCount--)
+       {   /*
+              Looks like a hack,
+              feels like a hack,
+              you're right it's a hack,
+              due to the lack,
+              of kernel thread locking when it is in sunset!
+            */
+           _SEH2_TRY
+           {
+              ((PGDIBATCHHDR)pHdr)->Cmd = ((PGDIBATCHHDR)pHdr)->Cmd;
+           }
+           _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+           {
+              Hit = TRUE;
+           }
+           _SEH2_END;
+
+           if (Hit) break;
+
            // Process Gdi Batch!
            pHdr += GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr);
        }
index 083f6bd..3922016 100644 (file)
@@ -3439,27 +3439,33 @@ NtGdiEqualRgn(
         return ERROR;
     }
 
-    if (rgn1->rdh.nCount != rgn2->rdh.nCount ||
-            rgn1->rdh.nCount == 0 ||
-            rgn1->rdh.rcBound.left   != rgn2->rdh.rcBound.left ||
-            rgn1->rdh.rcBound.right  != rgn2->rdh.rcBound.right ||
-            rgn1->rdh.rcBound.top    != rgn2->rdh.rcBound.top ||
-            rgn1->rdh.rcBound.bottom != rgn2->rdh.rcBound.bottom)
-        goto exit;
+    if ( rgn1->rdh.nCount != rgn2->rdh.nCount ) goto exit;
+
+    if ( rgn1->rdh.nCount == 0 )
+    {
+       bRet = TRUE;
+       goto exit;  
+    }
+
+    if ( rgn1->rdh.rcBound.left   != rgn2->rdh.rcBound.left  ||
+         rgn1->rdh.rcBound.right  != rgn2->rdh.rcBound.right ||
+         rgn1->rdh.rcBound.top    != rgn2->rdh.rcBound.top   ||
+         rgn1->rdh.rcBound.bottom != rgn2->rdh.rcBound.bottom )
+       goto exit;
 
     tRect1 = rgn1->Buffer;
     tRect2 = rgn2->Buffer;
 
     if (!tRect1 || !tRect2)
-        goto exit;
+       goto exit;
 
     for (i=0; i < rgn1->rdh.nCount; i++)
     {
-        if (tRect1[i].left   != tRect2[i].left ||
-                tRect1[i].right  != tRect2[i].right ||
-                tRect1[i].top    != tRect2[i].top ||
-                tRect1[i].bottom != tRect2[i].bottom)
-            goto exit;
+        if ( tRect1[i].left   != tRect2[i].left  ||
+             tRect1[i].right  != tRect2[i].right ||
+             tRect1[i].top    != tRect2[i].top   ||
+             tRect1[i].bottom != tRect2[i].bottom )
+           goto exit;
     }
     bRet = TRUE;
 
index 16177f8..1ffb3df 100644 (file)
@@ -1,7 +1,6 @@
 // pre-compiled header stuff
 
-#ifndef PCH_H
-#define PCH_H
+#pragma once
 
 #ifdef _MSC_VER
 #pragma warning ( disable : 4786 ) // identifier was truncated to '255' characters in the debug information
@@ -43,5 +42,3 @@ inline char * strlwr(char *x)
 #define MAX_PATH PATH_MAX
 #define _MAX_PATH PATH_MAX
 #endif
-
-#endif//PCH_H
index 4183084..f6175af 100755 (executable)
@@ -4,8 +4,8 @@
  * FILE:        tools/cabman/cabinet.h
  * PURPOSE:     Cabinet definitions
  */
-#ifndef __CABINET_H
-#define __CABINET_H
+
+#pragma once
 
 #if defined(WIN32)
 #include <windows.h>
@@ -496,6 +496,4 @@ private:
 #endif /* CAB_READ_ONLY */
 };
 
-#endif /* __CABINET_H */
-
 /* EOF */
index ed7be30..0c887cb 100755 (executable)
@@ -4,8 +4,8 @@
  * FILE:        tools/cabman/cabman.h
  * PURPOSE:     Cabinet manager header
  */
-#ifndef __CABMAN_H
-#define __CABMAN_H
+
+#pragma once
 
 #include "cabinet.h"
 #include "dfp.h"
@@ -41,6 +41,4 @@ private:
     char FileName[MAX_PATH];
 };
 
-#endif /* __CABMAN_H */
-
 /* EOF */
index 4c94fd3..bf50caa 100755 (executable)
@@ -4,8 +4,8 @@
  * FILE:        tools/cabman/dfp.h
  * PURPOSE:     Directive file parser header
  */
-#ifndef __DFP_H
-#define __DFP_H
+
+#pragma once
 
 #include "cabinet.h"
 
@@ -138,6 +138,4 @@ private:
     bool InfModeEnabled;
 };
 
-#endif /* __DFP_H */
-
 /* EOF */
index ebe83fc..da5c59f 100755 (executable)
@@ -4,8 +4,8 @@
  * FILE:        tools/cabman/mszip.h
  * PURPOSE:     CAB codec for MSZIP compressed data
  */
-#ifndef __MSZIP_H
-#define __MSZIP_H
+
+#pragma once
 
 #include "cabinet.h"
 #include <zlib.h>
@@ -36,6 +36,4 @@ private:
     z_stream ZStream; /* Zlib stream */
 };
 
-#endif /* __MSZIP_H */
-
 /* EOF */
index 635712f..0b79efb 100755 (executable)
@@ -4,8 +4,8 @@
  * FILE:        tools/cabman/raw.h
  * PURPOSE:     CAB codec for uncompressed data
  */
-#ifndef __RAW_H
-#define __RAW_H
+
+#pragma once
 
 #include "cabinet.h"
 
@@ -30,6 +30,4 @@ public:
                              PULONG OutputLength);
 };
 
-#endif /* __RAW_H */
-
 /* EOF */
index f152a7b..9d2be75 100644 (file)
@@ -1,8 +1,10 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
+<group>
 <module name="geninc" type="buildtool">
        <file>geninc.c</file>
 </module>
 <module name="geninc_data" type="bootloader" installname="geninc_data.bin">
        <file>data.c</file>
 </module>
+</group>
index ef75198..1591e48 100644 (file)
@@ -12,6 +12,8 @@
 #include <string.h>
 #include <ctype.h>
 
+//#define DBG 1
+
 #if DBG
 #define trace printf
 #else
@@ -70,24 +72,40 @@ LoadFile(const char* pszFileName, size_t* pFileSize)
 {
        FILE* file;
        void* pFileData = NULL;
+       int iFileSize;
+
+    trace("Loading file...");
 
        file = fopen(pszFileName, "rb");
-       if (file != NULL)
+       if (!file)
        {
-               fseek(file, 0L, SEEK_END);
-               *pFileSize = ftell(file);
-               fseek(file, 0L, SEEK_SET);
-               pFileData = malloc(*pFileSize);
-               if (pFileData != NULL)
-               {
-                       if (*pFileSize != fread(pFileData, 1, *pFileSize, file))
-                       {
-                               free(pFileData);
-                               pFileData = NULL;
-                       }
-               }
-               fclose(file);
+           trace("Could not open file\n");
+           return NULL;
        }
+
+    fseek(file, 0L, SEEK_END);
+    iFileSize = ftell(file);
+    fseek(file, 0L, SEEK_SET);
+    *pFileSize = iFileSize;
+    trace("ok. Size is %d\n", iFileSize);
+
+    pFileData = malloc(iFileSize + 1);
+
+    if (pFileData != NULL)
+    {
+        if (iFileSize != fread(pFileData, 1, iFileSize, file))
+        {
+            free(pFileData);
+            pFileData = NULL;
+        }
+    }
+    else
+    {
+        trace("Could not allocate memory for file\n");
+    }
+
+    fclose(file);
+
        return pFileData;
 }
 
@@ -452,6 +470,9 @@ ParseInputFile(const char *pszInFile, FILE *fileOut)
 
             /* Restore the global file name */
             gpszCurFile = pszInFile;
+            
+            /* Restore the zeroed character */
+            *p2 = ')';
 
             if (ret == -1)
             {
@@ -481,6 +502,8 @@ ParseInputFile(const char *pszInFile, FILE *fileOut)
     /* Free the file data */
     free(pInputData);
 
+    trace("Done with file.\n\n");
+
     return 0;
 }
 
@@ -494,7 +517,7 @@ main(int argc, char* argv[])
 
     if (argc != 3)
     {
-        error("Usage: hc <inputfile> <outputfile>\n");
+        error("Usage: hpp <inputfile> <outputfile>\n");
         exit(1);
     }
 
index fd5bcc2..d8faa8d 100644 (file)
@@ -4,6 +4,7 @@
  *
  * - Image directory caching
  */
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -65,6 +66,14 @@ unpack_iso(char *dir, char *iso)
     return res;
 }
 
+int
+cleanable(char *path)
+{
+       if (strcmp(basename(path),DEF_OPT_DIR) == 0)
+               return 1;
+       return 0;
+}
+
 int
 check_directory(int force)
 {
@@ -135,7 +144,10 @@ check_directory(int force)
     cache_name = malloc(MAX_PATH);
     tmp_name = malloc(MAX_PATH);
     strcpy(cache_name, opt_dir);
-    strcat(cache_name, PATH_STR CACHEFILE);
+       if (cleanable(opt_dir))
+               strcat(cache_name, ALT_PATH_STR CACHEFILE);
+       else
+               strcat(cache_name, PATH_STR CACHEFILE);
     strcpy(tmp_name, cache_name);
     strcat(tmp_name, "~");
     return 0;
@@ -271,4 +283,4 @@ create_cache(int force, int skipImageBase)
     return 0;
 }
 
-
+/* EOF */
index b33e5f9..0acdd4c 100644 (file)
@@ -5,13 +5,11 @@
  * - Image directory caching
  */
 
-#ifndef __L2L_CACHE_H__
-#define __L2L_CACHE_H__
+#pragma once
 
 int check_directory(int force);
 int read_cache(void);
 int create_cache(int force, int skipImageBase);
-
-#endif /* __L2L_CACHE_H__ */
+int cleanable(char *path);
 
 /* EOF */
index 76d8768..1b364db 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __L2L_COMPAT_H__
-#define __L2L_COMPAT_H__
+#pragma once
 
 #if defined (__DJGPP__) || defined (__WIN32__)
 
@@ -35,7 +34,4 @@
 
 #endif /* not defined (__DJGPP__) || defined (__WIN32__) */
 
-
-#endif /* __L2L_COMPAT_H__ */
-
 /* EOF */
index c1a29d2..d1c7389 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __L2L_CONFIG_H__
-#define __L2L_CONFIG_H__
+#pragma once
 
 /* Assume if an offset > ABS_TRESHOLD, then it must be absolute */
 #define ABS_TRESHOLD    0x00400000L
 "%s x -y -r %s" PATH_STR "reactos" PATH_STR "reactos.cab -o%s" \
 PATH_STR "reactos" PATH_STR "reactos > " DEV_NULL
 
+/* When we can't use a normal path, because it gets cleaned,
+ * fallback to name mangling: 
+ */ 
+#define ALT_PATH_STR    "#"
+
 #define LINESIZE        1024
 #define NAMESIZE        80
 
-#endif /* __L2L_CONFIG_H__ */
-
 /* EOF */
index 37e6bf4..c036d48 100644 (file)
@@ -4,6 +4,7 @@
  *
  * - Help text and functions
  */
+
 #include <stdio.h>
 
 #include "version.h"
@@ -51,6 +52,9 @@ char *verboseUsage =
 "  -l <logFile>\n"
 "       <logFile>: Append copy to specified logFile.\n"
 "       Default: no logFile\n\n"
+"  -L <logFile>\n"
+"       <logFile>: (Over)write copy to specified logFile.\n"
+"       Default: no logFile\n\n"
 "  -m   Prefix (mark) each translated line with '* '.\n\n"
 "  -M   Prefix (mark) each NOT translated line with '? '.\n"
 "       ( Only for lines of the form: <IMAGENAME:ADDRESS> )\n\n"
@@ -112,7 +116,7 @@ char *verboseUsage =
 "       For a reliable result, these sources should be up to date with\n"
 "       the tested revision (or try '-R check').\n"
 "       Can be combined with -tTR.\n"
-"       Implies -U (For retrieving source info).\n\n"
+"       Implies -U (For retrieving source info) and -R check.\n\n"
 "  -t   Translate twice. The address itself and for (address-1).\n"
 "       Show extra filename, func and linenumber between [..] if they differ\n"
 "       So if only the linenumbers differ, then only show the extra\n"
@@ -139,7 +143,10 @@ char *verboseUsage =
 "  Options accepting a string as argument can be cleared by the value '" KDBG_ESC_OFF "'.\n"
 "  Some ClI commands are read only or not (entirely) implemented.\n"
 "  If no value is provided, the current one is printed.\n"
-"  There are only a few extra ClI commands or with different behaviour:\n"
+"  There are a few extra ClI commands or with different behaviour:\n"
+"  - `a <module>:<reladdress>:\n"
+"    - Outputs absolute address e.g. for setting breakpoints.\n"
+"    - Do a 'mod' first to retrieve relocation info.\n"
 "  - `h : shows this helptext (without exiting)\n"
 "  - `q : quits log2lines\n"
 "  - `R regscan : the output is printed immediately (do a 'bt' first)\n"
@@ -233,7 +240,14 @@ char *verboseUsage =
 "       | L2L- -l logfile is \"new.log\" (changed)\n"
 "       kdb:> `l off\n"
 "       | L2L- -l logfile is "" (changed)\n"
-"       kdb:>\n"
+"       kdb:>\n\n"
+"  Set a breakpoint with help of 'mod' and '`a':\n"
+"       <msi.dll:2e35d (dll/win32/msi/msiquery.c:189 (MSI_IterateRecords))>\n"
+"       kdb:> mod (for kernel tracing usually only needed once)\n"
+"       -- mod output with reloc info\n"
+"       kdb:> `a msi.dll:2e35d\n"
+"       | L2L- Address: 0x00096ca0\n"
+"       kdb:> bpx 0x00096ca0\n\n"
 "\n";
 
 void
@@ -246,3 +260,5 @@ usage(int verbose)
     else
         fprintf(stderr, "Try log2lines -h\n");
 }
+
+/* EOF */
index 5f2ab38..9f08f57 100644 (file)
@@ -5,13 +5,10 @@
  * - Help text and functions
  */
 
-#ifndef __L2L_HELP_H__
-#define __L2L_HELP_H__
+#pragma once
 
 extern char *verboseUsage;
 
 void usage(int verbose);
 
-#endif /* __L2L_HELP_H__ */
-
 /* EOF */
index f94abcb..bae302b 100644 (file)
@@ -4,11 +4,12 @@
  *
  * - Image functions for symbol info
  */
-#include <sys/stat.h>
+
 #include <errno.h>
 #include <string.h>
 #include <rsym.h>
 
+#include "compat.h"
 #include "util.h"
 #include "options.h"
 #include "log2lines.h"
@@ -163,3 +164,5 @@ get_ImageBase(char *fname, size_t *ImageBase)
     fclose(fr);
     return 0;
 }
+
+/* EOF */
index acc6712..f9371e0 100644 (file)
@@ -5,8 +5,7 @@
  * - Image functions for symbol info
  */
 
-#ifndef __L2L_IMAGE_H__
-#define __L2L_IMAGE_H__
+#pragma once
 
 #include <rsym.h>
 
@@ -18,7 +17,4 @@ PIMAGE_SECTION_HEADER get_sectionheader(const void *FileData);
 
 int get_ImageBase(char *fname, size_t *ImageBase);
 
-
-#endif /* __L2L_IMAGE_H__ */
-
 /* EOF */
index 4491d07..3fdd22b 100644 (file)
@@ -9,6 +9,7 @@
 #include <string.h>
 #include <stdlib.h>
 
+#include "config.h"
 #include "compat.h"
 #include "list.h"
 #include "util.h"
@@ -162,6 +163,8 @@ cache_entry_create(char *Line)
         l2l_dbg(1, "ImageBase field missing\n");
         return entry_delete(pentry);
     }
+    pentry->RelBase = INVALID_BASE;
+    pentry->Size = 0;
     return pentry;
 }
 
@@ -212,3 +215,5 @@ sources_entry_create(PLIST list, char *path, char *prefix)
 
     return pentry;
 }
+
+/* EOF */
index e23fbc4..fa426d4 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __L2L_LIST_H__
-#define __L2L_LIST_H__
+#pragma once
 
 typedef struct entry_struct
 {
@@ -7,14 +6,16 @@ typedef struct entry_struct
     char *name;
     char *path;
     size_t ImageBase;
+    size_t RelBase;
+    size_t Size;
     struct entry_struct *pnext;
-} LIST_MEMBER,*PLIST_MEMBER;
+} LIST_MEMBER, *PLIST_MEMBER;
 
 typedef struct list_struct
 {
     PLIST_MEMBER phead;
     PLIST_MEMBER ptail;
-} LIST,*PLIST;
+} LIST, *PLIST;
 
 PLIST_MEMBER entry_lookup(PLIST list, char *name);
 PLIST_MEMBER entry_delete(PLIST_MEMBER pentry);
@@ -23,6 +24,4 @@ PLIST_MEMBER cache_entry_create(char *Line);
 PLIST_MEMBER sources_entry_create(PLIST list, char *path, char *prefix);
 void list_clear(PLIST list);
 
-#endif /* __L2L_LIST_H__ */
-
 /* EOF */
index 1ad94f2..c00cfd3 100644 (file)
 #include "log2lines.h"
 #include "help.h"
 #include "cmd.h"
+#include "match.h"
 
 
-static FILE *stdIn          = NULL;
-static FILE *stdOut         = NULL;
+static FILE *dbgIn          = NULL;
+static FILE *dbgOut         = NULL;
+static FILE *conIn          = NULL;
+static FILE *conOut         = NULL;
 static const char *kdbg_prompt = KDBG_PROMPT;
 static const char *kdbg_cont   = KDBG_CONT;
 
@@ -443,15 +446,18 @@ translate_files(FILE *inFile, FILE *outFile)
                             {
                                 if (p == p_eos)
                                 {
-                                    //kdbg prompt, so already echoed char by char 
+                                    // kdbg prompt, so already echoed char by char
                                     memset(Line, '\0', LINESIZE);
                                     translate_char(c, outFile);
                                 }
                                 else
                                 {
-                                    translate_line(outFile, Line, path, LineOut);
-                                    translate_char(c, outFile);
-                                    report(outFile);
+                                    if (match_line(outFile, Line))
+                                    {
+                                        translate_line(outFile, Line, path, LineOut);
+                                        translate_char(c, outFile);
+                                        report(outFile);
+                                    }
                                 }
                             }
                         }
@@ -562,8 +568,10 @@ main(int argc, const char **argv)
     int res = 0;
     int optCount = 0;
 
-    stdIn = stdin;
-    stdOut = stdout;
+    dbgIn = stdin;
+    conOut = stdout;
+    (void)conIn;
+    (void)dbgOut;
 
     memset(&cache, 0, sizeof(LIST));
     memset(&sources, 0, sizeof(LIST));
@@ -596,7 +604,7 @@ main(int argc, const char **argv)
     read_cache();
     l2l_dbg(4, "Cache read complete\n");
 
-    if (set_LogFile(logFile))
+    if (set_LogFile(&logFile))
         return 2;
     l2l_dbg(4, "opt_logFile processed\n");
 
@@ -604,9 +612,9 @@ main(int argc, const char **argv)
     {
         l2l_dbg(3, "Command line: \"%s\"\n",opt_Pipe);
 
-        if (!(stdIn = POPEN(opt_Pipe, "r")))
+        if (!(dbgIn = POPEN(opt_Pipe, "r")))
         {
-            stdIn = stdin; //restore
+            dbgIn = stdin; //restore
             l2l_dbg(0, "Could not popen '%s' (%s)\n", opt_Pipe, strerror(errno));
             free(opt_Pipe); opt_Pipe = NULL;
         }
@@ -631,7 +639,7 @@ main(int argc, const char **argv)
                     l2l_dbg(2, "translating %s %s\n", exefile, offset);
                     translate_file(exefile, my_atoi(offset), Line);
                     printf("%s\n", Line);
-                    report(stdOut);
+                    report(conOut);
                 }
                 else
                 {
@@ -649,14 +657,16 @@ main(int argc, const char **argv)
     }
     else
     {   // translate logging from stdin
-        translate_files(stdIn, stdOut);
+        translate_files(dbgIn, conOut);
     }
 
     if (logFile)
         fclose(logFile);
 
     if (opt_Pipe)
-        PCLOSE(stdIn);
+        PCLOSE(dbgIn);
 
     return res;
 }
+
+/* EOF */
index 5d4059f..f7fd9ff 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef __LOG2LINES_H__
-#define __LOG2LINES_H__
+#pragma once
 
 #include <stdio.h>
 #include <rsym.h>
@@ -30,6 +29,4 @@ extern FILE *logFile;
 extern LINEINFO lastLine;
 extern LIST sources;
 
-#endif /* __LOG2LINES_H__ */
-
 /* EOF */
index 358fd83..d19d6c0 100644 (file)
@@ -31,6 +31,7 @@ LOG2LINES_SOURCES = \
        $(LOG2LINES_BASE_)stat.c \
        $(LOG2LINES_BASE_)revision.c \
        $(LOG2LINES_BASE_)cmd.c \
+       $(LOG2LINES_BASE_)match.c \
        $(LOG2LINES_BASE_)log2lines.c \
        $(RSYM_BASE_)rsym_common.c
 
@@ -88,6 +89,10 @@ $(LOG2LINES_INT_)cmd.o: $(LOG2LINES_BASE_)cmd.c | $(LOG2LINES_INT)
        $(ECHO_HOSTCC)
        ${host_gcc} $(LOG2LINES_HOST_CFLAGS) -c $< -o $@
 
+$(LOG2LINES_INT_)match.o: $(LOG2LINES_BASE_)match.c | $(LOG2LINES_INT)
+       $(ECHO_HOSTCC)
+       ${host_gcc} $(LOG2LINES_HOST_CFLAGS) -c $< -o $@
+
 .PHONY: log2lines_clean
 log2lines_clean:
        -@$(rm) $(LOG2LINES_TARGET) $(LOG2LINES_OBJECTS) 2>$(NUL)
index 88d7f4b..efa77e4 100644 (file)
@@ -4,6 +4,7 @@
  *
  * - Option init and parsing
  */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -16,7 +17,7 @@
 #include "log2lines.h"
 #include "options.h"
 
-char *optchars       = "bcd:fFhl:mMP:rR:sS:tTuUvz:";
+char *optchars       = "bcd:fFhl:L:mMP:rR:sS:tTuUvz:";
 int   opt_buffered   = 0;        // -b
 int   opt_help       = 0;        // -h
 int   opt_force      = 0;        // -f
@@ -37,8 +38,10 @@ int   opt_Twice      = 0;        // -T
 int   opt_undo       = 0;        // -u
 int   opt_redo       = 0;        // -U
 char *opt_Revision   = NULL;     // -R
+int   opt_Revision_check = 0;    // -R check
 char  opt_dir[MAX_PATH];         // -d <opt_dir>
-char  opt_logFile[MAX_PATH];     // -l <opt_logFile>
+char  opt_logFile[MAX_PATH];     // -l|L <opt_logFile>
+char *opt_mod        = NULL;     // -mod for opt_logFile
 char  opt_7z[MAX_PATH];          // -z <opt_7z>
 char  opt_scanned[LINESIZE];     // all scanned options
 char  opt_SourcesPath[LINESIZE]; //sources path
@@ -48,6 +51,7 @@ int optionInit(int argc, const char **argv)
     int i;
     char *s;
 
+    opt_mod = "a";
     strcpy(opt_dir, "");
     strcpy(opt_logFile, "");
     strcpy(opt_7z, CMD_7Z);
@@ -70,6 +74,9 @@ int optionInit(int argc, const char **argv)
             case 'd':
                 strcpy(opt_dir, argv[i+1]);
                 break;
+            case 'L':
+                opt_mod = "w";
+                //fall through
             case 'l':
                 strcpy(opt_logFile, argv[i+1]);
                 break;
@@ -146,6 +153,8 @@ int optionParse(int argc, const char **argv)
             free(opt_Revision);
             opt_Revision = malloc(LINESIZE);
             sscanf(optarg, "%s", opt_Revision);
+                       if (strcmp(opt_Revision, "check") == 0)
+                               opt_Revision_check ++;
             break;
         case 's':
             opt_stats++;
@@ -161,6 +170,7 @@ int optionParse(int argc, const char **argv)
                 /* need to retranslate for source info: */
                 opt_undo++;
                 opt_redo++;
+                               opt_Revision_check ++;
             }
             break;
         case 't':
@@ -208,3 +218,5 @@ int optionParse(int argc, const char **argv)
 
     return optCount;
 }
+
+/* EOF */
index 8051eaa..a3f2d75 100644 (file)
@@ -5,8 +5,7 @@
  * - Option parsing
  */
 
-#ifndef __L2L_OPTIONS_H__
-#define __L2L_OPTIONS_H__
+#pragma once
 
 extern char *optchars;
 extern int   opt_buffered;  // -b
@@ -29,8 +28,10 @@ extern int   opt_Twice ;    // -T
 extern int   opt_undo ;     // -u
 extern int   opt_redo ;     // -U
 extern char *opt_Revision;  // -R
+extern int   opt_Revision_check; // -R check
 extern char  opt_dir[];     // -d <opt_dir>
 extern char  opt_logFile[]; // -l <opt_logFile>
+extern char *opt_mod;       // mod for opt_logFile
 extern char  opt_7z[];      // -z <opt_7z>
 extern char  opt_scanned[]; // all scanned options
 
@@ -39,6 +40,4 @@ extern char  opt_SourcesPath[];    //sources path
 int optionInit(int argc, const char **argv);
 int optionParse(int argc, const char **argv);
 
-#endif /* __L2L_OPTIONS_H__ */
-
 /* EOF */
index 5a05bc6..ae5fa17 100644 (file)
@@ -29,7 +29,7 @@ log_rev_check(FILE *outFile, char *fileName, int showfile)
     if (revinfo.opt_verbose)
         log(outFile, "| R--- %s Last Changed Rev: %d\n", s, rev);
 
-    if (rev && opt_Revision)
+    if (rev && opt_Revision_check)
     {
         if (revinfo.rev < revinfo.buildrev)
         {
@@ -128,9 +128,7 @@ getTBRevision(char *fileName)
 void
 reportRevision(FILE *outFile)
 {
-    if (!opt_Revision)
-        return;
-    if (strcmp(opt_Revision, "check") == 0)
+    if (opt_Revision_check)
     {
         if (lastLine.valid)
             logRevCheck(outFile);
@@ -297,3 +295,5 @@ updateSvnlog(void)
 
     return res;
 }
+
+/* EOF */
index 7a43be9..6da59ad 100644 (file)
@@ -5,8 +5,7 @@
  * - SVN interface and revision analysis
  */
 
-#ifndef __L2L_REVISION_H__
-#define __L2L_REVISION_H__
+#pragma once
 
 #include <stdio.h>
 
@@ -25,6 +24,4 @@ unsigned long findRev(FILE *finx, int *rev);
 int regscan(FILE *outFile);
 int updateSvnlog(void);
 
-#endif /* __L2L_REVISION_H__ */
-
 /* EOF */
index 6f8e5fe..801f693 100644 (file)
@@ -42,3 +42,5 @@ stat_clear(PSUMM psumm)
 {
     memset(psumm, 0, sizeof(SUMM));
 }
+
+/* EOF */
index 6aced47..2b87028 100644 (file)
@@ -5,8 +5,7 @@
  * - Statistics
  */
 
-#ifndef __L2L_STAT_H__
-#define __L2L_STAT_H__
+#pragma once
 
 #include <stdio.h>
 
@@ -27,6 +26,4 @@ typedef struct summ_struct
 void stat_print(FILE *outFile, PSUMM psumm);
 void stat_clear(PSUMM psumm);
 
-#endif /* __L2L_STAT_H__ */
-
 /* EOF */
index 50887e3..19e6342 100644 (file)
 #include "options.h"
 
 int
-set_LogFile(FILE *logFile)
+set_LogFile(FILE **plogFile)
 {
     if (*opt_logFile)
     {
-        if (logFile)
-            fclose(logFile);
-        logFile = NULL;
+        if (*plogFile)
+            fclose(*plogFile);
+        *plogFile = NULL;
 
         if (strcmp(opt_logFile,"none") == 0)
             return 0; //just close
 
-        logFile = fopen(opt_logFile, "a");
-        if (logFile)
+        *plogFile = fopen(opt_logFile, opt_mod ? opt_mod : "a");
+        if (*plogFile)
         {
             // disable buffering so fflush is not needed
             if (!opt_buffered)
             {
                 l2l_dbg(1, "Disabling log buffering on %s\n", opt_logFile);
-                setbuf(logFile, NULL);
+                setbuf(*plogFile, NULL);
             }
             else
                 l2l_dbg(1, "Enabling log buffering on %s\n", opt_logFile);
@@ -186,3 +186,5 @@ copy_file(char *src, char *dst)
     }
     return 0;
 }
+
+/* EOF */
index b4736f5..8df1181 100644 (file)
@@ -5,12 +5,12 @@
  * - Misc utils
  */
 
-#ifndef __L2L_UTIL_H__
-#define __L2L_UTIL_H__
+#pragma once
 
 #include <stdio.h>
 
 #include "cmd.h"
+#include "options.h"
 
 #define log(outFile, fmt, ...)                          \
     {                                                   \
@@ -45,8 +45,6 @@ const char *getFmt(const char *a);
 long my_atoi(const char *a);
 int isOffset(const char *a);
 int copy_file(char *src, char *dst);
-int set_LogFile(FILE *logFile);
-
-#endif /* __L2L_UTIL_H__ */
+int set_LogFile(FILE **plogFile);
 
 /* EOF */
index 9a42e49..ad1e929 100644 (file)
@@ -5,11 +5,8 @@
  * - Version
  */
 
-#ifndef __L2L_VERSION_H__
-#define __L2L_VERSION_H__
+#pragma once
 
-#define LOG2LINES_VERSION   "2.1"
-
-#endif /* __L2L_VERSION_H__ */
+#define LOG2LINES_VERSION   "2.2"
 
 /* EOF */
index 709c931..43becbf 100644 (file)
  * PROGRAMMER:      Hervé Poussineau
  */
 
-#ifndef __BINHIVE_H__
-#define __BINHIVE_H__
+#pragma once
 
 BOOL
 ExportBinaryHive(
        IN PCSTR FileName,
        IN PCMHIVE Hive);
 
-#endif /* __BINHIVE_H__ */
-
 /* EOF */
index b86687c..becb9b3 100644 (file)
@@ -24,8 +24,7 @@
  *                  Hervé Poussineau
  */
 
-#ifndef __MKHIVE_H__
-#define __MKHIVE_H__
+#pragma once
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -103,6 +102,4 @@ extern LIST_ENTRY CmiHiveListHead;
 #define GCC_PACKED __attribute__((packed))
 #endif//_MSC_VER
 
-#endif /* __MKHIVE_H__ */
-
 /* EOF */
index f807a65..f84f6ed 100644 (file)
  * PROGRAMMER:      Hervé Poussineau
  */
 
-#ifndef __REGINF_H__
-#define __REGINF_H__
+#pragma once
 
 BOOL
 ImportRegistryFile(PCHAR Filename);
 
-#endif /* __REGINF_H__ */
-
 /* EOF */
index a810602..696126b 100644 (file)
@@ -4,8 +4,7 @@
  * PURPOSE:         Registry code
  */
 
-#ifndef __REGISTRY_H__
-#define __REGISTRY_H__
+#pragma once
 
 typedef struct _REG_VALUE
 {
@@ -122,9 +121,4 @@ RegGetValueCount (HKEY Key);
 VOID
 RegInitializeRegistry(VOID);
 
-#endif /* __REGISTRY_H__ */
-
 /* EOF */
-
-
-
index ce9a993..f07054d 100644 (file)
@@ -38,8 +38,7 @@
 /* This file is shared between GCC and GDB, and should not contain
    prototypes.  */
 
-#ifndef GCC_DWARF2_H
-#define GCC_DWARF2_H
+#pragma once
 
 //#include "list.h"
 
@@ -838,7 +837,3 @@ typedef struct _CFSTATE
 } DW2CFSTATE, *PDW2CFSTATE;
 
 #define NextCIE(p) ((void*)((char*)p + p->Length + 4))
-
-
-
-#endif /* dwarf2.h */
index cae80e7..386b064 100644 (file)
@@ -1,7 +1,6 @@
 /* rsym.h */
 
-#ifndef RSYM_H
-#define RSYM_H
+#pragma once
 
 #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x010b
 #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x020b
@@ -373,5 +372,3 @@ convert_path(const char* origpath);
 
 extern void*
 load_file ( const char* file_name, size_t* file_size );
-
-#endif/*RSYM_H*/
index f4d371c..cae44f5 100644 (file)
@@ -1,6 +1,4 @@
-
-#ifndef _RSYM64_H
-#define _RSYM64_H
+#pragma once
 
 //C_ASSERT(sizeof(ULONG) == 4);
 typedef unsigned char UBYTE;
@@ -185,7 +183,3 @@ typedef struct
     ULONG cScopes;
 
 } FILE_INFO, *PFILE_INFO;
-
-
-
-#endif // !_RSYM64_H
index 888e678..6e10554 100644 (file)
@@ -13,8 +13,8 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-#ifndef SSPRINTF_H
-#define SSPRINTF_H
+
+#pragma once
 
 #include <string>
 #include <stdarg.h>
@@ -38,5 +38,3 @@ std::wstring sswvprintf ( const wchar_t* fmt, va_list args );
 #define sstprintf ssprintf
 #define sstvprintf ssvprintf
 #endif
-
-#endif
index 715e773..2681dbf 100644 (file)
@@ -7,6 +7,9 @@
 <directory name="cdmake">
        <xi:include href="cdmake/cdmake.rbuild" />
 </directory>
+<directory name="hpp">
+       <xi:include href="hpp/hpp.rbuild" />
+</directory>
 <directory name="kbdtool">
        <xi:include href="kbdtool/kbdtool.rbuild" />
 </directory>
index b683a14..569a18b 100644 (file)
@@ -126,8 +126,6 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
         print_client( " struct __frame_%s%s *__frame )\n{\n", prefix_client, get_name(func) );
         indent++;
 
-        /* FIXME: emit client finally code */
-
         if (has_full_pointer)
             write_full_pointer_free(client, indent, func);
 
index b528376..bca7c5a 100644 (file)
@@ -87,7 +87,9 @@ expr_t *make_exprs(enum expr_type type, char *val)
     e->u.sval = val;
     e->is_const = FALSE;
     /* check for predefined constants */
-    if (type == EXPR_IDENTIFIER)
+    switch (type)
+    {
+    case EXPR_IDENTIFIER:
     {
         var_t *c = find_const(val, 0);
         if (c)
@@ -97,6 +99,21 @@ expr_t *make_exprs(enum expr_type type, char *val)
             e->is_const = TRUE;
             e->cval = c->eval->cval;
         }
+        break;
+    }
+    case EXPR_CHARCONST:
+        if (!val[0])
+            error_loc("empty character constant\n");
+        else if (val[1])
+            error_loc("multi-character constants are endian dependent\n");
+        else
+        {
+            e->is_const = TRUE;
+            e->cval = *val;
+        }
+        break;
+    default:
+        break;
     }
     return e;
 }
@@ -457,6 +474,11 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc
         result.is_temporary = TRUE;
         result.type = type_new_pointer(RPC_FC_UP, type_new_int(TYPE_BASIC_WCHAR, 0), NULL);
         break;
+    case EXPR_CHARCONST:
+        result.is_variable = FALSE;
+        result.is_temporary = TRUE;
+        result.type = type_new_int(TYPE_BASIC_CHAR, 0);
+        break;
     case EXPR_DOUBLE:
         result.is_variable = FALSE;
         result.is_temporary = TRUE;
@@ -655,6 +677,9 @@ void write_expr(FILE *h, const expr_t *e, int brackets,
     case EXPR_WSTRLIT:
         fprintf(h, "L\"%s\"", e->u.sval);
         break;
+    case EXPR_CHARCONST:
+        fprintf(h, "'%s'", e->u.sval);
+        break;
     case EXPR_LOGNOT:
         fprintf(h, "!");
         write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix);
@@ -804,6 +829,7 @@ int compare_expr(const expr_t *a, const expr_t *b)
         case EXPR_IDENTIFIER:
         case EXPR_STRLIT:
         case EXPR_WSTRLIT:
+        case EXPR_CHARCONST:
             return strcmp(a->u.sval, b->u.sval);
         case EXPR_COND:
             ret = compare_expr(a->ref, b->ref);
index e87a44e..5602b6d 100644 (file)
@@ -254,6 +254,7 @@ void write_type_left(FILE *h, type_t *t, int declonly)
         break;
       case TYPE_BASIC:
         if (type_basic_get_type(t) != TYPE_BASIC_INT32 &&
+            type_basic_get_type(t) != TYPE_BASIC_INT64 &&
             type_basic_get_type(t) != TYPE_BASIC_HYPER)
         {
           if (type_basic_get_sign(t) < 0) fprintf(h, "signed ");
@@ -264,7 +265,6 @@ void write_type_left(FILE *h, type_t *t, int declonly)
         case TYPE_BASIC_INT8: fprintf(h, "small"); break;
         case TYPE_BASIC_INT16: fprintf(h, "short"); break;
         case TYPE_BASIC_INT: fprintf(h, "int"); break;
-        case TYPE_BASIC_INT64: fprintf(h, "__int64"); break;
         case TYPE_BASIC_INT3264: fprintf(h, "__int3264"); break;
         case TYPE_BASIC_BYTE: fprintf(h, "byte"); break;
         case TYPE_BASIC_CHAR: fprintf(h, "char"); break;
@@ -279,6 +279,12 @@ void write_type_left(FILE *h, type_t *t, int declonly)
           else
             fprintf(h, "LONG");
           break;
+        case TYPE_BASIC_INT64:
+          if (type_basic_get_sign(t) > 0)
+            fprintf(h, "UINT64");
+          else
+            fprintf(h, "INT64");
+          break;
         case TYPE_BASIC_HYPER:
           if (type_basic_get_sign(t) > 0)
             fprintf(h, "MIDL_uhyper");
@@ -685,10 +691,12 @@ int has_out_arg_or_return(const var_t *func)
 
 /********** INTERFACES **********/
 
-int is_object(const attr_list_t *list)
+int is_object(const type_t *iface)
 {
     const attr_t *attr;
-    if (list) LIST_FOR_EACH_ENTRY( attr, list, const attr_t, entry )
+    if (type_is_defined(iface) && type_iface_get_inherit(iface))
+        return 1;
+    if (iface->attrs) LIST_FOR_EACH_ENTRY( attr, iface->attrs, const attr_t, entry )
         if (attr->type == ATTR_OBJECT || attr->type == ATTR_ODL) return 1;
     return 0;
 }
@@ -860,7 +868,7 @@ static void write_locals(FILE *fp, const type_t *iface, int body)
     = "/* WIDL-generated stub.  You must provide an implementation for this.  */";
   const statement_t *stmt;
 
-  if (!is_object(iface->attrs))
+  if (!is_object(iface))
     return;
 
   STATEMENTS_FOR_EACH_FUNC(stmt, type_iface_get_stmts(iface)) {
@@ -1174,7 +1182,7 @@ static void write_forward_decls(FILE *header, const statement_list_t *stmts)
       case STMT_TYPE:
         if (type_get_type(stmt->u.type) == TYPE_INTERFACE)
         {
-          if (is_object(stmt->u.type->attrs) || is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE))
+          if (is_object(stmt->u.type) || is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE))
             write_forward(header, stmt->u.type);
         }
         else if (type_get_type(stmt->u.type) == TYPE_COCLASS)
@@ -1209,7 +1217,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons
         if (type_get_type(stmt->u.type) == TYPE_INTERFACE)
         {
           type_t *iface = stmt->u.type;
-          if (is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE) || is_object(stmt->u.type->attrs))
+          if (is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE) || is_object(stmt->u.type))
           {
             write_com_interface_start(header, iface);
             write_header_stmts(header, type_iface_get_stmts(iface), stmt->u.type, TRUE);
index d4b3b88..7d6c543 100644 (file)
@@ -38,7 +38,7 @@ extern void write_type_def_or_decl(FILE *h, type_t *t, int is_field, const char
 extern void write_type_decl(FILE *f, type_t *t, const char *name);
 extern void write_type_decl_left(FILE *f, type_t *t);
 extern int needs_space_after(type_t *t);
-extern int is_object(const attr_list_t *list);
+extern int is_object(const type_t *iface);
 extern int is_local(const attr_list_t *list);
 extern int need_stub(const type_t *iface);
 extern int need_proxy(const type_t *iface);
index 71f08dc..1bcc3c1 100644 (file)
@@ -45,4 +45,6 @@ void pop_import(void);
 
 int is_type(const char *name);
 
+extern char *temp_name;
+
 #endif
index f509cb1..0d231fc 100644 (file)
@@ -37,6 +37,7 @@ double        [0-9]+\.[0-9]+([eE][+-]?[0-9]+)*
 %x WSTRQUOTE
 %x ATTR
 %x PP_LINE
+%x SQUOTE
 
 %{
 
@@ -63,8 +64,6 @@ double        [0-9]+\.[0-9]+([eE][+-]?[0-9]+)*
 
 #include "parser.tab.h"
 
-extern char *temp_name;
-
 static void addcchar(char c);
 static char *get_buffered_cstring(void);
 
@@ -157,10 +156,17 @@ UUID *parse_uuid(const char *u)
                                parser_lval.str = get_buffered_cstring();
                                return aWSTRING;
                        }
-<QUOTE,WSTRQUOTE>\\\\  |
+<INITIAL,ATTR>\'       yy_push_state(SQUOTE); cbufidx = 0;
+<SQUOTE>\'             {
+                               yy_pop_state();
+                               parser_lval.str = get_buffered_cstring();
+                               return aSQSTRING;
+                       }
+<QUOTE,WSTRQUOTE,SQUOTE>\\\\   |
 <QUOTE,WSTRQUOTE>\\\"  addcchar(yytext[1]);
-<QUOTE,WSTRQUOTE>\\.   addcchar('\\'); addcchar(yytext[1]);
-<QUOTE,WSTRQUOTE>.     addcchar(yytext[0]);
+<SQUOTE>\\\'   addcchar(yytext[1]);
+<QUOTE,WSTRQUOTE,SQUOTE>\\.    addcchar('\\'); addcchar(yytext[1]);
+<QUOTE,WSTRQUOTE,SQUOTE>.      addcchar(yytext[0]);
 <INITIAL,ATTR>\[       yy_push_state(ATTR); return '[';
 <ATTR>\]               yy_pop_state(); return ']';
 <ATTR>{cident}         return attr_token(yytext);
index 198575f..8ed813d 100644 (file)
@@ -268,150 +268,151 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
      aDOUBLE = 262,
      aSTRING = 263,
      aWSTRING = 264,
-     aUUID = 265,
-     aEOF = 266,
-     SHL = 267,
-     SHR = 268,
-     MEMBERPTR = 269,
-     EQUALITY = 270,
-     INEQUALITY = 271,
-     GREATEREQUAL = 272,
-     LESSEQUAL = 273,
-     LOGICALOR = 274,
-     LOGICALAND = 275,
-     ELLIPSIS = 276,
-     tAGGREGATABLE = 277,
-     tALLOCATE = 278,
-     tANNOTATION = 279,
-     tAPPOBJECT = 280,
-     tASYNC = 281,
-     tASYNCUUID = 282,
-     tAUTOHANDLE = 283,
-     tBINDABLE = 284,
-     tBOOLEAN = 285,
-     tBROADCAST = 286,
-     tBYTE = 287,
-     tBYTECOUNT = 288,
-     tCALLAS = 289,
-     tCALLBACK = 290,
-     tCASE = 291,
-     tCDECL = 292,
-     tCHAR = 293,
-     tCOCLASS = 294,
-     tCODE = 295,
-     tCOMMSTATUS = 296,
-     tCONST = 297,
-     tCONTEXTHANDLE = 298,
-     tCONTEXTHANDLENOSERIALIZE = 299,
-     tCONTEXTHANDLESERIALIZE = 300,
-     tCONTROL = 301,
-     tCPPQUOTE = 302,
-     tDEFAULT = 303,
-     tDEFAULTCOLLELEM = 304,
-     tDEFAULTVALUE = 305,
-     tDEFAULTVTABLE = 306,
-     tDISPLAYBIND = 307,
-     tDISPINTERFACE = 308,
-     tDLLNAME = 309,
-     tDOUBLE = 310,
-     tDUAL = 311,
-     tENDPOINT = 312,
-     tENTRY = 313,
-     tENUM = 314,
-     tERRORSTATUST = 315,
-     tEXPLICITHANDLE = 316,
-     tEXTERN = 317,
-     tFALSE = 318,
-     tFASTCALL = 319,
-     tFLOAT = 320,
-     tHANDLE = 321,
-     tHANDLET = 322,
-     tHELPCONTEXT = 323,
-     tHELPFILE = 324,
-     tHELPSTRING = 325,
-     tHELPSTRINGCONTEXT = 326,
-     tHELPSTRINGDLL = 327,
-     tHIDDEN = 328,
-     tHYPER = 329,
-     tID = 330,
-     tIDEMPOTENT = 331,
-     tIIDIS = 332,
-     tIMMEDIATEBIND = 333,
-     tIMPLICITHANDLE = 334,
-     tIMPORT = 335,
-     tIMPORTLIB = 336,
-     tIN = 337,
-     tIN_LINE = 338,
-     tINLINE = 339,
-     tINPUTSYNC = 340,
-     tINT = 341,
-     tINT3264 = 342,
-     tINT64 = 343,
-     tINTERFACE = 344,
-     tLCID = 345,
-     tLENGTHIS = 346,
-     tLIBRARY = 347,
-     tLOCAL = 348,
-     tLONG = 349,
-     tMETHODS = 350,
-     tMODULE = 351,
-     tNONBROWSABLE = 352,
-     tNONCREATABLE = 353,
-     tNONEXTENSIBLE = 354,
-     tNULL = 355,
-     tOBJECT = 356,
-     tODL = 357,
-     tOLEAUTOMATION = 358,
-     tOPTIONAL = 359,
-     tOUT = 360,
-     tPASCAL = 361,
-     tPOINTERDEFAULT = 362,
-     tPROPERTIES = 363,
-     tPROPGET = 364,
-     tPROPPUT = 365,
-     tPROPPUTREF = 366,
-     tPTR = 367,
-     tPUBLIC = 368,
-     tRANGE = 369,
-     tREADONLY = 370,
-     tREF = 371,
-     tREGISTER = 372,
-     tREQUESTEDIT = 373,
-     tRESTRICTED = 374,
-     tRETVAL = 375,
-     tSAFEARRAY = 376,
-     tSHORT = 377,
-     tSIGNED = 378,
-     tSIZEIS = 379,
-     tSIZEOF = 380,
-     tSMALL = 381,
-     tSOURCE = 382,
-     tSTATIC = 383,
-     tSTDCALL = 384,
-     tSTRICTCONTEXTHANDLE = 385,
-     tSTRING = 386,
-     tSTRUCT = 387,
-     tSWITCH = 388,
-     tSWITCHIS = 389,
-     tSWITCHTYPE = 390,
-     tTRANSMITAS = 391,
-     tTRUE = 392,
-     tTYPEDEF = 393,
-     tUNION = 394,
-     tUNIQUE = 395,
-     tUNSIGNED = 396,
-     tUUID = 397,
-     tV1ENUM = 398,
-     tVARARG = 399,
-     tVERSION = 400,
-     tVOID = 401,
-     tWCHAR = 402,
-     tWIREMARSHAL = 403,
-     ADDRESSOF = 404,
-     NEG = 405,
-     POS = 406,
-     PPTR = 407,
-     CAST = 408
+     aSQSTRING = 265,
+     aUUID = 266,
+     aEOF = 267,
+     SHL = 268,
+     SHR = 269,
+     MEMBERPTR = 270,
+     EQUALITY = 271,
+     INEQUALITY = 272,
+     GREATEREQUAL = 273,
+     LESSEQUAL = 274,
+     LOGICALOR = 275,
+     LOGICALAND = 276,
+     ELLIPSIS = 277,
+     tAGGREGATABLE = 278,
+     tALLOCATE = 279,
+     tANNOTATION = 280,
+     tAPPOBJECT = 281,
+     tASYNC = 282,
+     tASYNCUUID = 283,
+     tAUTOHANDLE = 284,
+     tBINDABLE = 285,
+     tBOOLEAN = 286,
+     tBROADCAST = 287,
+     tBYTE = 288,
+     tBYTECOUNT = 289,
+     tCALLAS = 290,
+     tCALLBACK = 291,
+     tCASE = 292,
+     tCDECL = 293,
+     tCHAR = 294,
+     tCOCLASS = 295,
+     tCODE = 296,
+     tCOMMSTATUS = 297,
+     tCONST = 298,
+     tCONTEXTHANDLE = 299,
+     tCONTEXTHANDLENOSERIALIZE = 300,
+     tCONTEXTHANDLESERIALIZE = 301,
+     tCONTROL = 302,
+     tCPPQUOTE = 303,
+     tDEFAULT = 304,
+     tDEFAULTCOLLELEM = 305,
+     tDEFAULTVALUE = 306,
+     tDEFAULTVTABLE = 307,
+     tDISPLAYBIND = 308,
+     tDISPINTERFACE = 309,
+     tDLLNAME = 310,
+     tDOUBLE = 311,
+     tDUAL = 312,
+     tENDPOINT = 313,
+     tENTRY = 314,
+     tENUM = 315,
+     tERRORSTATUST = 316,
+     tEXPLICITHANDLE = 317,
+     tEXTERN = 318,
+     tFALSE = 319,
+     tFASTCALL = 320,
+     tFLOAT = 321,
+     tHANDLE = 322,
+     tHANDLET = 323,
+     tHELPCONTEXT = 324,
+     tHELPFILE = 325,
+     tHELPSTRING = 326,
+     tHELPSTRINGCONTEXT = 327,
+     tHELPSTRINGDLL = 328,
+     tHIDDEN = 329,
+     tHYPER = 330,
+     tID = 331,
+     tIDEMPOTENT = 332,
+     tIIDIS = 333,
+     tIMMEDIATEBIND = 334,
+     tIMPLICITHANDLE = 335,
+     tIMPORT = 336,
+     tIMPORTLIB = 337,
+     tIN = 338,
+     tIN_LINE = 339,
+     tINLINE = 340,
+     tINPUTSYNC = 341,
+     tINT = 342,
+     tINT3264 = 343,
+     tINT64 = 344,
+     tINTERFACE = 345,
+     tLCID = 346,
+     tLENGTHIS = 347,
+     tLIBRARY = 348,
+     tLOCAL = 349,
+     tLONG = 350,
+     tMETHODS = 351,
+     tMODULE = 352,
+     tNONBROWSABLE = 353,
+     tNONCREATABLE = 354,
+     tNONEXTENSIBLE = 355,
+     tNULL = 356,
+     tOBJECT = 357,
+     tODL = 358,
+     tOLEAUTOMATION = 359,
+     tOPTIONAL = 360,
+     tOUT = 361,
+     tPASCAL = 362,
+     tPOINTERDEFAULT = 363,
+     tPROPERTIES = 364,
+     tPROPGET = 365,
+     tPROPPUT = 366,
+     tPROPPUTREF = 367,
+     tPTR = 368,
+     tPUBLIC = 369,
+     tRANGE = 370,
+     tREADONLY = 371,
+     tREF = 372,
+     tREGISTER = 373,
+     tREQUESTEDIT = 374,
+     tRESTRICTED = 375,
+     tRETVAL = 376,
+     tSAFEARRAY = 377,
+     tSHORT = 378,
+     tSIGNED = 379,
+     tSIZEIS = 380,
+     tSIZEOF = 381,
+     tSMALL = 382,
+     tSOURCE = 383,
+     tSTATIC = 384,
+     tSTDCALL = 385,
+     tSTRICTCONTEXTHANDLE = 386,
+     tSTRING = 387,
+     tSTRUCT = 388,
+     tSWITCH = 389,
+     tSWITCHIS = 390,
+     tSWITCHTYPE = 391,
+     tTRANSMITAS = 392,
+     tTRUE = 393,
+     tTYPEDEF = 394,
+     tUNION = 395,
+     tUNIQUE = 396,
+     tUNSIGNED = 397,
+     tUUID = 398,
+     tV1ENUM = 399,
+     tVARARG = 400,
+     tVERSION = 401,
+     tVOID = 402,
+     tWCHAR = 403,
+     tWIREMARSHAL = 404,
+     ADDRESSOF = 405,
+     NEG = 406,
+     POS = 407,
+     PPTR = 408,
+     CAST = 409
    };
 #endif
 
@@ -454,7 +455,7 @@ typedef union YYSTYPE
 
 
 /* Line 214 of yacc.c  */
-#line 458 "parser.tab.c"
+#line 459 "parser.tab.c"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -466,7 +467,7 @@ typedef union YYSTYPE
 
 
 /* Line 264 of yacc.c  */
-#line 470 "parser.tab.c"
+#line 471 "parser.tab.c"
 
 #ifdef short
 # undef short
@@ -681,20 +682,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2392
+#define YYLAST   2343
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  178
+#define YYNTOKENS  179
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  99
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  344
+#define YYNRULES  345
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  606
+#define YYNSTATES  607
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   408
+#define YYMAXUTOK   409
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -705,16 +706,16 @@ static const yytype_uint8 yytranslate[] =
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   162,     2,     2,     2,   161,   154,     2,
-     173,   174,   159,   158,   149,   157,   169,   160,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,   151,   172,
-     155,   177,   156,   150,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   163,     2,     2,     2,   162,   155,     2,
+     174,   175,   160,   159,   150,   158,   170,   161,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   152,   173,
+     156,   178,   157,   151,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,   170,     2,   171,   153,     2,     2,     2,     2,     2,
+       2,   171,     2,   172,   154,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   175,   152,   176,   163,     2,     2,     2,
+       2,     2,     2,   176,   153,   177,   164,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -742,7 +743,7 @@ static const yytype_uint8 yytranslate[] =
      115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
      125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
      135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   164,   165,   166,   167,   168
+     145,   146,   147,   148,   149,   165,   166,   167,   168,   169
 };
 
 #if YYDEBUG
@@ -766,135 +767,135 @@ static const yytype_uint16 yyprhs[] =
      388,   393,   398,   400,   402,   404,   406,   408,   410,   412,
      413,   416,   421,   425,   426,   429,   431,   433,   437,   441,
      443,   449,   451,   455,   456,   458,   460,   462,   464,   466,
-     468,   470,   472,   474,   476,   482,   486,   490,   494,   498,
-     502,   506,   510,   514,   518,   522,   526,   530,   534,   538,
-     542,   546,   550,   554,   557,   560,   563,   566,   569,   572,
-     576,   580,   586,   592,   597,   601,   603,   607,   609,   611,
-     612,   615,   620,   624,   627,   630,   631,   634,   637,   639,
-     643,   647,   651,   654,   655,   657,   658,   660,   662,   664,
-     666,   668,   670,   672,   675,   678,   680,   682,   684,   686,
-     688,   690,   691,   693,   695,   698,   700,   703,   706,   708,
-     710,   712,   715,   718,   721,   727,   728,   731,   734,   737,
-     740,   743,   746,   750,   753,   757,   763,   769,   770,   773,
-     776,   779,   782,   789,   798,   801,   804,   807,   810,   813,
-     816,   822,   824,   826,   828,   830,   832,   833,   836,   839,
-     843,   844,   846,   849,   852,   855,   859,   862,   864,   866,
-     870,   873,   878,   882,   885,   887,   891,   894,   895,   897,
-     901,   904,   906,   910,   915,   919,   922,   924,   928,   931,
-     932,   934,   936,   940,   943,   945,   949,   954,   956,   960,
-     961,   964,   967,   969,   973,   975,   979,   981,   983,   985,
-     991,   993,   995,   997,   999,  1002,  1004,  1007,  1009,  1012,
-    1017,  1022,  1028,  1039,  1041
+     468,   470,   472,   474,   476,   478,   484,   488,   492,   496,
+     500,   504,   508,   512,   516,   520,   524,   528,   532,   536,
+     540,   544,   548,   552,   556,   559,   562,   565,   568,   571,
+     574,   578,   582,   588,   594,   599,   603,   605,   609,   611,
+     613,   614,   617,   622,   626,   629,   632,   633,   636,   639,
+     641,   645,   649,   653,   656,   657,   659,   660,   662,   664,
+     666,   668,   670,   672,   674,   677,   680,   682,   684,   686,
+     688,   690,   692,   693,   695,   697,   700,   702,   705,   708,
+     710,   712,   714,   717,   720,   723,   729,   730,   733,   736,
+     739,   742,   745,   748,   752,   755,   759,   765,   771,   772,
+     775,   778,   781,   784,   791,   800,   803,   806,   809,   812,
+     815,   818,   824,   826,   828,   830,   832,   834,   835,   838,
+     841,   845,   846,   848,   851,   854,   857,   861,   864,   866,
+     868,   872,   875,   880,   884,   887,   889,   893,   896,   897,
+     899,   903,   906,   908,   912,   917,   921,   924,   926,   930,
+     933,   934,   936,   938,   942,   945,   947,   951,   956,   958,
+     962,   963,   966,   969,   971,   975,   977,   981,   983,   985,
+     987,   993,   995,   997,   999,  1001,  1004,  1006,  1009,  1011,
+    1014,  1019,  1024,  1030,  1041,  1043
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
-     179,     0,    -1,   180,    -1,    -1,   180,   245,    -1,   180,
-     244,    -1,   180,   231,   172,    -1,   180,   233,    -1,   180,
-     248,    -1,   180,   192,    -1,   180,   184,    -1,    -1,   181,
-     245,    -1,   181,   244,    -1,   181,   231,   172,    -1,   181,
-     233,    -1,   181,   248,    -1,   181,   184,    -1,   181,   189,
-      -1,   181,   192,    -1,    -1,   182,   184,    -1,    -1,   172,
-      -1,   186,    -1,   185,   172,    -1,   224,   172,    -1,   188,
-      -1,   274,   172,    -1,   210,    -1,   272,    -1,   275,    -1,
-     199,   210,    -1,   199,   272,    -1,   199,   275,    -1,    47,
-     173,     8,   174,    -1,    80,     8,   172,    -1,   187,   181,
-      11,    -1,    81,   173,     8,   174,   183,    -1,    92,     3,
-      -1,   199,   190,   175,    -1,   191,   181,   176,   183,    -1,
-      -1,   195,    -1,   196,    -1,   194,   149,   196,    -1,   194,
-      -1,   194,   149,    21,    -1,   199,   253,   264,    -1,   253,
-     264,    -1,   170,   212,   171,    -1,   170,   159,   171,    -1,
-      -1,   199,    -1,   170,   200,   171,    -1,   202,    -1,   200,
-     149,   202,    -1,   200,   171,   170,   202,    -1,     8,    -1,
-     201,   149,     8,    -1,    -1,    22,    -1,    24,   173,     8,
-     174,    -1,    25,    -1,    26,    -1,    28,    -1,    29,    -1,
-      31,    -1,    34,   173,   227,   174,    -1,    36,   173,   214,
-     174,    -1,    43,    -1,    44,    -1,    45,    -1,    46,    -1,
-      48,    -1,    49,    -1,    50,   173,   216,   174,    -1,    51,
-      -1,    52,    -1,    54,   173,     8,   174,    -1,    56,    -1,
-      57,   173,   201,   174,    -1,    58,   173,   216,   174,    -1,
-      61,    -1,    66,    -1,    68,   173,   215,   174,    -1,    69,
-     173,     8,   174,    -1,    70,   173,     8,   174,    -1,    71,
-     173,   215,   174,    -1,    72,   173,     8,   174,    -1,    73,
-      -1,    75,   173,   215,   174,    -1,    76,    -1,    77,   173,
-     213,   174,    -1,    78,    -1,    79,   173,    67,     3,   174,
-      -1,    82,    -1,    85,    -1,    91,   173,   211,   174,    -1,
-      90,   173,   215,   174,    -1,    90,    -1,    93,    -1,    97,
-      -1,    98,    -1,    99,    -1,   101,    -1,   102,    -1,   103,
-      -1,   104,    -1,   105,    -1,   107,   173,   271,   174,    -1,
-     109,    -1,   110,    -1,   111,    -1,   113,    -1,   114,   173,
-     215,   149,   215,   174,    -1,   115,    -1,   118,    -1,   119,
-      -1,   120,    -1,   124,   173,   211,   174,    -1,   127,    -1,
-     130,    -1,   131,    -1,   134,   173,   213,   174,    -1,   135,
-     173,   273,   174,    -1,   136,   173,   273,   174,    -1,   142,
-     173,   203,   174,    -1,   143,    -1,   144,    -1,   145,   173,
-     276,   174,    -1,   148,   173,   273,   174,    -1,   271,    -1,
-      10,    -1,     8,    -1,    37,    -1,    64,    -1,   106,    -1,
-     129,    -1,    -1,   205,   206,    -1,    36,   215,   151,   221,
-      -1,    48,   151,   221,    -1,    -1,   208,   149,    -1,   208,
-      -1,   209,    -1,   208,   149,   209,    -1,   227,   177,   215,
-      -1,   227,    -1,    59,   226,   175,   207,   176,    -1,   212,
-      -1,   211,   149,   212,    -1,    -1,   213,    -1,     5,    -1,
-       6,    -1,     7,    -1,    63,    -1,   100,    -1,   137,    -1,
-       8,    -1,     9,    -1,     3,    -1,   213,   150,   213,   151,
-     213,    -1,   213,    19,   213,    -1,   213,    20,   213,    -1,
-     213,   152,   213,    -1,   213,   153,   213,    -1,   213,   154,
-     213,    -1,   213,    15,   213,    -1,   213,    16,   213,    -1,
-     213,   156,   213,    -1,   213,   155,   213,    -1,   213,    17,
-     213,    -1,   213,    18,   213,    -1,   213,    12,   213,    -1,
-     213,    13,   213,    -1,   213,   158,   213,    -1,   213,   157,
-     213,    -1,   213,   161,   213,    -1,   213,   159,   213,    -1,
-     213,   160,   213,    -1,   162,   213,    -1,   163,   213,    -1,
-     158,   213,    -1,   157,   213,    -1,   154,   213,    -1,   159,
-     213,    -1,   213,    14,     3,    -1,   213,   169,     3,    -1,
-     173,   253,   260,   174,   213,    -1,   125,   173,   253,   260,
-     174,    -1,   213,   170,   213,   171,    -1,   173,   213,   174,
-      -1,   215,    -1,   214,   149,   215,    -1,   213,    -1,   213,
-      -1,    -1,   217,   218,    -1,   198,   253,   269,   172,    -1,
-     198,   275,   172,    -1,   222,   172,    -1,   199,   172,    -1,
-      -1,   220,   219,    -1,   222,   172,    -1,   172,    -1,   198,
-     253,   256,    -1,   198,   253,   256,    -1,   199,   253,   270,
-      -1,   253,   270,    -1,    -1,   227,    -1,    -1,     3,    -1,
-       4,    -1,     3,    -1,     4,    -1,    32,    -1,   147,    -1,
-     230,    -1,   123,   230,    -1,   141,   230,    -1,   141,    -1,
-      65,    -1,    55,    -1,    30,    -1,    60,    -1,    67,    -1,
-      -1,    86,    -1,    86,    -1,   122,   229,    -1,   126,    -1,
-      94,   229,    -1,    74,   229,    -1,    88,    -1,    38,    -1,
-      87,    -1,    39,     3,    -1,    39,     4,    -1,   199,   231,
-      -1,   232,   175,   234,   176,   183,    -1,    -1,   234,   235,
-      -1,   198,   245,    -1,    53,     3,    -1,    53,     4,    -1,
-     199,   236,    -1,   108,   151,    -1,   238,   222,   172,    -1,
-      95,   151,    -1,   239,   223,   172,    -1,   237,   175,   238,
-     239,   176,    -1,   237,   175,   242,   172,   176,    -1,    -1,
-     151,     4,    -1,    89,     3,    -1,    89,     4,    -1,   199,
-     242,    -1,   243,   241,   175,   182,   176,   183,    -1,   243,
-     151,     3,   175,   188,   182,   176,   183,    -1,   240,   183,
-      -1,   242,   172,    -1,   236,   172,    -1,    96,     3,    -1,
-      96,     4,    -1,   199,   246,    -1,   247,   175,   182,   176,
-     183,    -1,    62,    -1,   128,    -1,   117,    -1,    84,    -1,
-      42,    -1,    -1,   252,   251,    -1,   273,   254,    -1,   255,
-     273,   254,    -1,    -1,   255,    -1,   251,   254,    -1,   250,
-     254,    -1,   249,   254,    -1,   159,   252,   256,    -1,   204,
-     256,    -1,   257,    -1,   227,    -1,   173,   256,   174,    -1,
-     257,   197,    -1,   257,   173,   193,   174,    -1,   159,   252,
-     260,    -1,   204,   260,    -1,   261,    -1,   159,   252,   264,
-      -1,   204,   264,    -1,    -1,   258,    -1,   173,   259,   174,
-      -1,   261,   197,    -1,   197,    -1,   173,   193,   174,    -1,
-     261,   173,   193,   174,    -1,   159,   252,   264,    -1,   204,
-     264,    -1,   265,    -1,   159,   252,   264,    -1,   204,   264,
-      -1,    -1,   262,    -1,   227,    -1,   173,   263,   174,    -1,
-     265,   197,    -1,   197,    -1,   173,   193,   174,    -1,   265,
-     173,   193,   174,    -1,   256,    -1,   266,   149,   256,    -1,
-      -1,   151,   216,    -1,   262,   267,    -1,   268,    -1,   269,
-     149,   268,    -1,   256,    -1,   256,   177,   216,    -1,   116,
-      -1,   140,    -1,   112,    -1,   132,   226,   175,   217,   176,
-      -1,   146,    -1,     4,    -1,   228,    -1,   210,    -1,    59,
-       3,    -1,   272,    -1,   132,     3,    -1,   275,    -1,   139,
-       3,    -1,   121,   173,   273,   174,    -1,   138,   198,   253,
-     266,    -1,   139,   226,   175,   220,   176,    -1,   139,   226,
-     133,   173,   222,   174,   225,   175,   205,   176,    -1,     5,
-      -1,     5,   169,     5,    -1
+     180,     0,    -1,   181,    -1,    -1,   181,   246,    -1,   181,
+     245,    -1,   181,   232,   173,    -1,   181,   234,    -1,   181,
+     249,    -1,   181,   193,    -1,   181,   185,    -1,    -1,   182,
+     246,    -1,   182,   245,    -1,   182,   232,   173,    -1,   182,
+     234,    -1,   182,   249,    -1,   182,   185,    -1,   182,   190,
+      -1,   182,   193,    -1,    -1,   183,   185,    -1,    -1,   173,
+      -1,   187,    -1,   186,   173,    -1,   225,   173,    -1,   189,
+      -1,   275,   173,    -1,   211,    -1,   273,    -1,   276,    -1,
+     200,   211,    -1,   200,   273,    -1,   200,   276,    -1,    48,
+     174,     8,   175,    -1,    81,     8,   173,    -1,   188,   182,
+      12,    -1,    82,   174,     8,   175,   184,    -1,    93,     3,
+      -1,   200,   191,   176,    -1,   192,   182,   177,   184,    -1,
+      -1,   196,    -1,   197,    -1,   195,   150,   197,    -1,   195,
+      -1,   195,   150,    22,    -1,   200,   254,   265,    -1,   254,
+     265,    -1,   171,   213,   172,    -1,   171,   160,   172,    -1,
+      -1,   200,    -1,   171,   201,   172,    -1,   203,    -1,   201,
+     150,   203,    -1,   201,   172,   171,   203,    -1,     8,    -1,
+     202,   150,     8,    -1,    -1,    23,    -1,    25,   174,     8,
+     175,    -1,    26,    -1,    27,    -1,    29,    -1,    30,    -1,
+      32,    -1,    35,   174,   228,   175,    -1,    37,   174,   215,
+     175,    -1,    44,    -1,    45,    -1,    46,    -1,    47,    -1,
+      49,    -1,    50,    -1,    51,   174,   217,   175,    -1,    52,
+      -1,    53,    -1,    55,   174,     8,   175,    -1,    57,    -1,
+      58,   174,   202,   175,    -1,    59,   174,   217,   175,    -1,
+      62,    -1,    67,    -1,    69,   174,   216,   175,    -1,    70,
+     174,     8,   175,    -1,    71,   174,     8,   175,    -1,    72,
+     174,   216,   175,    -1,    73,   174,     8,   175,    -1,    74,
+      -1,    76,   174,   216,   175,    -1,    77,    -1,    78,   174,
+     214,   175,    -1,    79,    -1,    80,   174,    68,     3,   175,
+      -1,    83,    -1,    86,    -1,    92,   174,   212,   175,    -1,
+      91,   174,   216,   175,    -1,    91,    -1,    94,    -1,    98,
+      -1,    99,    -1,   100,    -1,   102,    -1,   103,    -1,   104,
+      -1,   105,    -1,   106,    -1,   108,   174,   272,   175,    -1,
+     110,    -1,   111,    -1,   112,    -1,   114,    -1,   115,   174,
+     216,   150,   216,   175,    -1,   116,    -1,   119,    -1,   120,
+      -1,   121,    -1,   125,   174,   212,   175,    -1,   128,    -1,
+     131,    -1,   132,    -1,   135,   174,   214,   175,    -1,   136,
+     174,   274,   175,    -1,   137,   174,   274,   175,    -1,   143,
+     174,   204,   175,    -1,   144,    -1,   145,    -1,   146,   174,
+     277,   175,    -1,   149,   174,   274,   175,    -1,   272,    -1,
+      11,    -1,     8,    -1,    38,    -1,    65,    -1,   107,    -1,
+     130,    -1,    -1,   206,   207,    -1,    37,   216,   152,   222,
+      -1,    49,   152,   222,    -1,    -1,   209,   150,    -1,   209,
+      -1,   210,    -1,   209,   150,   210,    -1,   228,   178,   216,
+      -1,   228,    -1,    60,   227,   176,   208,   177,    -1,   213,
+      -1,   212,   150,   213,    -1,    -1,   214,    -1,     5,    -1,
+       6,    -1,     7,    -1,    64,    -1,   101,    -1,   138,    -1,
+       8,    -1,     9,    -1,    10,    -1,     3,    -1,   214,   151,
+     214,   152,   214,    -1,   214,    20,   214,    -1,   214,    21,
+     214,    -1,   214,   153,   214,    -1,   214,   154,   214,    -1,
+     214,   155,   214,    -1,   214,    16,   214,    -1,   214,    17,
+     214,    -1,   214,   157,   214,    -1,   214,   156,   214,    -1,
+     214,    18,   214,    -1,   214,    19,   214,    -1,   214,    13,
+     214,    -1,   214,    14,   214,    -1,   214,   159,   214,    -1,
+     214,   158,   214,    -1,   214,   162,   214,    -1,   214,   160,
+     214,    -1,   214,   161,   214,    -1,   163,   214,    -1,   164,
+     214,    -1,   159,   214,    -1,   158,   214,    -1,   155,   214,
+      -1,   160,   214,    -1,   214,    15,     3,    -1,   214,   170,
+       3,    -1,   174,   254,   261,   175,   214,    -1,   126,   174,
+     254,   261,   175,    -1,   214,   171,   214,   172,    -1,   174,
+     214,   175,    -1,   216,    -1,   215,   150,   216,    -1,   214,
+      -1,   214,    -1,    -1,   218,   219,    -1,   199,   254,   270,
+     173,    -1,   199,   276,   173,    -1,   223,   173,    -1,   200,
+     173,    -1,    -1,   221,   220,    -1,   223,   173,    -1,   173,
+      -1,   199,   254,   257,    -1,   199,   254,   257,    -1,   200,
+     254,   271,    -1,   254,   271,    -1,    -1,   228,    -1,    -1,
+       3,    -1,     4,    -1,     3,    -1,     4,    -1,    33,    -1,
+     148,    -1,   231,    -1,   124,   231,    -1,   142,   231,    -1,
+     142,    -1,    66,    -1,    56,    -1,    31,    -1,    61,    -1,
+      68,    -1,    -1,    87,    -1,    87,    -1,   123,   230,    -1,
+     127,    -1,    95,   230,    -1,    75,   230,    -1,    89,    -1,
+      39,    -1,    88,    -1,    40,     3,    -1,    40,     4,    -1,
+     200,   232,    -1,   233,   176,   235,   177,   184,    -1,    -1,
+     235,   236,    -1,   199,   246,    -1,    54,     3,    -1,    54,
+       4,    -1,   200,   237,    -1,   109,   152,    -1,   239,   223,
+     173,    -1,    96,   152,    -1,   240,   224,   173,    -1,   238,
+     176,   239,   240,   177,    -1,   238,   176,   243,   173,   177,
+      -1,    -1,   152,     4,    -1,    90,     3,    -1,    90,     4,
+      -1,   200,   243,    -1,   244,   242,   176,   183,   177,   184,
+      -1,   244,   152,     3,   176,   189,   183,   177,   184,    -1,
+     241,   184,    -1,   243,   173,    -1,   237,   173,    -1,    97,
+       3,    -1,    97,     4,    -1,   200,   247,    -1,   248,   176,
+     183,   177,   184,    -1,    63,    -1,   129,    -1,   118,    -1,
+      85,    -1,    43,    -1,    -1,   253,   252,    -1,   274,   255,
+      -1,   256,   274,   255,    -1,    -1,   256,    -1,   252,   255,
+      -1,   251,   255,    -1,   250,   255,    -1,   160,   253,   257,
+      -1,   205,   257,    -1,   258,    -1,   228,    -1,   174,   257,
+     175,    -1,   258,   198,    -1,   258,   174,   194,   175,    -1,
+     160,   253,   261,    -1,   205,   261,    -1,   262,    -1,   160,
+     253,   265,    -1,   205,   265,    -1,    -1,   259,    -1,   174,
+     260,   175,    -1,   262,   198,    -1,   198,    -1,   174,   194,
+     175,    -1,   262,   174,   194,   175,    -1,   160,   253,   265,
+      -1,   205,   265,    -1,   266,    -1,   160,   253,   265,    -1,
+     205,   265,    -1,    -1,   263,    -1,   228,    -1,   174,   264,
+     175,    -1,   266,   198,    -1,   198,    -1,   174,   194,   175,
+      -1,   266,   174,   194,   175,    -1,   257,    -1,   267,   150,
+     257,    -1,    -1,   152,   217,    -1,   263,   268,    -1,   269,
+      -1,   270,   150,   269,    -1,   257,    -1,   257,   178,   217,
+      -1,   117,    -1,   141,    -1,   113,    -1,   133,   227,   176,
+     218,   177,    -1,   147,    -1,     4,    -1,   229,    -1,   211,
+      -1,    60,     3,    -1,   273,    -1,   133,     3,    -1,   276,
+      -1,   140,     3,    -1,   122,   174,   274,   175,    -1,   139,
+     199,   254,   267,    -1,   140,   227,   176,   221,   177,    -1,
+     140,   227,   134,   174,   223,   175,   226,   176,   206,   177,
+      -1,     5,    -1,     5,   170,     5,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -919,22 +920,22 @@ static const yytype_uint16 yyrline[] =
      632,   633,   634,   635,   636,   637,   638,   639,   640,   641,
      642,   643,   644,   645,   646,   647,   648,   649,   650,   651,
      652,   653,   654,   655,   656,   657,   658,   659,   660,   661,
-     662,   663,   665,   667,   668,   671,   672,   675,   681,   687,
-     688,   691,   696,   703,   704,   707,   708,   712,   713,   716,
-     723,   732,   736,   741,   742,   745,   746,   747,   750,   752,
-     755,   756,   757,   758,   759,   760,   761,   762,   763,   764,
-     765,   768,   769,   772,   773,   774,   775,   776,   777,   778,
-     779,   782,   783,   791,   797,   801,   802,   806,   809,   810,
-     813,   823,   824,   827,   828,   831,   837,   843,   844,   847,
-     848,   851,   862,   869,   875,   879,   880,   883,   884,   887,
-     892,   899,   900,   901,   905,   909,   912,   913,   916,   917,
-     921,   922,   926,   927,   928,   932,   934,   935,   939,   940,
-     941,   942,   950,   952,   953,   958,   960,   964,   965,   970,
-     971,   972,   973,   978,   987,   989,   990,   995,   997,  1001,
-    1002,  1009,  1010,  1011,  1012,  1013,  1018,  1026,  1027,  1030,
-    1031,  1034,  1041,  1042,  1047,  1048,  1052,  1053,  1054,  1057,
-    1060,  1061,  1062,  1063,  1064,  1065,  1066,  1067,  1068,  1069,
-    1072,  1078,  1080,  1086,  1087
+     662,   663,   664,   666,   668,   669,   672,   673,   676,   682,
+     688,   689,   692,   697,   704,   705,   708,   709,   713,   714,
+     717,   724,   733,   737,   742,   743,   746,   747,   748,   751,
+     753,   756,   757,   758,   759,   760,   761,   762,   763,   764,
+     765,   766,   769,   770,   773,   774,   775,   776,   777,   778,
+     779,   780,   783,   784,   792,   798,   802,   803,   807,   810,
+     811,   814,   824,   825,   828,   829,   832,   838,   844,   845,
+     848,   849,   852,   863,   870,   876,   880,   881,   884,   885,
+     888,   893,   900,   901,   902,   906,   910,   913,   914,   917,
+     918,   922,   923,   927,   928,   929,   933,   935,   936,   940,
+     941,   942,   943,   951,   953,   954,   959,   961,   965,   966,
+     971,   972,   973,   974,   979,   988,   990,   991,   996,   998,
+    1002,  1003,  1010,  1011,  1012,  1013,  1014,  1019,  1027,  1028,
+    1031,  1032,  1035,  1042,  1043,  1048,  1049,  1053,  1054,  1055,
+    1058,  1061,  1062,  1063,  1064,  1065,  1066,  1067,  1068,  1069,
+    1070,  1073,  1079,  1081,  1087,  1088
 };
 #endif
 
@@ -944,13 +945,13 @@ static const yytype_uint16 yyrline[] =
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "aIDENTIFIER", "aKNOWNTYPE", "aNUM",
-  "aHEXNUM", "aDOUBLE", "aSTRING", "aWSTRING", "aUUID", "aEOF", "SHL",
-  "SHR", "MEMBERPTR", "EQUALITY", "INEQUALITY", "GREATEREQUAL",
-  "LESSEQUAL", "LOGICALOR", "LOGICALAND", "ELLIPSIS", "tAGGREGATABLE",
-  "tALLOCATE", "tANNOTATION", "tAPPOBJECT", "tASYNC", "tASYNCUUID",
-  "tAUTOHANDLE", "tBINDABLE", "tBOOLEAN", "tBROADCAST", "tBYTE",
-  "tBYTECOUNT", "tCALLAS", "tCALLBACK", "tCASE", "tCDECL", "tCHAR",
-  "tCOCLASS", "tCODE", "tCOMMSTATUS", "tCONST", "tCONTEXTHANDLE",
+  "aHEXNUM", "aDOUBLE", "aSTRING", "aWSTRING", "aSQSTRING", "aUUID",
+  "aEOF", "SHL", "SHR", "MEMBERPTR", "EQUALITY", "INEQUALITY",
+  "GREATEREQUAL", "LESSEQUAL", "LOGICALOR", "LOGICALAND", "ELLIPSIS",
+  "tAGGREGATABLE", "tALLOCATE", "tANNOTATION", "tAPPOBJECT", "tASYNC",
+  "tASYNCUUID", "tAUTOHANDLE", "tBINDABLE", "tBOOLEAN", "tBROADCAST",
+  "tBYTE", "tBYTECOUNT", "tCALLAS", "tCALLBACK", "tCASE", "tCDECL",
+  "tCHAR", "tCOCLASS", "tCODE", "tCOMMSTATUS", "tCONST", "tCONTEXTHANDLE",
   "tCONTEXTHANDLENOSERIALIZE", "tCONTEXTHANDLESERIALIZE", "tCONTROL",
   "tCPPQUOTE", "tDEFAULT", "tDEFAULTCOLLELEM", "tDEFAULTVALUE",
   "tDEFAULTVTABLE", "tDISPLAYBIND", "tDISPINTERFACE", "tDLLNAME",
@@ -1019,51 +1020,51 @@ static const yytype_uint16 yytoknum[] =
      365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
      375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
      385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
-     395,   396,   397,   398,   399,   400,   401,   402,   403,    44,
-      63,    58,   124,    94,    38,    60,    62,    45,    43,    42,
-      47,    37,    33,   126,   404,   405,   406,   407,   408,    46,
-      91,    93,    59,    40,    41,   123,   125,    61
+     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
+      44,    63,    58,   124,    94,    38,    60,    62,    45,    43,
+      42,    47,    37,    33,   126,   405,   406,   407,   408,   409,
+      46,    91,    93,    59,    40,    41,   123,   125,    61
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint16 yyr1[] =
 {
-       0,   178,   179,   180,   180,   180,   180,   180,   180,   180,
-     180,   181,   181,   181,   181,   181,   181,   181,   181,   181,
-     182,   182,   183,   183,   184,   184,   184,   184,   184,   185,
-     185,   185,   185,   185,   185,   186,   187,   188,   189,   190,
-     191,   192,   193,   193,   194,   194,   195,   195,   196,   196,
-     197,   197,   198,   198,   199,   200,   200,   200,   201,   201,
-     202,   202,   202,   202,   202,   202,   202,   202,   202,   202,
-     202,   202,   202,   202,   202,   202,   202,   202,   202,   202,
-     202,   202,   202,   202,   202,   202,   202,   202,   202,   202,
-     202,   202,   202,   202,   202,   202,   202,   202,   202,   202,
-     202,   202,   202,   202,   202,   202,   202,   202,   202,   202,
-     202,   202,   202,   202,   202,   202,   202,   202,   202,   202,
-     202,   202,   202,   202,   202,   202,   202,   202,   202,   202,
-     202,   202,   202,   203,   203,   204,   204,   204,   204,   205,
-     205,   206,   206,   207,   207,   207,   208,   208,   209,   209,
-     210,   211,   211,   212,   212,   213,   213,   213,   213,   213,
-     213,   213,   213,   213,   213,   213,   213,   213,   213,   213,
-     213,   213,   213,   213,   213,   213,   213,   213,   213,   213,
-     213,   213,   213,   213,   213,   213,   213,   213,   213,   213,
-     213,   213,   213,   213,   213,   214,   214,   215,   216,   217,
-     217,   218,   218,   219,   219,   220,   220,   221,   221,   222,
-     223,   224,   224,   225,   225,   226,   226,   226,   227,   227,
-     228,   228,   228,   228,   228,   228,   228,   228,   228,   228,
-     228,   229,   229,   230,   230,   230,   230,   230,   230,   230,
-     230,   231,   231,   232,   233,   234,   234,   235,   236,   236,
-     237,   238,   238,   239,   239,   240,   240,   241,   241,   242,
-     242,   243,   244,   244,   244,   245,   245,   246,   246,   247,
-     248,   249,   249,   249,   250,   251,   252,   252,   253,   253,
-     254,   254,   255,   255,   255,   256,   256,   256,   257,   257,
-     257,   257,   258,   258,   258,   259,   259,   260,   260,   261,
-     261,   261,   261,   261,   262,   262,   262,   263,   263,   264,
-     264,   265,   265,   265,   265,   265,   265,   266,   266,   267,
-     267,   268,   269,   269,   270,   270,   271,   271,   271,   272,
-     273,   273,   273,   273,   273,   273,   273,   273,   273,   273,
-     274,   275,   275,   276,   276
+       0,   179,   180,   181,   181,   181,   181,   181,   181,   181,
+     181,   182,   182,   182,   182,   182,   182,   182,   182,   182,
+     183,   183,   184,   184,   185,   185,   185,   185,   185,   186,
+     186,   186,   186,   186,   186,   187,   188,   189,   190,   191,
+     192,   193,   194,   194,   195,   195,   196,   196,   197,   197,
+     198,   198,   199,   199,   200,   201,   201,   201,   202,   202,
+     203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+     203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+     203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+     203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+     203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+     203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+     203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+     203,   203,   203,   204,   204,   205,   205,   205,   205,   206,
+     206,   207,   207,   208,   208,   208,   209,   209,   210,   210,
+     211,   212,   212,   213,   213,   214,   214,   214,   214,   214,
+     214,   214,   214,   214,   214,   214,   214,   214,   214,   214,
+     214,   214,   214,   214,   214,   214,   214,   214,   214,   214,
+     214,   214,   214,   214,   214,   214,   214,   214,   214,   214,
+     214,   214,   214,   214,   214,   214,   215,   215,   216,   217,
+     218,   218,   219,   219,   220,   220,   221,   221,   222,   222,
+     223,   224,   225,   225,   226,   226,   227,   227,   227,   228,
+     228,   229,   229,   229,   229,   229,   229,   229,   229,   229,
+     229,   229,   230,   230,   231,   231,   231,   231,   231,   231,
+     231,   231,   232,   232,   233,   234,   235,   235,   236,   237,
+     237,   238,   239,   239,   240,   240,   241,   241,   242,   242,
+     243,   243,   244,   245,   245,   245,   246,   246,   247,   247,
+     248,   249,   250,   250,   250,   251,   252,   253,   253,   254,
+     254,   255,   255,   256,   256,   256,   257,   257,   257,   258,
+     258,   258,   258,   259,   259,   259,   260,   260,   261,   261,
+     262,   262,   262,   262,   262,   263,   263,   263,   264,   264,
+     265,   265,   266,   266,   266,   266,   266,   266,   267,   267,
+     268,   268,   269,   270,   270,   271,   271,   272,   272,   272,
+     273,   274,   274,   274,   274,   274,   274,   274,   274,   274,
+     274,   275,   276,   276,   277,   277
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1085,25 +1086,25 @@ static const yytype_uint8 yyr2[] =
        4,     4,     1,     1,     1,     1,     1,     1,     1,     0,
        2,     4,     3,     0,     2,     1,     1,     3,     3,     1,
        5,     1,     3,     0,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     5,     3,     3,     3,     3,     3,
+       1,     1,     1,     1,     1,     5,     3,     3,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     2,     2,     2,     2,     2,     2,     3,
-       3,     5,     5,     4,     3,     1,     3,     1,     1,     0,
-       2,     4,     3,     2,     2,     0,     2,     2,     1,     3,
-       3,     3,     2,     0,     1,     0,     1,     1,     1,     1,
-       1,     1,     1,     2,     2,     1,     1,     1,     1,     1,
-       1,     0,     1,     1,     2,     1,     2,     2,     1,     1,
-       1,     2,     2,     2,     5,     0,     2,     2,     2,     2,
-       2,     2,     3,     2,     3,     5,     5,     0,     2,     2,
-       2,     2,     6,     8,     2,     2,     2,     2,     2,     2,
-       5,     1,     1,     1,     1,     1,     0,     2,     2,     3,
-       0,     1,     2,     2,     2,     3,     2,     1,     1,     3,
-       2,     4,     3,     2,     1,     3,     2,     0,     1,     3,
-       2,     1,     3,     4,     3,     2,     1,     3,     2,     0,
-       1,     1,     3,     2,     1,     3,     4,     1,     3,     0,
-       2,     2,     1,     3,     1,     3,     1,     1,     1,     5,
-       1,     1,     1,     1,     2,     1,     2,     1,     2,     4,
-       4,     5,    10,     1,     3
+       3,     3,     3,     3,     2,     2,     2,     2,     2,     2,
+       3,     3,     5,     5,     4,     3,     1,     3,     1,     1,
+       0,     2,     4,     3,     2,     2,     0,     2,     2,     1,
+       3,     3,     3,     2,     0,     1,     0,     1,     1,     1,
+       1,     1,     1,     1,     2,     2,     1,     1,     1,     1,
+       1,     1,     0,     1,     1,     2,     1,     2,     2,     1,
+       1,     1,     2,     2,     2,     5,     0,     2,     2,     2,
+       2,     2,     2,     3,     2,     3,     5,     5,     0,     2,
+       2,     2,     2,     6,     8,     2,     2,     2,     2,     2,
+       2,     5,     1,     1,     1,     1,     1,     0,     2,     2,
+       3,     0,     1,     2,     2,     2,     3,     2,     1,     1,
+       3,     2,     4,     3,     2,     1,     3,     2,     0,     1,
+       3,     2,     1,     3,     4,     3,     2,     1,     3,     2,
+       0,     1,     1,     3,     2,     1,     3,     4,     1,     3,
+       0,     2,     2,     1,     3,     1,     3,     1,     1,     1,
+       5,     1,     1,     1,     1,     2,     1,     2,     1,     2,
+       4,     4,     5,    10,     1,     3
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -1111,725 +1112,715 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       3,     0,     2,     1,   331,   228,   220,   239,     0,   275,
-       0,     0,   227,   215,   229,   271,   226,   230,   231,     0,
-     274,   233,   240,   238,     0,   231,   273,     0,   231,     0,
-     235,   272,   215,    52,   215,   225,   330,   221,    60,    10,
-       0,    24,    11,    27,    11,     9,     0,   333,     0,   332,
-     222,     0,     0,     7,     0,     0,    22,     0,   257,     5,
-       4,     0,     8,   280,   280,   280,     0,     0,   335,   280,
-       0,   337,   241,   242,     0,   248,   249,   334,   217,     0,
-     232,   237,     0,   259,   260,   236,     0,   234,   223,   336,
-       0,     0,    53,   338,     0,   224,    61,     0,    63,    64,
+       3,     0,     2,     1,   332,   229,   221,   240,     0,   276,
+       0,     0,   228,   216,   230,   272,   227,   231,   232,     0,
+     275,   234,   241,   239,     0,   232,   274,     0,   232,     0,
+     236,   273,   216,    52,   216,   226,   331,   222,    60,    10,
+       0,    24,    11,    27,    11,     9,     0,   334,     0,   333,
+     223,     0,     0,     7,     0,     0,    22,     0,   258,     5,
+       4,     0,     8,   281,   281,   281,     0,     0,   336,   281,
+       0,   338,   242,   243,     0,   249,   250,   335,   218,     0,
+     233,   238,     0,   260,   261,   237,     0,   235,   224,   337,
+       0,     0,    53,   339,     0,   225,    61,     0,    63,    64,
       65,    66,    67,     0,     0,    70,    71,    72,    73,    74,
       75,     0,    77,    78,     0,    80,     0,     0,    83,    84,
        0,     0,     0,     0,     0,    90,     0,    92,     0,    94,
        0,    96,    97,   100,     0,   101,   102,   103,   104,   105,
-     106,   107,   108,   109,     0,   111,   112,   113,   328,   114,
-       0,   116,   326,   117,   118,   119,     0,   121,   122,   123,
-       0,     0,     0,   327,     0,   128,   129,     0,     0,     0,
-      55,   132,    25,     0,     0,     0,     0,     0,   333,   243,
-     250,   261,   269,     0,   335,   337,    26,     6,   245,   266,
-       0,    23,   264,   265,     0,     0,    20,   284,   281,   283,
-     282,   218,   219,   135,   136,   137,   138,   276,     0,     0,
-     288,   324,   287,   212,   333,   335,   280,   337,   278,    28,
-       0,   143,    36,     0,   199,     0,     0,   205,     0,     0,
+     106,   107,   108,   109,     0,   111,   112,   113,   329,   114,
+       0,   116,   327,   117,   118,   119,     0,   121,   122,   123,
+       0,     0,     0,   328,     0,   128,   129,     0,     0,     0,
+      55,   132,    25,     0,     0,     0,     0,     0,   334,   244,
+     251,   262,   270,     0,   336,   338,    26,     6,   246,   267,
+       0,    23,   265,   266,     0,     0,    20,   285,   282,   284,
+     283,   219,   220,   135,   136,   137,   138,   277,     0,     0,
+     289,   325,   288,   213,   334,   336,   281,   338,   279,    28,
+       0,   143,    36,     0,   200,     0,     0,   206,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,   153,     0,     0,   153,     0,     0,
        0,     0,     0,     0,    60,    54,    37,     0,    17,    18,
-      19,     0,    15,    13,    12,    16,    22,    39,   267,   268,
-      40,   211,    52,     0,    52,     0,     0,   258,    20,     0,
-       0,     0,   286,     0,   153,    42,   290,   279,    35,     0,
-     145,   146,   149,   339,    52,   317,   340,    52,    52,     0,
-       0,   163,   155,   156,   157,   161,   162,   158,   159,     0,
-     160,     0,     0,     0,     0,     0,     0,     0,   197,     0,
-     195,   198,     0,     0,    58,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   151,   154,     0,
-       0,     0,     0,     0,     0,   134,   133,     0,   343,     0,
-       0,    56,    60,     0,    14,    41,    22,     0,   246,   251,
-       0,     0,     0,    52,     0,     0,     0,    22,    21,     0,
-     277,   285,   289,   325,     0,     0,     0,    46,    43,    44,
-       0,   309,   150,   144,     0,   329,     0,   200,     0,     0,
-     341,    53,   206,     0,    62,    68,     0,   187,   186,   185,
-     188,   183,   184,     0,   297,     0,     0,     0,     0,     0,
+      19,     0,    15,    13,    12,    16,    22,    39,   268,   269,
+      40,   212,    52,     0,    52,     0,     0,   259,    20,     0,
+       0,     0,   287,     0,   153,    42,   291,   280,    35,     0,
+     145,   146,   149,   340,    52,   318,   341,    52,    52,     0,
+       0,   164,   155,   156,   157,   161,   162,   163,   158,   159,
+       0,   160,     0,     0,     0,     0,     0,     0,     0,   198,
+       0,   196,   199,     0,     0,    58,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   151,   154,
+       0,     0,     0,     0,     0,     0,   134,   133,     0,   344,
+       0,     0,    56,    60,     0,    14,    41,    22,     0,   247,
+     252,     0,     0,     0,    52,     0,     0,     0,    22,    21,
+       0,   278,   286,   290,   326,     0,     0,     0,    46,    43,
+      44,     0,   310,   150,   144,     0,   330,     0,   201,     0,
+       0,   342,    53,   207,     0,    62,    68,     0,   188,   187,
+     186,   189,   184,   185,     0,   298,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    69,    76,
-      79,     0,    81,    82,    85,    86,    87,    88,    89,    91,
-      93,     0,    99,   153,    98,   110,     0,   120,   124,   125,
-     126,   127,     0,   130,   131,    57,     0,   244,   247,   253,
-       0,   252,   255,     0,     0,   256,    20,    22,   270,    51,
-      50,   291,     0,   309,   276,    42,   314,   309,   311,   310,
-      49,   306,   147,   148,     0,   337,   318,   213,   204,   203,
-     297,   194,   276,    42,   301,   297,   298,     0,   294,   176,
-     177,   189,   170,   171,   174,   175,   165,   166,     0,   167,
-     168,   169,   173,   172,   179,   178,   181,   182,   180,   190,
-       0,   196,    59,    95,   152,     0,   344,    22,   209,     0,
-     254,     0,   262,    47,    45,    48,   309,   276,     0,   309,
-       0,   305,    42,   313,   319,   322,     0,   202,     0,   214,
-       0,   297,   276,     0,   309,     0,   293,     0,    42,   300,
-       0,   193,   115,    38,   210,    22,   304,   309,   315,   308,
-     312,     0,     0,   321,     0,   201,   139,   192,   292,   309,
-     302,   296,   299,   191,     0,   164,   263,   307,   316,   320,
-     323,     0,   295,   303,     0,     0,   342,   140,     0,    52,
-      52,   208,   142,     0,   141,   207
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    69,
+      76,    79,     0,    81,    82,    85,    86,    87,    88,    89,
+      91,    93,     0,    99,   153,    98,   110,     0,   120,   124,
+     125,   126,   127,     0,   130,   131,    57,     0,   245,   248,
+     254,     0,   253,   256,     0,     0,   257,    20,    22,   271,
+      51,    50,   292,     0,   310,   277,    42,   315,   310,   312,
+     311,    49,   307,   147,   148,     0,   338,   319,   214,   205,
+     204,   298,   195,   277,    42,   302,   298,   299,     0,   295,
+     177,   178,   190,   171,   172,   175,   176,   166,   167,     0,
+     168,   169,   170,   174,   173,   180,   179,   182,   183,   181,
+     191,     0,   197,    59,    95,   152,     0,   345,    22,   210,
+       0,   255,     0,   263,    47,    45,    48,   310,   277,     0,
+     310,     0,   306,    42,   314,   320,   323,     0,   203,     0,
+     215,     0,   298,   277,     0,   310,     0,   294,     0,    42,
+     301,     0,   194,   115,    38,   211,    22,   305,   310,   316,
+     309,   313,     0,     0,   322,     0,   202,   139,   193,   293,
+     310,   303,   297,   300,   192,     0,   165,   264,   308,   317,
+     321,   324,     0,   296,   304,     0,     0,   343,   140,     0,
+      52,    52,   209,   142,     0,   141,   208
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,     2,   173,   279,   192,   368,    40,    41,    42,
-      43,   259,   177,    44,   260,   376,   377,   378,   379,   476,
-     361,    92,   169,   325,   170,   347,   477,   591,   597,   289,
-     290,   291,   214,   336,   337,   318,   319,   320,   322,   294,
-     387,   392,   298,   602,   603,   464,    48,   548,    79,   478,
-      49,    81,    50,   261,    52,   262,   272,   358,    54,    55,
-     274,   363,    56,   195,    57,    58,   263,   264,   182,    61,
+      -1,     1,     2,   173,   279,   192,   369,    40,    41,    42,
+      43,   259,   177,    44,   260,   377,   378,   379,   380,   477,
+     362,    92,   169,   326,   170,   348,   478,   592,   598,   289,
+     290,   291,   214,   337,   338,   319,   320,   321,   323,   294,
+     388,   393,   298,   603,   604,   465,    48,   549,    79,   479,
+      49,    81,    50,   261,    52,   262,   272,   359,    54,    55,
+     274,   364,    56,   195,    57,    58,   263,   264,   182,    61,
      265,    63,    64,    65,   280,    66,   197,    67,   211,   212,
-     496,   555,   497,   498,   479,   540,   480,   481,   296,   573,
-     545,   546,   213,   171,   215,    69,    70,   217,   349
+     497,   556,   498,   499,   480,   541,   481,   482,   296,   574,
+     546,   547,   213,   171,   215,    69,    70,   217,   350
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -472
+#define YYPACT_NINF -459
 static const yytype_int16 yypact[] =
 {
-    -472,    38,  1206,  -472,  -472,  -472,  -472,  -472,    75,  -472,
-     -86,   228,  -472,   238,  -472,  -472,  -472,  -472,    28,   101,
-    -472,  -472,  -472,  -472,   265,    28,  -472,   -23,    28,   408,
-    -472,  -472,   271,    -3,   287,   408,  -472,  -472,  2244,  -472,
-      25,  -472,  -472,  -472,  -472,  -472,  1982,    34,    47,  -472,
-    -472,    52,    54,  -472,    73,    61,   106,   110,    62,  -472,
-    -472,    97,  -472,    31,    31,    31,   114,  2135,   123,    31,
-     133,   135,  -472,  -472,   218,  -472,  -472,   126,  -472,   142,
-    -472,  -472,   146,  -472,  -472,  -472,  2135,  -472,  -472,   126,
-     148,  2060,  -472,   -99,   -89,  -472,  -472,   151,  -472,  -472,
-    -472,  -472,  -472,   153,   154,  -472,  -472,  -472,  -472,  -472,
-    -472,   156,  -472,  -472,   157,  -472,   159,   160,  -472,  -472,
-     161,   162,   163,   165,   167,  -472,   169,  -472,   173,  -472,
-     174,  -472,  -472,   185,   187,  -472,  -472,  -472,  -472,  -472,
-    -472,  -472,  -472,  -472,   192,  -472,  -472,  -472,  -472,  -472,
-     194,  -472,  -472,  -472,  -472,  -472,   201,  -472,  -472,  -472,
-     210,   212,   214,  -472,   215,  -472,  -472,   216,   219,   -79,
-    -472,  -472,  -472,  1111,   425,   334,   290,   224,   230,  -472,
-    -472,  -472,  -472,   114,   233,   235,  -472,  -472,  -472,  -472,
-      24,  -472,  -472,  -472,   296,   225,  -472,  -472,  -472,  -472,
-    -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,   114,   114,
-    -472,   229,   -26,  -472,  -472,  -472,    31,  -472,  -472,  -472,
-     236,   312,  -472,   237,  -472,   114,   242,  -472,   400,   312,
-     967,   967,   401,   409,   967,   967,   410,   411,   967,   413,
-     967,   967,   349,   967,   967,   -21,   967,   967,   967,  2135,
-    2135,   129,   418,  2135,  2244,   254,  -472,   260,  -472,  -472,
-    -472,   263,  -472,  -472,  -472,  -472,   106,  -472,  -472,  -472,
-    -472,  -472,  -145,   285,   -65,   266,   264,  -472,  -472,   520,
-      64,   268,  -472,   967,   974,  1552,  -472,  -472,  -472,   269,
-     292,  -472,   272,  -472,   -54,  -472,   294,    -3,   -36,   270,
-     274,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,   277,
-    -472,   967,   967,   967,   967,   967,   967,   805,  1801,  -125,
-    -472,  1801,   279,   280,  -472,  -110,   282,   284,   286,   288,
-     291,   295,   297,  1557,   448,   300,  -109,  -472,  1801,   301,
-     310,   -72,  1615,   302,   303,  -472,  -472,   305,   299,   307,
-     309,  -472,  2244,   453,  -472,  -472,   106,     1,  -472,  -472,
-     335,  2060,   321,   -34,   322,   417,   615,   106,  -472,  2060,
-    -472,  -472,  -472,  -472,   895,   329,   330,   354,  -472,  -472,
-    2060,    57,  -472,   312,   967,  -472,  2060,  -472,   114,   333,
-    -472,   336,  -472,   338,  -472,  -472,  2060,    18,    18,    18,
-      18,    18,    18,  1638,   267,   967,   967,   512,   967,   967,
-     967,   967,   967,   967,   967,   967,   967,   967,   967,   967,
-     967,   967,   967,   967,   967,   513,   967,   967,  -472,  -472,
-    -472,   510,  -472,  -472,  -472,  -472,  -472,  -472,  -472,  -472,
-    -472,   346,  -472,   967,  -472,  -472,   967,  -472,  -472,  -472,
-    -472,  -472,   516,  -472,  -472,  -472,   348,  -472,  -472,  -472,
-     114,  -472,  -472,  2060,   351,  -472,  -472,   106,  -472,  -472,
-    -472,  -472,  1474,    57,  -472,  1318,  -472,    57,  -472,  -472,
-    -472,    41,  -472,  -472,    57,   353,  -472,   312,  -472,  -472,
-     267,  -472,  -472,  1396,  -472,   267,  -472,   352,    48,   193,
-     193,  -472,   221,   221,   152,   152,  1688,  1765,  1742,  1819,
-    1838,  1870,   152,   152,   234,   234,    18,    18,    18,  -472,
-    1720,  -472,  -472,  -472,  -472,   358,  -472,   106,  -472,   114,
-    -472,   710,  -472,  -472,  -472,  -472,    32,  -472,   361,    57,
-     362,  -472,  1552,  -472,   376,  -472,   -45,  -472,   363,  -472,
-     365,   255,  -472,   367,    57,   369,  -472,   967,  1552,  -472,
-     967,  -472,  -472,  -472,  -472,   106,  -472,    32,  -472,  -472,
-    -472,   370,   967,  -472,    57,  -472,  -472,  -472,  -472,    32,
-    -472,  -472,  -472,    18,   371,  1801,  -472,  -472,  -472,  -472,
-    -472,    23,  -472,  -472,   967,   377,  -472,  -472,   398,    20,
-      20,  -472,  -472,   382,  -472,  -472
+    -459,    58,  1214,  -459,  -459,  -459,  -459,  -459,   161,  -459,
+    -102,   256,  -459,   264,  -459,  -459,  -459,  -459,    -1,    88,
+    -459,  -459,  -459,  -459,   289,    -1,  -459,   -67,    -1,   484,
+    -459,  -459,   295,   -19,   297,   484,  -459,  -459,  2194,  -459,
+     -16,  -459,  -459,  -459,  -459,  -459,  2007,     5,    13,  -459,
+    -459,    39,    25,  -459,    46,    72,    54,    89,   117,  -459,
+    -459,    98,  -459,   -14,   -14,   -14,   287,   992,   103,   -14,
+     109,   113,  -459,  -459,   276,  -459,  -459,   112,  -459,   119,
+    -459,  -459,   129,  -459,  -459,  -459,   992,  -459,  -459,   112,
+     128,  2085,  -459,  -103,  -101,  -459,  -459,   134,  -459,  -459,
+    -459,  -459,  -459,   140,   144,  -459,  -459,  -459,  -459,  -459,
+    -459,   146,  -459,  -459,   149,  -459,   153,   154,  -459,  -459,
+     163,   164,   168,   171,   174,  -459,   175,  -459,   177,  -459,
+     182,  -459,  -459,   184,   185,  -459,  -459,  -459,  -459,  -459,
+    -459,  -459,  -459,  -459,   186,  -459,  -459,  -459,  -459,  -459,
+     192,  -459,  -459,  -459,  -459,  -459,   194,  -459,  -459,  -459,
+     200,   201,   204,  -459,   205,  -459,  -459,   207,   208,   -93,
+    -459,  -459,  -459,  1119,   500,   359,   303,   209,   210,  -459,
+    -459,  -459,  -459,   287,   211,   216,  -459,  -459,  -459,  -459,
+      33,  -459,  -459,  -459,   307,   212,  -459,  -459,  -459,  -459,
+    -459,  -459,  -459,  -459,  -459,  -459,  -459,  -459,   287,   287,
+    -459,   213,   -87,  -459,  -459,  -459,   -14,  -459,  -459,  -459,
+     218,   309,  -459,   220,  -459,   287,   223,  -459,   391,   309,
+     944,   944,   392,   398,   944,   944,   399,   400,   944,   402,
+     944,   944,   344,   944,   944,   -72,   944,   944,   944,   992,
+     992,   111,   410,   992,  2194,   245,  -459,   244,  -459,  -459,
+    -459,   246,  -459,  -459,  -459,  -459,    54,  -459,  -459,  -459,
+    -459,  -459,   -50,   268,   -32,   248,   247,  -459,  -459,   595,
+      40,   253,  -459,   944,   983,  1577,  -459,  -459,  -459,   255,
+     272,  -459,   252,  -459,   -18,  -459,   284,   -19,    -8,   260,
+     262,  -459,  -459,  -459,  -459,  -459,  -459,  -459,  -459,  -459,
+     266,  -459,   944,   944,   944,   944,   944,   944,   880,  1826,
+     -80,  -459,  1826,   263,   267,  -459,   -69,   269,   270,   271,
+     273,   274,   280,   281,  1582,   438,   285,   -62,  -459,  1826,
+     291,   293,   -24,  1640,   294,   298,  -459,  -459,   300,   302,
+     301,   304,  -459,  2194,   443,  -459,  -459,    54,     7,  -459,
+    -459,   316,  2085,   305,    14,   306,   389,   690,    54,  -459,
+    2085,  -459,  -459,  -459,  -459,   326,   308,   313,   327,  -459,
+    -459,  2085,    90,  -459,   309,   944,  -459,  2085,  -459,   287,
+     318,  -459,   321,  -459,   322,  -459,  -459,  2085,    11,    11,
+      11,    11,    11,    11,  1663,   279,   944,   944,   479,   944,
+     944,   944,   944,   944,   944,   944,   944,   944,   944,   944,
+     944,   944,   944,   944,   944,   944,   488,   944,   944,  -459,
+    -459,  -459,   489,  -459,  -459,  -459,  -459,  -459,  -459,  -459,
+    -459,  -459,   324,  -459,   944,  -459,  -459,   944,  -459,  -459,
+    -459,  -459,  -459,   491,  -459,  -459,  -459,   330,  -459,  -459,
+    -459,   287,  -459,  -459,  2085,   328,  -459,  -459,    54,  -459,
+    -459,  -459,  -459,  1499,    90,  -459,  1326,  -459,    90,  -459,
+    -459,  -459,    16,  -459,  -459,    90,   329,  -459,   309,  -459,
+    -459,   279,  -459,  -459,  1404,  -459,   279,  -459,   331,    31,
+     243,   243,  -459,   444,   444,    95,    95,  1713,  1790,  1767,
+    1844,  1863,  1895,    95,    95,   193,   193,    11,    11,    11,
+    -459,  1745,  -459,  -459,  -459,  -459,   332,  -459,    54,  -459,
+     287,  -459,   785,  -459,  -459,  -459,  -459,   145,  -459,   333,
+      90,   334,  -459,  1577,  -459,   358,  -459,   -74,  -459,   335,
+    -459,   337,    47,  -459,   338,    90,   339,  -459,   944,  1577,
+    -459,   944,  -459,  -459,  -459,  -459,    54,  -459,   145,  -459,
+    -459,  -459,   340,   944,  -459,    90,  -459,  -459,  -459,  -459,
+     145,  -459,  -459,  -459,    11,   341,  1826,  -459,  -459,  -459,
+    -459,  -459,    -9,  -459,  -459,   944,   365,  -459,  -459,   366,
+      51,    51,  -459,  -459,   347,  -459,  -459
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -472,  -472,  -472,   511,  -271,  -257,    10,  -472,  -472,  -472,
-     195,  -472,  -472,  -472,   557,  -409,  -472,  -472,    89,  -192,
-      -6,    -2,  -472,  -472,  -244,  -472,   -63,  -472,  -472,  -472,
-    -472,   182,     2,   323,  -261,  -159,  -472,  -224,  -228,  -472,
-    -472,  -472,  -472,   -32,  -167,  -472,  -472,  -472,   164,   -40,
-    -472,   200,   100,    51,  -472,   567,  -472,  -472,   527,  -472,
-    -472,  -472,  -472,  -472,   -13,  -472,   572,    -1,  -472,  -472,
-     574,  -472,  -472,  -265,  -411,   -41,    -7,   -22,  -180,  -472,
-    -472,  -472,  -439,  -472,  -471,  -472,  -456,  -472,  -472,  -472,
-       3,  -472,   395,   339,     6,   -49,  -472,     0,  -472
+    -459,  -459,  -459,   477,  -258,  -257,    19,  -459,  -459,  -459,
+     156,  -459,  -459,  -459,   522,  -429,  -459,  -459,    52,  -202,
+     -21,    -2,  -459,  -459,  -229,  -459,   -65,  -459,  -459,  -459,
+    -459,   142,     2,   282,  -260,  -181,  -459,  -224,  -227,  -459,
+    -459,  -459,  -459,   -73,  -206,  -459,  -459,  -459,   215,   -63,
+    -459,   188,   121,    28,  -459,   525,  -459,  -459,   490,  -459,
+    -459,  -459,  -459,  -459,   -23,  -459,   533,     3,  -459,  -459,
+     535,  -459,  -459,  -265,  -413,   -40,   -10,   -27,  -191,  -459,
+    -459,  -459,  -414,  -459,  -458,  -459,  -439,  -459,  -459,  -459,
+     -33,  -459,   361,   310,     6,   -54,  -459,     0,  -459
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -217
+#define YYTABLE_NINF -218
 static const yytype_int16 yytable[] =
 {
-      46,    60,    71,   209,    47,   183,   326,   366,    68,   355,
-     351,   327,    39,   544,   330,   370,   332,   535,   216,   335,
-     286,   541,   340,   375,   427,    38,   210,    91,   281,   282,
-     360,   356,   407,   181,  -216,   201,   202,   223,     3,   431,
-     443,   198,   198,   198,   226,   295,   185,   198,   178,   428,
-     225,   550,   184,    51,    11,   373,   556,   199,   200,   594,
-     201,   202,   218,   536,   432,   444,   538,   201,   202,   203,
-     254,   595,   321,     9,     9,   321,  -216,   443,    72,    73,
-     566,   551,   333,   569,   553,   338,   227,    74,   338,   342,
-      24,   148,   255,    15,   203,   152,   204,   179,   581,   457,
-     371,   203,   447,   544,   574,    38,     9,   362,   455,    82,
-     468,   587,   578,    24,    80,    20,    38,   201,   202,   163,
-     209,   204,   385,   592,   321,   338,   567,   575,   204,    88,
-     389,   393,   273,   571,    38,    95,    38,   345,   205,   346,
-     390,   579,   462,   210,   284,   209,   209,   285,    26,   584,
-      86,   203,   397,   398,   399,   400,   401,   402,   403,    31,
-     483,   206,   209,   205,   405,   406,   407,    38,   210,   210,
-     205,    46,    46,    71,    71,    47,    47,   275,   204,    68,
-      68,   292,   524,   258,   258,   210,   206,   425,   426,   300,
-      38,   474,   601,   206,   198,   531,    90,   172,    94,   596,
-     343,   344,   284,   521,   350,   475,   -29,   407,   486,   287,
-     532,   284,   494,   194,   542,   400,   474,   209,   284,   186,
-     205,   558,   525,   207,   187,    85,   220,   284,    87,   188,
-     475,    75,    76,   405,   406,   407,   190,   208,   410,   411,
-     210,    77,    78,   206,   381,   189,   499,   500,   407,   502,
-     503,   504,   505,   506,   507,   508,   509,   510,   511,   512,
-     513,   514,   515,   516,   517,   518,   357,   520,    83,    84,
-     563,   370,   196,   207,    89,    78,   404,   369,   191,    71,
-     528,    47,   193,   380,   338,    68,   370,   208,   386,   543,
-      93,    78,   203,   268,   269,   -30,   391,     9,   494,   276,
-     277,  -216,   370,   494,   203,   219,   559,   -31,   586,   420,
-     421,   422,   423,   424,   370,   201,   202,   221,   222,   204,
-     460,   425,   426,   224,   228,   209,   229,   230,   183,   231,
-     232,   204,   233,   234,   235,   236,   237,   267,   238,   473,
-     239,   495,   240,   292,   589,   484,   241,   242,   210,   564,
-     420,   421,   422,   423,   424,   490,   458,   463,   243,   494,
-     244,   205,   425,   426,   369,   245,    71,   246,    47,   185,
-     598,   178,    68,   205,   247,   184,   418,   419,   420,   421,
-     422,   423,   424,   248,   206,   249,   485,   250,   251,   252,
-     425,   426,   253,   422,   423,   424,   206,   209,   583,   270,
-     278,   585,   -32,   425,   426,   -33,   283,   -34,   299,   323,
-     288,   293,   539,   321,   492,   297,   334,   324,   328,   329,
-     210,   331,   529,   348,   352,   284,   492,   495,   493,     4,
-     554,   381,   495,   353,   381,   354,   359,   284,   364,   365,
-     493,   383,   372,   388,   394,   382,     7,   549,   395,   384,
-     396,   441,   381,   429,   430,     5,   433,     6,   434,   446,
-     435,   456,   436,     7,     8,   437,   209,     9,   452,   438,
-     380,   439,    10,   380,   442,   445,   449,   450,    11,   451,
-      12,   453,    18,   454,    13,    14,   459,    15,   495,   210,
-      16,   380,    17,   461,    21,    22,    23,    19,   465,    18,
-     470,   381,    25,   472,   471,    19,   257,   487,   488,    20,
-     489,    21,    22,    23,    24,   501,   519,   381,   522,    25,
-     523,   526,   527,   530,     4,   547,   557,   572,   599,   369,
-      28,    71,   562,    47,    30,   568,   570,    68,   576,   577,
-     380,   580,    26,   582,   588,   593,    27,    28,    29,   600,
-       5,    30,     6,    31,   605,   174,   380,    32,     7,    45,
-     466,   534,     9,    33,    34,   482,    35,    10,   604,    53,
-     341,    36,    37,   180,    59,    12,    62,   590,   271,    13,
-      14,     0,    15,     0,   339,    16,     0,    17,     0,     0,
-       0,     0,     0,     0,    18,    38,     0,     0,     0,     0,
-      19,   266,     0,     0,    20,     0,    21,    22,    23,     0,
-       0,     0,     0,     0,    25,     0,     0,     0,     0,     4,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    26,     0,     0,
-       0,    27,    28,    29,     0,     5,    30,     6,    31,     0,
-       0,     0,    32,     7,     0,     0,     0,     9,    33,    34,
-       0,    35,    10,     0,     0,     0,    36,    37,     0,     0,
-      12,     0,     0,     0,    13,    14,     0,    15,     0,     0,
-      16,     0,    17,     0,     0,     0,     0,     0,     0,    18,
-      38,     0,     0,     0,     0,    19,   367,     0,     0,    20,
-       0,    21,    22,    23,     0,     0,     0,     0,     0,    25,
-       0,     0,     0,     0,     4,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    26,     0,     0,     0,    27,    28,    29,     0,
-       5,    30,     6,    31,     0,     0,     0,    32,     7,     0,
-       0,     0,     9,    33,    34,     0,    35,    10,     0,     0,
-       0,    36,    37,     0,     0,    12,     0,     0,     0,    13,
-      14,     0,    15,     0,     0,    16,     0,    17,     0,     0,
-       0,     0,     0,     0,    18,    38,     0,     0,     0,     0,
-      19,   467,     0,     0,    20,     0,    21,    22,    23,     0,
-       0,     0,     0,     0,    25,     0,     0,     0,   301,     4,
-     302,   303,   304,   305,   306,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    26,     0,     0,
-       0,    27,    28,    29,     0,     5,    30,     6,    31,     0,
-       0,     0,    32,     7,     0,     0,     0,     9,    33,    34,
-       0,    35,     0,     0,     0,     0,    36,    37,     0,     0,
-      12,     0,     0,     0,    13,    14,     0,    15,   307,     0,
-      16,     0,    17,     0,     0,     0,     0,     0,     0,    18,
-      38,     0,     0,     0,     0,     0,   565,     0,     0,    20,
-       0,    21,    22,    23,     0,     0,     0,     0,   301,    25,
-     302,   303,   304,   305,   306,   308,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    26,     0,     0,     0,    27,    28,    29,     0,
-     309,    30,     0,    31,     0,     0,     0,    32,     0,     0,
-       0,     0,   310,     0,    34,     0,    35,     0,     0,     0,
-       0,    36,    37,     0,     0,     0,     0,     0,   307,   311,
-       0,     0,   312,   313,   314,     0,     0,   315,   316,     0,
-     301,     0,   302,   303,   304,   305,   306,   301,   317,   302,
-     303,   304,   305,   306,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   308,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     309,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     307,     0,   310,     0,     0,     0,     0,   307,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   311,
-       0,     0,   312,   313,   314,     0,     0,   315,   316,     0,
-       0,     0,     0,     0,     0,     0,   469,   308,   317,     0,
-       0,     0,     0,     0,   308,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   309,     0,     0,     0,     0,     0,     0,   309,
-       0,     0,     0,     0,   310,     0,     0,     0,     0,     0,
-       0,   310,     0,     0,     0,     4,     0,     0,     0,     0,
-       0,   311,   256,     0,   312,   313,   314,     0,   311,   315,
-     316,   312,   313,   374,     0,     0,   315,   316,     0,     0,
-     317,     5,     0,     6,     0,     0,     0,   317,     0,     7,
-       8,     0,     0,     9,     0,     0,     0,     0,    10,     0,
-       0,     0,     0,     0,    11,     0,    12,     0,     0,     0,
+      46,   209,    71,   210,    47,    60,   183,   327,    68,   356,
+     286,   328,    91,   216,   331,   371,   333,   281,   282,   336,
+     367,    39,   341,   181,   376,   352,   408,   545,   595,     9,
+      51,  -217,   223,   226,   295,   536,   198,   198,   198,   542,
+     596,   148,   198,   201,   202,   152,   185,   539,   178,    15,
+     322,   225,   184,   322,   199,   200,   374,   254,     3,   218,
+     334,    11,   537,   339,   361,   554,   339,   343,   363,   163,
+     428,    20,    74,  -217,   179,   227,   575,   551,   203,   255,
+     552,   432,   557,     9,   284,   203,    80,   285,   444,   372,
+       9,   390,   394,   201,   202,   429,    82,    24,   567,   576,
+     458,   570,   322,   339,    26,   204,   433,    86,   406,   407,
+     408,   469,   204,   445,   572,    31,   582,   545,   209,   346,
+     210,    38,   347,    24,   456,   568,   444,   357,   203,   588,
+     585,   398,   399,   400,   401,   402,   403,   404,   579,    38,
+     580,   593,   273,   209,   209,   210,   210,   205,   201,   202,
+      88,   448,    38,    38,   205,   204,    95,   172,   292,   386,
+     209,   484,   210,    38,    72,    73,   300,   275,   597,   391,
+     206,    46,    46,    71,    71,    47,    47,   206,   -29,    68,
+      68,   426,   427,   203,   525,    38,   186,   284,     9,   198,
+     543,   463,   258,   258,   401,   344,   345,   205,   487,   351,
+     207,   188,   284,   495,   522,   559,   287,   493,   408,   532,
+     204,   533,   187,    85,   208,   209,    87,   210,   284,   189,
+     206,   494,    38,   526,   602,   500,   501,   191,   503,   504,
+     505,   506,   507,   508,   509,   510,   511,   512,   513,   514,
+     515,   516,   517,   518,   519,   382,   521,    90,   190,    94,
+     475,   358,   205,   421,   422,   423,   424,   425,   408,    75,
+      76,   284,   193,   339,   476,   426,   427,    77,    78,   194,
+     529,   564,   371,   387,   196,   206,   -30,   370,   405,    71,
+     544,    47,   219,   381,   220,    68,   -31,   371,  -217,   495,
+     201,   202,    83,    84,   495,   221,   392,   560,    89,    78,
+      93,    78,   222,   371,   224,   475,   268,   269,   228,   587,
+     276,   277,   201,   202,   229,   371,   284,   203,   230,   476,
+     231,   292,   461,   232,   209,   203,   210,   233,   234,   301,
+     183,   302,   303,   304,   305,   306,   307,   235,   236,   565,
+     496,   474,   237,   464,   204,   238,   590,   485,   239,   240,
+     495,   241,   204,   423,   424,   425,   242,   491,   243,   244,
+     245,   459,   267,   426,   427,   370,   246,    71,   247,    47,
+     185,   599,   178,    68,   248,   249,   184,   584,   250,   251,
+     586,   252,   253,   -32,   -33,   270,   205,   486,   278,   -34,
+     308,   283,   322,   288,   205,   293,   209,   297,   210,   299,
+     324,   421,   422,   423,   424,   425,   325,   329,   330,   206,
+     332,   540,   335,   426,   427,   349,   353,   206,   354,   355,
+     360,   365,   384,   366,   530,   550,   496,   309,   373,   555,
+     385,   496,   383,   382,   389,   395,   382,   396,   430,   493,
+     397,   442,   431,   447,   434,   435,   436,   207,   437,   438,
+     284,   457,   310,   494,   382,   439,   440,   406,   407,   408,
+     443,   208,   411,   412,   311,   209,   446,   210,   460,   450,
+      19,   381,   453,   451,   381,   452,   454,   473,   462,   455,
+     471,   312,   502,   466,   313,   314,   315,   496,   472,   316,
+     317,   520,   381,   488,   489,   490,   527,   523,   470,   524,
+     318,   531,   548,   382,     4,   528,   558,   563,   569,   571,
+     573,   577,   578,   581,   583,   589,   594,   600,   601,   382,
+     606,   174,   467,     7,    45,   535,   483,    53,   605,   342,
+     370,     5,    71,     6,    47,    59,   180,    62,    68,     7,
+       8,   381,   591,     9,   271,     0,     0,     0,    10,     0,
+       0,     0,     0,     0,    11,   340,    12,   381,     0,    18,
       13,    14,     0,    15,     0,     0,    16,     0,    17,     0,
-       0,     0,     0,     0,     0,    18,     0,     0,     0,     0,
+       0,    21,    22,    23,     0,    18,     0,     0,     0,    25,
        0,    19,   257,     0,     0,    20,     0,    21,    22,    23,
-      24,     0,     0,     0,     0,    25,     0,     0,     0,     0,
-       4,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    26,     0,
+      24,     0,     0,     0,     0,    25,     0,     0,     0,     4,
+     419,   420,   421,   422,   423,   424,   425,    28,     0,     0,
+       0,    30,     0,     0,   426,   427,     0,     0,    26,     0,
        0,     0,    27,    28,    29,     0,     5,    30,     6,    31,
-       0,     0,     0,    32,     7,     8,     0,     0,     9,    33,
-      34,     0,    35,    10,     0,     0,     0,    36,    37,    11,
+       0,     0,     0,    32,     7,     0,     0,     0,     9,    33,
+      34,     0,    35,    10,     0,     0,     0,    36,    37,     0,
        0,    12,     0,     0,     0,    13,    14,     0,    15,     0,
        0,    16,     0,    17,     0,     0,     0,     0,     0,     0,
-      18,    38,     0,     0,     0,     0,    19,     0,     0,     0,
-      20,     0,    21,    22,    23,    24,     0,     0,     0,     0,
-      25,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      18,    38,     0,     0,     0,     0,    19,   266,     0,     0,
+      20,     0,    21,    22,    23,     0,     0,     0,     0,     0,
+      25,     0,     0,     0,     4,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     4,    26,     0,     0,     0,    27,    28,    29,
-       0,     0,    30,     0,    31,     0,     0,     0,    32,     0,
-       0,     0,     0,     0,    33,    34,     0,    35,     5,     0,
-       6,     0,    36,    37,     0,   203,     7,     0,     0,     0,
-       9,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    12,     0,     0,    38,    13,    14,     0,
-      15,     0,   204,    16,     0,    17,     0,     0,     0,     0,
-       0,     0,    18,     0,     0,     0,     0,     0,     0,     0,
-       4,     0,    20,     0,    21,    22,    23,     0,     0,     0,
-       0,     0,    25,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   205,     0,     5,     0,     6,     0,
-       0,     0,     0,   203,     7,    26,     0,     0,     9,    27,
-      28,    29,     0,     0,    30,     0,    31,   206,     0,     0,
-      32,    12,     0,     0,     0,    13,    14,    34,    15,    35,
-     204,    16,     0,    17,    36,    37,     0,     0,     0,     0,
-      18,     0,     0,     0,     0,     0,     0,   537,     4,     0,
-      20,     0,    21,    22,    23,     0,     0,     0,    38,     0,
-      25,     0,     0,     0,     0,   533,     0,     0,     0,     0,
-       0,     0,   205,     0,     5,     0,     6,     0,     0,     0,
-       0,     0,     7,    26,     0,     0,     9,    27,    28,    29,
-       0,     0,    30,     0,    31,   206,     0,     0,    32,    12,
-       0,     0,     0,    13,    14,    34,    15,    35,     0,    16,
-       0,    17,    36,    37,     0,     0,     0,     0,    18,     0,
-       0,     0,     0,     0,     0,   552,     4,     0,    20,     0,
-      21,    22,    23,     0,     0,     0,    38,     0,    25,   405,
-     406,   407,   408,   409,   410,   411,   412,   413,     0,     0,
-       0,     0,     5,     0,     6,     0,     0,     0,     0,     0,
-       7,    26,     0,     0,     9,    27,    28,    29,     0,     0,
-      30,     0,    31,     0,     0,     0,    32,    12,     0,     0,
-       0,    13,    14,    34,    15,    35,     0,    16,     0,    17,
-      36,    37,     0,     0,     0,     0,    18,   405,   406,   407,
-     408,   409,   410,   411,   412,   413,    20,     0,    21,    22,
-      23,     0,     0,     0,    38,     0,    25,     0,     0,     0,
-     405,   406,   407,   408,   409,   410,   411,   412,   413,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    26,
-       0,     0,     0,    27,    28,    29,     0,     0,    30,     0,
-      31,     0,     0,     0,    32,     0,     0,     0,     0,     0,
-       0,    34,     0,    35,     0,     0,     0,     0,    36,    37,
-     405,   406,   407,   408,   409,   410,   411,   414,   413,   415,
-     416,   417,   418,   419,   420,   421,   422,   423,   424,     0,
-       0,     0,    38,     0,     0,     0,   425,   426,     0,     0,
-       0,   440,   405,   406,   407,   408,   409,   410,   411,   412,
-     413,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   405,   406,   407,   408,   409,   410,
-     411,   412,   413,     0,     0,   414,     0,   415,   416,   417,
-     418,   419,   420,   421,   422,   423,   424,   405,   406,   407,
-     408,   409,   410,   411,   425,   426,     0,     0,   414,   448,
-     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
-       0,     0,     0,     0,     0,     0,     0,   425,   426,     0,
-       0,     0,   491,   405,   406,   407,   408,   409,   410,   411,
-     412,   413,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   405,   406,   407,   408,   409,   410,   411,     0,     0,
-     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
-     405,   406,   407,   408,   409,   410,   411,   425,   426,     0,
+       0,     0,     0,    26,     0,     0,     0,    27,    28,    29,
+       0,     5,    30,     6,    31,     0,     0,     0,    32,     7,
+       0,     0,     0,     9,    33,    34,     0,    35,    10,     0,
+       0,     0,    36,    37,     0,     0,    12,     0,     0,     0,
+      13,    14,     0,    15,     0,     0,    16,     0,    17,     0,
+       0,     0,     0,     0,     0,    18,    38,     0,     0,     0,
+       0,    19,   368,     0,     0,    20,     0,    21,    22,    23,
+       0,     0,     0,     0,     0,    25,     0,     0,     0,     4,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    26,     0,
+       0,     0,    27,    28,    29,     0,     5,    30,     6,    31,
+       0,     0,     0,    32,     7,     0,     0,     0,     9,    33,
+      34,     0,    35,    10,     0,     0,     0,    36,    37,     0,
+       0,    12,     0,     0,     0,    13,    14,     0,    15,     0,
+       0,    16,     0,    17,     0,     0,     0,     0,     0,     0,
+      18,    38,     0,     0,     0,     0,    19,   468,     0,     0,
+      20,     0,    21,    22,    23,     0,     0,     0,     0,     0,
+      25,     0,     0,   301,     4,   302,   303,   304,   305,   306,
+     307,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    26,     0,     0,     0,    27,    28,    29,
+       0,     5,    30,     6,    31,     0,     0,     0,    32,     7,
+       0,     0,     0,     9,    33,    34,     0,    35,     0,     0,
+       0,     0,    36,    37,     0,     0,    12,     0,     0,     0,
+      13,    14,     0,    15,   308,     0,    16,   301,    17,   302,
+     303,   304,   305,   306,   307,    18,    38,     0,     0,     0,
+       0,     0,   566,     0,     0,    20,     0,    21,    22,    23,
+       0,     0,     0,     0,     0,    25,     0,     0,     0,     0,
+       0,   309,     0,     0,     0,     0,   301,     0,   302,   303,
+     304,   305,   306,   307,     0,     0,     4,     0,    26,     0,
+       0,     0,    27,    28,    29,     0,   310,    30,   308,    31,
+       0,     0,     0,    32,     0,     0,     0,     0,   311,     0,
+      34,     0,    35,     5,     0,     6,     0,    36,    37,     0,
+       0,     7,     0,     0,     0,   312,     0,     0,   313,   314,
+     315,     0,     0,   316,   317,   309,     0,   308,    12,     0,
+       0,     0,    13,    14,   318,     0,     0,     0,    16,     0,
+      17,     0,     0,     0,     0,     0,     0,    18,     0,     0,
+     310,     0,     0,     0,     0,     0,     0,     0,     0,    21,
+      22,    23,   311,     0,   309,     0,     0,    25,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   312,
+       0,     0,   313,   314,   315,     0,     0,   316,   317,   310,
+       0,     0,     0,     0,    27,    28,    29,     0,   318,    30,
+       0,   311,     0,     4,     0,    32,     0,     0,     0,     0,
+       0,   256,    34,     0,    35,     0,     0,     0,   312,    36,
+      37,   313,   314,   375,     0,     0,   316,   317,     0,     0,
+       5,     0,     6,     0,     0,     0,     0,   318,     7,     8,
+       0,     0,     9,     0,     0,     0,     0,    10,     0,     0,
+       0,     0,     0,    11,     0,    12,     0,     0,     0,    13,
+      14,     0,    15,     0,     0,    16,     0,    17,     0,     0,
+       0,     0,     0,     0,    18,     0,     0,     0,     0,     0,
+      19,   257,     0,     0,    20,     0,    21,    22,    23,    24,
+       0,     0,     0,     0,    25,     0,     0,     0,     4,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     414,     0,   415,   416,   417,   418,   419,   420,   421,   422,
-     423,   424,   405,   406,   407,   408,   409,   410,   411,   425,
-     426,   561,   414,   560,   415,   416,   417,   418,   419,   420,
-     421,   422,   423,   424,     0,     0,     0,     0,     0,     0,
-       0,   425,   426,     0,     0,     0,     0,   415,   416,   417,
-     418,   419,   420,   421,   422,   423,   424,     0,     0,     0,
-       0,     0,     0,     0,   425,   426,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    26,     0,     0,
+       0,    27,    28,    29,     0,     5,    30,     6,    31,     0,
+       0,     0,    32,     7,     8,     0,     0,     9,    33,    34,
+       0,    35,    10,     0,     0,     0,    36,    37,    11,     0,
+      12,     0,     0,     0,    13,    14,     0,    15,     0,     0,
+      16,     0,    17,     0,     0,     0,     0,     0,     0,    18,
+      38,     0,     0,     0,     0,    19,     0,     0,     0,    20,
+       0,    21,    22,    23,    24,     0,     0,     0,     0,    25,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   414,     0,   415,   416,   417,   418,   419,   420,   421,
-     422,   423,   424,     0,     0,     0,     0,     0,     0,     0,
-     425,   426,   416,   417,   418,   419,   420,   421,   422,   423,
-     424,     0,     0,     0,     0,     0,     4,     0,   425,   426,
-       0,     0,   417,   418,   419,   420,   421,   422,   423,   424,
-       0,     0,     0,     0,     0,     0,     0,   425,   426,     0,
-       0,     0,     5,     0,     6,     0,     0,     0,     0,     0,
-       7,     8,     0,     0,     9,   418,   419,   420,   421,   422,
-     423,   424,     0,     0,     0,    11,     0,    12,     0,   425,
-     426,    13,    14,     0,    15,     0,     0,    16,     0,    17,
-       0,     0,     0,     0,     0,     0,    18,     0,     0,     0,
-       0,     0,     0,     0,     4,     0,    20,     0,    21,    22,
-      23,    24,     0,     0,   175,     0,    25,     0,   176,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       5,     0,     6,     0,     0,     0,     0,     0,     7,    26,
-       0,     0,     9,    27,    28,    29,     0,     0,    30,     0,
-      31,     0,     0,     0,    32,    12,     0,     0,     0,    13,
-      14,    34,    15,    35,     0,    16,     0,    17,    36,    37,
-       0,     0,     0,     0,    18,     0,     0,     0,     0,     4,
-       0,     0,     0,     0,    20,     0,    21,    22,    23,     0,
-       0,     0,     0,     0,    25,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     5,     0,     6,     0,     0,
-       0,     0,     0,     7,     0,     0,     0,    26,     0,     0,
-       0,    27,    28,    29,     0,     0,    30,     0,    31,     0,
-      12,     0,    32,     0,    13,    14,     0,     0,     0,    34,
-      16,    35,    17,     0,     0,     0,    36,    37,     0,    18,
+       4,     0,    26,     0,     0,     0,    27,    28,    29,     0,
+       0,    30,     0,    31,     0,     0,     0,    32,     0,     0,
+       0,     0,     0,    33,    34,     0,    35,     5,     0,     6,
+       0,    36,    37,     0,   203,     7,     0,     0,     0,     9,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    21,    22,    23,     0,     0,     0,     0,     0,    25,
+       0,     0,    12,     0,     0,    38,    13,    14,     0,    15,
+       0,   204,    16,     0,    17,     0,     0,     0,     0,     0,
+       0,    18,     0,     0,     0,     0,     0,     0,     4,     0,
+       0,    20,     0,    21,    22,    23,     0,     0,     0,     0,
+       0,    25,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   205,     0,     5,     0,     6,     0,     0,
+       0,     0,   203,     7,    26,     0,     0,     9,    27,    28,
+      29,     0,     0,    30,     0,    31,   206,     0,     0,    32,
+      12,     0,     0,     0,    13,    14,    34,    15,    35,   204,
+      16,     0,    17,    36,    37,     0,     0,     0,     0,    18,
+       0,     0,     0,     0,     0,     0,   538,     0,     0,    20,
+       0,    21,    22,    23,     0,     0,     0,    38,     0,    25,
+       0,     0,     0,     4,     0,     0,     0,     0,     0,     0,
+       0,   205,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   534,    26,     0,     0,     0,    27,    28,    29,     0,
+       5,    30,     6,    31,   206,     0,     0,    32,     7,     0,
+       0,     0,     9,     0,    34,     0,    35,     0,     0,     0,
+       0,    36,    37,     0,     0,    12,     0,     0,     0,    13,
+      14,     0,    15,     0,   553,    16,     0,    17,     0,     0,
+       0,     0,     0,     0,    18,    38,     0,     0,     0,     0,
+       0,     4,     0,     0,    20,     0,    21,    22,    23,     0,
+       0,     0,     0,     0,    25,   406,   407,   408,   409,   410,
+     411,   412,   413,   414,     0,     0,     0,     0,     5,     0,
+       6,     0,     0,     0,     0,     0,     7,    26,     0,     0,
+       9,    27,    28,    29,     0,     0,    30,     0,    31,     0,
+       0,     0,    32,    12,     0,     0,     0,    13,    14,    34,
+      15,    35,     0,    16,     0,    17,    36,    37,     0,     0,
+       0,     0,    18,   406,   407,   408,   409,   410,   411,   412,
+     413,   414,    20,     0,    21,    22,    23,     0,     0,     0,
+      38,     0,    25,     0,     0,     0,   406,   407,   408,   409,
+     410,   411,   412,   413,   414,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    26,     0,     0,     0,    27,
+      28,    29,     0,     0,    30,     0,    31,     0,     0,     0,
+      32,     0,     0,     0,     0,     0,     0,    34,     0,    35,
+       0,     0,     0,     0,    36,    37,   406,   407,   408,   409,
+     410,   411,   412,   415,   414,   416,   417,   418,   419,   420,
+     421,   422,   423,   424,   425,     0,     0,     0,    38,     0,
+       0,     0,   426,   427,     0,     0,     0,   441,   406,   407,
+     408,   409,   410,   411,   412,   413,   414,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     406,   407,   408,   409,   410,   411,   412,   413,   414,     0,
+       0,   415,     0,   416,   417,   418,   419,   420,   421,   422,
+     423,   424,   425,   406,   407,   408,   409,   410,   411,   412,
+     426,   427,     0,     0,   415,   449,   416,   417,   418,   419,
+     420,   421,   422,   423,   424,   425,     0,     0,     0,     0,
+       0,     0,     0,   426,   427,     0,     0,     0,   492,   406,
+     407,   408,   409,   410,   411,   412,   413,   414,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   406,   407,   408,
+     409,   410,   411,   412,     0,     0,   416,   417,   418,   419,
+     420,   421,   422,   423,   424,   425,   406,   407,   408,   409,
+     410,   411,   412,   426,   427,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   415,     0,   416,   417,
+     418,   419,   420,   421,   422,   423,   424,   425,   406,   407,
+     408,   409,   410,   411,   412,   426,   427,   562,   415,   561,
+     416,   417,   418,   419,   420,   421,   422,   423,   424,   425,
+       0,     0,     0,     0,     0,     0,     0,   426,   427,     0,
+       0,     0,     0,   416,   417,   418,   419,   420,   421,   422,
+     423,   424,   425,     0,     0,     0,     0,     0,     0,     0,
+     426,   427,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   415,     0,   416,
+     417,   418,   419,   420,   421,   422,   423,   424,   425,     0,
+       0,     0,     0,     0,     0,     0,   426,   427,   417,   418,
+     419,   420,   421,   422,   423,   424,   425,     0,     0,     0,
+       0,     4,     0,     0,   426,   427,     0,     0,   418,   419,
+     420,   421,   422,   423,   424,   425,     0,     0,     0,     0,
+       0,     0,     0,   426,   427,     0,     0,     0,     5,     0,
+       6,     0,     0,     0,     0,     0,     7,     8,     0,     0,
+       9,   419,   420,   421,   422,   423,   424,   425,     0,     0,
+       0,    11,     0,    12,     0,   426,   427,    13,    14,     0,
+      15,     0,     0,    16,     0,    17,     0,     0,     0,     0,
+       0,     0,    18,     0,     0,     0,     0,     0,     0,     4,
+       0,     0,    20,     0,    21,    22,    23,    24,     0,     0,
+     175,     0,    25,     0,   176,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     5,     0,     6,     0,
+       0,     0,     0,     0,     7,    26,     0,     0,     9,    27,
+      28,    29,     0,     0,    30,     0,    31,     0,     0,     0,
+      32,    12,     0,     0,     0,    13,    14,    34,    15,    35,
+       0,    16,     0,    17,    36,    37,     0,     0,     0,     0,
+      18,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      20,     0,    21,    22,    23,     0,     0,     0,     0,     0,
+      25,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    27,    28,    29,     0,
-       0,    30,     0,     0,     0,     0,    96,    32,    97,    98,
-      99,     0,   100,   101,    34,   102,    35,     0,   103,     0,
-     104,    36,    37,     0,     0,     0,     0,   105,   106,   107,
-     108,     0,   109,   110,   111,   112,   113,     0,   114,     0,
-     115,   116,   117,     0,     0,   118,     0,     0,     0,     0,
-     119,     0,   120,   121,   122,   123,   124,   125,     0,   126,
-     127,   128,   129,   130,     0,     0,   131,     0,     0,   132,
-       0,     0,     0,     0,   133,   134,     0,   135,     0,     0,
-       0,   136,   137,   138,     0,   139,   140,   141,   142,   143,
-       0,   144,     0,   145,   146,   147,   148,   149,   150,   151,
-     152,     0,   153,   154,   155,     0,     0,     0,   156,     0,
-       0,   157,     0,     0,   158,   159,     0,     0,   160,   161,
-     162,     0,     0,     0,   163,     0,   164,   165,   166,   167,
-       0,     0,   168
+       0,     0,     0,    26,     0,     0,     0,    27,    28,    29,
+       0,     0,    30,     0,    31,     0,     0,    96,    32,    97,
+      98,    99,     0,   100,   101,    34,   102,    35,     0,   103,
+       0,   104,    36,    37,     0,     0,     0,     0,   105,   106,
+     107,   108,     0,   109,   110,   111,   112,   113,     0,   114,
+       0,   115,   116,   117,     0,     0,   118,     0,     0,     0,
+       0,   119,     0,   120,   121,   122,   123,   124,   125,     0,
+     126,   127,   128,   129,   130,     0,     0,   131,     0,     0,
+     132,     0,     0,     0,     0,   133,   134,     0,   135,     0,
+       0,     0,   136,   137,   138,     0,   139,   140,   141,   142,
+     143,     0,   144,     0,   145,   146,   147,   148,   149,   150,
+     151,   152,     0,   153,   154,   155,     0,     0,     0,   156,
+       0,     0,   157,     0,     0,   158,   159,     0,     0,   160,
+     161,   162,     0,     0,     0,   163,     0,   164,   165,   166,
+     167,     0,     0,   168
 };
 
 static const yytype_int16 yycheck[] =
 {
-       2,     2,     2,    66,     2,    46,   234,   278,     2,   266,
-     254,   235,     2,   484,   238,   280,   240,   473,    67,   243,
-     212,   477,   246,   284,   149,   170,    66,    33,   208,   209,
-      95,   176,    14,    46,   133,     3,     4,    86,     0,   149,
-     149,    63,    64,    65,   133,   225,    46,    69,    46,   174,
-      91,   490,    46,     2,    53,   283,   495,    64,    65,    36,
-       3,     4,    69,   474,   174,   174,   475,     3,     4,    37,
-     149,    48,   231,    42,    42,   234,   175,   149,     3,     4,
-     536,   492,   241,   539,   493,   244,   175,   173,   247,   248,
-      89,   112,   171,    62,    37,   116,    64,    46,   554,   356,
-     280,    37,   174,   574,   149,   170,    42,   274,   352,     8,
-     367,   567,   551,    89,    86,    84,   170,     3,     4,   140,
-     183,    64,   176,   579,   283,   284,   537,   172,    64,    29,
-     297,   298,   108,   542,   170,    35,   170,     8,   106,    10,
-     176,   552,   176,   183,   170,   208,   209,   173,   117,   558,
-     173,    37,   311,   312,   313,   314,   315,   316,   317,   128,
-     384,   129,   225,   106,    12,    13,    14,   170,   208,   209,
-     106,   173,   174,   173,   174,   173,   174,   190,    64,   173,
-     174,   221,   443,   173,   174,   225,   129,   169,   170,   229,
-     170,   159,   172,   129,   216,   466,    32,   172,    34,   176,
-     249,   250,   170,   427,   253,   173,   172,    14,   388,   216,
-     467,   170,   404,   151,   173,   374,   159,   280,   170,   172,
-     106,   173,   446,   159,   172,    25,     8,   170,    28,   175,
-     173,     3,     4,    12,    13,    14,   175,   173,    17,    18,
-     280,     3,     4,   129,   285,   172,   405,   406,    14,   408,
-     409,   410,   411,   412,   413,   414,   415,   416,   417,   418,
-     419,   420,   421,   422,   423,   424,   272,   426,     3,     4,
-     527,   536,   175,   159,     3,     4,   317,   279,   172,   279,
-     460,   279,   172,   285,   443,   279,   551,   173,   294,   481,
-       3,     4,    37,     3,     4,   172,   298,    42,   490,     3,
-       4,   175,   567,   495,    37,   172,   498,   172,   565,   157,
-     158,   159,   160,   161,   579,     3,     4,   175,   172,    64,
-     361,   169,   170,   175,   173,   388,   173,   173,   369,   173,
-     173,    64,   173,   173,   173,   173,   173,     3,   173,   380,
-     173,   404,   173,   383,   572,   386,   173,   173,   388,   529,
-     157,   158,   159,   160,   161,   396,   357,   363,   173,   551,
-     173,   106,   169,   170,   366,   173,   366,   173,   366,   369,
-     594,   369,   366,   106,   173,   369,   155,   156,   157,   158,
-     159,   160,   161,   173,   129,   173,   386,   173,   173,   173,
-     169,   170,   173,   159,   160,   161,   129,   460,   557,   175,
-     175,   560,   172,   169,   170,   172,   177,   172,     8,     8,
-     174,   174,   475,   572,   159,   173,    67,     8,     8,     8,
-     460,     8,   463,     5,   170,   170,   159,   490,   173,     4,
-     493,   472,   495,   173,   475,   172,   151,   170,   172,   175,
-     173,   149,   174,   149,   174,   176,    38,   487,   174,   177,
-     173,     3,   493,   174,   174,    30,   174,    32,   174,   149,
-     174,     8,   174,    38,    39,   174,   529,    42,   169,   174,
-     472,   174,    47,   475,   174,   174,   174,   174,    53,   174,
-      55,   174,    74,   174,    59,    60,   151,    62,   551,   529,
-      65,   493,    67,   172,    86,    87,    88,    80,   176,    74,
-     171,   542,    94,   149,   174,    80,    81,   174,   172,    84,
-     172,    86,    87,    88,    89,     3,     3,   558,     8,    94,
-     174,     5,   174,   172,     4,   172,   174,   151,   151,   531,
-     122,   531,   174,   531,   126,   174,   174,   531,   175,   174,
-     542,   174,   117,   174,   174,   174,   121,   122,   123,   151,
-      30,   126,    32,   128,   172,    44,   558,   132,    38,     2,
-     365,   472,    42,   138,   139,   383,   141,    47,   600,     2,
-     247,   146,   147,    46,     2,    55,     2,   574,   183,    59,
-      60,    -1,    62,    -1,   245,    65,    -1,    67,    -1,    -1,
-      -1,    -1,    -1,    -1,    74,   170,    -1,    -1,    -1,    -1,
-      80,   176,    -1,    -1,    84,    -1,    86,    87,    88,    -1,
-      -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,     4,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,    -1,    -1,
-      -1,   121,   122,   123,    -1,    30,   126,    32,   128,    -1,
-      -1,    -1,   132,    38,    -1,    -1,    -1,    42,   138,   139,
-      -1,   141,    47,    -1,    -1,    -1,   146,   147,    -1,    -1,
-      55,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,    -1,
-      65,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
-     170,    -1,    -1,    -1,    -1,    80,   176,    -1,    -1,    84,
-      -1,    86,    87,    88,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    -1,     4,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   117,    -1,    -1,    -1,   121,   122,   123,    -1,
-      30,   126,    32,   128,    -1,    -1,    -1,   132,    38,    -1,
-      -1,    -1,    42,   138,   139,    -1,   141,    47,    -1,    -1,
-      -1,   146,   147,    -1,    -1,    55,    -1,    -1,    -1,    59,
-      60,    -1,    62,    -1,    -1,    65,    -1,    67,    -1,    -1,
-      -1,    -1,    -1,    -1,    74,   170,    -1,    -1,    -1,    -1,
-      80,   176,    -1,    -1,    84,    -1,    86,    87,    88,    -1,
-      -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,     3,     4,
-       5,     6,     7,     8,     9,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,    -1,    -1,
-      -1,   121,   122,   123,    -1,    30,   126,    32,   128,    -1,
-      -1,    -1,   132,    38,    -1,    -1,    -1,    42,   138,   139,
-      -1,   141,    -1,    -1,    -1,    -1,   146,   147,    -1,    -1,
-      55,    -1,    -1,    -1,    59,    60,    -1,    62,    63,    -1,
-      65,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
-     170,    -1,    -1,    -1,    -1,    -1,   176,    -1,    -1,    84,
-      -1,    86,    87,    88,    -1,    -1,    -1,    -1,     3,    94,
-       5,     6,     7,     8,     9,   100,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   117,    -1,    -1,    -1,   121,   122,   123,    -1,
-     125,   126,    -1,   128,    -1,    -1,    -1,   132,    -1,    -1,
-      -1,    -1,   137,    -1,   139,    -1,   141,    -1,    -1,    -1,
-      -1,   146,   147,    -1,    -1,    -1,    -1,    -1,    63,   154,
-      -1,    -1,   157,   158,   159,    -1,    -1,   162,   163,    -1,
-       3,    -1,     5,     6,     7,     8,     9,     3,   173,     5,
-       6,     7,     8,     9,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   100,    -1,    -1,    -1,    -1,
+       2,    66,     2,    66,     2,     2,    46,   234,     2,   266,
+     212,   235,    33,    67,   238,   280,   240,   208,   209,   243,
+     278,     2,   246,    46,   284,   254,    15,   485,    37,    43,
+       2,   134,    86,   134,   225,   474,    63,    64,    65,   478,
+      49,   113,    69,     3,     4,   117,    46,   476,    46,    63,
+     231,    91,    46,   234,    64,    65,   283,   150,     0,    69,
+     241,    54,   475,   244,    96,   494,   247,   248,   274,   141,
+     150,    85,   174,   176,    46,   176,   150,   491,    38,   172,
+     493,   150,   496,    43,   171,    38,    87,   174,   150,   280,
+      43,   297,   298,     3,     4,   175,     8,    90,   537,   173,
+     357,   540,   283,   284,   118,    65,   175,   174,    13,    14,
+      15,   368,    65,   175,   543,   129,   555,   575,   183,     8,
+     183,   171,    11,    90,   353,   538,   150,   177,    38,   568,
+     559,   312,   313,   314,   315,   316,   317,   318,   552,   171,
+     553,   580,   109,   208,   209,   208,   209,   107,     3,     4,
+      29,   175,   171,   171,   107,    65,    35,   173,   221,   177,
+     225,   385,   225,   171,     3,     4,   229,   190,   177,   177,
+     130,   173,   174,   173,   174,   173,   174,   130,   173,   173,
+     174,   170,   171,    38,   444,   171,   173,   171,    43,   216,
+     174,   177,   173,   174,   375,   249,   250,   107,   389,   253,
+     160,   176,   171,   405,   428,   174,   216,   160,    15,   467,
+      65,   468,   173,    25,   174,   280,    28,   280,   171,   173,
+     130,   174,   171,   447,   173,   406,   407,   173,   409,   410,
+     411,   412,   413,   414,   415,   416,   417,   418,   419,   420,
+     421,   422,   423,   424,   425,   285,   427,    32,   176,    34,
+     160,   272,   107,   158,   159,   160,   161,   162,    15,     3,
+       4,   171,   173,   444,   174,   170,   171,     3,     4,   152,
+     461,   528,   537,   294,   176,   130,   173,   279,   318,   279,
+     482,   279,   173,   285,     8,   279,   173,   552,   176,   491,
+       3,     4,     3,     4,   496,   176,   298,   499,     3,     4,
+       3,     4,   173,   568,   176,   160,     3,     4,   174,   566,
+       3,     4,     3,     4,   174,   580,   171,    38,   174,   174,
+     174,   384,   362,   174,   389,    38,   389,   174,   174,     3,
+     370,     5,     6,     7,     8,     9,    10,   174,   174,   530,
+     405,   381,   174,   364,    65,   174,   573,   387,   174,   174,
+     552,   174,    65,   160,   161,   162,   174,   397,   174,   174,
+     174,   358,     3,   170,   171,   367,   174,   367,   174,   367,
+     370,   595,   370,   367,   174,   174,   370,   558,   174,   174,
+     561,   174,   174,   173,   173,   176,   107,   387,   176,   173,
+      64,   178,   573,   175,   107,   175,   461,   174,   461,     8,
+       8,   158,   159,   160,   161,   162,     8,     8,     8,   130,
+       8,   476,    68,   170,   171,     5,   171,   130,   174,   173,
+     152,   173,   150,   176,   464,   488,   491,   101,   175,   494,
+     178,   496,   177,   473,   150,   175,   476,   175,   175,   160,
+     174,     3,   175,   150,   175,   175,   175,   160,   175,   175,
+     171,     8,   126,   174,   494,   175,   175,    13,    14,    15,
+     175,   174,    18,    19,   138,   530,   175,   530,   152,   175,
+      81,   473,   170,   175,   476,   175,   175,   150,   173,   175,
+     172,   155,     3,   177,   158,   159,   160,   552,   175,   163,
+     164,     3,   494,   175,   173,   173,     5,     8,   172,   175,
+     174,   173,   173,   543,     4,   175,   175,   175,   175,   175,
+     152,   176,   175,   175,   175,   175,   175,   152,   152,   559,
+     173,    44,   366,    39,     2,   473,   384,     2,   601,   247,
+     532,    31,   532,    33,   532,     2,    46,     2,   532,    39,
+      40,   543,   575,    43,   183,    -1,    -1,    -1,    48,    -1,
+      -1,    -1,    -1,    -1,    54,   245,    56,   559,    -1,    75,
+      60,    61,    -1,    63,    -1,    -1,    66,    -1,    68,    -1,
+      -1,    87,    88,    89,    -1,    75,    -1,    -1,    -1,    95,
+      -1,    81,    82,    -1,    -1,    85,    -1,    87,    88,    89,
+      90,    -1,    -1,    -1,    -1,    95,    -1,    -1,    -1,     4,
+     156,   157,   158,   159,   160,   161,   162,   123,    -1,    -1,
+      -1,   127,    -1,    -1,   170,   171,    -1,    -1,   118,    -1,
+      -1,    -1,   122,   123,   124,    -1,    31,   127,    33,   129,
+      -1,    -1,    -1,   133,    39,    -1,    -1,    -1,    43,   139,
+     140,    -1,   142,    48,    -1,    -1,    -1,   147,   148,    -1,
+      -1,    56,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,
+      -1,    66,    -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,
+      75,   171,    -1,    -1,    -1,    -1,    81,   177,    -1,    -1,
+      85,    -1,    87,    88,    89,    -1,    -1,    -1,    -1,    -1,
+      95,    -1,    -1,    -1,     4,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   118,    -1,    -1,    -1,   122,   123,   124,
+      -1,    31,   127,    33,   129,    -1,    -1,    -1,   133,    39,
+      -1,    -1,    -1,    43,   139,   140,    -1,   142,    48,    -1,
+      -1,    -1,   147,   148,    -1,    -1,    56,    -1,    -1,    -1,
+      60,    61,    -1,    63,    -1,    -1,    66,    -1,    68,    -1,
+      -1,    -1,    -1,    -1,    -1,    75,   171,    -1,    -1,    -1,
+      -1,    81,   177,    -1,    -1,    85,    -1,    87,    88,    89,
+      -1,    -1,    -1,    -1,    -1,    95,    -1,    -1,    -1,     4,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     125,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      63,    -1,   137,    -1,    -1,    -1,    -1,    63,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   154,
-      -1,    -1,   157,   158,   159,    -1,    -1,   162,   163,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   171,   100,   173,    -1,
-      -1,    -1,    -1,    -1,   100,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,    -1,
+      -1,    -1,   122,   123,   124,    -1,    31,   127,    33,   129,
+      -1,    -1,    -1,   133,    39,    -1,    -1,    -1,    43,   139,
+     140,    -1,   142,    48,    -1,    -1,    -1,   147,   148,    -1,
+      -1,    56,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,
+      -1,    66,    -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,
+      75,   171,    -1,    -1,    -1,    -1,    81,   177,    -1,    -1,
+      85,    -1,    87,    88,    89,    -1,    -1,    -1,    -1,    -1,
+      95,    -1,    -1,     3,     4,     5,     6,     7,     8,     9,
+      10,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   118,    -1,    -1,    -1,   122,   123,   124,
+      -1,    31,   127,    33,   129,    -1,    -1,    -1,   133,    39,
+      -1,    -1,    -1,    43,   139,   140,    -1,   142,    -1,    -1,
+      -1,    -1,   147,   148,    -1,    -1,    56,    -1,    -1,    -1,
+      60,    61,    -1,    63,    64,    -1,    66,     3,    68,     5,
+       6,     7,     8,     9,    10,    75,   171,    -1,    -1,    -1,
+      -1,    -1,   177,    -1,    -1,    85,    -1,    87,    88,    89,
+      -1,    -1,    -1,    -1,    -1,    95,    -1,    -1,    -1,    -1,
+      -1,   101,    -1,    -1,    -1,    -1,     3,    -1,     5,     6,
+       7,     8,     9,    10,    -1,    -1,     4,    -1,   118,    -1,
+      -1,    -1,   122,   123,   124,    -1,   126,   127,    64,   129,
+      -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,   138,    -1,
+     140,    -1,   142,    31,    -1,    33,    -1,   147,   148,    -1,
+      -1,    39,    -1,    -1,    -1,   155,    -1,    -1,   158,   159,
+     160,    -1,    -1,   163,   164,   101,    -1,    64,    56,    -1,
+      -1,    -1,    60,    61,   174,    -1,    -1,    -1,    66,    -1,
+      68,    -1,    -1,    -1,    -1,    -1,    -1,    75,    -1,    -1,
+     126,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    87,
+      88,    89,   138,    -1,   101,    -1,    -1,    95,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   155,
+      -1,    -1,   158,   159,   160,    -1,    -1,   163,   164,   126,
+      -1,    -1,    -1,    -1,   122,   123,   124,    -1,   174,   127,
+      -1,   138,    -1,     4,    -1,   133,    -1,    -1,    -1,    -1,
+      -1,    12,   140,    -1,   142,    -1,    -1,    -1,   155,   147,
+     148,   158,   159,   160,    -1,    -1,   163,   164,    -1,    -1,
+      31,    -1,    33,    -1,    -1,    -1,    -1,   174,    39,    40,
+      -1,    -1,    43,    -1,    -1,    -1,    -1,    48,    -1,    -1,
+      -1,    -1,    -1,    54,    -1,    56,    -1,    -1,    -1,    60,
+      61,    -1,    63,    -1,    -1,    66,    -1,    68,    -1,    -1,
+      -1,    -1,    -1,    -1,    75,    -1,    -1,    -1,    -1,    -1,
+      81,    82,    -1,    -1,    85,    -1,    87,    88,    89,    90,
+      -1,    -1,    -1,    -1,    95,    -1,    -1,    -1,     4,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   125,    -1,    -1,    -1,    -1,    -1,    -1,   125,
-      -1,    -1,    -1,    -1,   137,    -1,    -1,    -1,    -1,    -1,
-      -1,   137,    -1,    -1,    -1,     4,    -1,    -1,    -1,    -1,
-      -1,   154,    11,    -1,   157,   158,   159,    -1,   154,   162,
-     163,   157,   158,   159,    -1,    -1,   162,   163,    -1,    -1,
-     173,    30,    -1,    32,    -1,    -1,    -1,   173,    -1,    38,
-      39,    -1,    -1,    42,    -1,    -1,    -1,    -1,    47,    -1,
-      -1,    -1,    -1,    -1,    53,    -1,    55,    -1,    -1,    -1,
-      59,    60,    -1,    62,    -1,    -1,    65,    -1,    67,    -1,
-      -1,    -1,    -1,    -1,    -1,    74,    -1,    -1,    -1,    -1,
-      -1,    80,    81,    -1,    -1,    84,    -1,    86,    87,    88,
-      89,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,
-       4,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,    -1,
-      -1,    -1,   121,   122,   123,    -1,    30,   126,    32,   128,
-      -1,    -1,    -1,   132,    38,    39,    -1,    -1,    42,   138,
-     139,    -1,   141,    47,    -1,    -1,    -1,   146,   147,    53,
-      -1,    55,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,
-      -1,    65,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
-      74,   170,    -1,    -1,    -1,    -1,    80,    -1,    -1,    -1,
-      84,    -1,    86,    87,    88,    89,    -1,    -1,    -1,    -1,
-      94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,    -1,    -1,
+      -1,   122,   123,   124,    -1,    31,   127,    33,   129,    -1,
+      -1,    -1,   133,    39,    40,    -1,    -1,    43,   139,   140,
+      -1,   142,    48,    -1,    -1,    -1,   147,   148,    54,    -1,
+      56,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,    -1,
+      66,    -1,    68,    -1,    -1,    -1,    -1,    -1,    -1,    75,
+     171,    -1,    -1,    -1,    -1,    81,    -1,    -1,    -1,    85,
+      -1,    87,    88,    89,    90,    -1,    -1,    -1,    -1,    95,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,     4,   117,    -1,    -1,    -1,   121,   122,   123,
-      -1,    -1,   126,    -1,   128,    -1,    -1,    -1,   132,    -1,
-      -1,    -1,    -1,    -1,   138,   139,    -1,   141,    30,    -1,
-      32,    -1,   146,   147,    -1,    37,    38,    -1,    -1,    -1,
-      42,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    55,    -1,    -1,   170,    59,    60,    -1,
-      62,    -1,    64,    65,    -1,    67,    -1,    -1,    -1,    -1,
-      -1,    -1,    74,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-       4,    -1,    84,    -1,    86,    87,    88,    -1,    -1,    -1,
-      -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   106,    -1,    30,    -1,    32,    -1,
-      -1,    -1,    -1,    37,    38,   117,    -1,    -1,    42,   121,
-     122,   123,    -1,    -1,   126,    -1,   128,   129,    -1,    -1,
-     132,    55,    -1,    -1,    -1,    59,    60,   139,    62,   141,
-      64,    65,    -1,    67,   146,   147,    -1,    -1,    -1,    -1,
-      74,    -1,    -1,    -1,    -1,    -1,    -1,   159,     4,    -1,
-      84,    -1,    86,    87,    88,    -1,    -1,    -1,   170,    -1,
-      94,    -1,    -1,    -1,    -1,    21,    -1,    -1,    -1,    -1,
-      -1,    -1,   106,    -1,    30,    -1,    32,    -1,    -1,    -1,
-      -1,    -1,    38,   117,    -1,    -1,    42,   121,   122,   123,
-      -1,    -1,   126,    -1,   128,   129,    -1,    -1,   132,    55,
-      -1,    -1,    -1,    59,    60,   139,    62,   141,    -1,    65,
-      -1,    67,   146,   147,    -1,    -1,    -1,    -1,    74,    -1,
-      -1,    -1,    -1,    -1,    -1,   159,     4,    -1,    84,    -1,
-      86,    87,    88,    -1,    -1,    -1,   170,    -1,    94,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    -1,    -1,
-      -1,    -1,    30,    -1,    32,    -1,    -1,    -1,    -1,    -1,
-      38,   117,    -1,    -1,    42,   121,   122,   123,    -1,    -1,
-     126,    -1,   128,    -1,    -1,    -1,   132,    55,    -1,    -1,
-      -1,    59,    60,   139,    62,   141,    -1,    65,    -1,    67,
-     146,   147,    -1,    -1,    -1,    -1,    74,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    84,    -1,    86,    87,
-      88,    -1,    -1,    -1,   170,    -1,    94,    -1,    -1,    -1,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,
-      -1,    -1,    -1,   121,   122,   123,    -1,    -1,   126,    -1,
-     128,    -1,    -1,    -1,   132,    -1,    -1,    -1,    -1,    -1,
-      -1,   139,    -1,   141,    -1,    -1,    -1,    -1,   146,   147,
-      12,    13,    14,    15,    16,    17,    18,   150,    20,   152,
-     153,   154,   155,   156,   157,   158,   159,   160,   161,    -1,
-      -1,    -1,   170,    -1,    -1,    -1,   169,   170,    -1,    -1,
-      -1,   174,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    -1,    -1,   150,    -1,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,    12,    13,    14,
-      15,    16,    17,    18,   169,   170,    -1,    -1,   150,   174,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   169,   170,    -1,
-      -1,    -1,   174,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    12,    13,    14,    15,    16,    17,    18,    -1,    -1,
-     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
-      12,    13,    14,    15,    16,    17,    18,   169,   170,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     150,    -1,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,    12,    13,    14,    15,    16,    17,    18,   169,
-     170,   171,   150,   151,   152,   153,   154,   155,   156,   157,
-     158,   159,   160,   161,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   169,   170,    -1,    -1,    -1,    -1,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   169,   170,    -1,    -1,    -1,    -1,
+       4,    -1,   118,    -1,    -1,    -1,   122,   123,   124,    -1,
+      -1,   127,    -1,   129,    -1,    -1,    -1,   133,    -1,    -1,
+      -1,    -1,    -1,   139,   140,    -1,   142,    31,    -1,    33,
+      -1,   147,   148,    -1,    38,    39,    -1,    -1,    -1,    43,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   150,    -1,   152,   153,   154,   155,   156,   157,   158,
-     159,   160,   161,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     169,   170,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,    -1,    -1,    -1,    -1,    -1,     4,    -1,   169,   170,
-      -1,    -1,   154,   155,   156,   157,   158,   159,   160,   161,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   169,   170,    -1,
-      -1,    -1,    30,    -1,    32,    -1,    -1,    -1,    -1,    -1,
-      38,    39,    -1,    -1,    42,   155,   156,   157,   158,   159,
-     160,   161,    -1,    -1,    -1,    53,    -1,    55,    -1,   169,
-     170,    59,    60,    -1,    62,    -1,    -1,    65,    -1,    67,
-      -1,    -1,    -1,    -1,    -1,    -1,    74,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,     4,    -1,    84,    -1,    86,    87,
-      88,    89,    -1,    -1,    92,    -1,    94,    -1,    96,    -1,
+      -1,    -1,    56,    -1,    -1,   171,    60,    61,    -1,    63,
+      -1,    65,    66,    -1,    68,    -1,    -1,    -1,    -1,    -1,
+      -1,    75,    -1,    -1,    -1,    -1,    -1,    -1,     4,    -1,
+      -1,    85,    -1,    87,    88,    89,    -1,    -1,    -1,    -1,
+      -1,    95,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   107,    -1,    31,    -1,    33,    -1,    -1,
+      -1,    -1,    38,    39,   118,    -1,    -1,    43,   122,   123,
+     124,    -1,    -1,   127,    -1,   129,   130,    -1,    -1,   133,
+      56,    -1,    -1,    -1,    60,    61,   140,    63,   142,    65,
+      66,    -1,    68,   147,   148,    -1,    -1,    -1,    -1,    75,
+      -1,    -1,    -1,    -1,    -1,    -1,   160,    -1,    -1,    85,
+      -1,    87,    88,    89,    -1,    -1,    -1,   171,    -1,    95,
+      -1,    -1,    -1,     4,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   107,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    22,   118,    -1,    -1,    -1,   122,   123,   124,    -1,
+      31,   127,    33,   129,   130,    -1,    -1,   133,    39,    -1,
+      -1,    -1,    43,    -1,   140,    -1,   142,    -1,    -1,    -1,
+      -1,   147,   148,    -1,    -1,    56,    -1,    -1,    -1,    60,
+      61,    -1,    63,    -1,   160,    66,    -1,    68,    -1,    -1,
+      -1,    -1,    -1,    -1,    75,   171,    -1,    -1,    -1,    -1,
+      -1,     4,    -1,    -1,    85,    -1,    87,    88,    89,    -1,
+      -1,    -1,    -1,    -1,    95,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    -1,    -1,    -1,    -1,    31,    -1,
+      33,    -1,    -1,    -1,    -1,    -1,    39,   118,    -1,    -1,
+      43,   122,   123,   124,    -1,    -1,   127,    -1,   129,    -1,
+      -1,    -1,   133,    56,    -1,    -1,    -1,    60,    61,   140,
+      63,   142,    -1,    66,    -1,    68,   147,   148,    -1,    -1,
+      -1,    -1,    75,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    85,    -1,    87,    88,    89,    -1,    -1,    -1,
+     171,    -1,    95,    -1,    -1,    -1,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   118,    -1,    -1,    -1,   122,
+     123,   124,    -1,    -1,   127,    -1,   129,    -1,    -1,    -1,
+     133,    -1,    -1,    -1,    -1,    -1,    -1,   140,    -1,   142,
+      -1,    -1,    -1,    -1,   147,   148,    13,    14,    15,    16,
+      17,    18,    19,   151,    21,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,    -1,    -1,    -1,   171,    -1,
+      -1,    -1,   170,   171,    -1,    -1,    -1,   175,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      30,    -1,    32,    -1,    -1,    -1,    -1,    -1,    38,   117,
-      -1,    -1,    42,   121,   122,   123,    -1,    -1,   126,    -1,
-     128,    -1,    -1,    -1,   132,    55,    -1,    -1,    -1,    59,
-      60,   139,    62,   141,    -1,    65,    -1,    67,   146,   147,
-      -1,    -1,    -1,    -1,    74,    -1,    -1,    -1,    -1,     4,
-      -1,    -1,    -1,    -1,    84,    -1,    86,    87,    88,    -1,
-      -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    30,    -1,    32,    -1,    -1,
-      -1,    -1,    -1,    38,    -1,    -1,    -1,   117,    -1,    -1,
-      -1,   121,   122,   123,    -1,    -1,   126,    -1,   128,    -1,
-      55,    -1,   132,    -1,    59,    60,    -1,    -1,    -1,   139,
-      65,   141,    67,    -1,    -1,    -1,   146,   147,    -1,    74,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    -1,
+      -1,   151,    -1,   153,   154,   155,   156,   157,   158,   159,
+     160,   161,   162,    13,    14,    15,    16,    17,    18,    19,
+     170,   171,    -1,    -1,   151,   175,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   170,   171,    -1,    -1,    -1,   175,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    13,    14,    15,
+      16,    17,    18,    19,    -1,    -1,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,    13,    14,    15,    16,
+      17,    18,    19,   170,   171,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   151,    -1,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,    13,    14,
+      15,    16,    17,    18,    19,   170,   171,   172,   151,   152,
+     153,   154,   155,   156,   157,   158,   159,   160,   161,   162,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   170,   171,    -1,
+      -1,    -1,    -1,   153,   154,   155,   156,   157,   158,   159,
+     160,   161,   162,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     170,   171,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   151,    -1,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   170,   171,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,    -1,    -1,    -1,
+      -1,     4,    -1,    -1,   170,   171,    -1,    -1,   155,   156,
+     157,   158,   159,   160,   161,   162,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   170,   171,    -1,    -1,    -1,    31,    -1,
+      33,    -1,    -1,    -1,    -1,    -1,    39,    40,    -1,    -1,
+      43,   156,   157,   158,   159,   160,   161,   162,    -1,    -1,
+      -1,    54,    -1,    56,    -1,   170,   171,    60,    61,    -1,
+      63,    -1,    -1,    66,    -1,    68,    -1,    -1,    -1,    -1,
+      -1,    -1,    75,    -1,    -1,    -1,    -1,    -1,    -1,     4,
+      -1,    -1,    85,    -1,    87,    88,    89,    90,    -1,    -1,
+      93,    -1,    95,    -1,    97,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    31,    -1,    33,    -1,
+      -1,    -1,    -1,    -1,    39,   118,    -1,    -1,    43,   122,
+     123,   124,    -1,    -1,   127,    -1,   129,    -1,    -1,    -1,
+     133,    56,    -1,    -1,    -1,    60,    61,   140,    63,   142,
+      -1,    66,    -1,    68,   147,   148,    -1,    -1,    -1,    -1,
+      75,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      85,    -1,    87,    88,    89,    -1,    -1,    -1,    -1,    -1,
+      95,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    86,    87,    88,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   121,   122,   123,    -1,
-      -1,   126,    -1,    -1,    -1,    -1,    22,   132,    24,    25,
-      26,    -1,    28,    29,   139,    31,   141,    -1,    34,    -1,
-      36,   146,   147,    -1,    -1,    -1,    -1,    43,    44,    45,
-      46,    -1,    48,    49,    50,    51,    52,    -1,    54,    -1,
-      56,    57,    58,    -1,    -1,    61,    -1,    -1,    -1,    -1,
-      66,    -1,    68,    69,    70,    71,    72,    73,    -1,    75,
-      76,    77,    78,    79,    -1,    -1,    82,    -1,    -1,    85,
-      -1,    -1,    -1,    -1,    90,    91,    -1,    93,    -1,    -1,
-      -1,    97,    98,    99,    -1,   101,   102,   103,   104,   105,
-      -1,   107,    -1,   109,   110,   111,   112,   113,   114,   115,
-     116,    -1,   118,   119,   120,    -1,    -1,    -1,   124,    -1,
-      -1,   127,    -1,    -1,   130,   131,    -1,    -1,   134,   135,
-     136,    -1,    -1,    -1,   140,    -1,   142,   143,   144,   145,
-      -1,    -1,   148
+      -1,    -1,    -1,   118,    -1,    -1,    -1,   122,   123,   124,
+      -1,    -1,   127,    -1,   129,    -1,    -1,    23,   133,    25,
+      26,    27,    -1,    29,    30,   140,    32,   142,    -1,    35,
+      -1,    37,   147,   148,    -1,    -1,    -1,    -1,    44,    45,
+      46,    47,    -1,    49,    50,    51,    52,    53,    -1,    55,
+      -1,    57,    58,    59,    -1,    -1,    62,    -1,    -1,    -1,
+      -1,    67,    -1,    69,    70,    71,    72,    73,    74,    -1,
+      76,    77,    78,    79,    80,    -1,    -1,    83,    -1,    -1,
+      86,    -1,    -1,    -1,    -1,    91,    92,    -1,    94,    -1,
+      -1,    -1,    98,    99,   100,    -1,   102,   103,   104,   105,
+     106,    -1,   108,    -1,   110,   111,   112,   113,   114,   115,
+     116,   117,    -1,   119,   120,   121,    -1,    -1,    -1,   125,
+      -1,    -1,   128,    -1,    -1,   131,   132,    -1,    -1,   135,
+     136,   137,    -1,    -1,    -1,   141,    -1,   143,   144,   145,
+     146,    -1,    -1,   149
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const yytype_uint16 yystos[] =
 {
-       0,   179,   180,     0,     4,    30,    32,    38,    39,    42,
-      47,    53,    55,    59,    60,    62,    65,    67,    74,    80,
-      84,    86,    87,    88,    89,    94,   117,   121,   122,   123,
-     126,   128,   132,   138,   139,   141,   146,   147,   170,   184,
-     185,   186,   187,   188,   191,   192,   199,   210,   224,   228,
-     230,   231,   232,   233,   236,   237,   240,   242,   243,   244,
-     245,   247,   248,   249,   250,   251,   253,   255,   272,   273,
-     274,   275,     3,     4,   173,     3,     4,     3,     4,   226,
-      86,   229,     8,     3,     4,   229,   173,   229,   230,     3,
-     226,   198,   199,     3,   226,   230,    22,    24,    25,    26,
-      28,    29,    31,    34,    36,    43,    44,    45,    46,    48,
-      49,    50,    51,    52,    54,    56,    57,    58,    61,    66,
-      68,    69,    70,    71,    72,    73,    75,    76,    77,    78,
-      79,    82,    85,    90,    91,    93,    97,    98,    99,   101,
-     102,   103,   104,   105,   107,   109,   110,   111,   112,   113,
-     114,   115,   116,   118,   119,   120,   124,   127,   130,   131,
-     134,   135,   136,   140,   142,   143,   144,   145,   148,   200,
-     202,   271,   172,   181,   181,    92,    96,   190,   210,   231,
-     236,   242,   246,   253,   272,   275,   172,   172,   175,   172,
-     175,   172,   183,   172,   151,   241,   175,   254,   255,   254,
-     254,     3,     4,    37,    64,   106,   129,   159,   173,   204,
-     227,   256,   257,   270,   210,   272,   273,   275,   254,   172,
-       8,   175,   172,   273,   175,   253,   133,   175,   173,   173,
-     173,   173,   173,   173,   173,   173,   173,   173,   173,   173,
-     173,   173,   173,   173,   173,   173,   173,   173,   173,   173,
-     173,   173,   173,   173,   149,   171,    11,    81,   184,   189,
-     192,   231,   233,   244,   245,   248,   176,     3,     3,     4,
-     175,   270,   234,   108,   238,   242,     3,     4,   175,   182,
-     252,   256,   256,   177,   170,   173,   197,   254,   174,   207,
-     208,   209,   227,   174,   217,   256,   266,   173,   220,     8,
-     227,     3,     5,     6,     7,     8,     9,    63,   100,   125,
-     137,   154,   157,   158,   159,   162,   163,   173,   213,   214,
-     215,   213,   216,     8,     8,   201,   216,   215,     8,     8,
-     215,     8,   215,   213,    67,   215,   211,   212,   213,   271,
-     215,   211,   213,   273,   273,     8,    10,   203,     5,   276,
-     273,   202,   170,   173,   172,   183,   176,   198,   235,   151,
-      95,   198,   222,   239,   172,   175,   182,   176,   184,   199,
-     251,   256,   174,   216,   159,   212,   193,   194,   195,   196,
-     199,   253,   176,   149,   177,   176,   198,   218,   149,   222,
-     176,   199,   219,   222,   174,   174,   173,   213,   213,   213,
-     213,   213,   213,   213,   253,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,   150,   152,   153,   154,   155,   156,
-     157,   158,   159,   160,   161,   169,   170,   149,   174,   174,
-     174,   149,   174,   174,   174,   174,   174,   174,   174,   174,
-     174,     3,   174,   149,   174,   174,   149,   174,   174,   174,
-     174,   174,   169,   174,   174,   202,     8,   183,   245,   151,
-     253,   172,   176,   198,   223,   176,   188,   176,   183,   171,
-     171,   174,   149,   253,   159,   173,   197,   204,   227,   262,
-     264,   265,   209,   215,   253,   275,   256,   174,   172,   172,
-     253,   174,   159,   173,   197,   204,   258,   260,   261,   213,
-     213,     3,   213,   213,   213,   213,   213,   213,   213,   213,
-     213,   213,   213,   213,   213,   213,   213,   213,   213,     3,
-     213,   215,     8,   174,   212,   215,     5,   174,   256,   253,
-     172,   182,   183,    21,   196,   264,   252,   159,   193,   204,
-     263,   264,   173,   197,   262,   268,   269,   172,   225,   227,
-     260,   252,   159,   193,   204,   259,   260,   174,   173,   197,
-     151,   171,   174,   183,   256,   176,   264,   252,   174,   264,
-     174,   193,   151,   267,   149,   172,   175,   174,   260,   252,
-     174,   264,   174,   213,   193,   213,   183,   264,   174,   216,
-     268,   205,   264,   174,    36,    48,   176,   206,   215,   151,
-     151,   172,   221,   222,   221,   172
+       0,   180,   181,     0,     4,    31,    33,    39,    40,    43,
+      48,    54,    56,    60,    61,    63,    66,    68,    75,    81,
+      85,    87,    88,    89,    90,    95,   118,   122,   123,   124,
+     127,   129,   133,   139,   140,   142,   147,   148,   171,   185,
+     186,   187,   188,   189,   192,   193,   200,   211,   225,   229,
+     231,   232,   233,   234,   237,   238,   241,   243,   244,   245,
+     246,   248,   249,   250,   251,   252,   254,   256,   273,   274,
+     275,   276,     3,     4,   174,     3,     4,     3,     4,   227,
+      87,   230,     8,     3,     4,   230,   174,   230,   231,     3,
+     227,   199,   200,     3,   227,   231,    23,    25,    26,    27,
+      29,    30,    32,    35,    37,    44,    45,    46,    47,    49,
+      50,    51,    52,    53,    55,    57,    58,    59,    62,    67,
+      69,    70,    71,    72,    73,    74,    76,    77,    78,    79,
+      80,    83,    86,    91,    92,    94,    98,    99,   100,   102,
+     103,   104,   105,   106,   108,   110,   111,   112,   113,   114,
+     115,   116,   117,   119,   120,   121,   125,   128,   131,   132,
+     135,   136,   137,   141,   143,   144,   145,   146,   149,   201,
+     203,   272,   173,   182,   182,    93,    97,   191,   211,   232,
+     237,   243,   247,   254,   273,   276,   173,   173,   176,   173,
+     176,   173,   184,   173,   152,   242,   176,   255,   256,   255,
+     255,     3,     4,    38,    65,   107,   130,   160,   174,   205,
+     228,   257,   258,   271,   211,   273,   274,   276,   255,   173,
+       8,   176,   173,   274,   176,   254,   134,   176,   174,   174,
+     174,   174,   174,   174,   174,   174,   174,   174,   174,   174,
+     174,   174,   174,   174,   174,   174,   174,   174,   174,   174,
+     174,   174,   174,   174,   150,   172,    12,    82,   185,   190,
+     193,   232,   234,   245,   246,   249,   177,     3,     3,     4,
+     176,   271,   235,   109,   239,   243,     3,     4,   176,   183,
+     253,   257,   257,   178,   171,   174,   198,   255,   175,   208,
+     209,   210,   228,   175,   218,   257,   267,   174,   221,     8,
+     228,     3,     5,     6,     7,     8,     9,    10,    64,   101,
+     126,   138,   155,   158,   159,   160,   163,   164,   174,   214,
+     215,   216,   214,   217,     8,     8,   202,   217,   216,     8,
+       8,   216,     8,   216,   214,    68,   216,   212,   213,   214,
+     272,   216,   212,   214,   274,   274,     8,    11,   204,     5,
+     277,   274,   203,   171,   174,   173,   184,   177,   199,   236,
+     152,    96,   199,   223,   240,   173,   176,   183,   177,   185,
+     200,   252,   257,   175,   217,   160,   213,   194,   195,   196,
+     197,   200,   254,   177,   150,   178,   177,   199,   219,   150,
+     223,   177,   200,   220,   223,   175,   175,   174,   214,   214,
+     214,   214,   214,   214,   214,   254,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,   151,   153,   154,   155,   156,
+     157,   158,   159,   160,   161,   162,   170,   171,   150,   175,
+     175,   175,   150,   175,   175,   175,   175,   175,   175,   175,
+     175,   175,     3,   175,   150,   175,   175,   150,   175,   175,
+     175,   175,   175,   170,   175,   175,   203,     8,   184,   246,
+     152,   254,   173,   177,   199,   224,   177,   189,   177,   184,
+     172,   172,   175,   150,   254,   160,   174,   198,   205,   228,
+     263,   265,   266,   210,   216,   254,   276,   257,   175,   173,
+     173,   254,   175,   160,   174,   198,   205,   259,   261,   262,
+     214,   214,     3,   214,   214,   214,   214,   214,   214,   214,
+     214,   214,   214,   214,   214,   214,   214,   214,   214,   214,
+       3,   214,   216,     8,   175,   213,   216,     5,   175,   257,
+     254,   173,   183,   184,    22,   197,   265,   253,   160,   194,
+     205,   264,   265,   174,   198,   263,   269,   270,   173,   226,
+     228,   261,   253,   160,   194,   205,   260,   261,   175,   174,
+     198,   152,   172,   175,   184,   257,   177,   265,   253,   175,
+     265,   175,   194,   152,   268,   150,   173,   176,   175,   261,
+     253,   175,   265,   175,   214,   194,   214,   184,   265,   175,
+     217,   269,   206,   265,   175,    37,    49,   177,   207,   216,
+     152,   152,   173,   222,   223,   222,   173
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -3755,350 +3746,357 @@ yyreduce:
 
 /* Line 1455 of yacc.c  */
 #line 635 "parser.y"
-    { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[(1) - (1)].str)); ;}
+    { (yyval.expr) = make_exprs(EXPR_CHARCONST, (yyvsp[(1) - (1)].str)); ;}
     break;
 
   case 164:
 
 /* Line 1455 of yacc.c  */
 #line 636 "parser.y"
-    { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;}
+    { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[(1) - (1)].str)); ;}
     break;
 
   case 165:
 
 /* Line 1455 of yacc.c  */
 #line 637 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;}
     break;
 
   case 166:
 
 /* Line 1455 of yacc.c  */
 #line 638 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 167:
 
 /* Line 1455 of yacc.c  */
 #line 639 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 168:
 
 /* Line 1455 of yacc.c  */
 #line 640 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 169:
 
 /* Line 1455 of yacc.c  */
 #line 641 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 170:
 
 /* Line 1455 of yacc.c  */
 #line 642 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 171:
 
 /* Line 1455 of yacc.c  */
 #line 643 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 172:
 
 /* Line 1455 of yacc.c  */
 #line 644 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 173:
 
 /* Line 1455 of yacc.c  */
 #line 645 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 174:
 
 /* Line 1455 of yacc.c  */
 #line 646 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 175:
 
 /* Line 1455 of yacc.c  */
 #line 647 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 176:
 
 /* Line 1455 of yacc.c  */
 #line 648 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 177:
 
 /* Line 1455 of yacc.c  */
 #line 649 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 178:
 
 /* Line 1455 of yacc.c  */
 #line 650 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 179:
 
 /* Line 1455 of yacc.c  */
 #line 651 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 180:
 
 /* Line 1455 of yacc.c  */
 #line 652 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 181:
 
 /* Line 1455 of yacc.c  */
 #line 653 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 182:
 
 /* Line 1455 of yacc.c  */
 #line 654 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 183:
 
 /* Line 1455 of yacc.c  */
 #line 655 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[(2) - (2)].expr)); ;}
+    { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 184:
 
 /* Line 1455 of yacc.c  */
 #line 656 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[(2) - (2)].expr)); ;}
+    { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[(2) - (2)].expr)); ;}
     break;
 
   case 185:
 
 /* Line 1455 of yacc.c  */
 #line 657 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[(2) - (2)].expr)); ;}
+    { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[(2) - (2)].expr)); ;}
     break;
 
   case 186:
 
 /* Line 1455 of yacc.c  */
 #line 658 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[(2) - (2)].expr)); ;}
+    { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[(2) - (2)].expr)); ;}
     break;
 
   case 187:
 
 /* Line 1455 of yacc.c  */
 #line 659 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[(2) - (2)].expr)); ;}
+    { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[(2) - (2)].expr)); ;}
     break;
 
   case 188:
 
 /* Line 1455 of yacc.c  */
 #line 660 "parser.y"
-    { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[(2) - (2)].expr)); ;}
+    { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[(2) - (2)].expr)); ;}
     break;
 
   case 189:
 
 /* Line 1455 of yacc.c  */
 #line 661 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[(1) - (3)].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[(3) - (3)].str))); ;}
+    { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[(2) - (2)].expr)); ;}
     break;
 
   case 190:
 
 /* Line 1455 of yacc.c  */
 #line 662 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[(1) - (3)].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[(3) - (3)].str))); ;}
+    { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[(1) - (3)].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[(3) - (3)].str))); ;}
     break;
 
   case 191:
 
 /* Line 1455 of yacc.c  */
-#line 664 "parser.y"
-    { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[(2) - (5)].declspec), (yyvsp[(3) - (5)].declarator), 0), (yyvsp[(5) - (5)].expr)); free((yyvsp[(2) - (5)].declspec)); free((yyvsp[(3) - (5)].declarator)); ;}
+#line 663 "parser.y"
+    { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[(1) - (3)].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[(3) - (3)].str))); ;}
     break;
 
   case 192:
 
 /* Line 1455 of yacc.c  */
-#line 666 "parser.y"
-    { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[(3) - (5)].declspec), (yyvsp[(4) - (5)].declarator), 0), NULL); free((yyvsp[(3) - (5)].declspec)); free((yyvsp[(4) - (5)].declarator)); ;}
+#line 665 "parser.y"
+    { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[(2) - (5)].declspec), (yyvsp[(3) - (5)].declarator), 0), (yyvsp[(5) - (5)].expr)); free((yyvsp[(2) - (5)].declspec)); free((yyvsp[(3) - (5)].declarator)); ;}
     break;
 
   case 193:
 
 /* Line 1455 of yacc.c  */
 #line 667 "parser.y"
-    { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;}
+    { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[(3) - (5)].declspec), (yyvsp[(4) - (5)].declarator), 0), NULL); free((yyvsp[(3) - (5)].declspec)); free((yyvsp[(4) - (5)].declarator)); ;}
     break;
 
   case 194:
 
 /* Line 1455 of yacc.c  */
 #line 668 "parser.y"
-    { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;}
+    { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;}
     break;
 
   case 195:
 
 /* Line 1455 of yacc.c  */
-#line 671 "parser.y"
-    { (yyval.expr_list) = append_expr( NULL, (yyvsp[(1) - (1)].expr) ); ;}
+#line 669 "parser.y"
+    { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;}
     break;
 
   case 196:
 
 /* Line 1455 of yacc.c  */
 #line 672 "parser.y"
-    { (yyval.expr_list) = append_expr( (yyvsp[(1) - (3)].expr_list), (yyvsp[(3) - (3)].expr) ); ;}
+    { (yyval.expr_list) = append_expr( NULL, (yyvsp[(1) - (1)].expr) ); ;}
     break;
 
   case 197:
 
 /* Line 1455 of yacc.c  */
-#line 675 "parser.y"
+#line 673 "parser.y"
+    { (yyval.expr_list) = append_expr( (yyvsp[(1) - (3)].expr_list), (yyvsp[(3) - (3)].expr) ); ;}
+    break;
+
+  case 198:
+
+/* Line 1455 of yacc.c  */
+#line 676 "parser.y"
     { (yyval.expr) = (yyvsp[(1) - (1)].expr);
                                                  if (!(yyval.expr)->is_const)
                                                      error_loc("expression is not an integer constant\n");
                                                ;}
     break;
 
-  case 198:
+  case 199:
 
 /* Line 1455 of yacc.c  */
-#line 681 "parser.y"
+#line 682 "parser.y"
     { (yyval.expr) = (yyvsp[(1) - (1)].expr);
                                                  if (!(yyval.expr)->is_const && (yyval.expr)->type != EXPR_STRLIT && (yyval.expr)->type != EXPR_WSTRLIT)
                                                      error_loc("expression is not constant\n");
                                                ;}
     break;
 
-  case 199:
+  case 200:
 
 /* Line 1455 of yacc.c  */
-#line 687 "parser.y"
+#line 688 "parser.y"
     { (yyval.var_list) = NULL; ;}
     break;
 
-  case 200:
+  case 201:
 
 /* Line 1455 of yacc.c  */
-#line 688 "parser.y"
+#line 689 "parser.y"
     { (yyval.var_list) = append_var_list((yyvsp[(1) - (2)].var_list), (yyvsp[(2) - (2)].var_list)); ;}
     break;
 
-  case 201:
+  case 202:
 
 /* Line 1455 of yacc.c  */
-#line 692 "parser.y"
+#line 693 "parser.y"
     { const char *first = LIST_ENTRY(list_head((yyvsp[(3) - (4)].declarator_list)), declarator_t, entry)->var->name;
                                                  check_field_attrs(first, (yyvsp[(1) - (4)].attr_list));
                                                  (yyval.var_list) = set_var_types((yyvsp[(1) - (4)].attr_list), (yyvsp[(2) - (4)].declspec), (yyvsp[(3) - (4)].declarator_list));
                                                ;}
     break;
 
-  case 202:
+  case 203:
 
 /* Line 1455 of yacc.c  */
-#line 696 "parser.y"
+#line 697 "parser.y"
     { var_t *v = make_var(NULL);
                                                  v->type = (yyvsp[(2) - (3)].type); v->attrs = (yyvsp[(1) - (3)].attr_list);
                                                  (yyval.var_list) = append_var(NULL, v);
                                                ;}
     break;
 
-  case 203:
+  case 204:
 
 /* Line 1455 of yacc.c  */
-#line 703 "parser.y"
+#line 704 "parser.y"
     { (yyval.var) = (yyvsp[(1) - (2)].var); ;}
     break;
 
-  case 204:
+  case 205:
 
 /* Line 1455 of yacc.c  */
-#line 704 "parser.y"
+#line 705 "parser.y"
     { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[(1) - (2)].attr_list); ;}
     break;
 
-  case 205:
+  case 206:
 
 /* Line 1455 of yacc.c  */
-#line 707 "parser.y"
+#line 708 "parser.y"
     { (yyval.var_list) = NULL; ;}
     break;
 
-  case 206:
+  case 207:
 
 /* Line 1455 of yacc.c  */
-#line 708 "parser.y"
+#line 709 "parser.y"
     { (yyval.var_list) = append_var( (yyvsp[(1) - (2)].var_list), (yyvsp[(2) - (2)].var) ); ;}
     break;
 
-  case 207:
+  case 208:
 
 /* Line 1455 of yacc.c  */
-#line 712 "parser.y"
+#line 713 "parser.y"
     { (yyval.var) = (yyvsp[(1) - (2)].var); ;}
     break;
 
-  case 208:
+  case 209:
 
 /* Line 1455 of yacc.c  */
-#line 713 "parser.y"
+#line 714 "parser.y"
     { (yyval.var) = NULL; ;}
     break;
 
-  case 209:
+  case 210:
 
 /* Line 1455 of yacc.c  */
-#line 716 "parser.y"
+#line 717 "parser.y"
     { (yyval.var) = declare_var(check_field_attrs((yyvsp[(3) - (3)].declarator)->var->name, (yyvsp[(1) - (3)].attr_list)),
                                                                (yyvsp[(2) - (3)].declspec), (yyvsp[(3) - (3)].declarator), FALSE);
                                                  free((yyvsp[(3) - (3)].declarator));
                                                ;}
     break;
 
-  case 210:
+  case 211:
 
 /* Line 1455 of yacc.c  */
-#line 723 "parser.y"
+#line 724 "parser.y"
     { var_t *v;
                                                  v = declare_var(check_function_attrs((yyvsp[(3) - (3)].declarator)->var->name, (yyvsp[(1) - (3)].attr_list)),
                                                               (yyvsp[(2) - (3)].declspec), (yyvsp[(3) - (3)].declarator), FALSE);
@@ -4107,43 +4105,36 @@ yyreduce:
                                                ;}
     break;
 
-  case 211:
+  case 212:
 
 /* Line 1455 of yacc.c  */
-#line 733 "parser.y"
+#line 734 "parser.y"
     { (yyval.var) = declare_var((yyvsp[(1) - (3)].attr_list), (yyvsp[(2) - (3)].declspec), (yyvsp[(3) - (3)].declarator), FALSE);
                                                  free((yyvsp[(3) - (3)].declarator));
                                                ;}
     break;
 
-  case 212:
+  case 213:
 
 /* Line 1455 of yacc.c  */
-#line 736 "parser.y"
+#line 737 "parser.y"
     { (yyval.var) = declare_var(NULL, (yyvsp[(1) - (2)].declspec), (yyvsp[(2) - (2)].declarator), FALSE);
                                                  free((yyvsp[(2) - (2)].declarator));
                                                ;}
     break;
 
-  case 213:
+  case 214:
 
 /* Line 1455 of yacc.c  */
-#line 741 "parser.y"
+#line 742 "parser.y"
     { (yyval.var) = NULL; ;}
     break;
 
-  case 215:
-
-/* Line 1455 of yacc.c  */
-#line 745 "parser.y"
-    { (yyval.str) = NULL; ;}
-    break;
-
   case 216:
 
 /* Line 1455 of yacc.c  */
 #line 746 "parser.y"
-    { (yyval.str) = (yyvsp[(1) - (1)].str); ;}
+    { (yyval.str) = NULL; ;}
     break;
 
   case 217:
@@ -4156,22 +4147,22 @@ yyreduce:
   case 218:
 
 /* Line 1455 of yacc.c  */
-#line 750 "parser.y"
-    { (yyval.var) = make_var((yyvsp[(1) - (1)].str)); ;}
+#line 748 "parser.y"
+    { (yyval.str) = (yyvsp[(1) - (1)].str); ;}
     break;
 
   case 219:
 
 /* Line 1455 of yacc.c  */
-#line 752 "parser.y"
+#line 751 "parser.y"
     { (yyval.var) = make_var((yyvsp[(1) - (1)].str)); ;}
     break;
 
   case 220:
 
 /* Line 1455 of yacc.c  */
-#line 755 "parser.y"
-    { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;}
+#line 753 "parser.y"
+    { (yyval.var) = make_var((yyvsp[(1) - (1)].str)); ;}
     break;
 
   case 221:
@@ -4181,32 +4172,32 @@ yyreduce:
     { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;}
     break;
 
-  case 223:
+  case 222:
 
 /* Line 1455 of yacc.c  */
-#line 758 "parser.y"
-    { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[(2) - (2)].type)), -1); ;}
+#line 757 "parser.y"
+    { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;}
     break;
 
   case 224:
 
 /* Line 1455 of yacc.c  */
 #line 759 "parser.y"
-    { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[(2) - (2)].type)), 1); ;}
+    { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[(2) - (2)].type)), -1); ;}
     break;
 
   case 225:
 
 /* Line 1455 of yacc.c  */
 #line 760 "parser.y"
-    { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); ;}
+    { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[(2) - (2)].type)), 1); ;}
     break;
 
   case 226:
 
 /* Line 1455 of yacc.c  */
 #line 761 "parser.y"
-    { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;}
+    { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); ;}
     break;
 
   case 227:
@@ -4237,73 +4228,80 @@ yyreduce:
     { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;}
     break;
 
-  case 233:
+  case 231:
 
 /* Line 1455 of yacc.c  */
-#line 772 "parser.y"
-    { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); ;}
+#line 766 "parser.y"
+    { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;}
     break;
 
   case 234:
 
 /* Line 1455 of yacc.c  */
 #line 773 "parser.y"
-    { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); ;}
+    { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); ;}
     break;
 
   case 235:
 
 /* Line 1455 of yacc.c  */
 #line 774 "parser.y"
-    { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); ;}
+    { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); ;}
     break;
 
   case 236:
 
 /* Line 1455 of yacc.c  */
 #line 775 "parser.y"
-    { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); ;}
+    { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); ;}
     break;
 
   case 237:
 
 /* Line 1455 of yacc.c  */
 #line 776 "parser.y"
-    { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); ;}
+    { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); ;}
     break;
 
   case 238:
 
 /* Line 1455 of yacc.c  */
 #line 777 "parser.y"
-    { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); ;}
+    { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); ;}
     break;
 
   case 239:
 
 /* Line 1455 of yacc.c  */
 #line 778 "parser.y"
-    { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); ;}
+    { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); ;}
     break;
 
   case 240:
 
 /* Line 1455 of yacc.c  */
 #line 779 "parser.y"
-    { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); ;}
+    { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); ;}
     break;
 
   case 241:
 
 /* Line 1455 of yacc.c  */
-#line 782 "parser.y"
-    { (yyval.type) = type_new_coclass((yyvsp[(2) - (2)].str)); ;}
+#line 780 "parser.y"
+    { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); ;}
     break;
 
   case 242:
 
 /* Line 1455 of yacc.c  */
 #line 783 "parser.y"
+    { (yyval.type) = type_new_coclass((yyvsp[(2) - (2)].str)); ;}
+    break;
+
+  case 243:
+
+/* Line 1455 of yacc.c  */
+#line 784 "parser.y"
     { (yyval.type) = find_type((yyvsp[(2) - (2)].str), 0);
                                                  if (type_get_type_detect_alias((yyval.type)) != TYPE_COCLASS)
                                                    error_loc("%s was not declared a coclass at %s:%d\n",
@@ -4312,62 +4310,62 @@ yyreduce:
                                                ;}
     break;
 
-  case 243:
+  case 244:
 
 /* Line 1455 of yacc.c  */
-#line 791 "parser.y"
+#line 792 "parser.y"
     { (yyval.type) = (yyvsp[(2) - (2)].type);
                                                  check_def((yyval.type));
                                                  (yyval.type)->attrs = check_coclass_attrs((yyvsp[(2) - (2)].type)->name, (yyvsp[(1) - (2)].attr_list));
                                                ;}
     break;
 
-  case 244:
+  case 245:
 
 /* Line 1455 of yacc.c  */
-#line 798 "parser.y"
+#line 799 "parser.y"
     { (yyval.type) = type_coclass_define((yyvsp[(1) - (5)].type), (yyvsp[(3) - (5)].ifref_list)); ;}
     break;
 
-  case 245:
+  case 246:
 
 /* Line 1455 of yacc.c  */
-#line 801 "parser.y"
+#line 802 "parser.y"
     { (yyval.ifref_list) = NULL; ;}
     break;
 
-  case 246:
+  case 247:
 
 /* Line 1455 of yacc.c  */
-#line 802 "parser.y"
+#line 803 "parser.y"
     { (yyval.ifref_list) = append_ifref( (yyvsp[(1) - (2)].ifref_list), (yyvsp[(2) - (2)].ifref) ); ;}
     break;
 
-  case 247:
+  case 248:
 
 /* Line 1455 of yacc.c  */
-#line 806 "parser.y"
+#line 807 "parser.y"
     { (yyval.ifref) = make_ifref((yyvsp[(2) - (2)].type)); (yyval.ifref)->attrs = (yyvsp[(1) - (2)].attr_list); ;}
     break;
 
-  case 248:
+  case 249:
 
 /* Line 1455 of yacc.c  */
-#line 809 "parser.y"
+#line 810 "parser.y"
     { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[(2) - (2)].str), 0); ;}
     break;
 
-  case 249:
+  case 250:
 
 /* Line 1455 of yacc.c  */
-#line 810 "parser.y"
+#line 811 "parser.y"
     { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[(2) - (2)].str), 0); ;}
     break;
 
-  case 250:
+  case 251:
 
 /* Line 1455 of yacc.c  */
-#line 813 "parser.y"
+#line 814 "parser.y"
     { attr_t *attrs;
                                                  is_object_interface = TRUE;
                                                  (yyval.type) = (yyvsp[(2) - (2)].type);
@@ -4378,71 +4376,64 @@ yyreduce:
                                                ;}
     break;
 
-  case 251:
-
-/* Line 1455 of yacc.c  */
-#line 823 "parser.y"
-    { (yyval.var_list) = NULL; ;}
-    break;
-
   case 252:
 
 /* Line 1455 of yacc.c  */
 #line 824 "parser.y"
-    { (yyval.var_list) = append_var( (yyvsp[(1) - (3)].var_list), (yyvsp[(2) - (3)].var) ); ;}
+    { (yyval.var_list) = NULL; ;}
     break;
 
   case 253:
 
 /* Line 1455 of yacc.c  */
-#line 827 "parser.y"
-    { (yyval.stmt_list) = NULL; ;}
+#line 825 "parser.y"
+    { (yyval.var_list) = append_var( (yyvsp[(1) - (3)].var_list), (yyvsp[(2) - (3)].var) ); ;}
     break;
 
   case 254:
 
 /* Line 1455 of yacc.c  */
 #line 828 "parser.y"
-    { (yyval.stmt_list) = append_func( (yyvsp[(1) - (3)].stmt_list), (yyvsp[(2) - (3)].func) ); ;}
+    { (yyval.stmt_list) = NULL; ;}
     break;
 
   case 255:
 
 /* Line 1455 of yacc.c  */
-#line 834 "parser.y"
-    { (yyval.type) = (yyvsp[(1) - (5)].type);
-                                                 type_dispinterface_define((yyval.type), (yyvsp[(3) - (5)].var_list), (yyvsp[(4) - (5)].stmt_list));
-                                               ;}
+#line 829 "parser.y"
+    { (yyval.stmt_list) = append_func( (yyvsp[(1) - (3)].stmt_list), (yyvsp[(2) - (3)].func) ); ;}
     break;
 
   case 256:
 
 /* Line 1455 of yacc.c  */
-#line 838 "parser.y"
+#line 835 "parser.y"
     { (yyval.type) = (yyvsp[(1) - (5)].type);
-                                                 type_dispinterface_define_from_iface((yyval.type), (yyvsp[(3) - (5)].type));
+                                                 type_dispinterface_define((yyval.type), (yyvsp[(3) - (5)].var_list), (yyvsp[(4) - (5)].stmt_list));
                                                ;}
     break;
 
   case 257:
 
 /* Line 1455 of yacc.c  */
-#line 843 "parser.y"
-    { (yyval.type) = NULL; ;}
+#line 839 "parser.y"
+    { (yyval.type) = (yyvsp[(1) - (5)].type);
+                                                 type_dispinterface_define_from_iface((yyval.type), (yyvsp[(3) - (5)].type));
+                                               ;}
     break;
 
   case 258:
 
 /* Line 1455 of yacc.c  */
 #line 844 "parser.y"
-    { (yyval.type) = find_type_or_error2((yyvsp[(2) - (2)].str), 0); ;}
+    { (yyval.type) = NULL; ;}
     break;
 
   case 259:
 
 /* Line 1455 of yacc.c  */
-#line 847 "parser.y"
-    { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[(2) - (2)].str), 0); ;}
+#line 845 "parser.y"
+    { (yyval.type) = find_type_or_error2((yyvsp[(2) - (2)].str), 0); is_object_interface = 1; ;}
     break;
 
   case 260:
@@ -4455,49 +4446,49 @@ yyreduce:
   case 261:
 
 /* Line 1455 of yacc.c  */
-#line 851 "parser.y"
+#line 849 "parser.y"
+    { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[(2) - (2)].str), 0); ;}
+    break;
+
+  case 262:
+
+/* Line 1455 of yacc.c  */
+#line 852 "parser.y"
     { (yyval.ifinfo).interface = (yyvsp[(2) - (2)].type);
                                                  (yyval.ifinfo).old_pointer_default = pointer_default;
                                                  if (is_attr((yyvsp[(1) - (2)].attr_list), ATTR_POINTERDEFAULT))
                                                    pointer_default = get_attrv((yyvsp[(1) - (2)].attr_list), ATTR_POINTERDEFAULT);
-                                                 is_object_interface = is_object((yyvsp[(1) - (2)].attr_list));
                                                  check_def((yyvsp[(2) - (2)].type));
                                                  (yyvsp[(2) - (2)].type)->attrs = check_iface_attrs((yyvsp[(2) - (2)].type)->name, (yyvsp[(1) - (2)].attr_list));
+                                                 is_object_interface = is_object((yyvsp[(2) - (2)].type));
                                                  (yyvsp[(2) - (2)].type)->defined = TRUE;
                                                ;}
     break;
 
-  case 262:
+  case 263:
 
 /* Line 1455 of yacc.c  */
-#line 863 "parser.y"
+#line 864 "parser.y"
     { (yyval.type) = (yyvsp[(1) - (6)].ifinfo).interface;
                                                  type_interface_define((yyval.type), (yyvsp[(2) - (6)].type), (yyvsp[(4) - (6)].stmt_list));
                                                  pointer_default = (yyvsp[(1) - (6)].ifinfo).old_pointer_default;
                                                ;}
     break;
 
-  case 263:
+  case 264:
 
 /* Line 1455 of yacc.c  */
-#line 871 "parser.y"
+#line 872 "parser.y"
     { (yyval.type) = (yyvsp[(1) - (8)].ifinfo).interface;
                                                  type_interface_define((yyval.type), find_type_or_error2((yyvsp[(3) - (8)].str), 0), (yyvsp[(6) - (8)].stmt_list));
                                                  pointer_default = (yyvsp[(1) - (8)].ifinfo).old_pointer_default;
                                                ;}
     break;
 
-  case 264:
-
-/* Line 1455 of yacc.c  */
-#line 875 "parser.y"
-    { (yyval.type) = (yyvsp[(1) - (2)].type); ;}
-    break;
-
   case 265:
 
 /* Line 1455 of yacc.c  */
-#line 879 "parser.y"
+#line 876 "parser.y"
     { (yyval.type) = (yyvsp[(1) - (2)].type); ;}
     break;
 
@@ -4511,8 +4502,8 @@ yyreduce:
   case 267:
 
 /* Line 1455 of yacc.c  */
-#line 883 "parser.y"
-    { (yyval.type) = type_new_module((yyvsp[(2) - (2)].str)); ;}
+#line 881 "parser.y"
+    { (yyval.type) = (yyvsp[(1) - (2)].type); ;}
     break;
 
   case 268:
@@ -4525,96 +4516,96 @@ yyreduce:
   case 269:
 
 /* Line 1455 of yacc.c  */
-#line 887 "parser.y"
-    { (yyval.type) = (yyvsp[(2) - (2)].type);
-                                                 (yyval.type)->attrs = check_module_attrs((yyvsp[(2) - (2)].type)->name, (yyvsp[(1) - (2)].attr_list));
-                                               ;}
+#line 885 "parser.y"
+    { (yyval.type) = type_new_module((yyvsp[(2) - (2)].str)); ;}
     break;
 
   case 270:
 
 /* Line 1455 of yacc.c  */
-#line 893 "parser.y"
-    { (yyval.type) = (yyvsp[(1) - (5)].type);
-                                                  type_module_define((yyval.type), (yyvsp[(3) - (5)].stmt_list));
+#line 888 "parser.y"
+    { (yyval.type) = (yyvsp[(2) - (2)].type);
+                                                 (yyval.type)->attrs = check_module_attrs((yyvsp[(2) - (2)].type)->name, (yyvsp[(1) - (2)].attr_list));
                                                ;}
     break;
 
   case 271:
 
 /* Line 1455 of yacc.c  */
-#line 899 "parser.y"
-    { (yyval.stgclass) = STG_EXTERN; ;}
+#line 894 "parser.y"
+    { (yyval.type) = (yyvsp[(1) - (5)].type);
+                                                  type_module_define((yyval.type), (yyvsp[(3) - (5)].stmt_list));
+                                               ;}
     break;
 
   case 272:
 
 /* Line 1455 of yacc.c  */
 #line 900 "parser.y"
-    { (yyval.stgclass) = STG_STATIC; ;}
+    { (yyval.stgclass) = STG_EXTERN; ;}
     break;
 
   case 273:
 
 /* Line 1455 of yacc.c  */
 #line 901 "parser.y"
-    { (yyval.stgclass) = STG_REGISTER; ;}
+    { (yyval.stgclass) = STG_STATIC; ;}
     break;
 
   case 274:
 
 /* Line 1455 of yacc.c  */
-#line 905 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_INLINE); ;}
+#line 902 "parser.y"
+    { (yyval.stgclass) = STG_REGISTER; ;}
     break;
 
   case 275:
 
 /* Line 1455 of yacc.c  */
-#line 909 "parser.y"
-    { (yyval.attr) = make_attr(ATTR_CONST); ;}
+#line 906 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_INLINE); ;}
     break;
 
   case 276:
 
 /* Line 1455 of yacc.c  */
-#line 912 "parser.y"
-    { (yyval.attr_list) = NULL; ;}
+#line 910 "parser.y"
+    { (yyval.attr) = make_attr(ATTR_CONST); ;}
     break;
 
   case 277:
 
 /* Line 1455 of yacc.c  */
 #line 913 "parser.y"
-    { (yyval.attr_list) = append_attr((yyvsp[(1) - (2)].attr_list), (yyvsp[(2) - (2)].attr)); ;}
+    { (yyval.attr_list) = NULL; ;}
     break;
 
   case 278:
 
 /* Line 1455 of yacc.c  */
-#line 916 "parser.y"
-    { (yyval.declspec) = make_decl_spec((yyvsp[(1) - (2)].type), (yyvsp[(2) - (2)].declspec), NULL, NULL, STG_NONE); ;}
+#line 914 "parser.y"
+    { (yyval.attr_list) = append_attr((yyvsp[(1) - (2)].attr_list), (yyvsp[(2) - (2)].attr)); ;}
     break;
 
   case 279:
 
 /* Line 1455 of yacc.c  */
-#line 918 "parser.y"
-    { (yyval.declspec) = make_decl_spec((yyvsp[(2) - (3)].type), (yyvsp[(1) - (3)].declspec), (yyvsp[(3) - (3)].declspec), NULL, STG_NONE); ;}
+#line 917 "parser.y"
+    { (yyval.declspec) = make_decl_spec((yyvsp[(1) - (2)].type), (yyvsp[(2) - (2)].declspec), NULL, NULL, STG_NONE); ;}
     break;
 
   case 280:
 
 /* Line 1455 of yacc.c  */
-#line 921 "parser.y"
-    { (yyval.declspec) = NULL; ;}
+#line 919 "parser.y"
+    { (yyval.declspec) = make_decl_spec((yyvsp[(2) - (3)].type), (yyvsp[(1) - (3)].declspec), (yyvsp[(3) - (3)].declspec), NULL, STG_NONE); ;}
     break;
 
-  case 282:
+  case 281:
 
 /* Line 1455 of yacc.c  */
-#line 926 "parser.y"
-    { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[(2) - (2)].declspec), NULL, (yyvsp[(1) - (2)].attr), STG_NONE); ;}
+#line 922 "parser.y"
+    { (yyval.declspec) = NULL; ;}
     break;
 
   case 283:
@@ -4628,326 +4619,326 @@ yyreduce:
 
 /* Line 1455 of yacc.c  */
 #line 928 "parser.y"
-    { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[(2) - (2)].declspec), NULL, NULL, (yyvsp[(1) - (2)].stgclass)); ;}
+    { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[(2) - (2)].declspec), NULL, (yyvsp[(1) - (2)].attr), STG_NONE); ;}
     break;
 
   case 285:
 
 /* Line 1455 of yacc.c  */
-#line 933 "parser.y"
-    { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;}
+#line 929 "parser.y"
+    { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[(2) - (2)].declspec), NULL, NULL, (yyvsp[(1) - (2)].stgclass)); ;}
     break;
 
   case 286:
 
 /* Line 1455 of yacc.c  */
 #line 934 "parser.y"
-    { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;}
+    { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;}
     break;
 
-  case 288:
+  case 287:
 
 /* Line 1455 of yacc.c  */
-#line 939 "parser.y"
-    { (yyval.declarator) = make_declarator((yyvsp[(1) - (1)].var)); ;}
+#line 935 "parser.y"
+    { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;}
     break;
 
   case 289:
 
 /* Line 1455 of yacc.c  */
 #line 940 "parser.y"
-    { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;}
+    { (yyval.declarator) = make_declarator((yyvsp[(1) - (1)].var)); ;}
     break;
 
   case 290:
 
 /* Line 1455 of yacc.c  */
 #line 941 "parser.y"
-    { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;}
+    { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;}
     break;
 
   case 291:
 
 /* Line 1455 of yacc.c  */
 #line 942 "parser.y"
+    { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;}
+    break;
+
+  case 292:
+
+/* Line 1455 of yacc.c  */
+#line 943 "parser.y"
     { (yyval.declarator) = (yyvsp[(1) - (4)].declarator);
                                                  (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(3) - (4)].var_list)));
                                                  (yyval.declarator)->type = NULL;
                                                ;}
     break;
 
-  case 292:
+  case 293:
 
 /* Line 1455 of yacc.c  */
-#line 951 "parser.y"
+#line 952 "parser.y"
     { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;}
     break;
 
-  case 293:
+  case 294:
 
 /* Line 1455 of yacc.c  */
-#line 952 "parser.y"
+#line 953 "parser.y"
     { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;}
     break;
 
-  case 295:
+  case 296:
 
 /* Line 1455 of yacc.c  */
-#line 959 "parser.y"
+#line 960 "parser.y"
     { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;}
     break;
 
-  case 296:
+  case 297:
 
 /* Line 1455 of yacc.c  */
-#line 960 "parser.y"
+#line 961 "parser.y"
     { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;}
     break;
 
-  case 297:
+  case 298:
 
 /* Line 1455 of yacc.c  */
-#line 964 "parser.y"
+#line 965 "parser.y"
     { (yyval.declarator) = make_declarator(NULL); ;}
     break;
 
-  case 299:
+  case 300:
 
 /* Line 1455 of yacc.c  */
-#line 970 "parser.y"
+#line 971 "parser.y"
     { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;}
     break;
 
-  case 300:
+  case 301:
 
 /* Line 1455 of yacc.c  */
-#line 971 "parser.y"
+#line 972 "parser.y"
     { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;}
     break;
 
-  case 301:
+  case 302:
 
 /* Line 1455 of yacc.c  */
-#line 972 "parser.y"
+#line 973 "parser.y"
     { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
-  case 302:
+  case 303:
 
 /* Line 1455 of yacc.c  */
-#line 974 "parser.y"
+#line 975 "parser.y"
     { (yyval.declarator) = make_declarator(NULL);
                                                  (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(2) - (3)].var_list)));
                                                  (yyval.declarator)->type = NULL;
                                                ;}
     break;
 
-  case 303:
+  case 304:
 
 /* Line 1455 of yacc.c  */
-#line 979 "parser.y"
+#line 980 "parser.y"
     { (yyval.declarator) = (yyvsp[(1) - (4)].declarator);
                                                  (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(3) - (4)].var_list)));
                                                  (yyval.declarator)->type = NULL;
                                                ;}
     break;
 
-  case 304:
+  case 305:
 
 /* Line 1455 of yacc.c  */
-#line 988 "parser.y"
+#line 989 "parser.y"
     { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;}
     break;
 
-  case 305:
+  case 306:
 
 /* Line 1455 of yacc.c  */
-#line 989 "parser.y"
+#line 990 "parser.y"
     { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;}
     break;
 
-  case 307:
+  case 308:
 
 /* Line 1455 of yacc.c  */
-#line 996 "parser.y"
+#line 997 "parser.y"
     { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;}
     break;
 
-  case 308:
+  case 309:
 
 /* Line 1455 of yacc.c  */
-#line 997 "parser.y"
+#line 998 "parser.y"
     { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;}
     break;
 
-  case 309:
+  case 310:
 
 /* Line 1455 of yacc.c  */
-#line 1001 "parser.y"
+#line 1002 "parser.y"
     { (yyval.declarator) = make_declarator(NULL); ;}
     break;
 
-  case 311:
+  case 312:
 
 /* Line 1455 of yacc.c  */
-#line 1009 "parser.y"
+#line 1010 "parser.y"
     { (yyval.declarator) = make_declarator((yyvsp[(1) - (1)].var)); ;}
     break;
 
-  case 312:
+  case 313:
 
 /* Line 1455 of yacc.c  */
-#line 1010 "parser.y"
+#line 1011 "parser.y"
     { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;}
     break;
 
-  case 313:
+  case 314:
 
 /* Line 1455 of yacc.c  */
-#line 1011 "parser.y"
+#line 1012 "parser.y"
     { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;}
     break;
 
-  case 314:
+  case 315:
 
 /* Line 1455 of yacc.c  */
-#line 1012 "parser.y"
+#line 1013 "parser.y"
     { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
-  case 315:
+  case 316:
 
 /* Line 1455 of yacc.c  */
-#line 1014 "parser.y"
+#line 1015 "parser.y"
     { (yyval.declarator) = make_declarator(NULL);
                                                  (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(2) - (3)].var_list)));
                                                  (yyval.declarator)->type = NULL;
                                                ;}
     break;
 
-  case 316:
+  case 317:
 
 /* Line 1455 of yacc.c  */
-#line 1019 "parser.y"
+#line 1020 "parser.y"
     { (yyval.declarator) = (yyvsp[(1) - (4)].declarator);
                                                  (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(3) - (4)].var_list)));
                                                  (yyval.declarator)->type = NULL;
                                                ;}
     break;
 
-  case 317:
-
-/* Line 1455 of yacc.c  */
-#line 1026 "parser.y"
-    { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[(1) - (1)].declarator) ); ;}
-    break;
-
   case 318:
 
 /* Line 1455 of yacc.c  */
 #line 1027 "parser.y"
-    { (yyval.declarator_list) = append_declarator( (yyvsp[(1) - (3)].declarator_list), (yyvsp[(3) - (3)].declarator) ); ;}
+    { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[(1) - (1)].declarator) ); ;}
     break;
 
   case 319:
 
 /* Line 1455 of yacc.c  */
-#line 1030 "parser.y"
-    { (yyval.expr) = NULL; ;}
+#line 1028 "parser.y"
+    { (yyval.declarator_list) = append_declarator( (yyvsp[(1) - (3)].declarator_list), (yyvsp[(3) - (3)].declarator) ); ;}
     break;
 
   case 320:
 
 /* Line 1455 of yacc.c  */
 #line 1031 "parser.y"
-    { (yyval.expr) = (yyvsp[(2) - (2)].expr); ;}
+    { (yyval.expr) = NULL; ;}
     break;
 
   case 321:
 
 /* Line 1455 of yacc.c  */
-#line 1034 "parser.y"
-    { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->bits = (yyvsp[(2) - (2)].expr);
-                                                 if (!(yyval.declarator)->bits && !(yyval.declarator)->var->name)
-                                                   error_loc("unnamed fields are not allowed");
-                                               ;}
+#line 1032 "parser.y"
+    { (yyval.expr) = (yyvsp[(2) - (2)].expr); ;}
     break;
 
   case 322:
 
 /* Line 1455 of yacc.c  */
-#line 1041 "parser.y"
-    { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[(1) - (1)].declarator) ); ;}
+#line 1035 "parser.y"
+    { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->bits = (yyvsp[(2) - (2)].expr);
+                                                 if (!(yyval.declarator)->bits && !(yyval.declarator)->var->name)
+                                                   error_loc("unnamed fields are not allowed\n");
+                                               ;}
     break;
 
   case 323:
 
 /* Line 1455 of yacc.c  */
-#line 1043 "parser.y"
-    { (yyval.declarator_list) = append_declarator( (yyvsp[(1) - (3)].declarator_list), (yyvsp[(3) - (3)].declarator) ); ;}
+#line 1042 "parser.y"
+    { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[(1) - (1)].declarator) ); ;}
     break;
 
   case 324:
 
 /* Line 1455 of yacc.c  */
-#line 1047 "parser.y"
-    { (yyval.declarator) = (yyvsp[(1) - (1)].declarator); ;}
+#line 1044 "parser.y"
+    { (yyval.declarator_list) = append_declarator( (yyvsp[(1) - (3)].declarator_list), (yyvsp[(3) - (3)].declarator) ); ;}
     break;
 
   case 325:
 
 /* Line 1455 of yacc.c  */
 #line 1048 "parser.y"
-    { (yyval.declarator) = (yyvsp[(1) - (3)].declarator); (yyvsp[(1) - (3)].declarator)->var->eval = (yyvsp[(3) - (3)].expr); ;}
+    { (yyval.declarator) = (yyvsp[(1) - (1)].declarator); ;}
     break;
 
   case 326:
 
 /* Line 1455 of yacc.c  */
-#line 1052 "parser.y"
-    { (yyval.num) = RPC_FC_RP; ;}
+#line 1049 "parser.y"
+    { (yyval.declarator) = (yyvsp[(1) - (3)].declarator); (yyvsp[(1) - (3)].declarator)->var->eval = (yyvsp[(3) - (3)].expr); ;}
     break;
 
   case 327:
 
 /* Line 1455 of yacc.c  */
 #line 1053 "parser.y"
-    { (yyval.num) = RPC_FC_UP; ;}
+    { (yyval.num) = RPC_FC_RP; ;}
     break;
 
   case 328:
 
 /* Line 1455 of yacc.c  */
 #line 1054 "parser.y"
-    { (yyval.num) = RPC_FC_FP; ;}
+    { (yyval.num) = RPC_FC_UP; ;}
     break;
 
   case 329:
 
 /* Line 1455 of yacc.c  */
-#line 1057 "parser.y"
-    { (yyval.type) = type_new_struct((yyvsp[(2) - (5)].str), TRUE, (yyvsp[(4) - (5)].var_list)); ;}
+#line 1055 "parser.y"
+    { (yyval.num) = RPC_FC_FP; ;}
     break;
 
   case 330:
 
 /* Line 1455 of yacc.c  */
-#line 1060 "parser.y"
-    { (yyval.type) = type_new_void(); ;}
+#line 1058 "parser.y"
+    { (yyval.type) = type_new_struct((yyvsp[(2) - (5)].str), TRUE, (yyvsp[(4) - (5)].var_list)); ;}
     break;
 
   case 331:
 
 /* Line 1455 of yacc.c  */
 #line 1061 "parser.y"
-    { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;}
+    { (yyval.type) = type_new_void(); ;}
     break;
 
   case 332:
 
 /* Line 1455 of yacc.c  */
 #line 1062 "parser.y"
-    { (yyval.type) = (yyvsp[(1) - (1)].type); ;}
+    { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;}
     break;
 
   case 333:
@@ -4961,85 +4952,92 @@ yyreduce:
 
 /* Line 1455 of yacc.c  */
 #line 1064 "parser.y"
-    { (yyval.type) = type_new_enum((yyvsp[(2) - (2)].str), FALSE, NULL); ;}
+    { (yyval.type) = (yyvsp[(1) - (1)].type); ;}
     break;
 
   case 335:
 
 /* Line 1455 of yacc.c  */
 #line 1065 "parser.y"
-    { (yyval.type) = (yyvsp[(1) - (1)].type); ;}
+    { (yyval.type) = type_new_enum((yyvsp[(2) - (2)].str), FALSE, NULL); ;}
     break;
 
   case 336:
 
 /* Line 1455 of yacc.c  */
 #line 1066 "parser.y"
-    { (yyval.type) = type_new_struct((yyvsp[(2) - (2)].str), FALSE, NULL); ;}
+    { (yyval.type) = (yyvsp[(1) - (1)].type); ;}
     break;
 
   case 337:
 
 /* Line 1455 of yacc.c  */
 #line 1067 "parser.y"
-    { (yyval.type) = (yyvsp[(1) - (1)].type); ;}
+    { (yyval.type) = type_new_struct((yyvsp[(2) - (2)].str), FALSE, NULL); ;}
     break;
 
   case 338:
 
 /* Line 1455 of yacc.c  */
 #line 1068 "parser.y"
-    { (yyval.type) = type_new_nonencapsulated_union((yyvsp[(2) - (2)].str), FALSE, NULL); ;}
+    { (yyval.type) = (yyvsp[(1) - (1)].type); ;}
     break;
 
   case 339:
 
 /* Line 1455 of yacc.c  */
 #line 1069 "parser.y"
-    { (yyval.type) = make_safearray((yyvsp[(3) - (4)].type)); ;}
+    { (yyval.type) = type_new_nonencapsulated_union((yyvsp[(2) - (2)].str), FALSE, NULL); ;}
     break;
 
   case 340:
 
 /* Line 1455 of yacc.c  */
-#line 1073 "parser.y"
+#line 1070 "parser.y"
+    { (yyval.type) = make_safearray((yyvsp[(3) - (4)].type)); ;}
+    break;
+
+  case 341:
+
+/* Line 1455 of yacc.c  */
+#line 1074 "parser.y"
     { reg_typedefs((yyvsp[(3) - (4)].declspec), (yyvsp[(4) - (4)].declarator_list), check_typedef_attrs((yyvsp[(2) - (4)].attr_list)));
                                                  (yyval.statement) = make_statement_typedef((yyvsp[(4) - (4)].declarator_list));
                                                ;}
     break;
 
-  case 341:
+  case 342:
 
 /* Line 1455 of yacc.c  */
-#line 1079 "parser.y"
+#line 1080 "parser.y"
     { (yyval.type) = type_new_nonencapsulated_union((yyvsp[(2) - (5)].str), TRUE, (yyvsp[(4) - (5)].var_list)); ;}
     break;
 
-  case 342:
+  case 343:
 
 /* Line 1455 of yacc.c  */
-#line 1082 "parser.y"
+#line 1083 "parser.y"
     { (yyval.type) = type_new_encapsulated_union((yyvsp[(2) - (10)].str), (yyvsp[(5) - (10)].var), (yyvsp[(7) - (10)].var), (yyvsp[(9) - (10)].var_list)); ;}
     break;
 
-  case 343:
+  case 344:
 
 /* Line 1455 of yacc.c  */
-#line 1086 "parser.y"
+#line 1087 "parser.y"
     { (yyval.num) = MAKEVERSION((yyvsp[(1) - (1)].num), 0); ;}
     break;
 
-  case 344:
+  case 345:
 
 /* Line 1455 of yacc.c  */
-#line 1087 "parser.y"
+#line 1088 "parser.y"
     { (yyval.num) = MAKEVERSION((yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num)); ;}
     break;
 
 
 
 /* Line 1455 of yacc.c  */
-#line 5043 "parser.tab.c"
+#line 5041 "parser.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -5251,7 +5249,7 @@ yyreturn:
 
 
 /* Line 1675 of yacc.c  */
-#line 1090 "parser.y"
+#line 1091 "parser.y"
 
 
 static void decl_builtin_basic(const char *name, enum type_basic_type type)
@@ -6425,7 +6423,6 @@ static int is_allowed_conf_type(const type_t *type)
         case TYPE_BASIC_HYPER:
         case TYPE_BASIC_BYTE:
         case TYPE_BASIC_WCHAR:
-        case TYPE_BASIC_ERROR_STATUS_T:
             return TRUE;
         default:
             return FALSE;
@@ -6512,6 +6509,7 @@ static void check_field_common(const type_t *container_type,
     default:
         /* should be no other container types */
         assert(0);
+        return;
     }
 
     if (is_attr(arg->attrs, ATTR_LENGTHIS) &&
index 73f6993..1266e12 100644 (file)
      aDOUBLE = 262,
      aSTRING = 263,
      aWSTRING = 264,
-     aUUID = 265,
-     aEOF = 266,
-     SHL = 267,
-     SHR = 268,
-     MEMBERPTR = 269,
-     EQUALITY = 270,
-     INEQUALITY = 271,
-     GREATEREQUAL = 272,
-     LESSEQUAL = 273,
-     LOGICALOR = 274,
-     LOGICALAND = 275,
-     ELLIPSIS = 276,
-     tAGGREGATABLE = 277,
-     tALLOCATE = 278,
-     tANNOTATION = 279,
-     tAPPOBJECT = 280,
-     tASYNC = 281,
-     tASYNCUUID = 282,
-     tAUTOHANDLE = 283,
-     tBINDABLE = 284,
-     tBOOLEAN = 285,
-     tBROADCAST = 286,
-     tBYTE = 287,
-     tBYTECOUNT = 288,
-     tCALLAS = 289,
-     tCALLBACK = 290,
-     tCASE = 291,
-     tCDECL = 292,
-     tCHAR = 293,
-     tCOCLASS = 294,
-     tCODE = 295,
-     tCOMMSTATUS = 296,
-     tCONST = 297,
-     tCONTEXTHANDLE = 298,
-     tCONTEXTHANDLENOSERIALIZE = 299,
-     tCONTEXTHANDLESERIALIZE = 300,
-     tCONTROL = 301,
-     tCPPQUOTE = 302,
-     tDEFAULT = 303,
-     tDEFAULTCOLLELEM = 304,
-     tDEFAULTVALUE = 305,
-     tDEFAULTVTABLE = 306,
-     tDISPLAYBIND = 307,
-     tDISPINTERFACE = 308,
-     tDLLNAME = 309,
-     tDOUBLE = 310,
-     tDUAL = 311,
-     tENDPOINT = 312,
-     tENTRY = 313,
-     tENUM = 314,
-     tERRORSTATUST = 315,
-     tEXPLICITHANDLE = 316,
-     tEXTERN = 317,
-     tFALSE = 318,
-     tFASTCALL = 319,
-     tFLOAT = 320,
-     tHANDLE = 321,
-     tHANDLET = 322,
-     tHELPCONTEXT = 323,
-     tHELPFILE = 324,
-     tHELPSTRING = 325,
-     tHELPSTRINGCONTEXT = 326,
-     tHELPSTRINGDLL = 327,
-     tHIDDEN = 328,
-     tHYPER = 329,
-     tID = 330,
-     tIDEMPOTENT = 331,
-     tIIDIS = 332,
-     tIMMEDIATEBIND = 333,
-     tIMPLICITHANDLE = 334,
-     tIMPORT = 335,
-     tIMPORTLIB = 336,
-     tIN = 337,
-     tIN_LINE = 338,
-     tINLINE = 339,
-     tINPUTSYNC = 340,
-     tINT = 341,
-     tINT3264 = 342,
-     tINT64 = 343,
-     tINTERFACE = 344,
-     tLCID = 345,
-     tLENGTHIS = 346,
-     tLIBRARY = 347,
-     tLOCAL = 348,
-     tLONG = 349,
-     tMETHODS = 350,
-     tMODULE = 351,
-     tNONBROWSABLE = 352,
-     tNONCREATABLE = 353,
-     tNONEXTENSIBLE = 354,
-     tNULL = 355,
-     tOBJECT = 356,
-     tODL = 357,
-     tOLEAUTOMATION = 358,
-     tOPTIONAL = 359,
-     tOUT = 360,
-     tPASCAL = 361,
-     tPOINTERDEFAULT = 362,
-     tPROPERTIES = 363,
-     tPROPGET = 364,
-     tPROPPUT = 365,
-     tPROPPUTREF = 366,
-     tPTR = 367,
-     tPUBLIC = 368,
-     tRANGE = 369,
-     tREADONLY = 370,
-     tREF = 371,
-     tREGISTER = 372,
-     tREQUESTEDIT = 373,
-     tRESTRICTED = 374,
-     tRETVAL = 375,
-     tSAFEARRAY = 376,
-     tSHORT = 377,
-     tSIGNED = 378,
-     tSIZEIS = 379,
-     tSIZEOF = 380,
-     tSMALL = 381,
-     tSOURCE = 382,
-     tSTATIC = 383,
-     tSTDCALL = 384,
-     tSTRICTCONTEXTHANDLE = 385,
-     tSTRING = 386,
-     tSTRUCT = 387,
-     tSWITCH = 388,
-     tSWITCHIS = 389,
-     tSWITCHTYPE = 390,
-     tTRANSMITAS = 391,
-     tTRUE = 392,
-     tTYPEDEF = 393,
-     tUNION = 394,
-     tUNIQUE = 395,
-     tUNSIGNED = 396,
-     tUUID = 397,
-     tV1ENUM = 398,
-     tVARARG = 399,
-     tVERSION = 400,
-     tVOID = 401,
-     tWCHAR = 402,
-     tWIREMARSHAL = 403,
-     ADDRESSOF = 404,
-     NEG = 405,
-     POS = 406,
-     PPTR = 407,
-     CAST = 408
+     aSQSTRING = 265,
+     aUUID = 266,
+     aEOF = 267,
+     SHL = 268,
+     SHR = 269,
+     MEMBERPTR = 270,
+     EQUALITY = 271,
+     INEQUALITY = 272,
+     GREATEREQUAL = 273,
+     LESSEQUAL = 274,
+     LOGICALOR = 275,
+     LOGICALAND = 276,
+     ELLIPSIS = 277,
+     tAGGREGATABLE = 278,
+     tALLOCATE = 279,
+     tANNOTATION = 280,
+     tAPPOBJECT = 281,
+     tASYNC = 282,
+     tASYNCUUID = 283,
+     tAUTOHANDLE = 284,
+     tBINDABLE = 285,
+     tBOOLEAN = 286,
+     tBROADCAST = 287,
+     tBYTE = 288,
+     tBYTECOUNT = 289,
+     tCALLAS = 290,
+     tCALLBACK = 291,
+     tCASE = 292,
+     tCDECL = 293,
+     tCHAR = 294,
+     tCOCLASS = 295,
+     tCODE = 296,
+     tCOMMSTATUS = 297,
+     tCONST = 298,
+     tCONTEXTHANDLE = 299,
+     tCONTEXTHANDLENOSERIALIZE = 300,
+     tCONTEXTHANDLESERIALIZE = 301,
+     tCONTROL = 302,
+     tCPPQUOTE = 303,
+     tDEFAULT = 304,
+     tDEFAULTCOLLELEM = 305,
+     tDEFAULTVALUE = 306,
+     tDEFAULTVTABLE = 307,
+     tDISPLAYBIND = 308,
+     tDISPINTERFACE = 309,
+     tDLLNAME = 310,
+     tDOUBLE = 311,
+     tDUAL = 312,
+     tENDPOINT = 313,
+     tENTRY = 314,
+     tENUM = 315,
+     tERRORSTATUST = 316,
+     tEXPLICITHANDLE = 317,
+     tEXTERN = 318,
+     tFALSE = 319,
+     tFASTCALL = 320,
+     tFLOAT = 321,
+     tHANDLE = 322,
+     tHANDLET = 323,
+     tHELPCONTEXT = 324,
+     tHELPFILE = 325,
+     tHELPSTRING = 326,
+     tHELPSTRINGCONTEXT = 327,
+     tHELPSTRINGDLL = 328,
+     tHIDDEN = 329,
+     tHYPER = 330,
+     tID = 331,
+     tIDEMPOTENT = 332,
+     tIIDIS = 333,
+     tIMMEDIATEBIND = 334,
+     tIMPLICITHANDLE = 335,
+     tIMPORT = 336,
+     tIMPORTLIB = 337,
+     tIN = 338,
+     tIN_LINE = 339,
+     tINLINE = 340,
+     tINPUTSYNC = 341,
+     tINT = 342,
+     tINT3264 = 343,
+     tINT64 = 344,
+     tINTERFACE = 345,
+     tLCID = 346,
+     tLENGTHIS = 347,
+     tLIBRARY = 348,
+     tLOCAL = 349,
+     tLONG = 350,
+     tMETHODS = 351,
+     tMODULE = 352,
+     tNONBROWSABLE = 353,
+     tNONCREATABLE = 354,
+     tNONEXTENSIBLE = 355,
+     tNULL = 356,
+     tOBJECT = 357,
+     tODL = 358,
+     tOLEAUTOMATION = 359,
+     tOPTIONAL = 360,
+     tOUT = 361,
+     tPASCAL = 362,
+     tPOINTERDEFAULT = 363,
+     tPROPERTIES = 364,
+     tPROPGET = 365,
+     tPROPPUT = 366,
+     tPROPPUTREF = 367,
+     tPTR = 368,
+     tPUBLIC = 369,
+     tRANGE = 370,
+     tREADONLY = 371,
+     tREF = 372,
+     tREGISTER = 373,
+     tREQUESTEDIT = 374,
+     tRESTRICTED = 375,
+     tRETVAL = 376,
+     tSAFEARRAY = 377,
+     tSHORT = 378,
+     tSIGNED = 379,
+     tSIZEIS = 380,
+     tSIZEOF = 381,
+     tSMALL = 382,
+     tSOURCE = 383,
+     tSTATIC = 384,
+     tSTDCALL = 385,
+     tSTRICTCONTEXTHANDLE = 386,
+     tSTRING = 387,
+     tSTRUCT = 388,
+     tSWITCH = 389,
+     tSWITCHIS = 390,
+     tSWITCHTYPE = 391,
+     tTRANSMITAS = 392,
+     tTRUE = 393,
+     tTYPEDEF = 394,
+     tUNION = 395,
+     tUNIQUE = 396,
+     tUNSIGNED = 397,
+     tUUID = 398,
+     tV1ENUM = 399,
+     tVARARG = 400,
+     tVERSION = 401,
+     tVOID = 402,
+     tWCHAR = 403,
+     tWIREMARSHAL = 404,
+     ADDRESSOF = 405,
+     NEG = 406,
+     POS = 407,
+     PPTR = 408,
+     CAST = 409
    };
 #endif
 
@@ -232,7 +233,7 @@ typedef union YYSTYPE
 
 
 /* Line 1676 of yacc.c  */
-#line 236 "parser.tab.h"
+#line 237 "parser.tab.h"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
index de44ab5..8a23a82 100644 (file)
@@ -186,7 +186,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
 %token <str> aKNOWNTYPE
 %token <num> aNUM aHEXNUM
 %token <dbl> aDOUBLE
-%token <str> aSTRING aWSTRING
+%token <str> aSTRING aWSTRING aSQSTRING
 %token <uuid> aUUID
 %token aEOF
 %token SHL SHR
@@ -632,6 +632,7 @@ expr:         aNUM                                  { $$ = make_exprl(EXPR_NUM, $1); }
        | tTRUE                                 { $$ = make_exprl(EXPR_TRUEFALSE, 1); }
        | aSTRING                               { $$ = make_exprs(EXPR_STRLIT, $1); }
        | aWSTRING                              { $$ = make_exprs(EXPR_WSTRLIT, $1); }
+       | aSQSTRING                             { $$ = make_exprs(EXPR_CHARCONST, $1); }
        | aIDENTIFIER                           { $$ = make_exprs(EXPR_IDENTIFIER, $1); }
        | expr '?' expr ':' expr                { $$ = make_expr3(EXPR_COND, $1, $3, $5); }
        | expr LOGICALOR expr                   { $$ = make_expr2(EXPR_LOGOR, $1, $3); }
@@ -841,7 +842,7 @@ dispinterfacedef: dispinterfacehdr '{'
        ;
 
 inherit:                                       { $$ = NULL; }
-       | ':' aKNOWNTYPE                        { $$ = find_type_or_error2($2, 0); }
+       | ':' aKNOWNTYPE                        { $$ = find_type_or_error2($2, 0); is_object_interface = 1; }
        ;
 
 interface: tINTERFACE aIDENTIFIER              { $$ = get_type(TYPE_INTERFACE, $2, 0); }
@@ -852,9 +853,9 @@ interfacehdr: attributes interface          { $$.interface = $2;
                                                  $$.old_pointer_default = pointer_default;
                                                  if (is_attr($1, ATTR_POINTERDEFAULT))
                                                    pointer_default = get_attrv($1, ATTR_POINTERDEFAULT);
-                                                 is_object_interface = is_object($1);
                                                  check_def($2);
                                                  $2->attrs = check_iface_attrs($2->name, $1);
+                                                 is_object_interface = is_object($2);
                                                  $2->defined = TRUE;
                                                }
        ;
@@ -1033,7 +1034,7 @@ m_bitfield:                                       { $$ = NULL; }
 
 struct_declarator: any_declarator m_bitfield   { $$ = $1; $$->bits = $2;
                                                  if (!$$->bits && !$$->var->name)
-                                                   error_loc("unnamed fields are not allowed");
+                                                   error_loc("unnamed fields are not allowed\n");
                                                }
        ;
 
@@ -2260,7 +2261,6 @@ static int is_allowed_conf_type(const type_t *type)
         case TYPE_BASIC_HYPER:
         case TYPE_BASIC_BYTE:
         case TYPE_BASIC_WCHAR:
-        case TYPE_BASIC_ERROR_STATUS_T:
             return TRUE;
         default:
             return FALSE;
@@ -2347,6 +2347,7 @@ static void check_field_common(const type_t *container_type,
     default:
         /* should be no other container types */
         assert(0);
+        return;
     }
 
     if (is_attr(arg->attrs, ATTR_LENGTHIS) &&
index 9cb425c..2bf33f6 100644 (file)
@@ -301,26 +301,26 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 33
-#define YY_END_OF_BUFFER 34
-static yyconst short int yy_accept[142] =
+#define YY_NUM_RULES 36
+#define YY_END_OF_BUFFER 37
+static yyconst short int yy_accept[148] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    2,    2,
-       34,   32,   21,   20,   32,    3,   32,   32,   32,   16,
-       16,   32,   32,   32,   19,   19,   19,   11,   32,   21,
-        1,   10,   33,    4,   10,    6,   16,   16,   13,   13,
-       13,   12,    2,   26,   30,   24,    0,    0,   16,   16,
-       16,    0,   22,   28,   25,   27,   23,   19,    5,   19,
-       29,    0,    1,    1,    9,    8,    7,   16,    0,   13,
-       13,    2,   31,   17,   16,   16,   15,   19,   16,    0,
-       13,    0,   15,   15,   19,   16,    0,   13,    0,   17,
-       15,   15,   19,   16,    0,   13,   19,   16,    0,   13,
-
-       19,   16,    0,   13,   19,   16,    0,   13,   19,    0,
-       16,    0,   18,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   37,   35,   24,   23,   35,    3,   35,    7,
+       35,   35,   19,   19,   35,   35,   35,   22,   22,   22,
+       14,   35,   24,    1,   13,   36,    4,   13,    6,   19,
+       19,   16,   16,   16,   15,    2,    8,   13,   29,   33,
+       27,    0,    0,   19,   19,   19,    0,   25,   31,   28,
+       30,   26,   22,    5,   22,   32,    0,    1,    1,   12,
+       10,    9,   19,    0,   16,   16,    2,   11,   34,   20,
+       19,   19,   18,   22,   19,    0,   16,    0,   18,   18,
+       22,   19,    0,   16,    0,   20,   18,   18,   22,   19,
+
+        0,   16,   22,   19,    0,   16,   22,   19,    0,   16,
+       22,   19,    0,   16,   22,    0,   19,    0,   21,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   14,
-        0
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   17,    0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -328,17 +328,17 @@ static yyconst int yy_ec[256] =
         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
         1,    2,    2,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    2,    4,    5,    6,    1,    1,    7,    1,    8,
-        1,    1,    9,    1,   10,   11,    1,   12,   13,   13,
-       13,   13,   13,   13,   13,   13,   13,    1,    1,   14,
-       15,   16,    1,    1,   17,   18,   18,   18,   19,   20,
-       21,   21,   21,   21,   21,   22,   21,   21,   21,   21,
-       21,   23,   24,   21,   25,   21,   21,   26,   27,   21,
-       28,   29,   30,    1,   21,    1,   18,   18,   18,   18,
-
-       31,   18,   21,   21,   21,   21,   21,   32,   21,   21,
-       21,   21,   21,   21,   21,   21,   33,   21,   21,   34,
-       21,   21,    1,   35,    1,    1,    1,    1,    1,    1,
+        1,    2,    4,    5,    6,    1,    1,    7,    8,    9,
+        1,    1,   10,    1,   11,   12,    1,   13,   14,   14,
+       14,   14,   14,   14,   14,   14,   14,    1,    1,   15,
+       16,   17,    1,    1,   18,   19,   19,   19,   20,   21,
+       22,   22,   22,   22,   22,   23,   22,   22,   22,   22,
+       22,   24,   25,   22,   26,   22,   22,   27,   28,   22,
+       29,   30,   31,    1,   22,    1,   19,   19,   19,   19,
+
+       32,   19,   22,   22,   22,   22,   22,   33,   22,   22,
+       22,   22,   22,   22,   22,   22,   34,   22,   22,   35,
+       22,   22,    1,   36,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -355,182 +355,182 @@ static yyconst int yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static yyconst int yy_meta[36] =
+static yyconst int yy_meta[37] =
     {   0,
         1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
-        1,    3,    3,    1,    1,    1,    3,    3,    3,    3,
-        4,    4,    4,    4,    4,    4,    4,    1,    1,    1,
-        3,    4,    4,    4,    1
+        1,    1,    3,    3,    1,    1,    1,    3,    3,    3,
+        3,    4,    4,    4,    4,    4,    4,    4,    1,    1,
+        1,    3,    4,    4,    4,    1
     } ;
 
-static yyconst short int yy_base[178] =
+static yyconst short int yy_base[184] =
     {   0,
-        0,   34,   34,   38,   39,   42,   71,   44,  270,  269,
-      271,  491,  491,  491,  255,  491,  258,  248,  252,   96,
-       22,   37,  242,   38,    0,  251,  238,  491,  219,   53,
-      251,  491,  491,  491,   33,  491,  119,   23,  142,  165,
-      246,  491,    0,  491,  491,  491,  239,   48,    0,   33,
-       88,    0,  491,  491,  491,  491,  491,    0,  491,  228,
-      491,   63,  241,  240,  491,  491,  491,  185,    0,  207,
-        0,    0,  491,  104,  491,  491,  124,  222,  227,    0,
-      249,  102,   94,  102,  220,  269,    0,  291,  113,  168,
-      491,  491,  213,  311,    0,  333,  212,  353,    0,  375,
-
-      217,  395,    0,  417,  206,  439,  222,  221,   62,    0,
-      220,  140,  491,    0,    0,    0,  219,    0,    0,    0,
-        0,  218,    0,    0,    0,    0,  213,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  491,
-      491,  472,  476,  478,  482,  486,  219,  218,  212,  211,
-      210,  209,  208,  206,  205,  203,  198,  197,  192,  191,
-      190,  189,  188,  187,  186,  185,  183,  176,  169,  168,
-      167,  155,  144,  140,  137,  130,  110
+        0,   35,   35,   39,   40,   43,   61,   45,  262,  261,
+       46,   47,  263,  481,  481,  481,  246,  481,  254,  481,
+      243,  243,   85,   25,   41,  238,   42,    0,  248,  229,
+      481,  210,   60,  243,  481,  481,  481,   34,  481,  108,
+       26,  131,  154,  239,  481,    0,  481,   60,  481,  481,
+      481,  231,   58,    0,   75,   77,    0,  481,  481,  481,
+      481,  481,    0,  481,  220,  481,   61,  238,  236,  481,
+      481,  481,  174,    0,  196,    0,    0,  481,  481,   93,
+      481,  481,  113,  213,  216,    0,  238,  166,   89,   81,
+      214,  258,    0,  280,   89,  169,  481,  481,  207,  300,
+
+        0,  322,  203,  342,    0,  364,  208,  384,    0,  406,
+      197,  428,  213,  212,  115,    0,  211,  128,  481,    0,
+        0,    0,  210,    0,    0,    0,    0,  209,    0,    0,
+        0,    0,  208,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  481,  481,  462,  466,  468,
+      472,  476,  215,  210,  209,  208,  202,  201,  200,  199,
+      196,  195,  193,  188,  187,  182,  181,  178,  175,  168,
+      167,  166,  159,  158,  157,  145,  135,  130,  129,  113,
+      102,   88,   75
     } ;
 
-static yyconst short int yy_def[178] =
+static yyconst short int yy_def[184] =
     {   0,
-      141,    1,  142,  142,  142,  142,  141,    7,  143,  143,
-      141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-       20,  141,  141,  141,  144,  144,  144,  141,  141,  141,
-      141,  141,  141,  141,  145,  141,  141,   37,  141,   39,
-       40,  141,  146,  141,  141,  141,  141,  141,   21,  141,
-      141,  147,  141,  141,  141,  141,  141,  144,  141,  144,
-      141,  141,  141,  141,  141,  141,  141,  141,  148,   40,
-       40,  146,  141,  141,  141,  141,  147,  144,  141,  149,
-       40,  141,  141,  141,  144,  141,  150,   40,  141,  141,
-      141,  141,  144,  141,  151,   40,  144,  141,  152,   40,
-
-      144,  141,  153,   40,  144,  141,  141,   40,  144,  154,
-      106,  141,  141,  155,  156,  157,  141,  158,  159,  160,
-      161,  141,  162,  163,  164,  165,  141,  166,  167,  168,
-      169,  170,  171,  172,  173,  174,  175,  176,  177,  141,
-        0,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-      141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-      141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-      141,  141,  141,  141,  141,  141,  141
+      147,    1,  148,  148,  148,  148,    1,    7,  149,  149,
+      148,  148,  147,  147,  147,  147,  147,  147,  147,  147,
+      147,  147,  147,   23,  147,  147,  147,  150,  150,  150,
+      147,  147,  147,  147,  147,  147,  147,  151,  147,  147,
+       40,  147,   42,   43,  147,  152,  147,  151,  147,  147,
+      147,  147,  147,   24,  147,  147,  153,  147,  147,  147,
+      147,  147,  150,  147,  150,  147,  147,  147,  147,  147,
+      147,  147,  147,  154,   43,   43,  152,  147,  147,  147,
+      147,  147,  153,  150,  147,  155,   43,  147,  147,  147,
+      150,  147,  156,   43,  147,  147,  147,  147,  150,  147,
+
+      157,   43,  150,  147,  158,   43,  150,  147,  159,   43,
+      150,  147,  147,   43,  150,  160,  112,  147,  147,  161,
+      162,  163,  147,  164,  165,  166,  167,  147,  168,  169,
+      170,  171,  147,  172,  173,  174,  175,  176,  177,  178,
+      179,  180,  181,  182,  183,  147,    0,  147,  147,  147,
+      147,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+      147,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+      147,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+      147,  147,  147
     } ;
 
-static yyconst short int yy_nxt[527] =
+static yyconst short int yy_nxt[518] =
     {   0,
-       12,   13,   14,   15,   16,   12,   17,   12,   12,   18,
-       19,   20,   21,   22,   23,   24,   25,   25,   25,   25,
-       25,   26,   25,   27,   25,   25,   25,   28,   12,   12,
-       25,   25,   25,   25,   29,   30,   33,   66,   34,   31,
-       33,   33,   34,   36,   33,   30,   36,  141,  141,   31,
-       53,   54,   56,   57,   62,  141,  141,   75,   63,   74,
-       74,   67,   35,  112,   62,   75,   35,   35,   63,  113,
-       35,   12,   13,   14,   15,   16,   12,   17,   12,   12,
-       18,   19,   37,   38,   22,   23,   24,   39,   39,   39,
-       39,   40,   41,   40,   40,   40,   40,   40,   28,   12,
-
-       42,   39,   40,   40,   40,   29,   48,   49,   49,   76,
-       89,   89,  140,   90,   90,   74,   74,   50,   91,   76,
-       51,   52,   82,   92,   90,   90,   91,   50,   51,   52,
-       68,   68,  139,   92,   82,   69,   69,   69,   69,  138,
-       50,  112,  137,   51,   52,   83,  136,  113,   84,   69,
-       50,   51,   52,   70,   70,   83,   84,  135,   70,   70,
-       70,   70,   71,   71,   71,   71,   71,   71,   71,  134,
-      133,  132,   70,   71,   71,   71,   71,   71,  131,   90,
-       90,   71,   71,   71,   71,  130,   82,  129,  127,  126,
-      125,  124,  122,  121,  120,   71,   79,   79,   82,  119,
-
-      117,   80,   80,   80,   80,  116,   50,  115,  114,   51,
-      107,  103,   99,   95,   87,   80,   50,   51,   81,   81,
-       80,   77,  128,   81,   81,   81,   81,  123,  118,  141,
-      110,  110,  109,  105,  101,   97,   93,   81,   86,   86,
-       85,   64,   64,   87,   87,   87,   87,   78,   50,   73,
-       59,   51,   64,   61,   60,   59,   55,   87,   50,   51,
-       88,   88,   47,   46,   45,   88,   88,   88,   88,   44,
-      141,   33,   33,  141,  141,  141,  141,  141,  141,   88,
-       94,   94,  141,  141,  141,   95,   95,   95,   95,  141,
-       50,  141,  141,   51,  141,  141,  141,  141,  141,   95,
-
-       50,   51,   96,   96,  141,  141,  141,   96,   96,   96,
-       96,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-      141,   96,   98,   98,  141,  141,  141,   99,   99,   99,
-       99,  141,   50,  141,  141,   51,  141,  141,  141,  141,
-      141,   99,   50,   51,  100,  100,  141,  141,  141,  100,
-      100,  100,  100,  141,  141,  141,  141,  141,  141,  141,
-      141,  141,  141,  100,  102,  102,  141,  141,  141,  103,
-      103,  103,  103,  141,   50,  141,  141,   51,  141,  141,
-      141,  141,  141,  103,   50,   51,  104,  104,  141,  141,
-      141,  104,  104,  104,  104,  141,  141,  141,  141,  141,
-
-      141,  141,  141,  141,  141,  104,  106,  106,  141,  141,
-      141,  107,  107,  107,  107,  141,   50,  141,  141,   51,
-      141,  141,  141,  141,  141,  107,   50,   51,  108,  108,
-      141,  141,  141,  108,  108,  108,  108,  141,  141,  141,
-      141,  141,  141,  141,  141,  141,  141,  108,  110,  141,
-      111,  111,  141,  141,  141,  141,  141,  141,  141,  141,
-       50,  141,  141,   51,  141,  141,  141,  141,  141,  141,
-       50,   51,   32,   32,   32,   32,   43,   43,   43,   43,
-       58,   58,   65,  141,   65,   65,   72,  141,   72,   72,
-       11,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-
-      141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-      141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-      141,  141,  141,  141,  141,  141
+       14,   15,   16,   17,   18,   14,   19,   20,   14,   14,
+       21,   22,   23,   24,   25,   26,   27,   28,   28,   28,
+       28,   28,   29,   28,   30,   28,   28,   28,   31,   14,
+       14,   28,   28,   28,   28,   32,   33,   36,   71,   37,
+       34,   36,   36,   37,   39,   36,   33,   39,   36,   36,
+       34,  147,  147,   47,   47,   58,   59,   61,   62,  147,
+      147,   67,   67,   72,   38,   68,   68,   78,   38,   38,
+       80,   80,   38,   40,   41,   48,   48,  146,   42,   42,
+       42,   42,   43,   44,   43,   43,   43,   43,   43,   72,
+      145,   45,   42,   43,   43,   43,   53,   54,   54,   82,
+
+       81,   96,   96,   98,  144,   80,   80,   55,   81,   82,
+       56,   57,   88,   98,   97,  143,  118,   55,   56,   57,
+       73,   73,   97,  119,   88,   74,   74,   74,   74,  118,
+       55,  142,  141,   56,   57,   89,  119,  140,   90,   74,
+       55,   56,   57,   75,   75,   89,   90,  139,   75,   75,
+       75,   75,   76,   76,   76,   76,   76,   76,   76,  138,
+      137,  136,   75,   76,   76,   76,   76,   76,  135,  133,
+      132,   76,   76,   76,   76,   95,   95,  131,   96,   96,
+      130,   96,   96,  128,  127,   76,   85,   85,   88,  126,
+      125,   86,   86,   86,   86,  123,   55,  122,  121,   56,
+
+       88,  120,  113,  109,  105,   86,   55,   56,   87,   87,
+      101,   93,   86,   87,   87,   87,   87,   83,  134,  129,
+      124,  147,  116,  116,  115,  111,  107,   87,   92,   92,
+      103,   99,   91,   93,   93,   93,   93,   69,   55,   69,
+       84,   56,   79,   64,   69,   66,   65,   93,   55,   56,
+       94,   94,   64,   60,   52,   94,   94,   94,   94,   51,
+       50,   49,  147,   36,   36,  147,  147,  147,  147,   94,
+      100,  100,  147,  147,  147,  101,  101,  101,  101,  147,
+       55,  147,  147,   56,  147,  147,  147,  147,  147,  101,
+       55,   56,  102,  102,  147,  147,  147,  102,  102,  102,
+
+      102,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+      147,  102,  104,  104,  147,  147,  147,  105,  105,  105,
+      105,  147,   55,  147,  147,   56,  147,  147,  147,  147,
+      147,  105,   55,   56,  106,  106,  147,  147,  147,  106,
+      106,  106,  106,  147,  147,  147,  147,  147,  147,  147,
+      147,  147,  147,  106,  108,  108,  147,  147,  147,  109,
+      109,  109,  109,  147,   55,  147,  147,   56,  147,  147,
+      147,  147,  147,  109,   55,   56,  110,  110,  147,  147,
+      147,  110,  110,  110,  110,  147,  147,  147,  147,  147,
+      147,  147,  147,  147,  147,  110,  112,  112,  147,  147,
+
+      147,  113,  113,  113,  113,  147,   55,  147,  147,   56,
+      147,  147,  147,  147,  147,  113,   55,   56,  114,  114,
+      147,  147,  147,  114,  114,  114,  114,  147,  147,  147,
+      147,  147,  147,  147,  147,  147,  147,  114,  116,  147,
+      117,  117,  147,  147,  147,  147,  147,  147,  147,  147,
+       55,  147,  147,   56,  147,  147,  147,  147,  147,  147,
+       55,   56,   35,   35,   35,   35,   46,   46,   46,   46,
+       63,   63,   70,  147,   70,   70,   77,  147,   77,   77,
+       13,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+      147,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+
+      147,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+      147,  147,  147,  147,  147,  147,  147
     } ;
 
-static yyconst short int yy_chk[527] =
+static yyconst short int yy_chk[518] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    2,    3,   35,    3,    2,
-        4,    5,    4,    5,    6,    8,    6,   21,   38,    8,
-       22,   22,   24,   24,   30,   21,   38,   50,   30,   48,
-       48,   35,    3,  109,   62,   50,    4,    5,   62,  109,
-        6,    7,    7,    7,    7,    7,    7,    7,    7,    7,
-        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
-        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
-
-        7,    7,    7,    7,    7,    7,   20,   20,   20,   51,
-       82,   82,  177,   82,   82,   74,   74,   20,   83,   51,
-       20,   20,   74,   84,   89,   89,   83,   20,   20,   20,
-       37,   37,  176,   84,   74,   37,   37,   37,   37,  175,
-       37,  112,  174,   37,   37,   77,  173,  112,   77,   37,
-       37,   37,   37,   39,   39,   77,   77,  172,   39,   39,
-       39,   39,   39,   39,   39,   39,   39,   39,   39,  171,
-      170,  169,   39,   39,   39,   39,   40,   40,  168,   90,
-       90,   40,   40,   40,   40,  167,   90,  166,  165,  164,
-      163,  162,  161,  160,  159,   40,   68,   68,   90,  158,
-
-      157,   68,   68,   68,   68,  156,   68,  155,  154,   68,
-      153,  152,  151,  150,  149,   68,   68,   68,   70,   70,
-      148,  147,  127,   70,   70,   70,   70,  122,  117,  111,
-      108,  107,  105,  101,   97,   93,   85,   70,   79,   79,
-       78,   64,   63,   79,   79,   79,   79,   60,   79,   47,
-       41,   79,   31,   29,   27,   26,   23,   79,   79,   79,
-       81,   81,   19,   18,   17,   81,   81,   81,   81,   15,
-       11,   10,    9,    0,    0,    0,    0,    0,    0,   81,
-       86,   86,    0,    0,    0,   86,   86,   86,   86,    0,
-       86,    0,    0,   86,    0,    0,    0,    0,    0,   86,
-
-       86,   86,   88,   88,    0,    0,    0,   88,   88,   88,
-       88,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   88,   94,   94,    0,    0,    0,   94,   94,   94,
-       94,    0,   94,    0,    0,   94,    0,    0,    0,    0,
-        0,   94,   94,   94,   96,   96,    0,    0,    0,   96,
-       96,   96,   96,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   96,   98,   98,    0,    0,    0,   98,
-       98,   98,   98,    0,   98,    0,    0,   98,    0,    0,
-        0,    0,    0,   98,   98,   98,  100,  100,    0,    0,
-        0,  100,  100,  100,  100,    0,    0,    0,    0,    0,
-
-        0,    0,    0,    0,    0,  100,  102,  102,    0,    0,
-        0,  102,  102,  102,  102,    0,  102,    0,    0,  102,
-        0,    0,    0,    0,    0,  102,  102,  102,  104,  104,
-        0,    0,    0,  104,  104,  104,  104,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  104,  106,    0,
-      106,  106,    0,    0,    0,    0,    0,    0,    0,    0,
-      106,    0,    0,  106,    0,    0,    0,    0,    0,    0,
-      106,  106,  142,  142,  142,  142,  143,  143,  143,  143,
-      144,  144,  145,    0,  145,  145,  146,    0,  146,  146,
-      141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-
-      141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-      141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-      141,  141,  141,  141,  141,  141
+        1,    1,    1,    1,    1,    1,    2,    3,   38,    3,
+        2,    4,    5,    4,    5,    6,    8,    6,   11,   12,
+        8,   24,   41,   11,   12,   25,   25,   27,   27,   24,
+       41,   33,   67,   38,    3,   33,   67,   48,    4,    5,
+       53,   53,    6,    7,    7,   11,   12,  183,    7,    7,
+        7,    7,    7,    7,    7,    7,    7,    7,    7,   48,
+      182,    7,    7,    7,    7,    7,   23,   23,   23,   56,
+
+       55,   95,   95,   90,  181,   80,   80,   23,   55,   56,
+       23,   23,   80,   90,   89,  180,  115,   23,   23,   23,
+       40,   40,   89,  115,   80,   40,   40,   40,   40,  118,
+       40,  179,  178,   40,   40,   83,  118,  177,   83,   40,
+       40,   40,   40,   42,   42,   83,   83,  176,   42,   42,
+       42,   42,   42,   42,   42,   42,   42,   42,   42,  175,
+      174,  173,   42,   42,   42,   42,   43,   43,  172,  171,
+      170,   43,   43,   43,   43,   88,   88,  169,   88,   88,
+      168,   96,   96,  167,  166,   43,   73,   73,   96,  165,
+      164,   73,   73,   73,   73,  163,   73,  162,  161,   73,
+
+       96,  160,  159,  158,  157,   73,   73,   73,   75,   75,
+      156,  155,  154,   75,   75,   75,   75,  153,  133,  128,
+      123,  117,  114,  113,  111,  107,  103,   75,   85,   85,
+       99,   91,   84,   85,   85,   85,   85,   69,   85,   68,
+       65,   85,   52,   44,   34,   32,   30,   85,   85,   85,
+       87,   87,   29,   26,   22,   87,   87,   87,   87,   21,
+       19,   17,   13,   10,    9,    0,    0,    0,    0,   87,
+       92,   92,    0,    0,    0,   92,   92,   92,   92,    0,
+       92,    0,    0,   92,    0,    0,    0,    0,    0,   92,
+       92,   92,   94,   94,    0,    0,    0,   94,   94,   94,
+
+       94,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,   94,  100,  100,    0,    0,    0,  100,  100,  100,
+      100,    0,  100,    0,    0,  100,    0,    0,    0,    0,
+        0,  100,  100,  100,  102,  102,    0,    0,    0,  102,
+      102,  102,  102,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  102,  104,  104,    0,    0,    0,  104,
+      104,  104,  104,    0,  104,    0,    0,  104,    0,    0,
+        0,    0,    0,  104,  104,  104,  106,  106,    0,    0,
+        0,  106,  106,  106,  106,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  106,  108,  108,    0,    0,
+
+        0,  108,  108,  108,  108,    0,  108,    0,    0,  108,
+        0,    0,    0,    0,    0,  108,  108,  108,  110,  110,
+        0,    0,    0,  110,  110,  110,  110,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  110,  112,    0,
+      112,  112,    0,    0,    0,    0,    0,    0,    0,    0,
+      112,    0,    0,  112,    0,    0,    0,    0,    0,    0,
+      112,  112,  148,  148,  148,  148,  149,  149,  149,  149,
+      150,  150,  151,    0,  151,  151,  152,    0,  152,  152,
+      147,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+      147,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+
+      147,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+      147,  147,  147,  147,  147,  147,  147
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -578,7 +578,9 @@ char *yytext;
 
 #define PP_LINE 4
 
-#line 42 "parser.l"
+#define SQUOTE 5
+
+#line 43 "parser.l"
 
 #include "config.h"
 
@@ -603,8 +605,6 @@ char *yytext;
 
 #include "parser.tab.h"
 
-extern char *temp_name;
-
 static void addcchar(char c);
 static char *get_buffered_cstring(void);
 
@@ -816,7 +816,7 @@ YY_DECL
        register char *yy_cp, *yy_bp;
        register int yy_act;
 
-#line 127 "parser.l"
+#line 126 "parser.l"
 
 #line 822 "parser.yy.c"
 
@@ -870,13 +870,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 142 )
+                               if ( yy_current_state >= 148 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 491 );
+               while ( yy_base[yy_current_state] != 481 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -904,12 +904,12 @@ do_action:        /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 128 "parser.l"
+#line 127 "parser.l"
 yy_push_state(PP_LINE);
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 129 "parser.l"
+#line 128 "parser.l"
 {
                             int lineno;
                             char *cptr, *fname;
@@ -932,12 +932,12 @@ YY_RULE_SETUP
        YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 148 "parser.l"
+#line 147 "parser.l"
 yy_push_state(QUOTE); cbufidx = 0;
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 149 "parser.l"
+#line 148 "parser.l"
 {
                                yy_pop_state();
                                parser_lval.str = get_buffered_cstring();
@@ -946,12 +946,12 @@ YY_RULE_SETUP
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 154 "parser.l"
+#line 153 "parser.l"
 yy_push_state(WSTRQUOTE);
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 155 "parser.l"
+#line 154 "parser.l"
 {
                                yy_pop_state();
                                parser_lval.str = get_buffered_cstring();
@@ -959,145 +959,164 @@ YY_RULE_SETUP
                        }
        YY_BREAK
 case 7:
-#line 161 "parser.l"
+YY_RULE_SETUP
+#line 159 "parser.l"
+yy_push_state(SQUOTE); cbufidx = 0;
+       YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 161 "parser.l"
-addcchar(yytext[1]);
+#line 160 "parser.l"
+{
+                               yy_pop_state();
+                               parser_lval.str = get_buffered_cstring();
+                               return aSQSTRING;
+                       }
        YY_BREAK
 case 9:
+#line 166 "parser.l"
+case 10:
+YY_RULE_SETUP
+#line 166 "parser.l"
+addcchar(yytext[1]);
+       YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 167 "parser.l"
+addcchar(yytext[1]);
+       YY_BREAK
+case 12:
 YY_RULE_SETUP
-#line 162 "parser.l"
+#line 168 "parser.l"
 addcchar('\\'); addcchar(yytext[1]);
        YY_BREAK
-case 10:
+case 13:
 YY_RULE_SETUP
-#line 163 "parser.l"
+#line 169 "parser.l"
 addcchar(yytext[0]);
        YY_BREAK
-case 11:
+case 14:
 YY_RULE_SETUP
-#line 164 "parser.l"
+#line 170 "parser.l"
 yy_push_state(ATTR); return '[';
        YY_BREAK
-case 12:
+case 15:
 YY_RULE_SETUP
-#line 165 "parser.l"
+#line 171 "parser.l"
 yy_pop_state(); return ']';
        YY_BREAK
-case 13:
+case 16:
 YY_RULE_SETUP
-#line 166 "parser.l"
+#line 172 "parser.l"
 return attr_token(yytext);
        YY_BREAK
-case 14:
+case 17:
 YY_RULE_SETUP
-#line 167 "parser.l"
+#line 173 "parser.l"
 {
                                parser_lval.uuid = parse_uuid(yytext);
                                return aUUID;
                        }
        YY_BREAK
-case 15:
+case 18:
 YY_RULE_SETUP
-#line 171 "parser.l"
+#line 177 "parser.l"
 {
                                parser_lval.num = xstrtoul(yytext, NULL, 0);
                                return aHEXNUM;
                        }
        YY_BREAK
-case 16:
+case 19:
 YY_RULE_SETUP
-#line 175 "parser.l"
+#line 181 "parser.l"
 {
                                parser_lval.num = xstrtoul(yytext, NULL, 0);
                                return aNUM;
                        }
        YY_BREAK
-case 17:
+case 20:
 YY_RULE_SETUP
-#line 179 "parser.l"
+#line 185 "parser.l"
 {
                                parser_lval.dbl = strtod(yytext, NULL);
                                return aDOUBLE;
                        }
        YY_BREAK
-case 18:
+case 21:
 *yy_cp = yy_hold_char; /* undo effects of setting up yytext */
 yy_c_buf_p = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 183 "parser.l"
+#line 189 "parser.l"
 return tSAFEARRAY;
        YY_BREAK
-case 19:
+case 22:
 YY_RULE_SETUP
-#line 184 "parser.l"
+#line 190 "parser.l"
 return kw_token(yytext);
        YY_BREAK
-case 20:
+case 23:
 YY_RULE_SETUP
-#line 185 "parser.l"
+#line 191 "parser.l"
 line_number++;
        YY_BREAK
-case 21:
+case 24:
 YY_RULE_SETUP
-#line 186 "parser.l"
+#line 192 "parser.l"
 
        YY_BREAK
-case 22:
+case 25:
 YY_RULE_SETUP
-#line 187 "parser.l"
+#line 193 "parser.l"
 return SHL;
        YY_BREAK
-case 23:
+case 26:
 YY_RULE_SETUP
-#line 188 "parser.l"
+#line 194 "parser.l"
 return SHR;
        YY_BREAK
-case 24:
+case 27:
 YY_RULE_SETUP
-#line 189 "parser.l"
+#line 195 "parser.l"
 return MEMBERPTR;
        YY_BREAK
-case 25:
+case 28:
 YY_RULE_SETUP
-#line 190 "parser.l"
+#line 196 "parser.l"
 return EQUALITY;
        YY_BREAK
-case 26:
+case 29:
 YY_RULE_SETUP
-#line 191 "parser.l"
+#line 197 "parser.l"
 return INEQUALITY;
        YY_BREAK
-case 27:
+case 30:
 YY_RULE_SETUP
-#line 192 "parser.l"
+#line 198 "parser.l"
 return GREATEREQUAL;
        YY_BREAK
-case 28:
+case 31:
 YY_RULE_SETUP
-#line 193 "parser.l"
+#line 199 "parser.l"
 return LESSEQUAL;
        YY_BREAK
-case 29:
+case 32:
 YY_RULE_SETUP
-#line 194 "parser.l"
+#line 200 "parser.l"
 return LOGICALOR;
        YY_BREAK
-case 30:
+case 33:
 YY_RULE_SETUP
-#line 195 "parser.l"
+#line 201 "parser.l"
 return LOGICALAND;
        YY_BREAK
-case 31:
+case 34:
 YY_RULE_SETUP
-#line 196 "parser.l"
+#line 202 "parser.l"
 return ELLIPSIS;
        YY_BREAK
-case 32:
+case 35:
 YY_RULE_SETUP
-#line 197 "parser.l"
+#line 203 "parser.l"
 return yytext[0];
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
@@ -1105,19 +1124,20 @@ case YY_STATE_EOF(QUOTE):
 case YY_STATE_EOF(WSTRQUOTE):
 case YY_STATE_EOF(ATTR):
 case YY_STATE_EOF(PP_LINE):
-#line 198 "parser.l"
+case YY_STATE_EOF(SQUOTE):
+#line 204 "parser.l"
 {
                                if (import_stack_ptr)
                                        return aEOF;
                                else yyterminate();
                        }
        YY_BREAK
-case 33:
+case 36:
 YY_RULE_SETUP
-#line 203 "parser.l"
+#line 209 "parser.l"
 ECHO;
        YY_BREAK
-#line 1121 "parser.yy.c"
+#line 1141 "parser.yy.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -1408,7 +1428,7 @@ static yy_state_type yy_get_previous_state()
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 142 )
+                       if ( yy_current_state >= 148 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -1443,11 +1463,11 @@ yy_state_type yy_current_state;
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 142 )
+               if ( yy_current_state >= 148 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 141);
+       yy_is_jam = (yy_current_state == 147);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -2003,7 +2023,7 @@ int main()
        return 0;
        }
 #endif
-#line 203 "parser.l"
+#line 209 "parser.l"
 
 
 #ifndef parser_wrap
index cc753bb..30feca8 100644 (file)
@@ -698,12 +698,12 @@ static int does_any_iface(const statement_list_t *stmts, type_pred_t pred)
 
 int need_proxy(const type_t *iface)
 {
-  return is_object(iface->attrs) && !is_local(iface->attrs);
+  return is_object(iface) && !is_local(iface->attrs);
 }
 
 int need_stub(const type_t *iface)
 {
-  return !is_object(iface->attrs) && !is_local(iface->attrs);
+  return !is_object(iface) && !is_local(iface->attrs);
 }
 
 int need_proxy_file(const statement_list_t *stmts)
@@ -754,7 +754,7 @@ static void build_iface_list( const statement_list_t *stmts, type_t **ifaces[],
             type_t *iface = stmt->u.type;
             if (type_iface_get_inherit(iface) && need_proxy(iface))
             {
-                *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(*ifaces) );
+                *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) );
                 (*ifaces)[(*count)++] = iface;
             }
         }
index fdb2379..ca0faf1 100644 (file)
@@ -59,6 +59,14 @@ struct expr_eval_routine
     const expr_t *expr;
 };
 
+enum type_context
+{
+    TYPE_CONTEXT_TOPLEVELPARAM,
+    TYPE_CONTEXT_PARAM,
+    TYPE_CONTEXT_CONTAINER,
+    TYPE_CONTEXT_CONTAINER_NO_POINTERS,
+};
+
 static unsigned int field_memsize(const type_t *type, unsigned int *offset);
 static unsigned int fields_memsize(const var_list_t *fields, unsigned int *align);
 static unsigned int write_struct_tfs(FILE *file, type_t *type, const char *name, unsigned int *tfsoff);
@@ -69,7 +77,7 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs,
                                type_t *type, int toplevel_param,
                                const char *name, unsigned int *typestring_offset);
 
-const char *string_of_type(unsigned char type)
+static const char *string_of_type(unsigned char type)
 {
     switch (type)
     {
@@ -133,7 +141,7 @@ static void *get_aliaschain_attrp(const type_t *type, enum attr_type attr)
             return get_attrp(t->attrs, attr);
         else if (type_is_alias(t))
             t = type_alias_get_aliasee(t);
-        else return 0;
+        else return NULL;
     }
 }
 
@@ -202,6 +210,30 @@ static unsigned char get_enum_fc(const type_t *type)
         return RPC_FC_ENUM16;
 }
 
+static type_t *get_user_type(const type_t *t, const char **pname)
+{
+    for (;;)
+    {
+        type_t *ut = get_attrp(t->attrs, ATTR_WIREMARSHAL);
+        if (ut)
+        {
+            if (pname)
+                *pname = t->name;
+            return ut;
+        }
+
+        if (type_is_alias(t))
+            t = type_alias_get_aliasee(t);
+        else
+            return NULL;
+    }
+}
+
+static int is_user_type(const type_t *t)
+{
+    return get_user_type(t, NULL) != NULL;
+}
+
 enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *attrs, unsigned int flags)
 {
     if (is_user_type(type))
@@ -252,6 +284,29 @@ enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *att
     return TGT_INVALID;
 }
 
+static int get_padding(const var_list_t *fields)
+{
+    unsigned short offset = 0;
+    unsigned int salign = 1;
+    const var_t *f;
+
+    if (!fields)
+        return 0;
+
+    LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry)
+    {
+        type_t *ft = f->type;
+        unsigned int align = 0;
+        unsigned int size = type_memsize(ft, &align);
+        align = clamp_align(align);
+        if (align > salign) salign = align;
+        offset = ROUND_SIZE(offset, align);
+        offset += size;
+    }
+
+    return ROUNDING(offset, salign);
+}
+
 unsigned char get_struct_fc(const type_t *type)
 {
   int has_pointer = 0;
@@ -391,7 +446,7 @@ unsigned char get_struct_fc(const type_t *type)
   return RPC_FC_STRUCT;
 }
 
-unsigned char get_array_fc(const type_t *type)
+static unsigned char get_array_fc(const type_t *type)
 {
     unsigned char fc;
     const expr_t *size_is;
@@ -472,22 +527,6 @@ unsigned char get_array_fc(const type_t *type)
     return fc;
 }
 
-int is_struct(unsigned char type)
-{
-    switch (type)
-    {
-    case RPC_FC_STRUCT:
-    case RPC_FC_PSTRUCT:
-    case RPC_FC_CSTRUCT:
-    case RPC_FC_CPSTRUCT:
-    case RPC_FC_CVSTRUCT:
-    case RPC_FC_BOGUS_STRUCT:
-        return 1;
-    default:
-        return 0;
-    }
-}
-
 static int is_non_complex_struct(const type_t *type)
 {
     return (type_get_type(type) == TYPE_STRUCT &&
@@ -626,30 +665,6 @@ static void guard_rec(type_t *type)
         type->typestring_offset = 1;
 }
 
-static type_t *get_user_type(const type_t *t, const char **pname)
-{
-    for (;;)
-    {
-        type_t *ut = get_attrp(t->attrs, ATTR_WIREMARSHAL);
-        if (ut)
-        {
-            if (pname)
-                *pname = t->name;
-            return ut;
-        }
-
-        if (type_is_alias(t))
-            t = type_alias_get_aliasee(t);
-        else
-            return 0;
-    }
-}
-
-int is_user_type(const type_t *t)
-{
-    return get_user_type(t, NULL) != NULL;
-}
-
 static int is_embedded_complex(const type_t *type)
 {
     switch (typegen_detect_type(type, NULL, TDT_ALL_TYPES))
@@ -1075,6 +1090,13 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *structure,
             else
                 param_type = RPC_FC_SHORT;
         }
+        else if (type_get_type(correlation_variable) == TYPE_POINTER)
+        {
+            if (pointer_size == 8)
+                param_type = RPC_FC_HYPER;
+            else
+                param_type = RPC_FC_LONG;
+        }
         else
         {
             error("write_conf_or_var_desc: non-arithmetic type used as correlation variable %s\n",
@@ -1096,8 +1118,10 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *structure,
 
         LIST_FOR_EACH_ENTRY(eval, &expr_eval_routines, struct expr_eval_routine, entry)
         {
-            if (!strcmp (eval->structure->name, structure->name)
-                && !compare_expr (eval->expr, expr))
+            if (eval->structure == structure ||
+                (eval->structure->name && structure->name &&
+                 !strcmp(eval->structure->name, structure->name) &&
+                 !compare_expr(eval->expr, expr)))
             {
                 found = 1;
                 break;
@@ -1177,29 +1201,6 @@ static unsigned int union_memsize(const var_list_t *fields, unsigned int *pmaxa)
     return maxs;
 }
 
-int get_padding(const var_list_t *fields)
-{
-    unsigned short offset = 0;
-    unsigned int salign = 1;
-    const var_t *f;
-
-    if (!fields)
-        return 0;
-
-    LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry)
-    {
-        type_t *ft = f->type;
-        unsigned int align = 0;
-        unsigned int size = type_memsize(ft, &align);
-        align = clamp_align(align);
-        if (align > salign) salign = align;
-        offset = ROUND_SIZE(offset, align);
-        offset += size;
-    }
-
-    return ROUNDING(offset, salign);
-}
-
 unsigned int type_memsize(const type_t *t, unsigned int *align)
 {
     unsigned int size = 0;
@@ -1355,7 +1356,7 @@ static unsigned int write_nonsimple_pointer(FILE *file, const attr_list_t *attrs
     if (out_attr && !in_attr && pointer_type == RPC_FC_RP)
         flags |= RPC_FC_P_ONSTACK;
 
-    if (is_ptr(type) && !last_ptr(type))
+    if (is_ptr(type) && is_declptr(type_pointer_get_ref(type)))
         flags |= RPC_FC_P_DEREF;
 
     print_file(file, 2, "0x%x, 0x%x,\t\t/* %s",
@@ -1382,6 +1383,9 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs, c
     unsigned char fc;
     unsigned char pointer_fc;
     const type_t *ref;
+    int in_attr = is_attr(attrs, ATTR_IN);
+    int out_attr = is_attr(attrs, ATTR_OUT);
+    unsigned char flags = RPC_FC_P_SIMPLEPOINTER;
 
     /* for historical reasons, write_simple_pointer also handled string types,
      * but no longer does. catch bad uses of the function with this check */
@@ -1396,8 +1400,12 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs, c
     else
         fc = get_basic_fc(ref);
 
-    print_file(file, 2, "0x%02x, 0x%x,\t/* %s [simple_pointer] */\n",
-               pointer_fc, RPC_FC_P_SIMPLEPOINTER, string_of_type(pointer_fc));
+    if (out_attr && !in_attr)
+        flags |= RPC_FC_P_ONSTACK;
+
+    print_file(file, 2, "0x%02x, 0x%x,\t/* %s %s[simple_pointer] */\n",
+               pointer_fc, flags, string_of_type(pointer_fc),
+               flags & RPC_FC_P_ONSTACK ? "[allocated_on_stack] " : "");
     print_file(file, 2, "0x%02x,\t/* %s */\n", fc, string_of_type(fc));
     print_file(file, 2, "0x5c,\t/* FC_PAD */\n");
     return 4;
@@ -1411,7 +1419,8 @@ static void print_start_tfs_comment(FILE *file, type_t *t, unsigned int tfsoff)
 }
 
 static unsigned int write_pointer_tfs(FILE *file, const attr_list_t *attrs,
-                                      type_t *type, int toplevel_param,
+                                      type_t *type, unsigned int ref_offset,
+                                      int toplevel_param,
                                       unsigned int *typestring_offset)
 {
     unsigned int offset = *typestring_offset;
@@ -1420,15 +1429,21 @@ static unsigned int write_pointer_tfs(FILE *file, const attr_list_t *attrs,
     print_start_tfs_comment(file, type, offset);
     update_tfsoff(type, offset, file);
 
-    if (ref->typestring_offset)
-        write_nonsimple_pointer(file, attrs, type,
-                                toplevel_param,
-                                type_pointer_get_ref(type)->typestring_offset,
-                                typestring_offset);
-    else if (type_get_type(ref) == TYPE_BASIC ||
-             type_get_type(ref) == TYPE_ENUM)
+    switch (typegen_detect_type(ref, attrs, TDT_ALL_TYPES))
+    {
+    case TGT_BASIC:
+    case TGT_ENUM:
         *typestring_offset += write_simple_pointer(file, attrs, type,
                                                    toplevel_param);
+        break;
+    default:
+        if (ref_offset)
+            write_nonsimple_pointer(file, attrs, type,
+                                    toplevel_param,
+                                    ref_offset,
+                                    typestring_offset);
+        break;
+    }
 
     return offset;
 }
@@ -1540,8 +1555,10 @@ static void write_member_type(FILE *file, const type_t *cont,
         reloff = absoff - (*tfsoff + 2);
 
         print_file(file, 2, "0x4c,\t/* FC_EMBEDDED_COMPLEX */\n");
-        /* FIXME: actually compute necessary padding */
-        print_file(file, 2, "0x0,\t/* FIXME: padding */\n");
+        /* padding is represented using FC_STRUCTPAD* types, so presumably
+         * this is left over in the format for historical purposes in MIDL
+         * or rpcrt4. */
+        print_file(file, 2, "0x0,\n");
         print_file(file, 2, "NdrFcShort(0x%hx),\t/* Offset= %hd (%u) */\n",
                    reloff, reloff, absoff);
         *tfsoff += 4;
@@ -1636,8 +1653,11 @@ static int write_pointer_description_offsets(
         {
             unsigned int memsize;
 
-            /* pointer instance */
-            /* FIXME: sometimes from end of structure, sometimes from beginning */
+            /* pointer instance
+             *
+             * note that MSDN states that for pointer layouts in structures,
+             * this is a negative offset from the end of the structure, but
+             * this statement is incorrect. all offsets are positive */
             print_file(file, 2, "NdrFcShort(0x%hx),\t/* Memory offset = %d */\n", *offset_in_memory, *offset_in_memory);
             print_file(file, 2, "NdrFcShort(0x%hx),\t/* Buffer offset = %d */\n", *offset_in_buffer, *offset_in_buffer);
 
@@ -2139,7 +2159,6 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t
     unsigned int size;
     unsigned int start_offset;
     unsigned char fc;
-    int has_pointer;
     int pointer_type = get_attrv(attrs, ATTR_POINTERTYPE);
     unsigned int baseoff
         = !type_array_is_decl_as_ptr(type) && current_structure
@@ -2149,10 +2168,7 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t
     if (!pointer_type)
         pointer_type = RPC_FC_RP;
 
-    if (write_embedded_types(file, attrs, type_array_get_element(type), name, FALSE, typestring_offset))
-        has_pointer = TRUE;
-    else
-        has_pointer = type_has_pointers(type_array_get_element(type));
+    write_embedded_types(file, attrs, type_array_get_element(type), name, FALSE, typestring_offset);
 
     align = 0;
     size = type_memsize((is_conformant_array(type) ? type_array_get_element(type) : type), &align);
@@ -2210,7 +2226,8 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t
                 += write_conf_or_var_desc(file, current_structure, baseoff,
                                           type, length_is);
 
-        if (has_pointer && (type_array_is_decl_as_ptr(type) || !current_structure))
+        if (type_has_pointers(type_array_get_element(type)) &&
+            (type_array_is_decl_as_ptr(type) || !current_structure))
         {
             print_file(file, 2, "0x%x, /* FC_PP */\n", RPC_FC_PP);
             print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD);
@@ -2330,7 +2347,6 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
     const var_t *array;
     unsigned int start_offset;
     unsigned int array_offset;
-    int has_pointers = 0;
     unsigned int align = 0;
     unsigned int corroff;
     var_t *f;
@@ -2346,9 +2362,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
               name, USHRT_MAX, total_size - USHRT_MAX);
 
     if (fields) LIST_FOR_EACH_ENTRY(f, fields, var_t, entry)
-        has_pointers |= write_embedded_types(file, f->attrs, f->type, f->name,
-                                             FALSE, tfsoff);
-    if (!has_pointers) has_pointers = type_has_pointers(type);
+        write_embedded_types(file, f->attrs, f->type, f->name, FALSE, tfsoff);
 
     array = find_array_or_string_in_struct(type);
     if (array && !processed(array->type))
@@ -2396,7 +2410,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
     }
     else if ((fc == RPC_FC_PSTRUCT) ||
              (fc == RPC_FC_CPSTRUCT) ||
-             (fc == RPC_FC_CVSTRUCT && has_pointers))
+             (fc == RPC_FC_CVSTRUCT && type_has_pointers(type)))
     {
         print_file(file, 2, "0x%x, /* FC_PP */\n", RPC_FC_PP);
         print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD);
@@ -2417,25 +2431,33 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
         if (fields) LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry)
         {
             type_t *ft = f->type;
-            if (is_ptr(ft))
+            switch (typegen_detect_type(ft, f->attrs, TDT_IGNORE_STRINGS))
             {
+            case TGT_POINTER:
                 if (is_string_type(f->attrs, ft))
                     write_string_tfs(file, f->attrs, ft, FALSE, f->name, tfsoff);
                 else
-                    write_pointer_tfs(file, f->attrs, ft, FALSE, tfsoff);
-            }
-            else if (type_get_type(ft) == TYPE_ARRAY && type_array_is_decl_as_ptr(ft))
-            {
-                unsigned int offset;
+                    write_pointer_tfs(file, f->attrs, ft,
+                                      type_pointer_get_ref(ft)->typestring_offset,
+                                      FALSE, tfsoff);
+                break;
+            case TGT_ARRAY:
+                if (type_array_is_decl_as_ptr(ft))
+                {
+                    unsigned int offset;
 
-                print_file(file, 0, "/* %d */\n", *tfsoff);
+                    print_file(file, 0, "/* %d */\n", *tfsoff);
 
-                offset = ft->typestring_offset;
-                /* skip over the pointer that is written for strings, since a
-                 * pointer has to be written in-place here */
-                if (is_string_type(f->attrs, ft))
-                    offset += 4;
-                write_nonsimple_pointer(file, f->attrs, ft, FALSE, offset, tfsoff);
+                    offset = ft->typestring_offset;
+                    /* skip over the pointer that is written for strings, since a
+                     * pointer has to be written in-place here */
+                    if (is_string_type(f->attrs, ft))
+                        offset += 4;
+                    write_nonsimple_pointer(file, f->attrs, ft, FALSE, offset, tfsoff);
+                }
+                break;
+            default:
+                break;
             }
         }
         if (type->ptrdesc == *tfsoff)
@@ -2639,12 +2661,14 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t
     unsigned int start_offset = *typeformat_offset;
     expr_t *iid = get_attrp(attrs, ATTR_IIDIS);
 
+    print_start_tfs_comment(file, type, start_offset);
+
     if (iid)
     {
         print_file(file, 2, "0x2f,  /* FC_IP */\n");
         print_file(file, 2, "0x5c,  /* FC_PAD */\n");
         *typeformat_offset
-            += write_conf_or_var_desc(file, NULL, 0, type, iid) + 2;
+            += write_conf_or_var_desc(file, current_structure, 0, type, iid) + 2;
     }
     else
     {
@@ -2655,7 +2679,6 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t
             error("%s: interface %s missing UUID\n", __FUNCTION__, base->name);
 
         update_tfsoff(type, start_offset, file);
-        print_start_tfs_comment(file, type, start_offset);
         print_file(file, 2, "0x2f,\t/* FC_IP */\n");
         print_file(file, 2, "0x5a,\t/* FC_CONSTANT_IID */\n");
         print_file(file, 2, "NdrFcLong(0x%08x),\n", uuid->Data1);
@@ -2672,8 +2695,9 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t
     return start_offset;
 }
 
-static unsigned int write_contexthandle_tfs(FILE *file, const type_t *type,
-                                            const var_t *var,
+static unsigned int write_contexthandle_tfs(FILE *file,
+                                            const attr_list_t *attrs,
+                                            const type_t *type,
                                             unsigned int *typeformat_offset)
 {
     unsigned int start_offset = *typeformat_offset;
@@ -2684,13 +2708,13 @@ static unsigned int write_contexthandle_tfs(FILE *file, const type_t *type,
 
     if (is_ptr(type))
         flags |= 0x80;
-    if (is_attr(var->attrs, ATTR_IN))
+    if (is_attr(attrs, ATTR_IN))
     {
         flags |= 0x40;
-        if (!is_attr(var->attrs, ATTR_OUT))
+        if (!is_attr(attrs, ATTR_OUT))
             flags |= NDR_CONTEXT_HANDLE_CANNOT_BE_NULL;
     }
-    if (is_attr(var->attrs, ATTR_OUT))
+    if (is_attr(attrs, ATTR_OUT))
         flags |= 0x20;
 
     WRITE_FCTYPE(file, FC_BIND_CONTEXT, *typeformat_offset);
@@ -2747,46 +2771,60 @@ static unsigned int write_range_tfs(FILE *file, const attr_list_t *attrs,
     return start_offset;
 }
 
-static unsigned int write_typeformatstring_var(FILE *file, int indent, const var_t *func,
-                                               type_t *type, const var_t *var,
-                                               int toplevel_param,
-                                               unsigned int *typeformat_offset)
+static unsigned int write_type_tfs(FILE *file, int indent,
+                                   const attr_list_t *attrs, type_t *type,
+                                   const char *name,
+                                   enum type_context context,
+                                   unsigned int *typeformat_offset)
 {
     unsigned int offset;
 
-    switch (typegen_detect_type(type, var->attrs, TDT_ALL_TYPES))
+    switch (typegen_detect_type(type, attrs, TDT_ALL_TYPES))
     {
     case TGT_CTXT_HANDLE:
     case TGT_CTXT_HANDLE_POINTER:
-        return write_contexthandle_tfs(file, type, var, typeformat_offset);
+        return write_contexthandle_tfs(file, attrs, type, typeformat_offset);
     case TGT_USER_TYPE:
         write_user_tfs(file, type, typeformat_offset);
         return type->typestring_offset;
     case TGT_STRING:
-        return write_string_tfs(file, var->attrs, type, toplevel_param, var->name, typeformat_offset);
+        return write_string_tfs(file, attrs, type,
+                                context == TYPE_CONTEXT_TOPLEVELPARAM,
+                                name, typeformat_offset);
     case TGT_ARRAY:
     {
-        int ptr_type;
         unsigned int off;
-        off = write_array_tfs(file, var->attrs, type, var->name, typeformat_offset);
-        ptr_type = get_pointer_fc(type, var->attrs, toplevel_param);
-        if (ptr_type != RPC_FC_RP)
+        /* conformant and pointer arrays are handled specially */
+        if ((context != TYPE_CONTEXT_CONTAINER &&
+             context != TYPE_CONTEXT_CONTAINER_NO_POINTERS) ||
+            !is_conformant_array(type) || type_array_is_decl_as_ptr(type))
+            off = write_array_tfs(file, attrs, type, name, typeformat_offset);
+        else
+            off = 0;
+        if (context != TYPE_CONTEXT_CONTAINER &&
+            context != TYPE_CONTEXT_CONTAINER_NO_POINTERS)
         {
-            unsigned int absoff = type->typestring_offset;
-            short reloff = absoff - (*typeformat_offset + 2);
-            off = *typeformat_offset;
-            print_file(file, 0, "/* %d */\n", off);
-            print_file(file, 2, "0x%x, 0x0,\t/* %s */\n", ptr_type,
-                       string_of_type(ptr_type));
-            print_file(file, 2, "NdrFcShort(0x%hx),\t/* Offset= %hd (%u) */\n",
-                       reloff, reloff, absoff);
-            *typeformat_offset += 4;
+            int ptr_type;
+            ptr_type = get_pointer_fc(type, attrs,
+                                      context == TYPE_CONTEXT_TOPLEVELPARAM);
+            if (ptr_type != RPC_FC_RP)
+            {
+                unsigned int absoff = type->typestring_offset;
+                short reloff = absoff - (*typeformat_offset + 2);
+                off = *typeformat_offset;
+                print_file(file, 0, "/* %d */\n", off);
+                print_file(file, 2, "0x%x, 0x0,\t/* %s */\n", ptr_type,
+                           string_of_type(ptr_type));
+                print_file(file, 2, "NdrFcShort(0x%hx),\t/* Offset= %hd (%u) */\n",
+                           reloff, reloff, absoff);
+                *typeformat_offset += 4;
+            }
         }
         return off;
     }
     case TGT_STRUCT:
         if (processed(type)) return type->typestring_offset;
-        return write_struct_tfs(file, type, var->name, typeformat_offset);
+        return write_struct_tfs(file, type, name, typeformat_offset);
     case TGT_UNION:
         if (processed(type)) return type->typestring_offset;
         return write_union_tfs(file, type, typeformat_offset);
@@ -2796,131 +2834,46 @@ static unsigned int write_typeformatstring_var(FILE *file, int indent, const var
         return 0;
     case TGT_RANGE:
     {
-        expr_list_t *range_list = get_attrp(var->attrs, ATTR_RANGE);
+        expr_list_t *range_list = get_attrp(attrs, ATTR_RANGE);
         if (!range_list)
             range_list = get_aliaschain_attrp(type, ATTR_RANGE);
-        return write_range_tfs(file, var->attrs, type, range_list, typeformat_offset);
+        return write_range_tfs(file, attrs, type, range_list, typeformat_offset);
     }
     case TGT_IFACE_POINTER:
-        return write_ip_tfs(file, var->attrs, type, typeformat_offset);
+        return write_ip_tfs(file, attrs, type, typeformat_offset);
     case TGT_POINTER:
-        if (last_ptr(type))
+        if (processed(type_pointer_get_ref(type)))
+            offset = type_pointer_get_ref(type)->typestring_offset;
+        else
         {
-            size_t start_offset = *typeformat_offset;
-            int in_attr = is_attr(var->attrs, ATTR_IN);
-            int out_attr = is_attr(var->attrs, ATTR_OUT);
-            const type_t *ref = type_pointer_get_ref(type);
-
-            switch (typegen_detect_type(ref, NULL, TDT_ALL_TYPES))
-            {
-            /* special case for pointers to base types */
-            case TGT_BASIC:
-            case TGT_ENUM:
-            {
-                unsigned char fc;
-
-                if (type_get_type(ref) == TYPE_ENUM)
-                    fc = get_enum_fc(ref);
-                else
-                    fc = get_basic_fc(ref);
-
-                print_file(file, indent, "0x%x, 0x%x,    /* %s %s[simple_pointer] */\n",
-                           get_pointer_fc(type, var->attrs, toplevel_param),
-                           (!in_attr && out_attr) ? 0x0C : 0x08,
-                           string_of_type(get_pointer_fc(type, var->attrs, toplevel_param)),
-                           (!in_attr && out_attr) ? "[allocated_on_stack] " : "");
-                print_file(file, indent, "0x%02x,    /* %s */\n",
-                           fc, string_of_type(fc));
-                print_file(file, indent, "0x5c,          /* FC_PAD */\n");
-                *typeformat_offset += 4;
-                return start_offset;
-            }
-            default:
-                break;
-            }
+            enum type_context ref_context;
+            if (context == TYPE_CONTEXT_TOPLEVELPARAM)
+                ref_context = TYPE_CONTEXT_PARAM;
+            else if (context == TYPE_CONTEXT_CONTAINER_NO_POINTERS)
+                ref_context = TYPE_CONTEXT_CONTAINER;
+            else
+                ref_context = context;
+            offset = write_type_tfs(
+                file, indent, attrs, type_pointer_get_ref(type), name,
+                ref_context, typeformat_offset);
         }
-
-        offset = write_typeformatstring_var(file, indent, func,
-                                            type_pointer_get_ref(type), var,
-                                            FALSE, typeformat_offset);
-        if (file)
-            fprintf(file, "/* %2u */\n", *typeformat_offset);
-        return write_nonsimple_pointer(file, var->attrs, type,
-                                       toplevel_param,
-                                       offset, typeformat_offset);
+        if (context == TYPE_CONTEXT_CONTAINER_NO_POINTERS)
+            return 0;
+        else
+            return write_pointer_tfs(file, attrs, type, offset,
+                                     context == TYPE_CONTEXT_TOPLEVELPARAM,
+                                     typeformat_offset);
     case TGT_INVALID:
         break;
     }
-    error("invalid type %s for var %s\n", type->name, var->name);
+    error("invalid type %s for var %s\n", type->name, name);
     return 0;
 }
 
 static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *type,
                                 const char *name, int write_ptr, unsigned int *tfsoff)
 {
-    int retmask = 0;
-
-    switch (typegen_detect_type(type, attrs, TDT_ALL_TYPES))
-    {
-    case TGT_USER_TYPE:
-        write_user_tfs(file, type, tfsoff);
-        break;
-    case TGT_STRING:
-        write_string_tfs(file, attrs, type, FALSE, name, tfsoff);
-        break;
-    case TGT_IFACE_POINTER:
-        write_ip_tfs(file, attrs, type, tfsoff);
-        break;
-    case TGT_POINTER:
-    {
-        type_t *ref = type_pointer_get_ref(type);
-
-        if (!processed(ref) && type_get_type(ref) != TYPE_BASIC)
-            retmask |= write_embedded_types(file, NULL, ref, name, TRUE, tfsoff);
-
-        if (write_ptr)
-            write_pointer_tfs(file, attrs, type, FALSE, tfsoff);
-
-        retmask |= 1;
-        break;
-    }
-    case TGT_ARRAY:
-        /* conformant arrays and strings are handled specially */
-        if (!is_conformant_array(type) || type_array_is_decl_as_ptr(type) )
-        {
-            write_array_tfs(file, attrs, type, name, tfsoff);
-            if (is_conformant_array(type))
-                retmask |= 1;
-        }
-        break;
-    case TGT_STRUCT:
-        if (!processed(type))
-            write_struct_tfs(file, type, name, tfsoff);
-        break;
-    case TGT_UNION:
-        if (!processed(type))
-            write_union_tfs(file, type, tfsoff);
-        break;
-    case TGT_ENUM:
-    case TGT_BASIC:
-        /* nothing to do */
-        break;
-    case TGT_RANGE:
-    {
-        expr_list_t *range_list = get_attrp(attrs, ATTR_RANGE);
-        if (!range_list)
-            range_list = get_aliaschain_attrp(type, ATTR_RANGE);
-        write_range_tfs(file, attrs, type, range_list, tfsoff);
-        break;
-    }
-    case TGT_CTXT_HANDLE:
-    case TGT_CTXT_HANDLE_POINTER:
-    case TGT_INVALID:
-        error("invalid type %s for var %s\n", type->name, name);
-        break;
-    }
-
-    return retmask;
+    return write_type_tfs(file, 2, attrs, type, name, write_ptr ? TYPE_CONTEXT_CONTAINER : TYPE_CONTEXT_CONTAINER_NO_POINTERS, tfsoff);
 }
 
 static unsigned int process_tfs_stmts(FILE *file, const statement_list_t *stmts,
@@ -2954,13 +2907,12 @@ static unsigned int process_tfs_stmts(FILE *file, const statement_list_t *stmts,
 
                 if (!is_void(type_function_get_rettype(func->type)))
                 {
-                    var_t v = *func;
-                    v.type = type_function_get_rettype(func->type);
                     update_tfsoff(type_function_get_rettype(func->type),
-                                  write_typeformatstring_var(
-                                      file, 2, NULL,
+                                  write_type_tfs(
+                                      file, 2, func->attrs,
                                       type_function_get_rettype(func->type),
-                                      &v, FALSE, typeformat_offset),
+                                      func->name, TYPE_CONTEXT_PARAM,
+                                      typeformat_offset),
                                   file);
                 }
 
@@ -2969,9 +2921,10 @@ static unsigned int process_tfs_stmts(FILE *file, const statement_list_t *stmts,
                     LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
                         update_tfsoff(
                             var->type,
-                            write_typeformatstring_var(
-                                file, 2, func, var->type, var,
-                                TRUE, typeformat_offset),
+                            write_type_tfs(
+                                file, 2, var->attrs, var->type, var->name,
+                                TYPE_CONTEXT_TOPLEVELPARAM,
+                                typeformat_offset),
                             file);
         }
     }
@@ -3298,7 +3251,7 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix,
             size = 0;
         }
 
-        if (phase == PHASE_MARSHAL)
+        if (phase == PHASE_MARSHAL && alignment > 1)
             print_file(file, indent, "MIDL_memset(__frame->_StubMsg.Buffer, 0, (0x%x - (ULONG_PTR)__frame->_StubMsg.Buffer) & 0x%x);\n", alignment, alignment - 1);
         print_file(file, indent, "__frame->_StubMsg.Buffer = (unsigned char *)(((ULONG_PTR)__frame->_StubMsg.Buffer + %u) & ~0x%x);\n",
                     alignment - 1, alignment - 1);
@@ -3371,15 +3324,10 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char
     /* get fundamental type for the argument */
     for (;;)
     {
-        if (is_attr(type->attrs, ATTR_WIREMARSHAL))
-            break;
-        else if (is_attr(type->attrs, ATTR_CONTEXTHANDLE))
-            break;
-        else if (type_is_alias(type))
-            type = type_alias_get_aliasee(type);
-        else if (is_array(type))
+        switch (typegen_detect_type(type, var->attrs, TDT_IGNORE_STRINGS|TDT_IGNORE_RANGES))
         {
-            if (is_conformance_needed_for_phase(phase) && is_array(type))
+        case TGT_ARRAY:
+            if (is_conformance_needed_for_phase(phase))
             {
                 if (type_array_has_conformance(type))
                 {
@@ -3396,18 +3344,16 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char
                 }
             }
             break;
-        }
-        else if (type_get_type(type) == TYPE_UNION)
-        {
-            if (is_conformance_needed_for_phase(phase))
+        case TGT_UNION:
+            if (type_get_type(type) == TYPE_UNION &&
+                is_conformance_needed_for_phase(phase))
             {
                 print_file(file, indent, "__frame->_StubMsg.MaxCount = (ULONG_PTR)");
                 write_expr(file, get_attrp(var->attrs, ATTR_SWITCHIS), 1, 1, NULL, NULL, local_var_prefix);
                 fprintf(file, ";\n\n");
             }
             break;
-        }
-        else if (type_get_type(type) == TYPE_INTERFACE || is_void(type))
+        case TGT_IFACE_POINTER:
         {
             expr_t *iid;
 
@@ -3419,10 +3365,21 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char
             }
             break;
         }
-        else if (is_ptr(type))
+        case TGT_POINTER:
             type = type_pointer_get_ref(type);
-        else
+            continue;
+        case TGT_INVALID:
+        case TGT_USER_TYPE:
+        case TGT_CTXT_HANDLE:
+        case TGT_CTXT_HANDLE_POINTER:
+        case TGT_STRING:
+        case TGT_BASIC:
+        case TGT_ENUM:
+        case TGT_STRUCT:
+        case TGT_RANGE:
             break;
+        }
+        break;
     }
 }
 
@@ -3547,7 +3504,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
     case TGT_ARRAY:
     {
         unsigned char tc = get_array_fc(type);
-        const char *array_type = "FixedArray";
+        const char *array_type = NULL;
 
         /* We already have the size_is expression since it's at the
            top level, but do checks for multidimensional conformant
@@ -3556,19 +3513,25 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const
            the return value.  */
         get_size_is_expr(type, var->name);
 
-        if (tc == RPC_FC_SMVARRAY || tc == RPC_FC_LGVARRAY)
+        switch (tc)
         {
+        case RPC_FC_SMFARRAY:
+        case RPC_FC_LGFARRAY:
+            array_type = "FixedArray";
+            break;
+        case RPC_FC_SMVARRAY:
+        case RPC_FC_LGVARRAY:
             array_type = "VaryingArray";
-        }
-        else if (tc == RPC_FC_CARRAY)
-        {
+            break;
+        case RPC_FC_CARRAY:
             array_type = "ConformantArray";
-        }
-        else if (tc == RPC_FC_CVARRAY || tc == RPC_FC_BOGUS_ARRAY)
-        {
-            array_type = (tc == RPC_FC_BOGUS_ARRAY
-                          ? "ComplexArray"
-                          : "ConformantVaryingArray");
+            break;
+        case RPC_FC_CVARRAY:
+            array_type = "ConformantVaryingArray";
+            break;
+        case RPC_FC_BOGUS_ARRAY:
+            array_type = "ComplexArray";
+            break;
         }
 
         if (pointer_type != RPC_FC_RP) array_type = "Pointer";
@@ -4011,8 +3974,11 @@ int write_expr_eval_routines(FILE *file, const char *iface)
         print_file(file, 0, "static void __RPC_USER %s_%sExprEval_%04u(PMIDL_STUB_MESSAGE pStubMsg)\n",
                    iface, name, callback_offset);
         print_file(file, 0, "{\n");
-        print_file (file, 1, "%s *%s = (%s *)(pStubMsg->StackTop - %u);\n",
-                    name, var_name, name, eval->baseoff);
+        print_file(file, 1, "%s", "");
+        write_type_left(file, (type_t *)eval->structure, TRUE);
+        fprintf(file, " *%s = (", var_name);
+        write_type_left(file, (type_t *)eval->structure, TRUE);
+        fprintf(file, " *)(pStubMsg->StackTop - %u);\n", eval->baseoff);
         print_file(file, 1, "pStubMsg->Offset = 0;\n"); /* FIXME */
         print_file(file, 1, "pStubMsg->MaxCount = (ULONG_PTR)");
         write_expr(file, eval->expr, 1, 1, var_name_expr, eval->structure, "");
index 2b2e65d..242b40d 100644 (file)
@@ -84,8 +84,6 @@ unsigned int type_memsize(const type_t *t, unsigned int *align);
 int decl_indirect(const type_t *t);
 void write_parameters_init(FILE *file, int indent, const var_t *func, const char *local_var_prefix);
 void print(FILE *file, int indent, const char *format, va_list ap);
-int get_padding(const var_list_t *fields);
-int is_user_type(const type_t *t);
 expr_t *get_size_is_expr(const type_t *t, const char *name);
 int is_full_pointer_function(const var_t *func);
 void write_full_pointer_init(FILE *file, int indent, const var_t *func, int is_server);
index c1c3832..8c76c24 100644 (file)
@@ -100,7 +100,7 @@ int parser_debug, yy_flex_debug;
 
 int pedantic = 0;
 int do_everything = 1;
-int preprocess_only = 0;
+static int preprocess_only = 0;
 int do_header = 0;
 int do_typelib = 0;
 int do_proxies = 0;
@@ -108,7 +108,7 @@ int do_client = 0;
 int do_server = 0;
 int do_idfile = 0;
 int do_dlldata = 0;
-int no_preprocess = 0;
+static int no_preprocess = 0;
 int old_names = 0;
 int do_win32 = 1;
 int do_win64 = 1;
@@ -127,16 +127,15 @@ char *client_name;
 char *client_token;
 char *server_name;
 char *server_token;
-char *idfile_name;
-char *idfile_token;
+static char *idfile_name;
+static char *idfile_token;
 char *temp_name;
 const char *prefix_client = "";
 const char *prefix_server = "";
 
 int line_number = 1;
 
-FILE *header;
-FILE *idfile;
+static FILE *idfile;
 
 size_t pointer_size = 0;
 syskind_t typelib_kind = sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32;
@@ -160,18 +159,18 @@ enum {
 static const char short_options[] =
     "b:cC:d:D:EhH:I:m:NpP:sS:tT:uU:VW";
 static const struct option long_options[] = {
-    { "dlldata", 1, 0, DLLDATA_OPTION },
-    { "dlldata-only", 0, 0, DLLDATA_ONLY_OPTION },
-    { "local-stubs", 1, 0, LOCAL_STUBS_OPTION },
-    { "oldnames", 0, 0, OLDNAMES_OPTION },
-    { "prefix-all", 1, 0, PREFIX_ALL_OPTION },
-    { "prefix-client", 1, 0, PREFIX_CLIENT_OPTION },
-    { "prefix-server", 1, 0, PREFIX_SERVER_OPTION },
-    { "win32", 0, 0, WIN32_OPTION },
-    { "win64", 0, 0, WIN64_OPTION },
-    { "win32-align", 1, 0, WIN32_ALIGN_OPTION },
-    { "win64-align", 1, 0, WIN64_ALIGN_OPTION },
-    { 0, 0, 0, 0 }
+    { "dlldata", 1, NULL, DLLDATA_OPTION },
+    { "dlldata-only", 0, NULL, DLLDATA_ONLY_OPTION },
+    { "local-stubs", 1, NULL, LOCAL_STUBS_OPTION },
+    { "oldnames", 0, NULL, OLDNAMES_OPTION },
+    { "prefix-all", 1, NULL, PREFIX_ALL_OPTION },
+    { "prefix-client", 1, NULL, PREFIX_CLIENT_OPTION },
+    { "prefix-server", 1, NULL, PREFIX_SERVER_OPTION },
+    { "win32", 0, NULL, WIN32_OPTION },
+    { "win64", 0, NULL, WIN64_OPTION },
+    { "win32-align", 1, NULL, WIN32_ALIGN_OPTION },
+    { "win64-align", 1, NULL, WIN64_ALIGN_OPTION },
+    { NULL, 0, NULL, 0 }
 };
 
 static void rm_tempfile(void);
@@ -431,7 +430,7 @@ static void write_id_data_stmts(const statement_list_t *stmts)
       if (type_get_type(type) == TYPE_INTERFACE)
       {
         const UUID *uuid;
-        if (!is_object(type->attrs) && !is_attr(type->attrs, ATTR_DISPINTERFACE))
+        if (!is_object(type) && !is_attr(type->attrs, ATTR_DISPINTERFACE))
           continue;
         uuid = get_attrp(type->attrs, ATTR_UUID);
         write_guid(idfile, is_attr(type->attrs, ATTR_DISPINTERFACE) ? "DIID" : "IID",
@@ -648,8 +647,8 @@ int main(int argc,char *argv[])
 
   if(debuglevel)
   {
-    setbuf(stdout,0);
-    setbuf(stderr,0);
+    setbuf(stdout, NULL);
+    setbuf(stderr, NULL);
   }
 
   parser_debug = debuglevel & DEBUGLEVEL_TRACE ? 1 : 0;
index f0afce4..6874d2a 100644 (file)
@@ -44,15 +44,10 @@ typedef GUID UUID;
 #endif
 #define FALSE 0
 
-#define RPC_FC_MODULE   0xfc
-#define RPC_FC_COCLASS  0xfd
-#define RPC_FC_FUNCTION 0xfe
-
 typedef struct _loc_info_t loc_info_t;
 typedef struct _attr_t attr_t;
 typedef struct _expr_t expr_t;
 typedef struct _type_t type_t;
-typedef struct _typeref_t typeref_t;
 typedef struct _var_t var_t;
 typedef struct _declarator_t declarator_t;
 typedef struct _func_t func_t;
@@ -195,6 +190,7 @@ enum expr_type
     EXPR_POS,
     EXPR_STRLIT,
     EXPR_WSTRLIT,
+    EXPR_CHARCONST,
 };
 
 enum type_kind
@@ -528,8 +524,6 @@ int is_ptr(const type_t *t);
 int is_array(const type_t *t);
 int is_var_ptr(const var_t *v);
 int cant_be_null(const var_t *v);
-int is_struct(unsigned char tc);
-int is_union(unsigned char tc);
 
 #define tsENUM   1
 #define tsSTRUCT 2
index 07d9b13..7247ac1 100644 (file)
@@ -282,7 +282,7 @@ Index: spec32.c
              if (!kill_at && target_cpu == CPU_x86) output( "@%d", at_param );
              if  (odp->flags & FLAG_FORWARD)
              {
-@@ -825,6 +883,51 @@
+@@ -825,6 +883,50 @@
              }
              break;
          }
@@ -296,7 +296,6 @@ Index: spec32.c
 +            if  (odp->flags & FLAG_FORWARD)
 +            {
 +                output( "=" );
-+                if (!kill_at) output( "@" );
 +                output( "%s", odp->link_name );
 +            }
 +            else if (strcmp(name, odp->link_name)) /* try to reduce output */
index 4c8c255..f00ad12 100644 (file)
@@ -893,7 +893,6 @@ void BuildDef32File( DLLSPEC *spec )
             if  (odp->flags & FLAG_FORWARD)
             {
                 output( "=" );
-                if (!kill_at) output( "@" );
                 output( "%s", odp->link_name );
             }
             else if (strcmp(name, odp->link_name)) /* try to reduce output */
index 5bd8ffa..03d1172 100644 (file)
@@ -15,8 +15,8 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-#ifndef XML_H
-#define XML_H
+
+#pragma once
 
 #include <string>
 #include <vector>
@@ -240,5 +240,3 @@ std::vector<char> vectorize(const std::string &str);
 void vectappend(std::vector<char> &strvec, char ch);
 void vectappend(std::vector<char> &strvec, const char *charstr);
 void vectappend(std::vector<char> &strvec, const std::string &str);
-
-#endif // XML_H